@soimy/dingtalk 3.6.1 → 3.6.2-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14443 -0
- package/dist/index.js.map +7 -0
- package/dist/src/access-control.d.ts +43 -0
- package/dist/src/access-control.d.ts.map +1 -0
- package/dist/src/ack-reaction/dynamic-ack-reaction-controller.d.ts +22 -0
- package/dist/src/ack-reaction/dynamic-ack-reaction-controller.d.ts.map +1 -0
- package/dist/src/ack-reaction/dynamic-ack-reaction-events.d.ts +36 -0
- package/dist/src/ack-reaction/dynamic-ack-reaction-events.d.ts.map +1 -0
- package/dist/src/ack-reaction/dynamic-ack-reaction-progress.d.ts +7 -0
- package/dist/src/ack-reaction/dynamic-ack-reaction-progress.d.ts.map +1 -0
- package/dist/src/ack-reaction-classifier.d.ts +8 -0
- package/dist/src/ack-reaction-classifier.d.ts.map +1 -0
- package/dist/src/ack-reaction-service.d.ts +15 -0
- package/dist/src/ack-reaction-service.d.ts.map +1 -0
- package/dist/src/auth.d.ts +7 -0
- package/dist/src/auth.d.ts.map +1 -0
- package/dist/src/card/card-action-handler.d.ts +14 -0
- package/dist/src/card/card-action-handler.d.ts.map +1 -0
- package/dist/src/card/card-markdown-image-reroute.d.ts +16 -0
- package/dist/src/card/card-markdown-image-reroute.d.ts.map +1 -0
- package/dist/src/card/card-run-registry.d.ts +60 -0
- package/dist/src/card/card-run-registry.d.ts.map +1 -0
- package/dist/src/card/card-stop-handler.d.ts +18 -0
- package/dist/src/card/card-stop-handler.d.ts.map +1 -0
- package/dist/src/card/card-streaming-mode.d.ts +8 -0
- package/dist/src/card/card-streaming-mode.d.ts.map +1 -0
- package/dist/src/card/card-template.d.ts +21 -0
- package/dist/src/card/card-template.d.ts.map +1 -0
- package/dist/src/card/reasoning-answer-split.d.ts +6 -0
- package/dist/src/card/reasoning-answer-split.d.ts.map +1 -0
- package/dist/src/card/reasoning-block-assembler.d.ts +7 -0
- package/dist/src/card/reasoning-block-assembler.d.ts.map +1 -0
- package/dist/src/card/statusline-renderer.d.ts +24 -0
- package/dist/src/card/statusline-renderer.d.ts.map +1 -0
- package/dist/src/card-callback-service.d.ts +23 -0
- package/dist/src/card-callback-service.d.ts.map +1 -0
- package/dist/src/card-draft-controller.d.ts +75 -0
- package/dist/src/card-draft-controller.d.ts.map +1 -0
- package/dist/src/card-service.d.ts +99 -0
- package/dist/src/card-service.d.ts.map +1 -0
- package/dist/src/channel.d.ts +10 -0
- package/dist/src/channel.d.ts.map +1 -0
- package/dist/src/command/card-stop-command.d.ts +30 -0
- package/dist/src/command/card-stop-command.d.ts.map +1 -0
- package/dist/src/command/inbound-command-dispatch-service.d.ts +40 -0
- package/dist/src/command/inbound-command-dispatch-service.d.ts.map +1 -0
- package/dist/src/config-schema.d.ts +8 -0
- package/dist/src/config-schema.d.ts.map +1 -0
- package/dist/src/config.d.ts +60 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/connection-manager.d.ts +148 -0
- package/dist/src/connection-manager.d.ts.map +1 -0
- package/dist/src/dedup.d.ts +4 -0
- package/dist/src/dedup.d.ts.map +1 -0
- package/dist/src/device-registration.d.ts +16 -0
- package/dist/src/device-registration.d.ts.map +1 -0
- package/dist/src/docs-service.d.ts +12 -0
- package/dist/src/docs-service.d.ts.map +1 -0
- package/dist/src/draft-stream-loop.d.ts +28 -0
- package/dist/src/draft-stream-loop.d.ts.map +1 -0
- package/dist/src/feedback-learning-service.d.ts +123 -0
- package/dist/src/feedback-learning-service.d.ts.map +1 -0
- package/dist/src/feedback-learning-store.d.ts +181 -0
- package/dist/src/feedback-learning-store.d.ts.map +1 -0
- package/dist/src/gateway/channel-gateway.d.ts +4 -0
- package/dist/src/gateway/channel-gateway.d.ts.map +1 -0
- package/dist/src/http-client.d.ts +9 -0
- package/dist/src/http-client.d.ts.map +1 -0
- package/dist/src/inbound-handler.d.ts +9 -0
- package/dist/src/inbound-handler.d.ts.map +1 -0
- package/dist/src/learning-command-service.d.ts +64 -0
- package/dist/src/learning-command-service.d.ts.map +1 -0
- package/dist/src/logger-context.d.ts +10 -0
- package/dist/src/logger-context.d.ts.map +1 -0
- package/dist/src/media-utils.d.ts +63 -0
- package/dist/src/media-utils.d.ts.map +1 -0
- package/dist/src/message-context-store.d.ts +126 -0
- package/dist/src/message-context-store.d.ts.map +1 -0
- package/dist/src/message-utils.d.ts +12 -0
- package/dist/src/message-utils.d.ts.map +1 -0
- package/dist/src/messaging/attachment-text-extractor.d.ts +13 -0
- package/dist/src/messaging/attachment-text-extractor.d.ts.map +1 -0
- package/dist/src/messaging/btw-deliver.d.ts +42 -0
- package/dist/src/messaging/btw-deliver.d.ts.map +1 -0
- package/dist/src/messaging/channel-actions.d.ts +3 -0
- package/dist/src/messaging/channel-actions.d.ts.map +1 -0
- package/dist/src/messaging/channel-outbound.d.ts +3 -0
- package/dist/src/messaging/channel-outbound.d.ts.map +1 -0
- package/dist/src/messaging/quoted-context.d.ts +36 -0
- package/dist/src/messaging/quoted-context.d.ts.map +1 -0
- package/dist/src/messaging/quoted-file-service.d.ts +25 -0
- package/dist/src/messaging/quoted-file-service.d.ts.map +1 -0
- package/dist/src/messaging/quoted-ref.d.ts +12 -0
- package/dist/src/messaging/quoted-ref.d.ts.map +1 -0
- package/dist/src/onboarding.d.ts +4 -0
- package/dist/src/onboarding.d.ts.map +1 -0
- package/dist/src/path-utils.d.ts +3 -0
- package/dist/src/path-utils.d.ts.map +1 -0
- package/dist/src/peer-id-registry.d.ts +35 -0
- package/dist/src/peer-id-registry.d.ts.map +1 -0
- package/dist/src/persistence-store.d.ts +27 -0
- package/dist/src/persistence-store.d.ts.map +1 -0
- package/dist/src/platform/channel-status.d.ts +3 -0
- package/dist/src/platform/channel-status.d.ts.map +1 -0
- package/dist/src/plugin-sdk-channel-actions-augment.d.ts +7 -0
- package/dist/src/plugin-sdk-channel-actions-augment.d.ts.map +1 -0
- package/dist/src/proactive-risk-registry.d.ts +22 -0
- package/dist/src/proactive-risk-registry.d.ts.map +1 -0
- package/dist/src/reply-strategy-card.d.ts +14 -0
- package/dist/src/reply-strategy-card.d.ts.map +1 -0
- package/dist/src/reply-strategy-markdown.d.ts +10 -0
- package/dist/src/reply-strategy-markdown.d.ts.map +1 -0
- package/dist/src/reply-strategy-types.d.ts +85 -0
- package/dist/src/reply-strategy-types.d.ts.map +1 -0
- package/dist/src/reply-strategy-with-reaction.d.ts +47 -0
- package/dist/src/reply-strategy-with-reaction.d.ts.map +1 -0
- package/dist/src/reply-strategy.d.ts +14 -0
- package/dist/src/reply-strategy.d.ts.map +1 -0
- package/dist/src/run-usage-store.d.ts +15 -0
- package/dist/src/run-usage-store.d.ts.map +1 -0
- package/dist/src/runtime.d.ts +4 -0
- package/dist/src/runtime.d.ts.map +1 -0
- package/dist/src/secret-input.d.ts +42 -0
- package/dist/src/secret-input.d.ts.map +1 -0
- package/dist/src/send-service.d.ts +46 -0
- package/dist/src/send-service.d.ts.map +1 -0
- package/dist/src/session-command-service.d.ts +35 -0
- package/dist/src/session-command-service.d.ts.map +1 -0
- package/dist/src/session-lock.d.ts +11 -0
- package/dist/src/session-lock.d.ts.map +1 -0
- package/dist/src/session-peer-store.d.ts +21 -0
- package/dist/src/session-peer-store.d.ts.map +1 -0
- package/dist/src/session-routing.d.ts +14 -0
- package/dist/src/session-routing.d.ts.map +1 -0
- package/dist/src/session-state.d.ts +13 -0
- package/dist/src/session-state.d.ts.map +1 -0
- package/dist/src/signature.d.ts +6 -0
- package/dist/src/signature.d.ts.map +1 -0
- package/dist/src/targeting/agent-name-matcher.d.ts +63 -0
- package/dist/src/targeting/agent-name-matcher.d.ts.map +1 -0
- package/dist/src/targeting/agent-routing.d.ts +72 -0
- package/dist/src/targeting/agent-routing.d.ts.map +1 -0
- package/dist/src/targeting/group-members-store.d.ts +3 -0
- package/dist/src/targeting/group-members-store.d.ts.map +1 -0
- package/dist/src/targeting/target-directory-adapter.d.ts +13 -0
- package/dist/src/targeting/target-directory-adapter.d.ts.map +1 -0
- package/dist/src/targeting/target-directory-store.d.ts +45 -0
- package/dist/src/targeting/target-directory-store.d.ts.map +1 -0
- package/dist/src/targeting/target-input.d.ts +3 -0
- package/dist/src/targeting/target-input.d.ts.map +1 -0
- package/dist/src/types.d.ts +730 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/utils.d.ts +54 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/openclaw.plugin.json +5 -5
- package/package.json +26 -5
- package/src/device-registration.ts +0 -32
- package/src/gateway/channel-gateway.ts +1 -1
- package/src/onboarding.ts +3 -7
- 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
|