cc-lark 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/ci.yml +47 -0
- package/.github/workflows/release.yml +47 -0
- package/.github/workflows/sync-upstream.yml +127 -0
- package/.prettierrc.json +7 -0
- package/README.md +214 -0
- package/dist/core/api-error.d.ts +193 -0
- package/dist/core/api-error.d.ts.map +1 -0
- package/dist/core/api-error.js +263 -0
- package/dist/core/api-error.js.map +1 -0
- package/dist/core/auth-errors.d.ts +13 -0
- package/dist/core/auth-errors.d.ts.map +1 -0
- package/dist/core/auth-errors.js +14 -0
- package/dist/core/auth-errors.js.map +1 -0
- package/dist/core/config.d.ts +60 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +115 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/device-flow.d.ts +80 -0
- package/dist/core/device-flow.d.ts.map +1 -0
- package/dist/core/device-flow.js +231 -0
- package/dist/core/device-flow.js.map +1 -0
- package/dist/core/index.d.ts +16 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +16 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/lark-client.d.ts +136 -0
- package/dist/core/lark-client.d.ts.map +1 -0
- package/dist/core/lark-client.js +315 -0
- package/dist/core/lark-client.js.map +1 -0
- package/dist/core/token-store.d.ts +67 -0
- package/dist/core/token-store.d.ts.map +1 -0
- package/dist/core/token-store.js +215 -0
- package/dist/core/token-store.js.map +1 -0
- package/dist/core/types.d.ts +286 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +11 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/uat-client.d.ts +64 -0
- package/dist/core/uat-client.d.ts.map +1 -0
- package/dist/core/uat-client.js +227 -0
- package/dist/core/uat-client.js.map +1 -0
- package/dist/core/version.d.ts +26 -0
- package/dist/core/version.d.ts.map +1 -0
- package/dist/core/version.js +50 -0
- package/dist/core/version.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +116 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/bitable/app.d.ts +20 -0
- package/dist/tools/bitable/app.d.ts.map +1 -0
- package/dist/tools/bitable/app.js +301 -0
- package/dist/tools/bitable/app.js.map +1 -0
- package/dist/tools/bitable/field.d.ts +19 -0
- package/dist/tools/bitable/field.d.ts.map +1 -0
- package/dist/tools/bitable/field.js +315 -0
- package/dist/tools/bitable/field.js.map +1 -0
- package/dist/tools/bitable/index.d.ts +21 -0
- package/dist/tools/bitable/index.d.ts.map +1 -0
- package/dist/tools/bitable/index.js +39 -0
- package/dist/tools/bitable/index.js.map +1 -0
- package/dist/tools/bitable/record.d.ts +22 -0
- package/dist/tools/bitable/record.d.ts.map +1 -0
- package/dist/tools/bitable/record.js +434 -0
- package/dist/tools/bitable/record.js.map +1 -0
- package/dist/tools/bitable/table.d.ts +21 -0
- package/dist/tools/bitable/table.d.ts.map +1 -0
- package/dist/tools/bitable/table.js +361 -0
- package/dist/tools/bitable/table.js.map +1 -0
- package/dist/tools/calendar/calendar.d.ts +18 -0
- package/dist/tools/calendar/calendar.d.ts.map +1 -0
- package/dist/tools/calendar/calendar.js +192 -0
- package/dist/tools/calendar/calendar.js.map +1 -0
- package/dist/tools/calendar/event.d.ts +20 -0
- package/dist/tools/calendar/event.d.ts.map +1 -0
- package/dist/tools/calendar/event.js +465 -0
- package/dist/tools/calendar/event.js.map +1 -0
- package/dist/tools/calendar/index.d.ts +19 -0
- package/dist/tools/calendar/index.d.ts.map +1 -0
- package/dist/tools/calendar/index.js +37 -0
- package/dist/tools/calendar/index.js.map +1 -0
- package/dist/tools/chat/chat.d.ts +11 -0
- package/dist/tools/chat/chat.d.ts.map +1 -0
- package/dist/tools/chat/chat.js +106 -0
- package/dist/tools/chat/chat.js.map +1 -0
- package/dist/tools/chat/index.d.ts +11 -0
- package/dist/tools/chat/index.d.ts.map +1 -0
- package/dist/tools/chat/index.js +20 -0
- package/dist/tools/chat/index.js.map +1 -0
- package/dist/tools/chat/members.d.ts +9 -0
- package/dist/tools/chat/members.d.ts.map +1 -0
- package/dist/tools/chat/members.js +80 -0
- package/dist/tools/chat/members.js.map +1 -0
- package/dist/tools/common/get-user.d.ts +11 -0
- package/dist/tools/common/get-user.d.ts.map +1 -0
- package/dist/tools/common/get-user.js +112 -0
- package/dist/tools/common/get-user.js.map +1 -0
- package/dist/tools/common/index.d.ts +11 -0
- package/dist/tools/common/index.d.ts.map +1 -0
- package/dist/tools/common/index.js +20 -0
- package/dist/tools/common/index.js.map +1 -0
- package/dist/tools/common/search-user.d.ts +9 -0
- package/dist/tools/common/search-user.d.ts.map +1 -0
- package/dist/tools/common/search-user.js +88 -0
- package/dist/tools/common/search-user.js.map +1 -0
- package/dist/tools/doc/create.d.ts +17 -0
- package/dist/tools/doc/create.d.ts.map +1 -0
- package/dist/tools/doc/create.js +159 -0
- package/dist/tools/doc/create.js.map +1 -0
- package/dist/tools/doc/fetch.d.ts +17 -0
- package/dist/tools/doc/fetch.d.ts.map +1 -0
- package/dist/tools/doc/fetch.js +123 -0
- package/dist/tools/doc/fetch.js.map +1 -0
- package/dist/tools/doc/index.d.ts +21 -0
- package/dist/tools/doc/index.d.ts.map +1 -0
- package/dist/tools/doc/index.js +33 -0
- package/dist/tools/doc/index.js.map +1 -0
- package/dist/tools/doc/shared.d.ts +69 -0
- package/dist/tools/doc/shared.d.ts.map +1 -0
- package/dist/tools/doc/shared.js +172 -0
- package/dist/tools/doc/shared.js.map +1 -0
- package/dist/tools/doc/update.d.ts +25 -0
- package/dist/tools/doc/update.d.ts.map +1 -0
- package/dist/tools/doc/update.js +208 -0
- package/dist/tools/doc/update.js.map +1 -0
- package/dist/tools/drive/file.d.ts +13 -0
- package/dist/tools/drive/file.d.ts.map +1 -0
- package/dist/tools/drive/file.js +212 -0
- package/dist/tools/drive/file.js.map +1 -0
- package/dist/tools/drive/index.d.ts +12 -0
- package/dist/tools/drive/index.d.ts.map +1 -0
- package/dist/tools/drive/index.js +25 -0
- package/dist/tools/drive/index.js.map +1 -0
- package/dist/tools/im/format-messages.d.ts +99 -0
- package/dist/tools/im/format-messages.d.ts.map +1 -0
- package/dist/tools/im/format-messages.js +277 -0
- package/dist/tools/im/format-messages.js.map +1 -0
- package/dist/tools/im/helpers.d.ts +53 -0
- package/dist/tools/im/helpers.d.ts.map +1 -0
- package/dist/tools/im/helpers.js +85 -0
- package/dist/tools/im/helpers.js.map +1 -0
- package/dist/tools/im/index.d.ts +25 -0
- package/dist/tools/im/index.d.ts.map +1 -0
- package/dist/tools/im/index.js +44 -0
- package/dist/tools/im/index.js.map +1 -0
- package/dist/tools/im/message-read.d.ts +19 -0
- package/dist/tools/im/message-read.d.ts.map +1 -0
- package/dist/tools/im/message-read.js +526 -0
- package/dist/tools/im/message-read.js.map +1 -0
- package/dist/tools/im/message.d.ts +22 -0
- package/dist/tools/im/message.d.ts.map +1 -0
- package/dist/tools/im/message.js +233 -0
- package/dist/tools/im/message.js.map +1 -0
- package/dist/tools/im/resource.d.ts +19 -0
- package/dist/tools/im/resource.d.ts.map +1 -0
- package/dist/tools/im/resource.js +185 -0
- package/dist/tools/im/resource.js.map +1 -0
- package/dist/tools/im/time-utils.d.ts +70 -0
- package/dist/tools/im/time-utils.d.ts.map +1 -0
- package/dist/tools/im/time-utils.js +277 -0
- package/dist/tools/im/time-utils.js.map +1 -0
- package/dist/tools/index.d.ts +85 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +135 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/oauth.d.ts +15 -0
- package/dist/tools/oauth.d.ts.map +1 -0
- package/dist/tools/oauth.js +379 -0
- package/dist/tools/oauth.js.map +1 -0
- package/dist/tools/search/doc-search.d.ts +9 -0
- package/dist/tools/search/doc-search.d.ts.map +1 -0
- package/dist/tools/search/doc-search.js +219 -0
- package/dist/tools/search/doc-search.js.map +1 -0
- package/dist/tools/search/index.d.ts +11 -0
- package/dist/tools/search/index.d.ts.map +1 -0
- package/dist/tools/search/index.js +18 -0
- package/dist/tools/search/index.js.map +1 -0
- package/dist/tools/sheets/index.d.ts +11 -0
- package/dist/tools/sheets/index.d.ts.map +1 -0
- package/dist/tools/sheets/index.js +18 -0
- package/dist/tools/sheets/index.js.map +1 -0
- package/dist/tools/sheets/sheet.d.ts +11 -0
- package/dist/tools/sheets/sheet.d.ts.map +1 -0
- package/dist/tools/sheets/sheet.js +332 -0
- package/dist/tools/sheets/sheet.js.map +1 -0
- package/dist/tools/task/index.d.ts +12 -0
- package/dist/tools/task/index.d.ts.map +1 -0
- package/dist/tools/task/index.js +30 -0
- package/dist/tools/task/index.js.map +1 -0
- package/dist/tools/task/task.d.ts +13 -0
- package/dist/tools/task/task.d.ts.map +1 -0
- package/dist/tools/task/task.js +225 -0
- package/dist/tools/task/task.js.map +1 -0
- package/dist/tools/task/tasklist.d.ts +13 -0
- package/dist/tools/task/tasklist.d.ts.map +1 -0
- package/dist/tools/task/tasklist.js +206 -0
- package/dist/tools/task/tasklist.js.map +1 -0
- package/dist/tools/wiki/index.d.ts +11 -0
- package/dist/tools/wiki/index.d.ts.map +1 -0
- package/dist/tools/wiki/index.js +20 -0
- package/dist/tools/wiki/index.js.map +1 -0
- package/dist/tools/wiki/node.d.ts +11 -0
- package/dist/tools/wiki/node.d.ts.map +1 -0
- package/dist/tools/wiki/node.js +112 -0
- package/dist/tools/wiki/node.js.map +1 -0
- package/dist/tools/wiki/space.d.ts +11 -0
- package/dist/tools/wiki/space.d.ts.map +1 -0
- package/dist/tools/wiki/space.js +125 -0
- package/dist/tools/wiki/space.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +36 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +101 -0
- package/dist/utils/logger.js.map +1 -0
- package/eslint.config.js +13 -0
- package/package.json +54 -0
- package/skills/feishu-bitable/SKILL.md +248 -0
- package/skills/feishu-bitable/references/examples.md +813 -0
- package/skills/feishu-bitable/references/field-properties.md +763 -0
- package/skills/feishu-bitable/references/record-values.md +911 -0
- package/skills/feishu-calendar/SKILL.md +244 -0
- package/skills/feishu-channel-rules/SKILL.md +18 -0
- package/skills/feishu-channel-rules/references/markdown-syntax.md +138 -0
- package/skills/feishu-create-doc/SKILL.md +719 -0
- package/skills/feishu-fetch-doc/SKILL.md +93 -0
- package/skills/feishu-im-read/SKILL.md +163 -0
- package/skills/feishu-task/SKILL.md +293 -0
- package/skills/feishu-troubleshoot/SKILL.md +70 -0
- package/skills/feishu-update-doc/SKILL.md +285 -0
- package/src/core/api-error.ts +342 -0
- package/src/core/auth-errors.ts +27 -0
- package/src/core/config.ts +134 -0
- package/src/core/device-flow.ts +314 -0
- package/src/core/index.ts +16 -0
- package/src/core/lark-client.ts +391 -0
- package/src/core/token-store.ts +249 -0
- package/src/core/types.ts +302 -0
- package/src/core/uat-client.ts +298 -0
- package/src/core/version.ts +53 -0
- package/src/index.ts +138 -0
- package/src/tools/bitable/app.ts +390 -0
- package/src/tools/bitable/field.ts +406 -0
- package/src/tools/bitable/index.ts +43 -0
- package/src/tools/bitable/record.ts +559 -0
- package/src/tools/bitable/table.ts +472 -0
- package/src/tools/calendar/calendar.ts +254 -0
- package/src/tools/calendar/event.ts +606 -0
- package/src/tools/calendar/index.ts +41 -0
- package/src/tools/chat/chat.ts +127 -0
- package/src/tools/chat/index.ts +24 -0
- package/src/tools/chat/members.ts +93 -0
- package/src/tools/common/get-user.ts +127 -0
- package/src/tools/common/index.ts +24 -0
- package/src/tools/common/search-user.ts +99 -0
- package/src/tools/doc/create.ts +184 -0
- package/src/tools/doc/fetch.ts +149 -0
- package/src/tools/doc/index.ts +38 -0
- package/src/tools/doc/shared.ts +228 -0
- package/src/tools/doc/update.ts +240 -0
- package/src/tools/drive/file.ts +265 -0
- package/src/tools/drive/index.ts +29 -0
- package/src/tools/im/format-messages.ts +391 -0
- package/src/tools/im/helpers.ts +109 -0
- package/src/tools/im/index.ts +49 -0
- package/src/tools/im/message-read.ts +676 -0
- package/src/tools/im/message.ts +303 -0
- package/src/tools/im/resource.ts +225 -0
- package/src/tools/im/time-utils.ts +347 -0
- package/src/tools/index.ts +205 -0
- package/src/tools/oauth.ts +460 -0
- package/src/tools/search/doc-search.ts +250 -0
- package/src/tools/search/index.ts +22 -0
- package/src/tools/sheets/index.ts +22 -0
- package/src/tools/sheets/sheet.ts +382 -0
- package/src/tools/task/index.ts +34 -0
- package/src/tools/task/task.ts +265 -0
- package/src/tools/task/tasklist.ts +262 -0
- package/src/tools/wiki/index.ts +24 -0
- package/src/tools/wiki/node.ts +131 -0
- package/src/tools/wiki/space.ts +152 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/logger.ts +132 -0
- package/tests/core/config.test.ts +238 -0
- package/tests/core/device-flow.test.ts +490 -0
- package/tests/core/lark-client.test.ts +378 -0
- package/tests/core/token-store.test.ts +438 -0
- package/tests/index.test.ts +360 -0
- package/tests/tools/doc/create.test.ts +224 -0
- package/tests/tools/doc/fetch.test.ts +182 -0
- package/tests/tools/doc/shared.test.ts +183 -0
- package/tests/tools/doc/update.test.ts +330 -0
- package/tests/tools/im/format-messages.test.ts +184 -0
- package/tests/tools/im/time-utils.test.ts +178 -0
- package/tests/utils/logger.test.ts +140 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* feishu_calendar_event tool - Manage Feishu calendar events.
|
|
6
|
+
*
|
|
7
|
+
* Actions: create, list, get, patch, delete
|
|
8
|
+
*
|
|
9
|
+
* Uses the Feishu Calendar API:
|
|
10
|
+
* - create: POST /open-apis/calendar/v4/calendars/:calendar_id/events
|
|
11
|
+
* - list: GET /open-apis/calendar/v4/calendars/:calendar_id/events/instance_view
|
|
12
|
+
* - get: GET /open-apis/calendar/v4/calendars/:calendar_id/events/:event_id
|
|
13
|
+
* - patch: PATCH /open-apis/calendar/v4/calendars/:calendar_id/events/:event_id
|
|
14
|
+
* - delete: DELETE /open-apis/calendar/v4/calendars/:calendar_id/events/:event_id
|
|
15
|
+
*
|
|
16
|
+
* Adapted from openclaw-lark for MCP Server architecture.
|
|
17
|
+
*/
|
|
18
|
+
import { z } from 'zod';
|
|
19
|
+
import { getValidAccessToken, NeedAuthorizationError } from '../../core/uat-client.js';
|
|
20
|
+
import { assertLarkOk } from '../../core/api-error.js';
|
|
21
|
+
import { json, jsonError } from '../im/helpers.js';
|
|
22
|
+
import { logger } from '../../utils/logger.js';
|
|
23
|
+
const log = logger('tools:calendar:event');
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// Helpers
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
/**
|
|
28
|
+
* Parse time string to Unix timestamp (seconds).
|
|
29
|
+
* Supports ISO 8601 with timezone or Beijing time (UTC+8) without timezone.
|
|
30
|
+
*/
|
|
31
|
+
function parseTimeToTimestamp(input) {
|
|
32
|
+
try {
|
|
33
|
+
const trimmed = input.trim();
|
|
34
|
+
const hasTimezone = /[Zz]$|[+-]\d{2}:\d{2}$/.test(trimmed);
|
|
35
|
+
if (hasTimezone) {
|
|
36
|
+
const date = new Date(trimmed);
|
|
37
|
+
if (isNaN(date.getTime()))
|
|
38
|
+
return null;
|
|
39
|
+
return Math.floor(date.getTime() / 1000).toString();
|
|
40
|
+
}
|
|
41
|
+
// No timezone - treat as Beijing time (UTC+8)
|
|
42
|
+
const normalized = trimmed.replace('T', ' ');
|
|
43
|
+
const match = normalized.match(/^(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2})(?::(\d{2}))?$/);
|
|
44
|
+
if (!match) {
|
|
45
|
+
const date = new Date(trimmed);
|
|
46
|
+
if (isNaN(date.getTime()))
|
|
47
|
+
return null;
|
|
48
|
+
return Math.floor(date.getTime() / 1000).toString();
|
|
49
|
+
}
|
|
50
|
+
const [, year, month, day, hour, minute, second] = match;
|
|
51
|
+
const utcDate = new Date(Date.UTC(parseInt(year), parseInt(month) - 1, parseInt(day), parseInt(hour) - 8, // Beijing time - 8 hours = UTC
|
|
52
|
+
parseInt(minute), parseInt(second ?? '0')));
|
|
53
|
+
return Math.floor(utcDate.getTime() / 1000).toString();
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Convert Unix timestamp to ISO 8601 string in Shanghai timezone.
|
|
61
|
+
*/
|
|
62
|
+
function unixTimestampToISO8601(raw) {
|
|
63
|
+
if (raw === undefined || raw === null)
|
|
64
|
+
return null;
|
|
65
|
+
const text = typeof raw === 'number' ? String(raw) : String(raw).trim();
|
|
66
|
+
if (!/^-?\d+$/.test(text))
|
|
67
|
+
return null;
|
|
68
|
+
const num = Number(text);
|
|
69
|
+
if (!Number.isFinite(num))
|
|
70
|
+
return null;
|
|
71
|
+
const utcMs = Math.abs(num) >= 1e12 ? num : num * 1000;
|
|
72
|
+
const beijingDate = new Date(utcMs + 8 * 60 * 60 * 1000);
|
|
73
|
+
if (Number.isNaN(beijingDate.getTime()))
|
|
74
|
+
return null;
|
|
75
|
+
const year = beijingDate.getUTCFullYear();
|
|
76
|
+
const month = String(beijingDate.getUTCMonth() + 1).padStart(2, '0');
|
|
77
|
+
const day = String(beijingDate.getUTCDate()).padStart(2, '0');
|
|
78
|
+
const hour = String(beijingDate.getUTCHours()).padStart(2, '0');
|
|
79
|
+
const minute = String(beijingDate.getUTCMinutes()).padStart(2, '0');
|
|
80
|
+
const second = String(beijingDate.getUTCSeconds()).padStart(2, '0');
|
|
81
|
+
return `${year}-${month}-${day}T${hour}:${minute}:${second}+08:00`;
|
|
82
|
+
}
|
|
83
|
+
// ---------------------------------------------------------------------------
|
|
84
|
+
// Input schemas
|
|
85
|
+
// ---------------------------------------------------------------------------
|
|
86
|
+
const createActionSchema = {
|
|
87
|
+
action: z.literal('create').describe('Create a calendar event'),
|
|
88
|
+
summary: z.string().optional().describe('Event title (recommended)'),
|
|
89
|
+
start_time: z.string().describe('Start time (ISO 8601 with timezone, e.g., 2024-01-01T00:00:00+08:00)'),
|
|
90
|
+
end_time: z.string().describe('End time (ISO 8601 with timezone, e.g., 2024-01-01T01:00:00+08:00)'),
|
|
91
|
+
calendar_id: z.string().optional().describe('Calendar ID (optional, uses primary if not provided)'),
|
|
92
|
+
description: z.string().optional().describe('Event description'),
|
|
93
|
+
location_name: z.string().optional().describe('Location name'),
|
|
94
|
+
};
|
|
95
|
+
const listActionSchema = {
|
|
96
|
+
action: z.literal('list').describe('List calendar events in a time range'),
|
|
97
|
+
start_time: z.string().describe('Start time (ISO 8601 with timezone, max 40 days range)'),
|
|
98
|
+
end_time: z.string().describe('End time (ISO 8601 with timezone, max 40 days range)'),
|
|
99
|
+
calendar_id: z.string().optional().describe('Calendar ID (optional, uses primary if not provided)'),
|
|
100
|
+
};
|
|
101
|
+
const getActionSchema = {
|
|
102
|
+
action: z.literal('get').describe('Get a calendar event by ID'),
|
|
103
|
+
event_id: z.string().describe('Event ID'),
|
|
104
|
+
calendar_id: z.string().optional().describe('Calendar ID (optional, uses primary if not provided)'),
|
|
105
|
+
};
|
|
106
|
+
const patchActionSchema = {
|
|
107
|
+
action: z.literal('patch').describe('Update a calendar event'),
|
|
108
|
+
event_id: z.string().describe('Event ID'),
|
|
109
|
+
calendar_id: z.string().optional().describe('Calendar ID (optional, uses primary if not provided)'),
|
|
110
|
+
summary: z.string().optional().describe('New event title'),
|
|
111
|
+
description: z.string().optional().describe('New event description'),
|
|
112
|
+
start_time: z.string().optional().describe('New start time (ISO 8601 with timezone)'),
|
|
113
|
+
end_time: z.string().optional().describe('New end time (ISO 8601 with timezone)'),
|
|
114
|
+
};
|
|
115
|
+
const deleteActionSchema = {
|
|
116
|
+
action: z.literal('delete').describe('Delete a calendar event'),
|
|
117
|
+
event_id: z.string().describe('Event ID'),
|
|
118
|
+
calendar_id: z.string().optional().describe('Calendar ID (optional, uses primary if not provided)'),
|
|
119
|
+
need_notification: z.boolean().optional().describe('Whether to notify attendees (default true)'),
|
|
120
|
+
};
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
// Tool registration
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
export function registerCalendarEventTool(registry) {
|
|
125
|
+
registry.register({
|
|
126
|
+
name: 'feishu_calendar_event_create',
|
|
127
|
+
description: [
|
|
128
|
+
'Create a Feishu calendar event.',
|
|
129
|
+
'',
|
|
130
|
+
'Parameters:',
|
|
131
|
+
'- summary: Event title (recommended)',
|
|
132
|
+
'- start_time: Start time (ISO 8601 with timezone)',
|
|
133
|
+
'- end_time: End time (ISO 8601 with timezone)',
|
|
134
|
+
'- calendar_id: Calendar ID (optional)',
|
|
135
|
+
'- description: Event description (optional)',
|
|
136
|
+
'- location_name: Location name (optional)',
|
|
137
|
+
'',
|
|
138
|
+
'Returns the created event.',
|
|
139
|
+
'Requires OAuth authorization.',
|
|
140
|
+
].join('\n'),
|
|
141
|
+
inputSchema: createActionSchema,
|
|
142
|
+
handler: async (args, context) => handleCreate(args, context),
|
|
143
|
+
});
|
|
144
|
+
registry.register({
|
|
145
|
+
name: 'feishu_calendar_event_list',
|
|
146
|
+
description: [
|
|
147
|
+
'List Feishu calendar events in a time range.',
|
|
148
|
+
'',
|
|
149
|
+
'Parameters:',
|
|
150
|
+
'- start_time: Start time (ISO 8601 with timezone, max 40 days range)',
|
|
151
|
+
'- end_time: End time (ISO 8601 with timezone, max 40 days range)',
|
|
152
|
+
'- calendar_id: Calendar ID (optional)',
|
|
153
|
+
'',
|
|
154
|
+
'Returns list of events.',
|
|
155
|
+
'Requires OAuth authorization.',
|
|
156
|
+
].join('\n'),
|
|
157
|
+
inputSchema: listActionSchema,
|
|
158
|
+
handler: async (args, context) => handleList(args, context),
|
|
159
|
+
});
|
|
160
|
+
registry.register({
|
|
161
|
+
name: 'feishu_calendar_event_get',
|
|
162
|
+
description: [
|
|
163
|
+
'Get a Feishu calendar event by ID.',
|
|
164
|
+
'',
|
|
165
|
+
'Parameters:',
|
|
166
|
+
'- event_id: Event ID',
|
|
167
|
+
'- calendar_id: Calendar ID (optional)',
|
|
168
|
+
'',
|
|
169
|
+
'Returns the event info.',
|
|
170
|
+
'Requires OAuth authorization.',
|
|
171
|
+
].join('\n'),
|
|
172
|
+
inputSchema: getActionSchema,
|
|
173
|
+
handler: async (args, context) => handleGet(args, context),
|
|
174
|
+
});
|
|
175
|
+
registry.register({
|
|
176
|
+
name: 'feishu_calendar_event_patch',
|
|
177
|
+
description: [
|
|
178
|
+
'Update a Feishu calendar event.',
|
|
179
|
+
'',
|
|
180
|
+
'Parameters:',
|
|
181
|
+
'- event_id: Event ID',
|
|
182
|
+
'- calendar_id: Calendar ID (optional)',
|
|
183
|
+
'- summary: New event title (optional)',
|
|
184
|
+
'- description: New event description (optional)',
|
|
185
|
+
'- start_time: New start time (optional)',
|
|
186
|
+
'- end_time: New end time (optional)',
|
|
187
|
+
'',
|
|
188
|
+
'Returns the updated event.',
|
|
189
|
+
'Requires OAuth authorization.',
|
|
190
|
+
].join('\n'),
|
|
191
|
+
inputSchema: patchActionSchema,
|
|
192
|
+
handler: async (args, context) => handlePatch(args, context),
|
|
193
|
+
});
|
|
194
|
+
registry.register({
|
|
195
|
+
name: 'feishu_calendar_event_delete',
|
|
196
|
+
description: [
|
|
197
|
+
'Delete a Feishu calendar event.',
|
|
198
|
+
'',
|
|
199
|
+
'Parameters:',
|
|
200
|
+
'- event_id: Event ID',
|
|
201
|
+
'- calendar_id: Calendar ID (optional)',
|
|
202
|
+
'- need_notification: Whether to notify attendees (default true)',
|
|
203
|
+
'',
|
|
204
|
+
'Returns success status.',
|
|
205
|
+
'Requires OAuth authorization.',
|
|
206
|
+
].join('\n'),
|
|
207
|
+
inputSchema: deleteActionSchema,
|
|
208
|
+
handler: async (args, context) => handleDelete(args, context),
|
|
209
|
+
});
|
|
210
|
+
log.debug('feishu_calendar_event tools registered');
|
|
211
|
+
}
|
|
212
|
+
// ---------------------------------------------------------------------------
|
|
213
|
+
// Helpers
|
|
214
|
+
// ---------------------------------------------------------------------------
|
|
215
|
+
async function getAccessToken(context) {
|
|
216
|
+
const { larkClient, config } = context;
|
|
217
|
+
if (!larkClient) {
|
|
218
|
+
return jsonError('LarkClient not initialized. Check FEISHU_APP_ID and FEISHU_APP_SECRET.');
|
|
219
|
+
}
|
|
220
|
+
const { appId, appSecret, brand } = config;
|
|
221
|
+
if (!appId || !appSecret) {
|
|
222
|
+
return jsonError('Missing FEISHU_APP_ID or FEISHU_APP_SECRET.');
|
|
223
|
+
}
|
|
224
|
+
const { listStoredTokens } = await import('../../core/token-store.js');
|
|
225
|
+
const tokens = await listStoredTokens(appId);
|
|
226
|
+
if (tokens.length === 0) {
|
|
227
|
+
return jsonError('No user authorization found. Please use the feishu_oauth tool with action="authorize" to authorize a user first.');
|
|
228
|
+
}
|
|
229
|
+
const userOpenId = tokens[0].userOpenId;
|
|
230
|
+
try {
|
|
231
|
+
return await getValidAccessToken({
|
|
232
|
+
userOpenId,
|
|
233
|
+
appId,
|
|
234
|
+
appSecret,
|
|
235
|
+
domain: brand ?? 'feishu',
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
if (err instanceof NeedAuthorizationError) {
|
|
240
|
+
return jsonError(`User authorization required or expired. Please use feishu_oauth tool with action="authorize" to re-authorize.`, { userOpenId });
|
|
241
|
+
}
|
|
242
|
+
throw err;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
async function resolveCalendarId(calendarId, larkClient, accessToken) {
|
|
246
|
+
if (calendarId)
|
|
247
|
+
return calendarId;
|
|
248
|
+
const Lark = await import('@larksuiteoapi/node-sdk');
|
|
249
|
+
const opts = Lark.withUserAccessToken(accessToken);
|
|
250
|
+
const res = await larkClient.sdk.calendar.calendar.primary({}, opts);
|
|
251
|
+
assertLarkOk(res);
|
|
252
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
253
|
+
const data = res.data;
|
|
254
|
+
const cid = data?.calendars?.[0]?.calendar?.calendar_id;
|
|
255
|
+
if (!cid) {
|
|
256
|
+
throw new Error('Could not determine primary calendar');
|
|
257
|
+
}
|
|
258
|
+
log.info(`resolveCalendarId: primary() returned calendar_id=${cid}`);
|
|
259
|
+
return cid;
|
|
260
|
+
}
|
|
261
|
+
function normalizeEventTimeFields(event) {
|
|
262
|
+
if (!event)
|
|
263
|
+
return event;
|
|
264
|
+
const normalized = { ...event };
|
|
265
|
+
const startTime = event.start_time;
|
|
266
|
+
if (startTime && typeof startTime === 'object' && 'timestamp' in startTime) {
|
|
267
|
+
const ts = startTime.timestamp;
|
|
268
|
+
const iso = unixTimestampToISO8601(ts);
|
|
269
|
+
if (iso) {
|
|
270
|
+
normalized.start_time = iso;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
const endTime = event.end_time;
|
|
274
|
+
if (endTime && typeof endTime === 'object' && 'timestamp' in endTime) {
|
|
275
|
+
const ts = endTime.timestamp;
|
|
276
|
+
const iso = unixTimestampToISO8601(ts);
|
|
277
|
+
if (iso) {
|
|
278
|
+
normalized.end_time = iso;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return normalized;
|
|
282
|
+
}
|
|
283
|
+
// ---------------------------------------------------------------------------
|
|
284
|
+
// Handlers
|
|
285
|
+
// ---------------------------------------------------------------------------
|
|
286
|
+
async function handleCreate(args, context) {
|
|
287
|
+
const p = args;
|
|
288
|
+
const { larkClient } = context;
|
|
289
|
+
if (!p.start_time || !p.end_time) {
|
|
290
|
+
return jsonError('start_time and end_time are required');
|
|
291
|
+
}
|
|
292
|
+
const startTs = parseTimeToTimestamp(p.start_time);
|
|
293
|
+
const endTs = parseTimeToTimestamp(p.end_time);
|
|
294
|
+
if (!startTs || !endTs) {
|
|
295
|
+
return jsonError("Invalid time format. Must use ISO 8601 with timezone, e.g., '2024-01-01T00:00:00+08:00'", { received_start: p.start_time, received_end: p.end_time });
|
|
296
|
+
}
|
|
297
|
+
const accessTokenResult = await getAccessToken(context);
|
|
298
|
+
if (typeof accessTokenResult === 'object' && 'content' in accessTokenResult) {
|
|
299
|
+
return accessTokenResult;
|
|
300
|
+
}
|
|
301
|
+
const accessToken = accessTokenResult;
|
|
302
|
+
const calendarId = await resolveCalendarId(p.calendar_id, larkClient, accessToken);
|
|
303
|
+
log.info(`create: summary=${p.summary ?? '(none)'}, start_time=${startTs}, end_time=${endTs}, calendar_id=${calendarId}`);
|
|
304
|
+
const Lark = await import('@larksuiteoapi/node-sdk');
|
|
305
|
+
const opts = Lark.withUserAccessToken(accessToken);
|
|
306
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
307
|
+
const eventData = {
|
|
308
|
+
summary: p.summary,
|
|
309
|
+
start_time: { timestamp: startTs },
|
|
310
|
+
end_time: { timestamp: endTs },
|
|
311
|
+
need_notification: true,
|
|
312
|
+
};
|
|
313
|
+
if (p.description)
|
|
314
|
+
eventData.description = p.description;
|
|
315
|
+
if (p.location_name)
|
|
316
|
+
eventData.location = { name: p.location_name };
|
|
317
|
+
const res = await larkClient.sdk.calendar.calendarEvent.create({
|
|
318
|
+
path: { calendar_id: calendarId },
|
|
319
|
+
data: eventData,
|
|
320
|
+
}, opts);
|
|
321
|
+
assertLarkOk(res);
|
|
322
|
+
log.info(`create: event created, event_id=${res.data?.event?.event_id}`);
|
|
323
|
+
return json({
|
|
324
|
+
event: normalizeEventTimeFields(res.data?.event),
|
|
325
|
+
calendar_id: calendarId,
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
async function handleList(args, context) {
|
|
329
|
+
const p = args;
|
|
330
|
+
const { larkClient } = context;
|
|
331
|
+
if (!p.start_time || !p.end_time) {
|
|
332
|
+
return jsonError('start_time and end_time are required');
|
|
333
|
+
}
|
|
334
|
+
const startTs = parseTimeToTimestamp(p.start_time);
|
|
335
|
+
const endTs = parseTimeToTimestamp(p.end_time);
|
|
336
|
+
if (!startTs || !endTs) {
|
|
337
|
+
return jsonError("Invalid time format. Must use ISO 8601 with timezone, e.g., '2024-01-01T00:00:00+08:00'", { received_start: p.start_time, received_end: p.end_time });
|
|
338
|
+
}
|
|
339
|
+
const accessTokenResult = await getAccessToken(context);
|
|
340
|
+
if (typeof accessTokenResult === 'object' && 'content' in accessTokenResult) {
|
|
341
|
+
return accessTokenResult;
|
|
342
|
+
}
|
|
343
|
+
const accessToken = accessTokenResult;
|
|
344
|
+
const calendarId = await resolveCalendarId(p.calendar_id, larkClient, accessToken);
|
|
345
|
+
log.info(`list: calendar_id=${calendarId}, start_time=${startTs}, end_time=${endTs}`);
|
|
346
|
+
const Lark = await import('@larksuiteoapi/node-sdk');
|
|
347
|
+
const opts = Lark.withUserAccessToken(accessToken);
|
|
348
|
+
const res = await larkClient.sdk.calendar.calendarEvent.instanceView({
|
|
349
|
+
path: { calendar_id: calendarId },
|
|
350
|
+
params: {
|
|
351
|
+
start_time: startTs,
|
|
352
|
+
end_time: endTs,
|
|
353
|
+
user_id_type: 'open_id',
|
|
354
|
+
},
|
|
355
|
+
}, opts);
|
|
356
|
+
assertLarkOk(res);
|
|
357
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
358
|
+
const data = res.data;
|
|
359
|
+
log.info(`list: returned ${data?.items?.length ?? 0} events`);
|
|
360
|
+
// Normalize time fields
|
|
361
|
+
const events = (data?.items ?? []).map((item) => normalizeEventTimeFields(item));
|
|
362
|
+
return json({
|
|
363
|
+
events,
|
|
364
|
+
has_more: data?.has_more ?? false,
|
|
365
|
+
page_token: data?.page_token,
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
async function handleGet(args, context) {
|
|
369
|
+
const p = args;
|
|
370
|
+
const { larkClient } = context;
|
|
371
|
+
if (!p.event_id) {
|
|
372
|
+
return jsonError('event_id is required');
|
|
373
|
+
}
|
|
374
|
+
const accessTokenResult = await getAccessToken(context);
|
|
375
|
+
if (typeof accessTokenResult === 'object' && 'content' in accessTokenResult) {
|
|
376
|
+
return accessTokenResult;
|
|
377
|
+
}
|
|
378
|
+
const accessToken = accessTokenResult;
|
|
379
|
+
const calendarId = await resolveCalendarId(p.calendar_id, larkClient, accessToken);
|
|
380
|
+
log.info(`get: calendar_id=${calendarId}, event_id=${p.event_id}`);
|
|
381
|
+
const Lark = await import('@larksuiteoapi/node-sdk');
|
|
382
|
+
const opts = Lark.withUserAccessToken(accessToken);
|
|
383
|
+
const res = await larkClient.sdk.calendar.calendarEvent.get({
|
|
384
|
+
path: { calendar_id: calendarId, event_id: p.event_id },
|
|
385
|
+
}, opts);
|
|
386
|
+
assertLarkOk(res);
|
|
387
|
+
log.info(`get: retrieved event ${p.event_id}`);
|
|
388
|
+
return json({
|
|
389
|
+
event: normalizeEventTimeFields(res.data?.event),
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
async function handlePatch(args, context) {
|
|
393
|
+
const p = args;
|
|
394
|
+
const { larkClient } = context;
|
|
395
|
+
if (!p.event_id) {
|
|
396
|
+
return jsonError('event_id is required');
|
|
397
|
+
}
|
|
398
|
+
const accessTokenResult = await getAccessToken(context);
|
|
399
|
+
if (typeof accessTokenResult === 'object' && 'content' in accessTokenResult) {
|
|
400
|
+
return accessTokenResult;
|
|
401
|
+
}
|
|
402
|
+
const accessToken = accessTokenResult;
|
|
403
|
+
const calendarId = await resolveCalendarId(p.calendar_id, larkClient, accessToken);
|
|
404
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
405
|
+
const updateData = {};
|
|
406
|
+
if (p.start_time) {
|
|
407
|
+
const startTs = parseTimeToTimestamp(p.start_time);
|
|
408
|
+
if (!startTs) {
|
|
409
|
+
return jsonError("Invalid start_time format. Must use ISO 8601 with timezone, e.g., '2024-01-01T00:00:00+08:00'");
|
|
410
|
+
}
|
|
411
|
+
updateData.start_time = { timestamp: startTs };
|
|
412
|
+
}
|
|
413
|
+
if (p.end_time) {
|
|
414
|
+
const endTs = parseTimeToTimestamp(p.end_time);
|
|
415
|
+
if (!endTs) {
|
|
416
|
+
return jsonError("Invalid end_time format. Must use ISO 8601 with timezone, e.g., '2024-01-01T00:00:00+08:00'");
|
|
417
|
+
}
|
|
418
|
+
updateData.end_time = { timestamp: endTs };
|
|
419
|
+
}
|
|
420
|
+
if (p.summary)
|
|
421
|
+
updateData.summary = p.summary;
|
|
422
|
+
if (p.description)
|
|
423
|
+
updateData.description = p.description;
|
|
424
|
+
log.info(`patch: calendar_id=${calendarId}, event_id=${p.event_id}, fields=${Object.keys(updateData).join(',')}`);
|
|
425
|
+
const Lark = await import('@larksuiteoapi/node-sdk');
|
|
426
|
+
const opts = Lark.withUserAccessToken(accessToken);
|
|
427
|
+
const res = await larkClient.sdk.calendar.calendarEvent.patch({
|
|
428
|
+
path: { calendar_id: calendarId, event_id: p.event_id },
|
|
429
|
+
data: updateData,
|
|
430
|
+
}, opts);
|
|
431
|
+
assertLarkOk(res);
|
|
432
|
+
log.info(`patch: updated event ${p.event_id}`);
|
|
433
|
+
return json({
|
|
434
|
+
event: normalizeEventTimeFields(res.data?.event),
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
async function handleDelete(args, context) {
|
|
438
|
+
const p = args;
|
|
439
|
+
const { larkClient } = context;
|
|
440
|
+
if (!p.event_id) {
|
|
441
|
+
return jsonError('event_id is required');
|
|
442
|
+
}
|
|
443
|
+
const accessTokenResult = await getAccessToken(context);
|
|
444
|
+
if (typeof accessTokenResult === 'object' && 'content' in accessTokenResult) {
|
|
445
|
+
return accessTokenResult;
|
|
446
|
+
}
|
|
447
|
+
const accessToken = accessTokenResult;
|
|
448
|
+
const calendarId = await resolveCalendarId(p.calendar_id, larkClient, accessToken);
|
|
449
|
+
log.info(`delete: calendar_id=${calendarId}, event_id=${p.event_id}, notify=${p.need_notification ?? true}`);
|
|
450
|
+
const Lark = await import('@larksuiteoapi/node-sdk');
|
|
451
|
+
const opts = Lark.withUserAccessToken(accessToken);
|
|
452
|
+
const res = await larkClient.sdk.calendar.calendarEvent.delete({
|
|
453
|
+
path: { calendar_id: calendarId, event_id: p.event_id },
|
|
454
|
+
params: {
|
|
455
|
+
need_notification: p.need_notification === false ? 'false' : 'true',
|
|
456
|
+
},
|
|
457
|
+
}, opts);
|
|
458
|
+
assertLarkOk(res);
|
|
459
|
+
log.info(`delete: deleted event ${p.event_id}`);
|
|
460
|
+
return json({
|
|
461
|
+
success: true,
|
|
462
|
+
event_id: p.event_id,
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
//# sourceMappingURL=event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.js","sourceRoot":"","sources":["../../../src/tools/calendar/event.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* Calendar Tools Index
|
|
6
|
+
*
|
|
7
|
+
* Calendar tools for Feishu/Lark.
|
|
8
|
+
* Adapted from openclaw-lark for MCP Server architecture.
|
|
9
|
+
*
|
|
10
|
+
* Tools:
|
|
11
|
+
* - feishu_calendar: Manage calendars (list, get, primary)
|
|
12
|
+
* - feishu_calendar_event: Manage calendar events
|
|
13
|
+
*/
|
|
14
|
+
import type { ToolRegistry } from '../index.js';
|
|
15
|
+
/**
|
|
16
|
+
* Register all Calendar tools with the given registry.
|
|
17
|
+
*/
|
|
18
|
+
export declare function registerCalendarTools(registry: ToolRegistry): void;
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/calendar/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAOhD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAgBlE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* Calendar Tools Index
|
|
6
|
+
*
|
|
7
|
+
* Calendar tools for Feishu/Lark.
|
|
8
|
+
* Adapted from openclaw-lark for MCP Server architecture.
|
|
9
|
+
*
|
|
10
|
+
* Tools:
|
|
11
|
+
* - feishu_calendar: Manage calendars (list, get, primary)
|
|
12
|
+
* - feishu_calendar_event: Manage calendar events
|
|
13
|
+
*/
|
|
14
|
+
import { registerCalendarTool } from './calendar.js';
|
|
15
|
+
import { registerCalendarEventTool } from './event.js';
|
|
16
|
+
import { logger } from '../../utils/logger.js';
|
|
17
|
+
const log = logger('tools:calendar');
|
|
18
|
+
/**
|
|
19
|
+
* Register all Calendar tools with the given registry.
|
|
20
|
+
*/
|
|
21
|
+
export function registerCalendarTools(registry) {
|
|
22
|
+
registerCalendarTool(registry);
|
|
23
|
+
registerCalendarEventTool(registry);
|
|
24
|
+
log.info('Calendar tools registered', {
|
|
25
|
+
tools: [
|
|
26
|
+
'feishu_calendar_list',
|
|
27
|
+
'feishu_calendar_get',
|
|
28
|
+
'feishu_calendar_primary',
|
|
29
|
+
'feishu_calendar_event_create',
|
|
30
|
+
'feishu_calendar_event_list',
|
|
31
|
+
'feishu_calendar_event_get',
|
|
32
|
+
'feishu_calendar_event_patch',
|
|
33
|
+
'feishu_calendar_event_delete',
|
|
34
|
+
].join(', '),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/calendar/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,MAAM,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAErC;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAsB;IAC1D,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC/B,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IAEpC,GAAG,CAAC,IAAI,CAAC,2BAA2B,EAAE;QACpC,KAAK,EAAE;YACL,sBAAsB;YACtB,qBAAqB;YACrB,yBAAyB;YACzB,8BAA8B;YAC9B,4BAA4B;YAC5B,2BAA2B;YAC3B,6BAA6B;YAC7B,8BAA8B;SAC/B,CAAC,IAAI,CAAC,IAAI,CAAC;KACb,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* feishu_chat tool - Manage Feishu chats/groups.
|
|
6
|
+
*
|
|
7
|
+
* Actions: search, get
|
|
8
|
+
*/
|
|
9
|
+
import type { ToolRegistry } from '../index.js';
|
|
10
|
+
export declare function registerChatTool(registry: ToolRegistry): void;
|
|
11
|
+
//# sourceMappingURL=chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../src/tools/chat/chat.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAyChD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CA2E7D"}
|