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,231 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * OAuth 2.0 Device Authorization Grant (RFC 8628) for Lark/Feishu.
6
+ *
7
+ * Two-step flow:
8
+ * 1. `requestDeviceAuthorization` – obtains device_code + user_code.
9
+ * 2. `pollDeviceToken` – polls the token endpoint until the user authorizes,
10
+ * rejects, or the code expires.
11
+ *
12
+ * All HTTP calls use the built-in `fetch` (Node 18+). The Lark SDK is not
13
+ * used here because these OAuth endpoints are outside the SDK's scope.
14
+ *
15
+ * Adapted from openclaw-lark for MCP Server architecture.
16
+ */
17
+ import { logger } from '../utils/logger.js';
18
+ import { getUserAgent } from './version.js';
19
+ const log = logger('device-flow');
20
+ // ---------------------------------------------------------------------------
21
+ // HTTP helper
22
+ // ---------------------------------------------------------------------------
23
+ /**
24
+ * Header-aware fetch for Lark API calls.
25
+ *
26
+ * Drop-in replacement for `fetch()` that automatically injects
27
+ * the User-Agent header.
28
+ */
29
+ function larkFetch(url, init) {
30
+ const headers = {
31
+ ...init?.headers,
32
+ 'User-Agent': getUserAgent(),
33
+ };
34
+ return fetch(url, { ...init, headers });
35
+ }
36
+ // ---------------------------------------------------------------------------
37
+ // Endpoint resolution
38
+ // ---------------------------------------------------------------------------
39
+ /**
40
+ * Resolve the two OAuth endpoint URLs based on the configured brand.
41
+ */
42
+ export function resolveOAuthEndpoints(brand) {
43
+ if (!brand || brand === 'feishu') {
44
+ return {
45
+ deviceAuthorization: 'https://accounts.feishu.cn/oauth/v1/device_authorization',
46
+ token: 'https://open.feishu.cn/open-apis/authen/v2/oauth/token',
47
+ };
48
+ }
49
+ if (brand === 'lark') {
50
+ return {
51
+ deviceAuthorization: 'https://accounts.larksuite.com/oauth/v1/device_authorization',
52
+ token: 'https://open.larksuite.com/open-apis/authen/v2/oauth/token',
53
+ };
54
+ }
55
+ // Custom domain – derive paths by convention.
56
+ // Smart derivation: open.X → accounts.X for the device authorization endpoint.
57
+ const base = brand.replace(/\/+$/, '');
58
+ let accountsBase = base;
59
+ try {
60
+ const parsed = new URL(base);
61
+ if (parsed.hostname.startsWith('open.')) {
62
+ accountsBase = `${parsed.protocol}//${parsed.hostname.replace(/^open\./, 'accounts.')}`;
63
+ }
64
+ }
65
+ catch {
66
+ /* fallback to base */
67
+ }
68
+ return {
69
+ deviceAuthorization: `${accountsBase}/oauth/v1/device_authorization`,
70
+ token: `${base}/open-apis/authen/v2/oauth/token`,
71
+ };
72
+ }
73
+ // ---------------------------------------------------------------------------
74
+ // Step 1 – Device Authorization Request
75
+ // ---------------------------------------------------------------------------
76
+ /**
77
+ * Request a device authorization code from the Feishu OAuth server.
78
+ *
79
+ * Uses Confidential Client authentication (HTTP Basic with appId:appSecret).
80
+ * The `offline_access` scope is automatically appended so that the token
81
+ * response includes a refresh_token.
82
+ */
83
+ export async function requestDeviceAuthorization(params) {
84
+ const { appId, appSecret, brand } = params;
85
+ const endpoints = resolveOAuthEndpoints(brand);
86
+ // Ensure offline_access is always requested.
87
+ let scope = params.scope ?? '';
88
+ if (!scope.includes('offline_access')) {
89
+ scope = scope ? `${scope} offline_access` : 'offline_access';
90
+ }
91
+ const basicAuth = Buffer.from(`${appId}:${appSecret}`).toString('base64');
92
+ const body = new URLSearchParams();
93
+ body.set('client_id', appId);
94
+ body.set('scope', scope);
95
+ log.info(`requesting device authorization (scope="${scope}") url=${endpoints.deviceAuthorization} token_url=${endpoints.token}`);
96
+ const resp = await larkFetch(endpoints.deviceAuthorization, {
97
+ method: 'POST',
98
+ headers: {
99
+ 'Content-Type': 'application/x-www-form-urlencoded',
100
+ Authorization: `Basic ${basicAuth}`,
101
+ },
102
+ body: body.toString(),
103
+ });
104
+ const text = await resp.text();
105
+ log.info(`response status=${resp.status} body=${text.slice(0, 500)}`);
106
+ let data;
107
+ try {
108
+ data = JSON.parse(text);
109
+ }
110
+ catch {
111
+ throw new Error(`Device authorization failed: HTTP ${resp.status} – ${text.slice(0, 200)}`);
112
+ }
113
+ if (!resp.ok || data.error) {
114
+ const msg = data.error_description ?? data.error ?? 'Unknown error';
115
+ throw new Error(`Device authorization failed: ${msg}`);
116
+ }
117
+ const expiresIn = data.expires_in ?? 240;
118
+ const interval = data.interval ?? 5;
119
+ log.info(`device_code obtained, expires_in=${expiresIn}s (${Math.round(expiresIn / 60)}min), interval=${interval}s`);
120
+ return {
121
+ deviceCode: data.device_code,
122
+ userCode: data.user_code,
123
+ verificationUri: data.verification_uri,
124
+ verificationUriComplete: data.verification_uri_complete ?? data.verification_uri,
125
+ expiresIn,
126
+ interval,
127
+ };
128
+ }
129
+ // ---------------------------------------------------------------------------
130
+ // Step 2 – Poll Token Endpoint
131
+ // ---------------------------------------------------------------------------
132
+ function sleep(ms, signal) {
133
+ return new Promise((resolve, reject) => {
134
+ const timer = setTimeout(resolve, ms);
135
+ signal?.addEventListener('abort', () => {
136
+ clearTimeout(timer);
137
+ reject(new DOMException('Aborted', 'AbortError'));
138
+ }, { once: true });
139
+ });
140
+ }
141
+ /**
142
+ * Poll the token endpoint until the user authorizes, rejects, or the code
143
+ * expires.
144
+ *
145
+ * Handles `authorization_pending` (keep polling), `slow_down` (back off by
146
+ * +5 s), `access_denied` and `expired_token` (terminal errors).
147
+ *
148
+ * Pass an `AbortSignal` to cancel polling from the outside.
149
+ */
150
+ export async function pollDeviceToken(params) {
151
+ const MAX_POLL_INTERVAL = 60; // slow_down max interval 60 seconds
152
+ const MAX_POLL_ATTEMPTS = 200; // Safety limit (well beyond device code expiry)
153
+ const { appId, appSecret, brand, deviceCode, expiresIn, signal } = params;
154
+ let interval = params.interval;
155
+ const endpoints = resolveOAuthEndpoints(brand);
156
+ const deadline = Date.now() + expiresIn * 1000;
157
+ let attempts = 0;
158
+ while (Date.now() < deadline && attempts < MAX_POLL_ATTEMPTS) {
159
+ attempts++;
160
+ if (signal?.aborted) {
161
+ return { ok: false, error: 'expired_token', message: 'Polling was cancelled' };
162
+ }
163
+ await sleep(interval * 1000, signal);
164
+ let data;
165
+ try {
166
+ const resp = await larkFetch(endpoints.token, {
167
+ method: 'POST',
168
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
169
+ body: new URLSearchParams({
170
+ grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
171
+ device_code: deviceCode,
172
+ client_id: appId,
173
+ client_secret: appSecret,
174
+ }).toString(),
175
+ });
176
+ data = (await resp.json());
177
+ }
178
+ catch (err) {
179
+ log.warn(`poll network error: ${err}`);
180
+ interval = Math.min(interval + 1, MAX_POLL_INTERVAL);
181
+ continue;
182
+ }
183
+ const error = data.error;
184
+ if (!error && data.access_token) {
185
+ log.info('token obtained successfully');
186
+ const refreshToken = data.refresh_token ?? '';
187
+ const expiresIn = data.expires_in ?? 7200;
188
+ let refreshExpiresIn = data.refresh_token_expires_in ?? 604800;
189
+ if (!refreshToken) {
190
+ log.warn('no refresh_token in response, token will not be refreshable');
191
+ refreshExpiresIn = expiresIn;
192
+ }
193
+ return {
194
+ ok: true,
195
+ token: {
196
+ accessToken: data.access_token,
197
+ refreshToken,
198
+ expiresIn,
199
+ refreshExpiresIn,
200
+ scope: data.scope ?? '',
201
+ },
202
+ };
203
+ }
204
+ if (error === 'authorization_pending') {
205
+ log.debug('authorization_pending, retrying...');
206
+ continue;
207
+ }
208
+ if (error === 'slow_down') {
209
+ interval = Math.min(interval + 5, MAX_POLL_INTERVAL);
210
+ log.info(`slow_down, interval increased to ${interval}s`);
211
+ continue;
212
+ }
213
+ if (error === 'access_denied') {
214
+ log.info('user denied authorization');
215
+ return { ok: false, error: 'access_denied', message: 'User denied authorization' };
216
+ }
217
+ if (error === 'expired_token' || error === 'invalid_grant') {
218
+ log.info(`device code expired/invalid (error=${error})`);
219
+ return { ok: false, error: 'expired_token', message: 'Authorization code expired, please retry' };
220
+ }
221
+ // Unknown error – treat as terminal.
222
+ const desc = data.error_description ?? error ?? 'Unknown error';
223
+ log.warn(`unexpected error: error=${error}, desc=${desc}`);
224
+ return { ok: false, error: 'expired_token', message: desc };
225
+ }
226
+ if (attempts >= MAX_POLL_ATTEMPTS) {
227
+ log.warn(`max poll attempts (${MAX_POLL_ATTEMPTS}) reached`);
228
+ }
229
+ return { ok: false, error: 'expired_token', message: 'Authorization timed out, please retry' };
230
+ }
231
+ //# sourceMappingURL=device-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-flow.js","sourceRoot":"","sources":["../../src/core/device-flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * Core module exports for cc-lark MCP Server.
6
+ */
7
+ export * from './types.js';
8
+ export * from './config.js';
9
+ export * from './api-error.js';
10
+ export * from './lark-client.js';
11
+ export * from './version.js';
12
+ export * from './auth-errors.js';
13
+ export * from './device-flow.js';
14
+ export * from './token-store.js';
15
+ export * from './uat-client.js';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * Core module exports for cc-lark MCP Server.
6
+ */
7
+ export * from './types.js';
8
+ export * from './config.js';
9
+ export * from './api-error.js';
10
+ export * from './lark-client.js';
11
+ export * from './version.js';
12
+ export * from './auth-errors.js';
13
+ export * from './device-flow.js';
14
+ export * from './token-store.js';
15
+ export * from './uat-client.js';
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * Feishu / Lark SDK client management for MCP Server.
6
+ *
7
+ * Provides `LarkClient` — a unified manager for Lark SDK client instances,
8
+ * bot identity probing, and token management.
9
+ *
10
+ * Adapted from openclaw-lark for MCP Server architecture.
11
+ * - Removed OpenClaw runtime dependencies
12
+ * - Simplified singleton pattern for MCP Server use case
13
+ * - Works standalone with environment variables
14
+ */
15
+ import * as Lark from '@larksuiteoapi/node-sdk';
16
+ import type { FeishuConfig, LarkBrand } from './types.js';
17
+ /** Result of probing an app's connectivity / permissions. */
18
+ export interface FeishuProbeResult {
19
+ ok: boolean;
20
+ error?: string;
21
+ appId?: string;
22
+ botName?: string;
23
+ botOpenId?: string;
24
+ }
25
+ /** Credentials for creating a LarkClient. */
26
+ export interface LarkClientCredentials {
27
+ appId?: string;
28
+ appSecret?: string;
29
+ brand?: LarkBrand;
30
+ encryptKey?: string;
31
+ verificationToken?: string;
32
+ }
33
+ /**
34
+ * Lark SDK client wrapper for MCP Server.
35
+ *
36
+ * Provides:
37
+ * - Lazy SDK client initialization
38
+ * - Bot identity probing and caching
39
+ * - Singleton pattern for global access
40
+ */
41
+ export declare class LarkClient {
42
+ private readonly _config;
43
+ private _sdk;
44
+ private _botOpenId;
45
+ private _botName;
46
+ private _lastProbeResult;
47
+ private _lastProbeAt;
48
+ private static _instance;
49
+ /**
50
+ * Get the singleton LarkClient instance.
51
+ * Creates one from environment variables if not already created.
52
+ */
53
+ static getInstance(): LarkClient;
54
+ /**
55
+ * Create a new LarkClient from environment variables.
56
+ * This will replace the singleton instance.
57
+ */
58
+ static fromEnv(): LarkClient;
59
+ /**
60
+ * Create a LarkClient from explicit credentials.
61
+ * This replaces the singleton instance.
62
+ */
63
+ static fromCredentials(credentials: LarkClientCredentials): LarkClient;
64
+ /**
65
+ * Reset the singleton instance.
66
+ * Useful for testing or when credentials change.
67
+ */
68
+ static resetInstance(): void;
69
+ /**
70
+ * Create a new LarkClient instance.
71
+ *
72
+ * @param config - Feishu configuration
73
+ */
74
+ constructor(config: FeishuConfig);
75
+ /** The configuration used by this client. */
76
+ get config(): FeishuConfig;
77
+ /** The App ID for this client. */
78
+ get appId(): string;
79
+ /** The brand (feishu/lark) for this client. */
80
+ get brand(): LarkBrand;
81
+ /**
82
+ * Get the Lark SDK client instance.
83
+ * Lazily creates the client on first access.
84
+ */
85
+ get sdk(): Lark.Client;
86
+ /**
87
+ * Probe bot identity via the `bot/v3/info` API.
88
+ * Results are cached on the instance for subsequent access via
89
+ * `botOpenId` / `botName`.
90
+ *
91
+ * @param opts - Options including maxAgeMs for cache validity
92
+ * @returns Probe result with bot info or error
93
+ */
94
+ probe(opts?: {
95
+ maxAgeMs?: number;
96
+ }): Promise<FeishuProbeResult>;
97
+ /** Cached bot open_id (available after `probe()`). */
98
+ get botOpenId(): string | undefined;
99
+ /** Cached bot name (available after `probe()`). */
100
+ get botName(): string | undefined;
101
+ /** Last probe result (cached). */
102
+ get lastProbeResult(): FeishuProbeResult | null;
103
+ /**
104
+ * Get tenant access token.
105
+ * This is primarily for debugging - the SDK handles tokens automatically.
106
+ */
107
+ getTenantAccessToken(): Promise<string | null>;
108
+ /**
109
+ * Clear cached probe result.
110
+ * Call this to force a fresh probe on next call.
111
+ */
112
+ clearProbeCache(): void;
113
+ /**
114
+ * Dispose of the client.
115
+ * Clears all caches and the SDK client reference.
116
+ */
117
+ dispose(): void;
118
+ /** Assert credentials exist or throw. */
119
+ private requireCredentials;
120
+ }
121
+ /**
122
+ * Get the singleton LarkClient instance.
123
+ * Creates one from environment variables if not already created.
124
+ */
125
+ export declare function getLarkClient(): LarkClient;
126
+ /**
127
+ * Create a LarkClient from environment variables.
128
+ * This will replace the singleton instance.
129
+ */
130
+ export declare function createLarkClient(): LarkClient;
131
+ /**
132
+ * Reset the singleton LarkClient instance.
133
+ * Useful for testing or when credentials change.
134
+ */
135
+ export declare function resetLarkClient(): void;
136
+ //# sourceMappingURL=lark-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lark-client.d.ts","sourceRoot":"","sources":["../../src/core/lark-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,IAAI,MAAM,yBAAyB,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAU1D,6DAA6D;AAC7D,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,6CAA6C;AAC7C,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAgDD;;;;;;;GAOG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,IAAI,CAA4B;IACxC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,gBAAgB,CAAkC;IAC1D,OAAO,CAAC,YAAY,CAAK;IAIzB,OAAO,CAAC,MAAM,CAAC,SAAS,CAA2B;IAEnD;;;OAGG;IACH,MAAM,CAAC,WAAW,IAAI,UAAU;IAQhC;;;OAGG;IACH,MAAM,CAAC,OAAO,IAAI,UAAU;IAO5B;;;OAGG;IACH,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,qBAAqB,GAAG,UAAU;IAmBtE;;;OAGG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAS5B;;;;OAIG;gBACS,MAAM,EAAE,YAAY;IAKhC,6CAA6C;IAC7C,IAAI,MAAM,IAAI,YAAY,CAEzB;IAED,kCAAkC;IAClC,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,+CAA+C;IAC/C,IAAI,KAAK,IAAI,SAAS,CAErB;IAID;;;OAGG;IACH,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAYrB;IAID;;;;;;;OAOG;IACG,KAAK,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA2DrE,sDAAsD;IACtD,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;IAED,mDAAmD;IACnD,IAAI,OAAO,IAAI,MAAM,GAAG,SAAS,CAEhC;IAED,kCAAkC;IAClC,IAAI,eAAe,IAAI,iBAAiB,GAAG,IAAI,CAE9C;IAID;;;OAGG;IACG,oBAAoB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAyBpD;;;OAGG;IACH,eAAe,IAAI,IAAI;IAOvB;;;OAGG;IACH,OAAO,IAAI,IAAI;IAQf,yCAAyC;IACzC,OAAO,CAAC,kBAAkB;CAQ3B;AAMD;;;GAGG;AACH,wBAAgB,aAAa,IAAI,UAAU,CAE1C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,UAAU,CAE7C;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}