@openclaw-cn/feishu 0.1.8

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 (167) hide show
  1. package/README.md +86 -0
  2. package/dist/index.d.ts +37 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +49 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/src/accounts.d.ts +33 -0
  7. package/dist/src/accounts.d.ts.map +1 -0
  8. package/dist/src/accounts.js +110 -0
  9. package/dist/src/accounts.js.map +1 -0
  10. package/dist/src/bitable.d.ts +211 -0
  11. package/dist/src/bitable.d.ts.map +1 -0
  12. package/dist/src/bitable.js +721 -0
  13. package/dist/src/bitable.js.map +1 -0
  14. package/dist/src/bot.d.ts +53 -0
  15. package/dist/src/bot.d.ts.map +1 -0
  16. package/dist/src/bot.js +853 -0
  17. package/dist/src/bot.js.map +1 -0
  18. package/dist/src/calendar-schema.d.ts +18 -0
  19. package/dist/src/calendar-schema.d.ts.map +1 -0
  20. package/dist/src/calendar-schema.js +52 -0
  21. package/dist/src/calendar-schema.js.map +1 -0
  22. package/dist/src/calendar.d.ts +441 -0
  23. package/dist/src/calendar.d.ts.map +1 -0
  24. package/dist/src/calendar.js +257 -0
  25. package/dist/src/calendar.js.map +1 -0
  26. package/dist/src/channel.d.ts +4 -0
  27. package/dist/src/channel.d.ts.map +1 -0
  28. package/dist/src/channel.js +331 -0
  29. package/dist/src/channel.js.map +1 -0
  30. package/dist/src/client.d.ts +35 -0
  31. package/dist/src/client.d.ts.map +1 -0
  32. package/dist/src/client.js +86 -0
  33. package/dist/src/client.js.map +1 -0
  34. package/dist/src/config-schema.d.ts +176 -0
  35. package/dist/src/config-schema.d.ts.map +1 -0
  36. package/dist/src/config-schema.js +56 -0
  37. package/dist/src/config-schema.js.map +1 -0
  38. package/dist/src/directory.d.ts +36 -0
  39. package/dist/src/directory.d.ts.map +1 -0
  40. package/dist/src/directory.js +129 -0
  41. package/dist/src/directory.js.map +1 -0
  42. package/dist/src/doc-schema.d.ts +37 -0
  43. package/dist/src/doc-schema.d.ts.map +1 -0
  44. package/dist/src/doc-schema.js +51 -0
  45. package/dist/src/doc-schema.js.map +1 -0
  46. package/dist/src/docx.d.ts +3 -0
  47. package/dist/src/docx.d.ts.map +1 -0
  48. package/dist/src/docx.js +608 -0
  49. package/dist/src/docx.js.map +1 -0
  50. package/dist/src/drive-schema.d.ts +24 -0
  51. package/dist/src/drive-schema.d.ts.map +1 -0
  52. package/dist/src/drive-schema.js +39 -0
  53. package/dist/src/drive-schema.js.map +1 -0
  54. package/dist/src/drive.d.ts +3 -0
  55. package/dist/src/drive.d.ts.map +1 -0
  56. package/dist/src/drive.js +181 -0
  57. package/dist/src/drive.js.map +1 -0
  58. package/dist/src/dynamic-agent.d.ts +19 -0
  59. package/dist/src/dynamic-agent.d.ts.map +1 -0
  60. package/dist/src/dynamic-agent.js +91 -0
  61. package/dist/src/dynamic-agent.js.map +1 -0
  62. package/dist/src/im-schema.d.ts +38 -0
  63. package/dist/src/im-schema.d.ts.map +1 -0
  64. package/dist/src/im-schema.js +73 -0
  65. package/dist/src/im-schema.js.map +1 -0
  66. package/dist/src/im.d.ts +70 -0
  67. package/dist/src/im.d.ts.map +1 -0
  68. package/dist/src/im.js +328 -0
  69. package/dist/src/im.js.map +1 -0
  70. package/dist/src/media.d.ts +99 -0
  71. package/dist/src/media.d.ts.map +1 -0
  72. package/dist/src/media.js +454 -0
  73. package/dist/src/media.js.map +1 -0
  74. package/dist/src/mention.d.ts +49 -0
  75. package/dist/src/mention.d.ts.map +1 -0
  76. package/dist/src/mention.js +99 -0
  77. package/dist/src/mention.js.map +1 -0
  78. package/dist/src/monitor.d.ts +16 -0
  79. package/dist/src/monitor.d.ts.map +1 -0
  80. package/dist/src/monitor.js +288 -0
  81. package/dist/src/monitor.js.map +1 -0
  82. package/dist/src/onboarding.d.ts +3 -0
  83. package/dist/src/onboarding.d.ts.map +1 -0
  84. package/dist/src/onboarding.js +119 -0
  85. package/dist/src/onboarding.js.map +1 -0
  86. package/dist/src/outbound.d.ts +3 -0
  87. package/dist/src/outbound.d.ts.map +1 -0
  88. package/dist/src/outbound.js +53 -0
  89. package/dist/src/outbound.js.map +1 -0
  90. package/dist/src/perm-schema.d.ts +21 -0
  91. package/dist/src/perm-schema.d.ts.map +1 -0
  92. package/dist/src/perm-schema.js +47 -0
  93. package/dist/src/perm-schema.js.map +1 -0
  94. package/dist/src/perm.d.ts +14 -0
  95. package/dist/src/perm.d.ts.map +1 -0
  96. package/dist/src/perm.js +106 -0
  97. package/dist/src/perm.js.map +1 -0
  98. package/dist/src/policy.d.ts +28 -0
  99. package/dist/src/policy.d.ts.map +1 -0
  100. package/dist/src/policy.js +61 -0
  101. package/dist/src/policy.js.map +1 -0
  102. package/dist/src/probe.d.ts +4 -0
  103. package/dist/src/probe.d.ts.map +1 -0
  104. package/dist/src/probe.js +41 -0
  105. package/dist/src/probe.js.map +1 -0
  106. package/dist/src/reactions.d.ts +66 -0
  107. package/dist/src/reactions.d.ts.map +1 -0
  108. package/dist/src/reactions.js +104 -0
  109. package/dist/src/reactions.js.map +1 -0
  110. package/dist/src/reply-dispatcher.d.ts +41 -0
  111. package/dist/src/reply-dispatcher.d.ts.map +1 -0
  112. package/dist/src/reply-dispatcher.js +249 -0
  113. package/dist/src/reply-dispatcher.js.map +1 -0
  114. package/dist/src/runtime.d.ts +4 -0
  115. package/dist/src/runtime.d.ts.map +1 -0
  116. package/dist/src/runtime.js +11 -0
  117. package/dist/src/runtime.js.map +1 -0
  118. package/dist/src/send.d.ts +76 -0
  119. package/dist/src/send.d.ts.map +1 -0
  120. package/dist/src/send.js +250 -0
  121. package/dist/src/send.js.map +1 -0
  122. package/dist/src/sheets-schema.d.ts +12 -0
  123. package/dist/src/sheets-schema.d.ts.map +1 -0
  124. package/dist/src/sheets-schema.js +35 -0
  125. package/dist/src/sheets-schema.js.map +1 -0
  126. package/dist/src/sheets.d.ts +45 -0
  127. package/dist/src/sheets.d.ts.map +1 -0
  128. package/dist/src/sheets.js +197 -0
  129. package/dist/src/sheets.js.map +1 -0
  130. package/dist/src/streaming-card.d.ts +29 -0
  131. package/dist/src/streaming-card.d.ts.map +1 -0
  132. package/dist/src/streaming-card.js +192 -0
  133. package/dist/src/streaming-card.js.map +1 -0
  134. package/dist/src/targets.d.ts +7 -0
  135. package/dist/src/targets.d.ts.map +1 -0
  136. package/dist/src/targets.js +70 -0
  137. package/dist/src/targets.js.map +1 -0
  138. package/dist/src/task-schema.d.ts +19 -0
  139. package/dist/src/task-schema.d.ts.map +1 -0
  140. package/dist/src/task-schema.js +54 -0
  141. package/dist/src/task-schema.js.map +1 -0
  142. package/dist/src/task.d.ts +1193 -0
  143. package/dist/src/task.d.ts.map +1 -0
  144. package/dist/src/task.js +274 -0
  145. package/dist/src/task.js.map +1 -0
  146. package/dist/src/tools-config.d.ts +12 -0
  147. package/dist/src/tools-config.d.ts.map +1 -0
  148. package/dist/src/tools-config.js +24 -0
  149. package/dist/src/tools-config.js.map +1 -0
  150. package/dist/src/types.d.ts +74 -0
  151. package/dist/src/types.d.ts.map +1 -0
  152. package/dist/src/types.js +2 -0
  153. package/dist/src/types.js.map +1 -0
  154. package/dist/src/typing.d.ts +22 -0
  155. package/dist/src/typing.d.ts.map +1 -0
  156. package/dist/src/typing.js +60 -0
  157. package/dist/src/typing.js.map +1 -0
  158. package/dist/src/wiki-schema.d.ts +34 -0
  159. package/dist/src/wiki-schema.d.ts.map +1 -0
  160. package/dist/src/wiki-schema.js +43 -0
  161. package/dist/src/wiki-schema.js.map +1 -0
  162. package/dist/src/wiki.d.ts +3 -0
  163. package/dist/src/wiki.d.ts.map +1 -0
  164. package/dist/src/wiki.js +176 -0
  165. package/dist/src/wiki.js.map +1 -0
  166. package/openclaw.plugin.json +9 -0
  167. package/package.json +79 -0
