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,379 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * OAuth tool for Feishu/Lark user authorization.
6
+ *
7
+ * Provides MCP tool for OAuth 2.0 Device Authorization Grant flow.
8
+ * Supports 'authorize' and 'revoke' actions.
9
+ */
10
+ import { z } from 'zod';
11
+ import { requestDeviceAuthorization, pollDeviceToken, } from '../core/device-flow.js';
12
+ import { getStoredToken, listStoredTokens, tokenStatus, } from '../core/token-store.js';
13
+ import { getUATStatus, saveTokenFromDeviceFlow, revokeUAT } from '../core/uat-client.js';
14
+ import { logger } from '../utils/logger.js';
15
+ const log = logger('tools:oauth');
16
+ // ---------------------------------------------------------------------------
17
+ // Input schema (raw shape for ZodRawShapeCompat)
18
+ // ---------------------------------------------------------------------------
19
+ const OAuthInputSchema = {
20
+ action: z.enum(['authorize', 'revoke', 'status']).describe('The OAuth action to perform: "authorize" starts device flow, "revoke" removes stored token, "status" checks authorization status'),
21
+ scope: z.string().optional().describe('Space-separated list of OAuth scopes to request (e.g., "contact:user.base:readonly mail:mail:readonly"). Used with "authorize" action.'),
22
+ user_open_id: z.string().optional().describe('The user open_id for "revoke" or "status" action. For "authorize", this will be discovered automatically.'),
23
+ };
24
+ /**
25
+ * Handle 'authorize' action - start OAuth device flow.
26
+ */
27
+ async function handleAuthorize(scope, appId, appSecret, brand) {
28
+ log.info('Starting device authorization flow', { scope: scope || 'default' });
29
+ // Default scope if not provided
30
+ const requestedScope = scope || 'contact:user.base:readonly';
31
+ try {
32
+ // Step 1: Request device authorization
33
+ let deviceAuth;
34
+ try {
35
+ deviceAuth = await requestDeviceAuthorization({
36
+ appId,
37
+ appSecret,
38
+ brand: brand,
39
+ scope: requestedScope,
40
+ });
41
+ }
42
+ catch (err) {
43
+ const message = err instanceof Error ? err.message : String(err);
44
+ log.error('Device authorization request failed', { error: message });
45
+ return {
46
+ content: [
47
+ {
48
+ type: 'text',
49
+ text: `Failed to start OAuth flow: ${message}\n\nPlease check:\n1. Your FEISHU_APP_ID and FEISHU_APP_SECRET are correct\n2. The app is properly configured in the Developer Console`,
50
+ },
51
+ ],
52
+ isError: true,
53
+ };
54
+ }
55
+ log.info('Device code obtained', {
56
+ userCode: deviceAuth.userCode,
57
+ verificationUri: deviceAuth.verificationUri,
58
+ expiresIn: deviceAuth.expiresIn,
59
+ });
60
+ // Provide instructions to the user
61
+ const instructions = [
62
+ '===========================================',
63
+ 'OAuth Authorization Required',
64
+ '===========================================',
65
+ '',
66
+ `Please visit: ${deviceAuth.verificationUri}`,
67
+ `And enter code: ${deviceAuth.userCode}`,
68
+ '',
69
+ `Or visit directly: ${deviceAuth.verificationUriComplete}`,
70
+ '',
71
+ `This code expires in ${Math.floor(deviceAuth.expiresIn / 60)} minutes.`,
72
+ '',
73
+ 'Waiting for authorization...',
74
+ '===========================================',
75
+ ].join('\n');
76
+ // Step 2: Poll for token
77
+ const result = await pollDeviceToken({
78
+ appId,
79
+ appSecret,
80
+ brand: brand,
81
+ deviceCode: deviceAuth.deviceCode,
82
+ interval: deviceAuth.interval,
83
+ expiresIn: deviceAuth.expiresIn,
84
+ });
85
+ if (!result.ok) {
86
+ log.warn('OAuth flow failed', { error: result.error, message: result.message });
87
+ return {
88
+ content: [
89
+ {
90
+ type: 'text',
91
+ text: `Authorization failed: ${result.message}`,
92
+ },
93
+ ],
94
+ isError: true,
95
+ };
96
+ }
97
+ // Step 3: Get user info to determine user_open_id
98
+ // Note: We need to call the API with the new token to get user info
99
+ // For now, we'll store the token with a placeholder and the user_open_id
100
+ // will be retrieved from the token introspection or from stored token data
101
+ const { token } = result;
102
+ // Store the token - we need user_open_id which we can get from the token response
103
+ // or by calling the userinfo endpoint. For device flow, the user_open_id is
104
+ // typically returned in the token response or we need to call /authen/v1/user_info
105
+ // Save token with a temporary ID - we'll get the real user_open_id from the API
106
+ // For now, let's try to get user info from the token response
107
+ // Some OAuth providers include user info in the token response
108
+ // If not, we need to call a userinfo endpoint
109
+ // Lark's device flow response doesn't include user_open_id directly
110
+ // We need to call the userinfo API with the access token
111
+ // Let's fetch user info using the access token
112
+ let userOpenId;
113
+ try {
114
+ // Use the Lark API to get user info
115
+ const userinfoUrl = brand === 'lark'
116
+ ? 'https://open.larksuite.com/open-apis/authen/v1/user_info'
117
+ : 'https://open.feishu.cn/open-apis/authen/v1/user_info';
118
+ const userinfoResp = await fetch(userinfoUrl, {
119
+ method: 'GET',
120
+ headers: {
121
+ 'Authorization': `Bearer ${token.accessToken}`,
122
+ },
123
+ });
124
+ const userinfoData = await userinfoResp.json();
125
+ if (userinfoData.code !== 0 || !userinfoData.data?.user?.open_id) {
126
+ // Fallback: try to get user info via tenant access token
127
+ // Use a placeholder for now - user can find their open_id through other means
128
+ log.warn('Could not fetch user info from API', { code: userinfoData.code, msg: userinfoData.msg });
129
+ userOpenId = 'unknown';
130
+ }
131
+ else {
132
+ userOpenId = userinfoData.data.user.open_id;
133
+ log.info('Got user open_id from userinfo API', { userOpenId });
134
+ }
135
+ }
136
+ catch (err) {
137
+ log.warn('Failed to fetch user info', { error: err instanceof Error ? err.message : String(err) });
138
+ userOpenId = 'unknown';
139
+ }
140
+ // Save the token
141
+ await saveTokenFromDeviceFlow({ appId, appSecret, userOpenId, domain: brand }, {
142
+ accessToken: token.accessToken,
143
+ refreshToken: token.refreshToken,
144
+ expiresIn: token.expiresIn,
145
+ refreshExpiresIn: token.refreshExpiresIn,
146
+ scope: token.scope,
147
+ });
148
+ log.info('OAuth authorization successful', { userOpenId, scope: token.scope });
149
+ return {
150
+ content: [
151
+ {
152
+ type: 'text',
153
+ text: [
154
+ 'Authorization successful!',
155
+ '',
156
+ `User Open ID: ${userOpenId}`,
157
+ `Scope: ${token.scope}`,
158
+ `Expires in: ${Math.floor(token.expiresIn / 3600)} hours`,
159
+ '',
160
+ 'You can now use user-authorized APIs.',
161
+ 'Use the status action to check authorization status.',
162
+ ].join('\n'),
163
+ },
164
+ ],
165
+ };
166
+ }
167
+ catch (err) {
168
+ const message = err instanceof Error ? err.message : String(err);
169
+ log.error('OAuth authorization failed', { error: message });
170
+ return {
171
+ content: [
172
+ {
173
+ type: 'text',
174
+ text: `Authorization failed: ${message}`,
175
+ },
176
+ ],
177
+ isError: true,
178
+ };
179
+ }
180
+ }
181
+ /**
182
+ * Handle 'revoke' action - remove stored token.
183
+ */
184
+ async function handleRevoke(userOpenId, appId) {
185
+ if (!userOpenId) {
186
+ // List all stored tokens for this app
187
+ const tokens = await listStoredTokens(appId);
188
+ if (tokens.length === 0) {
189
+ return {
190
+ content: [
191
+ {
192
+ type: 'text',
193
+ text: 'No stored authorizations found.',
194
+ },
195
+ ],
196
+ };
197
+ }
198
+ const tokenList = tokens
199
+ .map((t) => `- ${t.userOpenId} (scope: ${t.scope || 'unknown'})`)
200
+ .join('\n');
201
+ return {
202
+ content: [
203
+ {
204
+ type: 'text',
205
+ text: [
206
+ 'Stored authorizations:',
207
+ tokenList,
208
+ '',
209
+ 'To revoke, specify the user_open_id parameter.',
210
+ ].join('\n'),
211
+ },
212
+ ],
213
+ };
214
+ }
215
+ log.info('Revoking authorization', { userOpenId });
216
+ // Check if token exists
217
+ const token = await getStoredToken(appId, userOpenId);
218
+ if (!token) {
219
+ return {
220
+ content: [
221
+ {
222
+ type: 'text',
223
+ text: `No authorization found for user_open_id: ${userOpenId}`,
224
+ },
225
+ ],
226
+ isError: true,
227
+ };
228
+ }
229
+ // Remove the token
230
+ await revokeUAT(appId, userOpenId);
231
+ return {
232
+ content: [
233
+ {
234
+ type: 'text',
235
+ text: `Authorization revoked for user: ${userOpenId}`,
236
+ },
237
+ ],
238
+ };
239
+ }
240
+ /**
241
+ * Handle 'status' action - check authorization status.
242
+ */
243
+ async function handleStatus(userOpenId, appId, appSecret, brand) {
244
+ if (!userOpenId) {
245
+ // List all stored tokens for this app
246
+ const tokens = await listStoredTokens(appId);
247
+ if (tokens.length === 0) {
248
+ return {
249
+ content: [
250
+ {
251
+ type: 'text',
252
+ text: 'No stored authorizations found. Use the "authorize" action to start OAuth.',
253
+ },
254
+ ],
255
+ };
256
+ }
257
+ const tokenList = tokens
258
+ .map((t) => {
259
+ const status = tokenStatus(t);
260
+ const statusEmoji = status === 'valid' ? 'valid' : status === 'needs_refresh' ? 'expiring' : 'expired';
261
+ const expiresDate = new Date(t.expiresAt).toISOString();
262
+ return `- ${t.userOpenId}\n Status: ${statusEmoji}\n Scope: ${t.scope || 'unknown'}\n Expires: ${expiresDate}`;
263
+ })
264
+ .join('\n\n');
265
+ return {
266
+ content: [
267
+ {
268
+ type: 'text',
269
+ text: ['Stored authorizations:', '', tokenList].join('\n'),
270
+ },
271
+ ],
272
+ };
273
+ }
274
+ log.info('Checking authorization status', { userOpenId });
275
+ const status = await getUATStatus({
276
+ userOpenId,
277
+ appId,
278
+ appSecret,
279
+ domain: brand,
280
+ });
281
+ if (!status.authorized) {
282
+ return {
283
+ content: [
284
+ {
285
+ type: 'text',
286
+ text: `No valid authorization for user: ${userOpenId}\n\nUse the "authorize" action to start OAuth.`,
287
+ },
288
+ ],
289
+ isError: true,
290
+ };
291
+ }
292
+ const expiresDate = status.expiresAt ? new Date(status.expiresAt).toISOString() : 'unknown';
293
+ const refreshExpiresDate = status.refreshExpiresAt ? new Date(status.refreshExpiresAt).toISOString() : 'unknown';
294
+ const grantedDate = status.grantedAt ? new Date(status.grantedAt).toISOString() : 'unknown';
295
+ return {
296
+ content: [
297
+ {
298
+ type: 'text',
299
+ text: [
300
+ `Authorization status for user: ${userOpenId}`,
301
+ '',
302
+ `Status: ${status.tokenStatus}`,
303
+ `Scope: ${status.scope || 'unknown'}`,
304
+ `Expires: ${expiresDate}`,
305
+ `Refresh expires: ${refreshExpiresDate}`,
306
+ `Granted: ${grantedDate}`,
307
+ ].join('\n'),
308
+ },
309
+ ],
310
+ };
311
+ }
312
+ // ---------------------------------------------------------------------------
313
+ // Tool registration
314
+ // ---------------------------------------------------------------------------
315
+ /**
316
+ * Register the OAuth tool with the registry.
317
+ */
318
+ export function registerOAuthTool(registry) {
319
+ registry.register({
320
+ name: 'feishu_oauth',
321
+ description: [
322
+ 'Manage OAuth authorization for Feishu/Lark user access tokens.',
323
+ '',
324
+ 'Actions:',
325
+ '- authorize: Start OAuth device flow to get user authorization. The user must visit the verification URL and enter the code.',
326
+ '- revoke: Remove stored authorization for a user. If no user_open_id is provided, list all authorizations.',
327
+ '- status: Check authorization status for a user. If no user_open_id is provided, list all authorizations.',
328
+ '',
329
+ 'Scopes (for authorize action):',
330
+ '- contact:user.base:readonly - Basic user info',
331
+ '- mail:mail:readonly - Read mail',
332
+ '- mail:mail - Read and send mail',
333
+ '- docs:doc:readonly - Read documents',
334
+ '- docs:doc - Read and edit documents',
335
+ '- sheets:spreadsheet - Access spreadsheets',
336
+ '- drive:drive - Access drive files',
337
+ '',
338
+ 'Example scopes: "contact:user.base:readonly mail:mail:readonly"',
339
+ ].join('\n'),
340
+ inputSchema: OAuthInputSchema,
341
+ handler: async (args, context) => {
342
+ const { action, scope, user_open_id } = args;
343
+ const { config } = context;
344
+ const { appId, appSecret, brand } = config;
345
+ // Validate required config
346
+ if (!appId || !appSecret) {
347
+ return {
348
+ content: [
349
+ {
350
+ type: 'text',
351
+ text: 'OAuth requires FEISHU_APP_ID and FEISHU_APP_SECRET environment variables to be set.',
352
+ },
353
+ ],
354
+ isError: true,
355
+ };
356
+ }
357
+ switch (action) {
358
+ case 'authorize':
359
+ return handleAuthorize(scope, appId, appSecret, brand ?? 'feishu');
360
+ case 'revoke':
361
+ return handleRevoke(user_open_id, appId);
362
+ case 'status':
363
+ return handleStatus(user_open_id, appId, appSecret, brand ?? 'feishu');
364
+ default:
365
+ return {
366
+ content: [
367
+ {
368
+ type: 'text',
369
+ text: `Unknown action: ${action}. Supported actions: authorize, revoke, status.`,
370
+ },
371
+ ],
372
+ isError: true,
373
+ };
374
+ }
375
+ },
376
+ });
377
+ log.debug('OAuth tool registered');
378
+ }
379
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/tools/oauth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * feishu_search_doc_wiki tool - Search Feishu documents and wikis.
6
+ */
7
+ import type { ToolRegistry } from '../index.js';
8
+ export declare function registerSearchDocWikiTool(registry: ToolRegistry): void;
9
+ //# sourceMappingURL=doc-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc-search.d.ts","sourceRoot":"","sources":["../../../src/tools/search/doc-search.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAgJhD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAiGtE"}
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * feishu_search_doc_wiki tool - Search Feishu documents and wikis.
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:search:doc-wiki');
12
+ /**
13
+ * Convert Unix timestamp to ISO 8601 in Shanghai timezone.
14
+ */
15
+ function unixTimestampToISO8601(raw) {
16
+ if (raw === undefined || raw === null)
17
+ return null;
18
+ const text = typeof raw === 'number' ? String(raw) : String(raw).trim();
19
+ if (!/^-?\d+$/.test(text))
20
+ return null;
21
+ const num = Number(text);
22
+ if (!Number.isFinite(num))
23
+ return null;
24
+ const utcMs = Math.abs(num) >= 1e12 ? num : num * 1000;
25
+ const beijingDate = new Date(utcMs + 8 * 60 * 60 * 1000);
26
+ if (Number.isNaN(beijingDate.getTime()))
27
+ return null;
28
+ const year = beijingDate.getUTCFullYear();
29
+ const month = String(beijingDate.getUTCMonth() + 1).padStart(2, '0');
30
+ const day = String(beijingDate.getUTCDate()).padStart(2, '0');
31
+ const hour = String(beijingDate.getUTCHours()).padStart(2, '0');
32
+ const minute = String(beijingDate.getUTCMinutes()).padStart(2, '0');
33
+ const second = String(beijingDate.getUTCSeconds()).padStart(2, '0');
34
+ return `${year}-${month}-${day}T${hour}:${minute}:${second}+08:00`;
35
+ }
36
+ /**
37
+ * Parse time string to Unix timestamp (seconds).
38
+ */
39
+ function parseTimeToTimestamp(input) {
40
+ try {
41
+ const trimmed = input.trim();
42
+ const hasTimezone = /[Zz]$|[+-]\d{2}:\d{2}$/.test(trimmed);
43
+ if (hasTimezone) {
44
+ const date = new Date(trimmed);
45
+ if (isNaN(date.getTime()))
46
+ return undefined;
47
+ return Math.floor(date.getTime() / 1000);
48
+ }
49
+ const normalized = trimmed.replace('T', ' ');
50
+ const match = normalized.match(/^(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2})(?::(\d{2}))?$/);
51
+ if (!match) {
52
+ const date = new Date(trimmed);
53
+ if (isNaN(date.getTime()))
54
+ return undefined;
55
+ return Math.floor(date.getTime() / 1000);
56
+ }
57
+ const [, year, month, day, hour, minute, second] = match;
58
+ const utcDate = new Date(Date.UTC(parseInt(year), parseInt(month) - 1, parseInt(day), parseInt(hour) - 8, parseInt(minute), parseInt(second ?? '0')));
59
+ return Math.floor(utcDate.getTime() / 1000);
60
+ }
61
+ catch {
62
+ return undefined;
63
+ }
64
+ }
65
+ // Schemas
66
+ const docTypeEnum = z.enum(['DOC', 'SHEET', 'BITABLE', 'MINDNOTE', 'FILE', 'WIKI', 'DOCX', 'FOLDER', 'CATALOG', 'SLIDES', 'SHORTCUT']);
67
+ const timeRangeSchema = z.object({
68
+ start: z.string().optional().describe('Start time (ISO 8601 with timezone)'),
69
+ end: z.string().optional().describe('End time (ISO 8601 with timezone)'),
70
+ });
71
+ const filterSchema = z.object({
72
+ creator_ids: z.array(z.string()).max(20).optional().describe('Creator OpenIDs (max 20)'),
73
+ doc_types: z.array(docTypeEnum).max(10).optional().describe('Document types'),
74
+ only_title: z.boolean().optional().describe('Search title only (default: false)'),
75
+ open_time: timeRangeSchema.optional().describe('Open time range'),
76
+ create_time: timeRangeSchema.optional().describe('Create time range'),
77
+ }).optional();
78
+ const searchActionSchema = {
79
+ action: z.literal('search').describe('Search documents and wikis'),
80
+ query: z.string().max(50).optional().describe('Search query (optional, empty string for all)'),
81
+ filter: filterSchema,
82
+ page_size: z.number().min(1).max(20).optional().describe('Page size (default 15)'),
83
+ page_token: z.string().optional().describe('Pagination token'),
84
+ };
85
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
86
+ function normalizeSearchResultTimeFields(value) {
87
+ if (Array.isArray(value)) {
88
+ return value.map((item) => normalizeSearchResultTimeFields(item));
89
+ }
90
+ if (!value || typeof value !== 'object') {
91
+ return value;
92
+ }
93
+ const source = value;
94
+ const normalized = {};
95
+ for (const [key, item] of Object.entries(source)) {
96
+ if (key.endsWith('_time')) {
97
+ const iso = unixTimestampToISO8601(item);
98
+ if (iso) {
99
+ normalized[key] = iso;
100
+ continue;
101
+ }
102
+ }
103
+ normalized[key] = normalizeSearchResultTimeFields(item);
104
+ }
105
+ return normalized;
106
+ }
107
+ async function getAccessToken(context) {
108
+ const { larkClient, config } = context;
109
+ if (!larkClient)
110
+ return jsonError('LarkClient not initialized.');
111
+ const { appId, appSecret, brand } = config;
112
+ if (!appId || !appSecret)
113
+ return jsonError('Missing FEISHU_APP_ID or FEISHU_APP_SECRET.');
114
+ const { listStoredTokens } = await import('../../core/token-store.js');
115
+ const tokens = await listStoredTokens(appId);
116
+ if (tokens.length === 0)
117
+ return jsonError('No user authorization found.');
118
+ const userOpenId = tokens[0].userOpenId;
119
+ try {
120
+ return await getValidAccessToken({ userOpenId, appId, appSecret, domain: brand ?? 'feishu' });
121
+ }
122
+ catch (err) {
123
+ if (err instanceof NeedAuthorizationError)
124
+ return jsonError('User authorization expired.');
125
+ throw err;
126
+ }
127
+ }
128
+ export function registerSearchDocWikiTool(registry) {
129
+ registry.register({
130
+ name: 'feishu_search_doc_wiki',
131
+ description: 'Search Feishu documents and wikis.\n\nRequires OAuth authorization.',
132
+ inputSchema: searchActionSchema,
133
+ handler: async (args, context) => {
134
+ const p = args;
135
+ const { larkClient } = context;
136
+ const tokenResult = await getAccessToken(context);
137
+ if (typeof tokenResult === 'object' && 'content' in tokenResult)
138
+ return tokenResult;
139
+ const accessToken = tokenResult;
140
+ const query = p.query ?? '';
141
+ log.info(`search: query="${query}", has_filter=${!!p.filter}, page_size=${p.page_size ?? 15}`);
142
+ const Lark = await import('@larksuiteoapi/node-sdk');
143
+ const opts = Lark.withUserAccessToken(accessToken);
144
+ // Build request body
145
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
146
+ const requestData = {
147
+ query,
148
+ page_size: p.page_size,
149
+ page_token: p.page_token,
150
+ };
151
+ if (p.filter) {
152
+ const filter = { ...p.filter };
153
+ // Convert time ranges
154
+ if (filter.open_time) {
155
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
156
+ const converted = {};
157
+ if (filter.open_time.start) {
158
+ const ts = parseTimeToTimestamp(filter.open_time.start);
159
+ if (ts !== undefined)
160
+ converted.start = ts;
161
+ }
162
+ if (filter.open_time.end) {
163
+ const ts = parseTimeToTimestamp(filter.open_time.end);
164
+ if (ts !== undefined)
165
+ converted.end = ts;
166
+ }
167
+ filter.open_time = converted;
168
+ }
169
+ if (filter.create_time) {
170
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
171
+ const converted = {};
172
+ if (filter.create_time.start) {
173
+ const ts = parseTimeToTimestamp(filter.create_time.start);
174
+ if (ts !== undefined)
175
+ converted.start = ts;
176
+ }
177
+ if (filter.create_time.end) {
178
+ const ts = parseTimeToTimestamp(filter.create_time.end);
179
+ if (ts !== undefined)
180
+ converted.end = ts;
181
+ }
182
+ filter.create_time = converted;
183
+ }
184
+ requestData.doc_filter = filter;
185
+ requestData.wiki_filter = filter;
186
+ }
187
+ else {
188
+ requestData.doc_filter = {};
189
+ requestData.wiki_filter = {};
190
+ }
191
+ // Use direct request since SDK doesn't have search API
192
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
193
+ const res = await larkClient.sdk.request({
194
+ method: 'POST',
195
+ url: '/open-apis/search/v2/doc_wiki/search',
196
+ data: requestData,
197
+ headers: {
198
+ Authorization: `Bearer ${accessToken}`,
199
+ 'Content-Type': 'application/json; charset=utf-8',
200
+ },
201
+ }, opts);
202
+ // Check for API error - response might have code directly or wrapped
203
+ if (res.code !== undefined && res.code !== 0) {
204
+ return jsonError(`API Error: code=${res.code}, msg=${res.msg}`);
205
+ }
206
+ const data = res.data || {};
207
+ log.info(`search: found ${data.res_units?.length ?? 0} results`);
208
+ const normalizedResults = normalizeSearchResultTimeFields(data.res_units);
209
+ return json({
210
+ total: data.total,
211
+ has_more: data.has_more,
212
+ results: normalizedResults,
213
+ page_token: data.page_token,
214
+ });
215
+ },
216
+ });
217
+ log.debug('feishu_search_doc_wiki tools registered');
218
+ }
219
+ //# sourceMappingURL=doc-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc-search.js","sourceRoot":"","sources":["../../../src/tools/search/doc-search.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
+ * Search Tools Index
6
+ *
7
+ * Search tools for Feishu/Lark.
8
+ */
9
+ import type { ToolRegistry } from '../index.js';
10
+ export declare function registerSearchTools(registry: ToolRegistry): void;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/search/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMhD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAMhE"}