diff --git a/src/hooks/sisyphus-orchestrator/index.test.ts b/src/hooks/sisyphus-orchestrator/index.test.ts index 39ba4257..c5e1f837 100644 --- a/src/hooks/sisyphus-orchestrator/index.test.ts +++ b/src/hooks/sisyphus-orchestrator/index.test.ts @@ -517,6 +517,11 @@ describe("sisyphus-orchestrator hook", () => { getMainSessionID: () => MAIN_SESSION_ID, subagentSessions: new Set(), })) + setupMessageStorage(MAIN_SESSION_ID, "orchestrator-sisyphus") + }) + + afterEach(() => { + cleanupMessageStorage(MAIN_SESSION_ID) }) test("should inject continuation when boulder has incomplete tasks", async () => { @@ -741,6 +746,38 @@ describe("sisyphus-orchestrator hook", () => { expect(callArgs.body.parts[0].text).toContain("2 remaining") }) + test("should not inject when last agent is not orchestrator-sisyphus", async () => { + // #given - boulder state with incomplete plan, but last agent is NOT orchestrator-sisyphus + const planPath = join(TEST_DIR, "test-plan.md") + writeFileSync(planPath, "# Plan\n- [ ] Task 1\n- [ ] Task 2") + + const state: BoulderState = { + active_plan: planPath, + started_at: "2026-01-02T10:00:00Z", + session_ids: [MAIN_SESSION_ID], + plan_name: "test-plan", + } + writeBoulderState(TEST_DIR, state) + + // #given - last agent is NOT orchestrator-sisyphus + cleanupMessageStorage(MAIN_SESSION_ID) + setupMessageStorage(MAIN_SESSION_ID, "Sisyphus") + + const mockInput = createMockPluginInput() + const hook = createSisyphusOrchestratorHook(mockInput) + + // #when + await hook.handler({ + event: { + type: "session.idle", + properties: { sessionID: MAIN_SESSION_ID }, + }, + }) + + // #then - should NOT call prompt because agent is not orchestrator-sisyphus + expect(mockInput._promptMock).not.toHaveBeenCalled() + }) + test("should cleanup on session.deleted", async () => { // #given - boulder state const planPath = join(TEST_DIR, "test-plan.md") diff --git a/src/hooks/sisyphus-orchestrator/index.ts b/src/hooks/sisyphus-orchestrator/index.ts index f3e197c2..27acbf0c 100644 --- a/src/hooks/sisyphus-orchestrator/index.ts +++ b/src/hooks/sisyphus-orchestrator/index.ts @@ -422,6 +422,11 @@ export function createSisyphusOrchestratorHook( return } + if (!isCallerOrchestrator(sessionID)) { + log(`[${HOOK_NAME}] Skipped: last agent is not orchestrator-sisyphus`, { sessionID }) + return + } + const progress = getPlanProgress(boulderState.active_plan) if (progress.isComplete) { log(`[${HOOK_NAME}] Boulder complete`, { sessionID, plan: boulderState.plan_name })