




















@@ -13,6 +13,54 @@ type ExecCall = {
1313params: unknown;
1414};
151516+type ExecDefaults = {
17+accountId?: string;
18+approvalFollowup?: () => Promise<string | undefined>;
19+approvalFollowupMode?: string;
20+approvalFollowupText?: string;
21+approvalWarningText?: string;
22+ask?: string;
23+currentChannelId?: string;
24+host?: string;
25+messageProvider?: string;
26+security?: string;
27+trigger?: string;
28+};
29+30+type ExecParams = {
31+ask?: string;
32+command?: string;
33+security?: string;
34+};
35+36+type DiagnosticsSession = {
37+accountId?: string;
38+agentHarnessId?: string;
39+channel?: string;
40+sessionFile?: string;
41+sessionId?: string;
42+sessionKey?: string;
43+};
44+45+function requireExecCall(execCalls: ExecCall[], index = 0) {
46+const call = execCalls[index];
47+if (!call) {
48+throw new Error(`expected exec call #${index + 1}`);
49+}
50+return {
51+defaults: call.defaults as ExecDefaults,
52+params: call.params as ExecParams,
53+};
54+}
55+56+function requireDiagnosticsSessions(call: PluginCommandContext | undefined) {
57+const sessions = call?.diagnosticsSessions as DiagnosticsSession[] | undefined;
58+if (!sessions) {
59+throw new Error("expected diagnostics sessions");
60+}
61+return sessions;
62+}
63+1664function buildDiagnosticsParams(
1765commandBodyNormalized: string,
1866overrides: Partial<HandleCommandsParams> = {},
@@ -241,24 +289,21 @@ describe("diagnostics command", () => {
241289expect(result?.shouldContinue).toBe(false);
242290expect(result?.reply).toBeUndefined();
243291expect(execCalls).toHaveLength(1);
244-expect(execCalls[0]?.defaults).toMatchObject({
245-host: "gateway",
246-security: "allowlist",
247-ask: "always",
248-trigger: "diagnostics",
249-approvalFollowupMode: "direct",
250-approvalWarningText: expect.stringContaining(
251-"Diagnostics can include sensitive local logs and host-level runtime metadata.",
252-),
253-});
254-expect(
255-String((execCalls[0]?.defaults as { approvalWarningText?: string }).approvalWarningText),
256-).toContain("https://docs.openclaw.ai/gateway/diagnostics");
257-expect(execCalls[0]?.params).toMatchObject({
258-security: "allowlist",
259-ask: "always",
260-});
261-const command = (execCalls[0]?.params as { command?: string }).command ?? "";
292+const execCall = requireExecCall(execCalls);
293+expect(execCall.defaults.host).toBe("gateway");
294+expect(execCall.defaults.security).toBe("allowlist");
295+expect(execCall.defaults.ask).toBe("always");
296+expect(execCall.defaults.trigger).toBe("diagnostics");
297+expect(execCall.defaults.approvalFollowupMode).toBe("direct");
298+expect(execCall.defaults.approvalWarningText).toContain(
299+"Diagnostics can include sensitive local logs and host-level runtime metadata.",
300+);
301+expect(execCall.defaults.approvalWarningText).toContain(
302+"https://docs.openclaw.ai/gateway/diagnostics",
303+);
304+expect(execCall.params.security).toBe("allowlist");
305+expect(execCall.params.ask).toBe("always");
306+const command = execCall.params.command ?? "";
262307expect(command).toContain("gateway");
263308expect(command).toContain("diagnostics");
264309expect(command).toContain("export");
@@ -298,11 +343,10 @@ describe("diagnostics command", () => {
298343await handleDiagnosticsCommand(params, true);
299344300345expect(execCalls).toHaveLength(1);
301-expect(execCalls[0]?.defaults).toMatchObject({
302-messageProvider: "telegram",
303-currentChannelId: "telegram:8460800771",
304-accountId: "account-1",
305-});
346+const execCall = requireExecCall(execCalls);
347+expect(execCall.defaults.messageProvider).toBe("telegram");
348+expect(execCall.defaults.currentChannelId).toBe("telegram:8460800771");
349+expect(execCall.defaults.accountId).toBe("account-1");
306350});
307351308352it("falls back to a visible reply when approval cannot be queued", async () => {
@@ -353,20 +397,14 @@ describe("diagnostics command", () => {
353397expect(calls[0]?.diagnosticsPreviewOnly).toBe(true);
354398expect(calls[0]?.senderIsOwner).toBe(true);
355399expect(calls[0]?.sessionFile).toBe("/tmp/session.jsonl");
356-expect(calls[0]?.diagnosticsSessions).toEqual([
357-expect.objectContaining({
358-agentHarnessId: "codex",
359-sessionId: "session-1",
360-sessionFile: "/tmp/session.jsonl",
361-channel: "whatsapp",
362-accountId: "account-1",
363-}),
364-]);
365-const defaults = execCalls[0]?.defaults as {
366-approvalWarningText?: string;
367-approvalFollowupText?: string;
368-approvalFollowup?: () => Promise<string | undefined>;
369-};
400+const diagnosticsSessions = requireDiagnosticsSessions(calls[0]);
401+expect(diagnosticsSessions).toHaveLength(1);
402+expect(diagnosticsSessions[0]?.agentHarnessId).toBe("codex");
403+expect(diagnosticsSessions[0]?.sessionId).toBe("session-1");
404+expect(diagnosticsSessions[0]?.sessionFile).toBe("/tmp/session.jsonl");
405+expect(diagnosticsSessions[0]?.channel).toBe("whatsapp");
406+expect(diagnosticsSessions[0]?.accountId).toBe("account-1");
407+const { defaults } = requireExecCall(execCalls);
370408expect(defaults.approvalWarningText).toContain("OpenAI Codex harness:");
371409expect(defaults.approvalWarningText).toContain(
372410"Approving diagnostics will also send this thread's feedback bundle to OpenAI servers.",
@@ -413,23 +451,19 @@ describe("diagnostics command", () => {
413451expect(result?.shouldContinue).toBe(false);
414452expect(result?.reply).toBeUndefined();
415453expect(calls).toHaveLength(1);
416-expect(calls[0]?.diagnosticsSessions).toEqual([
417-expect.objectContaining({
418-sessionKey: "agent:main:telegram:direct:user-1",
419-sessionId: "telegram-session",
420-sessionFile: "/tmp/telegram.jsonl",
421-channel: "whatsapp",
422-}),
423-expect.objectContaining({
424-sessionKey: "agent:main:discord:channel:123",
425-sessionId: "discord-session",
426-sessionFile: "/tmp/discord.jsonl",
427-channel: "discord",
428-}),
429-]);
430-expect(
431-(execCalls[0]?.defaults as { approvalWarningText?: string }).approvalWarningText,
432-).toContain("OpenAI Codex harness:");
454+const diagnosticsSessions = requireDiagnosticsSessions(calls[0]);
455+expect(diagnosticsSessions).toHaveLength(2);
456+expect(diagnosticsSessions[0]?.sessionKey).toBe("agent:main:telegram:direct:user-1");
457+expect(diagnosticsSessions[0]?.sessionId).toBe("telegram-session");
458+expect(diagnosticsSessions[0]?.sessionFile).toBe("/tmp/telegram.jsonl");
459+expect(diagnosticsSessions[0]?.channel).toBe("whatsapp");
460+expect(diagnosticsSessions[1]?.sessionKey).toBe("agent:main:discord:channel:123");
461+expect(diagnosticsSessions[1]?.sessionId).toBe("discord-session");
462+expect(diagnosticsSessions[1]?.sessionFile).toBe("/tmp/discord.jsonl");
463+expect(diagnosticsSessions[1]?.channel).toBe("discord");
464+expect(requireExecCall(execCalls).defaults.approvalWarningText).toContain(
465+"OpenAI Codex harness:",
466+);
433467});
434468435469it("omits the Codex section for ordinary sessions without Codex targets", async () => {
@@ -458,9 +492,9 @@ describe("diagnostics command", () => {
458492true,
459493);
460494461-expect(
462-(execCalls[0]?.defaults as { approvalWarningText?: string }).approvalWarningText,
463-).not.toContain("OpenAI Codex harness:");
495+expect(requireExecCall(execCalls).defaults.approvalWarningText).not.toContain(
496+"OpenAI Codex harness:",
497+);
464498});
465499466500it("routes group diagnostics details privately before starting collection", async () => {
@@ -494,17 +528,14 @@ describe("diagnostics command", () => {
494528expect(result?.reply?.text).not.toContain("codex-thread-1");
495529expect(privateReplies).toHaveLength(0);
496530expect(execCalls).toHaveLength(1);
497-expect(execCalls[0]?.defaults).toMatchObject({
498-messageProvider: "telegram",
499-currentChannelId: "owner-dm",
500-accountId: "account-1",
501-});
502-expect(
503-(execCalls[0]?.defaults as { approvalWarningText?: string }).approvalWarningText,
504-).toContain("Approving diagnostics will also send this thread's feedback bundle");
505-expect(
506-(execCalls[0]?.defaults as { approvalWarningText?: string }).approvalWarningText,
507-).not.toContain("To send:");
531+const { defaults } = requireExecCall(execCalls);
532+expect(defaults.messageProvider).toBe("telegram");
533+expect(defaults.currentChannelId).toBe("owner-dm");
534+expect(defaults.accountId).toBe("account-1");
535+expect(defaults.approvalWarningText).toContain(
536+"Approving diagnostics will also send this thread's feedback bundle",
537+);
538+expect(defaults.approvalWarningText).not.toContain("To send:");
508539expect(calls[0]?.diagnosticsPrivateRouted).toBe(true);
509540});
510541此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。