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,286 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * Core type definitions for the cc-lark MCP Server.
6
+ *
7
+ * Contains Feishu/Lark API types, configuration interfaces, and MCP-specific types.
8
+ * Adapted from openclaw-lark for MCP Server architecture.
9
+ */
10
+ /**
11
+ * The Lark platform brand.
12
+ * - `"feishu"` targets the China-mainland Feishu service.
13
+ * - `"lark"` targets the international Lark service.
14
+ * - Any other string is treated as a custom base URL.
15
+ */
16
+ export type LarkBrand = 'feishu' | 'lark' | (string & {});
17
+ /** The four ID types recognised by the Feishu API. */
18
+ export type FeishuIdType = 'open_id' | 'user_id' | 'union_id' | 'chat_id';
19
+ /** Standard MCP tool result structure. */
20
+ export interface ToolResult {
21
+ content: Array<{
22
+ type: 'text' | 'image' | 'resource';
23
+ text?: string;
24
+ data?: string;
25
+ mimeType?: string;
26
+ resource?: {
27
+ uri: string;
28
+ name: string;
29
+ mimeType?: string;
30
+ text?: string;
31
+ blob?: string;
32
+ };
33
+ }>;
34
+ isError?: boolean;
35
+ }
36
+ /** Tool definition for MCP server. */
37
+ export interface ToolDefinition {
38
+ name: string;
39
+ description: string;
40
+ inputSchema: {
41
+ type: 'object';
42
+ properties?: Record<string, unknown>;
43
+ required?: string[];
44
+ };
45
+ }
46
+ /** Feishu configuration loaded from environment variables. */
47
+ export interface FeishuConfig {
48
+ /** Feishu App ID */
49
+ appId: string;
50
+ /** Feishu App Secret */
51
+ appSecret: string;
52
+ /** User Access Token (optional, for user-authorized operations) */
53
+ userAccessToken?: string;
54
+ /** The Lark platform brand (feishu, lark, or custom URL) */
55
+ brand?: LarkBrand;
56
+ /** Encrypt key for webhook event decryption */
57
+ encryptKey?: string;
58
+ /** Verification token for webhook validation */
59
+ verificationToken?: string;
60
+ }
61
+ /** Validation result for configuration. */
62
+ export interface ConfigValidationResult {
63
+ valid: boolean;
64
+ errors: string[];
65
+ config?: FeishuConfig;
66
+ }
67
+ /** The minimum credential set needed to interact with the Lark API. */
68
+ export interface LarkCredentials {
69
+ appId: string;
70
+ appSecret: string;
71
+ encryptKey?: string;
72
+ verificationToken?: string;
73
+ brand: LarkBrand;
74
+ }
75
+ /** Base response from Lark API. */
76
+ export interface LarkApiResponse<T = unknown> {
77
+ code: number;
78
+ msg: string;
79
+ data?: T;
80
+ }
81
+ /** Token response from Lark API. */
82
+ export interface LarkTokenResponse {
83
+ tenant_access_token: string;
84
+ expire: number;
85
+ }
86
+ /** User info from Lark API. */
87
+ export interface LarkUserInfo {
88
+ open_id: string;
89
+ user_id?: string;
90
+ union_id?: string;
91
+ name?: string;
92
+ en_name?: string;
93
+ nickname?: string;
94
+ email?: string;
95
+ mobile?: string;
96
+ gender?: number;
97
+ avatar_url?: string;
98
+ status?: {
99
+ is_frozen?: boolean;
100
+ is_resigned?: boolean;
101
+ is_activated?: boolean;
102
+ };
103
+ department_ids?: string[];
104
+ leader_user_id?: string;
105
+ city?: string;
106
+ country?: string;
107
+ work_station?: string;
108
+ join_time?: number;
109
+ employee_no?: string;
110
+ employee_type?: number;
111
+ positions?: string[];
112
+ orders?: number;
113
+ }
114
+ /** Message content types. */
115
+ export type LarkMessageContent = {
116
+ text: string;
117
+ } | {
118
+ image_key: string;
119
+ } | {
120
+ file_key: string;
121
+ } | {
122
+ audio_key: string;
123
+ } | {
124
+ media_key: string;
125
+ } | {
126
+ sticker_key: string;
127
+ } | {
128
+ rich_text: LarkRichTextContent;
129
+ };
130
+ /** Rich text content structure. */
131
+ export interface LarkRichTextContent {
132
+ zh_cn?: LarkRichTextSection[];
133
+ en_us?: LarkRichTextSection[];
134
+ }
135
+ /** Rich text section. */
136
+ export interface LarkRichTextSection {
137
+ title?: string;
138
+ lines?: LarkRichTextLine[];
139
+ }
140
+ /** Rich text line. */
141
+ export interface LarkRichTextLine {
142
+ text_run?: {
143
+ text: string;
144
+ bold?: boolean;
145
+ italic?: boolean;
146
+ underline?: boolean;
147
+ strikethrough?: boolean;
148
+ inline_code?: boolean;
149
+ color?: string;
150
+ link?: string;
151
+ };
152
+ mention_run?: {
153
+ text: string;
154
+ user_id: string;
155
+ };
156
+ equation_run?: {
157
+ text: string;
158
+ };
159
+ }
160
+ /** Docx document metadata. */
161
+ export interface LarkDocxDocument {
162
+ document_id: string;
163
+ revision_id: number;
164
+ title: string;
165
+ create_time: number;
166
+ update_time: number;
167
+ }
168
+ /** Docx block content. */
169
+ export interface LarkDocxBlock {
170
+ block_type: number;
171
+ block_id: string;
172
+ parent_id?: string;
173
+ children?: string[];
174
+ text?: {
175
+ initial_style: Record<string, unknown>;
176
+ elements: Array<{
177
+ text_run?: {
178
+ content: string;
179
+ };
180
+ mention_run?: {
181
+ user_id: string;
182
+ text: string;
183
+ };
184
+ equation_run?: {
185
+ content: string;
186
+ };
187
+ }>;
188
+ };
189
+ heading1?: {
190
+ elements: unknown[];
191
+ };
192
+ heading2?: {
193
+ elements: unknown[];
194
+ };
195
+ heading3?: {
196
+ elements: unknown[];
197
+ };
198
+ heading4?: {
199
+ elements: unknown[];
200
+ };
201
+ heading5?: {
202
+ elements: unknown[];
203
+ };
204
+ heading6?: {
205
+ elements: unknown[];
206
+ };
207
+ heading7?: {
208
+ elements: unknown[];
209
+ };
210
+ heading8?: {
211
+ elements: unknown[];
212
+ };
213
+ heading9?: {
214
+ elements: unknown[];
215
+ };
216
+ bullet?: {
217
+ elements: unknown[];
218
+ };
219
+ ordered?: {
220
+ elements: unknown[];
221
+ };
222
+ code?: {
223
+ elements: unknown[];
224
+ };
225
+ quote?: {
226
+ elements: unknown[];
227
+ };
228
+ table?: {
229
+ rows: number;
230
+ columns: number;
231
+ property: {
232
+ row_size: number[];
233
+ column_size: number[];
234
+ };
235
+ cells: string[];
236
+ };
237
+ table_cell?: {
238
+ property: Record<string, unknown>;
239
+ };
240
+ }
241
+ /** Spreadsheet metadata. */
242
+ export interface LarkSpreadsheet {
243
+ spreadsheet_token: string;
244
+ name: string;
245
+ revision: number;
246
+ owner_id: string;
247
+ create_time: number;
248
+ update_time: number;
249
+ }
250
+ /** Sheet (worksheet) metadata. */
251
+ export interface LarkSheet {
252
+ sheet_id: string;
253
+ title: string;
254
+ index: number;
255
+ row_count: number;
256
+ column_count: number;
257
+ frozen_row_count?: number;
258
+ frozen_column_count?: number;
259
+ }
260
+ /** Sheet cell value. */
261
+ export interface LarkCellValue {
262
+ value: string;
263
+ type: number;
264
+ }
265
+ /** Drive file metadata. */
266
+ export interface LarkDriveFile {
267
+ token: string;
268
+ name: string;
269
+ type: string;
270
+ parent_token: string;
271
+ create_time: number;
272
+ update_time: number;
273
+ size: number;
274
+ creator_id?: string;
275
+ modifier_id?: string;
276
+ }
277
+ /** Drive folder metadata. */
278
+ export interface LarkDriveFolder {
279
+ token: string;
280
+ name: string;
281
+ parent_token: string;
282
+ create_time: number;
283
+ update_time: number;
284
+ creator_id?: string;
285
+ }
286
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.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
+ * Core type definitions for the cc-lark MCP Server.
6
+ *
7
+ * Contains Feishu/Lark API types, configuration interfaces, and MCP-specific types.
8
+ * Adapted from openclaw-lark for MCP Server architecture.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * UAT (User Access Token) API call wrapper for cc-lark MCP Server.
6
+ *
7
+ * Provides a safe, auto-refreshing interface for making Lark API calls on
8
+ * behalf of a user. Tokens are read from file-based storage, refreshed
9
+ * transparently, and never exposed to the AI layer.
10
+ *
11
+ * Adapted from openclaw-lark for MCP Server architecture.
12
+ */
13
+ import type { LarkBrand } from './types.js';
14
+ import { type StoredUAToken } from './token-store.js';
15
+ import { NeedAuthorizationError } from './api-error.js';
16
+ export { NeedAuthorizationError };
17
+ export interface UATCallOptions {
18
+ userOpenId: string;
19
+ appId: string;
20
+ appSecret: string;
21
+ domain: LarkBrand;
22
+ }
23
+ export interface UATStatus {
24
+ authorized: boolean;
25
+ userOpenId: string;
26
+ scope?: string;
27
+ expiresAt?: number;
28
+ refreshExpiresAt?: number;
29
+ grantedAt?: number;
30
+ tokenStatus?: 'valid' | 'needs_refresh' | 'expired';
31
+ }
32
+ /**
33
+ * Obtain a valid access_token for the given user.
34
+ *
35
+ * - Reads from storage.
36
+ * - Refreshes proactively if the token is about to expire.
37
+ * - Throws when no token exists or refresh fails irrecoverably.
38
+ *
39
+ * The returned token must never be exposed to the AI layer.
40
+ */
41
+ export declare function getValidAccessToken(opts: UATCallOptions): Promise<string>;
42
+ /**
43
+ * Execute an API call with a valid UAT, retrying once on token-expiry errors.
44
+ */
45
+ export declare function callWithUAT<T>(opts: UATCallOptions, apiCall: (accessToken: string) => Promise<T>): Promise<T>;
46
+ /**
47
+ * Get the current UAT status for a user.
48
+ */
49
+ export declare function getUATStatus(opts: UATCallOptions): Promise<UATStatus>;
50
+ /**
51
+ * Save a new token from OAuth device flow.
52
+ */
53
+ export declare function saveTokenFromDeviceFlow(opts: UATCallOptions, tokenData: {
54
+ accessToken: string;
55
+ refreshToken: string;
56
+ expiresIn: number;
57
+ refreshExpiresIn: number;
58
+ scope: string;
59
+ }): Promise<StoredUAToken>;
60
+ /**
61
+ * Revoke a user's UAT by removing it from storage.
62
+ */
63
+ export declare function revokeUAT(appId: string, userOpenId: string): Promise<void>;
64
+ //# sourceMappingURL=uat-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uat-client.d.ts","sourceRoot":"","sources":["../../src/core/uat-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAML,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EAAkD,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAKxG,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAMlC,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,GAAG,eAAe,GAAG,SAAS,CAAC;CACrD;AA+HD;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAuB/E;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,CAAC,EACjC,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAC3C,OAAO,CAAC,CAAC,CAAC,CAkBZ;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAmB3E;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,cAAc,EACpB,SAAS,EAAE;IACT,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf,GACA,OAAO,CAAC,aAAa,CAAC,CAexB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhF"}
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * UAT (User Access Token) API call wrapper for cc-lark MCP Server.
6
+ *
7
+ * Provides a safe, auto-refreshing interface for making Lark API calls on
8
+ * behalf of a user. Tokens are read from file-based storage, refreshed
9
+ * transparently, and never exposed to the AI layer.
10
+ *
11
+ * Adapted from openclaw-lark for MCP Server architecture.
12
+ */
13
+ import { getStoredToken, setStoredToken, removeStoredToken, tokenStatus, maskToken, } from './token-store.js';
14
+ import { resolveOAuthEndpoints } from './device-flow.js';
15
+ import { logger } from '../utils/logger.js';
16
+ import { getUserAgent } from './version.js';
17
+ import { REFRESH_TOKEN_IRRECOVERABLE, TOKEN_RETRY_CODES, NeedAuthorizationError } from './api-error.js';
18
+ const log = logger('uat-client');
19
+ // Re-export for backward compatibility
20
+ export { NeedAuthorizationError };
21
+ // ---------------------------------------------------------------------------
22
+ // HTTP helper
23
+ // ---------------------------------------------------------------------------
24
+ /**
25
+ * Header-aware fetch for Lark API calls.
26
+ */
27
+ function larkFetch(url, init) {
28
+ const headers = {
29
+ ...init?.headers,
30
+ 'User-Agent': getUserAgent(),
31
+ };
32
+ return fetch(url, { ...init, headers });
33
+ }
34
+ // ---------------------------------------------------------------------------
35
+ // Per-user refresh lock
36
+ // ---------------------------------------------------------------------------
37
+ /**
38
+ * Guards against concurrent refresh operations for the same user.
39
+ *
40
+ * refresh_token is single-use: if two requests trigger a refresh
41
+ * simultaneously, the second one would use an already-consumed token and
42
+ * fail. The lock ensures only one refresh runs at a time per user.
43
+ */
44
+ const refreshLocks = new Map();
45
+ // ---------------------------------------------------------------------------
46
+ // Refresh implementation
47
+ // ---------------------------------------------------------------------------
48
+ async function doRefreshToken(opts, stored) {
49
+ // refresh_token already expired → can't refresh, need re-auth.
50
+ if (Date.now() >= stored.refreshExpiresAt) {
51
+ log.info(`refresh_token expired for ${opts.userOpenId}, clearing`);
52
+ await removeStoredToken(opts.appId, opts.userOpenId);
53
+ return null;
54
+ }
55
+ const endpoints = resolveOAuthEndpoints(opts.domain);
56
+ const resp = await larkFetch(endpoints.token, {
57
+ method: 'POST',
58
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
59
+ body: new URLSearchParams({
60
+ grant_type: 'refresh_token',
61
+ refresh_token: stored.refreshToken,
62
+ client_id: opts.appId,
63
+ client_secret: opts.appSecret,
64
+ }).toString(),
65
+ });
66
+ const data = (await resp.json());
67
+ // Lark v2 token endpoint returns `code: 0` on success.
68
+ // Some responses use `error` field instead (standard OAuth).
69
+ const code = data.code;
70
+ const error = data.error;
71
+ if ((code !== undefined && code !== 0) || error) {
72
+ const errCode = code ?? error;
73
+ const errMsg = data.error_description ?? data.msg ?? 'unknown';
74
+ // Known irrecoverable codes: invalid/expired/missing refresh_token
75
+ if (REFRESH_TOKEN_IRRECOVERABLE.has(code)) {
76
+ log.warn(`refresh failed (code=${errCode}), clearing token for ${opts.userOpenId}`);
77
+ await removeStoredToken(opts.appId, opts.userOpenId);
78
+ return null;
79
+ }
80
+ throw new Error(`Token refresh failed (code=${errCode}): ${errMsg}`);
81
+ }
82
+ if (!data.access_token) {
83
+ throw new Error('Token refresh returned no access_token');
84
+ }
85
+ const now = Date.now();
86
+ const updated = {
87
+ userOpenId: stored.userOpenId,
88
+ appId: opts.appId,
89
+ accessToken: data.access_token,
90
+ // refresh_token is rotated – always use the new one.
91
+ refreshToken: data.refresh_token ?? stored.refreshToken,
92
+ expiresAt: now + (data.expires_in ?? 7200) * 1000,
93
+ refreshExpiresAt: data.refresh_token_expires_in
94
+ ? now + data.refresh_token_expires_in * 1000
95
+ : stored.refreshExpiresAt,
96
+ scope: data.scope ?? stored.scope,
97
+ grantedAt: stored.grantedAt,
98
+ };
99
+ await setStoredToken(updated);
100
+ log.info(`refreshed UAT for ${opts.userOpenId} (at:${maskToken(updated.accessToken)})`);
101
+ return updated;
102
+ }
103
+ /**
104
+ * Refresh with per-user locking.
105
+ */
106
+ async function refreshWithLock(opts, stored) {
107
+ const key = `${opts.appId}:${opts.userOpenId}`;
108
+ // Another refresh is already in-flight – wait for it and re-read.
109
+ const existing = refreshLocks.get(key);
110
+ if (existing) {
111
+ await existing;
112
+ return getStoredToken(opts.appId, opts.userOpenId);
113
+ }
114
+ const promise = doRefreshToken(opts, stored);
115
+ refreshLocks.set(key, promise);
116
+ try {
117
+ return await promise;
118
+ }
119
+ finally {
120
+ refreshLocks.delete(key);
121
+ }
122
+ }
123
+ // ---------------------------------------------------------------------------
124
+ // Public API
125
+ // ---------------------------------------------------------------------------
126
+ /**
127
+ * Obtain a valid access_token for the given user.
128
+ *
129
+ * - Reads from storage.
130
+ * - Refreshes proactively if the token is about to expire.
131
+ * - Throws when no token exists or refresh fails irrecoverably.
132
+ *
133
+ * The returned token must never be exposed to the AI layer.
134
+ */
135
+ export async function getValidAccessToken(opts) {
136
+ const stored = await getStoredToken(opts.appId, opts.userOpenId);
137
+ if (!stored) {
138
+ throw new NeedAuthorizationError(opts.userOpenId);
139
+ }
140
+ const status = tokenStatus(stored);
141
+ if (status === 'valid') {
142
+ return stored.accessToken;
143
+ }
144
+ if (status === 'needs_refresh') {
145
+ const refreshed = await refreshWithLock(opts, stored);
146
+ if (!refreshed) {
147
+ throw new NeedAuthorizationError(opts.userOpenId);
148
+ }
149
+ return refreshed.accessToken;
150
+ }
151
+ // expired
152
+ await removeStoredToken(opts.appId, opts.userOpenId);
153
+ throw new NeedAuthorizationError(opts.userOpenId);
154
+ }
155
+ /**
156
+ * Execute an API call with a valid UAT, retrying once on token-expiry errors.
157
+ */
158
+ export async function callWithUAT(opts, apiCall) {
159
+ const accessToken = await getValidAccessToken(opts);
160
+ try {
161
+ return await apiCall(accessToken);
162
+ }
163
+ catch (err) {
164
+ // Retry once if the server reports token invalid/expired.
165
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
166
+ const code = err?.code ?? err?.response?.data?.code;
167
+ if (TOKEN_RETRY_CODES.has(code)) {
168
+ log.warn(`API call failed (code=${code}), refreshing and retrying`);
169
+ const stored = await getStoredToken(opts.appId, opts.userOpenId);
170
+ if (!stored)
171
+ throw new NeedAuthorizationError(opts.userOpenId);
172
+ const refreshed = await refreshWithLock(opts, stored);
173
+ if (!refreshed)
174
+ throw new NeedAuthorizationError(opts.userOpenId);
175
+ return await apiCall(refreshed.accessToken);
176
+ }
177
+ throw err;
178
+ }
179
+ }
180
+ /**
181
+ * Get the current UAT status for a user.
182
+ */
183
+ export async function getUATStatus(opts) {
184
+ const stored = await getStoredToken(opts.appId, opts.userOpenId);
185
+ if (!stored) {
186
+ return {
187
+ authorized: false,
188
+ userOpenId: opts.userOpenId,
189
+ };
190
+ }
191
+ const status = tokenStatus(stored);
192
+ return {
193
+ authorized: status !== 'expired',
194
+ userOpenId: opts.userOpenId,
195
+ scope: stored.scope,
196
+ expiresAt: stored.expiresAt,
197
+ refreshExpiresAt: stored.refreshExpiresAt,
198
+ grantedAt: stored.grantedAt,
199
+ tokenStatus: status,
200
+ };
201
+ }
202
+ /**
203
+ * Save a new token from OAuth device flow.
204
+ */
205
+ export async function saveTokenFromDeviceFlow(opts, tokenData) {
206
+ const now = Date.now();
207
+ const stored = {
208
+ userOpenId: opts.userOpenId,
209
+ appId: opts.appId,
210
+ accessToken: tokenData.accessToken,
211
+ refreshToken: tokenData.refreshToken,
212
+ expiresAt: now + tokenData.expiresIn * 1000,
213
+ refreshExpiresAt: now + tokenData.refreshExpiresIn * 1000,
214
+ scope: tokenData.scope,
215
+ grantedAt: now,
216
+ };
217
+ await setStoredToken(stored);
218
+ return stored;
219
+ }
220
+ /**
221
+ * Revoke a user's UAT by removing it from storage.
222
+ */
223
+ export async function revokeUAT(appId, userOpenId) {
224
+ await removeStoredToken(appId, userOpenId);
225
+ log.info(`revoked UAT for ${userOpenId}`);
226
+ }
227
+ //# sourceMappingURL=uat-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uat-client.js","sourceRoot":"","sources":["../../src/core/uat-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * Version management for cc-lark MCP Server.
6
+ *
7
+ * Reads version from package.json and generates User-Agent string.
8
+ */
9
+ /**
10
+ * Get the package version from package.json.
11
+ *
12
+ * @returns Version string (e.g., "0.1.0") or "unknown" if read fails
13
+ */
14
+ export declare function getPackageVersion(): string;
15
+ /**
16
+ * Generate User-Agent string for HTTP requests.
17
+ *
18
+ * @returns User-Agent string (e.g., "cc-lark/0.1.0")
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * getUserAgent() // => "cc-lark/0.1.0"
23
+ * ```
24
+ */
25
+ export declare function getUserAgent(): string;
26
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/core/version.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAiB1C;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC"}