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,159 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * feishu_create_doc tool - Create a new docx document from Markdown.
6
+ *
7
+ * Creates a new Feishu document from Markdown content.
8
+ * Supports async task status checking via task_id.
9
+ *
10
+ * Adapted from openclaw-lark for MCP Server architecture.
11
+ */
12
+ import { z } from 'zod';
13
+ import { getValidAccessToken, NeedAuthorizationError } from '../../core/uat-client.js';
14
+ import { callMcpTool, jsonError, processMcpResult } from './shared.js';
15
+ import { logger } from '../../utils/logger.js';
16
+ const log = logger('tools:doc:create');
17
+ // ---------------------------------------------------------------------------
18
+ // Input schema
19
+ // ---------------------------------------------------------------------------
20
+ const createDocSchema = {
21
+ markdown: z.string().optional().describe('Markdown content for the document'),
22
+ title: z.string().optional().describe('Document title'),
23
+ folder_token: z.string().optional().describe('Parent folder token (optional)'),
24
+ wiki_node: z
25
+ .string()
26
+ .optional()
27
+ .describe('Wiki node token or URL (optional, creates document under this node)'),
28
+ wiki_space: z.string().optional().describe('Wiki space ID (optional, special value: my_library)'),
29
+ task_id: z
30
+ .string()
31
+ .optional()
32
+ .describe('Async task ID. If provided, queries task status instead of creating a new document'),
33
+ };
34
+ // ---------------------------------------------------------------------------
35
+ // Validation
36
+ // ---------------------------------------------------------------------------
37
+ function validateCreateDocParams(p) {
38
+ // If task_id is provided, we're just querying status
39
+ if (p.task_id)
40
+ return;
41
+ // For creating new doc, markdown and title are required
42
+ if (!p.markdown || !p.title) {
43
+ throw new Error('create-doc: When not providing task_id, markdown and title are required');
44
+ }
45
+ // Only one of folder_token, wiki_node, wiki_space can be provided
46
+ const flags = [p.folder_token, p.wiki_node, p.wiki_space].filter(Boolean);
47
+ if (flags.length > 1) {
48
+ throw new Error('create-doc: folder_token / wiki_node / wiki_space are mutually exclusive, provide only one');
49
+ }
50
+ }
51
+ // ---------------------------------------------------------------------------
52
+ // Tool registration
53
+ // ---------------------------------------------------------------------------
54
+ /**
55
+ * Register the feishu_create_doc tool.
56
+ */
57
+ export function registerCreateDocTool(registry) {
58
+ registry.register({
59
+ name: 'feishu_create_doc',
60
+ description: [
61
+ 'Create a new Feishu docx document from Markdown content.',
62
+ '',
63
+ 'Usage:',
64
+ '- Provide markdown and title to create a new document',
65
+ '- Provide task_id to check async task status',
66
+ '- Optionally specify folder_token, wiki_node, or wiki_space for document location',
67
+ '',
68
+ 'Parameters:',
69
+ '- markdown: Markdown content for the document (required for new doc)',
70
+ '- title: Document title (required for new doc)',
71
+ '- folder_token: Parent folder token (optional)',
72
+ '- wiki_node: Wiki node token or URL (optional)',
73
+ '- wiki_space: Wiki space ID (optional)',
74
+ '- task_id: Async task ID for status check (optional)',
75
+ '',
76
+ 'Returns:',
77
+ '- For new doc: { task_id, doc_id } or completed document info',
78
+ '- For task_id query: { status, result? }',
79
+ '',
80
+ 'Requires OAuth authorization (use feishu_oauth tool first).',
81
+ ].join('\n'),
82
+ inputSchema: createDocSchema,
83
+ handler: async (args, context) => {
84
+ return handleCreateDoc(args, context);
85
+ },
86
+ });
87
+ log.debug('feishu_create_doc tool registered');
88
+ }
89
+ // ---------------------------------------------------------------------------
90
+ // Handler
91
+ // ---------------------------------------------------------------------------
92
+ async function handleCreateDoc(args, context) {
93
+ const p = args;
94
+ const { larkClient, config } = context;
95
+ if (!larkClient) {
96
+ return jsonError('LarkClient not initialized. Check FEISHU_APP_ID and FEISHU_APP_SECRET.');
97
+ }
98
+ const { appId, appSecret, brand } = config;
99
+ if (!appId || !appSecret) {
100
+ return jsonError('Missing FEISHU_APP_ID or FEISHU_APP_SECRET.');
101
+ }
102
+ // Validate parameters
103
+ try {
104
+ validateCreateDocParams(p);
105
+ }
106
+ catch (err) {
107
+ return jsonError(err instanceof Error ? err.message : String(err));
108
+ }
109
+ // Get the first stored user token
110
+ const { listStoredTokens } = await import('../../core/token-store.js');
111
+ const tokens = await listStoredTokens(appId);
112
+ if (tokens.length === 0) {
113
+ return jsonError('No user authorization found. Please use the feishu_oauth tool with action="authorize" to authorize a user first.');
114
+ }
115
+ const userOpenId = tokens[0].userOpenId;
116
+ try {
117
+ const accessToken = await getValidAccessToken({
118
+ userOpenId,
119
+ appId,
120
+ appSecret,
121
+ domain: brand ?? 'feishu',
122
+ });
123
+ log.info('Creating document', {
124
+ title: p.title,
125
+ has_markdown: !!p.markdown,
126
+ folder_token: p.folder_token,
127
+ wiki_node: p.wiki_node,
128
+ task_id: p.task_id,
129
+ });
130
+ // Build MCP tool arguments
131
+ const mcpArgs = {};
132
+ if (p.markdown)
133
+ mcpArgs.markdown = p.markdown;
134
+ if (p.title)
135
+ mcpArgs.title = p.title;
136
+ if (p.folder_token)
137
+ mcpArgs.folder_token = p.folder_token;
138
+ if (p.wiki_node)
139
+ mcpArgs.wiki_node = p.wiki_node;
140
+ if (p.wiki_space)
141
+ mcpArgs.wiki_space = p.wiki_space;
142
+ if (p.task_id)
143
+ mcpArgs.task_id = p.task_id;
144
+ // Generate a unique tool call ID
145
+ const toolCallId = `create-doc-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
146
+ // Call the MCP endpoint
147
+ const result = await callMcpTool('create-doc', mcpArgs, toolCallId, accessToken);
148
+ log.info('Document created/task queried', { result });
149
+ return processMcpResult(result);
150
+ }
151
+ catch (err) {
152
+ if (err instanceof NeedAuthorizationError) {
153
+ return jsonError(`User authorization required or expired. Please use feishu_oauth tool with action="authorize" to re-authorize.`, { userOpenId });
154
+ }
155
+ log.error('Create document failed', { error: err instanceof Error ? err.message : String(err) });
156
+ return jsonError(err instanceof Error ? err.message : String(err));
157
+ }
158
+ }
159
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/tools/doc/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * feishu_fetch_doc tool - Get document content.
6
+ *
7
+ * Fetches Feishu document content, returning title and Markdown content.
8
+ * Supports pagination for large documents.
9
+ *
10
+ * Adapted from openclaw-lark for MCP Server architecture.
11
+ */
12
+ import type { ToolRegistry } from '../index.js';
13
+ /**
14
+ * Register the feishu_fetch_doc tool.
15
+ */
16
+ export declare function registerFetchDocTool(registry: ToolRegistry): void;
17
+ //# sourceMappingURL=fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../src/tools/doc/fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAgChD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CA2BjE"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * feishu_fetch_doc tool - Get document content.
6
+ *
7
+ * Fetches Feishu document content, returning title and Markdown content.
8
+ * Supports pagination for large documents.
9
+ *
10
+ * Adapted from openclaw-lark for MCP Server architecture.
11
+ */
12
+ import { z } from 'zod';
13
+ import { getValidAccessToken, NeedAuthorizationError } from '../../core/uat-client.js';
14
+ import { callMcpTool, jsonError, processMcpResult } from './shared.js';
15
+ import { logger } from '../../utils/logger.js';
16
+ const log = logger('tools:doc:fetch');
17
+ // ---------------------------------------------------------------------------
18
+ // Input schema
19
+ // ---------------------------------------------------------------------------
20
+ const fetchDocSchema = {
21
+ doc_id: z.string().describe('Document ID or URL (supports auto-parsing)'),
22
+ offset: z
23
+ .number()
24
+ .int()
25
+ .min(0)
26
+ .optional()
27
+ .describe('Character offset (optional, default 0). Use for paginating large documents.'),
28
+ limit: z
29
+ .number()
30
+ .int()
31
+ .min(1)
32
+ .optional()
33
+ .describe('Maximum characters to return (optional). Use only when pagination is requested.'),
34
+ };
35
+ // ---------------------------------------------------------------------------
36
+ // Tool registration
37
+ // ---------------------------------------------------------------------------
38
+ /**
39
+ * Register the feishu_fetch_doc tool.
40
+ */
41
+ export function registerFetchDocTool(registry) {
42
+ registry.register({
43
+ name: 'feishu_fetch_doc',
44
+ description: [
45
+ 'Fetch Feishu document content, returning title and Markdown format.',
46
+ '',
47
+ 'Usage:',
48
+ '- Provide doc_id (document ID or full URL)',
49
+ '- Use offset and limit for paginating large documents',
50
+ '',
51
+ 'Parameters:',
52
+ '- doc_id: Document ID or URL (required)',
53
+ '- offset: Character offset for pagination (optional, default 0)',
54
+ '- limit: Maximum characters to return (optional)',
55
+ '',
56
+ 'Returns:',
57
+ '- { title, content, has_more? } where content is Markdown text',
58
+ '',
59
+ 'Requires OAuth authorization (use feishu_oauth tool first).',
60
+ ].join('\n'),
61
+ inputSchema: fetchDocSchema,
62
+ handler: async (args, context) => {
63
+ return handleFetchDoc(args, context);
64
+ },
65
+ });
66
+ log.debug('feishu_fetch_doc tool registered');
67
+ }
68
+ // ---------------------------------------------------------------------------
69
+ // Handler
70
+ // ---------------------------------------------------------------------------
71
+ async function handleFetchDoc(args, context) {
72
+ const p = args;
73
+ const { larkClient, config } = context;
74
+ if (!larkClient) {
75
+ return jsonError('LarkClient not initialized. Check FEISHU_APP_ID and FEISHU_APP_SECRET.');
76
+ }
77
+ const { appId, appSecret, brand } = config;
78
+ if (!appId || !appSecret) {
79
+ return jsonError('Missing FEISHU_APP_ID or FEISHU_APP_SECRET.');
80
+ }
81
+ // Get the first stored user token
82
+ const { listStoredTokens } = await import('../../core/token-store.js');
83
+ const tokens = await listStoredTokens(appId);
84
+ if (tokens.length === 0) {
85
+ return jsonError('No user authorization found. Please use the feishu_oauth tool with action="authorize" to authorize a user first.');
86
+ }
87
+ const userOpenId = tokens[0].userOpenId;
88
+ try {
89
+ const accessToken = await getValidAccessToken({
90
+ userOpenId,
91
+ appId,
92
+ appSecret,
93
+ domain: brand ?? 'feishu',
94
+ });
95
+ log.info('Fetching document', {
96
+ doc_id: p.doc_id,
97
+ offset: p.offset,
98
+ limit: p.limit,
99
+ });
100
+ // Build MCP tool arguments
101
+ const mcpArgs = {
102
+ doc_id: p.doc_id,
103
+ };
104
+ if (p.offset !== undefined)
105
+ mcpArgs.offset = p.offset;
106
+ if (p.limit !== undefined)
107
+ mcpArgs.limit = p.limit;
108
+ // Generate a unique tool call ID
109
+ const toolCallId = `fetch-doc-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
110
+ // Call the MCP endpoint
111
+ const result = await callMcpTool('fetch-doc', mcpArgs, toolCallId, accessToken);
112
+ log.info('Document fetched');
113
+ return processMcpResult(result);
114
+ }
115
+ catch (err) {
116
+ if (err instanceof NeedAuthorizationError) {
117
+ return jsonError(`User authorization required or expired. Please use feishu_oauth tool with action="authorize" to re-authorize.`, { userOpenId });
118
+ }
119
+ log.error('Fetch document failed', { error: err instanceof Error ? err.message : String(err) });
120
+ return jsonError(err instanceof Error ? err.message : String(err));
121
+ }
122
+ }
123
+ //# sourceMappingURL=fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../src/tools/doc/fetch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * Doc Tools Index
6
+ *
7
+ * Document tools for Feishu/Lark.
8
+ * Adapted from openclaw-lark for MCP Server architecture.
9
+ *
10
+ * Tools:
11
+ * - feishu_create_doc: Create new docx document from Markdown
12
+ * - feishu_fetch_doc: Get document content
13
+ * - feishu_update_doc: Update document content
14
+ */
15
+ import type { ToolRegistry } from '../index.js';
16
+ export * from './shared.js';
17
+ /**
18
+ * Register all Doc tools with the given registry.
19
+ */
20
+ export declare function registerDocTools(registry: ToolRegistry): void;
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/doc/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAShD,cAAc,aAAa,CAAC;AAE5B;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAQ7D"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * Doc Tools Index
6
+ *
7
+ * Document tools for Feishu/Lark.
8
+ * Adapted from openclaw-lark for MCP Server architecture.
9
+ *
10
+ * Tools:
11
+ * - feishu_create_doc: Create new docx document from Markdown
12
+ * - feishu_fetch_doc: Get document content
13
+ * - feishu_update_doc: Update document content
14
+ */
15
+ import { registerCreateDocTool } from './create.js';
16
+ import { registerFetchDocTool } from './fetch.js';
17
+ import { registerUpdateDocTool } from './update.js';
18
+ import { logger } from '../../utils/logger.js';
19
+ const log = logger('tools:doc');
20
+ // Re-export submodules for external use
21
+ export * from './shared.js';
22
+ /**
23
+ * Register all Doc tools with the given registry.
24
+ */
25
+ export function registerDocTools(registry) {
26
+ registerCreateDocTool(registry);
27
+ registerFetchDocTool(registry);
28
+ registerUpdateDocTool(registry);
29
+ log.info('Doc tools registered', {
30
+ tools: ['feishu_create_doc', 'feishu_fetch_doc', 'feishu_update_doc'].join(', '),
31
+ });
32
+ }
33
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/doc/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAEhC,wCAAwC;AACxC,cAAc,aAAa,CAAC;AAE5B;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAsB;IACrD,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAChC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC/B,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAEhC,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE;QAC/B,KAAK,EAAE,CAAC,mBAAmB,EAAE,kBAAkB,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;KACjF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * Shared utilities for Doc tools.
6
+ *
7
+ * Adapted from openclaw-lark for MCP Server architecture.
8
+ * - Removed OpenClaw runtime dependencies
9
+ * - Uses direct MCP endpoint calls with user access token
10
+ */
11
+ /** MCP JSON-RPC success response */
12
+ export interface McpRpcSuccess {
13
+ jsonrpc: '2.0';
14
+ id: number | string;
15
+ result: unknown;
16
+ }
17
+ /** MCP JSON-RPC error response */
18
+ export interface McpRpcError {
19
+ jsonrpc: '2.0';
20
+ id: number | string | null;
21
+ error: {
22
+ code: number;
23
+ message: string;
24
+ data?: unknown;
25
+ };
26
+ }
27
+ export type McpRpcResponse = McpRpcSuccess | McpRpcError;
28
+ /** Tool result type that matches MCP SDK expectations. */
29
+ export type ToolResult = {
30
+ content: Array<{
31
+ type: 'text';
32
+ text: string;
33
+ }>;
34
+ isError?: boolean;
35
+ };
36
+ /**
37
+ * Get the MCP endpoint URL.
38
+ * Priority: FEISHU_MCP_ENDPOINT env var > default
39
+ */
40
+ export declare function getMcpEndpoint(): string;
41
+ /**
42
+ * Recursively unwrap JSON-RPC result envelopes.
43
+ * Some MCP gateways wrap the result in additional JSON-RPC envelopes.
44
+ */
45
+ export declare function unwrapJsonRpcResult(v: unknown): unknown;
46
+ /**
47
+ * Call an MCP tool on the Feishu MCP endpoint.
48
+ *
49
+ * @param name - MCP tool name (e.g., 'create-doc', 'fetch-doc')
50
+ * @param args - Tool arguments
51
+ * @param toolCallId - Unique ID for this tool call
52
+ * @param uat - User access token
53
+ * @returns Tool result
54
+ */
55
+ export declare function callMcpTool(name: string, args: Record<string, unknown>, toolCallId: string, uat: string): Promise<unknown>;
56
+ /**
57
+ * Format a successful tool result.
58
+ */
59
+ export declare function json(data: unknown): ToolResult;
60
+ /**
61
+ * Format an error tool result.
62
+ */
63
+ export declare function jsonError(message: string, details?: unknown): ToolResult;
64
+ /**
65
+ * Process MCP tool result into MCP content format.
66
+ * Handles the { content: [{ type, text }] } format from MCP tools/call.
67
+ */
68
+ export declare function processMcpResult(result: unknown): ToolResult;
69
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/tools/doc/shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH,oCAAoC;AACpC,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,kCAAkC;AAClC,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC1D;AAED,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,WAAW,CAAC;AAEzD,0DAA0D;AAC1D,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AASF;;;GAGG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAuBD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAyBvD;AAMD;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,OAAO,CAAC,CA+ClB;AAMD;;GAEG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,CAI9C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,UAAU,CAKxE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,UAAU,CAwB5D"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * Shared utilities for Doc tools.
6
+ *
7
+ * Adapted from openclaw-lark for MCP Server architecture.
8
+ * - Removed OpenClaw runtime dependencies
9
+ * - Uses direct MCP endpoint calls with user access token
10
+ */
11
+ import { logger } from '../../utils/logger.js';
12
+ import { getUserAgent } from '../../core/version.js';
13
+ const log = logger('tools:doc:shared');
14
+ // ---------------------------------------------------------------------------
15
+ // MCP endpoint configuration
16
+ // ---------------------------------------------------------------------------
17
+ /** Default MCP endpoint for Feishu */
18
+ const DEFAULT_MCP_ENDPOINT = 'https://mcp.feishu.cn/mcp';
19
+ /**
20
+ * Get the MCP endpoint URL.
21
+ * Priority: FEISHU_MCP_ENDPOINT env var > default
22
+ */
23
+ export function getMcpEndpoint() {
24
+ return process.env.FEISHU_MCP_ENDPOINT?.trim() || DEFAULT_MCP_ENDPOINT;
25
+ }
26
+ /**
27
+ * Build authorization header for MCP requests.
28
+ */
29
+ function buildAuthHeader() {
30
+ const token = process.env.FEISHU_MCP_BEARER_TOKEN?.trim() || process.env.FEISHU_MCP_TOKEN?.trim();
31
+ if (!token)
32
+ return undefined;
33
+ return token.toLowerCase().startsWith('bearer ') ? token : `Bearer ${token}`;
34
+ }
35
+ // ---------------------------------------------------------------------------
36
+ // JSON-RPC utilities
37
+ // ---------------------------------------------------------------------------
38
+ /**
39
+ * Check if a value is a plain object (not null, not array).
40
+ */
41
+ function isRecord(v) {
42
+ return typeof v === 'object' && v !== null;
43
+ }
44
+ /**
45
+ * Recursively unwrap JSON-RPC result envelopes.
46
+ * Some MCP gateways wrap the result in additional JSON-RPC envelopes.
47
+ */
48
+ export function unwrapJsonRpcResult(v) {
49
+ if (!isRecord(v))
50
+ return v;
51
+ const hasJsonRpc = typeof v.jsonrpc === 'string';
52
+ const hasId = 'id' in v;
53
+ const hasResult = 'result' in v;
54
+ const hasError = 'error' in v;
55
+ if (hasJsonRpc && (hasResult || hasError)) {
56
+ if (hasError) {
57
+ const err = v.error;
58
+ if (isRecord(err) && typeof err.message === 'string') {
59
+ throw new Error(err.message);
60
+ }
61
+ throw new Error('MCP returned error, but could not parse message');
62
+ }
63
+ return unwrapJsonRpcResult(v.result);
64
+ }
65
+ // Some implementations wrap without jsonrpc field
66
+ if (!hasJsonRpc && !hasId && hasResult && !hasError) {
67
+ return unwrapJsonRpcResult(v.result);
68
+ }
69
+ return v;
70
+ }
71
+ // ---------------------------------------------------------------------------
72
+ // MCP client
73
+ // ---------------------------------------------------------------------------
74
+ /**
75
+ * Call an MCP tool on the Feishu MCP endpoint.
76
+ *
77
+ * @param name - MCP tool name (e.g., 'create-doc', 'fetch-doc')
78
+ * @param args - Tool arguments
79
+ * @param toolCallId - Unique ID for this tool call
80
+ * @param uat - User access token
81
+ * @returns Tool result
82
+ */
83
+ export async function callMcpTool(name, args, toolCallId, uat) {
84
+ const endpoint = getMcpEndpoint();
85
+ const auth = buildAuthHeader();
86
+ const body = {
87
+ jsonrpc: '2.0',
88
+ id: toolCallId,
89
+ method: 'tools/call',
90
+ params: {
91
+ name,
92
+ arguments: args,
93
+ },
94
+ };
95
+ const headers = {
96
+ 'Content-Type': 'application/json',
97
+ 'X-Lark-MCP-UAT': uat,
98
+ 'X-Lark-MCP-Allowed-Tools': name,
99
+ 'User-Agent': getUserAgent(),
100
+ };
101
+ if (auth)
102
+ headers.authorization = auth;
103
+ log.debug(`Calling MCP tool: ${name}`, { toolCallId, endpoint });
104
+ const res = await fetch(endpoint, {
105
+ method: 'POST',
106
+ headers,
107
+ body: JSON.stringify(body),
108
+ });
109
+ const text = await res.text();
110
+ if (!res.ok) {
111
+ throw new Error(`MCP HTTP ${res.status} ${res.statusText}: ${text.slice(0, 4000)}`);
112
+ }
113
+ let data;
114
+ try {
115
+ data = JSON.parse(text);
116
+ }
117
+ catch {
118
+ throw new Error(`MCP returned non-JSON: ${text.slice(0, 4000)}`);
119
+ }
120
+ if ('error' in data) {
121
+ throw new Error(`MCP error ${data.error.code}: ${data.error.message}`);
122
+ }
123
+ return unwrapJsonRpcResult(data.result);
124
+ }
125
+ // ---------------------------------------------------------------------------
126
+ // Result formatting
127
+ // ---------------------------------------------------------------------------
128
+ /**
129
+ * Format a successful tool result.
130
+ */
131
+ export function json(data) {
132
+ return {
133
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
134
+ };
135
+ }
136
+ /**
137
+ * Format an error tool result.
138
+ */
139
+ export function jsonError(message, details) {
140
+ return {
141
+ content: [{ type: 'text', text: JSON.stringify({ error: message, details }, null, 2) }],
142
+ isError: true,
143
+ };
144
+ }
145
+ /**
146
+ * Process MCP tool result into MCP content format.
147
+ * Handles the { content: [{ type, text }] } format from MCP tools/call.
148
+ */
149
+ export function processMcpResult(result) {
150
+ // MCP tools/call returns { content: [{ type, text }] } format
151
+ // Extract the text content and parse if JSON
152
+ if (isRecord(result) && Array.isArray(result.content)) {
153
+ const mcpContent = result.content;
154
+ let details = result;
155
+ if (mcpContent.length === 1 && mcpContent[0]?.type === 'text') {
156
+ try {
157
+ details = JSON.parse(mcpContent[0].text);
158
+ }
159
+ catch {
160
+ // text is not JSON, keep original result
161
+ }
162
+ }
163
+ return {
164
+ content: mcpContent.map((c) => ({
165
+ type: 'text',
166
+ text: c.text,
167
+ })),
168
+ };
169
+ }
170
+ return json(result);
171
+ }
172
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/tools/doc/shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ *
5
+ * feishu_update_doc tool - Update document content.
6
+ *
7
+ * Updates Feishu document with various modes:
8
+ * - overwrite: Replace entire document
9
+ * - append: Add content at the end
10
+ * - replace_range: Replace a selected range
11
+ * - replace_all: Replace all occurrences of text
12
+ * - insert_before: Insert content before a selection
13
+ * - insert_after: Insert content after a selection
14
+ * - delete_range: Delete a selected range
15
+ *
16
+ * Supports async task status checking via task_id.
17
+ *
18
+ * Adapted from openclaw-lark for MCP Server architecture.
19
+ */
20
+ import type { ToolRegistry } from '../index.js';
21
+ /**
22
+ * Register the feishu_update_doc tool.
23
+ */
24
+ export declare function registerUpdateDocTool(registry: ToolRegistry): void;
25
+ //# sourceMappingURL=update.d.ts.map