@zaofan/dsh-qqbot 0.6.0 → 0.8.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 +17 -0
- package/README_EN.md +17 -0
- package/client/qqbot-settings.js +1385 -28
- package/dist/api/group-admin.d.ts +13 -0
- package/dist/api/group-admin.d.ts.map +1 -1
- package/dist/api/group-admin.js +23 -0
- package/dist/api/group-admin.js.map +1 -1
- package/dist/channel-tools.d.ts.map +1 -1
- package/dist/channel-tools.js +58 -1
- package/dist/channel-tools.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/features/chat-ledger.d.ts.map +1 -1
- package/dist/features/chat-ledger.js +54 -3
- package/dist/features/chat-ledger.js.map +1 -1
- package/dist/features/qq-approval.d.ts +43 -1
- package/dist/features/qq-approval.d.ts.map +1 -1
- package/dist/features/qq-approval.js +167 -17
- package/dist/features/qq-approval.js.map +1 -1
- package/dist/features/qq-user-questions.d.ts +69 -0
- package/dist/features/qq-user-questions.d.ts.map +1 -0
- package/dist/features/qq-user-questions.js +214 -0
- package/dist/features/qq-user-questions.js.map +1 -0
- package/dist/features/session-registry.d.ts +51 -0
- package/dist/features/session-registry.d.ts.map +1 -0
- package/dist/features/session-registry.js +95 -0
- package/dist/features/session-registry.js.map +1 -0
- package/dist/gateway/bootstrap.d.ts.map +1 -1
- package/dist/gateway/bootstrap.js +88 -1
- package/dist/gateway/bootstrap.js.map +1 -1
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +9 -14
- package/dist/session/session-manager.js.map +1 -1
- package/dist/transport/outbound-buffer.d.ts +2 -0
- package/dist/transport/outbound-buffer.d.ts.map +1 -1
- package/dist/transport/outbound-buffer.js.map +1 -1
- package/package.json +6 -3
- package/settings-host.js +962 -5
- package/voice-convert.mjs +45 -0
|
@@ -41,13 +41,29 @@ interface ApprovableMessage {
|
|
|
41
41
|
messageId?: string;
|
|
42
42
|
[key: string]: unknown;
|
|
43
43
|
}
|
|
44
|
+
/** Web 浮层看到的待办条目(去敏: 不含 agent 引用) */
|
|
45
|
+
export interface WebPendingApproval {
|
|
46
|
+
code: string;
|
|
47
|
+
toolName: string;
|
|
48
|
+
reason: string;
|
|
49
|
+
deadlineAt: number;
|
|
50
|
+
/** 发起者描述(群=群名/私聊=昵称, 尽力而为) */
|
|
51
|
+
ownerHint: string;
|
|
52
|
+
}
|
|
44
53
|
export interface ParsedApprovalCommand {
|
|
45
54
|
outcome: 'allowed-once' | 'rejected';
|
|
46
55
|
code: string;
|
|
47
56
|
}
|
|
48
57
|
/** 只解析显式审批命令; 普通聊天消息原样放行给 agent */
|
|
49
58
|
export declare function parseApprovalCommand(content: string): ParsedApprovalCommand | null;
|
|
50
|
-
/**
|
|
59
|
+
/** 构造审批卡片按钮 keyboard(仅主人可点) */
|
|
60
|
+
export declare function approvalKeyboard(code: string): unknown;
|
|
61
|
+
/** 从 keyboard 回调数据解析动作; 非审批按钮返回 null */
|
|
62
|
+
export declare function parseApprovalButton(data: string | undefined): {
|
|
63
|
+
act: 'allow' | 'deny';
|
|
64
|
+
code: string;
|
|
65
|
+
} | null;
|
|
66
|
+
/** QQ 载体的一次性审批 answerer(dsh approval/request → QQ 按钮卡片 → interaction 回调结算) */
|
|
51
67
|
export declare class QqApprovalController {
|
|
52
68
|
private readonly manager;
|
|
53
69
|
private readonly sender;
|
|
@@ -65,8 +81,23 @@ export declare class QqApprovalController {
|
|
|
65
81
|
* @returns true = 消息已被审批逻辑消费(调用方不要再派发给 agent)
|
|
66
82
|
*/
|
|
67
83
|
handleInbound(msg: ApprovableMessage, replyTarget: ReplyTarget): Promise<boolean>;
|
|
84
|
+
/**
|
|
85
|
+
* 按钮回调结算(bot.on('interaction') 转发过来; type=11 消息按钮)。
|
|
86
|
+
* 命中审批按钮 → 校验发起者本人 → settle + 回执。
|
|
87
|
+
* @returns true = 已被审批消费(调用方无需其它处理)
|
|
88
|
+
*/
|
|
89
|
+
handleInteraction(event: unknown, replyTarget: ReplyTarget): Promise<boolean>;
|
|
90
|
+
/** settle + 留痕注入 + QQ 回执(按钮与文本两条路共用) */
|
|
91
|
+
private settleWithReceipt;
|
|
68
92
|
/** 结算: 清定时器/中止监听/pending 项并 resolve */
|
|
69
93
|
private settle;
|
|
94
|
+
/** Web 浮层拉取待办列表(去敏) */
|
|
95
|
+
listPendingForWeb(): WebPendingApproval[];
|
|
96
|
+
/** Web 浮层点按钮: 按 code 结算(与 QQ 按钮/文本码共用 pending, 先到先得) */
|
|
97
|
+
decideByWeb(code: string, act: 'allow' | 'deny'): {
|
|
98
|
+
ok: boolean;
|
|
99
|
+
msg: string;
|
|
100
|
+
};
|
|
70
101
|
dispose(): void;
|
|
71
102
|
}
|
|
72
103
|
type ApprovalDispatch = (req: ApprovalRequestLike, next: () => Promise<ApprovalOutcome>) => Promise<ApprovalOutcome>;
|
|
@@ -74,5 +105,16 @@ type ApprovalDispatch = (req: ApprovalRequestLike, next: () => Promise<ApprovalO
|
|
|
74
105
|
export declare function setApprovalDispatch(fn: ApprovalDispatch | undefined): void;
|
|
75
106
|
/** 生成挂在插件 apply ctx 的审批监听(ACP 模式): 非本 bot agent / 未启用 → next() 快速放行 */
|
|
76
107
|
export declare function makeApprovalListener(): (req: unknown, next: () => Promise<string>) => Promise<string>;
|
|
108
|
+
export declare function registerApprovalController(ns: string, c: QqApprovalController | undefined): void;
|
|
109
|
+
/** 汇总所有实例的待办(web 浮层拉取) */
|
|
110
|
+
export declare function listAllPendingWeb(): Array<WebPendingApproval & {
|
|
111
|
+
ns: string;
|
|
112
|
+
}>;
|
|
113
|
+
/** 跨实例结算: 返回 {ok, ns?, msg} */
|
|
114
|
+
export declare function decideByWebAny(code: string, act: 'allow' | 'deny'): {
|
|
115
|
+
ok: boolean;
|
|
116
|
+
ns?: string;
|
|
117
|
+
msg: string;
|
|
118
|
+
};
|
|
77
119
|
export {};
|
|
78
120
|
//# sourceMappingURL=qq-approval.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qq-approval.d.ts","sourceRoot":"","sources":["../../src/features/qq-approval.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAEjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,UAAU,GAAG,WAAW,GAAG,aAAa,CAAC;AAExF,mDAAmD;AACnD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,mDAAmD;AACnD,UAAU,iBAAiB;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;
|
|
1
|
+
{"version":3,"file":"qq-approval.d.ts","sourceRoot":"","sources":["../../src/features/qq-approval.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,40 @@ export function parseApprovalCommand(content) {
|
|
|
12
12
|
code: match[2].toUpperCase(),
|
|
13
13
|
};
|
|
14
14
|
}
|
|
15
|
-
/**
|
|
15
|
+
/** 面板/卡片按钮动作负载: {v:'approval', code, act:'allow'|'deny'} */
|
|
16
|
+
const BTN_PREFIX = 'ap:';
|
|
17
|
+
/** 构造审批卡片按钮 keyboard(仅主人可点) */
|
|
18
|
+
export function approvalKeyboard(code) {
|
|
19
|
+
const btn = (label, act, style) => ({
|
|
20
|
+
id: `${BTN_PREFIX}${act}:${code}`,
|
|
21
|
+
render_data: { label, visited_label: label + ' ✓', style },
|
|
22
|
+
action: {
|
|
23
|
+
type: 1,
|
|
24
|
+
permission: { type: 0 }, // 0=指定用户可操作; 具体主人 id 在发送端按 record 注入(见 request)
|
|
25
|
+
data: `${BTN_PREFIX}${act}:${code}`,
|
|
26
|
+
unsupport_tips: '请回复 /approve 或 /deny + 验证码',
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
return {
|
|
30
|
+
content: {
|
|
31
|
+
rows: [
|
|
32
|
+
{ buttons: [btn('✅ 允许本次', 'allow', 1)] },
|
|
33
|
+
{ buttons: [btn('❌ 拒绝', 'deny', 0)] },
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** 从 keyboard 回调数据解析动作; 非审批按钮返回 null */
|
|
39
|
+
export function parseApprovalButton(data) {
|
|
40
|
+
if (!data || !data.startsWith(BTN_PREFIX))
|
|
41
|
+
return null;
|
|
42
|
+
const rest = data.slice(BTN_PREFIX.length);
|
|
43
|
+
const m = /^(allow|deny):([A-Z0-9]{6})$/.exec(rest);
|
|
44
|
+
if (!m)
|
|
45
|
+
return null;
|
|
46
|
+
return { act: m[1], code: m[2].toUpperCase() };
|
|
47
|
+
}
|
|
48
|
+
/** QQ 载体的一次性审批 answerer(dsh approval/request → QQ 按钮卡片 → interaction 回调结算) */
|
|
16
49
|
export class QqApprovalController {
|
|
17
50
|
manager;
|
|
18
51
|
sender;
|
|
@@ -35,6 +68,9 @@ export class QqApprovalController {
|
|
|
35
68
|
if (req.signal?.aborted)
|
|
36
69
|
return 'cancelled';
|
|
37
70
|
const timeoutMs = Math.max(1000, this.timeoutMsProvider() || 120000);
|
|
71
|
+
const reason = String(req.reason ?? '').replace(/[\r\n]+/g, ' ').slice(0, 200);
|
|
72
|
+
const tool = String(req.toolName ?? req.callId ?? '未知工具');
|
|
73
|
+
const deadlineAt = Date.now() + timeoutMs;
|
|
38
74
|
// 一次性 6 位大写码(与 parseApprovalCommand 正则一致)
|
|
39
75
|
let code = '';
|
|
40
76
|
do {
|
|
@@ -42,32 +78,62 @@ export class QqApprovalController {
|
|
|
42
78
|
} while (this.pending.has(code));
|
|
43
79
|
const outcome = new Promise((resolve) => {
|
|
44
80
|
const timer = setTimeout(() => this.settle(code, 'rejected'), timeoutMs);
|
|
45
|
-
const pending = {
|
|
81
|
+
const pending = {
|
|
82
|
+
record, toolName: tool, reason, deadlineAt, resolve, timer, signal: req.signal,
|
|
83
|
+
};
|
|
46
84
|
if (req.signal) {
|
|
47
85
|
pending.onAbort = () => this.settle(code, 'cancelled');
|
|
48
86
|
req.signal.addEventListener('abort', pending.onAbort, { once: true });
|
|
49
87
|
}
|
|
50
88
|
this.pending.set(code, pending);
|
|
51
89
|
});
|
|
52
|
-
const reason = String(req.reason ?? '').replace(/[\r\n]+/g, ' ').slice(0, 200);
|
|
53
|
-
const tool = String(req.toolName ?? req.callId ?? '未知工具');
|
|
54
90
|
const seconds = Math.ceil(timeoutMs / 1000);
|
|
55
91
|
const prompt = [
|
|
56
92
|
'⚠️ **DSH 权限申请**',
|
|
57
93
|
`工具:${tool}`,
|
|
58
94
|
reason ? `原因:${reason}` : '',
|
|
59
95
|
'',
|
|
60
|
-
`允许本次操作:\`/approve ${code}\``,
|
|
61
|
-
`拒绝本次操作:\`/deny ${code}\``,
|
|
62
96
|
`仅本次有效,${seconds} 秒后自动拒绝。`,
|
|
97
|
+
'(按钮不可用时请回复 `/approve|/deny + 验证码`)',
|
|
63
98
|
].filter(Boolean).join('\n');
|
|
64
99
|
try {
|
|
65
|
-
|
|
66
|
-
|
|
100
|
+
// ① 按钮卡片优先: 按钮仅发起者本人可点(permission.specify_user_ids = 发起者 openid)
|
|
101
|
+
const kb = approvalKeyboard(code);
|
|
102
|
+
const ownerIds = record.scope === 'group' ? [record.senderId] : [];
|
|
103
|
+
const kbRows = kb;
|
|
104
|
+
for (const row of kbRows.content.rows) {
|
|
105
|
+
for (const b of row.buttons) {
|
|
106
|
+
if (ownerIds.length > 0)
|
|
107
|
+
b.action.permission.specify_user_ids = ownerIds;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const sent = await this.sender.sendMarkdownWithKeyboard(record.replyTarget, prompt, kb);
|
|
111
|
+
if (sent !== undefined || ownerIds.length > 0) {
|
|
112
|
+
// 有 keyboard 支持或明确成功 → 按钮模式
|
|
113
|
+
this.logger.info(`QQ approval requested (button): code=${code} tool=${tool}`);
|
|
114
|
+
}
|
|
67
115
|
}
|
|
68
116
|
catch (err) {
|
|
69
|
-
|
|
70
|
-
this.
|
|
117
|
+
// ② 按钮不可用(未开通/被拒) → 降级纯文本码
|
|
118
|
+
this.logger.warn(`QQ approval button failed, fallback text: ${err instanceof Error ? err.message : String(err)}`);
|
|
119
|
+
try {
|
|
120
|
+
const textPrompt = [
|
|
121
|
+
'⚠️ **DSH 权限申请**',
|
|
122
|
+
`工具:${tool}`,
|
|
123
|
+
reason ? `原因:${reason}` : '',
|
|
124
|
+
'',
|
|
125
|
+
`允许本次操作:\`/approve ${code}\``,
|
|
126
|
+
`拒绝本次操作:\`/deny ${code}\``,
|
|
127
|
+
`仅本次有效,${seconds} 秒后自动拒绝。`,
|
|
128
|
+
].filter(Boolean).join('\n');
|
|
129
|
+
await this.sender.sendMarkdown(record.replyTarget, textPrompt);
|
|
130
|
+
}
|
|
131
|
+
catch (err2) {
|
|
132
|
+
// QQ 通道不可用(限频/网络)≠ 审批结束: 保留 pending 供 Web 浮层兜底处理,
|
|
133
|
+
// 不要 settle 删除 —— 否则 QQ 没送达时 web 也看不到(双通道同时失效)。
|
|
134
|
+
this.logger.error(`QQ approval prompt failed: ${err2 instanceof Error ? err2.message : String(err2)} (code=${code}, web 浮层可兜底)`);
|
|
135
|
+
return outcome;
|
|
136
|
+
}
|
|
71
137
|
}
|
|
72
138
|
return outcome;
|
|
73
139
|
}
|
|
@@ -100,15 +166,50 @@ export class QqApprovalController {
|
|
|
100
166
|
catch { /* ignore */ }
|
|
101
167
|
return true;
|
|
102
168
|
}
|
|
103
|
-
this.
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
169
|
+
this.settleWithReceipt(command.code, command.outcome, pending, replyTarget);
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* 按钮回调结算(bot.on('interaction') 转发过来; type=11 消息按钮)。
|
|
174
|
+
* 命中审批按钮 → 校验发起者本人 → settle + 回执。
|
|
175
|
+
* @returns true = 已被审批消费(调用方无需其它处理)
|
|
176
|
+
*/
|
|
177
|
+
async handleInteraction(event, replyTarget) {
|
|
178
|
+
const e = event;
|
|
179
|
+
if (e?.data?.type !== 11)
|
|
180
|
+
return false;
|
|
181
|
+
const parsed = parseApprovalButton(e.data.resolved?.button_data);
|
|
182
|
+
if (!parsed)
|
|
183
|
+
return false;
|
|
184
|
+
const pending = this.pending.get(parsed.code);
|
|
185
|
+
if (!pending) {
|
|
186
|
+
try {
|
|
187
|
+
await this.sender.sendMarkdown(replyTarget, '该权限申请不存在或已过期。');
|
|
188
|
+
}
|
|
189
|
+
catch { /* ignore */ }
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
// 校验发起者本人: c2c 看 user_openid; group 看 group_member_openid
|
|
193
|
+
const presserId = e.group_member_openid ?? e.user_openid ?? '';
|
|
194
|
+
if (!presserId || presserId !== pending.record.senderId) {
|
|
195
|
+
try {
|
|
196
|
+
await this.sender.sendMarkdown(replyTarget, '你无权处理这项权限申请。');
|
|
197
|
+
}
|
|
198
|
+
catch { /* ignore */ }
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
this.settleWithReceipt(parsed.code, parsed.act === 'allow' ? 'allowed-once' : 'rejected', pending, replyTarget);
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
/** settle + 留痕注入 + QQ 回执(按钮与文本两条路共用) */
|
|
205
|
+
settleWithReceipt(code, outcome, pending, replyTarget) {
|
|
206
|
+
this.settle(code, outcome);
|
|
207
|
+
// 留痕(不打扰, 正经注入): agent.inject 注入 plugin/notice —— 不唤醒、排队下个 step
|
|
107
208
|
const toolName = pending.toolName || '';
|
|
108
209
|
try {
|
|
109
210
|
const agent = pending.record.agent;
|
|
110
211
|
if (agent && typeof agent.inject === 'function') {
|
|
111
|
-
const allowed =
|
|
212
|
+
const allowed = outcome === 'allowed-once';
|
|
112
213
|
agent.inject(createUserMessage({
|
|
113
214
|
content: [{
|
|
114
215
|
type: 'text',
|
|
@@ -123,10 +224,9 @@ export class QqApprovalController {
|
|
|
123
224
|
}
|
|
124
225
|
catch { /* 注入失败不影响裁决 */ }
|
|
125
226
|
try {
|
|
126
|
-
|
|
227
|
+
void this.sender.sendMarkdown(replyTarget, outcome === 'allowed-once' ? '✅ 已允许本次操作。' : '❌ 已拒绝本次操作。');
|
|
127
228
|
}
|
|
128
229
|
catch { /* ignore */ }
|
|
129
|
-
return true;
|
|
130
230
|
}
|
|
131
231
|
/** 结算: 清定时器/中止监听/pending 项并 resolve */
|
|
132
232
|
settle(code, outcome) {
|
|
@@ -143,6 +243,30 @@ export class QqApprovalController {
|
|
|
143
243
|
}
|
|
144
244
|
pending.resolve(outcome);
|
|
145
245
|
}
|
|
246
|
+
/** Web 浮层拉取待办列表(去敏) */
|
|
247
|
+
listPendingForWeb() {
|
|
248
|
+
const out = [];
|
|
249
|
+
for (const [code, p] of this.pending) {
|
|
250
|
+
out.push({
|
|
251
|
+
code,
|
|
252
|
+
toolName: p.toolName ?? '',
|
|
253
|
+
reason: p.reason ?? '',
|
|
254
|
+
deadlineAt: p.deadlineAt,
|
|
255
|
+
ownerHint: p.record.scope === 'group'
|
|
256
|
+
? `群 ${String(p.record.peerId ?? '').slice(0, 12)}`
|
|
257
|
+
: `私聊 ${String(p.record.senderId ?? '').slice(0, 12)}`,
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
return out.sort((a, b) => a.deadlineAt - b.deadlineAt);
|
|
261
|
+
}
|
|
262
|
+
/** Web 浮层点按钮: 按 code 结算(与 QQ 按钮/文本码共用 pending, 先到先得) */
|
|
263
|
+
decideByWeb(code, act) {
|
|
264
|
+
const pending = this.pending.get(code);
|
|
265
|
+
if (!pending)
|
|
266
|
+
return { ok: false, msg: '该申请不存在或已过期' };
|
|
267
|
+
this.settleWithReceipt(code, act === 'allow' ? 'allowed-once' : 'rejected', pending, pending.record.replyTarget);
|
|
268
|
+
return { ok: true, msg: act === 'allow' ? '已允许本次操作' : '已拒绝本次操作' };
|
|
269
|
+
}
|
|
146
270
|
dispose() {
|
|
147
271
|
for (const code of [...this.pending.keys()])
|
|
148
272
|
this.settle(code, 'cancelled');
|
|
@@ -162,4 +286,30 @@ export function makeApprovalListener() {
|
|
|
162
286
|
return dispatch(req, next);
|
|
163
287
|
});
|
|
164
288
|
}
|
|
289
|
+
// ── 按实例(ns)注册的审批控制器注册表 —— Web 审批浮层(settings-host 同源路由)经此读写 ──
|
|
290
|
+
const approvalControllers = new Map();
|
|
291
|
+
export function registerApprovalController(ns, c) {
|
|
292
|
+
if (c)
|
|
293
|
+
approvalControllers.set(ns, c);
|
|
294
|
+
else
|
|
295
|
+
approvalControllers.delete(ns);
|
|
296
|
+
}
|
|
297
|
+
/** 汇总所有实例的待办(web 浮层拉取) */
|
|
298
|
+
export function listAllPendingWeb() {
|
|
299
|
+
const out = [];
|
|
300
|
+
for (const [ns, c] of approvalControllers) {
|
|
301
|
+
for (const p of c.listPendingForWeb())
|
|
302
|
+
out.push({ ns, ...p });
|
|
303
|
+
}
|
|
304
|
+
return out.sort((a, b) => a.deadlineAt - b.deadlineAt);
|
|
305
|
+
}
|
|
306
|
+
/** 跨实例结算: 返回 {ok, ns?, msg} */
|
|
307
|
+
export function decideByWebAny(code, act) {
|
|
308
|
+
for (const [ns, c] of approvalControllers) {
|
|
309
|
+
const r = c.decideByWeb(code, act);
|
|
310
|
+
if (r.ok)
|
|
311
|
+
return { ok: true, ns, msg: r.msg };
|
|
312
|
+
}
|
|
313
|
+
return { ok: false, msg: '该申请不存在或已过期' };
|
|
314
|
+
}
|
|
165
315
|
//# sourceMappingURL=qq-approval.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qq-approval.js","sourceRoot":"","sources":["../../src/features/qq-approval.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"qq-approval.js","sourceRoot":"","sources":["../../src/features/qq-approval.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* qq-user-questions.ts — QQ 远程提问: 把 AI 的 ask_user_question 变成 QQ 按钮卡片
|
|
3
|
+
*
|
|
4
|
+
* 机制(与 QQ 远程审批同款): 宿主 ctx 上 `user-questions/request` 是 Agent 作用域的
|
|
5
|
+
* waterfall 事件(dsh-user-questions/lib: UserQuestionService.ask → waterfall 派发)。
|
|
6
|
+
* Web UI 答案器在宿主引导期注册(dsh-client-ui-user-questions), 会在浏览器连着且
|
|
7
|
+
* agent 有 GUI 会话时先 claim —— 所以本监听必须 { prepend: true } 抢在它前面。
|
|
8
|
+
*
|
|
9
|
+
* 形状(@deepseek-ai/dsh-user-questions/types):
|
|
10
|
+
* request = { questions: [{ id, question, detail?, header?, options?:[{label,...}], multiSelect? }], agent?, signal? }
|
|
11
|
+
* answer = { answers: [{ id, selected: string[], custom? }] }
|
|
12
|
+
*/
|
|
13
|
+
import type { ReplyTarget } from '@tencent-connect/qqbot-nodejs';
|
|
14
|
+
import type { QQBotSender } from '../transport/outbound-buffer.js';
|
|
15
|
+
import type { SessionManager } from '../session/index.js';
|
|
16
|
+
import type { Logger } from '../types.js';
|
|
17
|
+
/** Web 浮层看到的待办提问(去敏) */
|
|
18
|
+
export interface WebPendingQuestion {
|
|
19
|
+
/** 唯一键 = qid:token(web 结算回传用) */
|
|
20
|
+
key: string;
|
|
21
|
+
question: string;
|
|
22
|
+
header: string;
|
|
23
|
+
detail: string;
|
|
24
|
+
options: Array<{
|
|
25
|
+
label: string;
|
|
26
|
+
}>;
|
|
27
|
+
deadlineAt: number;
|
|
28
|
+
}
|
|
29
|
+
export declare class QqUserQuestionsController {
|
|
30
|
+
private readonly manager;
|
|
31
|
+
private readonly sender;
|
|
32
|
+
private readonly logger;
|
|
33
|
+
private readonly timeoutMsProvider;
|
|
34
|
+
private readonly pending;
|
|
35
|
+
constructor(manager: SessionManager, sender: QQBotSender, logger: Logger, timeoutMsProvider: () => number);
|
|
36
|
+
/**
|
|
37
|
+
* 宿主 user-questions/request 处理器。只 claim"会话可定位 + 第一个问题带选项"的场景;
|
|
38
|
+
* 其余(无会话/无选项/多问题) → next() 交回宿主(Web UI 或原样)。
|
|
39
|
+
*/
|
|
40
|
+
request(req: {
|
|
41
|
+
questions?: Array<Record<string, unknown>>;
|
|
42
|
+
agent?: unknown;
|
|
43
|
+
signal?: AbortSignal;
|
|
44
|
+
}, next: () => Promise<unknown>): Promise<unknown>;
|
|
45
|
+
/** interaction 回调: data = q:<qid>:<token>:<idx> → 按选项 label 组 answer; 仅发起者本人可答 */
|
|
46
|
+
handleInteraction(event: unknown, replyTarget: ReplyTarget): Promise<boolean>;
|
|
47
|
+
/** 结算: timedOut/abort → 空答案(selected:[]); answered → 携带选择 */
|
|
48
|
+
private settle;
|
|
49
|
+
/** Web 浮层拉取待办问题列表 */
|
|
50
|
+
listPendingForWeb(): WebPendingQuestion[];
|
|
51
|
+
/** Web 浮层点选项: key + 选项下标 → 与 QQ 按钮同源结算(先到先得) */
|
|
52
|
+
decideByWeb(key: string, optIdx: number): {
|
|
53
|
+
ok: boolean;
|
|
54
|
+
msg: string;
|
|
55
|
+
};
|
|
56
|
+
dispose(): void;
|
|
57
|
+
}
|
|
58
|
+
export declare function registerQuestionController(ns: string, c: QqUserQuestionsController | undefined): void;
|
|
59
|
+
/** 汇总所有实例的待办提问 */
|
|
60
|
+
export declare function listAllPendingQuestionsWeb(): Array<WebPendingQuestion & {
|
|
61
|
+
ns: string;
|
|
62
|
+
}>;
|
|
63
|
+
/** 跨实例结算提问 */
|
|
64
|
+
export declare function decideQuestionByWebAny(key: string, optIdx: number): {
|
|
65
|
+
ok: boolean;
|
|
66
|
+
ns?: string;
|
|
67
|
+
msg: string;
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=qq-user-questions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qq-user-questions.d.ts","sourceRoot":"","sources":["../../src/features/qq-user-questions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAmB1C,wBAAwB;AACxB,MAAM,WAAW,kBAAkB;IACjC,iCAAiC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;CACpB;AA6BD,qBAAa,yBAAyB;IAIlC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IANpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;gBAGvC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM,EACd,iBAAiB,EAAE,MAAM,MAAM;IAGlD;;;OAGG;IACG,OAAO,CACX,GAAG,EAAE;QAAE,SAAS,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,EAC1F,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAC3B,OAAO,CAAC,OAAO,CAAC;IA8DnB,kFAAkF;IAC5E,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAiCnF,6DAA6D;IAC7D,OAAO,CAAC,MAAM;IAWd,qBAAqB;IACrB,iBAAiB,IAAI,kBAAkB,EAAE;IAezC,gDAAgD;IAChD,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE;IAStE,OAAO,IAAI,IAAI;CAGhB;AAKD,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,yBAAyB,GAAG,SAAS,GAAG,IAAI,CAGrG;AAED,kBAAkB;AAClB,wBAAgB,0BAA0B,IAAI,KAAK,CAAC,kBAAkB,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAMvF;AAED,cAAc;AACd,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAM7G"}
|