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,106 @@
|
|
|
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 { z } from 'zod';
|
|
10
|
+
import { getValidAccessToken, NeedAuthorizationError } from '../../core/uat-client.js';
|
|
11
|
+
import { assertLarkOk } from '../../core/api-error.js';
|
|
12
|
+
import { json, jsonError } from '../im/helpers.js';
|
|
13
|
+
import { logger } from '../../utils/logger.js';
|
|
14
|
+
const log = logger('tools:chat:chat');
|
|
15
|
+
// Schemas
|
|
16
|
+
const searchActionSchema = {
|
|
17
|
+
action: z.literal('search').describe('Search for chats'),
|
|
18
|
+
query: z.string().describe('Search query (matches group name or member name)'),
|
|
19
|
+
page_size: z.number().min(1).optional().describe('Page size (default 20)'),
|
|
20
|
+
page_token: z.string().optional().describe('Pagination token'),
|
|
21
|
+
};
|
|
22
|
+
const getActionSchema = {
|
|
23
|
+
action: z.literal('get').describe('Get chat info'),
|
|
24
|
+
chat_id: z.string().describe('Chat ID (format: oc_xxx)'),
|
|
25
|
+
};
|
|
26
|
+
async function getAccessToken(context) {
|
|
27
|
+
const { larkClient, config } = context;
|
|
28
|
+
if (!larkClient)
|
|
29
|
+
return jsonError('LarkClient not initialized.');
|
|
30
|
+
const { appId, appSecret, brand } = config;
|
|
31
|
+
if (!appId || !appSecret)
|
|
32
|
+
return jsonError('Missing FEISHU_APP_ID or FEISHU_APP_SECRET.');
|
|
33
|
+
const { listStoredTokens } = await import('../../core/token-store.js');
|
|
34
|
+
const tokens = await listStoredTokens(appId);
|
|
35
|
+
if (tokens.length === 0)
|
|
36
|
+
return jsonError('No user authorization found.');
|
|
37
|
+
const userOpenId = tokens[0].userOpenId;
|
|
38
|
+
try {
|
|
39
|
+
return await getValidAccessToken({ userOpenId, appId, appSecret, domain: brand ?? 'feishu' });
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
if (err instanceof NeedAuthorizationError)
|
|
43
|
+
return jsonError('User authorization expired.');
|
|
44
|
+
throw err;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export function registerChatTool(registry) {
|
|
48
|
+
// Search chats
|
|
49
|
+
registry.register({
|
|
50
|
+
name: 'feishu_chat_search',
|
|
51
|
+
description: 'Search for Feishu chats by name or member.\n\nRequires OAuth authorization.',
|
|
52
|
+
inputSchema: searchActionSchema,
|
|
53
|
+
handler: async (args, context) => {
|
|
54
|
+
const p = args;
|
|
55
|
+
const { larkClient } = context;
|
|
56
|
+
const tokenResult = await getAccessToken(context);
|
|
57
|
+
if (typeof tokenResult === 'object' && 'content' in tokenResult)
|
|
58
|
+
return tokenResult;
|
|
59
|
+
const accessToken = tokenResult;
|
|
60
|
+
log.info(`search: query="${p.query}", page_size=${p.page_size ?? 20}`);
|
|
61
|
+
const Lark = await import('@larksuiteoapi/node-sdk');
|
|
62
|
+
const opts = Lark.withUserAccessToken(accessToken);
|
|
63
|
+
const res = await larkClient.sdk.im.v1.chat.search({
|
|
64
|
+
params: {
|
|
65
|
+
user_id_type: 'open_id',
|
|
66
|
+
query: p.query,
|
|
67
|
+
page_size: p.page_size,
|
|
68
|
+
page_token: p.page_token,
|
|
69
|
+
},
|
|
70
|
+
}, opts);
|
|
71
|
+
assertLarkOk(res);
|
|
72
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
73
|
+
const data = res.data;
|
|
74
|
+
return json({
|
|
75
|
+
items: data?.items,
|
|
76
|
+
has_more: data?.has_more ?? false,
|
|
77
|
+
page_token: data?.page_token,
|
|
78
|
+
});
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
// Get chat info
|
|
82
|
+
registry.register({
|
|
83
|
+
name: 'feishu_chat_get',
|
|
84
|
+
description: 'Get Feishu chat info by ID.\n\nRequires OAuth authorization.',
|
|
85
|
+
inputSchema: getActionSchema,
|
|
86
|
+
handler: async (args, context) => {
|
|
87
|
+
const p = args;
|
|
88
|
+
const { larkClient } = context;
|
|
89
|
+
const tokenResult = await getAccessToken(context);
|
|
90
|
+
if (typeof tokenResult === 'object' && 'content' in tokenResult)
|
|
91
|
+
return tokenResult;
|
|
92
|
+
const accessToken = tokenResult;
|
|
93
|
+
log.info(`get: chat_id=${p.chat_id}`);
|
|
94
|
+
const Lark = await import('@larksuiteoapi/node-sdk');
|
|
95
|
+
const opts = Lark.withUserAccessToken(accessToken);
|
|
96
|
+
const res = await larkClient.sdk.im.v1.chat.get({
|
|
97
|
+
path: { chat_id: p.chat_id },
|
|
98
|
+
params: { user_id_type: 'open_id' },
|
|
99
|
+
}, opts);
|
|
100
|
+
assertLarkOk(res);
|
|
101
|
+
return json({ chat: res.data });
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
log.debug('feishu_chat tools registered');
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/tools/chat/chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* Chat Tools Index
|
|
6
|
+
*
|
|
7
|
+
* Chat/group management tools for Feishu/Lark.
|
|
8
|
+
*/
|
|
9
|
+
import type { ToolRegistry } from '../index.js';
|
|
10
|
+
export declare function registerChatTools(registry: ToolRegistry): void;
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/chat/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAOhD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAO9D"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* Chat Tools Index
|
|
6
|
+
*
|
|
7
|
+
* Chat/group management tools for Feishu/Lark.
|
|
8
|
+
*/
|
|
9
|
+
import { registerChatTool } from './chat.js';
|
|
10
|
+
import { registerChatMembersTool } from './members.js';
|
|
11
|
+
import { logger } from '../../utils/logger.js';
|
|
12
|
+
const log = logger('tools:chat');
|
|
13
|
+
export function registerChatTools(registry) {
|
|
14
|
+
registerChatTool(registry);
|
|
15
|
+
registerChatMembersTool(registry);
|
|
16
|
+
log.info('Chat tools registered', {
|
|
17
|
+
tools: ['feishu_chat_search', 'feishu_chat_get', 'feishu_chat_members'].join(', '),
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/chat/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AAEjC,MAAM,UAAU,iBAAiB,CAAC,QAAsB;IACtD,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC3B,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAElC,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAE;QAChC,KAAK,EAAE,CAAC,oBAAoB,EAAE,iBAAiB,EAAE,qBAAqB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;KACnF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* feishu_chat_members tool - Get chat members.
|
|
6
|
+
*/
|
|
7
|
+
import type { ToolRegistry } from '../index.js';
|
|
8
|
+
export declare function registerChatMembersTool(registry: ToolRegistry): void;
|
|
9
|
+
//# sourceMappingURL=members.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"members.d.ts","sourceRoot":"","sources":["../../../src/tools/chat/members.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAoChD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAgDpE"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* feishu_chat_members tool - Get chat members.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { getValidAccessToken, NeedAuthorizationError } from '../../core/uat-client.js';
|
|
9
|
+
import { assertLarkOk } from '../../core/api-error.js';
|
|
10
|
+
import { json, jsonError } from '../im/helpers.js';
|
|
11
|
+
import { logger } from '../../utils/logger.js';
|
|
12
|
+
const log = logger('tools:chat:members');
|
|
13
|
+
// Schemas
|
|
14
|
+
const membersActionSchema = {
|
|
15
|
+
chat_id: z.string().describe('Chat ID (format: oc_xxx)'),
|
|
16
|
+
member_id_type: z.enum(['open_id', 'union_id', 'user_id']).optional().describe('Member ID type (default: open_id)'),
|
|
17
|
+
page_size: z.number().min(1).optional().describe('Page size (default 20)'),
|
|
18
|
+
page_token: z.string().optional().describe('Pagination token'),
|
|
19
|
+
};
|
|
20
|
+
async function getAccessToken(context) {
|
|
21
|
+
const { larkClient, config } = context;
|
|
22
|
+
if (!larkClient)
|
|
23
|
+
return jsonError('LarkClient not initialized.');
|
|
24
|
+
const { appId, appSecret, brand } = config;
|
|
25
|
+
if (!appId || !appSecret)
|
|
26
|
+
return jsonError('Missing FEISHU_APP_ID or FEISHU_APP_SECRET.');
|
|
27
|
+
const { listStoredTokens } = await import('../../core/token-store.js');
|
|
28
|
+
const tokens = await listStoredTokens(appId);
|
|
29
|
+
if (tokens.length === 0)
|
|
30
|
+
return jsonError('No user authorization found.');
|
|
31
|
+
const userOpenId = tokens[0].userOpenId;
|
|
32
|
+
try {
|
|
33
|
+
return await getValidAccessToken({ userOpenId, appId, appSecret, domain: brand ?? 'feishu' });
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
if (err instanceof NeedAuthorizationError)
|
|
37
|
+
return jsonError('User authorization expired.');
|
|
38
|
+
throw err;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export function registerChatMembersTool(registry) {
|
|
42
|
+
registry.register({
|
|
43
|
+
name: 'feishu_chat_members',
|
|
44
|
+
description: 'Get members of a Feishu chat.\n\nRequires OAuth authorization.',
|
|
45
|
+
inputSchema: membersActionSchema,
|
|
46
|
+
handler: async (args, context) => {
|
|
47
|
+
const p = args;
|
|
48
|
+
const { larkClient } = context;
|
|
49
|
+
const tokenResult = await getAccessToken(context);
|
|
50
|
+
if (typeof tokenResult === 'object' && 'content' in tokenResult)
|
|
51
|
+
return tokenResult;
|
|
52
|
+
const accessToken = tokenResult;
|
|
53
|
+
log.info(`members: chat_id="${p.chat_id}", page_size=${p.page_size ?? 20}`);
|
|
54
|
+
const Lark = await import('@larksuiteoapi/node-sdk');
|
|
55
|
+
const opts = Lark.withUserAccessToken(accessToken);
|
|
56
|
+
const res = await larkClient.sdk.im.v1.chatMembers.get({
|
|
57
|
+
path: { chat_id: p.chat_id },
|
|
58
|
+
params: {
|
|
59
|
+
member_id_type: p.member_id_type || 'open_id',
|
|
60
|
+
page_size: p.page_size,
|
|
61
|
+
page_token: p.page_token,
|
|
62
|
+
},
|
|
63
|
+
}, opts);
|
|
64
|
+
assertLarkOk(res);
|
|
65
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
66
|
+
const data = res.data;
|
|
67
|
+
const memberCount = data?.items?.length ?? 0;
|
|
68
|
+
const memberTotal = data?.member_total ?? 0;
|
|
69
|
+
log.info(`members: found ${memberCount} members (total: ${memberTotal})`);
|
|
70
|
+
return json({
|
|
71
|
+
items: data?.items,
|
|
72
|
+
has_more: data?.has_more ?? false,
|
|
73
|
+
page_token: data?.page_token,
|
|
74
|
+
member_total: memberTotal,
|
|
75
|
+
});
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
log.debug('feishu_chat_members tool registered');
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=members.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"members.js","sourceRoot":"","sources":["../../../src/tools/chat/members.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* feishu_get_user tool - Get user information.
|
|
6
|
+
*
|
|
7
|
+
* Actions: get current user or get user by ID
|
|
8
|
+
*/
|
|
9
|
+
import type { ToolRegistry } from '../index.js';
|
|
10
|
+
export declare function registerGetUserTool(registry: ToolRegistry): void;
|
|
11
|
+
//# sourceMappingURL=get-user.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-user.d.ts","sourceRoot":"","sources":["../../../src/tools/common/get-user.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAiChD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAmFhE"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* feishu_get_user tool - Get user information.
|
|
6
|
+
*
|
|
7
|
+
* Actions: get current user or get user by ID
|
|
8
|
+
*/
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import { getValidAccessToken, NeedAuthorizationError } from '../../core/uat-client.js';
|
|
11
|
+
import { json, jsonError } from '../im/helpers.js';
|
|
12
|
+
import { logger } from '../../utils/logger.js';
|
|
13
|
+
const log = logger('tools:common:get-user');
|
|
14
|
+
// Schemas
|
|
15
|
+
const getUserSchema = {
|
|
16
|
+
user_id: z.string().optional().describe('User ID (format: ou_xxx). If not provided, returns current user info'),
|
|
17
|
+
user_id_type: z.enum(['open_id', 'union_id', 'user_id']).optional().describe('User ID type (default: open_id)'),
|
|
18
|
+
};
|
|
19
|
+
async function getAccessToken(context) {
|
|
20
|
+
const { larkClient, config } = context;
|
|
21
|
+
if (!larkClient)
|
|
22
|
+
return jsonError('LarkClient not initialized.');
|
|
23
|
+
const { appId, appSecret, brand } = config;
|
|
24
|
+
if (!appId || !appSecret)
|
|
25
|
+
return jsonError('Missing FEISHU_APP_ID or FEISHU_APP_SECRET.');
|
|
26
|
+
const { listStoredTokens } = await import('../../core/token-store.js');
|
|
27
|
+
const tokens = await listStoredTokens(appId);
|
|
28
|
+
if (tokens.length === 0)
|
|
29
|
+
return jsonError('No user authorization found.');
|
|
30
|
+
const userOpenId = tokens[0].userOpenId;
|
|
31
|
+
try {
|
|
32
|
+
return await getValidAccessToken({ userOpenId, appId, appSecret, domain: brand ?? 'feishu' });
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
if (err instanceof NeedAuthorizationError)
|
|
36
|
+
return jsonError('User authorization expired.');
|
|
37
|
+
throw err;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export function registerGetUserTool(registry) {
|
|
41
|
+
registry.register({
|
|
42
|
+
name: 'feishu_get_user',
|
|
43
|
+
description: 'Get Feishu user information. Returns current user if user_id not provided.\n\nRequires OAuth authorization.',
|
|
44
|
+
inputSchema: getUserSchema,
|
|
45
|
+
handler: async (args, context) => {
|
|
46
|
+
const p = args;
|
|
47
|
+
const { larkClient } = context;
|
|
48
|
+
const tokenResult = await getAccessToken(context);
|
|
49
|
+
if (typeof tokenResult === 'object' && 'content' in tokenResult)
|
|
50
|
+
return tokenResult;
|
|
51
|
+
const accessToken = tokenResult;
|
|
52
|
+
const Lark = await import('@larksuiteoapi/node-sdk');
|
|
53
|
+
const opts = Lark.withUserAccessToken(accessToken);
|
|
54
|
+
// If no user_id provided, get current user info
|
|
55
|
+
if (!p.user_id) {
|
|
56
|
+
log.info('get_user: fetching current user info');
|
|
57
|
+
try {
|
|
58
|
+
const res = await larkClient.sdk.authen.userInfo.get({}, opts);
|
|
59
|
+
// Check for API error
|
|
60
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
61
|
+
if (res.code !== undefined && res.code !== 0) {
|
|
62
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
63
|
+
const e = res;
|
|
64
|
+
if (e.code === 41050) {
|
|
65
|
+
return jsonError('Permission denied. User visibility scope limits access to this user.');
|
|
66
|
+
}
|
|
67
|
+
return jsonError(`API Error: code=${e.code}, msg=${e.msg}`);
|
|
68
|
+
}
|
|
69
|
+
log.info('get_user: current user fetched successfully');
|
|
70
|
+
return json({ user: res.data });
|
|
71
|
+
}
|
|
72
|
+
catch (invokeErr) {
|
|
73
|
+
// Handle 41050 error
|
|
74
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
75
|
+
if (invokeErr && typeof invokeErr === 'object' && invokeErr.response?.data?.code === 41050) {
|
|
76
|
+
return jsonError('Permission denied. User visibility scope limits access to this user.');
|
|
77
|
+
}
|
|
78
|
+
throw invokeErr;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Get specific user info
|
|
82
|
+
log.info(`get_user: fetching user ${p.user_id}`);
|
|
83
|
+
const userIdType = p.user_id_type || 'open_id';
|
|
84
|
+
try {
|
|
85
|
+
const res = await larkClient.sdk.contact.v3.user.get({
|
|
86
|
+
path: { user_id: p.user_id },
|
|
87
|
+
params: { user_id_type: userIdType },
|
|
88
|
+
}, opts);
|
|
89
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
90
|
+
if (res.code !== undefined && res.code !== 0) {
|
|
91
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
92
|
+
const e = res;
|
|
93
|
+
if (e.code === 41050) {
|
|
94
|
+
return jsonError('Permission denied. User visibility scope limits access to this user.');
|
|
95
|
+
}
|
|
96
|
+
return jsonError(`API Error: code=${e.code}, msg=${e.msg}`);
|
|
97
|
+
}
|
|
98
|
+
log.info(`get_user: user ${p.user_id} fetched successfully`);
|
|
99
|
+
return json({ user: res.data?.user });
|
|
100
|
+
}
|
|
101
|
+
catch (invokeErr) {
|
|
102
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
103
|
+
if (invokeErr && typeof invokeErr === 'object' && invokeErr.response?.data?.code === 41050) {
|
|
104
|
+
return jsonError('Permission denied. User visibility scope limits access to this user.');
|
|
105
|
+
}
|
|
106
|
+
throw invokeErr;
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
log.debug('feishu_get_user tool registered');
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=get-user.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-user.js","sourceRoot":"","sources":["../../../src/tools/common/get-user.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* Common Tools Index
|
|
6
|
+
*
|
|
7
|
+
* User-related tools for Feishu/Lark.
|
|
8
|
+
*/
|
|
9
|
+
import type { ToolRegistry } from '../index.js';
|
|
10
|
+
export declare function registerCommonTools(registry: ToolRegistry): void;
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/common/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAOhD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAOhE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* Common Tools Index
|
|
6
|
+
*
|
|
7
|
+
* User-related tools for Feishu/Lark.
|
|
8
|
+
*/
|
|
9
|
+
import { registerGetUserTool } from './get-user.js';
|
|
10
|
+
import { registerSearchUserTool } from './search-user.js';
|
|
11
|
+
import { logger } from '../../utils/logger.js';
|
|
12
|
+
const log = logger('tools:common');
|
|
13
|
+
export function registerCommonTools(registry) {
|
|
14
|
+
registerGetUserTool(registry);
|
|
15
|
+
registerSearchUserTool(registry);
|
|
16
|
+
log.info('Common tools registered', {
|
|
17
|
+
tools: ['feishu_get_user', 'feishu_search_user'].join(', '),
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/common/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AAEnC,MAAM,UAAU,mBAAmB,CAAC,QAAsB;IACxD,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC9B,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAEjC,GAAG,CAAC,IAAI,CAAC,yBAAyB,EAAE;QAClC,KAAK,EAAE,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;KAC5D,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* feishu_search_user tool - Search for users.
|
|
6
|
+
*/
|
|
7
|
+
import type { ToolRegistry } from '../index.js';
|
|
8
|
+
export declare function registerSearchUserTool(registry: ToolRegistry): void;
|
|
9
|
+
//# sourceMappingURL=search-user.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-user.d.ts","sourceRoot":"","sources":["../../../src/tools/common/search-user.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAkChD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAwDnE"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* feishu_search_user tool - Search for users.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { getValidAccessToken, NeedAuthorizationError } from '../../core/uat-client.js';
|
|
9
|
+
import { json, jsonError } from '../im/helpers.js';
|
|
10
|
+
import { logger } from '../../utils/logger.js';
|
|
11
|
+
const log = logger('tools:common:search-user');
|
|
12
|
+
// Schemas
|
|
13
|
+
const searchUserSchema = {
|
|
14
|
+
query: z.string().describe('Search query (matches user name, phone, email)'),
|
|
15
|
+
page_size: z.number().min(1).max(200).optional().describe('Page size (default 20)'),
|
|
16
|
+
page_token: z.string().optional().describe('Pagination token'),
|
|
17
|
+
};
|
|
18
|
+
async function getAccessToken(context) {
|
|
19
|
+
const { larkClient, config } = context;
|
|
20
|
+
if (!larkClient)
|
|
21
|
+
return jsonError('LarkClient not initialized.');
|
|
22
|
+
const { appId, appSecret, brand } = config;
|
|
23
|
+
if (!appId || !appSecret)
|
|
24
|
+
return jsonError('Missing FEISHU_APP_ID or FEISHU_APP_SECRET.');
|
|
25
|
+
const { listStoredTokens } = await import('../../core/token-store.js');
|
|
26
|
+
const tokens = await listStoredTokens(appId);
|
|
27
|
+
if (tokens.length === 0)
|
|
28
|
+
return jsonError('No user authorization found.');
|
|
29
|
+
const userOpenId = tokens[0].userOpenId;
|
|
30
|
+
try {
|
|
31
|
+
return await getValidAccessToken({ userOpenId, appId, appSecret, domain: brand ?? 'feishu' });
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
if (err instanceof NeedAuthorizationError)
|
|
35
|
+
return jsonError('User authorization expired.');
|
|
36
|
+
throw err;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export function registerSearchUserTool(registry) {
|
|
40
|
+
registry.register({
|
|
41
|
+
name: 'feishu_search_user',
|
|
42
|
+
description: 'Search for Feishu users by name, phone, or email.\n\nRequires OAuth authorization.',
|
|
43
|
+
inputSchema: searchUserSchema,
|
|
44
|
+
handler: async (args, context) => {
|
|
45
|
+
const p = args;
|
|
46
|
+
const { larkClient } = context;
|
|
47
|
+
const tokenResult = await getAccessToken(context);
|
|
48
|
+
if (typeof tokenResult === 'object' && 'content' in tokenResult)
|
|
49
|
+
return tokenResult;
|
|
50
|
+
const accessToken = tokenResult;
|
|
51
|
+
log.info(`search_user: query="${p.query}", page_size=${p.page_size ?? 20}`);
|
|
52
|
+
const Lark = await import('@larksuiteoapi/node-sdk');
|
|
53
|
+
const opts = Lark.withUserAccessToken(accessToken);
|
|
54
|
+
// Build query parameters
|
|
55
|
+
const queryParams = {
|
|
56
|
+
query: p.query,
|
|
57
|
+
page_size: String(p.page_size ?? 20),
|
|
58
|
+
};
|
|
59
|
+
if (p.page_token)
|
|
60
|
+
queryParams.page_token = p.page_token;
|
|
61
|
+
// Use direct request since SDK search API may not be fully typed
|
|
62
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
63
|
+
const res = await larkClient.sdk.request({
|
|
64
|
+
method: 'GET',
|
|
65
|
+
url: '/open-apis/search/v1/user',
|
|
66
|
+
params: queryParams,
|
|
67
|
+
headers: { Authorization: `Bearer ${accessToken}` },
|
|
68
|
+
}, opts);
|
|
69
|
+
// Check for API error
|
|
70
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
71
|
+
if (res.code !== undefined && res.code !== 0) {
|
|
72
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
73
|
+
return jsonError(`API Error: code=${res.code}, msg=${res.msg}`);
|
|
74
|
+
}
|
|
75
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
76
|
+
const data = res.data;
|
|
77
|
+
const users = data?.users ?? [];
|
|
78
|
+
log.info(`search_user: found ${users.length} users`);
|
|
79
|
+
return json({
|
|
80
|
+
users,
|
|
81
|
+
has_more: data?.has_more ?? false,
|
|
82
|
+
page_token: data?.page_token,
|
|
83
|
+
});
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
log.debug('feishu_search_user tool registered');
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=search-user.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-user.js","sourceRoot":"","sources":["../../../src/tools/common/search-user.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* feishu_create_doc tool - Create a new docx document from Markdown.
|
|
6
|
+
*
|
|
7
|
+
* Creates a new Feishu document from Markdown content.
|
|
8
|
+
* Supports async task status checking via task_id.
|
|
9
|
+
*
|
|
10
|
+
* Adapted from openclaw-lark for MCP Server architecture.
|
|
11
|
+
*/
|
|
12
|
+
import type { ToolRegistry } from '../index.js';
|
|
13
|
+
/**
|
|
14
|
+
* Register the feishu_create_doc tool.
|
|
15
|
+
*/
|
|
16
|
+
export declare function registerCreateDocTool(registry: ToolRegistry): void;
|
|
17
|
+
//# sourceMappingURL=create.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/tools/doc/create.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAmDhD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAgClE"}
|