@@ -0,0 +1,608 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import { Readable } from "stream";
3
+ import { listEnabledFeishuAccounts } from "./accounts.js";
4
+ import { createFeishuClient } from "./client.js";
5
+ import { FeishuDocSchema } from "./doc-schema.js";
6
+ import { resolveToolsConfig } from "./tools-config.js";
7
+ // ============ Helpers ============
8
+ function json(data) {
9
+ return {
10
+ content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
11
+ details: data,
12
+ };
13
+ }
14
+ /** Extract image URLs from markdown content */
15
+ function extractImageUrls(markdown) {
16
+ const regex = /!\[[^\]]*\]\(([^)]+)\)/g;
17
+ const urls = [];
18
+ let match;
19
+ while ((match = regex.exec(markdown)) !== null) {
20
+ const url = match[1].trim();
21
+ if (url.startsWith("http://") || url.startsWith("https://")) {
22
+ urls.push(url);
23
+ }
24
+ }
25
+ return urls;
26
+ }
27
+ const BLOCK_TYPE_NAMES = {
28
+ 1: "Page",
29
+ 2: "Text",
30
+ 3: "Heading1",
31
+ 4: "Heading2",
32
+ 5: "Heading3",
33
+ 12: "Bullet",
34
+ 13: "Ordered",
35
+ 14: "Code",
36
+ 15: "Quote",
37
+ 17: "Todo",
38
+ 18: "Bitable",
39
+ 21: "Diagram",
40
+ 22: "Divider",
41
+ 23: "File",
42
+ 27: "Image",
43
+ 30: "Sheet",
44
+ 31: "Table",
45
+ 32: "TableCell",
46
+ };
47
+ // Block types that cannot be created via documentBlockChildren.create API
48
+ const UNSUPPORTED_CREATE_TYPES = new Set([31, 32]);
49
+ /** Clean blocks for insertion (remove unsupported types and read-only fields) */
50
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- SDK block types
51
+ function cleanBlocksForInsert(blocks) {
52
+ const skipped = [];
53
+ const cleaned = blocks
54
+ .filter((block) => {
55
+ if (UNSUPPORTED_CREATE_TYPES.has(block.block_type)) {
56
+ const typeName = BLOCK_TYPE_NAMES[block.block_type] || `type_${block.block_type}`;
57
+ skipped.push(typeName);
58
+ return false;
59
+ }
60
+ return true;
61
+ })
62
+ .map((block) => {
63
+ if (block.block_type === 31 && block.table?.merge_info) {
64
+ const { merge_info: _merge_info, ...tableRest } = block.table;
65
+ return { ...block, table: tableRest };
66
+ }
67
+ return block;
68
+ });
69
+ return { cleaned, skipped };
70
+ }
71
+ // ============ Core Functions ============
72
+ /**
73
+ * Convert Markdown to Feishu docx blocks locally (no API call required).
74
+ * Supports: headings (H1-H6), bullet lists, ordered lists, code blocks,
75
+ * blockquotes, horizontal rules, and paragraphs.
76
+ */
77
+ function markdownToBlocks(markdown) {
78
+ const lines = markdown.split("\n");
79
+ const blocks = [];
80
+ let i = 0;
81
+ function makeTextElement(text) {
82
+ // Strip inline markdown: bold, italic, inline code, links
83
+ const cleaned = text
84
+ .replace(/\*\*([^*]+)\*\*/g, "$1")
85
+ .replace(/\*([^*]+)\*/g, "$1")
86
+ .replace(/`([^`]+)`/g, "$1")
87
+ .replace(/\[([^\]]+)\]\([^)]+\)/g, "$1");
88
+ return { content: cleaned };
89
+ }
90
+ function makeTextBlock(blockType, text) {
91
+ // Feishu API block_type → field name mapping
92
+ // See: https://open.feishu.cn/document/server-docs/docs/content
93
+ const typeKey = {
94
+ 2: "text",
95
+ 3: "heading1",
96
+ 4: "heading2",
97
+ 5: "heading3",
98
+ 6: "heading4",
99
+ 7: "heading5",
100
+ 8: "heading6",
101
+ 12: "bullet",
102
+ 13: "ordered",
103
+ 15: "quote",
104
+ };
105
+ const key = typeKey[blockType] ?? "text";
106
+ // Note: do NOT pass style:{} for heading blocks - it causes field_validation_failed
107
+ return {
108
+ block_type: blockType,
109
+ [key]: { elements: [{ text_run: makeTextElement(text) }] },
110
+ };
111
+ }
112
+ while (i < lines.length) {
113
+ const line = lines[i];
114
+ // Code block
115
+ if (line.startsWith("```")) {
116
+ const lang = line.slice(3).trim() || "plaintext";
117
+ const codeLines = [];
118
+ i++;
119
+ while (i < lines.length && !lines[i].startsWith("```")) {
120
+ codeLines.push(lines[i]);
121
+ i++;
122
+ }
123
+ blocks.push({
124
+ block_type: 14,
125
+ code: {
126
+ elements: [{ text_run: { content: codeLines.join("\n") } }],
127
+ style: {
128
+ language: lang === "plaintext"
129
+ ? 1
130
+ : lang === "python"
131
+ ? 49
132
+ : lang === "javascript"
133
+ ? 22
134
+ : lang === "typescript"
135
+ ? 35
136
+ : lang === "java"
137
+ ? 21
138
+ : lang === "go"
139
+ ? 17
140
+ : lang === "shell" || lang === "bash"
141
+ ? 60
142
+ : 1,
143
+ },
144
+ },
145
+ });
146
+ i++;
147
+ continue;
148
+ }
149
+ // Horizontal rule
150
+ if (/^[-*_]{3,}$/.test(line.trim())) {
151
+ blocks.push({ block_type: 22, divider: {} });
152
+ i++;
153
+ continue;
154
+ }
155
+ // Blockquote
156
+ if (line.startsWith("> ")) {
157
+ blocks.push(makeTextBlock(15, line.slice(2)));
158
+ i++;
159
+ continue;
160
+ }
161
+ // Headings
162
+ const headingMatch = line.match(/^(#{1,6})\s+(.+)/);
163
+ if (headingMatch) {
164
+ const level = Math.min(headingMatch[1].length, 6);
165
+ const blockType = level + 2; // H1=3, H2=4, ..., H6=8
166
+ blocks.push(makeTextBlock(blockType, headingMatch[2]));
167
+ i++;
168
+ continue;
169
+ }
170
+ // Unordered list
171
+ if (/^[-*+]\s+/.test(line)) {
172
+ blocks.push(makeTextBlock(12, line.replace(/^[-*+]\s+/, "")));
173
+ i++;
174
+ continue;
175
+ }
176
+ // Ordered list
177
+ if (/^\d+\.\s+/.test(line)) {
178
+ blocks.push(makeTextBlock(13, line.replace(/^\d+\.\s+/, "")));
179
+ i++;
180
+ continue;
181
+ }
182
+ // Empty line → skip
183
+ if (line.trim() === "") {
184
+ i++;
185
+ continue;
186
+ }
187
+ // Regular paragraph
188
+ blocks.push(makeTextBlock(2, line));
189
+ i++;
190
+ }
191
+ return blocks;
192
+ }
193
+ // Feishu documentBlockChildren.create API limit: max 50 blocks per request.
194
+ const FEISHU_BLOCK_BATCH_SIZE = 50;
195
+ /* eslint-disable @typescript-eslint/no-explicit-any -- SDK block types */
196
+ async function insertBlocks(client, docToken, blocks, parentBlockId) {
197
+ /* eslint-enable @typescript-eslint/no-explicit-any */
198
+ const { cleaned, skipped } = cleanBlocksForInsert(blocks);
199
+ const blockId = parentBlockId ?? docToken;
200
+ if (cleaned.length === 0) {
201
+ return { children: [], skipped };
202
+ }
203
+ // Batch into chunks of FEISHU_BLOCK_BATCH_SIZE to respect API limit.
204
+ const allChildren = [];
205
+ for (let offset = 0; offset < cleaned.length; offset += FEISHU_BLOCK_BATCH_SIZE) {
206
+ const batch = cleaned.slice(offset, offset + FEISHU_BLOCK_BATCH_SIZE);
207
+ let res;
208
+ try {
209
+ res = await client.docx.documentBlockChildren.create({
210
+ path: { document_id: docToken, block_id: blockId },
211
+ data: {
212
+ children: batch,
213
+ // Insert at end for each batch (index-based: after last inserted block)
214
+ ...(offset > 0 ? { index: offset } : {}),
215
+ },
216
+ });
217
+ }
218
+ catch (err) {
219
+ if (err.isAxiosError && err.response?.data) {
220
+ throw new Error(`Feishu API Error (${err.message}): ${JSON.stringify(err.response.data)}` +
221
+ `\nBatch [${offset}..${offset + batch.length}], first block: ${batch[0] ? JSON.stringify(batch[0], null, 2) : "(empty)"}`);
222
+ }
223
+ throw err;
224
+ }
225
+ if (res.code !== 0) {
226
+ const errDetail = res;
227
+ const violations = errDetail.field_violations ?? errDetail.error?.field_violations ?? [];
228
+ const firstBlock = batch[0] ? JSON.stringify(batch[0], null, 2) : "(empty)";
229
+ throw new Error(`insertBlocks failed (code=${res.code}): ${res.msg}` +
230
+ `\nfield_violations: ${JSON.stringify(violations)}` +
231
+ `\nbatch [${offset}..${offset + batch.length}], first block: ${firstBlock}`);
232
+ }
233
+ allChildren.push(...(res.data?.children ?? []));
234
+ }
235
+ return { children: allChildren, skipped };
236
+ }
237
+ async function clearDocumentContent(client, docToken) {
238
+ const existing = await client.docx.documentBlock.list({
239
+ path: { document_id: docToken },
240
+ });
241
+ if (existing.code !== 0) {
242
+ throw new Error(existing.msg);
243
+ }
244
+ const childIds = existing.data?.items
245
+ ?.filter((b) => b.parent_id === docToken && b.block_type !== 1)
246
+ .map((b) => b.block_id) ?? [];
247
+ if (childIds.length > 0) {
248
+ const res = await client.docx.documentBlockChildren.batchDelete({
249
+ path: { document_id: docToken, block_id: docToken },
250
+ data: { start_index: 0, end_index: childIds.length },
251
+ });
252
+ if (res.code !== 0) {
253
+ throw new Error(res.msg);
254
+ }
255
+ }
256
+ return childIds.length;
257
+ }
258
+ async function uploadImageToDocx(client, blockId, imageBuffer, fileName) {
259
+ const res = await client.drive.media.uploadAll({
260
+ data: {
261
+ file_name: fileName,
262
+ parent_type: "docx_image",
263
+ parent_node: blockId,
264
+ size: imageBuffer.length,
265
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- SDK stream type
266
+ file: Readable.from(imageBuffer),
267
+ },
268
+ });
269
+ const fileToken = res?.file_token;
270
+ if (!fileToken) {
271
+ throw new Error("Image upload failed: no file_token returned");
272
+ }
273
+ return fileToken;
274
+ }
275
+ async function downloadImage(url) {
276
+ const response = await fetch(url);
277
+ if (!response.ok) {
278
+ throw new Error(`Failed to download image: ${response.status} ${response.statusText}`);
279
+ }
280
+ return Buffer.from(await response.arrayBuffer());
281
+ }
282
+ /* eslint-disable @typescript-eslint/no-explicit-any -- SDK block types */
283
+ async function processImages(client, docToken, markdown, insertedBlocks) {
284
+ /* eslint-enable @typescript-eslint/no-explicit-any */
285
+ const imageUrls = extractImageUrls(markdown);
286
+ if (imageUrls.length === 0) {
287
+ return 0;
288
+ }
289
+ const imageBlocks = insertedBlocks.filter((b) => b.block_type === 27);
290
+ let processed = 0;
291
+ for (let i = 0; i < Math.min(imageUrls.length, imageBlocks.length); i++) {
292
+ const url = imageUrls[i];
293
+ const blockId = imageBlocks[i].block_id;
294
+ try {
295
+ const buffer = await downloadImage(url);
296
+ const urlPath = new URL(url).pathname;
297
+ const fileName = urlPath.split("/").pop() || `image_${i}.png`;
298
+ const fileToken = await uploadImageToDocx(client, blockId, buffer, fileName);
299
+ await client.docx.documentBlock.patch({
300
+ path: { document_id: docToken, block_id: blockId },
301
+ data: {
302
+ replace_image: { token: fileToken },
303
+ },
304
+ });
305
+ processed++;
306
+ }
307
+ catch (err) {
308
+ console.error(`Failed to process image ${url}:`, err);
309
+ }
310
+ }
311
+ return processed;
312
+ }
313
+ // ============ Actions ============
314
+ const STRUCTURED_BLOCK_TYPES = new Set([14, 18, 21, 23, 27, 30, 31, 32]);
315
+ async function readDoc(client, docToken) {
316
+ const [contentRes, infoRes, blocksRes] = await Promise.all([
317
+ client.docx.document.rawContent({ path: { document_id: docToken } }),
318
+ client.docx.document.get({ path: { document_id: docToken } }),
319
+ client.docx.documentBlock.list({ path: { document_id: docToken } }),
320
+ ]);
321
+ if (contentRes.code !== 0) {
322
+ throw new Error(contentRes.msg);
323
+ }
324
+ const blocks = blocksRes.data?.items ?? [];
325
+ const blockCounts = {};
326
+ const structuredTypes = [];
327
+ for (const b of blocks) {
328
+ const type = b.block_type ?? 0;
329
+ const name = BLOCK_TYPE_NAMES[type] || `type_${type}`;
330
+ blockCounts[name] = (blockCounts[name] || 0) + 1;
331
+ if (STRUCTURED_BLOCK_TYPES.has(type) && !structuredTypes.includes(name)) {
332
+ structuredTypes.push(name);
333
+ }
334
+ }
335
+ let hint;
336
+ if (structuredTypes.length > 0) {
337
+ hint = `This document contains ${structuredTypes.join(", ")} which are NOT included in the plain text above. Use feishu_doc with action: "list_blocks" to get full content.`;
338
+ }
339
+ return {
340
+ title: infoRes.data?.document?.title,
341
+ content: contentRes.data?.content,
342
+ revision_id: infoRes.data?.document?.revision_id,
343
+ block_count: blocks.length,
344
+ block_types: blockCounts,
345
+ ...(hint && { hint }),
346
+ };
347
+ }
348
+ async function createDoc(client, title, folderToken) {
349
+ const res = await client.docx.document.create({
350
+ data: { title, folder_token: folderToken },
351
+ });
352
+ if (res.code !== 0) {
353
+ throw new Error(res.msg);
354
+ }
355
+ const doc = res.data?.document;
356
+ return {
357
+ document_id: doc?.document_id,
358
+ title: doc?.title,
359
+ url: `https://feishu.cn/docx/${doc?.document_id}`,
360
+ };
361
+ }
362
+ async function writeDoc(client, docToken, markdown) {
363
+ const deleted = await clearDocumentContent(client, docToken);
364
+ const blocks = markdownToBlocks(markdown);
365
+ if (blocks.length === 0) {
366
+ return { success: true, blocks_deleted: deleted, blocks_added: 0, images_processed: 0 };
367
+ }
368
+ const { children: inserted, skipped } = await insertBlocks(client, docToken, blocks);
369
+ const imagesProcessed = await processImages(client, docToken, markdown, inserted);
370
+ return {
371
+ success: true,
372
+ blocks_deleted: deleted,
373
+ blocks_added: inserted.length,
374
+ images_processed: imagesProcessed,
375
+ ...(skipped.length > 0 && {
376
+ warning: `Skipped unsupported block types: ${skipped.join(", ")}. Tables are not supported via this API.`,
377
+ }),
378
+ };
379
+ }
380
+ async function appendDoc(client, docToken, markdown) {
381
+ const blocks = markdownToBlocks(markdown);
382
+ if (blocks.length === 0) {
383
+ throw new Error("Content is empty");
384
+ }
385
+ const { children: inserted, skipped } = await insertBlocks(client, docToken, blocks);
386
+ const imagesProcessed = await processImages(client, docToken, markdown, inserted);
387
+ return {
388
+ success: true,
389
+ blocks_added: inserted.length,
390
+ images_processed: imagesProcessed,
391
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- SDK block type
392
+ block_ids: inserted.map((b) => b.block_id),
393
+ ...(skipped.length > 0 && {
394
+ warning: `Skipped unsupported block types: ${skipped.join(", ")}. Tables are not supported via this API.`,
395
+ }),
396
+ };
397
+ }
398
+ async function updateBlock(client, docToken, blockId, content) {
399
+ const blockInfo = await client.docx.documentBlock.get({
400
+ path: { document_id: docToken, block_id: blockId },
401
+ });
402
+ if (blockInfo.code !== 0) {
403
+ throw new Error(blockInfo.msg);
404
+ }
405
+ const res = await client.docx.documentBlock.patch({
406
+ path: { document_id: docToken, block_id: blockId },
407
+ data: {
408
+ update_text_elements: {
409
+ elements: [{ text_run: { content } }],
410
+ },
411
+ },
412
+ });
413
+ if (res.code !== 0) {
414
+ throw new Error(res.msg);
415
+ }
416
+ return { success: true, block_id: blockId };
417
+ }
418
+ async function deleteBlock(client, docToken, blockId) {
419
+ const blockInfo = await client.docx.documentBlock.get({
420
+ path: { document_id: docToken, block_id: blockId },
421
+ });
422
+ if (blockInfo.code !== 0) {
423
+ throw new Error(blockInfo.msg);
424
+ }
425
+ const parentId = blockInfo.data?.block?.parent_id ?? docToken;
426
+ const children = await client.docx.documentBlockChildren.get({
427
+ path: { document_id: docToken, block_id: parentId },
428
+ });
429
+ if (children.code !== 0) {
430
+ throw new Error(children.msg);
431
+ }
432
+ const items = children.data?.items ?? [];
433
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- SDK block type
434
+ const index = items.findIndex((item) => item.block_id === blockId);
435
+ if (index === -1) {
436
+ throw new Error("Block not found");
437
+ }
438
+ const res = await client.docx.documentBlockChildren.batchDelete({
439
+ path: { document_id: docToken, block_id: parentId },
440
+ data: { start_index: index, end_index: index + 1 },
441
+ });
442
+ if (res.code !== 0) {
443
+ throw new Error(res.msg);
444
+ }
445
+ return { success: true, deleted_block_id: blockId };
446
+ }
447
+ async function listBlocks(client, docToken) {
448
+ const res = await client.docx.documentBlock.list({
449
+ path: { document_id: docToken },
450
+ });
451
+ if (res.code !== 0) {
452
+ throw new Error(res.msg);
453
+ }
454
+ return {
455
+ blocks: res.data?.items ?? [],
456
+ };
457
+ }
458
+ async function getBlock(client, docToken, blockId) {
459
+ const res = await client.docx.documentBlock.get({
460
+ path: { document_id: docToken, block_id: blockId },
461
+ });
462
+ if (res.code !== 0) {
463
+ throw new Error(res.msg);
464
+ }
465
+ return {
466
+ block: res.data?.block,
467
+ };
468
+ }
469
+ async function listAppScopes(client) {
470
+ const res = await client.application.scope.list({});
471
+ if (res.code !== 0) {
472
+ throw new Error(res.msg);
473
+ }
474
+ const scopes = res.data?.scopes ?? [];
475
+ const granted = scopes.filter((s) => s.grant_status === 1);
476
+ const pending = scopes.filter((s) => s.grant_status !== 1);
477
+ return {
478
+ granted: granted.map((s) => ({ name: s.scope_name, type: s.scope_type })),
479
+ pending: pending.map((s) => ({ name: s.scope_name, type: s.scope_type })),
480
+ summary: `${granted.length} granted, ${pending.length} pending`,
481
+ };
482
+ }
483
+ // ============ Tool Registration ============
484
+ import { addMember } from "./perm.js";
485
+ // ...
486
+ // ============ Tool Registration ============
487
+ export function registerFeishuDocTools(api) {
488
+ if (!api.config) {
489
+ api.logger.debug?.("feishu_doc: No config available, skipping doc tools");
490
+ return;
491
+ }
492
+ // Check if any account is configured
493
+ const accounts = listEnabledFeishuAccounts(api.config);
494
+ if (accounts.length === 0) {
495
+ api.logger.debug?.("feishu_doc: No Feishu accounts configured, skipping doc tools");
496
+ return;
497
+ }
498
+ // Use first account's config for tools configuration
499
+ const firstAccount = accounts[0];
500
+ const toolsCfg = resolveToolsConfig(firstAccount.config.tools);
501
+ // Helper to get client for the default account
502
+ const getClient = () => createFeishuClient(firstAccount);
503
+ const registered = [];
504
+ // Main document tool with action-based dispatch
505
+ if (toolsCfg.doc) {
506
+ api.registerTool({
507
+ name: "feishu_doc",
508
+ label: "Feishu Doc",
509
+ description: "Feishu document operations. Actions: read, write, append, create, list_blocks, get_block, update_block, delete_block. " +
510
+ "To create a doc with content and grant the requester access in one step, use action=create with title, content (markdown), and sender_open_id (the user's open_id, starts with ou_). " +
511
+ "Example workflow: user asks to write a Feishu doc → call feishu_doc with action=create, title=..., content=..., sender_open_id=<user's open_id from SenderId context>.",
512
+ parameters: FeishuDocSchema,
513
+ async execute(_toolCallId, params) {
514
+ const p = params;
515
+ try {
516
+ const client = getClient();
517
+ switch (p.action) {
518
+ case "read":
519
+ return json(await readDoc(client, p.doc_token));
520
+ case "write":
521
+ return json(await writeDoc(client, p.doc_token, p.content));
522
+ case "append":
523
+ return json(await appendDoc(client, p.doc_token, p.content));
524
+ case "create": {
525
+ const result = await createDoc(client, p.title, p.folder_token);
526
+ // Auto-permission: Grant full_access to sender if sender_open_id is provided
527
+ const senderId = p.sender_open_id;
528
+ if (result.document_id && senderId) {
529
+ let memberType = "userid";
530
+ if (senderId.startsWith("ou_"))
531
+ memberType = "openid";
532
+ else if (senderId.startsWith("on_"))
533
+ memberType = "unionid";
534
+ else if (senderId.includes("@"))
535
+ memberType = "email";
536
+ try {
537
+ await addMember(client, result.document_id, "docx", memberType, senderId, "full_access");
538
+ result.permission_granted = true;
539
+ result.permission_granted_to = senderId;
540
+ }
541
+ catch (permErr) {
542
+ api.logger.warn?.(`feishu_doc: Failed to grant permission to ${senderId}: ${permErr}`);
543
+ result.permission_error = String(permErr);
544
+ }
545
+ }
546
+ // Write content if provided
547
+ const initialContent = p.content;
548
+ if (result.document_id && initialContent) {
549
+ try {
550
+ await writeDoc(client, result.document_id, initialContent);
551
+ result.content_written = true;
552
+ }
553
+ catch (writeErr) {
554
+ api.logger.warn?.(`feishu_doc: Failed to write initial content: ${writeErr}`);
555
+ // Provide clear guidance to agent: document exists, use 'write' action to retry
556
+ result.content_written = false;
557
+ result.content_write_instruction =
558
+ `Document was created successfully (doc_token: ${result.document_id}). ` +
559
+ `Content write failed. Use action='write' with doc_token='${result.document_id}' to retry writing the content. ` +
560
+ `DO NOT create a new document.`;
561
+ }
562
+ }
563
+ return json(result);
564
+ }
565
+ case "list_blocks":
566
+ return json(await listBlocks(client, p.doc_token));
567
+ case "get_block":
568
+ return json(await getBlock(client, p.doc_token, p.block_id));
569
+ case "update_block":
570
+ return json(await updateBlock(client, p.doc_token, p.block_id, p.content));
571
+ case "delete_block":
572
+ return json(await deleteBlock(client, p.doc_token, p.block_id));
573
+ default:
574
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- exhaustive check fallback
575
+ return json({ error: `Unknown action: ${p.action}` });
576
+ }
577
+ }
578
+ catch (err) {
579
+ return json({ error: err instanceof Error ? err.message : String(err) });
580
+ }
581
+ },
582
+ }, { name: "feishu_doc" });
583
+ registered.push("feishu_doc");
584
+ }
585
+ // Keep feishu_app_scopes as independent tool
586
+ if (toolsCfg.scopes) {
587
+ api.registerTool({
588
+ name: "feishu_app_scopes",
589
+ label: "Feishu App Scopes",
590
+ description: "List current app permissions (scopes). Use to debug permission issues or check available capabilities.",
591
+ parameters: Type.Object({}),
592
+ async execute() {
593
+ try {
594
+ const result = await listAppScopes(getClient());
595
+ return json(result);
596
+ }
597
+ catch (err) {
598
+ return json({ error: err instanceof Error ? err.message : String(err) });
599
+ }
600
+ },
601
+ }, { name: "feishu_app_scopes" });
602
+ registered.push("feishu_app_scopes");
603
+ }
604
+ if (registered.length > 0) {
605
+ api.logger.info?.(`feishu_doc: Registered ${registered.join(", ")}`);
606
+ }
607
+ }
608
+ //# sourceMappingURL=docx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docx.js","sourceRoot":"","sources":["../../src/docx.ts"],"names":[],"mappings":"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"}