Files
pi-gui/test/agent-recovery.test.js

56 lines
1.7 KiB
JavaScript

import assert from "node:assert/strict";
import { mkdir, mkdtemp, writeFile } from "node:fs/promises";
import { tmpdir } from "node:os";
import { join } from "node:path";
import test from "node:test";
import {
createAgentRegistry,
sessionDirectoryPath,
} from "../src/bridge/agent-registry.js";
test("recovers an exited agent with its last Pi session reference", async () => {
const root = await mkdtemp(join(tmpdir(), "pi-status-bridge-recovery-"));
const home = join(root, "home");
const sessionRoot = join(root, "sessions");
await mkdir(home);
const sessionDir = sessionDirectoryPath(sessionRoot, home);
await mkdir(sessionDir, { recursive: true });
const sessionFile = join(sessionDir, "pi-session.jsonl");
await writeFile(
sessionFile,
`${JSON.stringify({ type: "session", version: 3, id: "recovery", cwd: home })}\n`,
);
const calls = [];
const registry = createAgentRegistry({
homeWorktree: home,
sessionRoot,
recoveryDelayForAttempt: () => 0,
sleep: async () => {},
startAdapter: (options) => {
const adapter = {
send: async () => ({
type: "response",
success: true,
data: { sessionFile },
}),
respondToExtension: () => {},
stop: async () => {},
};
calls.push({ options, adapter });
return adapter;
},
});
const agent = await registry.start();
calls[0].options.onError({ code: "child_exited", message: "crashed" });
await registry.waitForRecovery(agent.id);
assert.equal(calls.length, 2);
assert.equal(calls[1].options.sessionPath, sessionFile);
assert.deepEqual(
registry.eventsAfter(agent.id, 0).map((event) => event.type),
["agent_state", "recovery", "recovery", "agent_state"],
);
await registry.stop();
});