SuperAPI AI 工具集

google_calendar

办公与效率

查看项目

更新于 10-26 18:17

技能介绍

Google Calendar 技能用于操作用户的 Google 日历,涵盖日程查看、事件详情查询和日程安排变更。所有操作都通过 hatch_gws_cli calendar ... 命令执行。原始 API 调用采用空格分隔的 <resource> <method> 形式,接受一个 --params JSON 对象,创建或编辑时还需提供 --json 请求体。定时事件的开始/结束是带时区偏移的 RFC3339 dateTime,例如 2026-04-16T14:00:00-07:00;全天事件使用仅日期的 date,例如 2026-04-16,两者不能在同一事件中混用。可用 hatch_gws_cli calendar <command> --help 查看命令参数,用 hatch_gws_cli schema calendar.events.insert 等查看原始方法的 --params 与 --json 结构。

连接

日历需要一次性连接后命令才会返回数据。运行 hatch_gws_cli calendar status。若返回未连接并提供 connect_url,则将其发布为 Connect Google Calendar,然后停止并等待用户点击。若未返回 URL,则报告连接不可用并停止,绝不自行编造。连接是用户的步骤:不要打开登录页、不要用浏览器驱动它、不要把用户引向设置、也不要索取凭据。若状态不可用,说明此设备上 Google Calendar 不可用并停止。使用 hatch_gws_cli calendar disconnect 断开连接。仅当命令返回 disconnect_url 时才发布 Disconnect Google Calendar;否则重新运行 status 并报告其状态,不要编造链接。若后续命令因认证错误、缺少连接器或未连接状态而失败,重新运行 status:若未连接且有 URL,发布连接链接并等待;若已连接,重试一次;若不可用或缺少 URL,报告并停止。认证流程仅通过 status 和 disconnect 进行。绝不手写凭据文件或运行原始 gws auth。

若用户要求添加或关联另一个 Google Calendar 账号,运行 hatch_gws_cli calendar status 并将其返回的确切 add_account_url 发布为 Add Google Calendar account。绝不为附加账号复用 connect_url。若缺少 add_account_url,说明添加其他账号不可用。若要移除某个特定 Google Calendar 账号而保留其他账号,引导用户前往设置中连接器下的该账号;不要整体断开 Google Calendar。

多账号

用户可以关联多个 Google 账号。省略 --account 时,日历服务调用使用默认账号,因此大多数任务无需额外操作,也无需先列出账号。当用户明确指代多个账号中的某一个时,用 hatch_gws_cli calendar accounts 列出它们(仅身份信息,不含令牌),将其措辞与 display_name 匹配,然后在命令中添加 --account <account_id>。--account 选择由哪个已关联账号执行日历服务调用,以及能力感知的 status --for-command 检查哪个账号;普通 status、disconnect 和 accounts 仍是连接器级别的生命周期命令。若无法将用户措辞精确匹配到唯一 display_name,应询问是哪个账号而非猜测;错误或未关联的 --account 会失败关闭(“account may not be linked”)——应呈现该错误并确认账号,绝不在默认账号上静默重试。

若 Google 返回 403、insufficientPermissions 或“insufficient authentication scopes”,运行 hatch_gws_cli calendar status --for-command <command-or-method>,并使用与失败操作相同的 --account <account_id> 选择。当 scope_status 为 not_granted 时,将返回的 scope_add_url 原样发布为 Additional Google Calendar access,并告知用户在 Google 同意屏幕上选择同一账号。不要用 add_account_url 替代:那会启动新账号流程,而非为所选账号添加访问权限。等待同意完成后再重试命令。

常见流程

读取日程

+agenda 是任何只读的“我的日历上有什么”“接下来有什么”或多日摘要的默认选择。它会搜索所有可见日历。

将窗口与问题匹配:+agenda --today 表示今天,+agenda --week 或 +agenda --days 7 表示一个范围。

单个日历:+agenda --calendar <name-or-id>。

需要解析结果时添加 --format json。

查询日历、事件和空闲时间

存在哪些日历:calendarList list。当用户询问连接了哪些日历或想按名称定位某个日历时使用。

已知日历中的事件,或在编辑前获取事件 ID:events list --params '{"calendarId":"primary","timeMin":"<start>","timeMax":"<end>"}'。仅当需要特定日历、+agenda 省略的字段或事件 ID 时,才优先使用它而非 +agenda。

单个事件的完整详情:events get --params '{"calendarId":"primary","eventId":"<id>"}'。

某时间是否空闲或忙碌:freebusy query --json '{"timeMin":"<start>","timeMax":"<end>","items":[{"id":"primary"}]}'。

创建、更新或删除事件

创建:events insert --params '{"calendarId":"primary"}' --json '{"summary":"Focus block","start":{"dateTime":"<start>"},"end":{"dateTime":"<end>"}}'。按需添加参与者、地点或描述。块、保留或专注事件必须显示为忙碌:保持 transparency 未设置或设为 "opaque",绝不要设为 "transparent"(那会显示为空闲),除非用户希望它显示为空闲。全天事件改用仅日期值,"start":{"date":"2026-04-16"},"end":{"date":"2026-04-17"},其中结束日期为排他。

更新:events patch --params '{"calendarId":"primary","eventId":"<id>"}' --json '{"location":"Room A"}'。仅修补发生变化的字段。patch 会替换整个数组,因此要添加或移除访客,先读取事件并回传应用更改后的完整参与者列表——绝不要只发送新访客,否则会静默丢弃其他人。

删除:events delete --params '{"calendarId":"primary","eventId":"<id>"}'。

将发现事件的那次读取中的账号、日历 ID 和事件 ID 直接贯穿到写入操作,并精确使用它们。上面的 primary 仅在用户未指向其他日历时才是默认值;一旦某次读取在某个日历上定位到事件,更新或删除就应针对同一日历和账号——绝不回退到 primary。绝不编造或改写事件 ID。

对于任何创建、删除或访客可见的更改,只要写入前后存在参与者,就在 --params 中添加 "sendUpdates":"all"。这包括添加第一位访客、重复或会议变更,以及时间、地点、标题、描述或参与者变更。使用 "sendUpdates":"all" 发送的删除会给每位访客发送取消通知。若用户要求不通知任何人,说明 "sendUpdates":"none" 可以阻止更改到达访客的日历,然后在使用前确认。

规则

创建私密事件、私密更新和删除事件可在用户明确请求下直接进行,无需额外确认。创建带访客的事件、以通知访客的方式更改事件,以及日历或 ACL 管理需要确认,因为事件内容或访问权限变更会触达他人。在这些对外写入之前,重述具体事件、时间、收件人和通知效果。

在响应中返回已保存事件的命令(如定时事件读取、创建和更新)会添加 event_starts_at / event_ends_at;重复实例还会添加 event_original_starts_at。每个都带有 UTC 和用户本地形式;回复中优先使用 user_local。全天边界保持为日历日期,不得进行时区偏移。信任 events +agenda 为你所请求窗口返回的结果,并针对当前日期正确处理“今天”和“明天”。

仅用平实语言与用户交流。绝不展示原始命令、not_connected 或 unavailable 等状态词、不透明的提供方/事件/日历 ID、etag、分页令牌或游标、原始 JSON 或其他内部响应字段,除非用户要求。需要区分所指账号时,可用其显示名称或可识别的邮箱来称呼账号。将 ID 和分页游标保留在内部以串联后续命令。

绝不打印令牌、密钥或凭据材料。若它们出现在工具输出中,应进行脱敏。