

























@@ -2268,6 +2268,50 @@ describe("runCodexAppServerAttempt", () => {
22682268expect(config?.instructions).toBeUndefined();
22692269});
227022702271+it("keeps lightweight cron Codex turns out of OpenClaw bootstrap context", async () => {
2272+const sessionFile = path.join(tempDir, "session.jsonl");
2273+const workspaceDir = path.join(tempDir, "workspace");
2274+const exactCommand =
2275+"cd /Users/phaedrus/Projects/openclaw && /Users/phaedrus/clawd/scripts/clawsweeper-related-scan.py";
2276+await fs.mkdir(workspaceDir, { recursive: true });
2277+await fs.writeFile(path.join(workspaceDir, "AGENTS.md"), "Follow AGENTS guidance.");
2278+await fs.writeFile(path.join(workspaceDir, "SOUL.md"), "Soul voice goes here.");
2279+const harness = createStartedThreadHarness();
2280+const params = createParams(sessionFile, workspaceDir);
2281+params.trigger = "cron";
2282+params.prompt = exactCommand;
2283+params.bootstrapContextMode = "lightweight";
2284+params.bootstrapContextRunKind = "cron";
2285+2286+const run = runCodexAppServerAttempt(params);
2287+await harness.waitForMethod("turn/start");
2288+await new Promise<void>((resolve) => setImmediate(resolve));
2289+await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
2290+await run;
2291+2292+const threadStart = harness.requests.find((request) => request.method === "thread/start");
2293+const threadStartParams = threadStart?.params as {
2294+developerInstructions?: string;
2295+};
2296+expect(threadStartParams.developerInstructions).not.toContain("Soul voice goes here.");
2297+expect(threadStartParams.developerInstructions).not.toContain("Follow AGENTS guidance.");
2298+2299+const turnStart = harness.requests.find((request) => request.method === "turn/start");
2300+const turnStartParams = turnStart?.params as {
2301+collaborationMode?: {
2302+settings?: { developer_instructions?: string | null };
2303+};
2304+input?: Array<{ text?: string }>;
2305+};
2306+expect(turnStartParams.input?.[0]?.text).toBe(exactCommand);
2307+expect(turnStartParams.collaborationMode?.settings?.developer_instructions).toContain(
2308+"This is an OpenClaw cron automation turn",
2309+);
2310+expect(turnStartParams.collaborationMode?.settings?.developer_instructions).toContain(
2311+"run that command before doing any investigation",
2312+);
2313+});
2314+22712315it("fires llm_input, llm_output, and agent_end hooks for codex turns", async () => {
22722316const llmInput = vi.fn();
22732317const llmOutput = vi.fn();
@@ -5616,6 +5660,25 @@ describe("runCodexAppServerAttempt", () => {
56165660expect(buildTurnCollaborationMode(params).settings.developer_instructions).toBeNull();
56175661});
561856625663+it("uses turn-scoped collaboration instructions for cron Codex turns", () => {
5664+const params = createParams("/tmp/session.jsonl", "/tmp/workspace");
5665+params.trigger = "cron";
5666+5667+const cronCollaborationMode = buildTurnCollaborationMode(params);
5668+expect(cronCollaborationMode.mode).toBe("default");
5669+expect(cronCollaborationMode.settings.model).toBe("gpt-5.4-codex");
5670+expect(cronCollaborationMode.settings.reasoning_effort).toBe("medium");
5671+expect(cronCollaborationMode.settings.developer_instructions).toContain(
5672+"This is an OpenClaw cron automation turn",
5673+);
5674+expect(cronCollaborationMode.settings.developer_instructions).toContain(
5675+"If it asks you to run an exact command, run that command before doing any investigation",
5676+);
5677+expect(cronCollaborationMode.settings.developer_instructions).toContain(
5678+"Do not read AGENTS.md, SOUL.md, USER.md, PROJECTS.md, MEMORY.md",
5679+);
5680+});
5681+56195682it("preserves the bound auth profile when resume params omit authProfileId", async () => {
56205683const sessionFile = path.join(tempDir, "session.jsonl");
56215684const workspaceDir = path.join(tempDir, "workspace");
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。