diff --git a/src/index.ts b/src/index.ts index 1bdb353..ab3a4c9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -923,7 +923,7 @@ export default function mainSupervisor(pi: ExtensionAPI) { // Stock open sends startup only to a newly created context; existing panes receive nothing. const pane = await openProjectPane({ cwd: ctx.cwd, message: workerAssignment(plan, self[0].id, requestId, params.task, model), focus: false, signal }); // Stock v1 emits these codes only before pane split/run. Other errors may follow a partial open. - const unopened = !pane.ok && ["INVALID_PROJECT_ROOT", "INVALID_BINDING", "BINDING_READ_FAILED", "PANE_OWNERSHIP_UNVERIFIED"].includes(pane.error.code); + const unopened = !pane.ok && ["INVALID_PROJECT_ROOT", "HERDR_UNSUPPORTED_VERSION", "INVALID_BINDING", "BINDING_READ_FAILED", "PANE_OWNERSHIP_UNVERIFIED"].includes(pane.error.code); if ((pane.ok || unopened) && state.plan === plan && state.worker?.requestId === requestId) { if (unopened || pane.ok && pane.data.disposition === "already-open" && superseded) { state.worker = superseded; state.workerStopped = previouslyStopped; diff --git a/test/goals.test.ts b/test/goals.test.ts index 68ebe0a..676f5a9 100644 --- a/test/goals.test.ts +++ b/test/goals.test.ts @@ -1355,6 +1355,9 @@ it("retains worker history and report routing after definite pre-open failure, n const reply = await tool.execute("failed", { task: "Proposed replacement" }, undefined, undefined, f.ctx); expect(reply.content[0].text).toContain("INVALID_PROJECT_ROOT"); expect(f.entries.at(-1).data.worker).toEqual(previous); + vi.mocked(openProjectPane).mockResolvedValueOnce({ ok: false, error: { code: "HERDR_UNSUPPORTED_VERSION", message: "Stock version preflight rejected" } }); + await tool.execute("preflight", { task: "Proposed replacement" }, undefined, undefined, f.ctx); + expect(f.entries.at(-1).data.worker).toEqual(previous); const view = await f.tools.get("worker_view").execute("view", {}, undefined, undefined, f.ctx); expect(view.content[0].text).toContain("Existing approved work"); f.event({ type: "message", fromSessionId: "old-worker", payload: { type: "stopped", to: previous.parentId, requestId: previous.requestId, plan: f.path, entryId: "still-routed", kind: "blocker", text: "Original worker reports a failure" } });