@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,249 @@
1
+ import { createReplyPrefixContext, createTypingCallbacks, logTypingFailure, isSilentReplyText, SILENT_REPLY_TOKEN, } from "openclaw/plugin-sdk";
2
+ import { resolveFeishuAccount } from "./accounts.js";
3
+ import { createFeishuClient } from "./client.js";
4
+ import { buildMentionedCardContent } from "./mention.js";
5
+ import { getFeishuRuntime } from "./runtime.js";
6
+ import { sendMarkdownCardFeishu, sendMessageFeishu } from "./send.js";
7
+ import { FeishuStreamingSession } from "./streaming-card.js";
8
+ import { resolveReceiveIdType } from "./targets.js";
9
+ import { addTypingIndicator, removeTypingIndicator } from "./typing.js";
10
+ function formatError(error) {
11
+ if (error instanceof Error)
12
+ return error.message;
13
+ if (typeof error === "string")
14
+ return error;
15
+ try {
16
+ return JSON.stringify(error);
17
+ }
18
+ catch {
19
+ return "Unknown error";
20
+ }
21
+ }
22
+ /** Detect if text contains markdown elements that benefit from card rendering */
23
+ function shouldUseCard(text) {
24
+ return /```[\s\S]*?```/.test(text) || /\|.+\|[\r\n]+\|[-:| ]+\|/.test(text);
25
+ }
26
+ export function createFeishuReplyDispatcher(params) {
27
+ const core = getFeishuRuntime();
28
+ const { cfg, agentId, chatId, replyToMessageId, mentionTargets, accountId } = params;
29
+ const account = resolveFeishuAccount({ cfg, accountId });
30
+ const prefixContext = createReplyPrefixContext({ cfg, agentId });
31
+ let typingState = null;
32
+ const typingCallbacks = createTypingCallbacks({
33
+ start: async () => {
34
+ if (!replyToMessageId) {
35
+ return;
36
+ }
37
+ typingState = await addTypingIndicator({ cfg, messageId: replyToMessageId, accountId });
38
+ },
39
+ stop: async () => {
40
+ if (!typingState) {
41
+ return;
42
+ }
43
+ await removeTypingIndicator({ cfg, state: typingState, accountId });
44
+ typingState = null;
45
+ },
46
+ onStartError: (err) => logTypingFailure({
47
+ log: (message) => params.runtime.log?.(message),
48
+ channel: "feishu",
49
+ action: "start",
50
+ error: err,
51
+ }),
52
+ onStopError: (err) => logTypingFailure({
53
+ log: (message) => params.runtime.log?.(message),
54
+ channel: "feishu",
55
+ action: "stop",
56
+ error: err,
57
+ }),
58
+ });
59
+ const textChunkLimit = core.channel.text.resolveTextChunkLimit(cfg, "feishu", accountId, {
60
+ fallbackLimit: 4000,
61
+ });
62
+ const chunkMode = core.channel.text.resolveChunkMode(cfg, "feishu");
63
+ const tableMode = core.channel.text.resolveMarkdownTableMode({ cfg, channel: "feishu" });
64
+ const renderMode = account.config?.renderMode ?? "auto";
65
+ const streamingEnabled = account.config?.streaming !== false && renderMode !== "raw";
66
+ let streaming = null;
67
+ let streamText = "";
68
+ let lastPartial = "";
69
+ let partialUpdateQueue = Promise.resolve();
70
+ let streamingStartPromise = null;
71
+ let streamingClosed = false; // Double protection: block partial updates after streaming is closed
72
+ const startStreaming = () => {
73
+ // Guard: If there's already an active streaming session, reuse it instead of creating new one.
74
+ // This prevents multiple FeishuStreamingSession instances from being created for the same message.
75
+ if (streaming && streaming.isActive()) {
76
+ return;
77
+ }
78
+ if (!streamingEnabled || streamingStartPromise || streaming) {
79
+ return;
80
+ }
81
+ streamingClosed = false; // Reset flag when starting new streaming session
82
+ streamingStartPromise = (async () => {
83
+ const creds = account.appId && account.appSecret
84
+ ? { appId: account.appId, appSecret: account.appSecret, domain: account.domain }
85
+ : null;
86
+ if (!creds) {
87
+ return;
88
+ }
89
+ streaming = new FeishuStreamingSession(createFeishuClient(account), creds, (message) => params.runtime.log?.(`feishu[${account.accountId}] ${message}`));
90
+ try {
91
+ await streaming.start(chatId, resolveReceiveIdType(chatId));
92
+ }
93
+ catch (error) {
94
+ params.runtime.error?.(`feishu: streaming start failed: ${formatError(error)}`);
95
+ streaming = null;
96
+ }
97
+ })();
98
+ };
99
+ const closeStreaming = async () => {
100
+ if (streamingStartPromise) {
101
+ await Promise.resolve(streamingStartPromise);
102
+ }
103
+ await partialUpdateQueue;
104
+ if (streaming?.isActive()) {
105
+ // Filter out NO_REPLY token — if the model replied with NO_REPLY (silent reply),
106
+ // we must NOT display it in the streaming card. Close with empty content instead.
107
+ // Pass empty string explicitly to override any pendingText cached inside the session.
108
+ const isSilent = isSilentReplyText(streamText, SILENT_REPLY_TOKEN);
109
+ let text = isSilent ? "" : streamText;
110
+ if (text && mentionTargets?.length) {
111
+ text = buildMentionedCardContent(mentionTargets, text);
112
+ }
113
+ await streaming.close(isSilent ? "" : text || undefined);
114
+ }
115
+ // Deep disconnect state to avoid concurrent queue overlapping
116
+ streaming = null;
117
+ streamingStartPromise = null;
118
+ streamText = "";
119
+ lastPartial = "";
120
+ partialUpdateQueue = Promise.resolve();
121
+ streamingClosed = true; // Set flag to block any pending partial updates
122
+ };
123
+ const { dispatcher, replyOptions, markDispatchIdle } = core.channel.reply.createReplyDispatcherWithTyping({
124
+ responsePrefix: prefixContext.responsePrefix,
125
+ responsePrefixContextProvider: prefixContext.responsePrefixContextProvider,
126
+ humanDelay: core.channel.reply.resolveHumanDelayConfig(cfg, agentId),
127
+ onReplyStart: () => {
128
+ if (streamingEnabled && renderMode === "card") {
129
+ startStreaming();
130
+ }
131
+ void typingCallbacks.onReplyStart?.();
132
+ },
133
+ deliver: async (payload, info) => {
134
+ const text = payload.text ?? "";
135
+ if (!text.trim() || isSilentReplyText(text, SILENT_REPLY_TOKEN)) {
136
+ // Double guard against sending NO/NO_REPLY as final or chunk text
137
+ if (info?.kind === "final" && streaming?.isActive()) {
138
+ streamText = ""; // treat as empty
139
+ await closeStreaming();
140
+ }
141
+ return;
142
+ }
143
+ const useCard = renderMode === "card" || (renderMode === "auto" && shouldUseCard(text));
144
+ if ((info?.kind === "block" || info?.kind === "final") && streamingEnabled && useCard) {
145
+ startStreaming();
146
+ if (streamingStartPromise) {
147
+ await Promise.resolve(streamingStartPromise);
148
+ }
149
+ }
150
+ if (streaming?.isActive()) {
151
+ if (info?.kind === "final") {
152
+ streamText = text;
153
+ await closeStreaming();
154
+ }
155
+ return;
156
+ }
157
+ let first = true;
158
+ if (useCard) {
159
+ for (const chunk of core.channel.text.chunkTextWithMode(text, textChunkLimit, chunkMode)) {
160
+ await sendMarkdownCardFeishu({
161
+ cfg,
162
+ to: chatId,
163
+ text: chunk,
164
+ replyToMessageId,
165
+ mentions: first ? mentionTargets : undefined,
166
+ accountId,
167
+ });
168
+ first = false;
169
+ }
170
+ }
171
+ else {
172
+ const converted = core.channel.text.convertMarkdownTables(text, tableMode);
173
+ for (const chunk of core.channel.text.chunkTextWithMode(converted, textChunkLimit, chunkMode)) {
174
+ await sendMessageFeishu({
175
+ cfg,
176
+ to: chatId,
177
+ text: chunk,
178
+ replyToMessageId,
179
+ mentions: first ? mentionTargets : undefined,
180
+ accountId,
181
+ });
182
+ first = false;
183
+ }
184
+ }
185
+ },
186
+ onError: async (error, info) => {
187
+ params.runtime.error?.(`feishu[${account.accountId}] ${info.kind} reply failed: ${formatError(error)}`);
188
+ await closeStreaming();
189
+ typingCallbacks.onIdle?.();
190
+ },
191
+ onIdle: async () => {
192
+ await closeStreaming();
193
+ typingCallbacks.onIdle?.();
194
+ },
195
+ });
196
+ return {
197
+ dispatcher,
198
+ replyOptions: {
199
+ ...replyOptions,
200
+ onModelSelected: prefixContext.onModelSelected,
201
+ onPartialReply: streamingEnabled
202
+ ? (payload) => {
203
+ // Double protection: block partial updates after streaming is closed
204
+ if (streamingClosed) {
205
+ return;
206
+ }
207
+ if (!payload.text || payload.text === lastPartial) {
208
+ return;
209
+ }
210
+ // Do NOT stream NO_REPLY token — it is a silent reply signal, not user-visible text.
211
+ // When we detect NO_REPLY in the stream, we must also clear any partial content
212
+ // already written to the card (e.g. "N", "NO" were written before full "NO_REPLY" arrived).
213
+ if (isSilentReplyText(payload.text, SILENT_REPLY_TOKEN)) {
214
+ // Clear streamText so closeStreaming also sees empty content.
215
+ streamText = "";
216
+ lastPartial = payload.text;
217
+ // Actively clear the card content to erase any partial "NO" already displayed.
218
+ partialUpdateQueue = partialUpdateQueue.then(async () => {
219
+ if (streamingStartPromise) {
220
+ await Promise.resolve(streamingStartPromise);
221
+ }
222
+ if (streaming?.isActive()) {
223
+ try {
224
+ await streaming.update("");
225
+ }
226
+ catch {
227
+ // ignore errors clearing the card
228
+ }
229
+ }
230
+ });
231
+ return;
232
+ }
233
+ lastPartial = payload.text;
234
+ streamText = payload.text;
235
+ partialUpdateQueue = partialUpdateQueue.then(async () => {
236
+ if (streamingStartPromise) {
237
+ await Promise.resolve(streamingStartPromise);
238
+ }
239
+ if (streaming?.isActive()) {
240
+ await streaming.update(streamText);
241
+ }
242
+ });
243
+ }
244
+ : undefined,
245
+ },
246
+ markDispatchIdle,
247
+ };
248
+ }
249
+ //# sourceMappingURL=reply-dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reply-dispatcher.js","sourceRoot":"","sources":["../../src/reply-dispatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { PluginRuntime } from "openclaw/plugin-sdk";
2
+ export declare function setFeishuRuntime(next: PluginRuntime): void;
3
+ export declare function getFeishuRuntime(): PluginRuntime;
4
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIzD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,QAEnD;AAED,wBAAgB,gBAAgB,IAAI,aAAa,CAKhD"}
@@ -0,0 +1,11 @@
1
+ let runtime = null;
2
+ export function setFeishuRuntime(next) {
3
+ runtime = next;
4
+ }
5
+ export function getFeishuRuntime() {
6
+ if (!runtime) {
7
+ throw new Error("Feishu runtime not initialized");
8
+ }
9
+ return runtime;
10
+ }
11
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/runtime.ts"],"names":[],"mappings":"AAEA,IAAI,OAAO,GAAyB,IAAI,CAAC;AAEzC,MAAM,UAAU,gBAAgB,CAAC,IAAmB;IAClD,OAAO,GAAG,IAAI,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,76 @@
1
+ import type { OpenClawConfig as ClawdbotConfig } from "openclaw/plugin-sdk";
2
+ import type { MentionTarget } from "./mention.js";
3
+ import type { FeishuSendResult } from "./types.js";
4
+ export type FeishuMessageInfo = {
5
+ messageId: string;
6
+ chatId: string;
7
+ senderId?: string;
8
+ senderOpenId?: string;
9
+ content: string;
10
+ contentType: string;
11
+ createTime?: number;
12
+ };
13
+ /**
14
+ * Get a message by its ID.
15
+ * Useful for fetching quoted/replied message content.
16
+ */
17
+ export declare function getMessageFeishu(params: {
18
+ cfg: ClawdbotConfig;
19
+ messageId: string;
20
+ accountId?: string;
21
+ }): Promise<FeishuMessageInfo | null>;
22
+ export type SendFeishuMessageParams = {
23
+ cfg: ClawdbotConfig;
24
+ to: string;
25
+ text: string;
26
+ replyToMessageId?: string;
27
+ /** Mention target users */
28
+ mentions?: MentionTarget[];
29
+ /** Account ID (optional, uses default if not specified) */
30
+ accountId?: string;
31
+ };
32
+ export declare function sendMessageFeishu(params: SendFeishuMessageParams): Promise<FeishuSendResult>;
33
+ export type SendFeishuCardParams = {
34
+ cfg: ClawdbotConfig;
35
+ to: string;
36
+ card: Record<string, unknown>;
37
+ replyToMessageId?: string;
38
+ accountId?: string;
39
+ };
40
+ export declare function sendCardFeishu(params: SendFeishuCardParams): Promise<FeishuSendResult>;
41
+ export declare function updateCardFeishu(params: {
42
+ cfg: ClawdbotConfig;
43
+ messageId: string;
44
+ card: Record<string, unknown>;
45
+ accountId?: string;
46
+ }): Promise<void>;
47
+ /**
48
+ * Build a Feishu interactive card with markdown content.
49
+ * Cards render markdown properly (code blocks, tables, links, etc.)
50
+ * Uses schema 2.0 format for proper markdown rendering.
51
+ */
52
+ export declare function buildMarkdownCard(text: string): Record<string, unknown>;
53
+ /**
54
+ * Send a message as a markdown card (interactive message).
55
+ * This renders markdown properly in Feishu (code blocks, tables, bold/italic, etc.)
56
+ */
57
+ export declare function sendMarkdownCardFeishu(params: {
58
+ cfg: ClawdbotConfig;
59
+ to: string;
60
+ text: string;
61
+ replyToMessageId?: string;
62
+ /** Mention target users */
63
+ mentions?: MentionTarget[];
64
+ accountId?: string;
65
+ }): Promise<FeishuSendResult>;
66
+ /**
67
+ * Edit an existing text message.
68
+ * Note: Feishu only allows editing messages within 24 hours.
69
+ */
70
+ export declare function editMessageFeishu(params: {
71
+ cfg: ClawdbotConfig;
72
+ messageId: string;
73
+ text: string;
74
+ accountId?: string;
75
+ }): Promise<void>;
76
+ //# sourceMappingURL=send.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../src/send.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,IAAI,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAyB,MAAM,YAAY,CAAC;AAO1E,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC7C,GAAG,EAAE,cAAc,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CA+DpC;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,GAAG,EAAE,cAAc,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAwBF,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAgE3B;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,GAAG,EAAE,cAAc,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAsB,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAoD5F;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC7C,GAAG,EAAE,cAAc,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBhB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAevE;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE;IACnD,GAAG,EAAE,cAAc,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAS5B;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,GAAG,EAAE,cAAc,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BhB"}
@@ -0,0 +1,250 @@
1
+ import { resolveFeishuAccount } from "./accounts.js";
2
+ import { createFeishuClient } from "./client.js";
3
+ import { buildMentionedMessage, buildMentionedCardContent } from "./mention.js";
4
+ import { getFeishuRuntime } from "./runtime.js";
5
+ import { resolveReceiveIdType, normalizeFeishuTarget } from "./targets.js";
6
+ /**
7
+ * Get a message by its ID.
8
+ * Useful for fetching quoted/replied message content.
9
+ */
10
+ export async function getMessageFeishu(params) {
11
+ const { cfg, messageId, accountId } = params;
12
+ const account = resolveFeishuAccount({ cfg, accountId });
13
+ if (!account.configured) {
14
+ throw new Error(`Feishu account "${account.accountId}" not configured`);
15
+ }
16
+ const client = createFeishuClient(account);
17
+ try {
18
+ const response = (await client.im.message.get({
19
+ path: { message_id: messageId },
20
+ }));
21
+ if (response.code !== 0) {
22
+ return null;
23
+ }
24
+ const item = response.data?.items?.[0];
25
+ if (!item) {
26
+ return null;
27
+ }
28
+ // Parse content based on message type
29
+ let content = item.body?.content ?? "";
30
+ try {
31
+ const parsed = JSON.parse(content);
32
+ if (item.msg_type === "text" && parsed.text) {
33
+ content = parsed.text;
34
+ }
35
+ }
36
+ catch {
37
+ // Keep raw content if parsing fails
38
+ }
39
+ return {
40
+ messageId: item.message_id ?? messageId,
41
+ chatId: item.chat_id ?? "",
42
+ senderId: item.sender?.id,
43
+ senderOpenId: item.sender?.id_type === "open_id" ? item.sender?.id : undefined,
44
+ content,
45
+ contentType: item.msg_type ?? "text",
46
+ createTime: item.create_time ? parseInt(item.create_time, 10) : undefined,
47
+ };
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ }
53
+ function buildFeishuPostMessagePayload(params) {
54
+ const { messageText } = params;
55
+ return {
56
+ content: JSON.stringify({
57
+ zh_cn: {
58
+ content: [
59
+ [
60
+ {
61
+ tag: "md",
62
+ text: messageText,
63
+ },
64
+ ],
65
+ ],
66
+ },
67
+ }),
68
+ msgType: "post",
69
+ };
70
+ }
71
+ export async function sendMessageFeishu(params) {
72
+ const { cfg, to, text, replyToMessageId, mentions, accountId } = params;
73
+ const account = resolveFeishuAccount({ cfg, accountId });
74
+ if (!account.configured) {
75
+ throw new Error(`Feishu account "${account.accountId}" not configured`);
76
+ }
77
+ const client = createFeishuClient(account);
78
+ const receiveId = normalizeFeishuTarget(to);
79
+ if (!receiveId) {
80
+ throw new Error(`Invalid Feishu target: ${to}`);
81
+ }
82
+ const receiveIdType = resolveReceiveIdType(receiveId);
83
+ const tableMode = getFeishuRuntime().channel.text.resolveMarkdownTableMode({
84
+ cfg,
85
+ channel: "feishu",
86
+ });
87
+ // Build message content (with @mention support)
88
+ let rawText = text ?? "";
89
+ if (mentions && mentions.length > 0) {
90
+ rawText = buildMentionedMessage(mentions, rawText);
91
+ }
92
+ const messageText = getFeishuRuntime().channel.text.convertMarkdownTables(rawText, tableMode);
93
+ const { content, msgType } = buildFeishuPostMessagePayload({ messageText });
94
+ if (replyToMessageId) {
95
+ const response = await client.im.message.reply({
96
+ path: { message_id: replyToMessageId },
97
+ data: {
98
+ content,
99
+ msg_type: msgType,
100
+ },
101
+ });
102
+ if (response.code !== 0) {
103
+ throw new Error(`Feishu reply failed: ${response.msg || `code ${response.code}`}`);
104
+ }
105
+ return {
106
+ messageId: response.data?.message_id ?? "unknown",
107
+ chatId: receiveId,
108
+ };
109
+ }
110
+ const response = await client.im.message.create({
111
+ params: { receive_id_type: receiveIdType },
112
+ data: {
113
+ receive_id: receiveId,
114
+ content,
115
+ msg_type: msgType,
116
+ },
117
+ });
118
+ if (response.code !== 0) {
119
+ throw new Error(`Feishu send failed: ${response.msg || `code ${response.code}`}`);
120
+ }
121
+ return {
122
+ messageId: response.data?.message_id ?? "unknown",
123
+ chatId: receiveId,
124
+ };
125
+ }
126
+ export async function sendCardFeishu(params) {
127
+ const { cfg, to, card, replyToMessageId, accountId } = params;
128
+ const account = resolveFeishuAccount({ cfg, accountId });
129
+ if (!account.configured) {
130
+ throw new Error(`Feishu account "${account.accountId}" not configured`);
131
+ }
132
+ const client = createFeishuClient(account);
133
+ const receiveId = normalizeFeishuTarget(to);
134
+ if (!receiveId) {
135
+ throw new Error(`Invalid Feishu target: ${to}`);
136
+ }
137
+ const receiveIdType = resolveReceiveIdType(receiveId);
138
+ const content = JSON.stringify(card);
139
+ if (replyToMessageId) {
140
+ const response = await client.im.message.reply({
141
+ path: { message_id: replyToMessageId },
142
+ data: {
143
+ content,
144
+ msg_type: "interactive",
145
+ },
146
+ });
147
+ if (response.code !== 0) {
148
+ throw new Error(`Feishu card reply failed: ${response.msg || `code ${response.code}`}`);
149
+ }
150
+ return {
151
+ messageId: response.data?.message_id ?? "unknown",
152
+ chatId: receiveId,
153
+ };
154
+ }
155
+ const response = await client.im.message.create({
156
+ params: { receive_id_type: receiveIdType },
157
+ data: {
158
+ receive_id: receiveId,
159
+ content,
160
+ msg_type: "interactive",
161
+ },
162
+ });
163
+ if (response.code !== 0) {
164
+ throw new Error(`Feishu card send failed: ${response.msg || `code ${response.code}`}`);
165
+ }
166
+ return {
167
+ messageId: response.data?.message_id ?? "unknown",
168
+ chatId: receiveId,
169
+ };
170
+ }
171
+ export async function updateCardFeishu(params) {
172
+ const { cfg, messageId, card, accountId } = params;
173
+ const account = resolveFeishuAccount({ cfg, accountId });
174
+ if (!account.configured) {
175
+ throw new Error(`Feishu account "${account.accountId}" not configured`);
176
+ }
177
+ const client = createFeishuClient(account);
178
+ const content = JSON.stringify(card);
179
+ const response = await client.im.message.patch({
180
+ path: { message_id: messageId },
181
+ data: { content },
182
+ });
183
+ if (response.code !== 0) {
184
+ throw new Error(`Feishu card update failed: ${response.msg || `code ${response.code}`}`);
185
+ }
186
+ }
187
+ /**
188
+ * Build a Feishu interactive card with markdown content.
189
+ * Cards render markdown properly (code blocks, tables, links, etc.)
190
+ * Uses schema 2.0 format for proper markdown rendering.
191
+ */
192
+ export function buildMarkdownCard(text) {
193
+ return {
194
+ schema: "2.0",
195
+ config: {
196
+ wide_screen_mode: true,
197
+ },
198
+ body: {
199
+ elements: [
200
+ {
201
+ tag: "markdown",
202
+ content: text,
203
+ },
204
+ ],
205
+ },
206
+ };
207
+ }
208
+ /**
209
+ * Send a message as a markdown card (interactive message).
210
+ * This renders markdown properly in Feishu (code blocks, tables, bold/italic, etc.)
211
+ */
212
+ export async function sendMarkdownCardFeishu(params) {
213
+ const { cfg, to, text, replyToMessageId, mentions, accountId } = params;
214
+ // Build message content (with @mention support)
215
+ let cardText = text;
216
+ if (mentions && mentions.length > 0) {
217
+ cardText = buildMentionedCardContent(mentions, text);
218
+ }
219
+ const card = buildMarkdownCard(cardText);
220
+ return sendCardFeishu({ cfg, to, card, replyToMessageId, accountId });
221
+ }
222
+ /**
223
+ * Edit an existing text message.
224
+ * Note: Feishu only allows editing messages within 24 hours.
225
+ */
226
+ export async function editMessageFeishu(params) {
227
+ const { cfg, messageId, text, accountId } = params;
228
+ const account = resolveFeishuAccount({ cfg, accountId });
229
+ if (!account.configured) {
230
+ throw new Error(`Feishu account "${account.accountId}" not configured`);
231
+ }
232
+ const client = createFeishuClient(account);
233
+ const tableMode = getFeishuRuntime().channel.text.resolveMarkdownTableMode({
234
+ cfg,
235
+ channel: "feishu",
236
+ });
237
+ const messageText = getFeishuRuntime().channel.text.convertMarkdownTables(text ?? "", tableMode);
238
+ const { content, msgType } = buildFeishuPostMessagePayload({ messageText });
239
+ const response = await client.im.message.update({
240
+ path: { message_id: messageId },
241
+ data: {
242
+ msg_type: msgType,
243
+ content,
244
+ },
245
+ });
246
+ if (response.code !== 0) {
247
+ throw new Error(`Feishu message edit failed: ${response.msg || `code ${response.code}`}`);
248
+ }
249
+ }
250
+ //# sourceMappingURL=send.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/send.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare const FeishuSheetsSchema: import("@sinclair/typebox").TObject<{
2
+ action: import("@sinclair/typebox").TUnsafe<"append" | "get_meta" | "read_range" | "write_range" | "insert_rows" | "add_sheet" | "list_sheets">;
3
+ spreadsheet_token: import("@sinclair/typebox").TString;
4
+ range: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
5
+ values: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TAny>>>;
6
+ sheet_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
7
+ start_index: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
8
+ count: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
9
+ title: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
10
+ index: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
11
+ }>;
12
+ //# sourceMappingURL=sheets-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sheets-schema.d.ts","sourceRoot":"","sources":["../../src/sheets-schema.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,kBAAkB;;;;;;;;;;EA4B7B,CAAC"}