clawdbot-dingtalk 0.1.0
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/README.md +164 -0
- package/clawdbot.plugin.json +11 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/src/accounts.d.ts +47 -0
- package/dist/src/accounts.d.ts.map +1 -0
- package/dist/src/accounts.js +152 -0
- package/dist/src/accounts.js.map +1 -0
- package/dist/src/channel.d.ts +10 -0
- package/dist/src/channel.d.ts.map +1 -0
- package/dist/src/channel.js +186 -0
- package/dist/src/channel.js.map +1 -0
- package/dist/src/config-schema.d.ts +279 -0
- package/dist/src/config-schema.d.ts.map +1 -0
- package/dist/src/config-schema.js +92 -0
- package/dist/src/config-schema.js.map +1 -0
- package/dist/src/monitor.d.ts +17 -0
- package/dist/src/monitor.d.ts.map +1 -0
- package/dist/src/monitor.js +183 -0
- package/dist/src/monitor.js.map +1 -0
- package/dist/src/probe.d.ts +15 -0
- package/dist/src/probe.d.ts.map +1 -0
- package/dist/src/probe.js +48 -0
- package/dist/src/probe.js.map +1 -0
- package/dist/src/runtime.d.ts +4 -0
- package/dist/src/runtime.d.ts.map +1 -0
- package/dist/src/runtime.js +11 -0
- package/dist/src/runtime.js.map +1 -0
- package/dist/src/send/chunker.d.ts +23 -0
- package/dist/src/send/chunker.d.ts.map +1 -0
- package/dist/src/send/chunker.js +149 -0
- package/dist/src/send/chunker.js.map +1 -0
- package/dist/src/send/index.d.ts +9 -0
- package/dist/src/send/index.d.ts.map +1 -0
- package/dist/src/send/index.js +7 -0
- package/dist/src/send/index.js.map +1 -0
- package/dist/src/send/markdown.d.ts +13 -0
- package/dist/src/send/markdown.d.ts.map +1 -0
- package/dist/src/send/markdown.js +44 -0
- package/dist/src/send/markdown.js.map +1 -0
- package/dist/src/send/reply.d.ts +35 -0
- package/dist/src/send/reply.d.ts.map +1 -0
- package/dist/src/send/reply.js +100 -0
- package/dist/src/send/reply.js.map +1 -0
- package/dist/src/stream/client.d.ts +11 -0
- package/dist/src/stream/client.d.ts.map +1 -0
- package/dist/src/stream/client.js +182 -0
- package/dist/src/stream/client.js.map +1 -0
- package/dist/src/stream/index.d.ts +7 -0
- package/dist/src/stream/index.d.ts.map +1 -0
- package/dist/src/stream/index.js +6 -0
- package/dist/src/stream/index.js.map +1 -0
- package/dist/src/stream/message-parser.d.ts +24 -0
- package/dist/src/stream/message-parser.d.ts.map +1 -0
- package/dist/src/stream/message-parser.js +211 -0
- package/dist/src/stream/message-parser.js.map +1 -0
- package/dist/src/stream/types.d.ts +92 -0
- package/dist/src/stream/types.d.ts.map +1 -0
- package/dist/src/stream/types.js +5 -0
- package/dist/src/stream/types.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Coalesce configuration for batching small messages before sending.
|
|
4
|
+
*/
|
|
5
|
+
export declare const CoalesceConfigSchema: z.ZodObject<{
|
|
6
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
7
|
+
minChars: z.ZodDefault<z.ZodNumber>;
|
|
8
|
+
maxChars: z.ZodDefault<z.ZodNumber>;
|
|
9
|
+
idleMs: z.ZodDefault<z.ZodNumber>;
|
|
10
|
+
}, "strip", z.ZodTypeAny, {
|
|
11
|
+
enabled?: boolean;
|
|
12
|
+
minChars?: number;
|
|
13
|
+
maxChars?: number;
|
|
14
|
+
idleMs?: number;
|
|
15
|
+
}, {
|
|
16
|
+
enabled?: boolean;
|
|
17
|
+
minChars?: number;
|
|
18
|
+
maxChars?: number;
|
|
19
|
+
idleMs?: number;
|
|
20
|
+
}>;
|
|
21
|
+
/**
|
|
22
|
+
* DingTalk channel configuration schema.
|
|
23
|
+
* Maps from YAML config under `channels.dingtalk.*`
|
|
24
|
+
*/
|
|
25
|
+
export declare const DingTalkConfigSchema: z.ZodObject<{
|
|
26
|
+
/** Enable/disable the channel */
|
|
27
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
28
|
+
/** DingTalk app client ID (required) */
|
|
29
|
+
clientId: z.ZodOptional<z.ZodString>;
|
|
30
|
+
/** DingTalk app client secret (required) */
|
|
31
|
+
clientSecret: z.ZodOptional<z.ZodString>;
|
|
32
|
+
/** Path to file containing client secret */
|
|
33
|
+
clientSecretFile: z.ZodOptional<z.ZodString>;
|
|
34
|
+
/** Display name for this account */
|
|
35
|
+
name: z.ZodOptional<z.ZodString>;
|
|
36
|
+
/** DingTalk API base URL */
|
|
37
|
+
apiBase: z.ZodDefault<z.ZodString>;
|
|
38
|
+
/** Stream open path */
|
|
39
|
+
openPath: z.ZodDefault<z.ZodString>;
|
|
40
|
+
/** Custom subscriptions JSON for stream */
|
|
41
|
+
subscriptionsJson: z.ZodOptional<z.ZodString>;
|
|
42
|
+
/** Reply mode: text or markdown */
|
|
43
|
+
replyMode: z.ZodDefault<z.ZodEnum<["text", "markdown"]>>;
|
|
44
|
+
/** Maximum characters per message chunk */
|
|
45
|
+
maxChars: z.ZodDefault<z.ZodNumber>;
|
|
46
|
+
/** Allowlist of sender IDs (empty = allow all) */
|
|
47
|
+
allowFrom: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
48
|
+
/** Bot's own user ID to skip self-messages */
|
|
49
|
+
selfUserId: z.ZodOptional<z.ZodString>;
|
|
50
|
+
/** Require messages to start with this prefix (for group filtering) */
|
|
51
|
+
requirePrefix: z.ZodOptional<z.ZodString>;
|
|
52
|
+
/** Prefix to add to response messages (supports {model}, {provider} vars) */
|
|
53
|
+
responsePrefix: z.ZodOptional<z.ZodString>;
|
|
54
|
+
/** Table conversion mode for markdown */
|
|
55
|
+
tableMode: z.ZodDefault<z.ZodEnum<["code", "off"]>>;
|
|
56
|
+
/** Message coalescing configuration */
|
|
57
|
+
coalesce: z.ZodOptional<z.ZodObject<{
|
|
58
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
59
|
+
minChars: z.ZodDefault<z.ZodNumber>;
|
|
60
|
+
maxChars: z.ZodDefault<z.ZodNumber>;
|
|
61
|
+
idleMs: z.ZodDefault<z.ZodNumber>;
|
|
62
|
+
}, "strip", z.ZodTypeAny, {
|
|
63
|
+
enabled?: boolean;
|
|
64
|
+
minChars?: number;
|
|
65
|
+
maxChars?: number;
|
|
66
|
+
idleMs?: number;
|
|
67
|
+
}, {
|
|
68
|
+
enabled?: boolean;
|
|
69
|
+
minChars?: number;
|
|
70
|
+
maxChars?: number;
|
|
71
|
+
idleMs?: number;
|
|
72
|
+
}>>;
|
|
73
|
+
/** Show tool status messages (🔧 正在执行...) */
|
|
74
|
+
showToolStatus: z.ZodDefault<z.ZodBoolean>;
|
|
75
|
+
/** Show tool result messages (✅ ... 完成) */
|
|
76
|
+
showToolResult: z.ZodDefault<z.ZodBoolean>;
|
|
77
|
+
/** Thinking mode for Clawdbot */
|
|
78
|
+
thinking: z.ZodDefault<z.ZodEnum<["off", "minimal", "low", "medium", "high"]>>;
|
|
79
|
+
/** Multi-account configuration */
|
|
80
|
+
accounts: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
81
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
82
|
+
clientId: z.ZodOptional<z.ZodString>;
|
|
83
|
+
clientSecret: z.ZodOptional<z.ZodString>;
|
|
84
|
+
clientSecretFile: z.ZodOptional<z.ZodString>;
|
|
85
|
+
name: z.ZodOptional<z.ZodString>;
|
|
86
|
+
apiBase: z.ZodOptional<z.ZodString>;
|
|
87
|
+
openPath: z.ZodOptional<z.ZodString>;
|
|
88
|
+
subscriptionsJson: z.ZodOptional<z.ZodString>;
|
|
89
|
+
replyMode: z.ZodOptional<z.ZodEnum<["text", "markdown"]>>;
|
|
90
|
+
maxChars: z.ZodOptional<z.ZodNumber>;
|
|
91
|
+
allowFrom: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
92
|
+
selfUserId: z.ZodOptional<z.ZodString>;
|
|
93
|
+
requirePrefix: z.ZodOptional<z.ZodString>;
|
|
94
|
+
responsePrefix: z.ZodOptional<z.ZodString>;
|
|
95
|
+
tableMode: z.ZodOptional<z.ZodEnum<["code", "off"]>>;
|
|
96
|
+
coalesce: z.ZodOptional<z.ZodObject<{
|
|
97
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
98
|
+
minChars: z.ZodDefault<z.ZodNumber>;
|
|
99
|
+
maxChars: z.ZodDefault<z.ZodNumber>;
|
|
100
|
+
idleMs: z.ZodDefault<z.ZodNumber>;
|
|
101
|
+
}, "strip", z.ZodTypeAny, {
|
|
102
|
+
enabled?: boolean;
|
|
103
|
+
minChars?: number;
|
|
104
|
+
maxChars?: number;
|
|
105
|
+
idleMs?: number;
|
|
106
|
+
}, {
|
|
107
|
+
enabled?: boolean;
|
|
108
|
+
minChars?: number;
|
|
109
|
+
maxChars?: number;
|
|
110
|
+
idleMs?: number;
|
|
111
|
+
}>>;
|
|
112
|
+
showToolStatus: z.ZodOptional<z.ZodBoolean>;
|
|
113
|
+
showToolResult: z.ZodOptional<z.ZodBoolean>;
|
|
114
|
+
thinking: z.ZodOptional<z.ZodEnum<["off", "minimal", "low", "medium", "high"]>>;
|
|
115
|
+
}, "strip", z.ZodTypeAny, {
|
|
116
|
+
enabled?: boolean;
|
|
117
|
+
maxChars?: number;
|
|
118
|
+
clientId?: string;
|
|
119
|
+
clientSecret?: string;
|
|
120
|
+
clientSecretFile?: string;
|
|
121
|
+
name?: string;
|
|
122
|
+
apiBase?: string;
|
|
123
|
+
openPath?: string;
|
|
124
|
+
subscriptionsJson?: string;
|
|
125
|
+
replyMode?: "text" | "markdown";
|
|
126
|
+
allowFrom?: string[];
|
|
127
|
+
selfUserId?: string;
|
|
128
|
+
requirePrefix?: string;
|
|
129
|
+
responsePrefix?: string;
|
|
130
|
+
tableMode?: "code" | "off";
|
|
131
|
+
coalesce?: {
|
|
132
|
+
enabled?: boolean;
|
|
133
|
+
minChars?: number;
|
|
134
|
+
maxChars?: number;
|
|
135
|
+
idleMs?: number;
|
|
136
|
+
};
|
|
137
|
+
showToolStatus?: boolean;
|
|
138
|
+
showToolResult?: boolean;
|
|
139
|
+
thinking?: "off" | "minimal" | "low" | "medium" | "high";
|
|
140
|
+
}, {
|
|
141
|
+
enabled?: boolean;
|
|
142
|
+
maxChars?: number;
|
|
143
|
+
clientId?: string;
|
|
144
|
+
clientSecret?: string;
|
|
145
|
+
clientSecretFile?: string;
|
|
146
|
+
name?: string;
|
|
147
|
+
apiBase?: string;
|
|
148
|
+
openPath?: string;
|
|
149
|
+
subscriptionsJson?: string;
|
|
150
|
+
replyMode?: "text" | "markdown";
|
|
151
|
+
allowFrom?: string[];
|
|
152
|
+
selfUserId?: string;
|
|
153
|
+
requirePrefix?: string;
|
|
154
|
+
responsePrefix?: string;
|
|
155
|
+
tableMode?: "code" | "off";
|
|
156
|
+
coalesce?: {
|
|
157
|
+
enabled?: boolean;
|
|
158
|
+
minChars?: number;
|
|
159
|
+
maxChars?: number;
|
|
160
|
+
idleMs?: number;
|
|
161
|
+
};
|
|
162
|
+
showToolStatus?: boolean;
|
|
163
|
+
showToolResult?: boolean;
|
|
164
|
+
thinking?: "off" | "minimal" | "low" | "medium" | "high";
|
|
165
|
+
}>>>;
|
|
166
|
+
}, "strip", z.ZodTypeAny, {
|
|
167
|
+
enabled?: boolean;
|
|
168
|
+
maxChars?: number;
|
|
169
|
+
clientId?: string;
|
|
170
|
+
clientSecret?: string;
|
|
171
|
+
clientSecretFile?: string;
|
|
172
|
+
name?: string;
|
|
173
|
+
apiBase?: string;
|
|
174
|
+
openPath?: string;
|
|
175
|
+
subscriptionsJson?: string;
|
|
176
|
+
replyMode?: "text" | "markdown";
|
|
177
|
+
allowFrom?: string[];
|
|
178
|
+
selfUserId?: string;
|
|
179
|
+
requirePrefix?: string;
|
|
180
|
+
responsePrefix?: string;
|
|
181
|
+
tableMode?: "code" | "off";
|
|
182
|
+
coalesce?: {
|
|
183
|
+
enabled?: boolean;
|
|
184
|
+
minChars?: number;
|
|
185
|
+
maxChars?: number;
|
|
186
|
+
idleMs?: number;
|
|
187
|
+
};
|
|
188
|
+
showToolStatus?: boolean;
|
|
189
|
+
showToolResult?: boolean;
|
|
190
|
+
thinking?: "off" | "minimal" | "low" | "medium" | "high";
|
|
191
|
+
accounts?: Record<string, {
|
|
192
|
+
enabled?: boolean;
|
|
193
|
+
maxChars?: number;
|
|
194
|
+
clientId?: string;
|
|
195
|
+
clientSecret?: string;
|
|
196
|
+
clientSecretFile?: string;
|
|
197
|
+
name?: string;
|
|
198
|
+
apiBase?: string;
|
|
199
|
+
openPath?: string;
|
|
200
|
+
subscriptionsJson?: string;
|
|
201
|
+
replyMode?: "text" | "markdown";
|
|
202
|
+
allowFrom?: string[];
|
|
203
|
+
selfUserId?: string;
|
|
204
|
+
requirePrefix?: string;
|
|
205
|
+
responsePrefix?: string;
|
|
206
|
+
tableMode?: "code" | "off";
|
|
207
|
+
coalesce?: {
|
|
208
|
+
enabled?: boolean;
|
|
209
|
+
minChars?: number;
|
|
210
|
+
maxChars?: number;
|
|
211
|
+
idleMs?: number;
|
|
212
|
+
};
|
|
213
|
+
showToolStatus?: boolean;
|
|
214
|
+
showToolResult?: boolean;
|
|
215
|
+
thinking?: "off" | "minimal" | "low" | "medium" | "high";
|
|
216
|
+
}>;
|
|
217
|
+
}, {
|
|
218
|
+
enabled?: boolean;
|
|
219
|
+
maxChars?: number;
|
|
220
|
+
clientId?: string;
|
|
221
|
+
clientSecret?: string;
|
|
222
|
+
clientSecretFile?: string;
|
|
223
|
+
name?: string;
|
|
224
|
+
apiBase?: string;
|
|
225
|
+
openPath?: string;
|
|
226
|
+
subscriptionsJson?: string;
|
|
227
|
+
replyMode?: "text" | "markdown";
|
|
228
|
+
allowFrom?: string[];
|
|
229
|
+
selfUserId?: string;
|
|
230
|
+
requirePrefix?: string;
|
|
231
|
+
responsePrefix?: string;
|
|
232
|
+
tableMode?: "code" | "off";
|
|
233
|
+
coalesce?: {
|
|
234
|
+
enabled?: boolean;
|
|
235
|
+
minChars?: number;
|
|
236
|
+
maxChars?: number;
|
|
237
|
+
idleMs?: number;
|
|
238
|
+
};
|
|
239
|
+
showToolStatus?: boolean;
|
|
240
|
+
showToolResult?: boolean;
|
|
241
|
+
thinking?: "off" | "minimal" | "low" | "medium" | "high";
|
|
242
|
+
accounts?: Record<string, {
|
|
243
|
+
enabled?: boolean;
|
|
244
|
+
maxChars?: number;
|
|
245
|
+
clientId?: string;
|
|
246
|
+
clientSecret?: string;
|
|
247
|
+
clientSecretFile?: string;
|
|
248
|
+
name?: string;
|
|
249
|
+
apiBase?: string;
|
|
250
|
+
openPath?: string;
|
|
251
|
+
subscriptionsJson?: string;
|
|
252
|
+
replyMode?: "text" | "markdown";
|
|
253
|
+
allowFrom?: string[];
|
|
254
|
+
selfUserId?: string;
|
|
255
|
+
requirePrefix?: string;
|
|
256
|
+
responsePrefix?: string;
|
|
257
|
+
tableMode?: "code" | "off";
|
|
258
|
+
coalesce?: {
|
|
259
|
+
enabled?: boolean;
|
|
260
|
+
minChars?: number;
|
|
261
|
+
maxChars?: number;
|
|
262
|
+
idleMs?: number;
|
|
263
|
+
};
|
|
264
|
+
showToolStatus?: boolean;
|
|
265
|
+
showToolResult?: boolean;
|
|
266
|
+
thinking?: "off" | "minimal" | "low" | "medium" | "high";
|
|
267
|
+
}>;
|
|
268
|
+
}>;
|
|
269
|
+
export type DingTalkConfig = z.infer<typeof DingTalkConfigSchema>;
|
|
270
|
+
export type CoalesceConfig = z.infer<typeof CoalesceConfigSchema>;
|
|
271
|
+
/**
|
|
272
|
+
* Default values for coalesce config
|
|
273
|
+
*/
|
|
274
|
+
export declare const DEFAULT_COALESCE: CoalesceConfig;
|
|
275
|
+
/**
|
|
276
|
+
* Default account ID when not using multi-account
|
|
277
|
+
*/
|
|
278
|
+
export declare const DEFAULT_ACCOUNT_ID = "default";
|
|
279
|
+
//# sourceMappingURL=config-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-schema.d.ts","sourceRoot":"","sources":["../../src/config-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;EAK/B,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,oBAAoB;IAC/B,iCAAiC;;IAGjC,wCAAwC;;IAGxC,4CAA4C;;IAG5C,4CAA4C;;IAG5C,oCAAoC;;IAGpC,4BAA4B;;IAG5B,uBAAuB;;IAGvB,2CAA2C;;IAG3C,mCAAmC;;IAGnC,2CAA2C;;IAG3C,kDAAkD;;IAGlD,8CAA8C;;IAG9C,uEAAuE;;IAGvE,6EAA6E;;IAG7E,yCAAyC;;IAGzC,uCAAuC;;;;;;;;;;;;;;;;;IAGvC,6CAA6C;;IAG7C,2CAA2C;;IAG3C,iCAAiC;;IAGjC,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BlC,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,cAK9B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,YAAY,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Coalesce configuration for batching small messages before sending.
|
|
4
|
+
*/
|
|
5
|
+
export const CoalesceConfigSchema = z.object({
|
|
6
|
+
enabled: z.boolean().default(true),
|
|
7
|
+
minChars: z.number().min(200).default(800),
|
|
8
|
+
maxChars: z.number().min(800).default(1200),
|
|
9
|
+
idleMs: z.number().min(0).default(1000),
|
|
10
|
+
});
|
|
11
|
+
/**
|
|
12
|
+
* DingTalk channel configuration schema.
|
|
13
|
+
* Maps from YAML config under `channels.dingtalk.*`
|
|
14
|
+
*/
|
|
15
|
+
export const DingTalkConfigSchema = z.object({
|
|
16
|
+
/** Enable/disable the channel */
|
|
17
|
+
enabled: z.boolean().default(true),
|
|
18
|
+
/** DingTalk app client ID (required) */
|
|
19
|
+
clientId: z.string().optional(),
|
|
20
|
+
/** DingTalk app client secret (required) */
|
|
21
|
+
clientSecret: z.string().optional(),
|
|
22
|
+
/** Path to file containing client secret */
|
|
23
|
+
clientSecretFile: z.string().optional(),
|
|
24
|
+
/** Display name for this account */
|
|
25
|
+
name: z.string().optional(),
|
|
26
|
+
/** DingTalk API base URL */
|
|
27
|
+
apiBase: z.string().default("https://api.dingtalk.com"),
|
|
28
|
+
/** Stream open path */
|
|
29
|
+
openPath: z.string().default("/v1.0/gateway/connections/open"),
|
|
30
|
+
/** Custom subscriptions JSON for stream */
|
|
31
|
+
subscriptionsJson: z.string().optional(),
|
|
32
|
+
/** Reply mode: text or markdown */
|
|
33
|
+
replyMode: z.enum(["text", "markdown"]).default("text"),
|
|
34
|
+
/** Maximum characters per message chunk */
|
|
35
|
+
maxChars: z.number().min(200).max(8000).default(1800),
|
|
36
|
+
/** Allowlist of sender IDs (empty = allow all) */
|
|
37
|
+
allowFrom: z.array(z.string()).default([]),
|
|
38
|
+
/** Bot's own user ID to skip self-messages */
|
|
39
|
+
selfUserId: z.string().optional(),
|
|
40
|
+
/** Require messages to start with this prefix (for group filtering) */
|
|
41
|
+
requirePrefix: z.string().optional(),
|
|
42
|
+
/** Prefix to add to response messages (supports {model}, {provider} vars) */
|
|
43
|
+
responsePrefix: z.string().optional(),
|
|
44
|
+
/** Table conversion mode for markdown */
|
|
45
|
+
tableMode: z.enum(["code", "off"]).default("code"),
|
|
46
|
+
/** Message coalescing configuration */
|
|
47
|
+
coalesce: CoalesceConfigSchema.optional(),
|
|
48
|
+
/** Show tool status messages (🔧 正在执行...) */
|
|
49
|
+
showToolStatus: z.boolean().default(false),
|
|
50
|
+
/** Show tool result messages (✅ ... 完成) */
|
|
51
|
+
showToolResult: z.boolean().default(false),
|
|
52
|
+
/** Thinking mode for Clawdbot */
|
|
53
|
+
thinking: z.enum(["off", "minimal", "low", "medium", "high"]).default("off"),
|
|
54
|
+
/** Multi-account configuration */
|
|
55
|
+
accounts: z
|
|
56
|
+
.record(z.string(), z.object({
|
|
57
|
+
enabled: z.boolean().default(true),
|
|
58
|
+
clientId: z.string().optional(),
|
|
59
|
+
clientSecret: z.string().optional(),
|
|
60
|
+
clientSecretFile: z.string().optional(),
|
|
61
|
+
name: z.string().optional(),
|
|
62
|
+
apiBase: z.string().optional(),
|
|
63
|
+
openPath: z.string().optional(),
|
|
64
|
+
subscriptionsJson: z.string().optional(),
|
|
65
|
+
replyMode: z.enum(["text", "markdown"]).optional(),
|
|
66
|
+
maxChars: z.number().min(200).max(8000).optional(),
|
|
67
|
+
allowFrom: z.array(z.string()).optional(),
|
|
68
|
+
selfUserId: z.string().optional(),
|
|
69
|
+
requirePrefix: z.string().optional(),
|
|
70
|
+
responsePrefix: z.string().optional(),
|
|
71
|
+
tableMode: z.enum(["code", "off"]).optional(),
|
|
72
|
+
coalesce: CoalesceConfigSchema.optional(),
|
|
73
|
+
showToolStatus: z.boolean().optional(),
|
|
74
|
+
showToolResult: z.boolean().optional(),
|
|
75
|
+
thinking: z.enum(["off", "minimal", "low", "medium", "high"]).optional(),
|
|
76
|
+
}))
|
|
77
|
+
.optional(),
|
|
78
|
+
});
|
|
79
|
+
/**
|
|
80
|
+
* Default values for coalesce config
|
|
81
|
+
*/
|
|
82
|
+
export const DEFAULT_COALESCE = {
|
|
83
|
+
enabled: true,
|
|
84
|
+
minChars: 800,
|
|
85
|
+
maxChars: 1200,
|
|
86
|
+
idleMs: 1000,
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Default account ID when not using multi-account
|
|
90
|
+
*/
|
|
91
|
+
export const DEFAULT_ACCOUNT_ID = "default";
|
|
92
|
+
//# sourceMappingURL=config-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../../src/config-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DingTalk monitor - starts the stream client and dispatches messages to Clawdbot.
|
|
3
|
+
*/
|
|
4
|
+
import type { ClawdbotConfig } from "clawdbot/plugin-sdk";
|
|
5
|
+
import type { ResolvedDingTalkAccount } from "./accounts.js";
|
|
6
|
+
import type { StreamClientHandle, StreamLogger } from "./stream/types.js";
|
|
7
|
+
export interface MonitorDingTalkOpts {
|
|
8
|
+
account: ResolvedDingTalkAccount;
|
|
9
|
+
config: ClawdbotConfig;
|
|
10
|
+
abortSignal?: AbortSignal;
|
|
11
|
+
log?: StreamLogger;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Start monitoring DingTalk for incoming messages.
|
|
15
|
+
*/
|
|
16
|
+
export declare function monitorDingTalkProvider(opts: MonitorDingTalkOpts): Promise<StreamClientHandle>;
|
|
17
|
+
//# sourceMappingURL=monitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../../src/monitor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAG7D,OAAO,KAAK,EAAkB,kBAAkB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAK1F,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,uBAAuB,CAAC;IACjC,MAAM,EAAE,cAAc,CAAC;IACvB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,GAAG,CAAC,EAAE,YAAY,CAAC;CACpB;AAuBD;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,kBAAkB,CAAC,CA0K7B"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DingTalk monitor - starts the stream client and dispatches messages to Clawdbot.
|
|
3
|
+
*/
|
|
4
|
+
import { getDingTalkRuntime } from "./runtime.js";
|
|
5
|
+
import { startDingTalkStreamClient } from "./stream/client.js";
|
|
6
|
+
import { buildSessionKey, startsWithPrefix } from "./stream/message-parser.js";
|
|
7
|
+
import { sendReplyViaSessionWebhook, resolveResponsePrefix } from "./send/reply.js";
|
|
8
|
+
import { convertMarkdownForDingTalk } from "./send/markdown.js";
|
|
9
|
+
/**
|
|
10
|
+
* Determine if message is a group chat.
|
|
11
|
+
*/
|
|
12
|
+
function isGroupChat(chatType) {
|
|
13
|
+
return /group|chat|2|multi/i.test(chatType);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Derive provider name from model string.
|
|
17
|
+
*/
|
|
18
|
+
function deriveProvider(model) {
|
|
19
|
+
if (!model)
|
|
20
|
+
return undefined;
|
|
21
|
+
const m = model.toLowerCase();
|
|
22
|
+
if (m.includes("claude") || m.includes("anthropic"))
|
|
23
|
+
return "anthropic";
|
|
24
|
+
if (m.includes("gpt") || m.includes("openai"))
|
|
25
|
+
return "openai";
|
|
26
|
+
if (m.includes("qwen") || m.includes("dashscope"))
|
|
27
|
+
return "dashscope";
|
|
28
|
+
if (m.includes("gemini") || m.includes("google"))
|
|
29
|
+
return "google";
|
|
30
|
+
if (m.includes("/"))
|
|
31
|
+
return model.split("/")[0];
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Start monitoring DingTalk for incoming messages.
|
|
36
|
+
*/
|
|
37
|
+
export async function monitorDingTalkProvider(opts) {
|
|
38
|
+
const { account, config, abortSignal, log } = opts;
|
|
39
|
+
const runtime = getDingTalkRuntime();
|
|
40
|
+
// Parse custom subscriptions if provided
|
|
41
|
+
let subscriptionsBody = null;
|
|
42
|
+
if (account.subscriptionsJson?.trim()) {
|
|
43
|
+
try {
|
|
44
|
+
subscriptionsBody = JSON.parse(account.subscriptionsJson);
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
log?.warn?.({ err: err?.message }, "Invalid subscriptions JSON");
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const openBody = subscriptionsBody ?? {
|
|
51
|
+
clientId: account.clientId,
|
|
52
|
+
clientSecret: account.clientSecret,
|
|
53
|
+
subscriptions: [{ type: "CALLBACK", topic: "/v1.0/im/bot/messages/get" }],
|
|
54
|
+
};
|
|
55
|
+
// Track response prefix per session (only apply once per conversation)
|
|
56
|
+
const prefixApplied = new Set();
|
|
57
|
+
const client = await startDingTalkStreamClient({
|
|
58
|
+
clientId: account.clientId,
|
|
59
|
+
clientSecret: account.clientSecret,
|
|
60
|
+
apiBase: account.apiBase,
|
|
61
|
+
openPath: account.openPath,
|
|
62
|
+
openBody,
|
|
63
|
+
logger: log,
|
|
64
|
+
onChatMessage: async (chat) => {
|
|
65
|
+
try {
|
|
66
|
+
await handleInboundMessage(chat);
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
log?.error?.({ err: { message: err?.message } }, "Handler error");
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
// Handle abort signal
|
|
74
|
+
if (abortSignal) {
|
|
75
|
+
abortSignal.addEventListener("abort", () => {
|
|
76
|
+
log?.info?.("Abort signal received, stopping DingTalk stream");
|
|
77
|
+
client.stop();
|
|
78
|
+
}, { once: true });
|
|
79
|
+
}
|
|
80
|
+
async function handleInboundMessage(chat) {
|
|
81
|
+
// Filter: skip self messages
|
|
82
|
+
if (account.selfUserId && chat.senderId === account.selfUserId) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// Filter: allowlist
|
|
86
|
+
if (account.allowFrom.length > 0 && chat.senderId) {
|
|
87
|
+
if (!account.allowFrom.includes(chat.senderId)) {
|
|
88
|
+
log?.info?.({ senderId: chat.senderId }, "Blocked sender (not in allowlist)");
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Filter: require prefix (for group chats)
|
|
93
|
+
if (account.requirePrefix && !startsWithPrefix(chat.text, account.requirePrefix)) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const sessionKey = buildSessionKey(chat);
|
|
97
|
+
const isGroup = isGroupChat(chat.chatType);
|
|
98
|
+
log?.info?.({
|
|
99
|
+
eventType: chat.eventType,
|
|
100
|
+
senderId: chat.senderId,
|
|
101
|
+
senderName: chat.senderName,
|
|
102
|
+
conversationId: chat.conversationId,
|
|
103
|
+
chatType: chat.chatType,
|
|
104
|
+
sessionKey,
|
|
105
|
+
}, "Inbound DingTalk message");
|
|
106
|
+
// Build inbound context for Clawdbot
|
|
107
|
+
const ctx = {
|
|
108
|
+
Body: chat.text,
|
|
109
|
+
RawBody: chat.text,
|
|
110
|
+
CommandBody: chat.text,
|
|
111
|
+
BodyForAgent: chat.text,
|
|
112
|
+
BodyForCommands: chat.text,
|
|
113
|
+
From: chat.senderId,
|
|
114
|
+
To: chat.conversationId,
|
|
115
|
+
SessionKey: sessionKey,
|
|
116
|
+
AccountId: account.accountId,
|
|
117
|
+
MessageSid: chat.messageId,
|
|
118
|
+
ChatType: isGroup ? "group" : "direct",
|
|
119
|
+
SenderName: chat.senderName,
|
|
120
|
+
SenderId: chat.senderId,
|
|
121
|
+
Provider: "dingtalk",
|
|
122
|
+
Surface: "dingtalk",
|
|
123
|
+
OriginatingChannel: "dingtalk",
|
|
124
|
+
OriginatingTo: chat.conversationId,
|
|
125
|
+
Timestamp: Date.now(),
|
|
126
|
+
};
|
|
127
|
+
// Create reply dispatcher that sends to DingTalk
|
|
128
|
+
let firstReply = true;
|
|
129
|
+
const dispatcherOptions = {
|
|
130
|
+
sendBlock: async (text) => {
|
|
131
|
+
if (!text?.trim())
|
|
132
|
+
return;
|
|
133
|
+
// Apply response prefix to first message only
|
|
134
|
+
let processedText = text;
|
|
135
|
+
if (firstReply && account.responsePrefix && !prefixApplied.has(sessionKey)) {
|
|
136
|
+
const prefix = resolveResponsePrefix(account.responsePrefix, {
|
|
137
|
+
model: undefined, // Will be filled from agent response
|
|
138
|
+
provider: undefined,
|
|
139
|
+
});
|
|
140
|
+
if (prefix) {
|
|
141
|
+
processedText = `${prefix} ${text}`;
|
|
142
|
+
}
|
|
143
|
+
prefixApplied.add(sessionKey);
|
|
144
|
+
}
|
|
145
|
+
firstReply = false;
|
|
146
|
+
// Convert markdown tables if needed
|
|
147
|
+
if (account.replyMode === "markdown" && account.tableMode !== "off") {
|
|
148
|
+
processedText = convertMarkdownForDingTalk(processedText, {
|
|
149
|
+
tableMode: account.tableMode,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
await sendReplyViaSessionWebhook(chat.sessionWebhook, processedText, {
|
|
153
|
+
replyMode: account.replyMode,
|
|
154
|
+
maxChars: account.maxChars,
|
|
155
|
+
tableMode: account.tableMode,
|
|
156
|
+
logger: log,
|
|
157
|
+
});
|
|
158
|
+
},
|
|
159
|
+
onTyping: async () => {
|
|
160
|
+
// DingTalk doesn't support typing indicators
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
// Dispatch to Clawdbot agent
|
|
164
|
+
try {
|
|
165
|
+
await runtime.channel.reply.dispatchReplyWithBufferedBlockDispatcher({
|
|
166
|
+
ctx,
|
|
167
|
+
cfg: config,
|
|
168
|
+
dispatcherOptions,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
log?.error?.({ err: { message: err?.message } }, "Agent dispatch error");
|
|
173
|
+
// Send error message to user
|
|
174
|
+
await sendReplyViaSessionWebhook(chat.sessionWebhook, "抱歉,处理您的消息时出现了错误。请稍后重试。", {
|
|
175
|
+
replyMode: account.replyMode,
|
|
176
|
+
maxChars: account.maxChars,
|
|
177
|
+
logger: log,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return client;
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DingTalk health probe utilities.
|
|
3
|
+
*/
|
|
4
|
+
import type { ResolvedDingTalkAccount } from "./accounts.js";
|
|
5
|
+
export interface ProbeResult {
|
|
6
|
+
ok: boolean;
|
|
7
|
+
error?: string;
|
|
8
|
+
status?: number;
|
|
9
|
+
elapsedMs?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Probe DingTalk API to verify credentials and connectivity.
|
|
13
|
+
*/
|
|
14
|
+
export declare function probeDingTalk(account: ResolvedDingTalkAccount, timeoutMs?: number): Promise<ProbeResult>;
|
|
15
|
+
//# sourceMappingURL=probe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probe.d.ts","sourceRoot":"","sources":["../../src/probe.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,uBAAuB,EAChC,SAAS,SAAO,GACf,OAAO,CAAC,WAAW,CAAC,CA4CtB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DingTalk health probe utilities.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Probe DingTalk API to verify credentials and connectivity.
|
|
6
|
+
*/
|
|
7
|
+
export async function probeDingTalk(account, timeoutMs = 5000) {
|
|
8
|
+
const start = Date.now();
|
|
9
|
+
if (!account.clientId?.trim() || !account.clientSecret?.trim()) {
|
|
10
|
+
return { ok: false, error: "Credentials not configured" };
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
// Try to get an access token as a connectivity test
|
|
14
|
+
const url = `${account.apiBase}/v1.0/oauth2/accessToken`;
|
|
15
|
+
const resp = await fetch(url, {
|
|
16
|
+
method: "POST",
|
|
17
|
+
headers: { "Content-Type": "application/json" },
|
|
18
|
+
body: JSON.stringify({
|
|
19
|
+
appKey: account.clientId,
|
|
20
|
+
appSecret: account.clientSecret,
|
|
21
|
+
}),
|
|
22
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
23
|
+
});
|
|
24
|
+
const elapsedMs = Date.now() - start;
|
|
25
|
+
if (resp.ok) {
|
|
26
|
+
const data = await resp.json();
|
|
27
|
+
if (data.accessToken) {
|
|
28
|
+
return { ok: true, elapsedMs };
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const errorText = await resp.text().catch(() => "");
|
|
32
|
+
return {
|
|
33
|
+
ok: false,
|
|
34
|
+
status: resp.status,
|
|
35
|
+
error: errorText.slice(0, 200) || `HTTP ${resp.status}`,
|
|
36
|
+
elapsedMs,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
const elapsedMs = Date.now() - start;
|
|
41
|
+
return {
|
|
42
|
+
ok: false,
|
|
43
|
+
error: err?.message ?? "Unknown error",
|
|
44
|
+
elapsedMs,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probe.js","sourceRoot":"","sources":["../../src/probe.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAgC,EAChC,SAAS,GAAG,IAAI;IAEhB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEzB,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC;QAC/D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC;IAC5D,CAAC;IAED,IAAI,CAAC;QACH,oDAAoD;QACpD,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,OAAO,0BAA0B,CAAC;QACzD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC5B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,MAAM,EAAE,OAAO,CAAC,QAAQ;gBACxB,SAAS,EAAE,OAAO,CAAC,YAAY;aAChC,CAAC;YACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;SACvC,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAErC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAiD,CAAC;YAC9E,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YACjC,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACpD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE;YACvD,SAAS;SACV,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QACrC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAG,GAAa,EAAE,OAAO,IAAI,eAAe;YACjD,SAAS;SACV,CAAC;IACJ,CAAC;AACH,CAAC"}
|