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,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* feishu_wiki_node tool - Manage Feishu Wiki nodes.
|
|
6
|
+
*
|
|
7
|
+
* Actions: list, 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:wiki:node');
|
|
15
|
+
// Schemas
|
|
16
|
+
const listActionSchema = {
|
|
17
|
+
action: z.literal('list').describe('List wiki nodes in a space'),
|
|
18
|
+
space_id: z.string().describe('Space ID'),
|
|
19
|
+
parent_node_token: z.string().optional().describe('Parent node token (optional, for listing sub-nodes)'),
|
|
20
|
+
page_size: z.number().min(1).max(50).optional().describe('Page size (default 50)'),
|
|
21
|
+
page_token: z.string().optional().describe('Pagination token'),
|
|
22
|
+
};
|
|
23
|
+
const getActionSchema = {
|
|
24
|
+
action: z.literal('get').describe('Get a wiki node'),
|
|
25
|
+
token: z.string().describe('Node token'),
|
|
26
|
+
};
|
|
27
|
+
async function getAccessToken(context) {
|
|
28
|
+
const { larkClient, config } = context;
|
|
29
|
+
if (!larkClient)
|
|
30
|
+
return jsonError('LarkClient not initialized.');
|
|
31
|
+
const { appId, appSecret, brand } = config;
|
|
32
|
+
if (!appId || !appSecret)
|
|
33
|
+
return jsonError('Missing FEISHU_APP_ID or FEISHU_APP_SECRET.');
|
|
34
|
+
const { listStoredTokens } = await import('../../core/token-store.js');
|
|
35
|
+
const tokens = await listStoredTokens(appId);
|
|
36
|
+
if (tokens.length === 0)
|
|
37
|
+
return jsonError('No user authorization found.');
|
|
38
|
+
const userOpenId = tokens[0].userOpenId;
|
|
39
|
+
try {
|
|
40
|
+
return await getValidAccessToken({ userOpenId, appId, appSecret, domain: brand ?? 'feishu' });
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
if (err instanceof NeedAuthorizationError)
|
|
44
|
+
return jsonError('User authorization expired.');
|
|
45
|
+
throw err;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export function registerWikiNodeTool(registry) {
|
|
49
|
+
registry.register({
|
|
50
|
+
name: 'feishu_wiki_node_list',
|
|
51
|
+
description: 'List Feishu wiki nodes in a space.\n\nRequires OAuth authorization.',
|
|
52
|
+
inputSchema: listActionSchema,
|
|
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(`list: space_id=${p.space_id}, parent=${p.parent_node_token ?? 'root'}`);
|
|
61
|
+
const Lark = await import('@larksuiteoapi/node-sdk');
|
|
62
|
+
const opts = Lark.withUserAccessToken(accessToken);
|
|
63
|
+
const res = await larkClient.sdk.wiki.spaceNode.list({
|
|
64
|
+
path: { space_id: p.space_id },
|
|
65
|
+
params: {
|
|
66
|
+
parent_node_token: p.parent_node_token,
|
|
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
|
+
nodes: data?.items,
|
|
76
|
+
has_more: data?.has_more,
|
|
77
|
+
page_token: data?.page_token,
|
|
78
|
+
});
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
registry.register({
|
|
82
|
+
name: 'feishu_wiki_node_get',
|
|
83
|
+
description: 'Get a Feishu wiki node by token.\n\nRequires OAuth authorization.',
|
|
84
|
+
inputSchema: getActionSchema,
|
|
85
|
+
handler: async (args, context) => {
|
|
86
|
+
const p = args;
|
|
87
|
+
const { larkClient } = context;
|
|
88
|
+
const tokenResult = await getAccessToken(context);
|
|
89
|
+
if (typeof tokenResult === 'object' && 'content' in tokenResult)
|
|
90
|
+
return tokenResult;
|
|
91
|
+
const accessToken = tokenResult;
|
|
92
|
+
log.info(`get: token=${p.token}`);
|
|
93
|
+
const Lark = await import('@larksuiteoapi/node-sdk');
|
|
94
|
+
const opts = Lark.withUserAccessToken(accessToken);
|
|
95
|
+
// Use direct request since SDK doesn't have a get method for node
|
|
96
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
97
|
+
const res = await larkClient.sdk.request({
|
|
98
|
+
method: 'GET',
|
|
99
|
+
url: `/open-apis/wiki/v2/spaces/get_node?token=${p.token}`,
|
|
100
|
+
}, opts);
|
|
101
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
102
|
+
if (res.code !== undefined && res.code !== 0) {
|
|
103
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
104
|
+
return jsonError(`API Error: code=${res.code}, msg=${res.msg}`);
|
|
105
|
+
}
|
|
106
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
107
|
+
return json({ node: res.data?.node });
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
log.debug('feishu_wiki_node tools registered');
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../../src/tools/wiki/node.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_wiki_space tool - Manage Feishu Wiki spaces.
|
|
6
|
+
*
|
|
7
|
+
* Actions: list, get, create
|
|
8
|
+
*/
|
|
9
|
+
import type { ToolRegistry } from '../index.js';
|
|
10
|
+
export declare function registerWikiSpaceTool(registry: ToolRegistry): void;
|
|
11
|
+
//# sourceMappingURL=space.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"space.d.ts","sourceRoot":"","sources":["../../../src/tools/wiki/space.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA8ChD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CA+FlE"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* feishu_wiki_space tool - Manage Feishu Wiki spaces.
|
|
6
|
+
*
|
|
7
|
+
* Actions: list, get, create
|
|
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:wiki:space');
|
|
15
|
+
// Schemas
|
|
16
|
+
const listActionSchema = {
|
|
17
|
+
action: z.literal('list').describe('List wiki spaces'),
|
|
18
|
+
page_size: z.number().min(1).max(50).optional().describe('Page size (default 10)'),
|
|
19
|
+
page_token: z.string().optional().describe('Pagination token'),
|
|
20
|
+
};
|
|
21
|
+
const getActionSchema = {
|
|
22
|
+
action: z.literal('get').describe('Get a wiki space'),
|
|
23
|
+
space_id: z.string().describe('Space ID'),
|
|
24
|
+
};
|
|
25
|
+
const createActionSchema = {
|
|
26
|
+
action: z.literal('create').describe('Create a wiki space'),
|
|
27
|
+
name: z.string().optional().describe('Space name'),
|
|
28
|
+
description: z.string().optional().describe('Space description'),
|
|
29
|
+
};
|
|
30
|
+
async function getAccessToken(context) {
|
|
31
|
+
const { larkClient, config } = context;
|
|
32
|
+
if (!larkClient)
|
|
33
|
+
return jsonError('LarkClient not initialized.');
|
|
34
|
+
const { appId, appSecret, brand } = config;
|
|
35
|
+
if (!appId || !appSecret)
|
|
36
|
+
return jsonError('Missing FEISHU_APP_ID or FEISHU_APP_SECRET.');
|
|
37
|
+
const { listStoredTokens } = await import('../../core/token-store.js');
|
|
38
|
+
const tokens = await listStoredTokens(appId);
|
|
39
|
+
if (tokens.length === 0)
|
|
40
|
+
return jsonError('No user authorization found.');
|
|
41
|
+
const userOpenId = tokens[0].userOpenId;
|
|
42
|
+
try {
|
|
43
|
+
return await getValidAccessToken({ userOpenId, appId, appSecret, domain: brand ?? 'feishu' });
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
if (err instanceof NeedAuthorizationError)
|
|
47
|
+
return jsonError('User authorization expired.');
|
|
48
|
+
throw err;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export function registerWikiSpaceTool(registry) {
|
|
52
|
+
registry.register({
|
|
53
|
+
name: 'feishu_wiki_space_list',
|
|
54
|
+
description: 'List Feishu wiki spaces.\n\nRequires OAuth authorization.',
|
|
55
|
+
inputSchema: listActionSchema,
|
|
56
|
+
handler: async (args, context) => {
|
|
57
|
+
const p = args;
|
|
58
|
+
const { larkClient } = context;
|
|
59
|
+
const tokenResult = await getAccessToken(context);
|
|
60
|
+
if (typeof tokenResult === 'object' && 'content' in tokenResult)
|
|
61
|
+
return tokenResult;
|
|
62
|
+
const accessToken = tokenResult;
|
|
63
|
+
log.info(`list: page_size=${p.page_size ?? 10}`);
|
|
64
|
+
const Lark = await import('@larksuiteoapi/node-sdk');
|
|
65
|
+
const opts = Lark.withUserAccessToken(accessToken);
|
|
66
|
+
const res = await larkClient.sdk.wiki.space.list({ params: { page_size: p.page_size, page_token: p.page_token } }, opts);
|
|
67
|
+
assertLarkOk(res);
|
|
68
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
69
|
+
const data = res.data;
|
|
70
|
+
return json({
|
|
71
|
+
spaces: data?.items,
|
|
72
|
+
has_more: data?.has_more,
|
|
73
|
+
page_token: data?.page_token,
|
|
74
|
+
});
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
registry.register({
|
|
78
|
+
name: 'feishu_wiki_space_get',
|
|
79
|
+
description: 'Get a Feishu wiki space by ID.\n\nRequires OAuth authorization.',
|
|
80
|
+
inputSchema: getActionSchema,
|
|
81
|
+
handler: async (args, context) => {
|
|
82
|
+
const p = args;
|
|
83
|
+
const { larkClient } = context;
|
|
84
|
+
const tokenResult = await getAccessToken(context);
|
|
85
|
+
if (typeof tokenResult === 'object' && 'content' in tokenResult)
|
|
86
|
+
return tokenResult;
|
|
87
|
+
const accessToken = tokenResult;
|
|
88
|
+
log.info(`get: space_id=${p.space_id}`);
|
|
89
|
+
const Lark = await import('@larksuiteoapi/node-sdk');
|
|
90
|
+
const opts = Lark.withUserAccessToken(accessToken);
|
|
91
|
+
const res = await larkClient.sdk.wiki.space.get({ path: { space_id: p.space_id } }, opts);
|
|
92
|
+
assertLarkOk(res);
|
|
93
|
+
return json({ space: res.data?.space });
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
registry.register({
|
|
97
|
+
name: 'feishu_wiki_space_create',
|
|
98
|
+
description: 'Create a Feishu wiki space.\n\nRequires OAuth authorization.',
|
|
99
|
+
inputSchema: createActionSchema,
|
|
100
|
+
handler: async (args, context) => {
|
|
101
|
+
const p = args;
|
|
102
|
+
const { larkClient } = context;
|
|
103
|
+
const tokenResult = await getAccessToken(context);
|
|
104
|
+
if (typeof tokenResult === 'object' && 'content' in tokenResult)
|
|
105
|
+
return tokenResult;
|
|
106
|
+
const accessToken = tokenResult;
|
|
107
|
+
log.info(`create: name=${p.name ?? '(empty)'}`);
|
|
108
|
+
const Lark = await import('@larksuiteoapi/node-sdk');
|
|
109
|
+
const opts = Lark.withUserAccessToken(accessToken);
|
|
110
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
111
|
+
const data = {};
|
|
112
|
+
if (p.name)
|
|
113
|
+
data.name = p.name;
|
|
114
|
+
if (p.description)
|
|
115
|
+
data.description = p.description;
|
|
116
|
+
const res = await larkClient.sdk.wiki.space.create({ data }, opts);
|
|
117
|
+
assertLarkOk(res);
|
|
118
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
119
|
+
const spaceData = res.data?.space;
|
|
120
|
+
return json({ space: res.data?.space, space_id: spaceData?.space_id });
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
log.debug('feishu_wiki_space tools registered');
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=space.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"space.js","sourceRoot":"","sources":["../../../src/tools/wiki/space.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* Simple logger utility for the cc-lark MCP Server.
|
|
6
|
+
*
|
|
7
|
+
* Provides prefixed logging with ANSI color support for console output.
|
|
8
|
+
* Adapted from openclaw-lark lark-logger for MCP Server architecture.
|
|
9
|
+
*/
|
|
10
|
+
export interface Logger {
|
|
11
|
+
readonly subsystem: string;
|
|
12
|
+
debug(message: string, meta?: Record<string, unknown>): void;
|
|
13
|
+
info(message: string, meta?: Record<string, unknown>): void;
|
|
14
|
+
warn(message: string, meta?: Record<string, unknown>): void;
|
|
15
|
+
error(message: string, meta?: Record<string, unknown>): void;
|
|
16
|
+
child(name: string): Logger;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Create a logger for a subsystem.
|
|
20
|
+
*
|
|
21
|
+
* @param subsystem - Name of the subsystem (e.g., "api", "tools", "config")
|
|
22
|
+
* @returns Logger instance
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* const log = logger("api");
|
|
27
|
+
* log.info("Request started", { method: "GET", path: "/users" });
|
|
28
|
+
* log.error("Request failed", { error: "Connection timeout" });
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare function logger(subsystem: string): Logger;
|
|
32
|
+
/**
|
|
33
|
+
* Default logger instance for general use.
|
|
34
|
+
*/
|
|
35
|
+
export declare const defaultLogger: Logger;
|
|
36
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC7D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC7D,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7B;AA0FD;;;;;;;;;;;;GAYG;AACH,wBAAgB,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,QAAiB,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*
|
|
5
|
+
* Simple logger utility for the cc-lark MCP Server.
|
|
6
|
+
*
|
|
7
|
+
* Provides prefixed logging with ANSI color support for console output.
|
|
8
|
+
* Adapted from openclaw-lark lark-logger for MCP Server architecture.
|
|
9
|
+
*/
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// ANSI colors
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
const CYAN = '\x1b[36m';
|
|
14
|
+
const YELLOW = '\x1b[33m';
|
|
15
|
+
const RED = '\x1b[31m';
|
|
16
|
+
const GRAY = '\x1b[90m';
|
|
17
|
+
const RESET = '\x1b[0m';
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Message formatting
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
/**
|
|
22
|
+
* Format a log message with optional metadata.
|
|
23
|
+
*
|
|
24
|
+
* @param prefix - Log prefix (subsystem tag)
|
|
25
|
+
* @param message - Log message
|
|
26
|
+
* @param meta - Optional metadata to include
|
|
27
|
+
* @returns Formatted message string
|
|
28
|
+
*/
|
|
29
|
+
function formatMessage(prefix, message, meta) {
|
|
30
|
+
if (!meta || Object.keys(meta).length === 0) {
|
|
31
|
+
return `${prefix} ${message}`;
|
|
32
|
+
}
|
|
33
|
+
const parts = Object.entries(meta)
|
|
34
|
+
.map(([k, v]) => {
|
|
35
|
+
if (v === undefined || v === null)
|
|
36
|
+
return null;
|
|
37
|
+
if (typeof v === 'object')
|
|
38
|
+
return `${k}=${JSON.stringify(v)}`;
|
|
39
|
+
return `${k}=${v}`;
|
|
40
|
+
})
|
|
41
|
+
.filter(Boolean);
|
|
42
|
+
return parts.length > 0 ? `${prefix} ${message} (${parts.join(', ')})` : `${prefix} ${message}`;
|
|
43
|
+
}
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// Logger implementation
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
/**
|
|
48
|
+
* Create a new logger instance.
|
|
49
|
+
*
|
|
50
|
+
* @param subsystem - Subsystem name for log prefix
|
|
51
|
+
* @returns Logger instance
|
|
52
|
+
*/
|
|
53
|
+
function createLogger(subsystem) {
|
|
54
|
+
const tag = `cc-lark/${subsystem}`;
|
|
55
|
+
return {
|
|
56
|
+
subsystem,
|
|
57
|
+
debug(message, meta) {
|
|
58
|
+
const formatted = formatMessage(tag, message, meta);
|
|
59
|
+
console.debug(`${GRAY}[DEBUG]${RESET}`, formatted);
|
|
60
|
+
},
|
|
61
|
+
info(message, meta) {
|
|
62
|
+
const formatted = formatMessage(tag, message, meta);
|
|
63
|
+
console.log(`${CYAN}[INFO]${RESET}`, formatted);
|
|
64
|
+
},
|
|
65
|
+
warn(message, meta) {
|
|
66
|
+
const formatted = formatMessage(tag, message, meta);
|
|
67
|
+
console.warn(`${YELLOW}[WARN]${RESET}`, formatted);
|
|
68
|
+
},
|
|
69
|
+
error(message, meta) {
|
|
70
|
+
const formatted = formatMessage(tag, message, meta);
|
|
71
|
+
console.error(`${RED}[ERROR]${RESET}`, formatted);
|
|
72
|
+
},
|
|
73
|
+
child(name) {
|
|
74
|
+
return createLogger(`${subsystem}/${name}`);
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
// Public factory
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
/**
|
|
82
|
+
* Create a logger for a subsystem.
|
|
83
|
+
*
|
|
84
|
+
* @param subsystem - Name of the subsystem (e.g., "api", "tools", "config")
|
|
85
|
+
* @returns Logger instance
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```typescript
|
|
89
|
+
* const log = logger("api");
|
|
90
|
+
* log.info("Request started", { method: "GET", path: "/users" });
|
|
91
|
+
* log.error("Request failed", { error: "Connection timeout" });
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
export function logger(subsystem) {
|
|
95
|
+
return createLogger(subsystem);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Default logger instance for general use.
|
|
99
|
+
*/
|
|
100
|
+
export const defaultLogger = logger('core');
|
|
101
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
package/eslint.config.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import eslint from "@eslint/js";
|
|
2
|
+
import tseslint from "typescript-eslint";
|
|
3
|
+
|
|
4
|
+
export default tseslint.config(
|
|
5
|
+
eslint.configs.recommended,
|
|
6
|
+
...tseslint.configs.recommended,
|
|
7
|
+
{
|
|
8
|
+
rules: {
|
|
9
|
+
"@typescript-eslint/no-unused-vars": ["error", { argsIgnorePattern: "^_" }],
|
|
10
|
+
"@typescript-eslint/explicit-function-return-type": "off"
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
);
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "cc-lark",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Feishu/Lark MCP Server for Claude Code",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"cc-lark": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "git+https://github.com/yes8080/cc-lark.git"
|
|
13
|
+
},
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/yes8080/cc-lark/issues"
|
|
16
|
+
},
|
|
17
|
+
"homepage": "https://github.com/yes8080/cc-lark#readme",
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc",
|
|
20
|
+
"start": "node dist/index.js",
|
|
21
|
+
"dev": "tsc --watch",
|
|
22
|
+
"test": "vitest run",
|
|
23
|
+
"test:watch": "vitest",
|
|
24
|
+
"lint": "eslint src/",
|
|
25
|
+
"lint:fix": "eslint src/ --fix",
|
|
26
|
+
"format": "prettier --write \"src/**/*.ts\"",
|
|
27
|
+
"format:check": "prettier --check \"src/**/*.ts\""
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@larksuiteoapi/node-sdk": "^1.59.0",
|
|
31
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
32
|
+
"zod": "^3.23.8"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@types/node": "^22.0.0",
|
|
36
|
+
"@typescript-eslint/eslint-plugin": "^8.0.0",
|
|
37
|
+
"@typescript-eslint/parser": "^8.0.0",
|
|
38
|
+
"eslint": "^9.0.0",
|
|
39
|
+
"prettier": "^3.0.0",
|
|
40
|
+
"typescript": "^5.9.3",
|
|
41
|
+
"typescript-eslint": "^8.57.0",
|
|
42
|
+
"vitest": "^2.0.0"
|
|
43
|
+
},
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=22.0.0"
|
|
46
|
+
},
|
|
47
|
+
"keywords": [
|
|
48
|
+
"feishu",
|
|
49
|
+
"lark",
|
|
50
|
+
"mcp",
|
|
51
|
+
"claude-code"
|
|
52
|
+
],
|
|
53
|
+
"license": "MIT"
|
|
54
|
+
}
|