fix(exec-approvals): harden forwarding target and resolve delivery paths

Co-authored-by: bubmiller <bubmiller@users.noreply.github.com>
This commit is contained in:
Peter Steinberger
2026-02-22 20:32:22 +01:00
parent 6f895eb831
commit 51b0772e14
5 changed files with 183 additions and 44 deletions

View File

@@ -113,7 +113,7 @@ describe("exec approval forwarder", () => {
expect(getFirstDeliveryText(deliver)).toContain("Command:\n```\necho `uname`\necho done\n```");
});
it("skips discord forwarding targets", async () => {
it("forwards to discord when discord exec approvals handler is disabled", async () => {
vi.useFakeTimers();
const cfg = {
approvals: { exec: { enabled: true, mode: "session" } },
@@ -126,9 +126,61 @@ describe("exec approval forwarder", () => {
await forwarder.handleRequested(baseRequest);
expect(deliver).toHaveBeenCalledTimes(1);
});
it("skips discord forwarding when discord exec approvals handler is enabled", async () => {
vi.useFakeTimers();
const cfg = {
channels: {
discord: {
execApprovals: {
enabled: true,
approvers: ["123"],
},
},
},
approvals: { exec: { enabled: true, mode: "session" } },
} as OpenClawConfig;
const { deliver, forwarder } = createForwarder({
cfg,
resolveSessionTarget: () => ({ channel: "discord", to: "channel:123" }),
});
await forwarder.handleRequested(baseRequest);
expect(deliver).not.toHaveBeenCalled();
});
it("can forward resolved notices without pending cache when request payload is present", async () => {
vi.useFakeTimers();
const cfg = {
approvals: {
exec: {
enabled: true,
mode: "targets",
targets: [{ channel: "telegram", to: "123" }],
},
},
} as OpenClawConfig;
const { deliver, forwarder } = createForwarder({ cfg });
await forwarder.handleResolved({
id: "req-missing",
decision: "allow-once",
resolvedBy: "telegram:123",
ts: 2000,
request: {
command: "echo ok",
agentId: "main",
sessionKey: "agent:main:main",
},
});
expect(deliver).toHaveBeenCalledTimes(1);
});
it("uses a longer fence when command already contains triple backticks", async () => {
vi.useFakeTimers();
const { deliver, forwarder } = createForwarder({ cfg: TARGETS_CFG });