fix: prefer target entry for send policy

This commit is contained in:
Tak Hoffman
2026-04-10 20:23:38 -05:00
parent 831386bd60
commit 7e7a269ad1
2 changed files with 90 additions and 3 deletions

View File

@@ -0,0 +1,86 @@
import { beforeEach, describe, expect, it, vi } from "vitest";
import type { HandleCommandsParams } from "./commands-types.js";
vi.mock("./commands-handlers.runtime.js", () => ({
loadCommandHandlers: () => [],
}));
vi.mock("./commands-reset.js", () => ({
maybeHandleResetCommand: vi.fn(async () => null),
}));
vi.mock("../commands-registry.js", () => ({
shouldHandleTextCommands: vi.fn(() => true),
}));
import { handleCommands } from "./commands-core.js";
function makeParams(): HandleCommandsParams {
return {
cfg: {
commands: { text: true },
session: {
sendPolicy: {
default: "allow",
rules: [{ action: "deny", match: { channel: "telegram" } }],
},
},
},
ctx: {
Provider: "whatsapp",
Surface: "whatsapp",
CommandSource: "text",
},
command: {
commandBodyNormalized: "/unknown",
rawBodyNormalized: "/unknown",
isAuthorizedSender: true,
senderIsOwner: true,
senderId: "owner",
channel: "whatsapp",
channelId: "whatsapp",
surface: "whatsapp",
ownerList: [],
from: "owner",
to: "bot",
},
directives: {},
elevated: { enabled: true, allowed: true, failures: [] },
sessionKey: "agent:target:main",
sessionEntry: {
sessionId: "wrapper-session",
updatedAt: Date.now(),
channel: "whatsapp",
chatType: "direct",
},
sessionStore: {
"agent:target:main": {
sessionId: "target-session",
updatedAt: Date.now(),
channel: "telegram",
chatType: "direct",
},
},
workspaceDir: "/tmp/workspace",
defaultGroupActivation: () => "mention",
resolvedVerboseLevel: "off",
resolvedReasoningLevel: "off",
resolveDefaultThinkingLevel: async () => undefined,
provider: "openai",
model: "gpt-5.4",
contextTokens: 0,
isGroup: false,
} as unknown as HandleCommandsParams;
}
describe("handleCommands send policy", () => {
beforeEach(() => {
vi.clearAllMocks();
});
it("prefers the target session entry from sessionStore for send policy checks", async () => {
const result = await handleCommands(makeParams());
expect(result).toEqual({ shouldContinue: false });
});
});

View File

@@ -41,12 +41,13 @@ export async function handleCommands(params: HandleCommandsParams): Promise<Comm
}
}
const targetSessionEntry = params.sessionStore?.[params.sessionKey] ?? params.sessionEntry;
const sendPolicy = resolveSendPolicy({
cfg: params.cfg,
entry: params.sessionEntry,
entry: targetSessionEntry,
sessionKey: params.sessionKey,
channel: params.sessionEntry?.channel ?? params.command.channel,
chatType: params.sessionEntry?.chatType,
channel: targetSessionEntry?.channel ?? params.command.channel,
chatType: targetSessionEntry?.chatType,
});
if (sendPolicy === "deny") {
logVerbose(`Send blocked by policy for session ${params.sessionKey ?? "unknown"}`);