@xgjktech/xg_cwork_im 1.11.6 → 1.11.7
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 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -7
- package/dist/index.js.map +1 -1
- package/dist/src/agent-context-types.d.ts +33 -0
- package/dist/src/agent-context-types.d.ts.map +1 -0
- package/dist/src/agent-context-types.js +26 -0
- package/dist/src/agent-context-types.js.map +1 -0
- package/dist/src/apply-sync-mapping.d.ts +17 -0
- package/dist/src/apply-sync-mapping.d.ts.map +1 -0
- package/dist/src/apply-sync-mapping.js +86 -0
- package/dist/src/apply-sync-mapping.js.map +1 -0
- package/dist/src/auth.d.ts +2 -2
- package/dist/src/auth.d.ts.map +1 -1
- package/dist/src/auth.js +18 -12
- package/dist/src/auth.js.map +1 -1
- package/dist/src/build-project-prompt.d.ts +28 -0
- package/dist/src/build-project-prompt.d.ts.map +1 -0
- package/dist/src/build-project-prompt.js +86 -0
- package/dist/src/build-project-prompt.js.map +1 -0
- package/dist/src/channel-config.d.ts +256 -0
- package/dist/src/channel-config.d.ts.map +1 -0
- package/dist/src/channel-config.js +194 -0
- package/dist/src/channel-config.js.map +1 -0
- package/dist/src/channel-log.d.ts +17 -0
- package/dist/src/channel-log.d.ts.map +1 -0
- package/dist/src/channel-log.js +45 -0
- package/dist/src/channel-log.js.map +1 -0
- package/dist/src/channel.d.ts +4 -7
- package/dist/src/channel.d.ts.map +1 -1
- package/dist/src/channel.js +81 -603
- package/dist/src/channel.js.map +1 -1
- package/dist/src/connection.d.ts +45 -9
- package/dist/src/connection.d.ts.map +1 -1
- package/dist/src/connection.js +117 -5
- package/dist/src/connection.js.map +1 -1
- package/dist/src/dispatch-mentioned-reply.d.ts +25 -0
- package/dist/src/dispatch-mentioned-reply.d.ts.map +1 -0
- package/dist/src/dispatch-mentioned-reply.js +346 -0
- package/dist/src/dispatch-mentioned-reply.js.map +1 -0
- package/dist/src/gateway-session-queue.d.ts +26 -0
- package/dist/src/gateway-session-queue.d.ts.map +1 -0
- package/dist/src/gateway-session-queue.js +82 -0
- package/dist/src/gateway-session-queue.js.map +1 -0
- package/dist/src/group-history-tool.d.ts +11 -3
- package/dist/src/group-history-tool.d.ts.map +1 -1
- package/dist/src/group-history-tool.js +14 -10
- package/dist/src/group-history-tool.js.map +1 -1
- package/dist/src/inbound-display.d.ts +25 -0
- package/dist/src/inbound-display.d.ts.map +1 -0
- package/dist/src/inbound-display.js +100 -0
- package/dist/src/inbound-display.js.map +1 -0
- package/dist/src/project-path-normalize.d.ts +16 -0
- package/dist/src/project-path-normalize.d.ts.map +1 -0
- package/dist/src/project-path-normalize.js +75 -0
- package/dist/src/project-path-normalize.js.map +1 -0
- package/dist/src/resolve-inbound-group-prompt.d.ts +18 -0
- package/dist/src/resolve-inbound-group-prompt.d.ts.map +1 -0
- package/dist/src/resolve-inbound-group-prompt.js +38 -0
- package/dist/src/resolve-inbound-group-prompt.js.map +1 -0
- package/dist/src/resource-file.d.ts +17 -8
- package/dist/src/resource-file.d.ts.map +1 -1
- package/dist/src/resource-file.js +60 -21
- package/dist/src/resource-file.js.map +1 -1
- package/dist/src/send-group-message-tool.d.ts +3 -2
- package/dist/src/send-group-message-tool.d.ts.map +1 -1
- package/dist/src/send-group-message-tool.js +5 -4
- package/dist/src/send-group-message-tool.js.map +1 -1
- package/dist/src/send-service.d.ts +5 -1
- package/dist/src/send-service.d.ts.map +1 -1
- package/dist/src/send-service.js +6 -2
- package/dist/src/send-service.js.map +1 -1
- package/dist/src/sync-mapping-types.d.ts +170 -0
- package/dist/src/sync-mapping-types.d.ts.map +1 -0
- package/dist/src/sync-mapping-types.js +41 -0
- package/dist/src/sync-mapping-types.js.map +1 -0
- package/dist/src/sync-service-client.d.ts +27 -0
- package/dist/src/sync-service-client.d.ts.map +1 -0
- package/dist/src/sync-service-client.js +72 -0
- package/dist/src/sync-service-client.js.map +1 -0
- package/dist/src/types.d.ts +22 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ 触发的单轮回复:WebSocket START、OpenClaw dispatchReplyWithBufferedBlockDispatcher、HTTP deliver、END。
|
|
3
|
+
*/
|
|
4
|
+
import { buildTargetReplyMeta } from "./inbound-display.js";
|
|
5
|
+
import { sendReplyDeliverBlock, sendTextMessage } from "./send-service.js";
|
|
6
|
+
/** WS `displayText` 过长封顶(避免网关/客户端溢出) */
|
|
7
|
+
const WS_DISPLAY_TEXT_MAX = 200;
|
|
8
|
+
/** 进度 `summary` 封顶(与网关约定一致) */
|
|
9
|
+
const WS_PROGRESS_SUMMARY_MAX = 200;
|
|
10
|
+
const TOOL_LABEL_ZH = {
|
|
11
|
+
exec: "命令执行",
|
|
12
|
+
read: "读取文件",
|
|
13
|
+
read_file: "读取文件",
|
|
14
|
+
write: "写入文件",
|
|
15
|
+
grep: "内容搜索",
|
|
16
|
+
glob_file_search: "文件搜索",
|
|
17
|
+
memory_search: "记忆检索",
|
|
18
|
+
sessions_list: "会话列表",
|
|
19
|
+
sessions_history: "会话历史",
|
|
20
|
+
xg_cwork_im_get_group_chat_history: "群聊历史",
|
|
21
|
+
};
|
|
22
|
+
function friendlyToolLabel(raw) {
|
|
23
|
+
const k = raw.trim();
|
|
24
|
+
if (!k)
|
|
25
|
+
return "工具";
|
|
26
|
+
return TOOL_LABEL_ZH[k] ?? k;
|
|
27
|
+
}
|
|
28
|
+
function clipWsDisplayText(text, max = WS_DISPLAY_TEXT_MAX) {
|
|
29
|
+
const t = text.trim();
|
|
30
|
+
if (!t)
|
|
31
|
+
return "";
|
|
32
|
+
if (t.length <= max)
|
|
33
|
+
return t;
|
|
34
|
+
return `${t.slice(0, Math.max(0, max - 1))}…`;
|
|
35
|
+
}
|
|
36
|
+
function clipWsProgressSummary(text, max = WS_PROGRESS_SUMMARY_MAX) {
|
|
37
|
+
const t = text.trim().replace(/\r\n/g, "\n").replace(/\n+/g, " ");
|
|
38
|
+
if (!t)
|
|
39
|
+
return "";
|
|
40
|
+
if (t.length <= max)
|
|
41
|
+
return t;
|
|
42
|
+
return `${t.slice(0, Math.max(0, max - 1))}…`;
|
|
43
|
+
}
|
|
44
|
+
function firstStringField(args, keys) {
|
|
45
|
+
for (const k of keys) {
|
|
46
|
+
const v = args[k];
|
|
47
|
+
if (typeof v === "string" && v.trim().length > 0)
|
|
48
|
+
return v.trim();
|
|
49
|
+
}
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
function buildToolStartSummary(toolRaw, args) {
|
|
53
|
+
if (!args || typeof args !== "object")
|
|
54
|
+
return undefined;
|
|
55
|
+
if (toolRaw === "exec") {
|
|
56
|
+
const cmd = typeof args.command === "string" ? args.command.replace(/\s+/g, " ").trim() : "";
|
|
57
|
+
const wdRaw = typeof args.workdir === "string" ? args.workdir.trim() : "";
|
|
58
|
+
const wd = wdRaw ? wdRaw.replace(/\\/g, "/") : "";
|
|
59
|
+
if (!cmd && !wd)
|
|
60
|
+
return undefined;
|
|
61
|
+
const head = cmd ? `run ${cmd}` : "run";
|
|
62
|
+
const line = wd ? `${head} (in ${wd})` : head;
|
|
63
|
+
return clipWsProgressSummary(line);
|
|
64
|
+
}
|
|
65
|
+
if (toolRaw === "read" || toolRaw === "read_file") {
|
|
66
|
+
const path = firstStringField(args, ["target_file", "path", "file_path"]);
|
|
67
|
+
if (path)
|
|
68
|
+
return clipWsProgressSummary(path.replace(/\\/g, "/"));
|
|
69
|
+
}
|
|
70
|
+
if (toolRaw.includes("get_group_chat_history")) {
|
|
71
|
+
const gid = firstStringField(args, ["groupId", "group_id"]);
|
|
72
|
+
const lim = typeof args.limit === "number" ? args.limit : undefined;
|
|
73
|
+
const bits = [];
|
|
74
|
+
if (gid)
|
|
75
|
+
bits.push(`group=${gid}`);
|
|
76
|
+
if (lim != null)
|
|
77
|
+
bits.push(`limit=${lim}`);
|
|
78
|
+
if (bits.length > 0)
|
|
79
|
+
return clipWsProgressSummary(bits.join(", "));
|
|
80
|
+
}
|
|
81
|
+
const hint = firstStringField(args, ["query", "prompt", "url", "command"]) ??
|
|
82
|
+
(typeof args.tool === "string" ? args.tool : undefined);
|
|
83
|
+
if (hint && toolRaw !== "exec")
|
|
84
|
+
return clipWsProgressSummary(hint.replace(/\\/g, "/"));
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
function toolResultOutputSummary(payload) {
|
|
88
|
+
const body = (payload.markdown ?? payload.text ?? "").trim();
|
|
89
|
+
if (!body)
|
|
90
|
+
return undefined;
|
|
91
|
+
return clipWsProgressSummary(body);
|
|
92
|
+
}
|
|
93
|
+
/** 流式 START → dispatch → 必发 END;首包超时走 HTTP 覆盖占位 */
|
|
94
|
+
export async function dispatchMentionedReply(args) {
|
|
95
|
+
const { rt, cfg, config, log, logPrefix, route, inboundCtx, params, currentIdentity, streamClient, agentWorkspaceDir } = args;
|
|
96
|
+
log.info(`${logPrefix} [dispatch] Dispatching to OpenClaw AI, sessionKey=${route.sessionKey}`);
|
|
97
|
+
let isFirstReply = true;
|
|
98
|
+
const dispatchStart = Date.now();
|
|
99
|
+
const { msgId: ackPlaceholderMsgId } = await streamClient.start({
|
|
100
|
+
groupId: params.groupId,
|
|
101
|
+
replyToMsgId: params.msgId,
|
|
102
|
+
});
|
|
103
|
+
const ackRawStr = ackPlaceholderMsgId == null ? "" : typeof ackPlaceholderMsgId === "string" ? ackPlaceholderMsgId : String(ackPlaceholderMsgId);
|
|
104
|
+
const streamMsgId = ackRawStr.trim();
|
|
105
|
+
log.info(`${logPrefix} [stream] START acknowledged placeholder rawLen=${ackRawStr.length} trimmedLen=${streamMsgId.length} ` +
|
|
106
|
+
`summary=${streamMsgId.length === 0 ? "(empty)" : streamMsgId.length <= 28 ? streamMsgId : `${streamMsgId.slice(0, 14)}…${streamMsgId.slice(-8)}(len=${streamMsgId.length})`}`);
|
|
107
|
+
if (!streamMsgId) {
|
|
108
|
+
log.warn(`${logPrefix} [stream] WARNING: START ack msgId empty after trim — HTTP cannot merge streaming placeholder; IM likely shows「AI未响应」plus a separate reply bubble`);
|
|
109
|
+
}
|
|
110
|
+
const replyAnchorId = params.msgId.trim();
|
|
111
|
+
const progressGroupId = params.groupId;
|
|
112
|
+
const toolNameStack = [];
|
|
113
|
+
const notifyStreamProgress = async (event, displayText, summary) => {
|
|
114
|
+
const msg = clipWsDisplayText(displayText);
|
|
115
|
+
const sum = summary?.trim() ? clipWsProgressSummary(summary) : undefined;
|
|
116
|
+
if (!progressGroupId.trim() || !replyAnchorId || !msg)
|
|
117
|
+
return;
|
|
118
|
+
try {
|
|
119
|
+
await streamClient.streamProgress({
|
|
120
|
+
groupId: progressGroupId,
|
|
121
|
+
replyToMsgId: replyAnchorId,
|
|
122
|
+
event,
|
|
123
|
+
displayText: msg,
|
|
124
|
+
...(sum ? { summary: sum } : {}),
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
catch (e) {
|
|
128
|
+
log.warn(`${logPrefix} [stream] ${event} notify failed: ${String(e)}`);
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
let hasFirstReply = false;
|
|
132
|
+
const firstReplyTimeoutMs = config.firstReplyTimeoutMs ?? 30 * 60_000;
|
|
133
|
+
const timeoutLabel = `${logPrefix} [stream] First reply timeout after ${firstReplyTimeoutMs}ms, updating thinking message as error`;
|
|
134
|
+
const firstReplyTimeout = setTimeout(async () => {
|
|
135
|
+
if (hasFirstReply)
|
|
136
|
+
return;
|
|
137
|
+
log.warn(timeoutLabel);
|
|
138
|
+
try {
|
|
139
|
+
const reply = buildTargetReplyMeta(params);
|
|
140
|
+
const timeoutText = "当前请求处理超时,请稍后重试。";
|
|
141
|
+
await sendTextMessage(config, currentIdentity.token, params.groupId, timeoutText, [reply.targetUserId], log, streamMsgId, reply);
|
|
142
|
+
hasFirstReply = true;
|
|
143
|
+
log.info(`${logPrefix} [send] Timeout reply sent via HTTP: groupId=${params.groupId} msgId=${streamMsgId} text="${timeoutText}"`);
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
log.error(`${logPrefix} [timeout] Failed to send timeout reply: ${String(err)}`);
|
|
147
|
+
}
|
|
148
|
+
}, firstReplyTimeoutMs);
|
|
149
|
+
let deliverInvokeCount = 0;
|
|
150
|
+
let deliverCallCount = 0;
|
|
151
|
+
let deliverSkippedCount = 0;
|
|
152
|
+
let dispatchError = undefined;
|
|
153
|
+
let lastDeliverError = undefined;
|
|
154
|
+
try {
|
|
155
|
+
await rt.channel.reply.dispatchReplyWithBufferedBlockDispatcher({
|
|
156
|
+
ctx: inboundCtx,
|
|
157
|
+
cfg,
|
|
158
|
+
replyOptions: {
|
|
159
|
+
sourceReplyDeliveryMode: "automatic",
|
|
160
|
+
suppressDefaultToolProgressMessages: true,
|
|
161
|
+
onToolStart: async (p) => {
|
|
162
|
+
const name = typeof p.name === "string" && p.name.trim().length > 0 ? p.name.trim() : "tool";
|
|
163
|
+
const rawPhase = typeof p.phase === "string" ? p.phase.toLowerCase() : "";
|
|
164
|
+
if (rawPhase === "update" || rawPhase === "delta" || rawPhase === "progress") {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
if (rawPhase === "end" || rawPhase === "fail" || rawPhase === "error") {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
if (!rawPhase || rawPhase === "start") {
|
|
171
|
+
toolNameStack.push(name);
|
|
172
|
+
}
|
|
173
|
+
const label = friendlyToolLabel(name);
|
|
174
|
+
const startSum = buildToolStartSummary(name, p.args);
|
|
175
|
+
await notifyStreamProgress("TOOL_PHASE", `正在调用「${label}」工具…`, startSum);
|
|
176
|
+
},
|
|
177
|
+
onToolResult: async (payload) => {
|
|
178
|
+
const toolName = toolNameStack.length > 0 ? toolNameStack.pop() : "tool";
|
|
179
|
+
const label = friendlyToolLabel(toolName);
|
|
180
|
+
const outSum = toolResultOutputSummary(payload);
|
|
181
|
+
if (payload.isError) {
|
|
182
|
+
await notifyStreamProgress("TOOL_PHASE", `「${label}」工具调用失败`, outSum);
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
await notifyStreamProgress("TOOL_PHASE", `「${label}」工具已完成`, outSum);
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
onPlanUpdate: async (p) => {
|
|
189
|
+
const title = typeof p.title === "string" ? p.title.trim() : "";
|
|
190
|
+
if (title.length > 0) {
|
|
191
|
+
await notifyStreamProgress("PLAN_UPDATE", clipWsDisplayText(`正在更新计划:${title}`, 160), typeof p.explanation === "string" && p.explanation.trim()
|
|
192
|
+
? clipWsProgressSummary(p.explanation.trim())
|
|
193
|
+
: undefined);
|
|
194
|
+
}
|
|
195
|
+
else if (typeof p.explanation === "string" && p.explanation.trim().length > 0) {
|
|
196
|
+
await notifyStreamProgress("PLAN_UPDATE", clipWsDisplayText(`计划更新:${p.explanation.trim()}`, 160));
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
await notifyStreamProgress("PLAN_UPDATE", "正在更新执行计划…");
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
onCompactionStart: async () => {
|
|
203
|
+
await notifyStreamProgress("RUN_EVENT", "正在整理上下文…");
|
|
204
|
+
},
|
|
205
|
+
onCompactionEnd: async () => {
|
|
206
|
+
await notifyStreamProgress("RUN_EVENT", "上下文整理完成");
|
|
207
|
+
},
|
|
208
|
+
onApprovalEvent: async (p) => {
|
|
209
|
+
const raw = typeof p.title === "string" && p.title.trim().length > 0
|
|
210
|
+
? p.title.trim()
|
|
211
|
+
: typeof p.message === "string" && p.message.trim().length > 0
|
|
212
|
+
? p.message.trim()
|
|
213
|
+
: "审批状态更新";
|
|
214
|
+
await notifyStreamProgress("RUN_EVENT", clipWsDisplayText(raw, 160));
|
|
215
|
+
},
|
|
216
|
+
onCommandOutput: async (p) => {
|
|
217
|
+
const ph = typeof p.phase === "string" ? p.phase.toLowerCase() : "";
|
|
218
|
+
if (ph === "delta" || ph === "stream" || ph === "progress")
|
|
219
|
+
return;
|
|
220
|
+
const st = typeof p.status === "string" ? p.status.toLowerCase() : "";
|
|
221
|
+
const terminalPhase = ["completed", "complete", "done", "end", "failed", "fail", "error"].includes(ph);
|
|
222
|
+
const terminalStatus = ["completed", "failed", "error", "done"].includes(st);
|
|
223
|
+
const hasExit = p.exitCode != null;
|
|
224
|
+
if (!terminalPhase && !terminalStatus && !hasExit)
|
|
225
|
+
return;
|
|
226
|
+
const outRaw = typeof p.output === "string" ? p.output.trim() : "";
|
|
227
|
+
const outSum = outRaw ? clipWsProgressSummary(outRaw) : undefined;
|
|
228
|
+
if (ph === "failed" || ph === "fail" || ph === "error" || st === "failed" || st === "error") {
|
|
229
|
+
await notifyStreamProgress("RUN_EVENT", "命令执行失败", outSum);
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
if (hasExit && p.exitCode !== 0) {
|
|
233
|
+
await notifyStreamProgress("RUN_EVENT", `命令已结束(退出码 ${p.exitCode})`, outSum);
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
await notifyStreamProgress("RUN_EVENT", "命令已执行完毕", outSum);
|
|
237
|
+
},
|
|
238
|
+
onPatchSummary: async (_p) => {
|
|
239
|
+
await notifyStreamProgress("RUN_EVENT", "已记录文件变更摘要");
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
dispatcherOptions: {
|
|
243
|
+
responsePrefix: "",
|
|
244
|
+
onSkip: (payload, meta) => {
|
|
245
|
+
deliverSkippedCount++;
|
|
246
|
+
log.info(`${logPrefix} [deliver] Payload skipped by normalizer kind=${meta.kind} reason=${meta.reason}`);
|
|
247
|
+
},
|
|
248
|
+
onError: (err, meta) => {
|
|
249
|
+
lastDeliverError = err;
|
|
250
|
+
log.error(`${logPrefix} [deliver] Dispatcher caught unhandled error kind=${meta.kind}: ${String(err)}`);
|
|
251
|
+
},
|
|
252
|
+
deliver: async (payload) => {
|
|
253
|
+
try {
|
|
254
|
+
deliverInvokeCount++;
|
|
255
|
+
const textPart = (payload.markdown || payload.text || "").trim();
|
|
256
|
+
const hasMedia = Boolean(payload.mediaUrl?.trim()) ||
|
|
257
|
+
Boolean(payload.mediaUrls?.some((u) => typeof u === "string" && u.trim()));
|
|
258
|
+
const textPreview = textPart.length > 120 ? `${textPart.slice(0, 120)}…(len=${textPart.length})` : textPart;
|
|
259
|
+
log.info(`${logPrefix} [deliver] invoke #${deliverInvokeCount} isThinking=${payload.isThinking ?? false} ` +
|
|
260
|
+
`textLen=${textPart.length} hasMedia=${hasMedia} mediaUrl=${Boolean(payload.mediaUrl?.trim())} ` +
|
|
261
|
+
`preview=${JSON.stringify(textPreview || "(empty)")}`);
|
|
262
|
+
if (!textPart && !(hasMedia && !payload.isThinking)) {
|
|
263
|
+
log.info(`${logPrefix} [deliver] Payload has no sendable content, skipping` +
|
|
264
|
+
` (isThinking=${payload.isThinking ?? false} hasMedia=${hasMedia})`);
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
deliverCallCount++;
|
|
268
|
+
if (isFirstReply) {
|
|
269
|
+
const ttfr = Date.now() - dispatchStart;
|
|
270
|
+
log.info(`${logPrefix} [deliver] First response block received from AI (TTFB: ${ttfr}ms)`);
|
|
271
|
+
isFirstReply = false;
|
|
272
|
+
}
|
|
273
|
+
const reply = buildTargetReplyMeta(params);
|
|
274
|
+
const atIds = [reply.targetUserId];
|
|
275
|
+
if (!hasFirstReply) {
|
|
276
|
+
clearTimeout(firstReplyTimeout);
|
|
277
|
+
log.info(`${logPrefix} [deliver] First HTTP will merge streaming placeholder msgId=${streamMsgId.length > 0 ? `yes(len=${streamMsgId.length})` : "NO(empty)"}`);
|
|
278
|
+
await sendReplyDeliverBlock(config, currentIdentity.token, params.groupId, payload, atIds, log, streamMsgId, reply, agentWorkspaceDir);
|
|
279
|
+
hasFirstReply = true;
|
|
280
|
+
const preview = textPart.length > 80 ? `${textPart.slice(0, 80)}...` : textPart || "[media]";
|
|
281
|
+
log.info(`${logPrefix} [send] First reply sent via HTTP: groupId=${params.groupId} msgId=${streamMsgId} preview="${preview}"`);
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
await sendReplyDeliverBlock(config, currentIdentity.token, params.groupId, payload, atIds, log, undefined, reply, agentWorkspaceDir);
|
|
285
|
+
const preview = textPart.length > 80 ? `${textPart.slice(0, 80)}...` : textPart || "[media]";
|
|
286
|
+
log.info(`${logPrefix} [send] Additional reply sent via HTTP: groupId=${params.groupId} preview="${preview}"`);
|
|
287
|
+
}
|
|
288
|
+
catch (err) {
|
|
289
|
+
log.error(`${logPrefix} [deliver] Reply deliver failed: ${String(err)}`);
|
|
290
|
+
throw err;
|
|
291
|
+
}
|
|
292
|
+
},
|
|
293
|
+
},
|
|
294
|
+
});
|
|
295
|
+
log.info(`${logPrefix} [dispatch] Dispatch completed for sessionKey=${route.sessionKey}` +
|
|
296
|
+
` (invoke=${deliverInvokeCount} delivered=${deliverCallCount} skipped=${deliverSkippedCount})`);
|
|
297
|
+
if (deliverInvokeCount === 0) {
|
|
298
|
+
log.warn(`${logPrefix} [dispatch] OpenClaw never invoked channel deliver() for this turn — ` +
|
|
299
|
+
`this plugin will not POST /im/message/send; IM「收到消息」若存在,多半来自占位/END 或其它通道,而非本插件 HTTP 合并`);
|
|
300
|
+
}
|
|
301
|
+
else if (deliverCallCount === 0) {
|
|
302
|
+
log.warn(`${logPrefix} [dispatch] deliver() invoked ${deliverInvokeCount} time(s) but none had sendable text/media — ` +
|
|
303
|
+
`check model output (thinking-only / empty blocks) or OpenClaw normalizer`);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
catch (dispatchErr) {
|
|
307
|
+
dispatchError = dispatchErr;
|
|
308
|
+
log.error(`${logPrefix} [dispatch] Dispatch failed (invoke=${deliverInvokeCount} delivered=${deliverCallCount} skipped=${deliverSkippedCount}): ${String(dispatchErr)}`);
|
|
309
|
+
}
|
|
310
|
+
finally {
|
|
311
|
+
clearTimeout(firstReplyTimeout);
|
|
312
|
+
if (!hasFirstReply) {
|
|
313
|
+
const reportableError = dispatchError ?? lastDeliverError;
|
|
314
|
+
if (reportableError !== undefined) {
|
|
315
|
+
const errSource = dispatchError !== undefined ? "dispatch" : "deliver";
|
|
316
|
+
log.warn(`${logPrefix} [dispatch] ${errSource} error with no prior reply` +
|
|
317
|
+
` (invoke=${deliverInvokeCount} delivered=${deliverCallCount} skipped=${deliverSkippedCount}), sending error notice`);
|
|
318
|
+
const replyMeta = buildTargetReplyMeta(params);
|
|
319
|
+
try {
|
|
320
|
+
await sendTextMessage(config, currentIdentity.token, params.groupId, `当前请求处理时出现异常,请稍后重试。\n错误信息:${String(reportableError)}`, [replyMeta.targetUserId], log, streamMsgId, replyMeta);
|
|
321
|
+
hasFirstReply = true;
|
|
322
|
+
}
|
|
323
|
+
catch (fallbackErr) {
|
|
324
|
+
log.error(`${logPrefix} [dispatch] Failed to send error notice (${errSource} error): ${String(fallbackErr)}`);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
log.warn(`${logPrefix} [dispatch] No reply was sent to user` +
|
|
329
|
+
` (invoke=${deliverInvokeCount} delivered=${deliverCallCount} skipped=${deliverSkippedCount}), ending with reason=no_reply` +
|
|
330
|
+
(deliverInvokeCount === 0 ? " — plugin did not run POST /im/message/send this turn" : ""));
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
const endReason = hasFirstReply ? "stop" : "no_reply";
|
|
334
|
+
try {
|
|
335
|
+
await streamClient.end(streamMsgId, endReason, {
|
|
336
|
+
groupId: params.groupId,
|
|
337
|
+
replyToMsgId: params.msgId,
|
|
338
|
+
});
|
|
339
|
+
log.info(`${logPrefix} [stream] END sent: msgId=${streamMsgId} reason=${endReason}`);
|
|
340
|
+
}
|
|
341
|
+
catch (endErr) {
|
|
342
|
+
log.error(`${logPrefix} [stream] END failed (msgId=${streamMsgId}): ${String(endErr)}`);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=dispatch-mentioned-reply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch-mentioned-reply.js","sourceRoot":"","sources":["../../src/dispatch-mentioned-reply.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 网关内:按 sessionKey 串行派发 + FIFO 排队 + /stop 清队列与租约。
|
|
3
|
+
*/
|
|
4
|
+
import type { OpenClawConfig } from "openclaw/plugin-sdk";
|
|
5
|
+
import type { Logger } from "./channel-log.js";
|
|
6
|
+
import type { ImStreamClient } from "./connection.js";
|
|
7
|
+
import type { BotIdentity, WsMessageParams, XgImConfig } from "./types.js";
|
|
8
|
+
export interface PendingDispatch {
|
|
9
|
+
route: {
|
|
10
|
+
sessionKey: string;
|
|
11
|
+
};
|
|
12
|
+
inboundCtx: unknown;
|
|
13
|
+
params: WsMessageParams;
|
|
14
|
+
currentIdentity: BotIdentity;
|
|
15
|
+
agentWorkspaceDir?: string;
|
|
16
|
+
/** /stop:立即交给 OpenClaw;并作废当前会话占用、清空排队 */
|
|
17
|
+
skipSessionQueue?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare function createRunWithSessionQueue(options: {
|
|
20
|
+
config: XgImConfig;
|
|
21
|
+
log: Logger;
|
|
22
|
+
logPrefix: string;
|
|
23
|
+
rt: any;
|
|
24
|
+
cfg: OpenClawConfig;
|
|
25
|
+
}): (sessionKey: string, pending: PendingDispatch, streamClient: ImStreamClient) => Promise<void>;
|
|
26
|
+
//# sourceMappingURL=gateway-session-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-session-queue.d.ts","sourceRoot":"","sources":["../../src/gateway-session-queue.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGtD,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE3E,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,eAAe,CAAC;IACxB,eAAe,EAAE,WAAW,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,yCAAyC;IACzC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IAC/C,MAAM,EAAE,UAAU,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,GAAG,CAAC;IACR,GAAG,EAAE,cAAc,CAAC;CACvB,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAyGhG"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 网关内:按 sessionKey 串行派发 + FIFO 排队 + /stop 清队列与租约。
|
|
3
|
+
*/
|
|
4
|
+
import { dispatchMentionedReply } from "./dispatch-mentioned-reply.js";
|
|
5
|
+
import { sendTextMessage } from "./send-service.js";
|
|
6
|
+
export function createRunWithSessionQueue(options) {
|
|
7
|
+
const { config, log, logPrefix, rt, cfg } = options;
|
|
8
|
+
const sessionBusyLease = new Map();
|
|
9
|
+
const sessionQueues = new Map();
|
|
10
|
+
const maxPendingMsgs = config.maxPendingMessages ?? 5;
|
|
11
|
+
const runWithSessionQueue = async (sessionKey, pending, streamClient) => {
|
|
12
|
+
if (!pending.skipSessionQueue && sessionBusyLease.has(sessionKey)) {
|
|
13
|
+
const queue = sessionQueues.get(sessionKey) ?? [];
|
|
14
|
+
if (maxPendingMsgs === 0 || queue.length >= maxPendingMsgs) {
|
|
15
|
+
const reason = maxPendingMsgs === 0
|
|
16
|
+
? "当前不支持任务排队,请等待处理完成后再发送。"
|
|
17
|
+
: `当前任务队列已满(最多 ${maxPendingMsgs} 条),请等待处理完成后再重新发送。`;
|
|
18
|
+
log.warn(`${logPrefix} [queue] Session ${sessionKey} busy & queue full/disabled (max=${maxPendingMsgs}), dropping`);
|
|
19
|
+
sendTextMessage(config, pending.currentIdentity.token, pending.params.groupId, reason, [pending.params.userInfo?.id ?? ""], log).catch((notifyErr) => {
|
|
20
|
+
log.error(`${logPrefix} [queue] Failed to send queue-full notice: ${String(notifyErr)}`);
|
|
21
|
+
});
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const queuePos = queue.length + 1;
|
|
25
|
+
queue.push(pending);
|
|
26
|
+
sessionQueues.set(sessionKey, queue);
|
|
27
|
+
log.info(`${logPrefix} [queue] Session ${sessionKey} busy, queued message (pos=${queuePos})`);
|
|
28
|
+
sendTextMessage(config, pending.currentIdentity.token, pending.params.groupId, `收到,当前正在处理其他任务,您的消息已排队(队列第 ${queuePos} 位),处理完成后将自动回复。`, [pending.params.userInfo?.id ?? ""], log).catch((notifyErr) => {
|
|
29
|
+
log.warn(`${logPrefix} [queue] Failed to send queue notification: ${String(notifyErr)}`);
|
|
30
|
+
});
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (pending.skipSessionQueue) {
|
|
34
|
+
const hadLease = sessionBusyLease.has(sessionKey);
|
|
35
|
+
if (hadLease) {
|
|
36
|
+
sessionBusyLease.delete(sessionKey);
|
|
37
|
+
const dropped = sessionQueues.get(sessionKey)?.length ?? 0;
|
|
38
|
+
sessionQueues.delete(sessionKey);
|
|
39
|
+
log.info(`${logPrefix} [queue] /stop: invalidated busy lease, cleared fifo (droppedQueued=${dropped})`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
let myLease;
|
|
43
|
+
if (!pending.skipSessionQueue) {
|
|
44
|
+
myLease = Symbol("xg_cwork_im-session-busy");
|
|
45
|
+
sessionBusyLease.set(sessionKey, myLease);
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
await dispatchMentionedReply({
|
|
49
|
+
rt,
|
|
50
|
+
cfg,
|
|
51
|
+
config,
|
|
52
|
+
log,
|
|
53
|
+
logPrefix,
|
|
54
|
+
route: pending.route,
|
|
55
|
+
inboundCtx: pending.inboundCtx,
|
|
56
|
+
params: pending.params,
|
|
57
|
+
currentIdentity: pending.currentIdentity,
|
|
58
|
+
streamClient,
|
|
59
|
+
agentWorkspaceDir: pending.agentWorkspaceDir,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
if (!pending.skipSessionQueue && myLease !== undefined) {
|
|
64
|
+
if (sessionBusyLease.get(sessionKey) === myLease) {
|
|
65
|
+
sessionBusyLease.delete(sessionKey);
|
|
66
|
+
const queue = sessionQueues.get(sessionKey);
|
|
67
|
+
if (queue && queue.length > 0) {
|
|
68
|
+
const next = queue.shift();
|
|
69
|
+
if (queue.length === 0)
|
|
70
|
+
sessionQueues.delete(sessionKey);
|
|
71
|
+
log.info(`${logPrefix} [queue] Dispatching next queued message for session ${sessionKey} (remaining=${queue.length})`);
|
|
72
|
+
runWithSessionQueue(sessionKey, next, streamClient).catch((err) => {
|
|
73
|
+
log.error(`${logPrefix} [queue] Error processing queued dispatch: ${String(err)}`);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
return runWithSessionQueue;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=gateway-session-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-session-queue.js","sourceRoot":"","sources":["../../src/gateway-session-queue.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAapD,MAAM,UAAU,yBAAyB,CAAC,OAMzC;IACG,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IACpD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACnD,MAAM,aAAa,GAAG,IAAI,GAAG,EAA6B,CAAC;IAC3D,MAAM,cAAc,GAAW,MAAM,CAAC,kBAAkB,IAAI,CAAC,CAAC;IAE9D,MAAM,mBAAmB,GAAG,KAAK,EAC7B,UAAkB,EAClB,OAAwB,EACxB,YAA4B,EACf,EAAE;QACf,IAAI,CAAC,OAAO,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAChE,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YAElD,IAAI,cAAc,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,cAAc,EAAE,CAAC;gBACzD,MAAM,MAAM,GACR,cAAc,KAAK,CAAC;oBAChB,CAAC,CAAC,wBAAwB;oBAC1B,CAAC,CAAC,eAAe,cAAc,oBAAoB,CAAC;gBAC5D,GAAG,CAAC,IAAI,CACJ,GAAG,SAAS,oBAAoB,UAAU,oCAAoC,cAAc,aAAa,CAC5G,CAAC;gBACF,eAAe,CACX,MAAM,EACN,OAAO,CAAC,eAAe,CAAC,KAAK,EAC7B,OAAO,CAAC,MAAM,CAAC,OAAO,EACtB,MAAM,EACN,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAa,EAC/C,GAAG,CACN,CAAC,KAAK,CAAC,CAAC,SAAkB,EAAE,EAAE;oBAC3B,GAAG,CAAC,KAAK,CAAC,GAAG,SAAS,8CAA8C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBAC7F,CAAC,CAAC,CAAC;gBACH,OAAO;YACX,CAAC;YAED,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpB,aAAa,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAErC,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,oBAAoB,UAAU,8BAA8B,QAAQ,GAAG,CAAC,CAAC;YAC9F,eAAe,CACX,MAAM,EACN,OAAO,CAAC,eAAe,CAAC,KAAK,EAC7B,OAAO,CAAC,MAAM,CAAC,OAAO,EACtB,6BAA6B,QAAQ,iBAAiB,EACtD,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAa,EAC/C,GAAG,CACN,CAAC,KAAK,CAAC,CAAC,SAAkB,EAAE,EAAE;gBAC3B,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,+CAA+C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAC7F,CAAC,CAAC,CAAC;YACH,OAAO;QACX,CAAC;QAED,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAClD,IAAI,QAAQ,EAAE,CAAC;gBACX,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBACpC,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;gBAC3D,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBACjC,GAAG,CAAC,IAAI,CACJ,GAAG,SAAS,uEAAuE,OAAO,GAAG,CAChG,CAAC;YACN,CAAC;QACL,CAAC;QAED,IAAI,OAA2B,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAC5B,OAAO,GAAG,MAAM,CAAC,0BAA0B,CAAC,CAAC;YAC7C,gBAAgB,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC;YACD,MAAM,sBAAsB,CAAC;gBACzB,EAAE;gBACF,GAAG;gBACH,MAAM;gBACN,GAAG;gBACH,SAAS;gBACT,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,YAAY;gBACZ,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;aAC/C,CAAC,CAAC;QACP,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,OAAO,CAAC,gBAAgB,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBACrD,IAAI,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,OAAO,EAAE,CAAC;oBAC/C,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;oBACpC,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;oBAC5C,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;wBAC5B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;4BAAE,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;wBACzD,GAAG,CAAC,IAAI,CACJ,GAAG,SAAS,wDAAwD,UAAU,eAAe,KAAK,CAAC,MAAM,GAAG,CAC/G,CAAC;wBACF,mBAAmB,CAAC,UAAU,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;4BACvE,GAAG,CAAC,KAAK,CAAC,GAAG,SAAS,8CAA8C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBACvF,CAAC,CAAC,CAAC;oBACP,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,mBAAmB,CAAC;AAC/B,CAAC"}
|
|
@@ -6,6 +6,13 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import type { AnyAgentTool } from "openclaw/plugin-sdk";
|
|
8
8
|
import type { XgImConfig } from "./types.js";
|
|
9
|
+
/** 由 OpenClaw 在每回合注入的信任上下文节选(工厂模式下传入 execute 闭包) */
|
|
10
|
+
export type XgImToolSessionHints = {
|
|
11
|
+
/** 对应 channels.xg_cwork_im.accounts 的 key */
|
|
12
|
+
channelAccountId?: string;
|
|
13
|
+
/** 当前 IM 发消息用户 userId */
|
|
14
|
+
requesterSenderId?: string;
|
|
15
|
+
};
|
|
9
16
|
/** 从 OpenClaw 配置中提取 xg_cwork_im 顶层配置(保留 accounts 以便多账户路由) */
|
|
10
17
|
export declare function extractXgCworkImConfig(cfg: unknown): XgImConfig | null;
|
|
11
18
|
/**
|
|
@@ -16,8 +23,9 @@ export declare function extractXgCworkImConfig(cfg: unknown): XgImConfig | null;
|
|
|
16
23
|
*/
|
|
17
24
|
export declare function resolveAccountConfig(base: XgImConfig, accountId?: string | null): XgImConfig;
|
|
18
25
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
26
|
+
* 构建群聊历史工具对象。
|
|
27
|
+
* 应通过 `api.registerTool((ctx) => buildGroupHistoryTool(...))` 工厂注册,以便每回合合并
|
|
28
|
+
* `runtimeConfig` 与 `agentAccountId` / `requesterSenderId`(静态 `(_ctx) => tool` 会丢弃上述上下文)。
|
|
21
29
|
*/
|
|
22
|
-
export declare function buildGroupHistoryTool(config: XgImConfig): AnyAgentTool;
|
|
30
|
+
export declare function buildGroupHistoryTool(config: XgImConfig, hints?: XgImToolSessionHints): AnyAgentTool;
|
|
23
31
|
//# sourceMappingURL=group-history-tool.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group-history-tool.d.ts","sourceRoot":"","sources":["../../src/group-history-tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"group-history-tool.d.ts","sourceRoot":"","sources":["../../src/group-history-tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIxD,OAAO,KAAK,EAAgC,UAAU,EAAE,MAAM,YAAY,CAAC;AAE3E,oDAAoD;AACpD,MAAM,MAAM,oBAAoB,GAAG;IAC/B,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yBAAyB;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAgCF,6DAA6D;AAC7D,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CAItE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,UAAU,CAgB5F;AAuCD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,oBAAoB,GAAG,YAAY,CA4FpG"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import axios from "axios";
|
|
8
8
|
import { Type } from "@sinclair/typebox";
|
|
9
|
+
import { normalizeRobotKey } from "./channel-config.js";
|
|
9
10
|
import { toolJsonResult } from "./tool-json-result.js";
|
|
10
11
|
import { getToken } from "./auth.js";
|
|
11
12
|
// ─── 工具参数 Schema ─────────────────────────────────────────────────────────
|
|
@@ -14,10 +15,10 @@ const GroupHistoryParams = Type.Object({
|
|
|
14
15
|
description: "群聊 ID,即当前消息来自的群组唯一标识符",
|
|
15
16
|
}),
|
|
16
17
|
userId: Type.Optional(Type.String({
|
|
17
|
-
description: "(可选)以哪个用户身份拉取历史消息的 userId
|
|
18
|
+
description: "(可选)以哪个用户身份拉取历史消息的 userId;若省略则使用当前会话的发送者 ID(由网关从入站上下文注入)。",
|
|
18
19
|
})),
|
|
19
20
|
accountId: Type.Optional(Type.String({
|
|
20
|
-
description: "(可选)要使用的 xg_cwork_im 账户 ID(即 accounts 的 key
|
|
21
|
+
description: "(可选)要使用的 xg_cwork_im 账户 ID(即 accounts 的 key);若省略则使用当前 IM 通道绑定的账户(由网关注入)。",
|
|
21
22
|
})),
|
|
22
23
|
limit: Type.Optional(Type.Number({
|
|
23
24
|
description: "需要获取的消息条数(5~30),默认 10",
|
|
@@ -32,7 +33,7 @@ export function extractXgCworkImConfig(cfg) {
|
|
|
32
33
|
const raw = cfg?.channels?.xg_cwork_im;
|
|
33
34
|
if (!raw?.baseUrl)
|
|
34
35
|
return null;
|
|
35
|
-
return raw;
|
|
36
|
+
return normalizeRobotKey(raw);
|
|
36
37
|
}
|
|
37
38
|
/**
|
|
38
39
|
* 根据 accountId 解析具体账号配置。
|
|
@@ -50,11 +51,11 @@ export function resolveAccountConfig(base, accountId) {
|
|
|
50
51
|
if (accountId && accountId !== "default") {
|
|
51
52
|
const hit = map[accountId];
|
|
52
53
|
if (hit)
|
|
53
|
-
return { ...base, ...(defaults ?? {}), ...hit };
|
|
54
|
+
return normalizeRobotKey({ ...base, ...(defaults ?? {}), ...hit });
|
|
54
55
|
}
|
|
55
56
|
const firstKey = Object.keys(map).find((k) => k !== "default");
|
|
56
57
|
const first = firstKey ? map[firstKey] : undefined;
|
|
57
|
-
return first ? { ...base, ...(defaults ?? {}), ...first } : base;
|
|
58
|
+
return normalizeRobotKey(first ? { ...base, ...(defaults ?? {}), ...first } : base);
|
|
58
59
|
}
|
|
59
60
|
/** 调用 IM 接口拉取群聊最近 N 条消息 */
|
|
60
61
|
async function fetchGroupHistory(config, token, groupId, limit, userId) {
|
|
@@ -79,10 +80,11 @@ async function fetchGroupHistory(config, token, groupId, limit, userId) {
|
|
|
79
80
|
}
|
|
80
81
|
// ─── 工具构建函数(直接传 config,而非 factory 模式)──────────────────────────
|
|
81
82
|
/**
|
|
82
|
-
*
|
|
83
|
-
*
|
|
83
|
+
* 构建群聊历史工具对象。
|
|
84
|
+
* 应通过 `api.registerTool((ctx) => buildGroupHistoryTool(...))` 工厂注册,以便每回合合并
|
|
85
|
+
* `runtimeConfig` 与 `agentAccountId` / `requesterSenderId`(静态 `(_ctx) => tool` 会丢弃上述上下文)。
|
|
84
86
|
*/
|
|
85
|
-
export function buildGroupHistoryTool(config) {
|
|
87
|
+
export function buildGroupHistoryTool(config, hints) {
|
|
86
88
|
return {
|
|
87
89
|
name: "xg_cwork_im_get_group_chat_history",
|
|
88
90
|
label: "【xg_cwork_im】获取群聊历史记录",
|
|
@@ -102,8 +104,10 @@ export function buildGroupHistoryTool(config) {
|
|
|
102
104
|
parameters: GroupHistoryParams,
|
|
103
105
|
async execute(_toolCallId, params) {
|
|
104
106
|
const limit = params.limit ?? 10;
|
|
105
|
-
const { groupId
|
|
106
|
-
|
|
107
|
+
const { groupId } = params;
|
|
108
|
+
const accountId = params.accountId ?? hints?.channelAccountId;
|
|
109
|
+
const userId = params.userId ?? hints?.requesterSenderId;
|
|
110
|
+
console.log(`[cwork_im][tool] xg_cwork_im_get_group_chat_history called: groupId=${groupId} limit=${limit} accountId=${accountId ?? "(session)"} userId=${userId ?? "(default)"}`);
|
|
107
111
|
let identity;
|
|
108
112
|
try {
|
|
109
113
|
const accountConfig = resolveAccountConfig(config, accountId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group-history-tool.js","sourceRoot":"","sources":["../../src/group-history-tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAe,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"group-history-tool.js","sourceRoot":"","sources":["../../src/group-history-tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAe,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAWrC,4EAA4E;AAE5E,MAAM,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC;IACnC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;QACjB,WAAW,EAAE,uBAAuB;KACvC,CAAC;IACF,MAAM,EAAE,IAAI,CAAC,QAAQ,CACjB,IAAI,CAAC,MAAM,CAAC;QACR,WAAW,EACP,2DAA2D;KAClE,CAAC,CACL;IACD,SAAS,EAAE,IAAI,CAAC,QAAQ,CACpB,IAAI,CAAC,MAAM,CAAC;QACR,WAAW,EACP,0EAA0E;KACjF,CAAC,CACL;IACD,KAAK,EAAE,IAAI,CAAC,QAAQ,CAChB,IAAI,CAAC,MAAM,CAAC;QACR,WAAW,EAAE,uBAAuB;QACpC,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;KACd,CAAC,CACL;CACJ,CAAC,CAAC;AAEH,4EAA4E;AAE5E,6DAA6D;AAC7D,MAAM,UAAU,sBAAsB,CAAC,GAAY;IAC/C,MAAM,GAAG,GAAI,GAA+C,EAAE,QAAQ,EAAE,WAAqC,CAAC;IAC9G,IAAI,CAAC,GAAG,EAAE,OAAO;QAAE,OAAO,IAAI,CAAC;IAC/B,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;AAClC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAgB,EAAE,SAAyB;IAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,GAAG,GAAG,QAAkD,CAAC;IAC/D,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAE9D,IAAI,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;QAC3B,IAAI,GAAG;YAAE,OAAO,iBAAiB,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnD,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACxF,CAAC;AAED,2BAA2B;AAC3B,KAAK,UAAU,iBAAiB,CAC5B,MAAkB,EAClB,KAAa,EACb,OAAe,EACf,KAAa,EACb,MAAe;IAEf,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,OAAO,mCAAmC,CAAC;IAEjE,MAAM,MAAM,GAA4B;QACpC,OAAO;QACP,QAAQ,EAAE,KAAK;KAClB,CAAC;IACF,IAAI,MAAM,EAAE,CAAC;QACT,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IAC3B,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAIxB,GAAG,EAAE;QACJ,MAAM;QACN,OAAO,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE;QAClC,OAAO,EAAE,KAAK;KACjB,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACtB,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClF,OAAO,EAAE,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,iEAAiE;AAEjE;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAkB,EAAE,KAA4B;IAClF,OAAO;QACH,IAAI,EAAE,oCAAoC;QAC1C,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE;YACT,mDAAmD;YACnD,EAAE;YACF,+BAA+B;YAC/B,wDAAwD;YACxD,iDAAiD;YACjD,mBAAmB;YACnB,EAAE;YACF,kCAAkC;YAClC,iGAAiG;YACjG,EAAE;YACF,uCAAuC;SAC1C,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,UAAU,EAAE,kBAAkB;QAC9B,KAAK,CAAC,OAAO,CAAC,WAAmB,EAAE,MAAyC;YACxE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;YACjC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;YAC3B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,KAAK,EAAE,gBAAgB,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,KAAK,EAAE,iBAAiB,CAAC;YAEzD,OAAO,CAAC,GAAG,CACP,uEAAuE,OAAO,UAAU,KAAK,cAAc,SAAS,IAAI,WAAW,WAAW,MAAM,IAAI,WAAW,EAAE,CACxK,CAAC;YAEF,IAAI,QAAqB,CAAC;YAC1B,IAAI,CAAC;gBACD,MAAM,aAAa,GAAG,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBAC9D,QAAQ,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,8CAA8C,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YACjF,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACpB,OAAO,cAAc,CAAC;oBAClB,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,kCAAkC,MAAM,CAAC,GAAG,CAAC,EAAE;oBACtD,QAAQ,EAAE,EAAE;iBACf,CAAC,CAAC;YACP,CAAC;YAED,IAAI,QAA2B,CAAC;YAChC,IAAI,CAAC;gBACD,MAAM,aAAa,GAAG,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBAC9D,QAAQ,GAAG,MAAM,iBAAiB,CAAC,aAAa,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;gBAC1F,OAAO,CAAC,GAAG,CACP,4BAA4B,QAAQ,CAAC,MAAM,wBAAwB,OAAO,oBAAoB,SAAS,IAAI,GAAG,WAAW,MAAM,IAAI,KAAK,EAAE,CAC7I,CAAC;YACN,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACpB,OAAO,cAAc,CAAC;oBAClB,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,kCAAkC,MAAM,CAAC,GAAG,CAAC,EAAE;oBACtD,QAAQ,EAAE,EAAE;iBACf,CAAC,CAAC;YACP,CAAC;YAED,oBAAoB;YACpB,MAAM,SAAS,GAAG,QAAQ;iBACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;gBACV,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC;gBAC7B,OAAO,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,MAAM,CAAC;YACxC,CAAC,CAAC;iBACD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACP,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC;gBACtC,MAAM,UAAU,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,IAAI,QAAQ,IAAI,MAAM,CAAC;gBAC1D,MAAM,KAAK,GAAG,QAAQ,KAAK,QAAQ,CAAC,MAAM,CAAC;gBAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;gBAC3C,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC;gBAC7C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;gBACzE,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC;gBACvB,MAAM,IAAI,GACN,CAAC,EAAE,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM;oBACjC,CAAC,CAAC;wBACE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE;wBACd,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,CAAC,KAAK;6BAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC;6BAC9C,IAAI,CAAC,GAAG,CAAC,GAAG;qBACpB;yBACI,MAAM,CAAC,OAAO,CAAC;yBACf,IAAI,CAAC,GAAG,CAAC;oBACd,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;gBAC1B,OAAO,IAAI,IAAI,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC;YAC1C,CAAC,CAAC,CAAC;YAEP,OAAO,cAAc,CAAC;gBAClB,EAAE,EAAE,IAAI;gBACR,OAAO;gBACP,KAAK,EAAE,SAAS,CAAC,MAAM;gBACvB,QAAQ,EAAE,SAAS;aACtB,CAAC,CAAC;QACP,CAAC;KACJ,CAAC;AACN,CAAC"}
|