AI студия Владимира Ломтева
УСЛУГИПРОЕКТЫСТАТЬИБАЗА ЗНАНИЙМаркетплейсПолезные сервисы

Оставьте заявку,
чтобы обсудить проект

Напишите ваш вопрос, не забудьте указать телефон. Мы перезвоним и все расскажем.

Контакты

Москва

Работаем по всей России
и миру (онлайн)

+7 (999) 760-24-41

Ежедневно с 9:00 до 21:00

lamooof@gmail.com

По вопросам сотрудничества

TelegramWhatsApp

Есть предложение?

Напишите нам в мессенджеры

© 2025 AI студия Владимира Ломтева

Политика конфиденциальностиСогласие на обработку ПДн|ИНН 623412173261
    Extension Email Calendar Events — Скилл для ИИ-агентов | AI Рассвет

    Extension Email Calendar Events

    Support for organising events/meetings and sending invitations by email.

    Скиллы для операций#GitHub#caffeinelabs/skills#skills.sh
    Скачивания
    0
    В избранном
    0
    Комментарии
    0
    Просмотры
    3

    Установить скилл

    Добавьте инструмент одной командой или скачайте проверенный архив версии.

    npx skills add caffeinelabs/skills --skill extension-email-calendar-events
    Скачать ZIP
    Версия
    1.0.0+38a113689f27
    Автор
    Владимир Ломтев
    Репозиторий
    caffeinelabs/skills
    GitHub: caffeinelabs/skills

    Как установить

    1. 1Скопируйте команду из блока установки.
    2. 2Запустите её в терминале из каталога проекта.

    Документация

    Email — Calendar Events

    Calendar events email extension for Caffeine AI.

    Overview

    This skill adds support for organising events/meetings and sending iCalendar invitations by email. It provides CRUD operations for calendar events and email-based invitation delivery.

    Backend

    This component is for organising events/meetings and sending invitations by email

    • Internally it builds and attaches an iCalendar file to each attendees's email
    • This component does not yet support receiving RSVPs from attendees

    To add/update/cancel/delete/get/list calendar events

    • Use the prefabricated module mo:caffeineai-email-calendar-events/calendarEvents.mo which cannot be modified.
    module {
      public type State = {
        var events : List.List<CalendarEvent>;
        var uidMap : Map.Map<Text, Nat>;
      };
    
      public func add(
        self : State,
        uid : Text,
        summary : Text,
        description : Text,
        location : Text,
        startTime : Nat64,
        endTime : Nat64,
        organizer : Mailbox,
        attendees : [Attendee]
      ) : ?CalendarEvent;
    
      public func update(
        self : State,
        uid : Text,
        summary : ?Text,
        description : ?Text,
        location : ?Text,
        startTime : ?Nat64,
        endTime : ?Nat64,
        organizer : ?Mailbox,
        attendees : ?[Attendee]
      ) : ?CalendarEvent;
    
      public func addAttendees(
        self : State,
        uid : Text,
        attendees : [Attendee]
      ) : ?CalendarEvent;
    
      public func removeAttendees(
        self : State,
        uid : Text,
        attendees : [Text]
      ) : ?CalendarEvent;
    
      public func cancel(self : State, uid : Text) : ?CalendarEvent;
    
      public func delete(self : State, uid : Text);
    
      public func get(self : State, uid : Text) : ?CalendarEvent;
    
      // Iterate over all calendar events older to newer
      public func iter(self : State) : Iter.Iter<CalendarEvent>;
    
      // Iterate over all calendar events newer to older
      public func reverse(self : State) : Iter.Iter<CalendarEvent>;
    }
    

    For sending calendar event invittions to attendees by email

    • This component depends on extension-email for sending calendar event emails.
    • Use the sendCalendarEvent function.
    module {
      public type CalendarEvent = {
        uid : Text;
        sequence : Nat32;
        method : CalendarEventMethod;
        summary : Text;
        description : Text;
        location : Text;
        startTime : Nat64;
        endTime : Nat64;
        organizer : Mailbox;
        attendees : [Attendee];
      };
    
      public type CalendarEventMethod = {
        #request;
        #publish;
        #cancel;
      };
    
      public type Mailbox = {
        email : Text;
        name : ?Text;
      };
    
      public type Attendee = {
        who : Mailbox;
        role : CalendarEventRole;
      };
    
      public type CalendarEventRole = {
        #chair;
        #required;
        #optional;
        #notParticipating;
      };
      
      public type SendResult = {
        #ok;
        #err : Text;
      };
    
      public func sendCalendarEvent(fromUsername : Text, event : CalendarEvent) : async SendResult;
    };
    

    Example usage for an app which can add/update/cancel/delete/get/list calendar events and send invitations to them by email

    import Runtime "mo:core/Runtime";
    import Principal "mo:core/Principal";
    import Map "mo:core/Map";
    import Random "mo:core/Random";
    import Set "mo:core/Set";
    import Iter "mo:core/Iter";
    import Option "mo:core/Option";
    import Text "mo:core/Text";
    import AccessControl "mo:caffeineai-authorization/access-control";
    import MixinAuthorization "mo:caffeineai-authorization/MixinAuthorization";
    import EmailClient "mo:caffeineai-email/emailClient";
    import CalendarEvents "mo:caffeineai-email-calendar-events/calendarEvents";
    import Uuid "mo:caffeineai-email-calendar-events/uuid";
    
    actor {
      public type UserProfile = {
        name : Text;
        email : Text;
      };
    
      // Include authorization component
      let accessControlState = AccessControl.initState();
      include MixinAuthorization(accessControlState, null);
    
      // Store a map of caller principal to UserProfile
      var userProfiles = Map.empty<Principal, UserProfile>();
    
      // Store a set of emails for uniqueness check
      var emails = Set.empty<Text>();
    
      // Store the calendar events
      let calendarEvents = CalendarEvents.new();
    
      public shared ({ caller }) func registerUser(name : Text, email : Text) : async () {
        // Check if the user already exists
        if (userProfiles.containsKey(caller)) {
          Runtime.trap("User already registered");
        };
    
        // Check if the email is already used
        if (emails.contains(email)) {
          Runtime.trap("Email already taken");
        };
    
        // Add a user record
        userProfiles.add(
          caller,
          {
            name;
            email;
          }
        );
        emails.add(email);
      };
    
      public shared ({ caller }) func addCalendarEvent(summary : Text, description : Text, location : Text, startTimeMs : Nat64, endTimeMs : Nat64) : async () {
        if (not (AccessControl.hasPermission(accessControlState, caller, #admin))) {
          Runtime.trap("Unauthorized: Only admins can add calendar events");
        };
    
        let organiser = userProfiles.get(caller)
          ?? Runtime.trap("Admin profile not found");
    
        let seed = await Random.blob();
        let uid = Uuid.generateV4(seed);
    
        if (
          calendarEvents.add(
            uid,
            summary,
            description,
            location,
            startTimeMs,
            endTimeMs,
            {
              name = ?organiser.name;
              email = organiser.email;
            },
            userProfiles.values().map(
              func({ name; email }) {
                {
                  who = { name = ?name; email };
                  role = #required;
                };
              }
            ).toArray()
          ).isNull()
        ) {
          Runtime.trap("Failed to add calendar event");
        };
      };
    
      public shared ({ caller }) func updateEventDetails(uid : Text, summary : ?Text, description : ?Text, location : ?Text, startTimeMs : ?Nat64, endTimeMs : ?Nat64) : async () {
        if (not (AccessControl.hasPermission(accessControlState, caller, #admin))) {
          Runtime.trap("Unauthorized: Only admins can update calendar events");
        };
    
        if (
          calendarEvents.update(
            uid,
            summary,
            description,
            location,
            startTimeMs,
            endTimeMs,
            null,
            null
          ).isNull()
        ) {
          Runtime.trap("Failed to update calendar event");
        };
      };
    
      public shared ({ caller }) func addEventAttendees(uid : Text, attendees : [EmailClient.Attendee]) : async () {
        if (not (AccessControl.hasPermission(accessControlState, caller, #admin))) {
          Runtime.trap("Unauthorized: Only admins can add calendar event attendees");
        };
    
        if (calendarEvents.addAttendees(uid, attendees).isNull()) {
          Runtime.trap("Failed to add attendees to calendar event");
        };
      };
    
      public shared ({ caller }) func removeEventAttendees(uid : Text, attendees : [Text]) : async () {
        if (not (AccessControl.hasPermission(accessControlState, caller, #admin))) {
          Runtime.trap("Unauthorized: Only admins can remove calendar event attendees");
        };
    
        if (calendarEvents.removeAttendees(uid, attendees).isNull()) {
          Runtime.trap("Failed to remove attendees from calendar event");
        };
      };
    
      public shared ({ caller }) func cancelEvent(uid : Text) : async () {
        if (not (AccessControl.hasPermission(accessControlState, caller, #admin))) {
          Runtime.trap("Unauthorized: Only admins can cancel calendar events");
        };
    
        if (calendarEvents.cancel(uid).isNull()) {
          Runtime.trap("Failed to cancel calendar event");
        };
      };
    
      public shared ({ caller }) func listEvents() : async [CalendarEvents.CalendarEvent] {
        if (not (AccessControl.hasPermission(accessControlState, caller, #admin))) {
          Runtime.trap("Unauthorized: Only admins can list calendar events");
        };
    
        calendarEvents.iter().toArray();
      };
    
      public shared ({ caller }) func deleteEvent(uid : Text) : async () {
        if (not (AccessControl.hasPermission(accessControlState, caller, #admin))) {
          Runtime.trap("Unauthorized: Only admins can delete calendar events");
        };
    
        calendarEvents.delete(uid);
      };
    
      public shared ({ caller }) func sendEventInvitation(uid : Text) : async () {
        if (not (AccessControl.hasPermission(accessControlState, caller, #admin))) {
          Runtime.trap("Unauthorized: Only admins can send calendar event invitations");
        };
    
        let event = calendarEvents.get(uid)
          ?? Runtime.trap("Calendar event not found");
    
        ignore await EmailClient.sendCalendarEvent(
          "no-reply",
          event
        );
      };
    };
    

    Требования и возможности

    Источник пакета
    https://github.com/caffeinelabs/skills/tree/38a113689f275bb2efe5fa87e4b151c4a8899e8d/skills/extension-email-calendar-events

    Файлы версии

    ПутьРазмерSHA256
    SKILL.md897443297a1a4ff895f3...

    Частые вопросы

    Как установить Extension Email Calendar Events?
    Используйте команду npx skills add caffeinelabs/skills --skill extension-email-calendar-events или скачайте ZIP-архив.
    Можно ли скачать Extension Email Calendar Events бесплатно?
    Да, опубликованную версию можно скачать из маркетплейса бесплатно.

    Похожие инструменты

    Смотреть все
    Story Long Write长篇网文写作。从大纲到正文,辅助长篇网络小说的创作,包括世界观、人物、情节线管理。触发方式:/story-long-write、/写长篇、「帮我开书」「写大纲」「日更」「续写」「继续写」「修改第X章」「回炉」「重写第X章」。Parallel Deep ResearchONLY use when user explicitly says 'deep research', 'exhaustive', 'comprehensive report', or 'thorough investigation'. Slower and more expensive than parallel-web-search. For normal research/lookup requests, use parallel-web-search instead. Supports multi-turn: pass --previous-interaction-id from a prior research or enrichment to continue with context.LangfuseInteract with Langfuse and access its documentation: tracing, monitoring, creating datasets, running experiments, and evaluating AI applications. Use when needing to (1) query or modify Langfuse data, (2) look up Langfuse documentation, concepts, integration guides, a feature or SDK usage, or (3) do any AI engineering task (AI observability, prompt engineering/management, evaluation and evaluator management, experimentation, dataset management, evaluation-driven CI/CD, feedback collection). Invoke it for tasks in this scope even when Langfuse is not configured or explicitly mentioned.
    Комментарии

    Войдите, чтобы оставить комментарий.

    Комментариев пока нет.

    Установить скилл

    Добавьте инструмент одной командой или скачайте проверенный архив версии.

    npx skills add caffeinelabs/skills --skill extension-email-calendar-events
    Скачать ZIP
    Версия
    1.0.0+38a113689f27
    Автор
    Владимир Ломтев
    Репозиторий
    caffeinelabs/skills
    GitHub: caffeinelabs/skills
    Excel Automation>