fix: release finalized Pi runtimes

This commit is contained in:
2026-07-21 15:39:34 +02:00
parent 4c9424f1e3
commit 019f6b282e
2 changed files with 56 additions and 7 deletions
+41
View File
@@ -1304,6 +1304,47 @@ test("an unexpectedly exited runtime publishes its terminal sequence then releas
]);
});
test("agent_end releases the Pi runtime after the session was finalized", async () => {
let listener: ((event: any) => void) | undefined;
const bridge = {
onClientEvent: (next: (event: any) => void) => { listener = next; },
emitClientEvent: (event: any) => listener?.(event),
};
const runtime = { bridge };
let current: any;
let teardownCalls = 0;
const app = buildApp(loadConfig({ THT_HARNESS_DIR: "../harness" }), {
mgr: {
get: () => current,
createFor: () => { current = runtime; return runtime; },
configure: async () => {},
start: () => {},
teardownIfCurrent: (_id: string, expected: any) => {
if (current !== expected) return false;
teardownCalls += 1;
current = undefined;
return true;
},
} as any,
thtRunner: {
sessionNew: async () => ({ id: "s1" }),
sessionShow: async () => ({ status: "finalized" }),
searchPack: async () => {},
failSession: async () => {},
} as any,
readiness: { ensure: async () => ({ ok: true }) } as any,
getSettings: () => ({ workspace: "local" }) as any,
});
await app.inject({ method: "POST", url: "/sessions", payload: { question: "q" } });
await new Promise((resolve) => setImmediate(resolve));
bridge.emitClientEvent({ type: "system_event", event: "agent_end" });
await new Promise((resolve) => setImmediate(resolve));
expect(teardownCalls).toBe(1);
expect(current).toBeUndefined();
});
test("POST resume tears down a created runtime when bridge binding fails", async () => {
const delivered: string[] = [];
const actualHub = new SseHub();