@soimy/dingtalk 3.6.1 → 3.6.2

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 (163) hide show
  1. package/dist/index.d.ts +14 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +14603 -0
  4. package/dist/index.js.map +7 -0
  5. package/dist/src/access-control.d.ts +43 -0
  6. package/dist/src/access-control.d.ts.map +1 -0
  7. package/dist/src/ack-reaction/dynamic-ack-reaction-controller.d.ts +22 -0
  8. package/dist/src/ack-reaction/dynamic-ack-reaction-controller.d.ts.map +1 -0
  9. package/dist/src/ack-reaction/dynamic-ack-reaction-events.d.ts +36 -0
  10. package/dist/src/ack-reaction/dynamic-ack-reaction-events.d.ts.map +1 -0
  11. package/dist/src/ack-reaction/dynamic-ack-reaction-progress.d.ts +7 -0
  12. package/dist/src/ack-reaction/dynamic-ack-reaction-progress.d.ts.map +1 -0
  13. package/dist/src/ack-reaction-classifier.d.ts +8 -0
  14. package/dist/src/ack-reaction-classifier.d.ts.map +1 -0
  15. package/dist/src/ack-reaction-service.d.ts +15 -0
  16. package/dist/src/ack-reaction-service.d.ts.map +1 -0
  17. package/dist/src/auth.d.ts +7 -0
  18. package/dist/src/auth.d.ts.map +1 -0
  19. package/dist/src/card/card-action-handler.d.ts +14 -0
  20. package/dist/src/card/card-action-handler.d.ts.map +1 -0
  21. package/dist/src/card/card-markdown-image-reroute.d.ts +16 -0
  22. package/dist/src/card/card-markdown-image-reroute.d.ts.map +1 -0
  23. package/dist/src/card/card-run-registry.d.ts +60 -0
  24. package/dist/src/card/card-run-registry.d.ts.map +1 -0
  25. package/dist/src/card/card-stop-handler.d.ts +18 -0
  26. package/dist/src/card/card-stop-handler.d.ts.map +1 -0
  27. package/dist/src/card/card-streaming-mode.d.ts +8 -0
  28. package/dist/src/card/card-streaming-mode.d.ts.map +1 -0
  29. package/dist/src/card/card-template.d.ts +21 -0
  30. package/dist/src/card/card-template.d.ts.map +1 -0
  31. package/dist/src/card/reasoning-answer-split.d.ts +6 -0
  32. package/dist/src/card/reasoning-answer-split.d.ts.map +1 -0
  33. package/dist/src/card/reasoning-block-assembler.d.ts +7 -0
  34. package/dist/src/card/reasoning-block-assembler.d.ts.map +1 -0
  35. package/dist/src/card/statusline-renderer.d.ts +24 -0
  36. package/dist/src/card/statusline-renderer.d.ts.map +1 -0
  37. package/dist/src/card-callback-service.d.ts +23 -0
  38. package/dist/src/card-callback-service.d.ts.map +1 -0
  39. package/dist/src/card-draft-controller.d.ts +75 -0
  40. package/dist/src/card-draft-controller.d.ts.map +1 -0
  41. package/dist/src/card-service.d.ts +99 -0
  42. package/dist/src/card-service.d.ts.map +1 -0
  43. package/dist/src/channel.d.ts +10 -0
  44. package/dist/src/channel.d.ts.map +1 -0
  45. package/dist/src/command/card-stop-command.d.ts +30 -0
  46. package/dist/src/command/card-stop-command.d.ts.map +1 -0
  47. package/dist/src/command/inbound-command-dispatch-service.d.ts +40 -0
  48. package/dist/src/command/inbound-command-dispatch-service.d.ts.map +1 -0
  49. package/dist/src/config-schema.d.ts +8 -0
  50. package/dist/src/config-schema.d.ts.map +1 -0
  51. package/dist/src/config.d.ts +60 -0
  52. package/dist/src/config.d.ts.map +1 -0
  53. package/dist/src/connection-manager.d.ts +148 -0
  54. package/dist/src/connection-manager.d.ts.map +1 -0
  55. package/dist/src/dedup.d.ts +4 -0
  56. package/dist/src/dedup.d.ts.map +1 -0
  57. package/dist/src/device-registration.d.ts +16 -0
  58. package/dist/src/device-registration.d.ts.map +1 -0
  59. package/dist/src/docs-service.d.ts +12 -0
  60. package/dist/src/docs-service.d.ts.map +1 -0
  61. package/dist/src/draft-stream-loop.d.ts +28 -0
  62. package/dist/src/draft-stream-loop.d.ts.map +1 -0
  63. package/dist/src/feedback-learning-service.d.ts +123 -0
  64. package/dist/src/feedback-learning-service.d.ts.map +1 -0
  65. package/dist/src/feedback-learning-store.d.ts +181 -0
  66. package/dist/src/feedback-learning-store.d.ts.map +1 -0
  67. package/dist/src/gateway/channel-gateway.d.ts +4 -0
  68. package/dist/src/gateway/channel-gateway.d.ts.map +1 -0
  69. package/dist/src/http-client.d.ts +9 -0
  70. package/dist/src/http-client.d.ts.map +1 -0
  71. package/dist/src/inbound-handler.d.ts +9 -0
  72. package/dist/src/inbound-handler.d.ts.map +1 -0
  73. package/dist/src/learning-command-service.d.ts +64 -0
  74. package/dist/src/learning-command-service.d.ts.map +1 -0
  75. package/dist/src/logger-context.d.ts +10 -0
  76. package/dist/src/logger-context.d.ts.map +1 -0
  77. package/dist/src/media-utils.d.ts +63 -0
  78. package/dist/src/media-utils.d.ts.map +1 -0
  79. package/dist/src/message-context-store.d.ts +126 -0
  80. package/dist/src/message-context-store.d.ts.map +1 -0
  81. package/dist/src/message-utils.d.ts +12 -0
  82. package/dist/src/message-utils.d.ts.map +1 -0
  83. package/dist/src/messaging/attachment-text-extractor.d.ts +13 -0
  84. package/dist/src/messaging/attachment-text-extractor.d.ts.map +1 -0
  85. package/dist/src/messaging/btw-deliver.d.ts +42 -0
  86. package/dist/src/messaging/btw-deliver.d.ts.map +1 -0
  87. package/dist/src/messaging/channel-actions.d.ts +3 -0
  88. package/dist/src/messaging/channel-actions.d.ts.map +1 -0
  89. package/dist/src/messaging/channel-outbound.d.ts +3 -0
  90. package/dist/src/messaging/channel-outbound.d.ts.map +1 -0
  91. package/dist/src/messaging/quoted-context.d.ts +36 -0
  92. package/dist/src/messaging/quoted-context.d.ts.map +1 -0
  93. package/dist/src/messaging/quoted-file-service.d.ts +25 -0
  94. package/dist/src/messaging/quoted-file-service.d.ts.map +1 -0
  95. package/dist/src/messaging/quoted-ref.d.ts +12 -0
  96. package/dist/src/messaging/quoted-ref.d.ts.map +1 -0
  97. package/dist/src/onboarding.d.ts +4 -0
  98. package/dist/src/onboarding.d.ts.map +1 -0
  99. package/dist/src/path-utils.d.ts +3 -0
  100. package/dist/src/path-utils.d.ts.map +1 -0
  101. package/dist/src/peer-id-registry.d.ts +35 -0
  102. package/dist/src/peer-id-registry.d.ts.map +1 -0
  103. package/dist/src/persistence-store.d.ts +27 -0
  104. package/dist/src/persistence-store.d.ts.map +1 -0
  105. package/dist/src/platform/channel-status.d.ts +3 -0
  106. package/dist/src/platform/channel-status.d.ts.map +1 -0
  107. package/dist/src/plugin-sdk-channel-actions-augment.d.ts +7 -0
  108. package/dist/src/plugin-sdk-channel-actions-augment.d.ts.map +1 -0
  109. package/dist/src/proactive-risk-registry.d.ts +22 -0
  110. package/dist/src/proactive-risk-registry.d.ts.map +1 -0
  111. package/dist/src/reply-strategy-card.d.ts +14 -0
  112. package/dist/src/reply-strategy-card.d.ts.map +1 -0
  113. package/dist/src/reply-strategy-markdown.d.ts +10 -0
  114. package/dist/src/reply-strategy-markdown.d.ts.map +1 -0
  115. package/dist/src/reply-strategy-types.d.ts +85 -0
  116. package/dist/src/reply-strategy-types.d.ts.map +1 -0
  117. package/dist/src/reply-strategy-with-reaction.d.ts +47 -0
  118. package/dist/src/reply-strategy-with-reaction.d.ts.map +1 -0
  119. package/dist/src/reply-strategy.d.ts +14 -0
  120. package/dist/src/reply-strategy.d.ts.map +1 -0
  121. package/dist/src/run-usage-store.d.ts +15 -0
  122. package/dist/src/run-usage-store.d.ts.map +1 -0
  123. package/dist/src/runtime.d.ts +4 -0
  124. package/dist/src/runtime.d.ts.map +1 -0
  125. package/dist/src/secret-input.d.ts +42 -0
  126. package/dist/src/secret-input.d.ts.map +1 -0
  127. package/dist/src/send-service.d.ts +46 -0
  128. package/dist/src/send-service.d.ts.map +1 -0
  129. package/dist/src/session-command-service.d.ts +35 -0
  130. package/dist/src/session-command-service.d.ts.map +1 -0
  131. package/dist/src/session-lock.d.ts +11 -0
  132. package/dist/src/session-lock.d.ts.map +1 -0
  133. package/dist/src/session-peer-store.d.ts +21 -0
  134. package/dist/src/session-peer-store.d.ts.map +1 -0
  135. package/dist/src/session-routing.d.ts +14 -0
  136. package/dist/src/session-routing.d.ts.map +1 -0
  137. package/dist/src/session-state.d.ts +13 -0
  138. package/dist/src/session-state.d.ts.map +1 -0
  139. package/dist/src/signature.d.ts +6 -0
  140. package/dist/src/signature.d.ts.map +1 -0
  141. package/dist/src/targeting/agent-name-matcher.d.ts +63 -0
  142. package/dist/src/targeting/agent-name-matcher.d.ts.map +1 -0
  143. package/dist/src/targeting/agent-routing.d.ts +72 -0
  144. package/dist/src/targeting/agent-routing.d.ts.map +1 -0
  145. package/dist/src/targeting/group-members-store.d.ts +3 -0
  146. package/dist/src/targeting/group-members-store.d.ts.map +1 -0
  147. package/dist/src/targeting/target-directory-adapter.d.ts +13 -0
  148. package/dist/src/targeting/target-directory-adapter.d.ts.map +1 -0
  149. package/dist/src/targeting/target-directory-store.d.ts +45 -0
  150. package/dist/src/targeting/target-directory-store.d.ts.map +1 -0
  151. package/dist/src/targeting/target-input.d.ts +3 -0
  152. package/dist/src/targeting/target-input.d.ts.map +1 -0
  153. package/dist/src/types.d.ts +730 -0
  154. package/dist/src/types.d.ts.map +1 -0
  155. package/dist/src/utils.d.ts +54 -0
  156. package/dist/src/utils.d.ts.map +1 -0
  157. package/index.ts +234 -16
  158. package/openclaw.plugin.json +5 -5
  159. package/package.json +26 -5
  160. package/src/device-registration.ts +0 -32
  161. package/src/gateway/channel-gateway.ts +1 -1
  162. package/src/onboarding.ts +3 -7
  163. package/src/secret-input.ts +13 -47
