@soimy/dingtalk 3.5.2 → 3.5.3

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.
@@ -5,5 +5,700 @@
5
5
  "type": "object",
6
6
  "additionalProperties": true,
7
7
  "properties": {}
8
+ },
9
+ "channelConfigs": {
10
+ "dingtalk": {
11
+ "label": "DingTalk",
12
+ "description": "钉钉企业内部机器人,使用 Stream 模式,无需公网 IP。",
13
+ "schema": {
14
+ "type": "object",
15
+ "additionalProperties": false,
16
+ "properties": {
17
+ "name": {
18
+ "type": "string",
19
+ "description": "Optional display name shown for this DingTalk channel or default account."
20
+ },
21
+ "enabled": {
22
+ "type": "boolean",
23
+ "default": true,
24
+ "description": "Enable or disable this DingTalk channel configuration without deleting saved credentials."
25
+ },
26
+ "agentId": {
27
+ "type": "integer",
28
+ "description": "Legacy compatibility field from older setup flows. The current Stream-mode runtime no longer reads this value, so new configs should omit it."
29
+ },
30
+ "corpId": {
31
+ "type": "string",
32
+ "description": "Legacy compatibility field from older enterprise app setup flows. The current Stream-mode runtime no longer needs or reads this value."
33
+ },
34
+ "clientId": {
35
+ "type": "string",
36
+ "description": "DingTalk App Key (Client ID) used to authenticate API and Stream connections."
37
+ },
38
+ "clientSecret": {
39
+ "type": "string",
40
+ "description": "DingTalk App Secret (Client Secret) used to obtain DingTalk access tokens."
41
+ },
42
+ "dmPolicy": {
43
+ "type": "string",
44
+ "enum": ["open", "pairing", "allowlist"],
45
+ "default": "open",
46
+ "description": "Direct-message access policy. open allows any DM, pairing requires host pairing, and allowlist only permits IDs listed in allowFrom."
47
+ },
48
+ "groupPolicy": {
49
+ "type": "string",
50
+ "enum": ["open", "allowlist", "disabled"],
51
+ "default": "open",
52
+ "description": "Group-message access policy. open allows all groups, allowlist restricts by groupAllowFrom, and disabled blocks group handling."
53
+ },
54
+ "allowFrom": {
55
+ "type": "array",
56
+ "items": { "type": "string" },
57
+ "description": "User IDs allowed when dmPolicy is allowlist. Accepts DingTalk IDs or host-normalized IDs."
58
+ },
59
+ "groupAllowFrom": {
60
+ "type": "array",
61
+ "items": { "type": "string" },
62
+ "description": "Sender IDs allowed when groupPolicy is allowlist. Leave empty unless you want per-sender restrictions in groups."
63
+ },
64
+ "displayNameResolution": {
65
+ "type": "string",
66
+ "enum": ["disabled", "all"],
67
+ "default": "disabled",
68
+ "description": "Whether learned display names can be used to resolve DingTalk users or groups. Keep disabled unless you explicitly accept stale or ambiguous-name routing risk."
69
+ },
70
+ "contextVisibility": {
71
+ "type": "string",
72
+ "enum": ["all", "allowlist", "allowlist_quote"],
73
+ "description": "Host-level context filtering before prompts are sent to the runtime. allowlist_quote is the safest advanced mode when only explicit quote or reply context should remain visible."
74
+ },
75
+ "mediaUrlAllowlist": {
76
+ "type": "array",
77
+ "items": { "type": "string" },
78
+ "description": "Allowed download hosts, IPs, or CIDRs for remote media fetches. Use this for internal file servers or custom CDN domains."
79
+ },
80
+ "ackReaction": {
81
+ "anyOf": [
82
+ { "type": "string", "const": "" },
83
+ { "type": "string", "enum": ["off", "emoji", "kaomoji"] },
84
+ { "type": "string", "minLength": 1 }
85
+ ],
86
+ "description": "Acknowledgement reaction mode. Supports off, emoji, kaomoji, or a custom compatibility string."
87
+ },
88
+ "journalTTLDays": {
89
+ "type": "integer",
90
+ "minimum": 1,
91
+ "default": 7,
92
+ "description": "Retention window in days for short-lived message context used by quoting, media recovery, and related reply context features."
93
+ },
94
+ "debug": {
95
+ "type": "boolean",
96
+ "default": false,
97
+ "description": "Enable verbose DingTalk channel debug logging."
98
+ },
99
+ "messageType": {
100
+ "type": "string",
101
+ "enum": ["markdown", "card"],
102
+ "default": "markdown",
103
+ "description": "Default reply delivery mode. markdown uses standard messages; card uses DingTalk AI cards when available."
104
+ },
105
+ "cardTemplateId": {
106
+ "type": "string",
107
+ "description": "Deprecated and ignored. AI card replies now always use the built-in DingTalk template contract; keep only for compatibility with old configs."
108
+ },
109
+ "cardTemplateKey": {
110
+ "type": "string",
111
+ "default": "content",
112
+ "description": "Deprecated and ignored. The built-in AI card contract owns the streaming field mapping; keep only for compatibility with old configs."
113
+ },
114
+ "groups": {
115
+ "type": "object",
116
+ "description": "Per-group overrides keyed by conversationId. Supports \"*\" as a wildcard fallback.",
117
+ "additionalProperties": {
118
+ "type": "object",
119
+ "additionalProperties": false,
120
+ "properties": {
121
+ "systemPrompt": {
122
+ "type": "string",
123
+ "description": "Additional system prompt appended for this group."
124
+ },
125
+ "requireMention": {
126
+ "type": "boolean",
127
+ "description": "Require an explicit @mention before the bot answers in this group."
128
+ },
129
+ "groupAllowFrom": {
130
+ "type": "array",
131
+ "items": { "type": "string" },
132
+ "description": "Per-group sender allowlist used when you want tighter access control than the channel default."
133
+ }
134
+ }
135
+ }
136
+ },
137
+ "maxConnectionAttempts": {
138
+ "type": "integer",
139
+ "minimum": 1,
140
+ "default": 10,
141
+ "description": "Maximum connection attempts in a single reconnect cycle before backing off or giving up."
142
+ },
143
+ "initialReconnectDelay": {
144
+ "type": "integer",
145
+ "minimum": 100,
146
+ "default": 1000,
147
+ "description": "Initial reconnect backoff delay in milliseconds."
148
+ },
149
+ "maxReconnectDelay": {
150
+ "type": "integer",
151
+ "minimum": 1000,
152
+ "default": 60000,
153
+ "description": "Upper bound for reconnect backoff delay in milliseconds."
154
+ },
155
+ "reconnectJitter": {
156
+ "type": "number",
157
+ "minimum": 0,
158
+ "maximum": 1,
159
+ "default": 0.3,
160
+ "description": "Randomization factor added to reconnect backoff to avoid synchronized reconnect storms."
161
+ },
162
+ "maxReconnectCycles": {
163
+ "type": "integer",
164
+ "minimum": 1,
165
+ "default": 10,
166
+ "description": "Maximum reconnect cycles before the channel stops retrying and waits for the next lifecycle restart."
167
+ },
168
+ "reconnectDeadlineMs": {
169
+ "type": "integer",
170
+ "minimum": 5000,
171
+ "default": 50000,
172
+ "description": "Time limit in milliseconds for one reconnect cycle before starting a fresh cycle."
173
+ },
174
+ "useConnectionManager": {
175
+ "type": "boolean",
176
+ "default": true,
177
+ "description": "Enable the plugin connection manager. Disable only when you intentionally rely on the DingTalk client keepAlive and autoReconnect behavior."
178
+ },
179
+ "mediaMaxMb": {
180
+ "type": "integer",
181
+ "minimum": 1,
182
+ "description": "Maximum inbound media size in MB accepted by the plugin. When omitted, the runtime default is used."
183
+ },
184
+ "keepAlive": {
185
+ "type": "boolean",
186
+ "description": "Enable the underlying Stream client heartbeat. When omitted, runtime derives a default from useConnectionManager."
187
+ },
188
+ "bypassProxyForSend": {
189
+ "type": "boolean",
190
+ "default": false,
191
+ "description": "Bypass global or system HTTP(S) proxy settings for DingTalk send, upload, and card APIs."
192
+ },
193
+ "proactivePermissionHint": {
194
+ "type": "object",
195
+ "description": "Controls the proactive-send permission reminder shown when a conversation has not granted send rights yet.",
196
+ "additionalProperties": false,
197
+ "properties": {
198
+ "enabled": {
199
+ "type": "boolean",
200
+ "default": true,
201
+ "description": "Show the proactive-send permission hint when the runtime detects missing DingTalk proactive permission."
202
+ },
203
+ "cooldownHours": {
204
+ "type": "integer",
205
+ "minimum": 1,
206
+ "maximum": 720,
207
+ "default": 24,
208
+ "description": "Minimum cooldown in hours before the same proactive permission hint can be shown again."
209
+ }
210
+ }
211
+ },
212
+ "cardRealTimeStream": {
213
+ "type": "boolean",
214
+ "default": false,
215
+ "description": "Deprecated compatibility flag. If true and cardStreamingMode is unset, runtime falls back to cardStreamingMode=\"all\". Do not use in new configs."
216
+ },
217
+ "cardStreamingMode": {
218
+ "type": "string",
219
+ "enum": ["off", "answer", "all"],
220
+ "description": "AI card incremental streaming mode. off disables streaming, answer streams answer text only, and all streams answer plus reasoning or thinking text."
221
+ },
222
+ "cardStreamInterval": {
223
+ "type": "integer",
224
+ "minimum": 200,
225
+ "default": 1000,
226
+ "description": "Throttle interval in milliseconds between AI card streaming updates."
227
+ },
228
+ "aicardDegradeMs": {
229
+ "type": "integer",
230
+ "minimum": 60000,
231
+ "default": 1800000,
232
+ "description": "Cooldown window in milliseconds after AI card trigger errors. During this window replies fall back to non-card delivery."
233
+ },
234
+ "learningEnabled": {
235
+ "type": "boolean",
236
+ "description": "Enable the local feedback-learning loop for notes, reflections, and command-assisted learning."
237
+ },
238
+ "learningAutoApply": {
239
+ "type": "boolean",
240
+ "description": "Automatically apply generated learning output into session notes or global rules when available."
241
+ },
242
+ "learningNoteTtlMs": {
243
+ "type": "integer",
244
+ "minimum": 60000,
245
+ "description": "Retention window in milliseconds for temporary learning notes."
246
+ },
247
+ "convertMarkdownTables": {
248
+ "type": "boolean",
249
+ "default": true,
250
+ "description": "Convert markdown tables to plain text before sending when you want more consistent DingTalk rendering."
251
+ },
252
+ "cardAtSender": {
253
+ "type": "string",
254
+ "description": "Send a follow-up @mention text after card finalization in group chats. Any non-empty string becomes the message body."
255
+ },
256
+ "showThinkingStream": {
257
+ "type": "boolean",
258
+ "description": "Legacy compatibility field from older card streaming behavior. It is not used by the current runtime and new configs should omit it."
259
+ },
260
+ "asyncMode": {
261
+ "type": "boolean",
262
+ "description": "Legacy compatibility field from older host or runtime integrations. It is not used by the current runtime and new configs should omit it."
263
+ },
264
+ "accounts": {
265
+ "type": "object",
266
+ "description": "Named multi-account DingTalk configurations. Each account can override most top-level settings and inherits unspecified values from the top level.",
267
+ "additionalProperties": {
268
+ "type": "object",
269
+ "additionalProperties": false,
270
+ "properties": {
271
+ "name": {
272
+ "type": "string",
273
+ "description": "Optional display name shown for this named DingTalk account."
274
+ },
275
+ "enabled": {
276
+ "type": "boolean",
277
+ "default": true,
278
+ "description": "Enable or disable this DingTalk account without deleting saved credentials."
279
+ },
280
+ "clientId": {
281
+ "type": "string",
282
+ "description": "DingTalk App Key (Client ID) used to authenticate API and Stream connections."
283
+ },
284
+ "clientSecret": {
285
+ "type": "string",
286
+ "description": "DingTalk App Secret (Client Secret) used to obtain DingTalk access tokens."
287
+ },
288
+ "dmPolicy": {
289
+ "type": "string",
290
+ "enum": ["open", "pairing", "allowlist"],
291
+ "default": "open",
292
+ "description": "Direct-message access policy. open allows any DM, pairing requires host pairing, and allowlist only permits IDs listed in allowFrom."
293
+ },
294
+ "groupPolicy": {
295
+ "type": "string",
296
+ "enum": ["open", "allowlist", "disabled"],
297
+ "default": "open",
298
+ "description": "Group-message access policy. open allows all groups, allowlist restricts by groupAllowFrom, and disabled blocks group handling."
299
+ },
300
+ "allowFrom": {
301
+ "type": "array",
302
+ "items": { "type": "string" },
303
+ "description": "User IDs allowed when dmPolicy is allowlist. Accepts DingTalk IDs or host-normalized IDs."
304
+ },
305
+ "groupAllowFrom": {
306
+ "type": "array",
307
+ "items": { "type": "string" },
308
+ "description": "Sender IDs allowed when groupPolicy is allowlist. Leave empty unless you want per-sender restrictions in groups."
309
+ },
310
+ "displayNameResolution": {
311
+ "type": "string",
312
+ "enum": ["disabled", "all"],
313
+ "default": "disabled",
314
+ "description": "Whether learned display names can be used to resolve DingTalk users or groups. Keep disabled unless you explicitly accept stale or ambiguous-name routing risk."
315
+ },
316
+ "contextVisibility": {
317
+ "type": "string",
318
+ "enum": ["all", "allowlist", "allowlist_quote"],
319
+ "description": "Host-level context filtering before prompts are sent to the runtime. allowlist_quote is the safest advanced mode when only explicit quote or reply context should remain visible."
320
+ },
321
+ "mediaUrlAllowlist": {
322
+ "type": "array",
323
+ "items": { "type": "string" },
324
+ "description": "Allowed download hosts, IPs, or CIDRs for remote media fetches. Use this for internal file servers or custom CDN domains."
325
+ },
326
+ "ackReaction": {
327
+ "anyOf": [
328
+ { "type": "string", "const": "" },
329
+ { "type": "string", "enum": ["off", "emoji", "kaomoji"] },
330
+ { "type": "string", "minLength": 1 }
331
+ ],
332
+ "description": "Acknowledgement reaction mode. Supports off, emoji, kaomoji, or a custom compatibility string."
333
+ },
334
+ "journalTTLDays": {
335
+ "type": "integer",
336
+ "minimum": 1,
337
+ "default": 7,
338
+ "description": "Retention window in days for short-lived message context used by quoting, media recovery, and related reply context features."
339
+ },
340
+ "debug": {
341
+ "type": "boolean",
342
+ "default": false,
343
+ "description": "Enable verbose DingTalk channel debug logging."
344
+ },
345
+ "messageType": {
346
+ "type": "string",
347
+ "enum": ["markdown", "card"],
348
+ "default": "markdown",
349
+ "description": "Default reply delivery mode. markdown uses standard messages; card uses DingTalk AI cards when available."
350
+ },
351
+ "cardTemplateId": {
352
+ "type": "string",
353
+ "description": "Deprecated and ignored. AI card replies now always use the built-in DingTalk template contract; keep only for compatibility with old configs."
354
+ },
355
+ "cardTemplateKey": {
356
+ "type": "string",
357
+ "default": "content",
358
+ "description": "Deprecated and ignored. The built-in AI card contract owns the streaming field mapping; keep only for compatibility with old configs."
359
+ },
360
+ "groups": {
361
+ "type": "object",
362
+ "description": "Per-group overrides keyed by conversationId. Supports \"*\" as a wildcard fallback.",
363
+ "additionalProperties": {
364
+ "type": "object",
365
+ "additionalProperties": false,
366
+ "properties": {
367
+ "systemPrompt": {
368
+ "type": "string",
369
+ "description": "Additional system prompt appended for this group."
370
+ },
371
+ "requireMention": {
372
+ "type": "boolean",
373
+ "description": "Require an explicit @mention before the bot answers in this group."
374
+ },
375
+ "groupAllowFrom": {
376
+ "type": "array",
377
+ "items": { "type": "string" },
378
+ "description": "Per-group sender allowlist used when you want tighter access control than the channel default."
379
+ }
380
+ }
381
+ }
382
+ },
383
+ "maxConnectionAttempts": {
384
+ "type": "integer",
385
+ "minimum": 1,
386
+ "default": 10,
387
+ "description": "Maximum connection attempts in a single reconnect cycle before backing off or giving up."
388
+ },
389
+ "initialReconnectDelay": {
390
+ "type": "integer",
391
+ "minimum": 100,
392
+ "default": 1000,
393
+ "description": "Initial reconnect backoff delay in milliseconds."
394
+ },
395
+ "maxReconnectDelay": {
396
+ "type": "integer",
397
+ "minimum": 1000,
398
+ "default": 60000,
399
+ "description": "Upper bound for reconnect backoff delay in milliseconds."
400
+ },
401
+ "reconnectJitter": {
402
+ "type": "number",
403
+ "minimum": 0,
404
+ "maximum": 1,
405
+ "default": 0.3,
406
+ "description": "Randomization factor added to reconnect backoff to avoid synchronized reconnect storms."
407
+ },
408
+ "maxReconnectCycles": {
409
+ "type": "integer",
410
+ "minimum": 1,
411
+ "default": 10,
412
+ "description": "Maximum reconnect cycles before the channel stops retrying and waits for the next lifecycle restart."
413
+ },
414
+ "reconnectDeadlineMs": {
415
+ "type": "integer",
416
+ "minimum": 5000,
417
+ "default": 50000,
418
+ "description": "Time limit in milliseconds for one reconnect cycle before starting a fresh cycle."
419
+ },
420
+ "useConnectionManager": {
421
+ "type": "boolean",
422
+ "default": true,
423
+ "description": "Enable the plugin connection manager. Disable only when you intentionally rely on the DingTalk client keepAlive and autoReconnect behavior."
424
+ },
425
+ "mediaMaxMb": {
426
+ "type": "integer",
427
+ "minimum": 1,
428
+ "description": "Maximum inbound media size in MB accepted by the plugin. When omitted, the runtime default is used."
429
+ },
430
+ "keepAlive": {
431
+ "type": "boolean",
432
+ "description": "Enable the underlying Stream client heartbeat. When omitted, runtime derives a default from useConnectionManager."
433
+ },
434
+ "bypassProxyForSend": {
435
+ "type": "boolean",
436
+ "default": false,
437
+ "description": "Bypass global or system HTTP(S) proxy settings for DingTalk send, upload, and card APIs."
438
+ },
439
+ "proactivePermissionHint": {
440
+ "type": "object",
441
+ "description": "Controls the proactive-send permission reminder shown when a conversation has not granted send rights yet.",
442
+ "additionalProperties": false,
443
+ "properties": {
444
+ "enabled": {
445
+ "type": "boolean",
446
+ "default": true,
447
+ "description": "Show the proactive-send permission hint when the runtime detects missing DingTalk proactive permission."
448
+ },
449
+ "cooldownHours": {
450
+ "type": "integer",
451
+ "minimum": 1,
452
+ "maximum": 720,
453
+ "default": 24,
454
+ "description": "Minimum cooldown in hours before the same proactive permission hint can be shown again."
455
+ }
456
+ }
457
+ },
458
+ "cardRealTimeStream": {
459
+ "type": "boolean",
460
+ "default": false,
461
+ "description": "Deprecated compatibility flag. If true and cardStreamingMode is unset, runtime falls back to cardStreamingMode=\"all\". Do not use in new configs."
462
+ },
463
+ "cardStreamingMode": {
464
+ "type": "string",
465
+ "enum": ["off", "answer", "all"],
466
+ "description": "AI card incremental streaming mode. off disables streaming, answer streams answer text only, and all streams answer plus reasoning or thinking text."
467
+ },
468
+ "cardStreamInterval": {
469
+ "type": "integer",
470
+ "minimum": 200,
471
+ "default": 1000,
472
+ "description": "Throttle interval in milliseconds between AI card streaming updates."
473
+ },
474
+ "aicardDegradeMs": {
475
+ "type": "integer",
476
+ "minimum": 60000,
477
+ "default": 1800000,
478
+ "description": "Cooldown window in milliseconds after AI card trigger errors. During this window replies fall back to non-card delivery."
479
+ },
480
+ "learningEnabled": {
481
+ "type": "boolean",
482
+ "description": "Enable the local feedback-learning loop for notes, reflections, and command-assisted learning."
483
+ },
484
+ "learningAutoApply": {
485
+ "type": "boolean",
486
+ "description": "Automatically apply generated learning output into session notes or global rules when available."
487
+ },
488
+ "learningNoteTtlMs": {
489
+ "type": "integer",
490
+ "minimum": 60000,
491
+ "description": "Retention window in milliseconds for temporary learning notes."
492
+ },
493
+ "convertMarkdownTables": {
494
+ "type": "boolean",
495
+ "default": true,
496
+ "description": "Convert markdown tables to plain text before sending when you want more consistent DingTalk rendering."
497
+ },
498
+ "cardAtSender": {
499
+ "type": "string",
500
+ "description": "Send a follow-up @mention text after card finalization in group chats. Any non-empty string becomes the message body."
501
+ }
502
+ }
503
+ }
504
+ }
505
+ }
506
+ },
507
+ "uiHints": {
508
+ "": {
509
+ "label": "DingTalk",
510
+ "help": "DingTalk Stream-mode channel configuration including auth, delivery, targeting, and AI Card behavior."
511
+ },
512
+ "name": {
513
+ "label": "Display Name",
514
+ "help": "Optional display name for the default DingTalk account shown in host configuration surfaces."
515
+ },
516
+ "enabled": {
517
+ "label": "Enabled",
518
+ "help": "Turn the DingTalk channel on or off without deleting the saved configuration."
519
+ },
520
+ "agentId": {
521
+ "label": "Legacy Agent ID",
522
+ "help": "Deprecated compatibility field from older setup flows. The current runtime ignores it, so leave it empty in new configs."
523
+ },
524
+ "corpId": {
525
+ "label": "Legacy Corp ID",
526
+ "help": "Deprecated compatibility field from older enterprise app setup flows. Stream mode no longer needs or reads it."
527
+ },
528
+ "clientId": {
529
+ "label": "DingTalk Client ID",
530
+ "help": "App Key used to authenticate DingTalk API requests."
531
+ },
532
+ "clientSecret": {
533
+ "label": "DingTalk Client Secret",
534
+ "help": "App Secret used to obtain DingTalk access tokens.",
535
+ "sensitive": true
536
+ },
537
+ "dmPolicy": {
538
+ "label": "Direct Message Policy",
539
+ "help": "Choose who can talk to the bot in direct messages: open, host pairing only, or explicit allowlist."
540
+ },
541
+ "groupPolicy": {
542
+ "label": "Group Message Policy",
543
+ "help": "Choose whether group messages are open to all groups, restricted by allowlist, or completely disabled."
544
+ },
545
+ "allowFrom": {
546
+ "label": "DM Allowlist",
547
+ "help": "User IDs allowed when direct message policy is set to allowlist."
548
+ },
549
+ "groupAllowFrom": {
550
+ "label": "Group Sender Allowlist",
551
+ "help": "Sender IDs allowed when group policy is allowlist or when you want tighter group sender restrictions."
552
+ },
553
+ "messageType": {
554
+ "label": "Reply Message Type",
555
+ "help": "Choose markdown for standard replies or card for AI Card delivery."
556
+ },
557
+ "ackReaction": {
558
+ "label": "Ack Reaction",
559
+ "help": "Native acknowledgement reaction mode. Supports preset values or a custom string for backward compatibility."
560
+ },
561
+ "displayNameResolution": {
562
+ "label": "Display Name Resolution",
563
+ "help": "Keep disabled unless you explicitly want learned display-name targeting for all callers."
564
+ },
565
+ "contextVisibility": {
566
+ "label": "Context Visibility",
567
+ "help": "Host-level context filtering. allowlist_quote is the safest advanced mode when you only want explicit quote/reply context."
568
+ },
569
+ "mediaUrlAllowlist": {
570
+ "label": "Media URL Allowlist",
571
+ "help": "Allow remote media downloads only from the specified hosts, IPs, or CIDR ranges."
572
+ },
573
+ "journalTTLDays": {
574
+ "label": "Message Context TTL (days)",
575
+ "help": "Retention period for short-lived quoted message and media recovery context."
576
+ },
577
+ "debug": {
578
+ "label": "Debug Logging",
579
+ "help": "Enable verbose DingTalk channel debug logs for diagnostics."
580
+ },
581
+ "cardTemplateId": {
582
+ "label": "AI Card Template ID",
583
+ "help": "Deprecated and ignored. AI card replies now always use the built-in DingTalk template contract."
584
+ },
585
+ "cardTemplateKey": {
586
+ "label": "AI Card Template Field Key",
587
+ "help": "Deprecated and ignored. The built-in AI card contract owns the streaming field mapping."
588
+ },
589
+ "groups": {
590
+ "label": "Per-Group Overrides",
591
+ "help": "Configure conversationId-specific overrides, or use * as a wildcard fallback."
592
+ },
593
+ "groups.systemPrompt": {
594
+ "label": "Group System Prompt",
595
+ "help": "Extra system prompt appended only for the selected group."
596
+ },
597
+ "groups.requireMention": {
598
+ "label": "Require Mention",
599
+ "help": "Require an explicit @mention before the bot answers in that group."
600
+ },
601
+ "groups.groupAllowFrom": {
602
+ "label": "Per-Group Sender Allowlist",
603
+ "help": "Optional sender allowlist that overrides or tightens the channel-level group access rule."
604
+ },
605
+ "maxConnectionAttempts": {
606
+ "label": "Max Connection Attempts",
607
+ "help": "How many connection attempts are allowed within a reconnect cycle before the cycle backs off or ends."
608
+ },
609
+ "initialReconnectDelay": {
610
+ "label": "Initial Reconnect Delay",
611
+ "help": "Initial reconnect backoff delay in milliseconds."
612
+ },
613
+ "maxReconnectDelay": {
614
+ "label": "Max Reconnect Delay",
615
+ "help": "Upper bound for reconnect backoff delay in milliseconds."
616
+ },
617
+ "reconnectJitter": {
618
+ "label": "Reconnect Jitter",
619
+ "help": "Randomization factor added to reconnect backoff to reduce synchronized reconnect storms."
620
+ },
621
+ "maxReconnectCycles": {
622
+ "label": "Max Reconnect Cycles",
623
+ "help": "Maximum reconnect cycles before the channel stops retrying and waits for a later restart."
624
+ },
625
+ "reconnectDeadlineMs": {
626
+ "label": "Reconnect Cycle Deadline",
627
+ "help": "Time limit in milliseconds for one reconnect cycle before starting a fresh cycle."
628
+ },
629
+ "useConnectionManager": {
630
+ "label": "Use Connection Manager",
631
+ "help": "Recommended default. Disable only when you intentionally rely on the DingTalk client keepAlive and autoReconnect behavior."
632
+ },
633
+ "mediaMaxMb": {
634
+ "label": "Max Media Size (MB)",
635
+ "help": "Maximum inbound media size accepted by the plugin. Leave empty to use the runtime default."
636
+ },
637
+ "keepAlive": {
638
+ "label": "Stream KeepAlive",
639
+ "help": "Optional explicit heartbeat toggle for the underlying Stream client."
640
+ },
641
+ "bypassProxyForSend": {
642
+ "label": "Bypass Proxy For Send",
643
+ "help": "Skip global or system HTTP(S) proxy settings for DingTalk send, upload, and card APIs."
644
+ },
645
+ "cardRealTimeStream": {
646
+ "label": "Legacy Real-Time Card Stream",
647
+ "help": "Deprecated compatibility flag. When true and cardStreamingMode is unset, runtime falls back to all-streaming. Do not use in new configs."
648
+ },
649
+ "cardStreamingMode": {
650
+ "label": "Card Streaming Mode",
651
+ "help": "Choose off, answer, or all. answer streams only answer text, while all streams answer plus reasoning or thinking text."
652
+ },
653
+ "cardStreamInterval": {
654
+ "label": "Card Stream Interval (ms)",
655
+ "help": "Throttle interval in milliseconds between AI card incremental updates."
656
+ },
657
+ "aicardDegradeMs": {
658
+ "label": "AI Card Degrade Window (ms)",
659
+ "help": "Cooldown window after AI card trigger errors. Replies fall back to non-card delivery during this period."
660
+ },
661
+ "learningEnabled": {
662
+ "label": "Learning Enabled",
663
+ "help": "Enable the local feedback-learning loop for notes, reflections, and learning commands."
664
+ },
665
+ "learningAutoApply": {
666
+ "label": "Learning Auto Apply",
667
+ "help": "Automatically apply generated learning output into session notes or global rules when available."
668
+ },
669
+ "learningNoteTtlMs": {
670
+ "label": "Learning Note TTL (ms)",
671
+ "help": "Retention period for temporary learning notes."
672
+ },
673
+ "convertMarkdownTables": {
674
+ "label": "Convert Markdown Tables",
675
+ "help": "Flatten markdown tables into plain text before sending when you want more consistent DingTalk rendering."
676
+ },
677
+ "cardAtSender": {
678
+ "label": "Card Mention Follow-Up",
679
+ "help": "Send a follow-up @mention text after card finalization in group chats. Any non-empty string becomes the message body."
680
+ },
681
+ "showThinkingStream": {
682
+ "label": "Legacy Show Thinking Stream",
683
+ "help": "Deprecated compatibility field from older card streaming behavior. The current runtime ignores it."
684
+ },
685
+ "asyncMode": {
686
+ "label": "Legacy Async Mode",
687
+ "help": "Deprecated compatibility field from older host or runtime integrations. The current runtime ignores it."
688
+ },
689
+ "accounts": {
690
+ "label": "Named Accounts",
691
+ "help": "Create named DingTalk accounts when one plugin instance must serve multiple apps or tenants."
692
+ },
693
+ "proactivePermissionHint.enabled": {
694
+ "label": "Proactive Permission Hint Enabled",
695
+ "help": "Show a reminder when DingTalk proactive-send permission has not been granted."
696
+ },
697
+ "proactivePermissionHint.cooldownHours": {
698
+ "label": "Proactive Hint Cooldown (hours)",
699
+ "help": "Minimum cooldown before the same proactive permission hint can be shown again."
700
+ }
701
+ }
702
+ }
8
703
  }
9
704
  }