import { beforeEach, describe, expect, it, vi } from "vitest"; const { callGatewayToolMock } = vi.hoisted(() => ({ callGatewayToolMock: vi.fn(), })); vi.mock("../agent-scope.js", () => ({ resolveSessionAgentId: () => "agent-123", })); import { createCronTool } from "./cron-tool.js"; describe("cron tool flat-params", () => { beforeEach(() => { callGatewayToolMock.mockClear(); callGatewayToolMock.mockResolvedValue({ ok: true }); }); it("preserves explicit top-level sessionKey during flat-params recovery", async () => { const tool = createCronTool( { agentSessionKey: "agent:main:discord:channel:ops" }, { callGatewayTool: callGatewayToolMock }, ); await tool.execute("call-flat-session-key", { action: "add", sessionKey: "agent:main:telegram:group:-100123:topic:99", schedule: { kind: "at", at: new Date(123).toISOString() }, message: "do stuff", }); const [method, _gatewayOpts, params] = callGatewayToolMock.mock.calls[0] as [ string, unknown, { sessionKey?: string }, ]; expect(method).toBe("cron.add"); expect(params.sessionKey).toBe("agent:main:telegram:group:-100123:topic:99"); }); });