mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-04 17:30:22 +00:00
108 lines
3.5 KiB
TypeScript
108 lines
3.5 KiB
TypeScript
import fs from "node:fs/promises";
|
|
import path from "node:path";
|
|
import "./isolated-agent.mocks.js";
|
|
import { beforeEach, describe, expect, it } from "vitest";
|
|
import type { CliDeps } from "../cli/deps.js";
|
|
import { resolveDefaultSessionStorePath } from "../config/sessions.js";
|
|
import { peekSystemEvents, resetSystemEventsForTest } from "../infra/system-events.js";
|
|
import { createCliDeps, mockAgentPayloads } from "./isolated-agent.delivery.test-helpers.js";
|
|
import { runCronIsolatedAgentTurn } from "./isolated-agent.js";
|
|
import { makeCfg, makeJob, withTempCronHome } from "./isolated-agent.test-harness.js";
|
|
import { setupIsolatedAgentTurnMocks } from "./isolated-agent.test-setup.js";
|
|
import { resetCompletedDirectCronDeliveriesForTests } from "./isolated-agent/delivery-dispatch.js";
|
|
|
|
async function writeDefaultAgentSessionStoreEntries(
|
|
entries: Record<string, Record<string, unknown>>,
|
|
): Promise<string> {
|
|
const storePath = resolveDefaultSessionStorePath("main");
|
|
await fs.mkdir(path.dirname(storePath), { recursive: true });
|
|
await fs.writeFile(storePath, JSON.stringify(entries, null, 2), "utf-8");
|
|
return storePath;
|
|
}
|
|
|
|
async function runAnnounceTurn(params: {
|
|
home: string;
|
|
storePath: string;
|
|
sessionKey: string;
|
|
deps?: CliDeps;
|
|
cfgOverrides?: Partial<ReturnType<typeof makeCfg>>;
|
|
delivery: {
|
|
mode: "announce";
|
|
channel: "last" | "telegram";
|
|
to?: string;
|
|
bestEffort?: boolean;
|
|
};
|
|
}) {
|
|
return await runCronIsolatedAgentTurn({
|
|
cfg: makeCfg(params.home, params.storePath, params.cfgOverrides),
|
|
deps: params.deps ?? createCliDeps(),
|
|
job: {
|
|
...makeJob({ kind: "agentTurn", message: "do it" }),
|
|
sessionTarget: "isolated",
|
|
delivery: params.delivery,
|
|
},
|
|
message: "do it",
|
|
sessionKey: params.sessionKey,
|
|
lane: "cron",
|
|
});
|
|
}
|
|
|
|
describe("runCronIsolatedAgentTurn cron delivery awareness", () => {
|
|
beforeEach(() => {
|
|
setupIsolatedAgentTurnMocks();
|
|
resetCompletedDirectCronDeliveriesForTests();
|
|
resetSystemEventsForTest();
|
|
});
|
|
|
|
it("queues delivered isolated cron text for the next main-session turn", async () => {
|
|
await withTempCronHome(async (home) => {
|
|
const storePath = await writeDefaultAgentSessionStoreEntries({});
|
|
const deps = createCliDeps();
|
|
mockAgentPayloads([{ text: "hello from cron" }]);
|
|
|
|
const result = await runAnnounceTurn({
|
|
home,
|
|
storePath,
|
|
sessionKey: "cron:job-1",
|
|
deps,
|
|
delivery: {
|
|
mode: "announce",
|
|
channel: "telegram",
|
|
to: "123",
|
|
},
|
|
});
|
|
|
|
expect(result.status).toBe("ok");
|
|
expect(result.delivered).toBe(true);
|
|
expect(peekSystemEvents("agent:main:main")).toEqual(["hello from cron"]);
|
|
});
|
|
});
|
|
|
|
it("uses the global main queue when session scope is global", async () => {
|
|
await withTempCronHome(async (home) => {
|
|
const storePath = await writeDefaultAgentSessionStoreEntries({});
|
|
const deps = createCliDeps();
|
|
mockAgentPayloads([{ text: "global cron digest" }]);
|
|
|
|
const result = await runAnnounceTurn({
|
|
home,
|
|
storePath,
|
|
sessionKey: "cron:job-1",
|
|
deps,
|
|
cfgOverrides: {
|
|
session: { scope: "global", store: storePath, mainKey: "main" },
|
|
},
|
|
delivery: {
|
|
mode: "announce",
|
|
channel: "telegram",
|
|
to: "123",
|
|
},
|
|
});
|
|
|
|
expect(result.status).toBe("ok");
|
|
expect(result.delivered).toBe(true);
|
|
expect(peekSystemEvents("global")).toEqual(["global cron digest"]);
|
|
});
|
|
});
|
|
});
|