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.
Files changed (298) hide show
  1. package/.github/workflows/ci.yml +47 -0
  2. package/.github/workflows/release.yml +47 -0
  3. package/.github/workflows/sync-upstream.yml +127 -0
  4. package/.prettierrc.json +7 -0
  5. package/README.md +214 -0
  6. package/dist/core/api-error.d.ts +193 -0
  7. package/dist/core/api-error.d.ts.map +1 -0
  8. package/dist/core/api-error.js +263 -0
  9. package/dist/core/api-error.js.map +1 -0
  10. package/dist/core/auth-errors.d.ts +13 -0
  11. package/dist/core/auth-errors.d.ts.map +1 -0
  12. package/dist/core/auth-errors.js +14 -0
  13. package/dist/core/auth-errors.js.map +1 -0
  14. package/dist/core/config.d.ts +60 -0
  15. package/dist/core/config.d.ts.map +1 -0
  16. package/dist/core/config.js +115 -0
  17. package/dist/core/config.js.map +1 -0
  18. package/dist/core/device-flow.d.ts +80 -0
  19. package/dist/core/device-flow.d.ts.map +1 -0
  20. package/dist/core/device-flow.js +231 -0
  21. package/dist/core/device-flow.js.map +1 -0
  22. package/dist/core/index.d.ts +16 -0
  23. package/dist/core/index.d.ts.map +1 -0
  24. package/dist/core/index.js +16 -0
  25. package/dist/core/index.js.map +1 -0
  26. package/dist/core/lark-client.d.ts +136 -0
  27. package/dist/core/lark-client.d.ts.map +1 -0
  28. package/dist/core/lark-client.js +315 -0
  29. package/dist/core/lark-client.js.map +1 -0
  30. package/dist/core/token-store.d.ts +67 -0
  31. package/dist/core/token-store.d.ts.map +1 -0
  32. package/dist/core/token-store.js +215 -0
  33. package/dist/core/token-store.js.map +1 -0
  34. package/dist/core/types.d.ts +286 -0
  35. package/dist/core/types.d.ts.map +1 -0
  36. package/dist/core/types.js +11 -0
  37. package/dist/core/types.js.map +1 -0
  38. package/dist/core/uat-client.d.ts +64 -0
  39. package/dist/core/uat-client.d.ts.map +1 -0
  40. package/dist/core/uat-client.js +227 -0
  41. package/dist/core/uat-client.js.map +1 -0
  42. package/dist/core/version.d.ts +26 -0
  43. package/dist/core/version.d.ts.map +1 -0
  44. package/dist/core/version.js +50 -0
  45. package/dist/core/version.js.map +1 -0
  46. package/dist/index.d.ts +12 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +116 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/tools/bitable/app.d.ts +20 -0
  51. package/dist/tools/bitable/app.d.ts.map +1 -0
  52. package/dist/tools/bitable/app.js +301 -0
  53. package/dist/tools/bitable/app.js.map +1 -0
  54. package/dist/tools/bitable/field.d.ts +19 -0
  55. package/dist/tools/bitable/field.d.ts.map +1 -0
  56. package/dist/tools/bitable/field.js +315 -0
  57. package/dist/tools/bitable/field.js.map +1 -0
  58. package/dist/tools/bitable/index.d.ts +21 -0
  59. package/dist/tools/bitable/index.d.ts.map +1 -0
  60. package/dist/tools/bitable/index.js +39 -0
  61. package/dist/tools/bitable/index.js.map +1 -0
  62. package/dist/tools/bitable/record.d.ts +22 -0
  63. package/dist/tools/bitable/record.d.ts.map +1 -0
  64. package/dist/tools/bitable/record.js +434 -0
  65. package/dist/tools/bitable/record.js.map +1 -0
  66. package/dist/tools/bitable/table.d.ts +21 -0
  67. package/dist/tools/bitable/table.d.ts.map +1 -0
  68. package/dist/tools/bitable/table.js +361 -0
  69. package/dist/tools/bitable/table.js.map +1 -0
  70. package/dist/tools/calendar/calendar.d.ts +18 -0
  71. package/dist/tools/calendar/calendar.d.ts.map +1 -0
  72. package/dist/tools/calendar/calendar.js +192 -0
  73. package/dist/tools/calendar/calendar.js.map +1 -0
  74. package/dist/tools/calendar/event.d.ts +20 -0
  75. package/dist/tools/calendar/event.d.ts.map +1 -0
  76. package/dist/tools/calendar/event.js +465 -0
  77. package/dist/tools/calendar/event.js.map +1 -0
  78. package/dist/tools/calendar/index.d.ts +19 -0
  79. package/dist/tools/calendar/index.d.ts.map +1 -0
  80. package/dist/tools/calendar/index.js +37 -0
  81. package/dist/tools/calendar/index.js.map +1 -0
  82. package/dist/tools/chat/chat.d.ts +11 -0
  83. package/dist/tools/chat/chat.d.ts.map +1 -0
  84. package/dist/tools/chat/chat.js +106 -0
  85. package/dist/tools/chat/chat.js.map +1 -0
  86. package/dist/tools/chat/index.d.ts +11 -0
  87. package/dist/tools/chat/index.d.ts.map +1 -0
  88. package/dist/tools/chat/index.js +20 -0
  89. package/dist/tools/chat/index.js.map +1 -0
  90. package/dist/tools/chat/members.d.ts +9 -0
  91. package/dist/tools/chat/members.d.ts.map +1 -0
  92. package/dist/tools/chat/members.js +80 -0
  93. package/dist/tools/chat/members.js.map +1 -0
  94. package/dist/tools/common/get-user.d.ts +11 -0
  95. package/dist/tools/common/get-user.d.ts.map +1 -0
  96. package/dist/tools/common/get-user.js +112 -0
  97. package/dist/tools/common/get-user.js.map +1 -0
  98. package/dist/tools/common/index.d.ts +11 -0
  99. package/dist/tools/common/index.d.ts.map +1 -0
  100. package/dist/tools/common/index.js +20 -0
  101. package/dist/tools/common/index.js.map +1 -0
  102. package/dist/tools/common/search-user.d.ts +9 -0
  103. package/dist/tools/common/search-user.d.ts.map +1 -0
  104. package/dist/tools/common/search-user.js +88 -0
  105. package/dist/tools/common/search-user.js.map +1 -0
  106. package/dist/tools/doc/create.d.ts +17 -0
  107. package/dist/tools/doc/create.d.ts.map +1 -0
  108. package/dist/tools/doc/create.js +159 -0
  109. package/dist/tools/doc/create.js.map +1 -0
  110. package/dist/tools/doc/fetch.d.ts +17 -0
  111. package/dist/tools/doc/fetch.d.ts.map +1 -0
  112. package/dist/tools/doc/fetch.js +123 -0
  113. package/dist/tools/doc/fetch.js.map +1 -0
  114. package/dist/tools/doc/index.d.ts +21 -0
  115. package/dist/tools/doc/index.d.ts.map +1 -0
  116. package/dist/tools/doc/index.js +33 -0
  117. package/dist/tools/doc/index.js.map +1 -0
  118. package/dist/tools/doc/shared.d.ts +69 -0
  119. package/dist/tools/doc/shared.d.ts.map +1 -0
  120. package/dist/tools/doc/shared.js +172 -0
  121. package/dist/tools/doc/shared.js.map +1 -0
  122. package/dist/tools/doc/update.d.ts +25 -0
  123. package/dist/tools/doc/update.d.ts.map +1 -0
  124. package/dist/tools/doc/update.js +208 -0
  125. package/dist/tools/doc/update.js.map +1 -0
  126. package/dist/tools/drive/file.d.ts +13 -0
  127. package/dist/tools/drive/file.d.ts.map +1 -0
  128. package/dist/tools/drive/file.js +212 -0
  129. package/dist/tools/drive/file.js.map +1 -0
  130. package/dist/tools/drive/index.d.ts +12 -0
  131. package/dist/tools/drive/index.d.ts.map +1 -0
  132. package/dist/tools/drive/index.js +25 -0
  133. package/dist/tools/drive/index.js.map +1 -0
  134. package/dist/tools/im/format-messages.d.ts +99 -0
  135. package/dist/tools/im/format-messages.d.ts.map +1 -0
  136. package/dist/tools/im/format-messages.js +277 -0
  137. package/dist/tools/im/format-messages.js.map +1 -0
  138. package/dist/tools/im/helpers.d.ts +53 -0
  139. package/dist/tools/im/helpers.d.ts.map +1 -0
  140. package/dist/tools/im/helpers.js +85 -0
  141. package/dist/tools/im/helpers.js.map +1 -0
  142. package/dist/tools/im/index.d.ts +25 -0
  143. package/dist/tools/im/index.d.ts.map +1 -0
  144. package/dist/tools/im/index.js +44 -0
  145. package/dist/tools/im/index.js.map +1 -0
  146. package/dist/tools/im/message-read.d.ts +19 -0
  147. package/dist/tools/im/message-read.d.ts.map +1 -0
  148. package/dist/tools/im/message-read.js +526 -0
  149. package/dist/tools/im/message-read.js.map +1 -0
  150. package/dist/tools/im/message.d.ts +22 -0
  151. package/dist/tools/im/message.d.ts.map +1 -0
  152. package/dist/tools/im/message.js +233 -0
  153. package/dist/tools/im/message.js.map +1 -0
  154. package/dist/tools/im/resource.d.ts +19 -0
  155. package/dist/tools/im/resource.d.ts.map +1 -0
  156. package/dist/tools/im/resource.js +185 -0
  157. package/dist/tools/im/resource.js.map +1 -0
  158. package/dist/tools/im/time-utils.d.ts +70 -0
  159. package/dist/tools/im/time-utils.d.ts.map +1 -0
  160. package/dist/tools/im/time-utils.js +277 -0
  161. package/dist/tools/im/time-utils.js.map +1 -0
  162. package/dist/tools/index.d.ts +85 -0
  163. package/dist/tools/index.d.ts.map +1 -0
  164. package/dist/tools/index.js +135 -0
  165. package/dist/tools/index.js.map +1 -0
  166. package/dist/tools/oauth.d.ts +15 -0
  167. package/dist/tools/oauth.d.ts.map +1 -0
  168. package/dist/tools/oauth.js +379 -0
  169. package/dist/tools/oauth.js.map +1 -0
  170. package/dist/tools/search/doc-search.d.ts +9 -0
  171. package/dist/tools/search/doc-search.d.ts.map +1 -0
  172. package/dist/tools/search/doc-search.js +219 -0
  173. package/dist/tools/search/doc-search.js.map +1 -0
  174. package/dist/tools/search/index.d.ts +11 -0
  175. package/dist/tools/search/index.d.ts.map +1 -0
  176. package/dist/tools/search/index.js +18 -0
  177. package/dist/tools/search/index.js.map +1 -0
  178. package/dist/tools/sheets/index.d.ts +11 -0
  179. package/dist/tools/sheets/index.d.ts.map +1 -0
  180. package/dist/tools/sheets/index.js +18 -0
  181. package/dist/tools/sheets/index.js.map +1 -0
  182. package/dist/tools/sheets/sheet.d.ts +11 -0
  183. package/dist/tools/sheets/sheet.d.ts.map +1 -0
  184. package/dist/tools/sheets/sheet.js +332 -0
  185. package/dist/tools/sheets/sheet.js.map +1 -0
  186. package/dist/tools/task/index.d.ts +12 -0
  187. package/dist/tools/task/index.d.ts.map +1 -0
  188. package/dist/tools/task/index.js +30 -0
  189. package/dist/tools/task/index.js.map +1 -0
  190. package/dist/tools/task/task.d.ts +13 -0
  191. package/dist/tools/task/task.d.ts.map +1 -0
  192. package/dist/tools/task/task.js +225 -0
  193. package/dist/tools/task/task.js.map +1 -0
  194. package/dist/tools/task/tasklist.d.ts +13 -0
  195. package/dist/tools/task/tasklist.d.ts.map +1 -0
  196. package/dist/tools/task/tasklist.js +206 -0
  197. package/dist/tools/task/tasklist.js.map +1 -0
  198. package/dist/tools/wiki/index.d.ts +11 -0
  199. package/dist/tools/wiki/index.d.ts.map +1 -0
  200. package/dist/tools/wiki/index.js +20 -0
  201. package/dist/tools/wiki/index.js.map +1 -0
  202. package/dist/tools/wiki/node.d.ts +11 -0
  203. package/dist/tools/wiki/node.d.ts.map +1 -0
  204. package/dist/tools/wiki/node.js +112 -0
  205. package/dist/tools/wiki/node.js.map +1 -0
  206. package/dist/tools/wiki/space.d.ts +11 -0
  207. package/dist/tools/wiki/space.d.ts.map +1 -0
  208. package/dist/tools/wiki/space.js +125 -0
  209. package/dist/tools/wiki/space.js.map +1 -0
  210. package/dist/utils/index.d.ts +8 -0
  211. package/dist/utils/index.d.ts.map +1 -0
  212. package/dist/utils/index.js +8 -0
  213. package/dist/utils/index.js.map +1 -0
  214. package/dist/utils/logger.d.ts +36 -0
  215. package/dist/utils/logger.d.ts.map +1 -0
  216. package/dist/utils/logger.js +101 -0
  217. package/dist/utils/logger.js.map +1 -0
  218. package/eslint.config.js +13 -0
  219. package/package.json +54 -0
  220. package/skills/feishu-bitable/SKILL.md +248 -0
  221. package/skills/feishu-bitable/references/examples.md +813 -0
  222. package/skills/feishu-bitable/references/field-properties.md +763 -0
  223. package/skills/feishu-bitable/references/record-values.md +911 -0
  224. package/skills/feishu-calendar/SKILL.md +244 -0
  225. package/skills/feishu-channel-rules/SKILL.md +18 -0
  226. package/skills/feishu-channel-rules/references/markdown-syntax.md +138 -0
  227. package/skills/feishu-create-doc/SKILL.md +719 -0
  228. package/skills/feishu-fetch-doc/SKILL.md +93 -0
  229. package/skills/feishu-im-read/SKILL.md +163 -0
  230. package/skills/feishu-task/SKILL.md +293 -0
  231. package/skills/feishu-troubleshoot/SKILL.md +70 -0
  232. package/skills/feishu-update-doc/SKILL.md +285 -0
  233. package/src/core/api-error.ts +342 -0
  234. package/src/core/auth-errors.ts +27 -0
  235. package/src/core/config.ts +134 -0
  236. package/src/core/device-flow.ts +314 -0
  237. package/src/core/index.ts +16 -0
  238. package/src/core/lark-client.ts +391 -0
  239. package/src/core/token-store.ts +249 -0
  240. package/src/core/types.ts +302 -0
  241. package/src/core/uat-client.ts +298 -0
  242. package/src/core/version.ts +53 -0
  243. package/src/index.ts +138 -0
  244. package/src/tools/bitable/app.ts +390 -0
  245. package/src/tools/bitable/field.ts +406 -0
  246. package/src/tools/bitable/index.ts +43 -0
  247. package/src/tools/bitable/record.ts +559 -0
  248. package/src/tools/bitable/table.ts +472 -0
  249. package/src/tools/calendar/calendar.ts +254 -0
  250. package/src/tools/calendar/event.ts +606 -0
  251. package/src/tools/calendar/index.ts +41 -0
  252. package/src/tools/chat/chat.ts +127 -0
  253. package/src/tools/chat/index.ts +24 -0
  254. package/src/tools/chat/members.ts +93 -0
  255. package/src/tools/common/get-user.ts +127 -0
  256. package/src/tools/common/index.ts +24 -0
  257. package/src/tools/common/search-user.ts +99 -0
  258. package/src/tools/doc/create.ts +184 -0
  259. package/src/tools/doc/fetch.ts +149 -0
  260. package/src/tools/doc/index.ts +38 -0
  261. package/src/tools/doc/shared.ts +228 -0
  262. package/src/tools/doc/update.ts +240 -0
  263. package/src/tools/drive/file.ts +265 -0
  264. package/src/tools/drive/index.ts +29 -0
  265. package/src/tools/im/format-messages.ts +391 -0
  266. package/src/tools/im/helpers.ts +109 -0
  267. package/src/tools/im/index.ts +49 -0
  268. package/src/tools/im/message-read.ts +676 -0
  269. package/src/tools/im/message.ts +303 -0
  270. package/src/tools/im/resource.ts +225 -0
  271. package/src/tools/im/time-utils.ts +347 -0
  272. package/src/tools/index.ts +205 -0
  273. package/src/tools/oauth.ts +460 -0
  274. package/src/tools/search/doc-search.ts +250 -0
  275. package/src/tools/search/index.ts +22 -0
  276. package/src/tools/sheets/index.ts +22 -0
  277. package/src/tools/sheets/sheet.ts +382 -0
  278. package/src/tools/task/index.ts +34 -0
  279. package/src/tools/task/task.ts +265 -0
  280. package/src/tools/task/tasklist.ts +262 -0
  281. package/src/tools/wiki/index.ts +24 -0
  282. package/src/tools/wiki/node.ts +131 -0
  283. package/src/tools/wiki/space.ts +152 -0
  284. package/src/utils/index.ts +8 -0
  285. package/src/utils/logger.ts +132 -0
  286. package/tests/core/config.test.ts +238 -0
  287. package/tests/core/device-flow.test.ts +490 -0
  288. package/tests/core/lark-client.test.ts +378 -0
  289. package/tests/core/token-store.test.ts +438 -0
  290. package/tests/index.test.ts +360 -0
  291. package/tests/tools/doc/create.test.ts +224 -0
  292. package/tests/tools/doc/fetch.test.ts +182 -0
  293. package/tests/tools/doc/shared.test.ts +183 -0
  294. package/tests/tools/doc/update.test.ts +330 -0
  295. package/tests/tools/im/format-messages.test.ts +184 -0
  296. package/tests/tools/im/time-utils.test.ts +178 -0
  297. package/tests/utils/logger.test.ts +140 -0
  298. 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"}