


























@@ -21,13 +21,17 @@ function requireRecord(value: unknown, label: string): Record<string, unknown> {
21212222function gatewayRequestPayload(callIndex = 0) {
2323return requireRecord(
24-mockCallGatewayTool.mock.calls[callIndex]?.[2],
24+mockCallGatewayTool.mock.calls.at(callIndex)?.[2],
2525`gateway request payload ${callIndex + 1}`,
2626);
2727}
28282929function gatewayCallOptions(callIndex = 0) {
30-return mockCallGatewayTool.mock.calls[callIndex]?.[3];
30+return mockCallGatewayTool.mock.calls.at(callIndex)?.[3];
31+}
32+33+function gatewayCallMethod(callIndex = 0) {
34+return mockCallGatewayTool.mock.calls.at(callIndex)?.[0];
3135}
32363337function findApprovalEvent(
@@ -98,8 +102,8 @@ describe("Codex app-server approval bridge", () => {
98102"plugin.approval.request",
99103"plugin.approval.waitDecision",
100104]);
101-expect(mockCallGatewayTool.mock.calls[0]?.[0]).toBe("plugin.approval.request");
102-expect(typeof mockCallGatewayTool.mock.calls[0]?.[1]).toBe("object");
105+expect(gatewayCallMethod()).toBe("plugin.approval.request");
106+expect(typeof mockCallGatewayTool.mock.calls.at(0)?.[1]).toBe("object");
103107const requestPayload = gatewayRequestPayload();
104108expect(requestPayload.pluginId).toBe("openclaw-codex-app-server");
105109expect(requestPayload.title).toBe("Codex app-server command approval");
@@ -168,8 +172,7 @@ describe("Codex app-server approval bridge", () => {
168172});
169173170174expect(result).toEqual({ decision: "acceptForSession" });
171-const [, , requestPayload] = mockCallGatewayTool.mock.calls[0] ?? [];
172-const description = (requestPayload as { description: string }).description;
175+const description = String(gatewayRequestPayload().description);
173176expect(description).toContain("Command: npm install");
174177expect(description).toContain("Additional permissions: network, fileSystem");
175178expect(description).toContain("High-risk targets: network access, filesystem root");
@@ -207,8 +210,7 @@ describe("Codex app-server approval bridge", () => {
207210turnId: "turn-1",
208211});
209212210-const [, , requestPayload] = mockCallGatewayTool.mock.calls[0] ?? [];
211-const description = (requestPayload as { description: string }).description;
213+const description = String(gatewayRequestPayload().description);
212214expect(description).toContain("[preview truncated or unsafe content omitted]");
213215expect(description).toContain("Additional permissions: network, fileSystem");
214216expect(description).toContain("High-risk targets: network access, filesystem root");
@@ -261,8 +263,7 @@ describe("Codex app-server approval bridge", () => {
261263turnId: "turn-1",
262264});
263265264-const [, , requestPayload] = mockCallGatewayTool.mock.calls[0] ?? [];
265-const description = (requestPayload as { description: string }).description;
266+const description = String(gatewayRequestPayload().description);
266267expect(description).toContain(
267268"printf '<\uff20U123> \uff3btrusted\uff3d\uff08https://evil\uff09 \uff20here'",
268269);
@@ -372,8 +373,7 @@ describe("Codex app-server approval bridge", () => {
372373turnId: "turn-1",
373374});
374375375-const [, , requestPayload] = mockCallGatewayTool.mock.calls[0] ?? [];
376-const description = (requestPayload as { description: string }).description;
376+const description = String(gatewayRequestPayload().description);
377377expect(description).toContain("[preview truncated or unsafe content omitted]");
378378const omittedEvent = findApprovalEvent(params, {});
379379expect(omittedEvent.commandPreviewOmitted).toBe(true);
@@ -610,8 +610,8 @@ describe("Codex app-server approval bridge", () => {
610610},
611611scope: "turn",
612612});
613-expect(mockCallGatewayTool.mock.calls[0]?.[0]).toBe("plugin.approval.request");
614-expect(typeof mockCallGatewayTool.mock.calls[0]?.[1]).toBe("object");
613+expect(gatewayCallMethod()).toBe("plugin.approval.request");
614+expect(typeof mockCallGatewayTool.mock.calls.at(0)?.[1]).toBe("object");
615615const requestPayload = gatewayRequestPayload();
616616expect(requestPayload.title).toBe("Codex app-server permission approval");
617617expect(requestPayload.toolName).toBe("codex_permission_approval");
@@ -715,8 +715,7 @@ describe("Codex app-server approval bridge", () => {
715715},
716716scope: "turn",
717717});
718-const [, , requestPayload] = mockCallGatewayTool.mock.calls[0] ?? [];
719-const description = (requestPayload as { description: string }).description;
718+const description = String(gatewayRequestPayload().description);
720719expect(description).toContain("Network enabled: true");
721720expect(description).toContain("File system read: ~/.ssh/id_rsa; write: /");
722721expect(description).toContain("entries: read /workspace/project, write /tmp/output (+1 more)");
@@ -747,8 +746,7 @@ describe("Codex app-server approval bridge", () => {
747746turnId: "turn-1",
748747});
749748750-const [, , requestPayload] = mockCallGatewayTool.mock.calls[0] ?? [];
751-const description = (requestPayload as { description: string }).description;
749+const description = String(gatewayRequestPayload().description);
752750expect(description).toContain("File system roots: ~; readPaths: ~/.ssh/id_rsa, ~/project");
753751expect(description).not.toContain("High-risk targets");
754752});
@@ -775,8 +773,7 @@ describe("Codex app-server approval bridge", () => {
775773turnId: "turn-1",
776774});
777775778-const [, , requestPayload] = mockCallGatewayTool.mock.calls[0] ?? [];
779-const description = (requestPayload as { description: string }).description;
776+const description = String(gatewayRequestPayload().description);
780777expect(description).toContain("example.com");
781778expect(description).toContain("safe .example.com");
782779expect(description).toContain("/tmp/project");
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。