@cxyhhhhh/qqbot-cli 0.1.0-dev.202606011703

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.
@@ -0,0 +1,1540 @@
1
+ import { z } from 'zod';
2
+ import pino from 'pino';
3
+
4
+ /**
5
+ * 配置 Zod Schema + 类型定义
6
+ */
7
+
8
+ declare const botConfigSchema: z.ZodObject<{
9
+ qq: z.ZodObject<{
10
+ appId: z.ZodPipeline<z.ZodEffects<z.ZodString, string, unknown>, z.ZodString>;
11
+ appSecret: z.ZodPipeline<z.ZodEffects<z.ZodString, string, unknown>, z.ZodString>;
12
+ markdown: z.ZodDefault<z.ZodBoolean>;
13
+ /** 自定义 User-Agent(默认 qqbot-cli/<version>) */
14
+ userAgent: z.ZodOptional<z.ZodString>;
15
+ /** QQ Open Platform API 基址(默认 https://api.sgroup.qq.com) */
16
+ baseUrl: z.ZodOptional<z.ZodString>;
17
+ /** Token 接口基址(默认 https://bots.qq.com) */
18
+ tokenBaseUrl: z.ZodOptional<z.ZodString>;
19
+ /**
20
+ * 启动时 Token 获取策略。
21
+ * - "sync" (默认): 阻塞等待 token 获取成功后再接受流量,凭证错误立即暴露。
22
+ * - "async": 后台异步获取 token,服务更快启动,但首次请求可能失败。
23
+ */
24
+ tokenPrefetch: z.ZodDefault<z.ZodEnum<["sync", "async"]>>;
25
+ /**
26
+ * 事件传输模式。
27
+ * - "websocket" (默认): WS 长连(心跳/重连/RESUME)
28
+ * - "webhook": QQ 平台 POST 回调到你的 HTTPS 端点
29
+ */
30
+ transport: z.ZodDefault<z.ZodEnum<["websocket", "webhook"]>>;
31
+ /** Webhook 模式配置(仅 transport=webhook 时生效) */
32
+ webhook: z.ZodDefault<z.ZodObject<{
33
+ /** 监听端口,默认 8080 */
34
+ port: z.ZodDefault<z.ZodNumber>;
35
+ /** 监听路径,默认 "/" */
36
+ path: z.ZodDefault<z.ZodString>;
37
+ }, "strip", z.ZodTypeAny, {
38
+ path: string;
39
+ port: number;
40
+ }, {
41
+ path?: string | undefined;
42
+ port?: number | undefined;
43
+ }>>;
44
+ }, "strip", z.ZodTypeAny, {
45
+ appId: string;
46
+ appSecret: string;
47
+ markdown: boolean;
48
+ tokenPrefetch: "sync" | "async";
49
+ webhook: {
50
+ path: string;
51
+ port: number;
52
+ };
53
+ transport: "websocket" | "webhook";
54
+ userAgent?: string | undefined;
55
+ baseUrl?: string | undefined;
56
+ tokenBaseUrl?: string | undefined;
57
+ }, {
58
+ appId?: unknown;
59
+ appSecret?: unknown;
60
+ markdown?: boolean | undefined;
61
+ userAgent?: string | undefined;
62
+ baseUrl?: string | undefined;
63
+ tokenBaseUrl?: string | undefined;
64
+ tokenPrefetch?: "sync" | "async" | undefined;
65
+ webhook?: {
66
+ path?: string | undefined;
67
+ port?: number | undefined;
68
+ } | undefined;
69
+ transport?: "websocket" | "webhook" | undefined;
70
+ }>;
71
+ backend: z.ZodObject<{
72
+ type: z.ZodDefault<z.ZodEnum<["echo", "openai", "cloudagent"]>>;
73
+ cloudagent: z.ZodOptional<z.ZodObject<{
74
+ apiKey: z.ZodOptional<z.ZodString>;
75
+ endpoint: z.ZodDefault<z.ZodString>;
76
+ sandbox: z.ZodDefault<z.ZodObject<{
77
+ /** auto: 自动创建 Runtime | manual: 指定 runtimeId | direct: 直连 ACP 端点 */
78
+ mode: z.ZodDefault<z.ZodEnum<["auto", "manual", "direct"]>>;
79
+ runtimeName: z.ZodOptional<z.ZodString>;
80
+ runtimeId: z.ZodOptional<z.ZodString>;
81
+ /** direct 模式:ACP 端点 URL(如 http://localhost:65225/acp) */
82
+ acpEndpoint: z.ZodOptional<z.ZodString>;
83
+ /** direct 模式:ACP 认证 token */
84
+ acpToken: z.ZodOptional<z.ZodString>;
85
+ }, "strip", z.ZodTypeAny, {
86
+ mode: "auto" | "manual" | "direct";
87
+ runtimeName?: string | undefined;
88
+ runtimeId?: string | undefined;
89
+ acpEndpoint?: string | undefined;
90
+ acpToken?: string | undefined;
91
+ }, {
92
+ mode?: "auto" | "manual" | "direct" | undefined;
93
+ runtimeName?: string | undefined;
94
+ runtimeId?: string | undefined;
95
+ acpEndpoint?: string | undefined;
96
+ acpToken?: string | undefined;
97
+ }>>;
98
+ manifest: z.ZodDefault<z.ZodObject<{
99
+ systemPrompt: z.ZodOptional<z.ZodString>;
100
+ systemPromptFile: z.ZodOptional<z.ZodString>;
101
+ }, "strip", z.ZodTypeAny, {
102
+ systemPrompt?: string | undefined;
103
+ systemPromptFile?: string | undefined;
104
+ }, {
105
+ systemPrompt?: string | undefined;
106
+ systemPromptFile?: string | undefined;
107
+ }>>;
108
+ acp: z.ZodDefault<z.ZodObject<{
109
+ lazyConnect: z.ZodDefault<z.ZodBoolean>;
110
+ maxRetries: z.ZodDefault<z.ZodNumber>;
111
+ retryIntervalMs: z.ZodDefault<z.ZodNumber>;
112
+ /** 等待下一个 ACP 事件的超时时间(ms),工具调用可能耗时较长。默认 180s */
113
+ eventTimeoutMs: z.ZodDefault<z.ZodNumber>;
114
+ }, "strip", z.ZodTypeAny, {
115
+ lazyConnect: boolean;
116
+ maxRetries: number;
117
+ retryIntervalMs: number;
118
+ eventTimeoutMs: number;
119
+ }, {
120
+ lazyConnect?: boolean | undefined;
121
+ maxRetries?: number | undefined;
122
+ retryIntervalMs?: number | undefined;
123
+ eventTimeoutMs?: number | undefined;
124
+ }>>;
125
+ /** 多用户 Session 连接池配置 */
126
+ session: z.ZodDefault<z.ZodObject<{
127
+ /** 最大并发连接数。默认 20 */
128
+ maxConnections: z.ZodDefault<z.ZodNumber>;
129
+ /** 是否启用空闲清理。默认 false */
130
+ enableCleanup: z.ZodDefault<z.ZodBoolean>;
131
+ /** 连接空闲超时(ms)。默认 30min */
132
+ idleTimeoutMs: z.ZodDefault<z.ZodNumber>;
133
+ /** 清理扫描间隔(ms)。默认 60s */
134
+ cleanupIntervalMs: z.ZodDefault<z.ZodNumber>;
135
+ /** 淘汰时保留服务端 session(下次自动恢复上下文)。默认 true */
136
+ preserveOnEvict: z.ZodDefault<z.ZodBoolean>;
137
+ }, "strip", z.ZodTypeAny, {
138
+ maxConnections: number;
139
+ enableCleanup: boolean;
140
+ idleTimeoutMs: number;
141
+ cleanupIntervalMs: number;
142
+ preserveOnEvict: boolean;
143
+ }, {
144
+ maxConnections?: number | undefined;
145
+ enableCleanup?: boolean | undefined;
146
+ idleTimeoutMs?: number | undefined;
147
+ cleanupIntervalMs?: number | undefined;
148
+ preserveOnEvict?: boolean | undefined;
149
+ }>>;
150
+ /** 额外的 MCP Server,和内置的一起传给 ACP session */
151
+ mcpServers: z.ZodDefault<z.ZodArray<z.ZodObject<{
152
+ type: z.ZodDefault<z.ZodEnum<["http", "sse"]>>;
153
+ name: z.ZodString;
154
+ url: z.ZodString;
155
+ headers: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
156
+ }, "strip", z.ZodTypeAny, {
157
+ type: "http" | "sse";
158
+ name: string;
159
+ url: string;
160
+ headers: Record<string, string>;
161
+ }, {
162
+ name: string;
163
+ url: string;
164
+ type?: "http" | "sse" | undefined;
165
+ headers?: Record<string, string> | undefined;
166
+ }>, "many">>;
167
+ }, "strip", z.ZodTypeAny, {
168
+ endpoint: string;
169
+ sandbox: {
170
+ mode: "auto" | "manual" | "direct";
171
+ runtimeName?: string | undefined;
172
+ runtimeId?: string | undefined;
173
+ acpEndpoint?: string | undefined;
174
+ acpToken?: string | undefined;
175
+ };
176
+ manifest: {
177
+ systemPrompt?: string | undefined;
178
+ systemPromptFile?: string | undefined;
179
+ };
180
+ acp: {
181
+ lazyConnect: boolean;
182
+ maxRetries: number;
183
+ retryIntervalMs: number;
184
+ eventTimeoutMs: number;
185
+ };
186
+ session: {
187
+ maxConnections: number;
188
+ enableCleanup: boolean;
189
+ idleTimeoutMs: number;
190
+ cleanupIntervalMs: number;
191
+ preserveOnEvict: boolean;
192
+ };
193
+ mcpServers: {
194
+ type: "http" | "sse";
195
+ name: string;
196
+ url: string;
197
+ headers: Record<string, string>;
198
+ }[];
199
+ apiKey?: string | undefined;
200
+ }, {
201
+ apiKey?: string | undefined;
202
+ endpoint?: string | undefined;
203
+ sandbox?: {
204
+ mode?: "auto" | "manual" | "direct" | undefined;
205
+ runtimeName?: string | undefined;
206
+ runtimeId?: string | undefined;
207
+ acpEndpoint?: string | undefined;
208
+ acpToken?: string | undefined;
209
+ } | undefined;
210
+ manifest?: {
211
+ systemPrompt?: string | undefined;
212
+ systemPromptFile?: string | undefined;
213
+ } | undefined;
214
+ acp?: {
215
+ lazyConnect?: boolean | undefined;
216
+ maxRetries?: number | undefined;
217
+ retryIntervalMs?: number | undefined;
218
+ eventTimeoutMs?: number | undefined;
219
+ } | undefined;
220
+ session?: {
221
+ maxConnections?: number | undefined;
222
+ enableCleanup?: boolean | undefined;
223
+ idleTimeoutMs?: number | undefined;
224
+ cleanupIntervalMs?: number | undefined;
225
+ preserveOnEvict?: boolean | undefined;
226
+ } | undefined;
227
+ mcpServers?: {
228
+ name: string;
229
+ url: string;
230
+ type?: "http" | "sse" | undefined;
231
+ headers?: Record<string, string> | undefined;
232
+ }[] | undefined;
233
+ }>>;
234
+ openai: z.ZodOptional<z.ZodObject<{
235
+ apiKey: z.ZodString;
236
+ baseUrl: z.ZodDefault<z.ZodString>;
237
+ model: z.ZodDefault<z.ZodString>;
238
+ systemPrompt: z.ZodDefault<z.ZodString>;
239
+ maxTokens: z.ZodDefault<z.ZodNumber>;
240
+ temperature: z.ZodDefault<z.ZodNumber>;
241
+ }, "strip", z.ZodTypeAny, {
242
+ baseUrl: string;
243
+ apiKey: string;
244
+ systemPrompt: string;
245
+ model: string;
246
+ maxTokens: number;
247
+ temperature: number;
248
+ }, {
249
+ apiKey: string;
250
+ baseUrl?: string | undefined;
251
+ systemPrompt?: string | undefined;
252
+ model?: string | undefined;
253
+ maxTokens?: number | undefined;
254
+ temperature?: number | undefined;
255
+ }>>;
256
+ }, "strip", z.ZodTypeAny, {
257
+ type: "cloudagent" | "echo" | "openai";
258
+ cloudagent?: {
259
+ endpoint: string;
260
+ sandbox: {
261
+ mode: "auto" | "manual" | "direct";
262
+ runtimeName?: string | undefined;
263
+ runtimeId?: string | undefined;
264
+ acpEndpoint?: string | undefined;
265
+ acpToken?: string | undefined;
266
+ };
267
+ manifest: {
268
+ systemPrompt?: string | undefined;
269
+ systemPromptFile?: string | undefined;
270
+ };
271
+ acp: {
272
+ lazyConnect: boolean;
273
+ maxRetries: number;
274
+ retryIntervalMs: number;
275
+ eventTimeoutMs: number;
276
+ };
277
+ session: {
278
+ maxConnections: number;
279
+ enableCleanup: boolean;
280
+ idleTimeoutMs: number;
281
+ cleanupIntervalMs: number;
282
+ preserveOnEvict: boolean;
283
+ };
284
+ mcpServers: {
285
+ type: "http" | "sse";
286
+ name: string;
287
+ url: string;
288
+ headers: Record<string, string>;
289
+ }[];
290
+ apiKey?: string | undefined;
291
+ } | undefined;
292
+ openai?: {
293
+ baseUrl: string;
294
+ apiKey: string;
295
+ systemPrompt: string;
296
+ model: string;
297
+ maxTokens: number;
298
+ temperature: number;
299
+ } | undefined;
300
+ }, {
301
+ cloudagent?: {
302
+ apiKey?: string | undefined;
303
+ endpoint?: string | undefined;
304
+ sandbox?: {
305
+ mode?: "auto" | "manual" | "direct" | undefined;
306
+ runtimeName?: string | undefined;
307
+ runtimeId?: string | undefined;
308
+ acpEndpoint?: string | undefined;
309
+ acpToken?: string | undefined;
310
+ } | undefined;
311
+ manifest?: {
312
+ systemPrompt?: string | undefined;
313
+ systemPromptFile?: string | undefined;
314
+ } | undefined;
315
+ acp?: {
316
+ lazyConnect?: boolean | undefined;
317
+ maxRetries?: number | undefined;
318
+ retryIntervalMs?: number | undefined;
319
+ eventTimeoutMs?: number | undefined;
320
+ } | undefined;
321
+ session?: {
322
+ maxConnections?: number | undefined;
323
+ enableCleanup?: boolean | undefined;
324
+ idleTimeoutMs?: number | undefined;
325
+ cleanupIntervalMs?: number | undefined;
326
+ preserveOnEvict?: boolean | undefined;
327
+ } | undefined;
328
+ mcpServers?: {
329
+ name: string;
330
+ url: string;
331
+ type?: "http" | "sse" | undefined;
332
+ headers?: Record<string, string> | undefined;
333
+ }[] | undefined;
334
+ } | undefined;
335
+ type?: "cloudagent" | "echo" | "openai" | undefined;
336
+ openai?: {
337
+ apiKey: string;
338
+ baseUrl?: string | undefined;
339
+ systemPrompt?: string | undefined;
340
+ model?: string | undefined;
341
+ maxTokens?: number | undefined;
342
+ temperature?: number | undefined;
343
+ } | undefined;
344
+ }>;
345
+ middleware: z.ZodDefault<z.ZodObject<{
346
+ messageFilter: z.ZodDefault<z.ZodObject<{
347
+ skipSelfEcho: z.ZodDefault<z.ZodBoolean>;
348
+ dedup: z.ZodDefault<z.ZodObject<{
349
+ windowMs: z.ZodDefault<z.ZodNumber>;
350
+ }, "strip", z.ZodTypeAny, {
351
+ windowMs: number;
352
+ }, {
353
+ windowMs?: number | undefined;
354
+ }>>;
355
+ }, "strip", z.ZodTypeAny, {
356
+ skipSelfEcho: boolean;
357
+ dedup: {
358
+ windowMs: number;
359
+ };
360
+ }, {
361
+ skipSelfEcho?: boolean | undefined;
362
+ dedup?: {
363
+ windowMs?: number | undefined;
364
+ } | undefined;
365
+ }>>;
366
+ contentSanitizer: z.ZodDefault<z.ZodObject<{
367
+ stripBotMention: z.ZodDefault<z.ZodBoolean>;
368
+ collapseWhitespace: z.ZodDefault<z.ZodBoolean>;
369
+ }, "strip", z.ZodTypeAny, {
370
+ stripBotMention: boolean;
371
+ collapseWhitespace: boolean;
372
+ }, {
373
+ stripBotMention?: boolean | undefined;
374
+ collapseWhitespace?: boolean | undefined;
375
+ }>>;
376
+ mentionGate: z.ZodDefault<z.ZodObject<{
377
+ requireMentionInGroup: z.ZodDefault<z.ZodBoolean>;
378
+ alwaysAnswerC2C: z.ZodDefault<z.ZodBoolean>;
379
+ }, "strip", z.ZodTypeAny, {
380
+ requireMentionInGroup: boolean;
381
+ alwaysAnswerC2C: boolean;
382
+ }, {
383
+ requireMentionInGroup?: boolean | undefined;
384
+ alwaysAnswerC2C?: boolean | undefined;
385
+ }>>;
386
+ rateLimiter: z.ZodDefault<z.ZodObject<{
387
+ enabled: z.ZodDefault<z.ZodBoolean>;
388
+ perSender: z.ZodDefault<z.ZodObject<{
389
+ max: z.ZodDefault<z.ZodNumber>;
390
+ windowMs: z.ZodDefault<z.ZodNumber>;
391
+ }, "strip", z.ZodTypeAny, {
392
+ windowMs: number;
393
+ max: number;
394
+ }, {
395
+ windowMs?: number | undefined;
396
+ max?: number | undefined;
397
+ }>>;
398
+ global: z.ZodDefault<z.ZodObject<{
399
+ max: z.ZodDefault<z.ZodNumber>;
400
+ windowMs: z.ZodDefault<z.ZodNumber>;
401
+ }, "strip", z.ZodTypeAny, {
402
+ windowMs: number;
403
+ max: number;
404
+ }, {
405
+ windowMs?: number | undefined;
406
+ max?: number | undefined;
407
+ }>>;
408
+ }, "strip", z.ZodTypeAny, {
409
+ enabled: boolean;
410
+ perSender: {
411
+ windowMs: number;
412
+ max: number;
413
+ };
414
+ global: {
415
+ windowMs: number;
416
+ max: number;
417
+ };
418
+ }, {
419
+ enabled?: boolean | undefined;
420
+ perSender?: {
421
+ windowMs?: number | undefined;
422
+ max?: number | undefined;
423
+ } | undefined;
424
+ global?: {
425
+ windowMs?: number | undefined;
426
+ max?: number | undefined;
427
+ } | undefined;
428
+ }>>;
429
+ typingIndicator: z.ZodEffects<z.ZodDefault<z.ZodObject<{
430
+ enabled: z.ZodDefault<z.ZodBoolean>;
431
+ /** typing 指示器持续时间(秒)。默认 15 */
432
+ durationSec: z.ZodDefault<z.ZodNumber>;
433
+ /** keepAlive 重发间隔(ms)。默认根据 durationSec 自动计算 */
434
+ keepAliveIntervalMs: z.ZodOptional<z.ZodNumber>;
435
+ }, "strip", z.ZodTypeAny, {
436
+ enabled: boolean;
437
+ durationSec: number;
438
+ keepAliveIntervalMs?: number | undefined;
439
+ }, {
440
+ enabled?: boolean | undefined;
441
+ durationSec?: number | undefined;
442
+ keepAliveIntervalMs?: number | undefined;
443
+ }>>, {
444
+ keepAliveIntervalMs: number;
445
+ enabled: boolean;
446
+ durationSec: number;
447
+ }, {
448
+ enabled?: boolean | undefined;
449
+ durationSec?: number | undefined;
450
+ keepAliveIntervalMs?: number | undefined;
451
+ } | undefined>;
452
+ slashCommands: z.ZodDefault<z.ZodObject<{
453
+ enabled: z.ZodDefault<z.ZodBoolean>;
454
+ prefixes: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
455
+ /** 指令白名单(用户 OpenID 列表)。为空则所有人可用。 */
456
+ allowFrom: z.ZodEffects<z.ZodDefault<z.ZodArray<z.ZodNullable<z.ZodString>, "many">>, string[], (string | null)[] | undefined>;
457
+ }, "strip", z.ZodTypeAny, {
458
+ enabled: boolean;
459
+ prefixes: string[];
460
+ allowFrom: string[];
461
+ }, {
462
+ enabled?: boolean | undefined;
463
+ prefixes?: string[] | undefined;
464
+ allowFrom?: (string | null)[] | undefined;
465
+ }>>;
466
+ concurrency: z.ZodDefault<z.ZodObject<{
467
+ /** Strategy: queue | drop | abort | merge. Default: merge. */
468
+ strategy: z.ZodDefault<z.ZodEnum<["queue", "drop", "abort", "merge"]>>;
469
+ /** Max queued messages per target. Default: 50. */
470
+ maxQueue: z.ZodDefault<z.ZodNumber>;
471
+ }, "strip", z.ZodTypeAny, {
472
+ strategy: "queue" | "drop" | "abort" | "merge";
473
+ maxQueue: number;
474
+ }, {
475
+ strategy?: "queue" | "drop" | "abort" | "merge" | undefined;
476
+ maxQueue?: number | undefined;
477
+ }>>;
478
+ }, "strip", z.ZodTypeAny, {
479
+ messageFilter: {
480
+ skipSelfEcho: boolean;
481
+ dedup: {
482
+ windowMs: number;
483
+ };
484
+ };
485
+ contentSanitizer: {
486
+ stripBotMention: boolean;
487
+ collapseWhitespace: boolean;
488
+ };
489
+ mentionGate: {
490
+ requireMentionInGroup: boolean;
491
+ alwaysAnswerC2C: boolean;
492
+ };
493
+ rateLimiter: {
494
+ enabled: boolean;
495
+ perSender: {
496
+ windowMs: number;
497
+ max: number;
498
+ };
499
+ global: {
500
+ windowMs: number;
501
+ max: number;
502
+ };
503
+ };
504
+ typingIndicator: {
505
+ keepAliveIntervalMs: number;
506
+ enabled: boolean;
507
+ durationSec: number;
508
+ };
509
+ slashCommands: {
510
+ enabled: boolean;
511
+ prefixes: string[];
512
+ allowFrom: string[];
513
+ };
514
+ concurrency: {
515
+ strategy: "queue" | "drop" | "abort" | "merge";
516
+ maxQueue: number;
517
+ };
518
+ }, {
519
+ messageFilter?: {
520
+ skipSelfEcho?: boolean | undefined;
521
+ dedup?: {
522
+ windowMs?: number | undefined;
523
+ } | undefined;
524
+ } | undefined;
525
+ contentSanitizer?: {
526
+ stripBotMention?: boolean | undefined;
527
+ collapseWhitespace?: boolean | undefined;
528
+ } | undefined;
529
+ mentionGate?: {
530
+ requireMentionInGroup?: boolean | undefined;
531
+ alwaysAnswerC2C?: boolean | undefined;
532
+ } | undefined;
533
+ rateLimiter?: {
534
+ enabled?: boolean | undefined;
535
+ perSender?: {
536
+ windowMs?: number | undefined;
537
+ max?: number | undefined;
538
+ } | undefined;
539
+ global?: {
540
+ windowMs?: number | undefined;
541
+ max?: number | undefined;
542
+ } | undefined;
543
+ } | undefined;
544
+ typingIndicator?: {
545
+ enabled?: boolean | undefined;
546
+ durationSec?: number | undefined;
547
+ keepAliveIntervalMs?: number | undefined;
548
+ } | undefined;
549
+ slashCommands?: {
550
+ enabled?: boolean | undefined;
551
+ prefixes?: string[] | undefined;
552
+ allowFrom?: (string | null)[] | undefined;
553
+ } | undefined;
554
+ concurrency?: {
555
+ strategy?: "queue" | "drop" | "abort" | "merge" | undefined;
556
+ maxQueue?: number | undefined;
557
+ } | undefined;
558
+ }>>;
559
+ streaming: z.ZodDefault<z.ZodObject<{
560
+ c2c: z.ZodDefault<z.ZodBoolean>;
561
+ throttleMs: z.ZodDefault<z.ZodNumber>;
562
+ }, "strip", z.ZodTypeAny, {
563
+ c2c: boolean;
564
+ throttleMs: number;
565
+ }, {
566
+ c2c?: boolean | undefined;
567
+ throttleMs?: number | undefined;
568
+ }>>;
569
+ message: z.ZodDefault<z.ZodObject<{
570
+ /** 展示样式配置 */
571
+ display: z.ZodEffects<z.ZodDefault<z.ZodObject<{
572
+ /** Preset: full | compact | minimal | text-only */
573
+ preset: z.ZodDefault<z.ZodEnum<["full", "compact", "minimal", "text-only"]>>;
574
+ /** Show tool calls */
575
+ tool: z.ZodOptional<z.ZodBoolean>;
576
+ /** Show agent thought chunks */
577
+ thought: z.ZodOptional<z.ZodBoolean>;
578
+ /** Show execution plan */
579
+ plan: z.ZodOptional<z.ZodBoolean>;
580
+ /** Show emoji before tool name */
581
+ toolEmoji: z.ZodOptional<z.ZodBoolean>;
582
+ /** Show tool kind label (Search/Fetch/...) */
583
+ toolKind: z.ZodOptional<z.ZodBoolean>;
584
+ /** Show tool title (URL, query, command, ...) */
585
+ toolTitle: z.ZodOptional<z.ZodBoolean>;
586
+ /** Max display length for tool detail when truncation is enabled. Default: 120 */
587
+ toolDetailMaxLength: z.ZodOptional<z.ZodNumber>;
588
+ /** Tool kinds whose detail should be truncated. Default: [] (no truncation) */
589
+ toolDetailTruncate: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
590
+ }, "strip", z.ZodTypeAny, {
591
+ preset: "full" | "compact" | "minimal" | "text-only";
592
+ tool?: boolean | undefined;
593
+ thought?: boolean | undefined;
594
+ plan?: boolean | undefined;
595
+ toolEmoji?: boolean | undefined;
596
+ toolKind?: boolean | undefined;
597
+ toolTitle?: boolean | undefined;
598
+ toolDetailMaxLength?: number | undefined;
599
+ toolDetailTruncate?: string[] | undefined;
600
+ }, {
601
+ preset?: "full" | "compact" | "minimal" | "text-only" | undefined;
602
+ tool?: boolean | undefined;
603
+ thought?: boolean | undefined;
604
+ plan?: boolean | undefined;
605
+ toolEmoji?: boolean | undefined;
606
+ toolKind?: boolean | undefined;
607
+ toolTitle?: boolean | undefined;
608
+ toolDetailMaxLength?: number | undefined;
609
+ toolDetailTruncate?: string[] | undefined;
610
+ }>>, {
611
+ preset: "full" | "compact" | "minimal" | "text-only";
612
+ tool: boolean;
613
+ thought: boolean;
614
+ plan: boolean;
615
+ toolEmoji: boolean;
616
+ toolKind: boolean;
617
+ toolTitle: boolean;
618
+ toolDetailMaxLength: number | undefined;
619
+ toolDetailTruncate: string[] | undefined;
620
+ }, {
621
+ preset?: "full" | "compact" | "minimal" | "text-only" | undefined;
622
+ tool?: boolean | undefined;
623
+ thought?: boolean | undefined;
624
+ plan?: boolean | undefined;
625
+ toolEmoji?: boolean | undefined;
626
+ toolKind?: boolean | undefined;
627
+ toolTitle?: boolean | undefined;
628
+ toolDetailMaxLength?: number | undefined;
629
+ toolDetailTruncate?: string[] | undefined;
630
+ } | undefined>;
631
+ /** 异常兜底文案配置 */
632
+ errorMessages: z.ZodDefault<z.ZodObject<{
633
+ /**
634
+ * 错误匹配规则,按顺序匹配。
635
+ * 每条 rule: match 为关键词数组(任一命中即匹配,大小写不敏感),reply 为回复文案。
636
+ * 可选 hint: 追加在 reply 后的排查指引(覆盖全局 troubleshootHint)。
637
+ */
638
+ rules: z.ZodDefault<z.ZodArray<z.ZodObject<{
639
+ match: z.ZodArray<z.ZodString, "many">;
640
+ reply: z.ZodString;
641
+ hint: z.ZodOptional<z.ZodString>;
642
+ }, "strip", z.ZodTypeAny, {
643
+ match: string[];
644
+ reply: string;
645
+ hint?: string | undefined;
646
+ }, {
647
+ match: string[];
648
+ reply: string;
649
+ hint?: string | undefined;
650
+ }>, "many">>;
651
+ /** Agent 未生成回复 */
652
+ emptyReply: z.ZodDefault<z.ZodString>;
653
+ /** 所有规则都未命中时的兜底 */
654
+ unknown: z.ZodDefault<z.ZodString>;
655
+ /** 全局排查指引,追加在所有错误消息后面(rule 级别 hint 优先) */
656
+ troubleshootHint: z.ZodOptional<z.ZodString>;
657
+ /** 调试模式:错误消息中追加原始 errMsg。默认 false */
658
+ debug: z.ZodDefault<z.ZodBoolean>;
659
+ }, "strip", z.ZodTypeAny, {
660
+ unknown: string;
661
+ rules: {
662
+ match: string[];
663
+ reply: string;
664
+ hint?: string | undefined;
665
+ }[];
666
+ emptyReply: string;
667
+ debug: boolean;
668
+ troubleshootHint?: string | undefined;
669
+ }, {
670
+ unknown?: string | undefined;
671
+ rules?: {
672
+ match: string[];
673
+ reply: string;
674
+ hint?: string | undefined;
675
+ }[] | undefined;
676
+ emptyReply?: string | undefined;
677
+ troubleshootHint?: string | undefined;
678
+ debug?: boolean | undefined;
679
+ }>>;
680
+ }, "strip", z.ZodTypeAny, {
681
+ display: {
682
+ preset: "full" | "compact" | "minimal" | "text-only";
683
+ tool: boolean;
684
+ thought: boolean;
685
+ plan: boolean;
686
+ toolEmoji: boolean;
687
+ toolKind: boolean;
688
+ toolTitle: boolean;
689
+ toolDetailMaxLength: number | undefined;
690
+ toolDetailTruncate: string[] | undefined;
691
+ };
692
+ errorMessages: {
693
+ unknown: string;
694
+ rules: {
695
+ match: string[];
696
+ reply: string;
697
+ hint?: string | undefined;
698
+ }[];
699
+ emptyReply: string;
700
+ debug: boolean;
701
+ troubleshootHint?: string | undefined;
702
+ };
703
+ }, {
704
+ display?: {
705
+ preset?: "full" | "compact" | "minimal" | "text-only" | undefined;
706
+ tool?: boolean | undefined;
707
+ thought?: boolean | undefined;
708
+ plan?: boolean | undefined;
709
+ toolEmoji?: boolean | undefined;
710
+ toolKind?: boolean | undefined;
711
+ toolTitle?: boolean | undefined;
712
+ toolDetailMaxLength?: number | undefined;
713
+ toolDetailTruncate?: string[] | undefined;
714
+ } | undefined;
715
+ errorMessages?: {
716
+ unknown?: string | undefined;
717
+ rules?: {
718
+ match: string[];
719
+ reply: string;
720
+ hint?: string | undefined;
721
+ }[] | undefined;
722
+ emptyReply?: string | undefined;
723
+ troubleshootHint?: string | undefined;
724
+ debug?: boolean | undefined;
725
+ } | undefined;
726
+ }>>;
727
+ session: z.ZodDefault<z.ZodObject<{
728
+ isolation: z.ZodDefault<z.ZodEnum<["per-qualifier", "global"]>>;
729
+ persistence: z.ZodDefault<z.ZodObject<{
730
+ type: z.ZodDefault<z.ZodEnum<["file", "memory"]>>;
731
+ dir: z.ZodDefault<z.ZodString>;
732
+ }, "strip", z.ZodTypeAny, {
733
+ type: "file" | "memory";
734
+ dir: string;
735
+ }, {
736
+ type?: "file" | "memory" | undefined;
737
+ dir?: string | undefined;
738
+ }>>;
739
+ }, "strip", z.ZodTypeAny, {
740
+ isolation: "global" | "per-qualifier";
741
+ persistence: {
742
+ type: "file" | "memory";
743
+ dir: string;
744
+ };
745
+ }, {
746
+ isolation?: "global" | "per-qualifier" | undefined;
747
+ persistence?: {
748
+ type?: "file" | "memory" | undefined;
749
+ dir?: string | undefined;
750
+ } | undefined;
751
+ }>>;
752
+ log: z.ZodDefault<z.ZodObject<{
753
+ level: z.ZodDefault<z.ZodEnum<["debug", "info", "warn", "error"]>>;
754
+ /** 控制台输出格式:pretty(人类可读)| json(结构化)。默认 pretty */
755
+ console: z.ZodDefault<z.ZodEnum<["json", "pretty"]>>;
756
+ /** 文件日志(滚动) */
757
+ file: z.ZodDefault<z.ZodObject<{
758
+ enabled: z.ZodDefault<z.ZodBoolean>;
759
+ dir: z.ZodDefault<z.ZodString>;
760
+ /** 单文件最大大小,支持 "10m" "1g" 等 */
761
+ maxSize: z.ZodDefault<z.ZodString>;
762
+ /** 保留文件数 */
763
+ maxFiles: z.ZodDefault<z.ZodNumber>;
764
+ /** 按时间滚动:daily | hourly | weekly */
765
+ frequency: z.ZodOptional<z.ZodEnum<["daily", "hourly", "weekly"]>>;
766
+ /** 文件名日期格式(需配合 frequency),如 "yyyy-MM-dd" */
767
+ dateFormat: z.ZodOptional<z.ZodString>;
768
+ /** 创建 current.log 符号链接指向当前活跃文件 */
769
+ symlink: z.ZodDefault<z.ZodBoolean>;
770
+ }, "strip", z.ZodTypeAny, {
771
+ enabled: boolean;
772
+ dir: string;
773
+ maxSize: string;
774
+ maxFiles: number;
775
+ symlink: boolean;
776
+ frequency?: "daily" | "hourly" | "weekly" | undefined;
777
+ dateFormat?: string | undefined;
778
+ }, {
779
+ enabled?: boolean | undefined;
780
+ dir?: string | undefined;
781
+ maxSize?: string | undefined;
782
+ maxFiles?: number | undefined;
783
+ frequency?: "daily" | "hourly" | "weekly" | undefined;
784
+ dateFormat?: string | undefined;
785
+ symlink?: boolean | undefined;
786
+ }>>;
787
+ }, "strip", z.ZodTypeAny, {
788
+ file: {
789
+ enabled: boolean;
790
+ dir: string;
791
+ maxSize: string;
792
+ maxFiles: number;
793
+ symlink: boolean;
794
+ frequency?: "daily" | "hourly" | "weekly" | undefined;
795
+ dateFormat?: string | undefined;
796
+ };
797
+ level: "debug" | "info" | "warn" | "error";
798
+ console: "json" | "pretty";
799
+ }, {
800
+ file?: {
801
+ enabled?: boolean | undefined;
802
+ dir?: string | undefined;
803
+ maxSize?: string | undefined;
804
+ maxFiles?: number | undefined;
805
+ frequency?: "daily" | "hourly" | "weekly" | undefined;
806
+ dateFormat?: string | undefined;
807
+ symlink?: boolean | undefined;
808
+ } | undefined;
809
+ level?: "debug" | "info" | "warn" | "error" | undefined;
810
+ console?: "json" | "pretty" | undefined;
811
+ }>>;
812
+ mcp: z.ZodDefault<z.ZodObject<{
813
+ enabled: z.ZodDefault<z.ZodBoolean>;
814
+ /** MCP Server 监听地址,默认 127.0.0.1;Docker 容器内需设为 0.0.0.0 */
815
+ host: z.ZodDefault<z.ZodString>;
816
+ /** MCP Server 监听端口,0 为随机分配 */
817
+ port: z.ZodDefault<z.ZodNumber>;
818
+ /** 文件路径前缀,拼接在工具接收到的 file_path 之前,用于容器卷映射 */
819
+ pathPrefix: z.ZodDefault<z.ZodString>;
820
+ }, "strip", z.ZodTypeAny, {
821
+ port: number;
822
+ enabled: boolean;
823
+ host: string;
824
+ pathPrefix: string;
825
+ }, {
826
+ port?: number | undefined;
827
+ enabled?: boolean | undefined;
828
+ host?: string | undefined;
829
+ pathPrefix?: string | undefined;
830
+ }>>;
831
+ openapi: z.ZodOptional<z.ZodObject<{
832
+ /** 全局超时(ms),默认 10000 */
833
+ timeoutMs: z.ZodDefault<z.ZodNumber>;
834
+ /** 接口声明列表 */
835
+ apis: z.ZodDefault<z.ZodArray<z.ZodObject<{
836
+ name: z.ZodString;
837
+ desc: z.ZodString;
838
+ method: z.ZodDefault<z.ZodEnum<["GET", "POST", "PUT", "DELETE", "PATCH"]>>;
839
+ path: z.ZodString;
840
+ fixed_body: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
841
+ params: z.ZodDefault<z.ZodArray<z.ZodObject<{
842
+ name: z.ZodString;
843
+ type: z.ZodDefault<z.ZodEnum<["string", "number", "boolean", "string[]", "number[]"]>>;
844
+ desc: z.ZodString;
845
+ required: z.ZodDefault<z.ZodBoolean>;
846
+ default: z.ZodOptional<z.ZodUnknown>;
847
+ }, "strip", z.ZodTypeAny, {
848
+ type: "string" | "number" | "boolean" | "string[]" | "number[]";
849
+ name: string;
850
+ desc: string;
851
+ required: boolean;
852
+ default?: unknown;
853
+ }, {
854
+ name: string;
855
+ desc: string;
856
+ type?: "string" | "number" | "boolean" | "string[]" | "number[]" | undefined;
857
+ required?: boolean | undefined;
858
+ default?: unknown;
859
+ }>, "many">>;
860
+ param_mapping: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
861
+ }, "strip", z.ZodTypeAny, {
862
+ params: {
863
+ type: "string" | "number" | "boolean" | "string[]" | "number[]";
864
+ name: string;
865
+ desc: string;
866
+ required: boolean;
867
+ default?: unknown;
868
+ }[];
869
+ path: string;
870
+ name: string;
871
+ desc: string;
872
+ method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
873
+ fixed_body?: Record<string, unknown> | undefined;
874
+ param_mapping?: Record<string, string> | undefined;
875
+ }, {
876
+ path: string;
877
+ name: string;
878
+ desc: string;
879
+ params?: {
880
+ name: string;
881
+ desc: string;
882
+ type?: "string" | "number" | "boolean" | "string[]" | "number[]" | undefined;
883
+ required?: boolean | undefined;
884
+ default?: unknown;
885
+ }[] | undefined;
886
+ method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | undefined;
887
+ fixed_body?: Record<string, unknown> | undefined;
888
+ param_mapping?: Record<string, string> | undefined;
889
+ }>, "many">>;
890
+ }, "strip", z.ZodTypeAny, {
891
+ timeoutMs: number;
892
+ apis: {
893
+ params: {
894
+ type: "string" | "number" | "boolean" | "string[]" | "number[]";
895
+ name: string;
896
+ desc: string;
897
+ required: boolean;
898
+ default?: unknown;
899
+ }[];
900
+ path: string;
901
+ name: string;
902
+ desc: string;
903
+ method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
904
+ fixed_body?: Record<string, unknown> | undefined;
905
+ param_mapping?: Record<string, string> | undefined;
906
+ }[];
907
+ }, {
908
+ timeoutMs?: number | undefined;
909
+ apis?: {
910
+ path: string;
911
+ name: string;
912
+ desc: string;
913
+ params?: {
914
+ name: string;
915
+ desc: string;
916
+ type?: "string" | "number" | "boolean" | "string[]" | "number[]" | undefined;
917
+ required?: boolean | undefined;
918
+ default?: unknown;
919
+ }[] | undefined;
920
+ method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | undefined;
921
+ fixed_body?: Record<string, unknown> | undefined;
922
+ param_mapping?: Record<string, string> | undefined;
923
+ }[] | undefined;
924
+ }>>;
925
+ telemetry: z.ZodDefault<z.ZodObject<{
926
+ enabled: z.ZodDefault<z.ZodBoolean>;
927
+ /** 开启 OTEL 内部诊断日志和控制台指标输出 */
928
+ debug: z.ZodDefault<z.ZodBoolean>;
929
+ serviceName: z.ZodDefault<z.ZodString>;
930
+ endpoint: z.ZodDefault<z.ZodString>;
931
+ protocol: z.ZodDefault<z.ZodEnum<["http", "grpc"]>>;
932
+ sampleRate: z.ZodDefault<z.ZodNumber>;
933
+ exportIntervalMs: z.ZodDefault<z.ZodNumber>;
934
+ attributes: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
935
+ /** 平台扩展配置 */
936
+ galileo: z.ZodOptional<z.ZodObject<{
937
+ platform: z.ZodString;
938
+ app: z.ZodString;
939
+ server: z.ZodString;
940
+ namespace: z.ZodDefault<z.ZodString>;
941
+ envName: z.ZodDefault<z.ZodString>;
942
+ }, "strip", z.ZodTypeAny, {
943
+ platform: string;
944
+ app: string;
945
+ server: string;
946
+ namespace: string;
947
+ envName: string;
948
+ }, {
949
+ platform: string;
950
+ app: string;
951
+ server: string;
952
+ namespace?: string | undefined;
953
+ envName?: string | undefined;
954
+ }>>;
955
+ }, "strip", z.ZodTypeAny, {
956
+ endpoint: string;
957
+ enabled: boolean;
958
+ debug: boolean;
959
+ serviceName: string;
960
+ protocol: "http" | "grpc";
961
+ sampleRate: number;
962
+ exportIntervalMs: number;
963
+ attributes: Record<string, string>;
964
+ galileo?: {
965
+ platform: string;
966
+ app: string;
967
+ server: string;
968
+ namespace: string;
969
+ envName: string;
970
+ } | undefined;
971
+ }, {
972
+ endpoint?: string | undefined;
973
+ enabled?: boolean | undefined;
974
+ debug?: boolean | undefined;
975
+ serviceName?: string | undefined;
976
+ protocol?: "http" | "grpc" | undefined;
977
+ sampleRate?: number | undefined;
978
+ exportIntervalMs?: number | undefined;
979
+ attributes?: Record<string, string> | undefined;
980
+ galileo?: {
981
+ platform: string;
982
+ app: string;
983
+ server: string;
984
+ namespace?: string | undefined;
985
+ envName?: string | undefined;
986
+ } | undefined;
987
+ }>>;
988
+ }, "strip", z.ZodTypeAny, {
989
+ message: {
990
+ display: {
991
+ preset: "full" | "compact" | "minimal" | "text-only";
992
+ tool: boolean;
993
+ thought: boolean;
994
+ plan: boolean;
995
+ toolEmoji: boolean;
996
+ toolKind: boolean;
997
+ toolTitle: boolean;
998
+ toolDetailMaxLength: number | undefined;
999
+ toolDetailTruncate: string[] | undefined;
1000
+ };
1001
+ errorMessages: {
1002
+ unknown: string;
1003
+ rules: {
1004
+ match: string[];
1005
+ reply: string;
1006
+ hint?: string | undefined;
1007
+ }[];
1008
+ emptyReply: string;
1009
+ debug: boolean;
1010
+ troubleshootHint?: string | undefined;
1011
+ };
1012
+ };
1013
+ session: {
1014
+ isolation: "global" | "per-qualifier";
1015
+ persistence: {
1016
+ type: "file" | "memory";
1017
+ dir: string;
1018
+ };
1019
+ };
1020
+ qq: {
1021
+ appId: string;
1022
+ appSecret: string;
1023
+ markdown: boolean;
1024
+ tokenPrefetch: "sync" | "async";
1025
+ webhook: {
1026
+ path: string;
1027
+ port: number;
1028
+ };
1029
+ transport: "websocket" | "webhook";
1030
+ userAgent?: string | undefined;
1031
+ baseUrl?: string | undefined;
1032
+ tokenBaseUrl?: string | undefined;
1033
+ };
1034
+ backend: {
1035
+ type: "cloudagent" | "echo" | "openai";
1036
+ cloudagent?: {
1037
+ endpoint: string;
1038
+ sandbox: {
1039
+ mode: "auto" | "manual" | "direct";
1040
+ runtimeName?: string | undefined;
1041
+ runtimeId?: string | undefined;
1042
+ acpEndpoint?: string | undefined;
1043
+ acpToken?: string | undefined;
1044
+ };
1045
+ manifest: {
1046
+ systemPrompt?: string | undefined;
1047
+ systemPromptFile?: string | undefined;
1048
+ };
1049
+ acp: {
1050
+ lazyConnect: boolean;
1051
+ maxRetries: number;
1052
+ retryIntervalMs: number;
1053
+ eventTimeoutMs: number;
1054
+ };
1055
+ session: {
1056
+ maxConnections: number;
1057
+ enableCleanup: boolean;
1058
+ idleTimeoutMs: number;
1059
+ cleanupIntervalMs: number;
1060
+ preserveOnEvict: boolean;
1061
+ };
1062
+ mcpServers: {
1063
+ type: "http" | "sse";
1064
+ name: string;
1065
+ url: string;
1066
+ headers: Record<string, string>;
1067
+ }[];
1068
+ apiKey?: string | undefined;
1069
+ } | undefined;
1070
+ openai?: {
1071
+ baseUrl: string;
1072
+ apiKey: string;
1073
+ systemPrompt: string;
1074
+ model: string;
1075
+ maxTokens: number;
1076
+ temperature: number;
1077
+ } | undefined;
1078
+ };
1079
+ middleware: {
1080
+ messageFilter: {
1081
+ skipSelfEcho: boolean;
1082
+ dedup: {
1083
+ windowMs: number;
1084
+ };
1085
+ };
1086
+ contentSanitizer: {
1087
+ stripBotMention: boolean;
1088
+ collapseWhitespace: boolean;
1089
+ };
1090
+ mentionGate: {
1091
+ requireMentionInGroup: boolean;
1092
+ alwaysAnswerC2C: boolean;
1093
+ };
1094
+ rateLimiter: {
1095
+ enabled: boolean;
1096
+ perSender: {
1097
+ windowMs: number;
1098
+ max: number;
1099
+ };
1100
+ global: {
1101
+ windowMs: number;
1102
+ max: number;
1103
+ };
1104
+ };
1105
+ typingIndicator: {
1106
+ keepAliveIntervalMs: number;
1107
+ enabled: boolean;
1108
+ durationSec: number;
1109
+ };
1110
+ slashCommands: {
1111
+ enabled: boolean;
1112
+ prefixes: string[];
1113
+ allowFrom: string[];
1114
+ };
1115
+ concurrency: {
1116
+ strategy: "queue" | "drop" | "abort" | "merge";
1117
+ maxQueue: number;
1118
+ };
1119
+ };
1120
+ streaming: {
1121
+ c2c: boolean;
1122
+ throttleMs: number;
1123
+ };
1124
+ log: {
1125
+ file: {
1126
+ enabled: boolean;
1127
+ dir: string;
1128
+ maxSize: string;
1129
+ maxFiles: number;
1130
+ symlink: boolean;
1131
+ frequency?: "daily" | "hourly" | "weekly" | undefined;
1132
+ dateFormat?: string | undefined;
1133
+ };
1134
+ level: "debug" | "info" | "warn" | "error";
1135
+ console: "json" | "pretty";
1136
+ };
1137
+ mcp: {
1138
+ port: number;
1139
+ enabled: boolean;
1140
+ host: string;
1141
+ pathPrefix: string;
1142
+ };
1143
+ telemetry: {
1144
+ endpoint: string;
1145
+ enabled: boolean;
1146
+ debug: boolean;
1147
+ serviceName: string;
1148
+ protocol: "http" | "grpc";
1149
+ sampleRate: number;
1150
+ exportIntervalMs: number;
1151
+ attributes: Record<string, string>;
1152
+ galileo?: {
1153
+ platform: string;
1154
+ app: string;
1155
+ server: string;
1156
+ namespace: string;
1157
+ envName: string;
1158
+ } | undefined;
1159
+ };
1160
+ openapi?: {
1161
+ timeoutMs: number;
1162
+ apis: {
1163
+ params: {
1164
+ type: "string" | "number" | "boolean" | "string[]" | "number[]";
1165
+ name: string;
1166
+ desc: string;
1167
+ required: boolean;
1168
+ default?: unknown;
1169
+ }[];
1170
+ path: string;
1171
+ name: string;
1172
+ desc: string;
1173
+ method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
1174
+ fixed_body?: Record<string, unknown> | undefined;
1175
+ param_mapping?: Record<string, string> | undefined;
1176
+ }[];
1177
+ } | undefined;
1178
+ }, {
1179
+ qq: {
1180
+ appId?: unknown;
1181
+ appSecret?: unknown;
1182
+ markdown?: boolean | undefined;
1183
+ userAgent?: string | undefined;
1184
+ baseUrl?: string | undefined;
1185
+ tokenBaseUrl?: string | undefined;
1186
+ tokenPrefetch?: "sync" | "async" | undefined;
1187
+ webhook?: {
1188
+ path?: string | undefined;
1189
+ port?: number | undefined;
1190
+ } | undefined;
1191
+ transport?: "websocket" | "webhook" | undefined;
1192
+ };
1193
+ backend: {
1194
+ cloudagent?: {
1195
+ apiKey?: string | undefined;
1196
+ endpoint?: string | undefined;
1197
+ sandbox?: {
1198
+ mode?: "auto" | "manual" | "direct" | undefined;
1199
+ runtimeName?: string | undefined;
1200
+ runtimeId?: string | undefined;
1201
+ acpEndpoint?: string | undefined;
1202
+ acpToken?: string | undefined;
1203
+ } | undefined;
1204
+ manifest?: {
1205
+ systemPrompt?: string | undefined;
1206
+ systemPromptFile?: string | undefined;
1207
+ } | undefined;
1208
+ acp?: {
1209
+ lazyConnect?: boolean | undefined;
1210
+ maxRetries?: number | undefined;
1211
+ retryIntervalMs?: number | undefined;
1212
+ eventTimeoutMs?: number | undefined;
1213
+ } | undefined;
1214
+ session?: {
1215
+ maxConnections?: number | undefined;
1216
+ enableCleanup?: boolean | undefined;
1217
+ idleTimeoutMs?: number | undefined;
1218
+ cleanupIntervalMs?: number | undefined;
1219
+ preserveOnEvict?: boolean | undefined;
1220
+ } | undefined;
1221
+ mcpServers?: {
1222
+ name: string;
1223
+ url: string;
1224
+ type?: "http" | "sse" | undefined;
1225
+ headers?: Record<string, string> | undefined;
1226
+ }[] | undefined;
1227
+ } | undefined;
1228
+ type?: "cloudagent" | "echo" | "openai" | undefined;
1229
+ openai?: {
1230
+ apiKey: string;
1231
+ baseUrl?: string | undefined;
1232
+ systemPrompt?: string | undefined;
1233
+ model?: string | undefined;
1234
+ maxTokens?: number | undefined;
1235
+ temperature?: number | undefined;
1236
+ } | undefined;
1237
+ };
1238
+ message?: {
1239
+ display?: {
1240
+ preset?: "full" | "compact" | "minimal" | "text-only" | undefined;
1241
+ tool?: boolean | undefined;
1242
+ thought?: boolean | undefined;
1243
+ plan?: boolean | undefined;
1244
+ toolEmoji?: boolean | undefined;
1245
+ toolKind?: boolean | undefined;
1246
+ toolTitle?: boolean | undefined;
1247
+ toolDetailMaxLength?: number | undefined;
1248
+ toolDetailTruncate?: string[] | undefined;
1249
+ } | undefined;
1250
+ errorMessages?: {
1251
+ unknown?: string | undefined;
1252
+ rules?: {
1253
+ match: string[];
1254
+ reply: string;
1255
+ hint?: string | undefined;
1256
+ }[] | undefined;
1257
+ emptyReply?: string | undefined;
1258
+ troubleshootHint?: string | undefined;
1259
+ debug?: boolean | undefined;
1260
+ } | undefined;
1261
+ } | undefined;
1262
+ session?: {
1263
+ isolation?: "global" | "per-qualifier" | undefined;
1264
+ persistence?: {
1265
+ type?: "file" | "memory" | undefined;
1266
+ dir?: string | undefined;
1267
+ } | undefined;
1268
+ } | undefined;
1269
+ middleware?: {
1270
+ messageFilter?: {
1271
+ skipSelfEcho?: boolean | undefined;
1272
+ dedup?: {
1273
+ windowMs?: number | undefined;
1274
+ } | undefined;
1275
+ } | undefined;
1276
+ contentSanitizer?: {
1277
+ stripBotMention?: boolean | undefined;
1278
+ collapseWhitespace?: boolean | undefined;
1279
+ } | undefined;
1280
+ mentionGate?: {
1281
+ requireMentionInGroup?: boolean | undefined;
1282
+ alwaysAnswerC2C?: boolean | undefined;
1283
+ } | undefined;
1284
+ rateLimiter?: {
1285
+ enabled?: boolean | undefined;
1286
+ perSender?: {
1287
+ windowMs?: number | undefined;
1288
+ max?: number | undefined;
1289
+ } | undefined;
1290
+ global?: {
1291
+ windowMs?: number | undefined;
1292
+ max?: number | undefined;
1293
+ } | undefined;
1294
+ } | undefined;
1295
+ typingIndicator?: {
1296
+ enabled?: boolean | undefined;
1297
+ durationSec?: number | undefined;
1298
+ keepAliveIntervalMs?: number | undefined;
1299
+ } | undefined;
1300
+ slashCommands?: {
1301
+ enabled?: boolean | undefined;
1302
+ prefixes?: string[] | undefined;
1303
+ allowFrom?: (string | null)[] | undefined;
1304
+ } | undefined;
1305
+ concurrency?: {
1306
+ strategy?: "queue" | "drop" | "abort" | "merge" | undefined;
1307
+ maxQueue?: number | undefined;
1308
+ } | undefined;
1309
+ } | undefined;
1310
+ streaming?: {
1311
+ c2c?: boolean | undefined;
1312
+ throttleMs?: number | undefined;
1313
+ } | undefined;
1314
+ log?: {
1315
+ file?: {
1316
+ enabled?: boolean | undefined;
1317
+ dir?: string | undefined;
1318
+ maxSize?: string | undefined;
1319
+ maxFiles?: number | undefined;
1320
+ frequency?: "daily" | "hourly" | "weekly" | undefined;
1321
+ dateFormat?: string | undefined;
1322
+ symlink?: boolean | undefined;
1323
+ } | undefined;
1324
+ level?: "debug" | "info" | "warn" | "error" | undefined;
1325
+ console?: "json" | "pretty" | undefined;
1326
+ } | undefined;
1327
+ mcp?: {
1328
+ port?: number | undefined;
1329
+ enabled?: boolean | undefined;
1330
+ host?: string | undefined;
1331
+ pathPrefix?: string | undefined;
1332
+ } | undefined;
1333
+ openapi?: {
1334
+ timeoutMs?: number | undefined;
1335
+ apis?: {
1336
+ path: string;
1337
+ name: string;
1338
+ desc: string;
1339
+ params?: {
1340
+ name: string;
1341
+ desc: string;
1342
+ type?: "string" | "number" | "boolean" | "string[]" | "number[]" | undefined;
1343
+ required?: boolean | undefined;
1344
+ default?: unknown;
1345
+ }[] | undefined;
1346
+ method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | undefined;
1347
+ fixed_body?: Record<string, unknown> | undefined;
1348
+ param_mapping?: Record<string, string> | undefined;
1349
+ }[] | undefined;
1350
+ } | undefined;
1351
+ telemetry?: {
1352
+ endpoint?: string | undefined;
1353
+ enabled?: boolean | undefined;
1354
+ debug?: boolean | undefined;
1355
+ serviceName?: string | undefined;
1356
+ protocol?: "http" | "grpc" | undefined;
1357
+ sampleRate?: number | undefined;
1358
+ exportIntervalMs?: number | undefined;
1359
+ attributes?: Record<string, string> | undefined;
1360
+ galileo?: {
1361
+ platform: string;
1362
+ app: string;
1363
+ server: string;
1364
+ namespace?: string | undefined;
1365
+ envName?: string | undefined;
1366
+ } | undefined;
1367
+ } | undefined;
1368
+ }>;
1369
+ type BotConfig = z.infer<typeof botConfigSchema>;
1370
+
1371
+ /**
1372
+ * 统一日志 — 基于 pino 的生产级日志系统
1373
+ *
1374
+ * 特性:
1375
+ * - 异步 I/O(worker thread),不阻塞事件循环
1376
+ * - 支持文件滚动(pino-roll)
1377
+ * - 控制台 pretty / json 双模式
1378
+ * - 敏感信息脱敏(pino redact)
1379
+ * - 直接导出 pino Logger 类型,支持结构化日志
1380
+ */
1381
+
1382
+ type Logger = pino.Logger;
1383
+
1384
+ /**
1385
+ * BotRunner — 核心编排器
1386
+ *
1387
+ * 组合 QQBot SDK + Middleware + ReplyBackend,实现配置驱动的 AI QQ 机器人。
1388
+ * 职责:生命周期管理、中间件装配、配置热更新、消息路由。
1389
+ */
1390
+
1391
+ declare class BotRunner {
1392
+ private bot;
1393
+ private backend;
1394
+ private config;
1395
+ private logger;
1396
+ private mcpHost?;
1397
+ private msgIdCache;
1398
+ /** 写回配置文件的回调,由外部(cli.ts)注入 */
1399
+ private configWriter?;
1400
+ constructor(config: BotConfig, logger: Logger);
1401
+ start(signal?: AbortSignal): Promise<void>;
1402
+ stop(): Promise<void>;
1403
+ /** 注入配置文件写回能力(由 cli.ts 在创建 ConfigWatcher 后调用) */
1404
+ setConfigWriter(writer: (patches: Record<string, unknown>, currentConfig: BotConfig) => void): void;
1405
+ /**
1406
+ * 热更新配置。校验通过后立即生效的字段:
1407
+ * - middleware(mentionGate/rateLimiter/concurrency/typingIndicator 等)
1408
+ * - message.display(展示样式)
1409
+ * - streaming.throttleMs
1410
+ * - log.level
1411
+ * - backend.cloudagent.acp.eventTimeoutMs
1412
+ * - backend.cloudagent.manifest.systemPrompt
1413
+ *
1414
+ * 需要重启才能生效的字段(仅日志提示):
1415
+ * - qq.appId/appSecret/transport
1416
+ * - backend.type
1417
+ * - backend.cloudagent.sandbox
1418
+ */
1419
+ applyConfigUpdate(newConfig: BotConfig): void;
1420
+ /**
1421
+ * 通过斜杠指令部分更新配置。
1422
+ * 同时写回配置文件(如果 configWriter 已注入)。
1423
+ */
1424
+ private applyConfigPatch;
1425
+ private createBackend;
1426
+ private setupMiddleware;
1427
+ private handleMessage;
1428
+ /**
1429
+ * 从 messageScene.ext 中提取外部 sessionid。
1430
+ * 返回 undefined 表示事件中没有指定 sessionid。
1431
+ */
1432
+ private resolveExtSessionId;
1433
+ private formatErrorForUser;
1434
+ }
1435
+
1436
+ /**
1437
+ * 配置文件加载器
1438
+ *
1439
+ * 支持 YAML / JSON 格式,环境变量 ${VAR} 插值。
1440
+ */
1441
+
1442
+ /**
1443
+ * 加载并校验配置文件。
1444
+ */
1445
+ declare function loadConfig(configPath: string): Promise<BotConfig>;
1446
+
1447
+ /**
1448
+ * ConfigWatcher — 监听配置文件变化,自动重新加载。
1449
+ *
1450
+ * 特性:
1451
+ * - fs.watch 监听文件变化,500ms debounce
1452
+ * - Zod 校验通过后才触发 onChange
1453
+ * - 校验失败仅日志报错,保持旧配置
1454
+ * - 支持 stop() 停止监听
1455
+ * - writeBack() 安全地写回配置文件(自动暂停/恢复监听,避免触发循环重载)
1456
+ */
1457
+
1458
+ interface ConfigWatcherOptions {
1459
+ /** 配置文件路径 */
1460
+ configPath: string;
1461
+ /** 当前配置(初始值) */
1462
+ currentConfig: BotConfig;
1463
+ /** 配置变化回调 */
1464
+ onChange: (newConfig: BotConfig, oldConfig: BotConfig) => void;
1465
+ /** Logger */
1466
+ logger: Logger;
1467
+ /** debounce 时间(ms),默认 500 */
1468
+ debounceMs?: number;
1469
+ }
1470
+ declare class ConfigWatcher {
1471
+ private watcher;
1472
+ private debounceTimer;
1473
+ private currentConfig;
1474
+ private readonly opts;
1475
+ private paused;
1476
+ constructor(opts: ConfigWatcherOptions);
1477
+ start(): void;
1478
+ stop(): void;
1479
+ /**
1480
+ * 将指定的键值对写回 YAML 配置文件。
1481
+ *
1482
+ * 使用 yaml `parseDocument` 保留原始注释和格式,
1483
+ * 仅修改目标字段,然后重新序列化写入。
1484
+ *
1485
+ * 写入期间自动暂停文件监听,避免触发循环重载。
1486
+ *
1487
+ * @param patches - 要写入的路径-值映射,路径用点号分隔(如 "message.display.preset")
1488
+ * @param currentConfig - 当前内存中的最新配置,同步到 watcher 防止 reload 回退
1489
+ */
1490
+ writeBack(patches: Record<string, unknown>, currentConfig?: BotConfig): void;
1491
+ private reload;
1492
+ }
1493
+
1494
+ /**
1495
+ * ReplyBackend 接口定义 — 可插拔 AI 后端
1496
+ */
1497
+ interface ReplyBackend {
1498
+ readonly name: string;
1499
+ /** 初始化(启动时调用一次) */
1500
+ init(): Promise<void>;
1501
+ /** 为某个 qualifier 创建/获取 session。extSessionId 为外部指定的会话 ID(用于 load)。 */
1502
+ getOrCreateSession(qualifier: string, extSessionId?: string): Promise<string>;
1503
+ /**
1504
+ * 发送用户消息,获取 AI 回复。
1505
+ * 返回 AsyncIterableIterator 支持流式输出。
1506
+ */
1507
+ chat(params: ChatParams): AsyncIterableIterator<ChatChunk>;
1508
+ /** 取消指定 qualifier 的当前 prompt(可选) */
1509
+ cancel?(qualifier: string): void;
1510
+ /** 优雅关闭 */
1511
+ shutdown(): Promise<void>;
1512
+ }
1513
+ interface ChatParams {
1514
+ sessionId: string;
1515
+ qualifier: string;
1516
+ text: string;
1517
+ attachments?: ResourceAttachment[];
1518
+ }
1519
+ interface ChatChunk {
1520
+ type: "text" | "thought" | "tool" | "plan" | "done";
1521
+ content: string;
1522
+ /** 仅 type=done 时有值 */
1523
+ stopReason?: string;
1524
+ /** 仅 type=tool 时有值:pending / in_progress / completed / failed */
1525
+ status?: string;
1526
+ /** 仅 type=tool 时有值 */
1527
+ toolCallId?: string;
1528
+ /** 仅 type=tool 时有值:search/fetch/execute/read/edit/think/other */
1529
+ kind?: string;
1530
+ /** 仅 type=tool 时有值:工具参数摘要(如文件路径、搜索关键词等) */
1531
+ detail?: string;
1532
+ }
1533
+ interface ResourceAttachment {
1534
+ url: string;
1535
+ mimeType: string;
1536
+ name: string;
1537
+ size?: number;
1538
+ }
1539
+
1540
+ export { type BotConfig, BotRunner, type ChatChunk, type ChatParams, ConfigWatcher, type ReplyBackend, type ResourceAttachment, loadConfig };