@@ -0,0 +1,730 @@
1
+ /**
2
+ * Type definitions for DingTalk Channel Plugin
3
+ *
4
+ * Provides comprehensive type safety for:
5
+ * - Configuration objects
6
+ * - DingTalk API request/response models
7
+ * - Message content and formats
8
+ * - Media files and streams
9
+ * - Session and token management
10
+ */
11
+ import type { ChannelAccountSnapshot as SDKChannelAccountSnapshot, ChannelGatewayContext as SDKChannelGatewayContext, ChannelLogSink as SDKChannelLogSink } from "openclaw/plugin-sdk/channel-runtime";
12
+ import type { ChannelPlugin as SDKChannelPlugin, OpenClawConfig } from "openclaw/plugin-sdk/core";
13
+ import type { ChannelSetupWizard } from "openclaw/plugin-sdk/setup";
14
+ import type { SecretInput } from "./secret-input";
15
+ export type AckReactionMode = "off" | "emoji" | "kaomoji";
16
+ export type AckReactionConfigValue = string;
17
+ export type CardStreamingMode = "off" | "answer" | "all";
18
+ export type ContextVisibilityMode = "all" | "allowlist" | "allowlist_quote";
19
+ /**
20
+ * DingTalk channel configuration (extends base OpenClaw config)
21
+ */
22
+ export interface DingTalkConfig extends OpenClawConfig {
23
+ clientId: string;
24
+ clientSecret: SecretInput;
25
+ name?: string;
26
+ enabled?: boolean;
27
+ dmPolicy?: "open" | "pairing" | "allowlist";
28
+ groupPolicy?: "open" | "allowlist" | "disabled";
29
+ allowFrom?: string[];
30
+ groupAllowFrom?: string[];
31
+ displayNameResolution?: "disabled" | "all";
32
+ contextVisibility?: ContextVisibilityMode;
33
+ mediaUrlAllowlist?: string[];
34
+ journalTTLDays?: number;
35
+ ackReaction?: AckReactionConfigValue;
36
+ debug?: boolean;
37
+ messageType?: "markdown" | "card";
38
+ /** @deprecated 已固定使用内置模板契约 */
39
+ cardTemplateId?: string;
40
+ /** @deprecated 已固定使用内置模板契约 */
41
+ cardTemplateKey?: string;
42
+ groups?: Record<string, {
43
+ systemPrompt?: string;
44
+ requireMention?: boolean;
45
+ groupAllowFrom?: string[];
46
+ }>;
47
+ accounts?: Record<string, DingTalkConfig>;
48
+ maxConnectionAttempts?: number;
49
+ initialReconnectDelay?: number;
50
+ maxReconnectDelay?: number;
51
+ reconnectJitter?: number;
52
+ /** Maximum number of runtime reconnect cycles before giving up (default: 10) */
53
+ maxReconnectCycles?: number;
54
+ /** Maximum time (ms) for a single reconnect cycle before giving up and starting a new cycle (default: 50000) */
55
+ reconnectDeadlineMs?: number;
56
+ /** Whether to use ConnectionManager; when false, use DWClient native keepAlive+autoReconnect */
57
+ useConnectionManager?: boolean;
58
+ /** Maximum inbound media file size in MB (overrides runtime default when set) */
59
+ mediaMaxMb?: number;
60
+ /** Whether to enable underlying stream keepAlive heartbeat; defaults to !useConnectionManager when omitted */
61
+ keepAlive?: boolean;
62
+ /** Bypass system/global HTTP(S) proxy for DingTalk outbound send/card/upload APIs */
63
+ bypassProxyForSend?: boolean;
64
+ proactivePermissionHint?: {
65
+ enabled?: boolean;
66
+ cooldownHours?: number;
67
+ };
68
+ /** Card streaming mode.
69
+ * - off: disable incremental streaming
70
+ * - answer: stream answer text
71
+ * - all: stream answer + reasoning text */
72
+ cardStreamingMode?: CardStreamingMode;
73
+ /** @deprecated Use `cardStreamingMode` instead. */
74
+ cardRealTimeStream?: boolean;
75
+ /** Throttle interval in ms for card stream updates (default 1000) */
76
+ cardStreamInterval?: number;
77
+ /** AICard degrade duration in milliseconds after trigger errors (default 30m) */
78
+ aicardDegradeMs?: number;
79
+ /** Enable local learning loop (events/reflections/session notes/global rules) */
80
+ learningEnabled?: boolean;
81
+ /** Auto-apply generated reflections into session notes/global rules (default false) */
82
+ learningAutoApply?: boolean;
83
+ /** Session learning note TTL in milliseconds (default 6h) */
84
+ learningNoteTtlMs?: number;
85
+ /** Whether to convert markdown tables to plain text for better rendering on some clients (default: true) */
86
+ convertMarkdownTables?: boolean;
87
+ /** @mention the sender after card finalization in group chats; value is the message text */
88
+ cardAtSender?: string;
89
+ /** Status line visibility toggles for the AI card footer */
90
+ cardStatusLine?: {
91
+ model?: boolean;
92
+ effort?: boolean;
93
+ agent?: boolean;
94
+ taskTime?: boolean;
95
+ tokens?: boolean;
96
+ dapiUsage?: boolean;
97
+ };
98
+ }
99
+ /**
100
+ * Multi-account DingTalk configuration wrapper
101
+ */
102
+ export interface DingTalkChannelConfig {
103
+ enabled?: boolean;
104
+ clientId: string;
105
+ clientSecret: SecretInput;
106
+ name?: string;
107
+ dmPolicy?: "open" | "pairing" | "allowlist";
108
+ groupPolicy?: "open" | "allowlist" | "disabled";
109
+ allowFrom?: string[];
110
+ groupAllowFrom?: string[];
111
+ displayNameResolution?: "disabled" | "all";
112
+ contextVisibility?: ContextVisibilityMode;
113
+ mediaUrlAllowlist?: string[];
114
+ journalTTLDays?: number;
115
+ ackReaction?: AckReactionConfigValue;
116
+ debug?: boolean;
117
+ messageType?: "markdown" | "card";
118
+ /** @deprecated 已固定使用内置模板契约 */
119
+ cardTemplateId?: string;
120
+ /** @deprecated 已固定使用内置模板契约 */
121
+ cardTemplateKey?: string;
122
+ groups?: Record<string, {
123
+ systemPrompt?: string;
124
+ requireMention?: boolean;
125
+ groupAllowFrom?: string[];
126
+ }>;
127
+ accounts?: Record<string, DingTalkConfig>;
128
+ maxConnectionAttempts?: number;
129
+ initialReconnectDelay?: number;
130
+ maxReconnectDelay?: number;
131
+ reconnectJitter?: number;
132
+ /** Maximum number of runtime reconnect cycles before giving up (default: 10) */
133
+ maxReconnectCycles?: number;
134
+ /** Maximum time (ms) for a single reconnect cycle before giving up and starting a new cycle (default: 50000) */
135
+ reconnectDeadlineMs?: number;
136
+ /** Whether to use ConnectionManager; when false, use DWClient native keepAlive+autoReconnect */
137
+ useConnectionManager?: boolean;
138
+ /** Maximum inbound media file size in MB (overrides runtime default when set) */
139
+ mediaMaxMb?: number;
140
+ /** Whether to enable underlying stream keepAlive heartbeat; defaults to !useConnectionManager when omitted */
141
+ keepAlive?: boolean;
142
+ /** Bypass system/global HTTP(S) proxy for DingTalk outbound send/card/upload APIs */
143
+ bypassProxyForSend?: boolean;
144
+ proactivePermissionHint?: {
145
+ enabled?: boolean;
146
+ cooldownHours?: number;
147
+ };
148
+ /** Card streaming mode.
149
+ * - off: disable incremental streaming
150
+ * - answer: stream answer text
151
+ * - all: stream answer + reasoning text */
152
+ cardStreamingMode?: CardStreamingMode;
153
+ /** @deprecated Use `cardStreamingMode` instead. */
154
+ cardRealTimeStream?: boolean;
155
+ /** Throttle interval in ms for card stream updates (default 1000) */
156
+ cardStreamInterval?: number;
157
+ /** AICard degrade duration in milliseconds after trigger errors (default 30m) */
158
+ aicardDegradeMs?: number;
159
+ /** Enable local learning loop (events/reflections/session notes/global rules) */
160
+ learningEnabled?: boolean;
161
+ /** Auto-apply generated reflections into session notes/global rules (default false) */
162
+ learningAutoApply?: boolean;
163
+ /** Session learning note TTL in milliseconds (default 6h) */
164
+ learningNoteTtlMs?: number;
165
+ /** Whether to convert markdown tables to plain text for better rendering on some clients (default: true) */
166
+ convertMarkdownTables?: boolean;
167
+ /** @mention the sender after card finalization in group chats; value is the message text */
168
+ cardAtSender?: string;
169
+ }
170
+ /**
171
+ * DingTalk token info for caching
172
+ */
173
+ export interface TokenInfo {
174
+ accessToken: string;
175
+ expireIn: number;
176
+ }
177
+ /**
178
+ * DingTalk API token response
179
+ */
180
+ export interface TokenResponse {
181
+ accessToken: string;
182
+ expireIn: number;
183
+ }
184
+ /**
185
+ * DingTalk API generic response wrapper
186
+ */
187
+ export interface DingTalkApiResponse<T = unknown> {
188
+ data?: T;
189
+ code?: string;
190
+ message?: string;
191
+ success?: boolean;
192
+ }
193
+ /**
194
+ * Media download response from DingTalk API
195
+ */
196
+ export interface MediaDownloadResponse {
197
+ downloadUrl?: string;
198
+ downloadCode?: string;
199
+ }
200
+ /**
201
+ * Media file metadata
202
+ */
203
+ export interface MediaFile {
204
+ path: string;
205
+ mimeType: string;
206
+ }
207
+ export interface DocInfo {
208
+ docId: string;
209
+ title: string;
210
+ docType: string;
211
+ creatorId?: string;
212
+ updatedAt?: number | string;
213
+ }
214
+ /**
215
+ * DingTalk incoming message (Stream mode)
216
+ */
217
+ export interface DingTalkInboundMessage {
218
+ msgId: string;
219
+ msgtype: string;
220
+ createAt: number;
221
+ /**
222
+ * @ 提及的用户列表(消息顶层,与 text 同级)
223
+ * 包含通过 @picker 选中的所有真实钉钉用户和机器人
224
+ * 格式: [{ dingtalkId: "$:LWCP_v1:$xxx" }]
225
+ */
226
+ atUsers?: Array<{
227
+ dingtalkId: string;
228
+ }>;
229
+ text?: {
230
+ content: string;
231
+ isReplyMsg?: boolean;
232
+ repliedMsg?: {
233
+ msgType?: string;
234
+ msgId?: string;
235
+ senderId?: string;
236
+ createdAt?: number;
237
+ content?: {
238
+ text?: string;
239
+ downloadCode?: string;
240
+ fileName?: string;
241
+ biz_custom_action_url?: string;
242
+ richText?: Array<{
243
+ msgType?: string;
244
+ type?: string;
245
+ content?: string;
246
+ text?: string;
247
+ code?: string;
248
+ atName?: string;
249
+ downloadCode?: string;
250
+ }>;
251
+ /** chatRecord 消息摘要 */
252
+ summary?: string;
253
+ /** chatRecord 消息标题 */
254
+ title?: string;
255
+ };
256
+ };
257
+ };
258
+ content?: {
259
+ downloadCode?: string;
260
+ fileName?: string;
261
+ recognition?: string;
262
+ spaceId?: string;
263
+ fileId?: string;
264
+ text?: string;
265
+ title?: string;
266
+ biz_custom_action_url?: string;
267
+ richText?: Array<{
268
+ type: string;
269
+ text?: string;
270
+ atName?: string;
271
+ atUserId?: string;
272
+ downloadCode?: string;
273
+ }>;
274
+ quoteContent?: string;
275
+ };
276
+ quoteMessage?: {
277
+ msgId?: string;
278
+ msgtype?: string;
279
+ text?: {
280
+ content: string;
281
+ };
282
+ senderNick?: string;
283
+ senderId?: string;
284
+ };
285
+ originalMsgId?: string;
286
+ originalProcessQueryKey?: string;
287
+ conversationType: string;
288
+ conversationId: string;
289
+ conversationTitle?: string;
290
+ senderId: string;
291
+ senderStaffId?: string;
292
+ senderNick?: string;
293
+ chatbotUserId: string;
294
+ sessionWebhook: string;
295
+ }
296
+ export type QuotedRefKey = "msgId" | "processQueryKey" | "messageId" | "outTrackId" | "cardInstanceId";
297
+ export type AttachmentTextSource = "text" | "html" | "pdf" | "docx";
298
+ export interface QuotedRef {
299
+ targetDirection: "inbound" | "outbound";
300
+ key?: QuotedRefKey;
301
+ value?: string;
302
+ fallbackCreatedAt?: number;
303
+ }
304
+ /**
305
+ * Quoted/reply message metadata extracted from repliedMsg.
306
+ * Populated when isReplyMsg is true; downstream handlers use these fields
307
+ * to download quoted media or look up cached card content.
308
+ */
309
+ export interface QuotedInfo {
310
+ mediaDownloadCode?: string;
311
+ mediaType?: string;
312
+ isQuotedFile?: boolean;
313
+ isQuotedCard?: boolean;
314
+ isQuotedDocCard?: boolean;
315
+ cardCreatedAt?: number;
316
+ processQueryKey?: string;
317
+ fileCreatedAt?: number;
318
+ fileDownloadCode?: string;
319
+ msgId?: string;
320
+ previewText?: string;
321
+ previewMessageType?: string;
322
+ previewFileName?: string;
323
+ previewSenderId?: string;
324
+ }
325
+ /**
326
+ * @ 提及信息
327
+ */
328
+ export interface AtMention {
329
+ /** @ 显示的名字(去除 @ 前缀) */
330
+ name: string;
331
+ /** 钉钉用户 ID(如果是 @ 真人) */
332
+ userId?: string;
333
+ }
334
+ /**
335
+ * Agent 名字匹配结果
336
+ */
337
+ export interface AgentNameMatch {
338
+ /** 匹配到的 agent ID */
339
+ agentId: string;
340
+ /** 匹配来源:'name' | 'id' */
341
+ matchSource: "name" | "id";
342
+ /** 匹配到的名字 */
343
+ matchedName: string;
344
+ }
345
+ /**
346
+ * Extracted message content for unified processing
347
+ */
348
+ export interface MessageContent {
349
+ text: string;
350
+ mediaPath?: string;
351
+ mediaPaths?: string[];
352
+ mediaType?: string;
353
+ mediaTypes?: string[];
354
+ messageType: string;
355
+ docSpaceId?: string;
356
+ docFileId?: string;
357
+ quoted?: QuotedInfo;
358
+ /** @ 提及列表(从文本或 richText 提取的名字) */
359
+ atMentions?: AtMention[];
360
+ /**
361
+ * 通过 @picker 选中的真实钉钉用户的 dingtalkId 列表
362
+ * - 仅包含真实钉钉用户和机器人,不包含 agent 名
363
+ * - 用于排除真人:如果 atMentions 中的名字匹配到 agent,说明是 agent;
364
+ * 如果没匹配到 agent 且有 atUserDingtalkIds,则可能是真人
365
+ * - 注意:无法将 dingtalkId 映射到具体名字,因为 webhook 不提供此映射
366
+ */
367
+ atUserDingtalkIds?: string[];
368
+ }
369
+ /**
370
+ * Send message options
371
+ */
372
+ export interface SendMessageOptions {
373
+ title?: string;
374
+ useMarkdown?: boolean;
375
+ atUserId?: string | null;
376
+ log?: Logger;
377
+ conversationId?: string;
378
+ mediaPath?: string;
379
+ filePath?: string;
380
+ mediaUrl?: string;
381
+ mediaType?: "image" | "voice" | "video" | "file";
382
+ accountId?: string;
383
+ storePath?: string;
384
+ cardUpdateMode?: "append";
385
+ quotedRef?: QuotedRef;
386
+ /** Force markdown/text delivery even when messageType is "card". Bypasses card
387
+ * creation while preserving journal writes and other side-effects. */
388
+ forceMarkdown?: boolean;
389
+ /** Allowed local roots for sandbox/container media path resolution. */
390
+ mediaLocalRoots?: string[];
391
+ }
392
+ export interface DingTalkTrackingMetadata {
393
+ processQueryKey?: string;
394
+ outTrackId?: string;
395
+ cardInstanceId?: string;
396
+ }
397
+ /**
398
+ * Session webhook response
399
+ */
400
+ export interface SessionWebhookResponse {
401
+ msgtype: string;
402
+ markdown?: {
403
+ title: string;
404
+ text: string;
405
+ };
406
+ text?: {
407
+ content: string;
408
+ };
409
+ at?: {
410
+ atUserIds: string[];
411
+ isAtAll: boolean;
412
+ };
413
+ }
414
+ /**
415
+ * Sub-agent routing options for parameterized message handling
416
+ */
417
+ export interface SubAgentOptions {
418
+ /** The agent ID to route to */
419
+ agentId: string;
420
+ /** Prefix to add to response messages (e.g., "[AgentName] ") */
421
+ responsePrefix: string;
422
+ /** The matched agent name */
423
+ matchedName: string;
424
+ }
425
+ /**
426
+ * Message handler parameters
427
+ */
428
+ export interface HandleDingTalkMessageParams {
429
+ cfg: OpenClawConfig;
430
+ accountId: string;
431
+ data: DingTalkInboundMessage;
432
+ sessionWebhook: string;
433
+ log?: Logger;
434
+ dingtalkConfig: DingTalkConfig;
435
+ /**
436
+ * When set, routes message to the specified sub-agent instead of main agent.
437
+ * This enables reuse of the main message handling logic for sub-agents.
438
+ */
439
+ subAgentOptions?: SubAgentOptions;
440
+ /**
441
+ * Pre-downloaded media for sub-agent calls.
442
+ * When set, skips media download to avoid duplication in recursive calls.
443
+ */
444
+ preDownloadedMedia?: {
445
+ mediaPath?: string;
446
+ mediaType?: string;
447
+ mediaPaths?: string[];
448
+ mediaTypes?: string[];
449
+ };
450
+ }
451
+ /**
452
+ * Proactive message payload
453
+ */
454
+ export interface ProactiveMessagePayload {
455
+ robotCode: string;
456
+ msgKey: string;
457
+ msgParam: string;
458
+ openConversationId?: string;
459
+ userIds?: string[];
460
+ }
461
+ /**
462
+ * Account descriptor
463
+ */
464
+ export interface AccountDescriptor {
465
+ accountId: string;
466
+ config?: DingTalkConfig;
467
+ enabled?: boolean;
468
+ name?: string;
469
+ configured?: boolean;
470
+ }
471
+ /**
472
+ * Account resolver result
473
+ */
474
+ export interface ResolvedAccount {
475
+ accountId: string;
476
+ config: DingTalkConfig;
477
+ enabled: boolean;
478
+ }
479
+ /**
480
+ * HTTP request config for axios
481
+ */
482
+ export interface AxiosRequestConfig {
483
+ url?: string;
484
+ method?: string;
485
+ data?: unknown;
486
+ headers?: Record<string, string>;
487
+ responseType?: "arraybuffer" | "json" | "text";
488
+ }
489
+ /**
490
+ * HTTP response from axios
491
+ */
492
+ export interface AxiosResponse<T = unknown> {
493
+ data: T;
494
+ status: number;
495
+ statusText: string;
496
+ headers: Record<string, string>;
497
+ }
498
+ /**
499
+ * DingTalk Stream callback listener types
500
+ */
501
+ export interface StreamCallbackResponse {
502
+ headers?: {
503
+ messageId?: string;
504
+ };
505
+ data: string;
506
+ }
507
+ /**
508
+ * Reply dispatcher context
509
+ */
510
+ export interface ReplyDispatchContext {
511
+ responsePrefix?: string;
512
+ deliver: (payload: unknown) => Promise<{
513
+ ok: boolean;
514
+ error?: string;
515
+ }>;
516
+ }
517
+ /**
518
+ * Reply dispatcher result
519
+ */
520
+ export interface ReplyDispatcherResult {
521
+ dispatcher: unknown;
522
+ replyOptions: unknown;
523
+ markDispatchIdle: () => void;
524
+ }
525
+ /**
526
+ * Retry options
527
+ */
528
+ export interface RetryOptions {
529
+ maxRetries?: number;
530
+ baseDelayMs?: number;
531
+ log?: Logger;
532
+ }
533
+ /**
534
+ * Channel log sink
535
+ */
536
+ export type ChannelLogSink = SDKChannelLogSink;
537
+ /**
538
+ * @deprecated Use ChannelLogSink instead
539
+ */
540
+ export type Logger = ChannelLogSink;
541
+ /**
542
+ * Channel account snapshot
543
+ */
544
+ export type ChannelAccountSnapshot = SDKChannelAccountSnapshot;
545
+ /**
546
+ * @deprecated Use ChannelAccountSnapshot instead
547
+ */
548
+ export type ChannelSnapshot = ChannelAccountSnapshot;
549
+ /**
550
+ * Plugin gateway start context
551
+ */
552
+ export type GatewayStartContext = SDKChannelGatewayContext<ResolvedAccount>;
553
+ /**
554
+ * Plugin gateway account stop result
555
+ */
556
+ export interface GatewayStopResult {
557
+ stop: () => void;
558
+ }
559
+ /**
560
+ * DingTalk channel plugin definition
561
+ */
562
+ export type DingTalkChannelPlugin = SDKChannelPlugin<ResolvedAccount & {
563
+ configured: boolean;
564
+ }> & {
565
+ setupWizard?: ChannelSetupWizard;
566
+ };
567
+ /**
568
+ * Result of target resolution validation
569
+ */
570
+ export interface TargetResolutionResult {
571
+ ok: boolean;
572
+ to?: string;
573
+ error?: Error;
574
+ }
575
+ /**
576
+ * Parameters for resolveTarget validation
577
+ */
578
+ export interface ResolveTargetParams {
579
+ to?: string | null;
580
+ [key: string]: unknown;
581
+ }
582
+ /**
583
+ * Parameters for sendText delivery
584
+ */
585
+ export interface SendTextParams {
586
+ cfg: DingTalkConfig;
587
+ to: string;
588
+ text: string;
589
+ accountId?: string;
590
+ [key: string]: unknown;
591
+ }
592
+ /**
593
+ * Parameters for sendMedia delivery
594
+ */
595
+ export interface SendMediaParams {
596
+ cfg: DingTalkConfig;
597
+ to: string;
598
+ mediaPath: string;
599
+ accountId?: string;
600
+ [key: string]: unknown;
601
+ }
602
+ /**
603
+ * DingTalk outbound handler configuration
604
+ */
605
+ export interface DingTalkOutboundHandler {
606
+ deliveryMode: "direct" | "queued" | "batch";
607
+ resolveTarget: (params: ResolveTargetParams) => TargetResolutionResult;
608
+ sendText: (params: SendTextParams) => Promise<{
609
+ ok: boolean;
610
+ data?: unknown;
611
+ error?: unknown;
612
+ }>;
613
+ sendMedia?: (params: SendMediaParams) => Promise<{
614
+ ok: boolean;
615
+ data?: unknown;
616
+ error?: unknown;
617
+ }>;
618
+ }
619
+ /**
620
+ * AI Card status constants
621
+ */
622
+ export declare const AICardStatus: {
623
+ readonly PROCESSING: "1";
624
+ readonly INPUTING: "2";
625
+ readonly FINISHED: "3";
626
+ readonly STOPPED: "4";
627
+ readonly FAILED: "5";
628
+ };
629
+ /**
630
+ * AI Card state type
631
+ */
632
+ export type AICardState = (typeof AICardStatus)[keyof typeof AICardStatus];
633
+ /**
634
+ * AI Card instance
635
+ */
636
+ export interface AICardInstance {
637
+ cardInstanceId: string;
638
+ processQueryKey?: string;
639
+ accessToken: string;
640
+ conversationId: string;
641
+ contextConversationId?: string;
642
+ accountId?: string;
643
+ storePath?: string;
644
+ createdAt: number;
645
+ lastUpdated: number;
646
+ state: AICardState;
647
+ config?: DingTalkConfig;
648
+ lastStreamedContent?: string;
649
+ lastBlockListJson?: string;
650
+ outTrackId?: string;
651
+ /** Cumulative DingTalk API call count for this card instance. */
652
+ dapiUsage?: number;
653
+ /** True after this card has successfully opened DingTalk's streaming lifecycle. */
654
+ streamLifecycleOpened?: boolean;
655
+ }
656
+ /**
657
+ * AI Card streaming update request (new API)
658
+ */
659
+ export interface AICardStreamingRequest {
660
+ outTrackId: string;
661
+ guid: string;
662
+ key: string;
663
+ content: string;
664
+ isFull: boolean;
665
+ isFinalize: boolean;
666
+ isError: boolean;
667
+ }
668
+ /**
669
+ * Connection state enum for lifecycle management
670
+ */
671
+ export declare enum ConnectionState {
672
+ DISCONNECTED = "DISCONNECTED",
673
+ CONNECTING = "CONNECTING",
674
+ CONNECTED = "CONNECTED",
675
+ DISCONNECTING = "DISCONNECTING",
676
+ FAILED = "FAILED"
677
+ }
678
+ /**
679
+ * Factory function that creates a fresh DWClient with callback listeners
680
+ * already registered. Used by ConnectionManager to create a new client
681
+ * on reconnection so the new WebSocket can start receiving messages
682
+ * while the old zombie socket is still being cleaned up.
683
+ */
684
+ export type StreamClientFactory = () => import("dingtalk-stream").DWClient;
685
+ /**
686
+ * Connection manager configuration
687
+ */
688
+ export interface ConnectionManagerConfig {
689
+ maxAttempts: number;
690
+ initialDelay: number;
691
+ maxDelay: number;
692
+ jitter: number;
693
+ /** Maximum number of runtime reconnect cycles before giving up (default: 10) */
694
+ maxReconnectCycles?: number;
695
+ /** Maximum time (ms) for a single reconnect cycle before giving up and starting a new cycle (default: 50000) */
696
+ reconnectDeadlineMs?: number;
697
+ /** Callback invoked when connection state changes */
698
+ onStateChange?: (state: ConnectionState, error?: string) => void;
699
+ }
700
+ /**
701
+ * Connection attempt result
702
+ */
703
+ export interface ConnectionAttemptResult {
704
+ success: boolean;
705
+ attempt: number;
706
+ error?: Error;
707
+ nextDelay?: number;
708
+ }
709
+ /**
710
+ * CardBlock types for AI Card v2 blockList.
711
+ * - 0 = answer (markdown text)
712
+ * - 1 = thinking process
713
+ * - 2 = tool result
714
+ * - 3 = image (uploaded mediaId)
715
+ */
716
+ export type CardBlock = {
717
+ type: 0;
718
+ markdown: string;
719
+ } | {
720
+ type: 1;
721
+ markdown: string;
722
+ } | {
723
+ type: 2;
724
+ markdown: string;
725
+ } | {
726
+ type: 3;
727
+ mediaId: string;
728
+ text?: string;
729
+ };
730
+ //# sourceMappingURL=types.d.ts.map