sisyphi 0.1.21 → 0.1.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-KQBSC5KY.js +31 -0
- package/dist/chunk-KQBSC5KY.js.map +1 -0
- package/dist/{chunk-LTAW6OWS.js → chunk-YGBGKMTF.js} +31 -6
- package/dist/chunk-YGBGKMTF.js.map +1 -0
- package/dist/chunk-ZE2SKB4B.js +35 -0
- package/dist/chunk-ZE2SKB4B.js.map +1 -0
- package/dist/cli.js +638 -51
- package/dist/cli.js.map +1 -1
- package/dist/daemon.js +915 -289
- package/dist/daemon.js.map +1 -1
- package/dist/paths-FYYSBD27.js +58 -0
- package/dist/paths-FYYSBD27.js.map +1 -0
- package/dist/templates/CLAUDE.md +21 -20
- package/dist/templates/agent-plugin/agents/CLAUDE.md +2 -0
- package/dist/templates/agent-plugin/agents/debug.md +1 -0
- package/dist/templates/agent-plugin/agents/operator.md +1 -2
- package/dist/templates/agent-plugin/agents/plan.md +86 -55
- package/dist/templates/agent-plugin/agents/review-plan.md +1 -0
- package/dist/templates/agent-plugin/agents/spec-draft.md +1 -0
- package/dist/templates/agent-plugin/hooks/hooks.json +19 -1
- package/dist/templates/agent-plugin/hooks/intercept-send-message.sh +1 -1
- package/dist/templates/agent-plugin/hooks/require-submit.sh +24 -0
- package/dist/templates/agent-suffix.md +18 -0
- package/dist/templates/dashboard-claude.md +38 -0
- package/dist/templates/orchestrator-base.md +270 -0
- package/dist/templates/orchestrator-impl.md +116 -0
- package/dist/templates/orchestrator-planning.md +131 -0
- package/dist/templates/orchestrator-plugin/hooks/hooks.json +1 -15
- package/dist/templates/orchestrator-plugin/skills/git-management/SKILL.md +1 -1
- package/dist/templates/orchestrator-plugin/skills/orchestration/SKILL.md +4 -16
- package/dist/templates/orchestrator-plugin/skills/orchestration/task-patterns.md +22 -23
- package/dist/templates/orchestrator-plugin/skills/orchestration/workflow-examples.md +11 -11
- package/dist/tui.js +3236 -0
- package/dist/tui.js.map +1 -0
- package/package.json +5 -1
- package/templates/CLAUDE.md +21 -20
- package/templates/agent-plugin/agents/CLAUDE.md +2 -0
- package/templates/agent-plugin/agents/debug.md +1 -0
- package/templates/agent-plugin/agents/operator.md +1 -2
- package/templates/agent-plugin/agents/plan.md +86 -55
- package/templates/agent-plugin/agents/review-plan.md +1 -0
- package/templates/agent-plugin/agents/spec-draft.md +1 -0
- package/templates/agent-plugin/hooks/hooks.json +19 -1
- package/templates/agent-plugin/hooks/intercept-send-message.sh +1 -1
- package/templates/agent-plugin/hooks/require-submit.sh +24 -0
- package/templates/agent-suffix.md +18 -0
- package/templates/dashboard-claude.md +38 -0
- package/templates/orchestrator-base.md +270 -0
- package/templates/orchestrator-impl.md +116 -0
- package/templates/orchestrator-planning.md +131 -0
- package/templates/orchestrator-plugin/hooks/hooks.json +1 -15
- package/templates/orchestrator-plugin/skills/git-management/SKILL.md +1 -1
- package/templates/orchestrator-plugin/skills/orchestration/SKILL.md +4 -16
- package/templates/orchestrator-plugin/skills/orchestration/task-patterns.md +22 -23
- package/templates/orchestrator-plugin/skills/orchestration/workflow-examples.md +11 -11
- package/dist/chunk-LTAW6OWS.js.map +0 -1
- package/dist/templates/orchestrator-plugin/scripts/block-task.sh +0 -11
- package/dist/templates/orchestrator.md +0 -173
- package/templates/orchestrator-plugin/scripts/block-task.sh +0 -11
- package/templates/orchestrator.md +0 -173
package/dist/daemon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/daemon/index.ts","../src/shared/config.ts","../src/daemon/server.ts","../src/daemon/session-manager.ts","../src/daemon/state.ts","../src/daemon/orchestrator.ts","../src/daemon/colors.ts","../src/daemon/tmux.ts","../src/daemon/pane-registry.ts","../src/daemon/agent.ts","../src/daemon/worktree.ts","../src/daemon/frontmatter.ts","../src/daemon/pane-monitor.ts","../src/daemon/updater.ts"],"sourcesContent":["import { mkdirSync, readFileSync, writeFileSync, unlinkSync, existsSync } from 'node:fs';\nimport { execSync } from 'node:child_process';\nimport { setTimeout as sleep } from 'node:timers/promises';\nimport { globalDir, daemonPidPath, statePath } from '../shared/paths.js';\nimport { loadConfig } from '../shared/config.js';\nimport { startServer, stopServer, registerSessionCwd, registerSessionTmux, loadSessionRegistry } from './server.js';\nimport { startMonitor, stopMonitor, setRespawnCallback, trackSession, updateTrackedWindow } from './pane-monitor.js';\nimport { onAllAgentsDone } from './session-manager.js';\nimport { resetAgentCounterFromState } from './agent.js';\nimport { setWindowId, setOrchestratorPaneId, getOrchestratorPaneId } from './orchestrator.js';\nimport { listPanes } from './tmux.js';\nimport { registerPane } from './pane-registry.js';\nimport * as stateModule from './state.js';\nimport type { Session } from '../shared/types.js';\nimport { checkAndApply } from './updater.js';\n\nfunction ensureDirs(): void {\n mkdirSync(globalDir(), { recursive: true });\n}\n\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction readPid(): number | null {\n const pidFile = daemonPidPath();\n try {\n const pid = parseInt(readFileSync(pidFile, 'utf-8').trim(), 10);\n return pid && isProcessAlive(pid) ? pid : null;\n } catch {\n return null;\n }\n}\n\nfunction acquirePidLock(): void {\n const pid = readPid();\n if (pid) {\n console.error(`[sisyphus] Daemon already running (pid ${pid}). Use 'sisyphusd restart' or 'sisyphusd stop' first.`);\n process.exit(0);\n }\n writeFileSync(daemonPidPath(), String(process.pid), 'utf-8');\n}\n\nfunction isLaunchdManaged(): boolean {\n try {\n execSync('launchctl list com.sisyphus.daemon', { stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction releasePidLock(): void {\n try {\n unlinkSync(daemonPidPath());\n } catch {\n // Already gone\n }\n}\n\nfunction stopDaemon(): boolean {\n const pid = readPid();\n if (!pid) {\n console.log('[sisyphus] Daemon is not running');\n // Clean up stale pid file if it exists\n releasePidLock();\n return false;\n }\n\n console.log(`[sisyphus] Stopping daemon (pid ${pid})...`);\n try {\n process.kill(pid, 'SIGTERM');\n } catch {\n console.error(`[sisyphus] Failed to send SIGTERM to pid ${pid}`);\n return false;\n }\n\n // Wait for process to exit (up to 5s)\n const deadline = Date.now() + 5000;\n while (Date.now() < deadline) {\n if (!isProcessAlive(pid)) {\n console.log('[sisyphus] Daemon stopped');\n releasePidLock();\n return true;\n }\n // Busy-wait in small increments (synchronous — fine for a CLI command)\n const wait = Date.now() + 100;\n while (Date.now() < wait) { /* spin */ }\n }\n\n console.error(`[sisyphus] Daemon (pid ${pid}) did not exit within 5s, sending SIGKILL`);\n try {\n process.kill(pid, 'SIGKILL');\n } catch { /* already dead */ }\n releasePidLock();\n return true;\n}\n\nasync function recoverSessions(): Promise<void> {\n const registry = loadSessionRegistry();\n const entries = Object.entries(registry);\n\n if (entries.length === 0) {\n console.log('[sisyphus] No sessions to recover');\n return;\n }\n\n let recovered = 0;\n for (const [sessionId, cwd] of entries) {\n const stateFile = statePath(cwd, sessionId);\n if (!existsSync(stateFile)) {\n continue;\n }\n\n try {\n const session = JSON.parse(readFileSync(stateFile, 'utf-8')) as Session;\n if (session.status === 'active' || session.status === 'paused') {\n registerSessionCwd(sessionId, cwd);\n resetAgentCounterFromState(sessionId, session.agents ?? []);\n\n // Reconnect to tmux panes if info was persisted\n if (session.tmuxSessionName && session.tmuxWindowId) {\n const livePanes = listPanes(session.tmuxWindowId);\n if (livePanes.length > 0) {\n registerSessionTmux(sessionId, session.tmuxSessionName, session.tmuxWindowId);\n setWindowId(sessionId, session.tmuxWindowId);\n trackSession(sessionId, cwd, session.tmuxSessionName);\n updateTrackedWindow(sessionId, session.tmuxWindowId);\n\n // Recover orchestrator pane from last incomplete cycle\n const lastIncompleteCycle = [...session.orchestratorCycles].reverse().find(c => !c.completedAt && c.paneId);\n if (lastIncompleteCycle?.paneId) {\n setOrchestratorPaneId(sessionId, lastIncompleteCycle.paneId);\n const livePaneIds = new Set(livePanes.map(p => p.paneId));\n if (livePaneIds.has(lastIncompleteCycle.paneId)) {\n registerPane(lastIncompleteCycle.paneId, sessionId, 'orchestrator');\n }\n }\n\n // Register live agent panes\n for (const agent of session.agents) {\n if (agent.status === 'running' && agent.paneId) {\n const livePaneIds = new Set(livePanes.map(p => p.paneId));\n if (livePaneIds.has(agent.paneId)) {\n registerPane(agent.paneId, sessionId, 'agent', agent.id);\n }\n }\n }\n\n console.log(`[sisyphus] Reconnected session ${sessionId} to tmux window ${session.tmuxWindowId}`);\n\n // Detect sessions stuck in \"all agents done, no orchestrator\" state\n if (session.status === 'active' && session.agents.length > 0) {\n const hasRunningAgents = session.agents.some(a => a.status === 'running');\n if (!hasRunningAgents) {\n const livePaneIds = new Set(livePanes.map(p => p.paneId));\n const orchestratorPaneId = getOrchestratorPaneId(sessionId);\n const orchestratorAlive = orchestratorPaneId && livePaneIds.has(orchestratorPaneId);\n if (!orchestratorAlive) {\n console.log(`[sisyphus] Detected stuck session ${sessionId} on recovery: triggering orchestrator respawn`);\n await onAllAgentsDone(sessionId, cwd, session.tmuxWindowId!);\n }\n }\n }\n } else {\n // Window gone — pause the session so user can `sisyphus resume`\n if (session.status === 'active') {\n await stateModule.updateSessionStatus(cwd, sessionId, 'paused');\n console.log(`[sisyphus] Session ${sessionId} paused: tmux window no longer exists`);\n }\n }\n }\n\n recovered++;\n }\n } catch {\n console.error(`[sisyphus] Failed to read session state for ${sessionId}, skipping`);\n }\n }\n\n console.log(`[sisyphus] Recovered ${recovered} session(s) from registry`);\n}\n\nasync function startDaemon(): Promise<void> {\n console.log('[sisyphus] Starting daemon...');\n ensureDirs();\n\n const config = loadConfig(process.cwd());\n if (config.autoUpdate !== false) {\n await checkAndApply(); // may exit process if update found\n }\n\n acquirePidLock();\n\n setRespawnCallback(onAllAgentsDone);\n\n await startServer();\n startMonitor(config.pollIntervalMs);\n\n await recoverSessions();\n\n const shutdown = async () => {\n console.log('[sisyphus] Shutting down...');\n stopMonitor();\n await stopServer();\n releasePidLock();\n process.exit(0);\n };\n\n process.on('SIGTERM', shutdown);\n process.on('SIGINT', shutdown);\n}\n\nprocess.title = 'sisyphusd';\n\nconst command = process.argv[2];\n\n(async () => {\n switch (command) {\n case 'stop':\n stopDaemon();\n break;\n\n case 'restart': {\n stopDaemon();\n // If launchd is managing the daemon, just exit — it will respawn via KeepAlive\n if (isLaunchdManaged()) {\n // Brief poll so we can report the new PID\n for (let i = 0; i < 6; i++) {\n await sleep(500);\n const respawnedPid = readPid();\n if (respawnedPid) {\n console.log(`[sisyphus] Daemon restarted (pid ${respawnedPid}) by process manager`);\n process.exit(0);\n }\n }\n console.log('[sisyphus] Daemon will be restarted by process manager');\n process.exit(0);\n }\n // No process manager — start in-process\n await startDaemon();\n break;\n }\n\n case 'start':\n case undefined:\n await startDaemon();\n break;\n\n case 'help':\n case '--help':\n case '-h':\n console.log('Usage: sisyphusd [command]');\n console.log('');\n console.log('Commands:');\n console.log(' start Start the daemon (default if no command given)');\n console.log(' stop Stop the running daemon');\n console.log(' restart Stop and restart the daemon');\n console.log(' help Show this help message');\n break;\n\n default:\n console.error(`[sisyphus] Unknown command: ${command}`);\n console.error('Usage: sisyphusd [start|stop|restart|help]');\n process.exit(1);\n }\n})().catch((err) => {\n console.error('[sisyphus] Fatal error:', err);\n process.exit(1);\n});\n","import { readFileSync } from 'node:fs';\nimport { globalConfigPath, projectConfigPath } from './paths.js';\n\nexport interface WorktreeConfig {\n copy?: string[];\n clone?: string[];\n symlink?: string[];\n init?: string;\n}\n\nexport interface Config {\n model?: string;\n tmuxSession?: string;\n orchestratorPrompt?: string;\n pollIntervalMs?: number;\n autoUpdate?: boolean;\n}\n\nconst DEFAULT_CONFIG: Config = {\n pollIntervalMs: 5000,\n};\n\nfunction readJsonFile(filePath: string): Partial<Config> {\n try {\n const content = readFileSync(filePath, 'utf-8');\n return JSON.parse(content) as Partial<Config>;\n } catch {\n return {};\n }\n}\n\nexport function loadConfig(cwd: string): Config {\n const global = readJsonFile(globalConfigPath());\n const project = readJsonFile(projectConfigPath(cwd));\n return { ...DEFAULT_CONFIG, ...global, ...project };\n}\n","import { createServer, type Server } from 'node:net';\nimport { unlinkSync, existsSync, writeFileSync, readFileSync, mkdirSync } from 'node:fs';\nimport { socketPath, globalDir } from '../shared/paths.js';\nimport { join } from 'node:path';\nimport type { Request, Response } from '../shared/protocol.js';\nimport * as sessionManager from './session-manager.js';\nimport { lookupPane, unregisterPane } from './pane-registry.js';\n\nlet server: Server | null = null;\n\n// Track the cwd for each session so we can route requests\nconst sessionCwdMap = new Map<string, string>();\n// Track the originating tmux session for each sisyphus session\nconst sessionTmuxMap = new Map<string, string>();\n// Track the originating tmux window for each sisyphus session\nconst sessionWindowMap = new Map<string, string>();\n\nexport function getSessionCwd(sessionId: string): string | undefined {\n return sessionCwdMap.get(sessionId);\n}\n\nexport function getSessionTmux(sessionId: string): string | undefined {\n return sessionTmuxMap.get(sessionId);\n}\n\nfunction registryPath(): string {\n return join(globalDir(), 'session-registry.json');\n}\n\nfunction persistSessionRegistry(): void {\n const dir = globalDir();\n mkdirSync(dir, { recursive: true });\n const registry: Record<string, string> = {};\n for (const [id, cwd] of sessionCwdMap) {\n registry[id] = cwd;\n }\n writeFileSync(registryPath(), JSON.stringify(registry, null, 2), 'utf-8');\n}\n\nexport function loadSessionRegistry(): Record<string, string> {\n const p = registryPath();\n if (!existsSync(p)) return {};\n try {\n return JSON.parse(readFileSync(p, 'utf-8')) as Record<string, string>;\n } catch {\n return {};\n }\n}\n\nexport function registerSessionCwd(sessionId: string, cwd: string): void {\n sessionCwdMap.set(sessionId, cwd);\n persistSessionRegistry();\n}\n\nexport function registerSessionTmux(sessionId: string, tmuxSession: string, windowId: string): void {\n sessionTmuxMap.set(sessionId, tmuxSession);\n sessionWindowMap.set(sessionId, windowId);\n}\n\nasync function handleRequest(req: Request): Promise<Response> {\n try {\n switch (req.type) {\n case 'start': {\n const session = await sessionManager.startSession(req.task, req.cwd, req.tmuxSession, req.tmuxWindow, req.context);\n registerSessionCwd(session.id, req.cwd);\n sessionTmuxMap.set(session.id, req.tmuxSession);\n sessionWindowMap.set(session.id, req.tmuxWindow);\n return { ok: true, data: { sessionId: session.id } };\n }\n\n case 'spawn': {\n const cwd = sessionCwdMap.get(req.sessionId);\n if (!cwd) return { ok: false, error: `Unknown session: ${req.sessionId}` };\n const result = await sessionManager.handleSpawn(req.sessionId, cwd, req.agentType, req.name, req.instruction, req.worktree);\n return { ok: true, data: { agentId: result.agentId } };\n }\n\n case 'submit': {\n const cwd = sessionCwdMap.get(req.sessionId);\n if (!cwd) return { ok: false, error: `Unknown session: ${req.sessionId}` };\n const windowId = sessionWindowMap.get(req.sessionId);\n if (!windowId) return { ok: false, error: `No tmux window found for session: ${req.sessionId}` };\n await sessionManager.handleSubmit(cwd, req.sessionId, req.agentId, req.report, windowId);\n return { ok: true };\n }\n\n case 'report': {\n const cwd = sessionCwdMap.get(req.sessionId);\n if (!cwd) return { ok: false, error: `Unknown session: ${req.sessionId}` };\n await sessionManager.handleReport(cwd, req.sessionId, req.agentId, req.content);\n return { ok: true };\n }\n\n case 'yield': {\n const cwd = sessionCwdMap.get(req.sessionId);\n if (!cwd) return { ok: false, error: `Unknown session: ${req.sessionId}` };\n await sessionManager.handleYield(req.sessionId, cwd, req.nextPrompt);\n return { ok: true };\n }\n\n case 'complete': {\n const cwd = sessionCwdMap.get(req.sessionId);\n if (!cwd) return { ok: false, error: `Unknown session: ${req.sessionId}` };\n await sessionManager.handleComplete(req.sessionId, cwd, req.report);\n return { ok: true };\n }\n\n case 'status': {\n if (req.sessionId) {\n const cwd = sessionCwdMap.get(req.sessionId);\n if (!cwd) return { ok: false, error: `Unknown session: ${req.sessionId}` };\n const session = sessionManager.getSessionStatus(cwd, req.sessionId);\n return { ok: true, data: { session: session as unknown as Record<string, unknown> } };\n }\n return { ok: true, data: { message: 'daemon running' } };\n }\n\n case 'list': {\n const allSessions: Array<Record<string, unknown>> = [];\n if (req.all) {\n // List sessions across all known cwds\n const seenCwds = new Set<string>();\n for (const cwd of sessionCwdMap.values()) {\n if (seenCwds.has(cwd)) continue;\n seenCwds.add(cwd);\n const sessions = sessionManager.listSessions(cwd);\n allSessions.push(...sessions.map(s => ({ ...s, cwd } as unknown as Record<string, unknown>)));\n }\n } else {\n // List sessions for the requesting cwd only\n const sessions = sessionManager.listSessions(req.cwd);\n allSessions.push(...sessions.map(s => ({ ...s, cwd: req.cwd } as unknown as Record<string, unknown>)));\n // Count total across all cwds for the hint\n let totalCount = allSessions.length;\n const seenCwds = new Set<string>([req.cwd]);\n for (const cwd of sessionCwdMap.values()) {\n if (seenCwds.has(cwd)) continue;\n seenCwds.add(cwd);\n totalCount += sessionManager.listSessions(cwd).length;\n }\n if (totalCount > allSessions.length) {\n return { ok: true, data: { sessions: allSessions, totalCount, filtered: true } };\n }\n }\n return { ok: true, data: { sessions: allSessions } };\n }\n\n case 'resume': {\n let cwd = sessionCwdMap.get(req.sessionId);\n if (!cwd) {\n // Session not in memory — try to recover from disk using the cwd provided by CLI\n const stateFile = `${req.cwd}/.sisyphus/sessions/${req.sessionId}/state.json`;\n if (existsSync(stateFile)) {\n cwd = req.cwd;\n registerSessionCwd(req.sessionId, cwd);\n } else {\n return { ok: false, error: `Unknown session: ${req.sessionId}. No state.json found at ${stateFile}` };\n }\n }\n sessionTmuxMap.set(req.sessionId, req.tmuxSession);\n sessionWindowMap.set(req.sessionId, req.tmuxWindow);\n const session = await sessionManager.resumeSession(req.sessionId, cwd, req.tmuxSession, req.tmuxWindow, req.message);\n return { ok: true, data: { sessionId: session.id, status: session.status } };\n }\n\n case 'register_claude_session': {\n const cwd = sessionCwdMap.get(req.sessionId);\n if (!cwd) return { ok: false, error: `Unknown session: ${req.sessionId}` };\n await sessionManager.handleRegisterClaudeSession(cwd, req.sessionId, req.agentId, req.claudeSessionId);\n return { ok: true };\n }\n\n case 'kill': {\n const cwd = sessionCwdMap.get(req.sessionId);\n if (!cwd) return { ok: false, error: `Unknown session: ${req.sessionId}` };\n const killedAgents = await sessionManager.handleKill(req.sessionId, cwd);\n sessionCwdMap.delete(req.sessionId);\n sessionTmuxMap.delete(req.sessionId);\n sessionWindowMap.delete(req.sessionId);\n persistSessionRegistry();\n return { ok: true, data: { killedAgents, sessionId: req.sessionId } };\n }\n\n case 'pane-exited': {\n const entry = lookupPane(req.paneId);\n if (!entry) return { ok: true }; // Already handled or unknown\n const cwd = sessionCwdMap.get(entry.sessionId);\n if (!cwd) {\n unregisterPane(req.paneId);\n return { ok: true };\n }\n unregisterPane(req.paneId);\n await sessionManager.handlePaneExited(req.paneId, cwd, entry.sessionId, entry.role, entry.agentId);\n return { ok: true };\n }\n\n default:\n return { ok: false, error: `Unknown request type: ${(req as Record<string, unknown>).type}` };\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { ok: false, error: message };\n }\n}\n\nexport function startServer(): Promise<Server> {\n return new Promise((resolve, reject) => {\n const sock = socketPath();\n\n if (existsSync(sock)) {\n unlinkSync(sock);\n }\n\n server = createServer((conn) => {\n let buffer = '';\n\n conn.on('data', (chunk) => {\n buffer += chunk.toString();\n const lines = buffer.split('\\n');\n buffer = lines.pop()!;\n\n for (const line of lines) {\n if (!line.trim()) continue;\n let req: Request;\n try {\n req = JSON.parse(line) as Request;\n } catch {\n conn.write(JSON.stringify({ ok: false, error: 'Invalid JSON' }) + '\\n');\n continue;\n }\n\n handleRequest(req).then((res) => {\n conn.write(JSON.stringify(res) + '\\n');\n });\n }\n });\n\n conn.on('error', (err) => {\n console.error('[sisyphus] Connection error:', err.message);\n });\n });\n\n server.on('error', reject);\n\n server.listen(sock, () => {\n console.log(`[sisyphus] Daemon listening on ${sock}`);\n resolve(server!);\n });\n });\n}\n\nexport function stopServer(): Promise<void> {\n return new Promise((resolve) => {\n if (!server) {\n resolve();\n return;\n }\n server.close(() => {\n const sock = socketPath();\n if (existsSync(sock)) {\n unlinkSync(sock);\n }\n server = null;\n resolve();\n });\n });\n}\n","import { v4 as uuidv4 } from 'uuid';\nimport { existsSync, readdirSync, rmSync } from 'node:fs';\nimport * as state from './state.js';\nimport * as orchestrator from './orchestrator.js';\nimport * as tmux from './tmux.js';\nimport { spawnAgent, resetAgentCounterFromState, clearAgentCounter, handleAgentSubmit, handleAgentReport, handleAgentKilled } from './agent.js';\nimport { trackSession, untrackSession, updateTrackedWindow } from './pane-monitor.js';\nimport { resetColors } from './colors.js';\nimport { sessionDir, sessionsDir } from '../shared/paths.js';\nimport { unregisterSessionPanes } from './pane-registry.js';\nimport type { Session } from '../shared/types.js';\nimport { mergeWorktrees, cleanupWorktree } from './worktree.js';\n\nexport async function startSession(task: string, cwd: string, tmuxSession: string, windowId: string, context?: string): Promise<Session> {\n const sessionId = uuidv4();\n const session = state.createSession(sessionId, task, cwd, context);\n await state.updateSessionTmux(cwd, sessionId, tmuxSession, windowId);\n\n trackSession(sessionId, cwd, tmuxSession);\n await orchestrator.spawnOrchestrator(sessionId, cwd, windowId);\n updateTrackedWindow(sessionId, windowId);\n\n pruneOldSessions(cwd);\n\n return session;\n}\n\nconst PRUNE_KEEP_COUNT = 10;\nconst PRUNE_KEEP_DAYS = 7;\n\nfunction pruneOldSessions(cwd: string): void {\n try {\n const dir = sessionsDir(cwd);\n if (!existsSync(dir)) return;\n\n const entries = readdirSync(dir, { withFileTypes: true });\n const candidates: Array<{ id: string; createdAt: number }> = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n try {\n const session = state.getSession(cwd, entry.name);\n if (session.status === 'active' || session.status === 'paused') continue;\n candidates.push({ id: session.id, createdAt: new Date(session.createdAt).getTime() });\n } catch {\n // Unreadable session dir — skip, don't delete\n }\n }\n\n if (candidates.length <= PRUNE_KEEP_COUNT) return;\n\n candidates.sort((a, b) => b.createdAt - a.createdAt);\n\n const cutoff = Date.now() - PRUNE_KEEP_DAYS * 24 * 60 * 60 * 1000;\n const keep = new Set<string>();\n\n for (let i = 0; i < Math.min(PRUNE_KEEP_COUNT, candidates.length); i++) {\n keep.add(candidates[i]!.id);\n }\n for (const c of candidates) {\n if (c.createdAt >= cutoff) keep.add(c.id);\n }\n\n for (const c of candidates) {\n if (keep.has(c.id)) continue;\n rmSync(sessionDir(cwd, c.id), { recursive: true, force: true });\n }\n } catch (err) {\n console.error('[sisyphus] Session pruning failed:', err);\n }\n}\n\nexport async function resumeSession(sessionId: string, cwd: string, tmuxSession: string, windowId: string, message?: string): Promise<Session> {\n const session = state.getSession(cwd, sessionId);\n\n if (session.status !== 'active') {\n // Determine which agents still have live panes\n const livePaneIds = new Set<string>();\n if (session.tmuxWindowId) {\n const panes = tmux.listPanes(session.tmuxWindowId);\n for (const pane of panes) {\n livePaneIds.add(pane.paneId);\n }\n }\n\n // Mark running agents as \"lost\" only if their pane is gone (or no window ID to check)\n for (const agent of session.agents) {\n if (agent.status === 'running') {\n const isAlive = agent.paneId != null && livePaneIds.has(agent.paneId);\n if (!isAlive) {\n await state.updateAgent(cwd, sessionId, agent.id, {\n status: 'lost',\n completedAt: new Date().toISOString(),\n killedReason: 'session resumed — agent was still running',\n });\n }\n }\n }\n }\n\n await state.updateSessionStatus(cwd, sessionId, 'active');\n await state.updateSessionTmux(cwd, sessionId, tmuxSession, windowId);\n\n // Reset counters based on existing agents\n resetAgentCounterFromState(sessionId, session.agents);\n resetColors(sessionId);\n\n trackSession(sessionId, cwd, tmuxSession);\n await orchestrator.spawnOrchestrator(sessionId, cwd, windowId, message);\n updateTrackedWindow(sessionId, windowId);\n\n return state.getSession(cwd, sessionId);\n}\n\nexport function getSessionStatus(cwd: string, sessionId: string): Session {\n return state.getSession(cwd, sessionId);\n}\n\nexport function listSessions(cwd: string): Array<{ id: string; task: string; status: string; createdAt: string; agentCount: number }> {\n const dir = sessionsDir(cwd);\n if (!existsSync(dir)) return [];\n\n const entries = readdirSync(dir, { withFileTypes: true });\n const sessions: Array<{ id: string; task: string; status: string; createdAt: string; agentCount: number }> = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n try {\n const session = state.getSession(cwd, entry.name);\n sessions.push({\n id: session.id,\n task: session.task,\n status: session.status,\n createdAt: session.createdAt,\n agentCount: session.agents.length,\n });\n } catch (err) {\n console.error(`[sisyphus] Failed to read session ${entry.name}:`, err);\n }\n }\n\n return sessions;\n}\n\nconst pendingRespawns = new Set<string>();\n\nexport function onAllAgentsDone(sessionId: string, cwd: string, windowId: string): void {\n if (pendingRespawns.has(sessionId)) return;\n\n const session = state.getSession(cwd, sessionId);\n if (session.status !== 'active') return;\n\n pendingRespawns.add(sessionId);\n\n // Merge any worktree agents before respawning orchestrator\n const worktreeAgents = session.agents.filter(a => a.worktreePath && a.mergeStatus === 'pending');\n if (worktreeAgents.length > 0) {\n const results = mergeWorktrees(cwd, worktreeAgents);\n for (const result of results) {\n const mergeStatus = result.status as 'merged' | 'no-changes' | 'conflict';\n state.updateAgent(cwd, sessionId, result.agentId, {\n mergeStatus,\n mergeDetails: result.conflictDetails,\n }).catch((err: unknown) => console.error(`[sisyphus] Failed to update merge status for ${result.agentId}:`, err));\n }\n }\n\n // Respawn on next tick — agents already finished, no delay needed\n setImmediate(() => {\n pendingRespawns.delete(sessionId);\n orchestrator.spawnOrchestrator(sessionId, cwd, windowId)\n .then(() => updateTrackedWindow(sessionId, windowId))\n .catch((err: unknown) => console.error(`[sisyphus] Failed to respawn orchestrator for session ${sessionId}:`, err));\n });\n}\n\nexport async function handleSpawn(\n sessionId: string,\n cwd: string,\n agentType: string,\n name: string,\n instruction: string,\n worktree?: boolean,\n): Promise<{ agentId: string }> {\n const windowId = orchestrator.getWindowId(sessionId);\n if (!windowId) throw new Error(`No tmux window found for session ${sessionId}`);\n\n // Re-activate completed sessions so the cycle can resume\n const session = state.getSession(cwd, sessionId);\n if (session.status === 'completed') {\n await state.updateSessionStatus(cwd, sessionId, 'active');\n trackSession(sessionId, cwd, session.tmuxSessionName!);\n }\n\n const agent = await spawnAgent({\n sessionId,\n cwd,\n agentType,\n name,\n instruction,\n windowId,\n worktree,\n });\n\n await state.appendAgentToLastCycle(cwd, sessionId, agent.id);\n\n return { agentId: agent.id };\n}\n\nexport async function handleSubmit(cwd: string, sessionId: string, agentId: string, report: string, windowId: string): Promise<void> {\n const allDone = await handleAgentSubmit(cwd, sessionId, agentId, report);\n if (allDone) {\n onAllAgentsDone(sessionId, cwd, windowId);\n }\n}\n\nexport async function handleReport(cwd: string, sessionId: string, agentId: string, content: string): Promise<void> {\n await handleAgentReport(cwd, sessionId, agentId, content);\n}\n\nexport async function handleYield(sessionId: string, cwd: string, nextPrompt?: string): Promise<void> {\n // Re-activate paused sessions so respawn can proceed\n const pre = state.getSession(cwd, sessionId);\n if (pre.status === 'paused') {\n await state.updateSessionStatus(cwd, sessionId, 'active');\n }\n\n await orchestrator.handleOrchestratorYield(sessionId, cwd, nextPrompt);\n\n const session = state.getSession(cwd, sessionId);\n const hasRunningAgents = session.agents.some(a => a.status === 'running');\n if (!hasRunningAgents) {\n const windowId = orchestrator.getWindowId(sessionId);\n if (windowId) {\n onAllAgentsDone(sessionId, cwd, windowId);\n }\n }\n}\n\nexport async function handleComplete(sessionId: string, cwd: string, report: string): Promise<void> {\n await orchestrator.handleOrchestratorComplete(sessionId, cwd, report);\n}\n\nexport async function handleRegisterClaudeSession(\n cwd: string,\n sessionId: string,\n agentId: string,\n claudeSessionId: string,\n): Promise<void> {\n await state.updateAgent(cwd, sessionId, agentId, { claudeSessionId });\n}\n\nexport async function handleKill(sessionId: string, cwd: string): Promise<number> {\n const session = state.getSession(cwd, sessionId);\n const windowId = orchestrator.getWindowId(sessionId);\n\n // Kill all running agents\n let killedAgents = 0;\n for (const agent of session.agents) {\n if (agent.status === 'running') {\n await state.updateAgent(cwd, sessionId, agent.id, {\n status: 'killed',\n killedReason: 'session killed by user',\n completedAt: new Date().toISOString(),\n });\n killedAgents++;\n }\n }\n\n // Clean up worktrees for agents that had them\n for (const agent of session.agents) {\n if (agent.worktreePath && agent.branchName) {\n cleanupWorktree(cwd, agent.worktreePath, agent.branchName);\n }\n }\n\n // Kill the orchestrator pane if it exists\n const orchPaneId = orchestrator.getOrchestratorPaneId(sessionId);\n if (orchPaneId) {\n tmux.killPane(orchPaneId);\n }\n\n // Mark session as completed\n await state.updateSessionStatus(cwd, sessionId, 'completed');\n\n // Untrack from pane monitor and pane registry\n untrackSession(sessionId);\n unregisterSessionPanes(sessionId);\n\n // Kill the entire tmux window\n if (windowId) {\n tmux.killWindow(windowId);\n }\n\n // Clean up agent counter\n clearAgentCounter(sessionId);\n\n return killedAgents;\n}\n\nexport async function handlePaneExited(\n paneId: string,\n cwd: string,\n sessionId: string,\n role: 'orchestrator' | 'agent',\n agentId?: string,\n): Promise<void> {\n const session = state.getSession(cwd, sessionId);\n if (session.status !== 'active') return;\n\n if (role === 'agent' && agentId) {\n const agent = session.agents.find(a => a.id === agentId);\n if (!agent || agent.status !== 'running') return;\n\n const allDone = await handleAgentKilled(cwd, sessionId, agentId, 'pane exited');\n if (allDone) {\n const windowId = orchestrator.getWindowId(sessionId);\n if (windowId) {\n onAllAgentsDone(sessionId, cwd, windowId);\n }\n }\n } else if (role === 'orchestrator') {\n // Orchestrator pane exited unexpectedly (crash, context exhaustion, /exit)\n const hasRunningAgents = session.agents.some(a => a.status === 'running');\n if (!hasRunningAgents && session.agents.length > 0) {\n const windowId = orchestrator.getWindowId(sessionId);\n if (windowId) {\n console.log(`[sisyphus] Orchestrator pane exited for session ${sessionId}, all agents done — triggering respawn`);\n onAllAgentsDone(sessionId, cwd, windowId);\n }\n } else if (!hasRunningAgents) {\n // No agents at all — pause session\n await state.updateSessionStatus(cwd, sessionId, 'paused');\n console.log(`[sisyphus] Session ${sessionId} paused: orchestrator pane exited with no agents`);\n }\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { contextDir, logsPath, planPath, promptsDir, sessionDir, statePath } from '../shared/paths.js';\nimport type { Agent, AgentReport, OrchestratorCycle, Session, SessionStatus } from '../shared/types.js';\n\nconst PLAN_SEED = `---\ndescription: >\n Living document of what still needs to happen. Write out ne\n---\n`;\n\nconst LOGS_SEED = `---\ndescription: >\n Session memory. Record important observations, decisions, and findings here.\n This is your persistent memory across cycles: things you tried, what\n worked/failed, design decisions and their rationale, gotchas discovered during\n implementation.\n---\n`;\n\nconst CONTEXT_CLAUDE_MD = `# context/\n\nAgents save exploration findings, architectural notes, and reference material here for use across cycles.\n`;\n\n// Per-session mutex to prevent read-modify-write races\nconst sessionLocks = new Map<string, Promise<void>>();\n\nasync function withSessionLock<T>(sessionId: string, fn: () => T): Promise<T> {\n const prev = sessionLocks.get(sessionId) ?? Promise.resolve();\n let resolve: () => void;\n const next = new Promise<void>(r => { resolve = r; });\n sessionLocks.set(sessionId, next);\n await prev;\n try {\n return fn();\n } finally {\n resolve!();\n }\n}\n\nfunction atomicWrite(filePath: string, data: string): void {\n const dir = dirname(filePath);\n const tmpPath = join(dir, `.state.${randomUUID()}.tmp`);\n writeFileSync(tmpPath, data, 'utf-8');\n renameSync(tmpPath, filePath);\n}\n\nexport function createSession(id: string, task: string, cwd: string, context?: string): Session {\n const dir = sessionDir(cwd, id);\n mkdirSync(dir, { recursive: true });\n mkdirSync(contextDir(cwd, id), { recursive: true });\n mkdirSync(promptsDir(cwd, id), { recursive: true });\n\n writeFileSync(planPath(cwd, id), PLAN_SEED, 'utf-8');\n writeFileSync(logsPath(cwd, id), LOGS_SEED, 'utf-8');\n writeFileSync(join(contextDir(cwd, id), 'CLAUDE.md'), CONTEXT_CLAUDE_MD, 'utf-8');\n\n const session: Session = {\n id,\n task,\n ...(context ? { context } : {}),\n cwd,\n status: 'active',\n createdAt: new Date().toISOString(),\n agents: [],\n orchestratorCycles: [],\n };\n\n atomicWrite(statePath(cwd, id), JSON.stringify(session, null, 2));\n return session;\n}\n\nexport function getSession(cwd: string, sessionId: string): Session {\n const content = readFileSync(statePath(cwd, sessionId), 'utf-8');\n return JSON.parse(content) as Session;\n}\n\nfunction saveSession(session: Session): void {\n atomicWrite(statePath(session.cwd, session.id), JSON.stringify(session, null, 2));\n}\n\nexport async function addAgent(cwd: string, sessionId: string, agent: Agent): Promise<void> {\n return withSessionLock(sessionId, () => {\n const session = getSession(cwd, sessionId);\n session.agents.push(agent);\n saveSession(session);\n });\n}\n\nexport async function updateAgent(cwd: string, sessionId: string, agentId: string, updates: Partial<Agent>): Promise<void> {\n return withSessionLock(sessionId, () => {\n const session = getSession(cwd, sessionId);\n const agent = session.agents.slice().reverse().find((a: Agent) => a.id === agentId);\n if (!agent) throw new Error(`Agent ${agentId} not found in session ${sessionId}`);\n Object.assign(agent, updates);\n saveSession(session);\n });\n}\n\nexport async function addOrchestratorCycle(cwd: string, sessionId: string, cycle: OrchestratorCycle): Promise<void> {\n return withSessionLock(sessionId, () => {\n const session = getSession(cwd, sessionId);\n session.orchestratorCycles.push(cycle);\n saveSession(session);\n });\n}\n\nexport async function updateSessionStatus(cwd: string, sessionId: string, status: SessionStatus, completionReport?: string): Promise<void> {\n return withSessionLock(sessionId, () => {\n const session = getSession(cwd, sessionId);\n session.status = status;\n if (completionReport !== undefined) {\n session.completionReport = completionReport;\n }\n saveSession(session);\n });\n}\n\nexport async function appendAgentToLastCycle(cwd: string, sessionId: string, agentId: string): Promise<void> {\n return withSessionLock(sessionId, () => {\n const session = getSession(cwd, sessionId);\n const cycles = session.orchestratorCycles;\n if (cycles.length === 0) return;\n cycles[cycles.length - 1]!.agentsSpawned.push(agentId);\n saveSession(session);\n });\n}\n\nexport async function completeSession(cwd: string, sessionId: string, report: string): Promise<void> {\n return withSessionLock(sessionId, () => {\n const session = getSession(cwd, sessionId);\n session.status = 'completed';\n session.completedAt = new Date().toISOString();\n session.completionReport = report;\n saveSession(session);\n });\n}\n\nexport async function appendAgentReport(cwd: string, sessionId: string, agentId: string, entry: AgentReport): Promise<void> {\n return withSessionLock(sessionId, () => {\n const session = getSession(cwd, sessionId);\n const agent = session.agents.slice().reverse().find((a: Agent) => a.id === agentId);\n if (!agent) throw new Error(`Agent ${agentId} not found in session ${sessionId}`);\n agent.reports.push(entry);\n saveSession(session);\n });\n}\n\nexport async function updateSessionTmux(cwd: string, sessionId: string, tmuxSessionName: string, tmuxWindowId: string): Promise<void> {\n return withSessionLock(sessionId, () => {\n const session = getSession(cwd, sessionId);\n session.tmuxSessionName = tmuxSessionName;\n session.tmuxWindowId = tmuxWindowId;\n saveSession(session);\n });\n}\n\nexport async function completeOrchestratorCycle(cwd: string, sessionId: string, nextPrompt?: string): Promise<void> {\n return withSessionLock(sessionId, () => {\n const session = getSession(cwd, sessionId);\n const cycles = session.orchestratorCycles;\n if (cycles.length === 0) return;\n const cycle = cycles[cycles.length - 1]!;\n cycle.completedAt = new Date().toISOString();\n if (nextPrompt) cycle.nextPrompt = nextPrompt;\n saveSession(session);\n });\n}\n","import { existsSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { contextDir, logsPath, planPath, projectOrchestratorPromptPath, promptsDir, worktreeConfigPath } from '../shared/paths.js';\nimport type { Agent, Session } from '../shared/types.js';\nimport { ORCHESTRATOR_COLOR } from './colors.js';\nimport * as state from './state.js';\nimport * as tmux from './tmux.js';\nimport { registerPane, unregisterPane, unregisterSessionPanes } from './pane-registry.js';\n\nfunction shellQuote(s: string): string {\n return `'${s.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nconst sessionWindowMap = new Map<string, string>();\nconst sessionOrchestratorPane = new Map<string, string>();\n\nexport function getWindowId(sessionId: string): string | undefined {\n return sessionWindowMap.get(sessionId);\n}\n\nexport function setWindowId(sessionId: string, windowId: string): void {\n sessionWindowMap.set(sessionId, windowId);\n}\n\nexport function getOrchestratorPaneId(sessionId: string): string | undefined {\n return sessionOrchestratorPane.get(sessionId);\n}\n\nexport function setOrchestratorPaneId(sessionId: string, paneId: string): void {\n sessionOrchestratorPane.set(sessionId, paneId);\n}\n\nfunction loadOrchestratorPrompt(cwd: string): string {\n const projectPath = projectOrchestratorPromptPath(cwd);\n if (existsSync(projectPath)) {\n return readFileSync(projectPath, 'utf-8');\n }\n const bundledPath = resolve(import.meta.dirname, '../templates/orchestrator.md');\n return readFileSync(bundledPath, 'utf-8');\n}\n\nfunction formatStateForOrchestrator(session: Session): string {\n const shortId = session.id.slice(0, 8);\n const cycleNum = session.orchestratorCycles.length;\n\n const ctxDir = contextDir(session.cwd, session.id);\n let contextLines: string;\n if (existsSync(ctxDir)) {\n const files = readdirSync(ctxDir);\n contextLines = files.length > 0 ? files.map(f => `- ${f}`).join('\\n') : ' (none)';\n } else {\n contextLines = ' (none)';\n }\n\n const planFile = planPath(session.cwd, session.id);\n const planRef = existsSync(planFile) ? `@${planFile}` : '(empty)';\n\n const logsFile = logsPath(session.cwd, session.id);\n const logsRef = existsSync(logsFile) ? `@${logsFile}` : '(empty)';\n\n const agentLines = session.agents.length > 0\n ? session.agents.map((a: Agent) => {\n const header = `- ${a.id} (${a.name}): ${a.status} — ${a.reports.length} report(s)`;\n if (a.reports.length === 0) return header;\n let updateNum = 0;\n const reportLines = a.reports.map(r => {\n const label = r.type === 'final' ? '[final]' : `[update ${String(++updateNum).padStart(3, '0')}]`;\n return ` ${label} \"${r.summary}\" → ${r.filePath}`;\n });\n return [header, ...reportLines].join('\\n');\n }).join('\\n')\n : ' (none)';\n\n const cycleLines = session.orchestratorCycles.length > 0\n ? session.orchestratorCycles.map(c => {\n const spawnedList = c.agentsSpawned.length > 0 ? c.agentsSpawned.join(', ') : '(none)';\n return `Cycle ${c.cycle}: Spawned ${spawnedList}`;\n }).join('\\n')\n : ' (none)';\n\n // Worktree status — only if any agents have worktree info\n const worktreeAgents = session.agents.filter(a => a.worktreePath);\n let worktreeSection = '';\n if (worktreeAgents.length > 0) {\n const wtLines = worktreeAgents.map((a: Agent) => {\n if (a.mergeStatus === 'conflict') {\n return `- ${a.id}: CONFLICT — ${a.mergeDetails ?? 'unknown'}\\n Branch: ${a.branchName}\\n Worktree: ${a.worktreePath}`;\n }\n if (a.mergeStatus === 'no-changes') {\n return `- ${a.id}: NO CHANGES — agent did not commit any work to branch ${a.branchName}`;\n }\n const status = a.mergeStatus ?? 'pending';\n return `- ${a.id}: ${status} (branch ${a.branchName})`;\n }).join('\\n');\n worktreeSection = `\\n\\n## Worktrees\\n${wtLines}`;\n }\n\n // Worktree hint\n const worktreeHint = existsSync(worktreeConfigPath(session.cwd))\n ? 'Worktree config active (`.sisyphus/worktree.json`). Use `--worktree` flag with `sisyphus spawn` to isolate agents in their own worktrees. Recommended for feature work, especially with potential file overlap.'\n : 'No worktree configuration found. If this session involves parallel work where agents may edit overlapping files, use the `git-management` skill to set up `.sisyphus/worktree.json` and enable worktree isolation.';\n\n const contextSection = session.context\n ? `\\n## Background Context\\n${session.context}\\n`\n : '';\n\n return `<state>\nsession: ${shortId} (cycle ${cycleNum})\ntask: ${session.task}\nstatus: ${session.status}\n${contextSection}\n## Plan\n${planRef}\n\n## Logs\n${logsRef}\n\n## Agents\n${agentLines}${worktreeSection}\n\n## Previous Cycles\n${cycleLines}\n\n## Context Files\n${contextLines}\n\n## Git Worktrees\n${worktreeHint}\n</state>`;\n}\n\nexport async function spawnOrchestrator(sessionId: string, cwd: string, windowId: string, message?: string): Promise<void> {\n const session = state.getSession(cwd, sessionId);\n const basePrompt = loadOrchestratorPrompt(cwd);\n const formattedState = formatStateForOrchestrator(session);\n\n // System prompt: template only (no state)\n const cycleNum = session.orchestratorCycles.length + 1;\n const promptFilePath = `${promptsDir(cwd, sessionId)}/orchestrator-system-${cycleNum}.md`;\n writeFileSync(promptFilePath, basePrompt, 'utf-8');\n\n sessionWindowMap.set(sessionId, windowId);\n\n const envExports = [\n `export SISYPHUS_SESSION_ID='${sessionId}'`,\n `export SISYPHUS_AGENT_ID='orchestrator'`,\n ].join(' && ');\n\n // User message: state block + contextual prompt\n let userPrompt: string;\n if (message) {\n userPrompt = `${formattedState}\\n\\nThe user resumed this session with new instructions: ${message}`;\n } else {\n // Check last completed cycle for a stored nextPrompt\n const lastCycle = [...session.orchestratorCycles].reverse().find(c => c.completedAt);\n const storedPrompt = lastCycle?.nextPrompt;\n if (storedPrompt) {\n userPrompt = `${formattedState}\\n\\n${storedPrompt}`;\n } else {\n userPrompt = `${formattedState}\\n\\nReview the current session and delegate the next cycle of work.`;\n }\n }\n\n const userPromptFilePath = `${promptsDir(cwd, sessionId)}/orchestrator-user-${cycleNum}.md`;\n writeFileSync(userPromptFilePath, userPrompt, 'utf-8');\n const pluginPath = resolve(import.meta.dirname, '../templates/orchestrator-plugin');\n const settingsPath = resolve(import.meta.dirname, '../templates/orchestrator-settings.json');\n const claudeCmd = `claude --dangerously-skip-permissions --settings \"${settingsPath}\" --plugin-dir \"${pluginPath}\" --append-system-prompt \"$(cat '${promptFilePath}')\" \"$(cat '${userPromptFilePath}')\"`;\n\n const paneId = tmux.createPane(windowId, cwd, 'left');\n\n sessionOrchestratorPane.set(sessionId, paneId);\n registerPane(paneId, sessionId, 'orchestrator');\n tmux.setPaneTitle(paneId, `Sisyphus`);\n tmux.setPaneStyle(paneId, ORCHESTRATOR_COLOR);\n\n const bannerPath = resolve(import.meta.dirname, '../templates/banner.txt');\n const bannerCmd = existsSync(bannerPath) ? `cat '${bannerPath}' &&` : '';\n const notifyCmd = `sisyphus notify pane-exited --pane-id ${paneId}`;\n tmux.sendKeys(paneId, `${bannerCmd} ${envExports} && ${claudeCmd}; ${notifyCmd}`);\n\n await state.addOrchestratorCycle(cwd, sessionId, {\n cycle: cycleNum,\n timestamp: new Date().toISOString(),\n agentsSpawned: [],\n paneId,\n });\n}\n\nfunction resolveOrchestratorPane(sessionId: string, cwd: string): string | undefined {\n const memPane = sessionOrchestratorPane.get(sessionId);\n if (memPane) return memPane;\n const session = state.getSession(cwd, sessionId);\n const lastCycle = session.orchestratorCycles[session.orchestratorCycles.length - 1];\n return lastCycle?.paneId ?? undefined;\n}\n\nexport async function handleOrchestratorYield(sessionId: string, cwd: string, nextPrompt?: string): Promise<void> {\n const paneId = resolveOrchestratorPane(sessionId, cwd);\n if (paneId) {\n tmux.killPane(paneId);\n unregisterPane(paneId);\n sessionOrchestratorPane.delete(sessionId);\n }\n\n const windowId = sessionWindowMap.get(sessionId);\n if (windowId) tmux.selectLayout(windowId);\n\n await state.completeOrchestratorCycle(cwd, sessionId, nextPrompt);\n\n const session = state.getSession(cwd, sessionId);\n const runningAgents = session.agents.filter(a => a.status === 'running');\n if (runningAgents.length === 0) {\n console.log(`[sisyphus] Orchestrator yielded with no running agents for session ${sessionId}`);\n }\n}\n\nexport async function handleOrchestratorComplete(sessionId: string, cwd: string, report: string): Promise<void> {\n await state.completeOrchestratorCycle(cwd, sessionId);\n await state.completeSession(cwd, sessionId, report);\n\n console.log(`[sisyphus] Session ${sessionId} completed: ${report}`);\n}\n\nexport function cleanupSessionMaps(sessionId: string): void {\n sessionOrchestratorPane.delete(sessionId);\n sessionWindowMap.delete(sessionId);\n unregisterSessionPanes(sessionId);\n}\n","export const ORCHESTRATOR_COLOR = 'yellow';\n\nconst AGENT_PALETTE = ['blue', 'green', 'magenta', 'cyan', 'red', 'white'] as const;\n\nconst TMUX_COLOR_MAP: Record<string, string> = {\n orange: 'colour208',\n teal: 'colour6',\n};\n\nexport function normalizeTmuxColor(color: string): string {\n return TMUX_COLOR_MAP[color] ?? color;\n}\n\nconst sessionColorIndex = new Map<string, number>();\n\nexport function getNextColor(sessionId: string): string {\n const idx = sessionColorIndex.get(sessionId) ?? 0;\n const color = AGENT_PALETTE[idx % AGENT_PALETTE.length]!;\n sessionColorIndex.set(sessionId, idx + 1);\n return color;\n}\n\nexport function resetColors(sessionId: string): void {\n sessionColorIndex.delete(sessionId);\n}\n\n","import { execSync } from 'node:child_process';\n\nconst EXEC_ENV = {\n ...process.env,\n PATH: `/opt/homebrew/bin:/usr/local/bin:${process.env['PATH'] ?? '/usr/bin:/bin'}`,\n};\n\nfunction exec(cmd: string): string {\n return execSync(cmd, { encoding: 'utf-8', env: EXEC_ENV }).trim();\n}\n\nfunction execSafe(cmd: string): string | null {\n try {\n return exec(cmd);\n } catch {\n return null;\n }\n}\n\nexport function getCurrentTmuxSession(): string {\n const tmuxEnv = process.env['TMUX'];\n if (!tmuxEnv) throw new Error('Not running inside tmux');\n return exec('tmux display-message -p \"#{session_name}\"');\n}\n\nexport function createWindow(sessionName: string, windowName: string, cwd?: string): string {\n const cwdFlag = cwd ? ` -c ${shellQuote(cwd)}` : '';\n exec(`tmux new-window -t \"${sessionName}\" -n \"${windowName}\"${cwdFlag} -P -F \"#{window_id}\"`);\n return exec(`tmux display-message -t \"${sessionName}:${windowName}\" -p \"#{window_id}\"`);\n}\n\nexport function createPane(windowTarget: string, cwd?: string, position: 'left' | 'right' = 'right'): string {\n const cwdFlag = cwd ? ` -c ${shellQuote(cwd)}` : '';\n // Target the first/last pane in the window to ensure absolute left/right placement\n const panes = listPanes(windowTarget);\n const target = position === 'left' ? panes[0]?.paneId : panes[panes.length - 1]?.paneId;\n const targetFlag = target ? ` -t \"${target}\"` : ` -t \"${windowTarget}\"`;\n const beforeFlag = position === 'left' ? 'b' : '';\n const paneId = exec(`tmux split-window -h${beforeFlag}${targetFlag}${cwdFlag} -P -F \"#{pane_id}\"`);\n execSafe(`tmux select-layout -t \"${windowTarget}\" even-horizontal`);\n return paneId;\n}\n\nexport function sendKeys(paneTarget: string, command: string): void {\n exec(`tmux send-keys -t \"${paneTarget}\" ${shellQuote(command)} Enter`);\n}\n\nexport function killPane(paneTarget: string): void {\n execSafe(`tmux kill-pane -t \"${paneTarget}\"`);\n}\n\nexport function killWindow(windowTarget: string): void {\n execSafe(`tmux kill-window -t \"${windowTarget}\"`);\n}\n\nexport interface PaneInfo {\n paneId: string;\n panePid: string;\n}\n\nexport function listPanes(windowTarget: string): PaneInfo[] {\n const output = execSafe(`tmux list-panes -t \"${windowTarget}\" -F \"#{pane_id} #{pane_pid}\"`);\n if (!output) return [];\n return output\n .split('\\n')\n .filter(Boolean)\n .map(line => {\n const [paneId, panePid] = line.split(' ');\n return { paneId: paneId!, panePid: panePid! };\n });\n}\n\nexport function setPaneTitle(paneTarget: string, title: string): void {\n execSafe(`tmux select-pane -t \"${paneTarget}\" -T ${shellQuote(title)}`);\n}\n\nexport function setPaneStyle(paneTarget: string, color: string): void {\n const fmt = `#[fg=${color},bold] #{pane_title} #[fg=${color}]#{pane_current_path} #[default]`;\n execSafe(`tmux set -p -t \"${paneTarget}\" pane-border-format ${shellQuote(fmt)}`);\n // Store color as a per-pane user variable. The window-level border styles use a\n // format string that resolves #{@pane_color} per-pane at render time, giving each\n // pane its own border color (pane-border-style itself is window-level / last-write-wins).\n execSafe(`tmux set -p -t \"${paneTarget}\" @pane_color \"${color}\"`);\n execSafe(`tmux set -w -t \"${paneTarget}\" pane-border-style \"fg=#{?#{@pane_color},#{@pane_color},default}\"`);\n execSafe(`tmux set -w -t \"${paneTarget}\" pane-active-border-style \"fg=#{?#{@pane_color},#{@pane_color},default}\"`);\n}\n\nexport function sendSignal(paneTarget: string, signal: string): void {\n const info = execSafe(`tmux list-panes -t \"${paneTarget}\" -F \"#{pane_pid}\"`);\n if (!info) return;\n const pid = info.split('\\n')[0]?.trim();\n if (pid) {\n execSafe(`kill -${signal} ${pid}`);\n }\n}\n\nexport function selectLayout(windowTarget: string, layout: string = 'even-horizontal'): void {\n execSafe(`tmux select-layout -t \"${windowTarget}\" ${layout}`);\n}\n\nfunction shellQuote(s: string): string {\n return `'${s.replace(/'/g, \"'\\\\''\")}'`;\n}\n","type PaneEntry = {\n sessionId: string;\n role: 'orchestrator' | 'agent';\n agentId?: string;\n};\n\nconst paneMap = new Map<string, PaneEntry>();\n\nexport function registerPane(paneId: string, sessionId: string, role: 'orchestrator' | 'agent', agentId?: string): void {\n paneMap.set(paneId, { sessionId, role, agentId });\n}\n\nexport function unregisterPane(paneId: string): void {\n paneMap.delete(paneId);\n}\n\nexport function unregisterAgentPane(sessionId: string, agentId: string): void {\n for (const [paneId, entry] of paneMap) {\n if (entry.sessionId === sessionId && entry.agentId === agentId) {\n paneMap.delete(paneId);\n return;\n }\n }\n}\n\nexport function unregisterSessionPanes(sessionId: string): void {\n for (const [paneId, entry] of paneMap) {\n if (entry.sessionId === sessionId) {\n paneMap.delete(paneId);\n }\n }\n}\n\nexport function lookupPane(paneId: string): PaneEntry | undefined {\n return paneMap.get(paneId);\n}\n","import { readFileSync, writeFileSync, mkdirSync, readdirSync, existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { Agent, AgentReport } from '../shared/types.js';\nimport * as state from './state.js';\nimport * as tmux from './tmux.js';\nimport { getNextColor, normalizeTmuxColor } from './colors.js';\nimport { getWindowId } from './orchestrator.js';\nimport { promptsDir, reportsDir, reportFilePath } from '../shared/paths.js';\nimport { createWorktreeShell, bootstrapWorktree, loadWorktreeConfig, countWorktreeAgents } from './worktree.js';\nimport { registerPane, unregisterPane, unregisterAgentPane } from './pane-registry.js';\nimport { resolveAgentConfig, detectProvider } from './frontmatter.js';\n\nconst agentCounters = new Map<string, number>();\n\nexport function resetAgentCounter(sessionId: string, value: number = 0): void {\n agentCounters.set(sessionId, value);\n}\n\nexport function resetAgentCounterFromState(sessionId: string, agents: { id: string }[]): void {\n let max = 0;\n for (const a of agents) {\n const match = a.id.match(/^agent-(\\d+)$/);\n if (match) max = Math.max(max, parseInt(match[1]!, 10));\n }\n agentCounters.set(sessionId, max);\n}\n\nexport function clearAgentCounter(sessionId: string): void {\n agentCounters.delete(sessionId);\n}\n\ninterface WorktreeContext {\n offset: number;\n total: number;\n branchName: string;\n}\n\nfunction renderAgentSuffix(sessionId: string, instruction: string, worktreeContext?: WorktreeContext): string {\n const templatePath = resolve(import.meta.dirname, '../templates/agent-suffix.md');\n let template: string;\n try {\n template = readFileSync(templatePath, 'utf-8');\n } catch {\n template = `# Sisyphus Agent\\nSession: {{SESSION_ID}}\\nTask: {{INSTRUCTION}}`;\n }\n\n let worktreeBlock = '';\n if (worktreeContext) {\n worktreeBlock = [\n '## Worktree Context',\n `You are working in an isolated git worktree on branch \\`${worktreeContext.branchName}\\`.`,\n `If you start any services that require ports, add ${worktreeContext.offset} to the default port.`,\n ].join('\\n');\n }\n\n return template\n .replace(/\\{\\{SESSION_ID\\}\\}/g, sessionId)\n .replace(/\\{\\{INSTRUCTION\\}\\}/g, instruction)\n .replace(/\\{\\{WORKTREE_CONTEXT\\}\\}/g, worktreeBlock);\n}\n\nexport interface SpawnAgentOpts {\n sessionId: string;\n cwd: string;\n agentType: string;\n name: string;\n instruction: string;\n windowId: string;\n worktree?: boolean;\n}\n\nexport async function spawnAgent(opts: SpawnAgentOpts): Promise<Agent> {\n const { sessionId, cwd, agentType, name, instruction, windowId } = opts;\n const count = (agentCounters.get(sessionId) ?? 0) + 1;\n agentCounters.set(sessionId, count);\n const agentId = `agent-${String(count).padStart(3, '0')}`;\n const pluginPath = resolve(import.meta.dirname, '../templates/agent-plugin');\n\n // Resolve agent config for frontmatter (color, model, provider)\n const agentConfig = resolveAgentConfig(agentType, pluginPath, cwd);\n const provider = detectProvider(agentConfig?.frontmatter.model);\n const color = (agentConfig?.frontmatter.color ? normalizeTmuxColor(agentConfig.frontmatter.color) : null) ?? getNextColor(sessionId);\n\n let paneCwd = cwd;\n let worktreePath: string | undefined;\n let branchName: string | undefined;\n let worktreeContext: WorktreeContext | undefined;\n\n if (opts.worktree) {\n // Fast: git branch + worktree add + symlinks only (no bootstrap/init)\n const wt = createWorktreeShell(cwd, sessionId, agentId);\n worktreePath = wt.worktreePath;\n branchName = wt.branchName;\n paneCwd = worktreePath;\n\n const session = state.getSession(cwd, sessionId);\n const portOffset = countWorktreeAgents(session.agents) + 1;\n worktreeContext = { offset: portOffset, total: portOffset, branchName };\n }\n\n const paneId = tmux.createPane(windowId, paneCwd);\n registerPane(paneId, sessionId, 'agent', agentId);\n const shortType = agentType && agentType !== 'worker'\n ? agentType.replace(/^sisyphus:/, '')\n : '';\n const paneLabel = shortType ? `${name}-${shortType}` : name;\n tmux.setPaneTitle(paneId, `${paneLabel} (${agentId})`);\n tmux.setPaneStyle(paneId, color);\n\n const suffix = renderAgentSuffix(sessionId, instruction, worktreeContext);\n const suffixFilePath = `${promptsDir(cwd, sessionId)}/${agentId}-system.md`;\n writeFileSync(suffixFilePath, suffix, 'utf-8');\n\n const bannerPath = resolve(import.meta.dirname, '../templates/banner.txt');\n const bannerCmd = existsSync(bannerPath) ? `cat '${bannerPath}' &&` : '';\n\n const envExports = [\n `export SISYPHUS_SESSION_ID='${sessionId}'`,\n `export SISYPHUS_AGENT_ID='${agentId}'`,\n ...(worktreeContext ? [`export SISYPHUS_PORT_OFFSET='${worktreeContext.offset}'`] : []),\n ].join(' && ');\n\n const notifyCmd = `sisyphus notify pane-exited --pane-id ${paneId}`;\n\n let mainCmd: string;\n\n if (provider === 'openai') {\n // Build combined prompt for codex\n const codexPromptPath = `${promptsDir(cwd, sessionId)}/${agentId}-codex-prompt.md`;\n const parts: string[] = [];\n\n // 1. Agent type body (stripped of frontmatter)\n if (agentConfig?.body) {\n parts.push(agentConfig.body);\n }\n\n // 2. Rendered agent-suffix template\n parts.push(suffix);\n\n // 3. The instruction itself\n parts.push(`## Task\\n\\n${instruction}`);\n\n writeFileSync(codexPromptPath, parts.join('\\n\\n'), 'utf-8');\n\n const model = agentConfig?.frontmatter.model ?? 'codex-mini';\n mainCmd = `codex -m ${shellQuote(model)} --dangerously-bypass-approvals-and-sandbox \"$(cat '${codexPromptPath}')\"`;\n } else {\n // Anthropic (current behavior)\n const agentFlag = agentType && agentType !== 'worker' ? ` --agent ${shellQuote(agentType)}` : '';\n mainCmd = `claude --dangerously-skip-permissions --plugin-dir \"${pluginPath}\"${agentFlag} --append-system-prompt \"$(cat '${suffixFilePath}')\" ${shellQuote(instruction)}`;\n }\n\n const fullCmd = `${bannerCmd} ${envExports} && ${mainCmd}; ${notifyCmd}`;\n\n const agent: Agent = {\n id: agentId,\n name,\n agentType,\n provider,\n color,\n instruction,\n status: 'running',\n spawnedAt: new Date().toISOString(),\n completedAt: null,\n reports: [],\n paneId,\n ...(worktreePath ? { worktreePath, branchName, mergeStatus: 'pending' as const } : {}),\n };\n\n await state.addAgent(cwd, sessionId, agent);\n\n if (opts.worktree && worktreePath) {\n // Defer bootstrap so the daemon can respond to the CLI before running\n // the potentially slow init command (e.g. npm install).\n // The pane is already visible; Claude command is sent after bootstrap.\n const config = loadWorktreeConfig(cwd);\n if (config) {\n const wtPath = worktreePath;\n setImmediate(() => {\n try {\n bootstrapWorktree(cwd, wtPath, config);\n } catch (err) {\n console.error(`[sisyphus] worktree bootstrap failed for ${agentId}: ${err instanceof Error ? err.message : err}`);\n }\n tmux.sendKeys(paneId, fullCmd);\n });\n } else {\n tmux.sendKeys(paneId, fullCmd);\n }\n } else {\n tmux.sendKeys(paneId, fullCmd);\n }\n\n return agent;\n}\n\nfunction nextReportNumber(cwd: string, sessionId: string, agentId: string): string {\n const dir = reportsDir(cwd, sessionId);\n try {\n const files = readdirSync(dir).filter(f => f.startsWith(`${agentId}-`) && !f.endsWith('-final.md'));\n return String(files.length + 1).padStart(3, '0');\n } catch {\n return '001';\n }\n}\n\nexport async function handleAgentReport(\n cwd: string,\n sessionId: string,\n agentId: string,\n content: string,\n): Promise<void> {\n const dir = reportsDir(cwd, sessionId);\n mkdirSync(dir, { recursive: true });\n\n const num = nextReportNumber(cwd, sessionId, agentId);\n const filePath = reportFilePath(cwd, sessionId, agentId, num);\n writeFileSync(filePath, content, 'utf-8');\n\n const entry: AgentReport = {\n type: 'update',\n filePath,\n summary: content.slice(0, 200),\n timestamp: new Date().toISOString(),\n };\n await state.appendAgentReport(cwd, sessionId, agentId, entry);\n}\n\nexport async function handleAgentSubmit(\n cwd: string,\n sessionId: string,\n agentId: string,\n report: string,\n): Promise<boolean> {\n const dir = reportsDir(cwd, sessionId);\n mkdirSync(dir, { recursive: true });\n\n const filePath = reportFilePath(cwd, sessionId, agentId, 'final');\n writeFileSync(filePath, report, 'utf-8');\n\n const entry: AgentReport = {\n type: 'final',\n filePath,\n summary: report.slice(0, 200),\n timestamp: new Date().toISOString(),\n };\n await state.appendAgentReport(cwd, sessionId, agentId, entry);\n\n await state.updateAgent(cwd, sessionId, agentId, {\n status: 'completed',\n completedAt: new Date().toISOString(),\n });\n\n const session = state.getSession(cwd, sessionId);\n const agentArr = session.agents;\n const agent = agentArr.slice().reverse().find(a => a.id === agentId);\n if (agent) {\n unregisterPane(agent.paneId);\n tmux.killPane(agent.paneId);\n }\n\n const windowId = getWindowId(sessionId);\n if (windowId) tmux.selectLayout(windowId);\n\n return allAgentsDone(session);\n}\n\nexport async function handleAgentKilled(\n cwd: string,\n sessionId: string,\n agentId: string,\n reason: string,\n): Promise<boolean> {\n unregisterAgentPane(sessionId, agentId);\n await state.updateAgent(cwd, sessionId, agentId, {\n status: 'killed',\n killedReason: reason,\n completedAt: new Date().toISOString(),\n });\n\n const session = state.getSession(cwd, sessionId);\n return allAgentsDone(session);\n}\n\n// Note: this checks ALL running agents in the session, not just orchestrator-spawned ones.\n// Agents can also call `sisyphus spawn`, and those child agents are included here —\n// the orchestrator won't respawn until every agent (including agent-spawned ones) finishes.\nfunction allAgentsDone(session: import('../shared/types.js').Session): boolean {\n const running = session.agents.filter(a => a.status === 'running');\n return running.length === 0 && session.agents.length > 0;\n}\n\nfunction shellQuote(s: string): string {\n return `'${s.replace(/'/g, \"'\\\\''\")}'`;\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, mkdirSync, readFileSync, readdirSync, rmSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport type { Agent } from '../shared/types.js';\nimport type { WorktreeConfig } from '../shared/config.js';\nimport { worktreeConfigPath, worktreeBaseDir } from '../shared/paths.js';\n\nconst EXEC_ENV = {\n ...process.env,\n PATH: `/opt/homebrew/bin:/usr/local/bin:${process.env['PATH'] ?? '/usr/bin:/bin'}`,\n};\n\nfunction exec(cmd: string, cwd?: string): string {\n return execSync(cmd, { encoding: 'utf-8', env: EXEC_ENV, cwd }).trim();\n}\n\nfunction execSafe(cmd: string, cwd?: string): string | null {\n try {\n return exec(cmd, cwd);\n } catch {\n return null;\n }\n}\n\nfunction shellQuote(s: string): string {\n return `'${s.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nexport interface MergeResult {\n agentId: string;\n name: string;\n status: 'merged' | 'conflict' | 'no-changes';\n conflictDetails?: string;\n}\n\nexport function loadWorktreeConfig(cwd: string): WorktreeConfig | null {\n try {\n const content = readFileSync(worktreeConfigPath(cwd), 'utf-8');\n return JSON.parse(content) as WorktreeConfig;\n } catch {\n return null;\n }\n}\n\n/**\n * Create git worktree (branch + add + symlinks) without running bootstrap.\n * Fast enough to run synchronously before responding to the CLI.\n */\nexport function createWorktreeShell(\n cwd: string,\n sessionId: string,\n agentId: string,\n): { worktreePath: string; branchName: string } {\n const branchName = `sisyphus/${sessionId.slice(0, 8)}/${agentId}`;\n // Bug B: Include session prefix in path to prevent cross-session collisions\n const worktreePath = join(worktreeBaseDir(cwd), sessionId.slice(0, 8), agentId);\n\n mkdirSync(dirname(worktreePath), { recursive: true });\n\n // Bug C: Clean stale worktree entries before creating\n execSafe(`git -C ${shellQuote(cwd)} worktree prune`);\n if (existsSync(worktreePath)) {\n execSafe(`git -C ${shellQuote(cwd)} worktree remove --force ${shellQuote(worktreePath)}`);\n }\n // If the branch already exists from a previous run, remove it\n execSafe(`git -C ${shellQuote(cwd)} branch -D ${shellQuote(branchName)}`);\n\n exec(`git -C ${shellQuote(cwd)} branch ${shellQuote(branchName)} HEAD`);\n exec(`git -C ${shellQuote(cwd)} worktree add ${shellQuote(worktreePath)} ${shellQuote(branchName)}`);\n\n return { worktreePath, branchName };\n}\n\n/**\n * Create git worktree AND run bootstrap synchronously.\n * Use createWorktreeShell + bootstrapWorktree separately when you need\n * to defer the slow bootstrap to avoid blocking.\n */\nexport function createWorktree(\n cwd: string,\n sessionId: string,\n agentId: string,\n): { worktreePath: string; branchName: string } {\n const result = createWorktreeShell(cwd, sessionId, agentId);\n\n const config = loadWorktreeConfig(cwd);\n if (config) {\n bootstrapWorktree(cwd, result.worktreePath, config);\n }\n\n return result;\n}\n\nexport function bootstrapWorktree(cwd: string, worktreePath: string, config: WorktreeConfig): void {\n // Process copy entries\n if (config.copy) {\n for (const entry of config.copy) {\n const dest = join(worktreePath, entry);\n mkdirSync(dirname(dest), { recursive: true });\n execSafe(`cp -r ${shellQuote(join(cwd, entry))} ${shellQuote(dest)}`);\n }\n }\n\n // Process clone entries (APFS CoW on macOS, fallback to cp -r)\n if (config.clone) {\n for (const entry of config.clone) {\n const dest = join(worktreePath, entry);\n mkdirSync(dirname(dest), { recursive: true });\n const src = shellQuote(join(cwd, entry));\n const dstQ = shellQuote(dest);\n if (execSafe(`cp -Rc ${src} ${dstQ}`) === null) {\n execSafe(`cp -r ${src} ${dstQ}`);\n }\n }\n }\n\n // Process symlink entries\n if (config.symlink) {\n for (const entry of config.symlink) {\n const dest = join(worktreePath, entry);\n mkdirSync(dirname(dest), { recursive: true });\n execSafe(`ln -s ${shellQuote(join(cwd, entry))} ${shellQuote(dest)}`);\n }\n }\n\n // Process init command\n if (config.init) {\n try {\n exec(config.init, worktreePath);\n } catch (err) {\n console.error(`[sisyphus] worktree init command failed: ${err instanceof Error ? err.message : err}`);\n }\n }\n}\n\n/**\n * Resolve the branch checked out in a worktree by parsing `git worktree list --porcelain`.\n * Returns null if the worktree isn't found or has a detached HEAD.\n */\nfunction resolveWorktreeBranch(cwd: string, worktreePath: string): string | null {\n const output = execSafe(`git -C ${shellQuote(cwd)} worktree list --porcelain`);\n if (!output) return null;\n\n const lines = output.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n if (lines[i] === `worktree ${worktreePath}`) {\n for (let j = i + 1; j < lines.length; j++) {\n const line = lines[j]!;\n if (line === '') break; // end of this worktree block\n if (line.startsWith('branch refs/heads/')) {\n return line.slice('branch refs/heads/'.length);\n }\n }\n break;\n }\n }\n return null;\n}\n\nexport function mergeWorktrees(cwd: string, agents: Agent[]): MergeResult[] {\n const pending = agents.filter(\n a => a.worktreePath && a.mergeStatus === 'pending',\n );\n\n const results: MergeResult[] = [];\n\n // Snapshot any uncommitted .sisyphus state changes before merging\n // so agent branches don't conflict with main's session state updates\n execSafe(`git -C ${shellQuote(cwd)} add .sisyphus`);\n execSafe(`git -C ${shellQuote(cwd)} commit -m 'sisyphus: snapshot session state before merge'`);\n\n for (const agent of pending) {\n const branch = resolveWorktreeBranch(cwd, agent.worktreePath!);\n\n if (!branch) {\n results.push({ agentId: agent.id, name: agent.name, status: 'no-changes' });\n // Best-effort cleanup — branch name unknown, just remove worktree dir\n execSafe(`git -C ${shellQuote(cwd)} worktree remove ${shellQuote(agent.worktreePath!)} --force`);\n continue;\n }\n\n // Check if branch has commits ahead of merge base\n const aheadLog = execSafe(`git -C ${shellQuote(cwd)} log HEAD..${shellQuote(branch)} --oneline`);\n if (!aheadLog) {\n results.push({ agentId: agent.id, name: agent.name, status: 'no-changes' });\n cleanupWorktree(cwd, agent.worktreePath!, branch);\n continue;\n }\n\n // Attempt merge — capture stderr on failure for conflict details\n const mergeMsg = `sisyphus: merge ${agent.id} (${agent.name})`;\n const mergeCmd = `git -C ${shellQuote(cwd)} merge --no-ff ${shellQuote(branch)} -m ${shellQuote(mergeMsg)}`;\n\n try {\n exec(mergeCmd);\n // Merge succeeded — clean up worktree and branch\n execSafe(`git -C ${shellQuote(cwd)} worktree remove ${shellQuote(agent.worktreePath!)}`);\n execSafe(`git -C ${shellQuote(cwd)} branch -d ${shellQuote(branch)}`);\n results.push({ agentId: agent.id, name: agent.name, status: 'merged' });\n } catch (err: unknown) {\n // Merge failed — abort and leave worktree intact for manual resolution\n execSafe(`git -C ${shellQuote(cwd)} merge --abort`);\n // Git outputs conflict details (which files, conflict type) to stdout, not stderr\n const errObj = err as { stdout?: Buffer | string; stderr?: Buffer | string };\n const stdout = errObj.stdout\n ? (typeof errObj.stdout === 'string' ? errObj.stdout : errObj.stdout.toString('utf-8')).trim()\n : '';\n const stderr = errObj.stderr\n ? (typeof errObj.stderr === 'string' ? errObj.stderr : errObj.stderr.toString('utf-8')).trim()\n : '';\n const conflictDetails = stdout || stderr || (err instanceof Error ? err.message : String(err));\n results.push({ agentId: agent.id, name: agent.name, status: 'conflict', conflictDetails });\n }\n }\n\n return results;\n}\n\nexport function cleanupWorktree(cwd: string, worktreePath: string, branchName: string): void {\n execSafe(`git -C ${shellQuote(cwd)} worktree remove ${shellQuote(worktreePath)} --force`);\n execSafe(`git -C ${shellQuote(cwd)} branch -D ${shellQuote(branchName)}`);\n\n // Remove the worktree base dir if empty\n const baseDir = dirname(worktreePath);\n try {\n const entries = readdirSync(baseDir);\n if (entries.length === 0) {\n rmSync(baseDir, { recursive: true });\n }\n } catch {\n // Ignore — directory may already be gone\n }\n}\n\nexport function countWorktreeAgents(agents: Agent[]): number {\n return agents.filter(a => a.worktreePath && a.status === 'running').length;\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { Provider } from '../shared/types.js';\n\nexport interface AgentTypeFrontmatter {\n name?: string;\n model?: string;\n color?: string;\n description?: string;\n skills?: string[];\n permissionMode?: string;\n}\n\nexport { type Provider } from '../shared/types.js';\n\nexport function detectProvider(model: string | undefined): Provider {\n if (!model) return 'anthropic';\n if (/^(gpt-|codex-)/.test(model)) return 'openai';\n return 'anthropic';\n}\n\nexport function parseAgentFrontmatter(content: string): AgentTypeFrontmatter {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) return {};\n\n const block = match[1]!;\n const fm: AgentTypeFrontmatter = {};\n\n const str = (key: string): string | undefined => {\n const m = block.match(new RegExp(`^${key}:\\\\s*(.+)$`, 'm'));\n return m ? m[1]!.trim() : undefined;\n };\n\n fm.name = str('name');\n fm.model = str('model');\n fm.color = str('color');\n fm.description = str('description');\n fm.permissionMode = str('permissionMode');\n\n // Parse skills as a YAML list\n const skillsMatch = block.match(/^skills:\\s*\\n((?:\\s+-\\s+.+\\n?)*)/m);\n if (skillsMatch) {\n fm.skills = skillsMatch[1]!\n .split('\\n')\n .map(line => line.replace(/^\\s+-\\s+/, '').trim())\n .filter(Boolean);\n }\n\n return fm;\n}\n\nexport function extractAgentBody(content: string): string {\n const match = content.match(/^---\\n[\\s\\S]*?\\n---\\n?([\\s\\S]*)$/);\n return match ? match[1]!.trim() : content.trim();\n}\n\nfunction findPluginInstallPath(namespace: string): string | null {\n try {\n const registryPath = join(homedir(), '.claude', 'plugins', 'installed_plugins.json');\n const registry = JSON.parse(readFileSync(registryPath, 'utf-8'));\n for (const key of Object.keys(registry)) {\n if (key.startsWith(`${namespace}@`)) {\n return registry[key].installPath ?? null;\n }\n }\n } catch {\n // File missing, parse error, or no match\n }\n return null;\n}\n\nexport function resolveAgentTypePath(agentType: string, pluginDir: string, cwd: string): string | null {\n if (!agentType) return null;\n\n let namespace: string | undefined;\n let name: string;\n\n if (agentType.includes(':')) {\n [namespace, name] = agentType.split(':', 2) as [string, string];\n } else {\n name = agentType;\n }\n\n const searchPaths: string[] = [];\n\n if (namespace) {\n // Bundled (handles sisyphus:* via pluginDir)\n searchPaths.push(join(pluginDir, 'agents', `${name}.md`));\n // Installed plugin\n const installPath = findPluginInstallPath(namespace);\n if (installPath) {\n searchPaths.push(join(installPath, 'agents', `${name}.md`));\n }\n } else {\n // Project-local\n searchPaths.push(join(cwd, '.claude', 'agents', `${name}.md`));\n // User-global\n searchPaths.push(join(homedir(), '.claude', 'agents', `${name}.md`));\n // Bundled\n searchPaths.push(join(pluginDir, 'agents', `${name}.md`));\n }\n\n for (const path of searchPaths) {\n if (existsSync(path)) return path;\n }\n\n return null;\n}\n\nexport interface ResolvedAgentConfig {\n frontmatter: AgentTypeFrontmatter;\n body: string;\n filePath: string;\n}\n\nexport function resolveAgentConfig(agentType: string, pluginDir: string, cwd: string): ResolvedAgentConfig | null {\n const filePath = resolveAgentTypePath(agentType, pluginDir, cwd);\n if (!filePath) return null;\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n return {\n frontmatter: parseAgentFrontmatter(content),\n body: extractAgentBody(content),\n filePath,\n };\n } catch {\n return null;\n }\n}\n","import * as state from './state.js';\nimport * as tmux from './tmux.js';\nimport { getOrchestratorPaneId, cleanupSessionMaps } from './orchestrator.js';\nimport { handleAgentKilled } from './agent.js';\n\ntype RespawnCallback = (sessionId: string, cwd: string, windowId: string) => void;\n\nlet monitorInterval: ReturnType<typeof setInterval> | null = null;\nlet onAllAgentsDone: RespawnCallback | null = null;\n\nexport function setRespawnCallback(cb: RespawnCallback): void {\n onAllAgentsDone = cb;\n}\n\nexport function startMonitor(pollIntervalMs: number = 5000): void {\n if (monitorInterval) return;\n monitorInterval = setInterval(() => {\n pollAllSessions().catch(err => {\n console.error('[sisyphus] Pane monitor error:', err);\n });\n }, pollIntervalMs);\n}\n\nexport function stopMonitor(): void {\n if (monitorInterval) {\n clearInterval(monitorInterval);\n monitorInterval = null;\n }\n}\n\nconst trackedSessions = new Map<string, { id: string; cwd: string; tmuxSession: string; windowId: string | null }>();\n\nexport function trackSession(sessionId: string, cwd: string, tmuxSession: string): void {\n // windowId is registered separately via updateTrackedWindow after spawnOrchestrator sets it\n const existing = trackedSessions.get(sessionId);\n trackedSessions.set(sessionId, { id: sessionId, cwd, tmuxSession, windowId: existing ? existing.windowId : null });\n}\n\nexport function updateTrackedWindow(sessionId: string, windowId: string): void {\n const entry = trackedSessions.get(sessionId);\n if (!entry) throw new Error(`Cannot update window for untracked session: ${sessionId}`);\n entry.windowId = windowId;\n}\n\nexport function untrackSession(sessionId: string): void {\n trackedSessions.delete(sessionId);\n}\n\nasync function pollAllSessions(): Promise<void> {\n for (const { id: sessionId, cwd, windowId } of trackedSessions.values()) {\n if (windowId) {\n await pollSession(sessionId, cwd, windowId);\n }\n }\n}\n\nasync function pollSession(sessionId: string, cwd: string, windowId: string): Promise<void> {\n let session;\n try {\n session = state.getSession(cwd, sessionId);\n } catch (err) {\n console.error(`[sisyphus] Failed to read state for session ${sessionId}:`, err);\n return;\n }\n\n if (session.status === 'completed') {\n const orchPaneId = getOrchestratorPaneId(sessionId);\n if (orchPaneId) {\n const livePanes = tmux.listPanes(windowId);\n const livePaneIds = new Set(livePanes.map(p => p.paneId));\n if (!livePaneIds.has(orchPaneId)) {\n cleanupSessionMaps(sessionId);\n untrackSession(sessionId);\n console.log(`[sisyphus] Session ${sessionId} cleaned up: orchestrator pane closed by user`);\n }\n } else {\n // No orchestrator pane tracked — clean up immediately\n cleanupSessionMaps(sessionId);\n untrackSession(sessionId);\n }\n return;\n }\n\n if (session.status !== 'active') return;\n\n const livePanes = tmux.listPanes(windowId);\n if (livePanes.length === 0) return;\n\n const livePaneIds = new Set(livePanes.map(p => p.paneId));\n\n let paneRemoved = false;\n for (const agent of session.agents) {\n if (agent.status !== 'running') continue;\n if (!livePaneIds.has(agent.paneId)) {\n paneRemoved = true;\n const allDone = await handleAgentKilled(cwd, sessionId, agent.id, 'pane closed by user');\n if (allDone && onAllAgentsDone) {\n onAllAgentsDone(sessionId, cwd, windowId);\n }\n }\n }\n\n if (paneRemoved) tmux.selectLayout(windowId);\n\n // Check orchestrator pane\n const orchPaneId = getOrchestratorPaneId(sessionId);\n if (orchPaneId && !livePaneIds.has(orchPaneId)) {\n // Orchestrator pane disappeared without a yield command\n const runningAgents = session.agents.filter(a => a.status === 'running');\n if (runningAgents.length === 0) {\n // No agents running and orchestrator gone — pause\n await state.updateSessionStatus(cwd, sessionId, 'paused');\n console.log(`[sisyphus] Session ${sessionId} paused: orchestrator pane disappeared`);\n }\n }\n\n // Re-read state since handleAgentKilled may have mutated it\n session = state.getSession(cwd, sessionId);\n if (\n session.status === 'active' &&\n session.agents.length > 0 &&\n session.agents.every(a => a.status !== 'running') &&\n (!orchPaneId || !livePaneIds.has(orchPaneId)) &&\n onAllAgentsDone\n ) {\n console.log(`[sisyphus] Detected stuck session ${sessionId}: all agents done, no orchestrator — triggering respawn`);\n onAllAgentsDone(sessionId, cwd, windowId);\n }\n}\n","import { execSync } from 'node:child_process';\nimport { readFileSync, writeFileSync, unlinkSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { get } from 'node:https';\nimport { daemonUpdatingPath } from '../shared/paths.js';\n\nfunction isNewer(latest: string, current: string): boolean {\n const a = latest.split('.').map(Number);\n const b = current.split('.').map(Number);\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const av = a[i] ?? 0;\n const bv = b[i] ?? 0;\n if (av > bv) return true;\n if (av < bv) return false;\n }\n return false;\n}\n\nfunction readPackageVersion(): string {\n // Bundled: dist/daemon.js → ../package.json\n // Source (tsx): src/daemon/updater.ts → ../../package.json\n for (const rel of ['../package.json', '../../package.json']) {\n try {\n const raw = readFileSync(resolve(import.meta.dirname, rel), 'utf-8');\n const pkg = JSON.parse(raw) as { name?: string; version?: string };\n if (pkg.name === 'sisyphi' && pkg.version) return pkg.version;\n } catch {}\n }\n return '0.0.0';\n}\n\nconst currentVersion = readPackageVersion();\n\nexport function getCurrentVersion(): string {\n return currentVersion;\n}\n\nexport function checkForUpdate(): Promise<{ current: string; latest: string } | null> {\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n resolve(null);\n }, 5000);\n\n const req = get('https://registry.npmjs.org/sisyphi/latest', (res) => {\n let data = '';\n res.on('data', (chunk: Buffer) => { data += chunk.toString(); });\n res.on('end', () => {\n clearTimeout(timeout);\n try {\n const { version: latest } = JSON.parse(data) as { version: string };\n if (latest && isNewer(latest, currentVersion)) {\n resolve({ current: currentVersion, latest });\n } else {\n resolve(null);\n }\n } catch {\n resolve(null);\n }\n });\n });\n\n req.on('error', () => {\n clearTimeout(timeout);\n resolve(null);\n });\n });\n}\n\nexport function applyUpdate(expectedVersion: string): boolean {\n try {\n // launchd gives a minimal PATH — ensure node/npm directory is on PATH\n const nodeDir = resolve(process.execPath, '..');\n const env = { ...process.env, PATH: `${nodeDir}:${process.env.PATH ?? ''}` };\n execSync('npm install -g sisyphi', { timeout: 15000, stdio: 'pipe', env });\n\n // Verify the install actually landed the expected version\n const result = execSync('npm ls -g sisyphi --json --depth=0', {\n timeout: 5000, encoding: 'utf-8', env,\n });\n const info = JSON.parse(result) as { dependencies?: { sisyphi?: { version?: string } } };\n const installed = info.dependencies?.sisyphi?.version;\n if (installed !== expectedVersion) {\n console.error(`[sisyphus] Update installed ${installed} but expected ${expectedVersion}`);\n return false;\n }\n return true;\n } catch (err) {\n console.error('[sisyphus] Auto-update failed:', err);\n return false;\n }\n}\n\nfunction markUpdating(version: string): void {\n try { writeFileSync(daemonUpdatingPath(), version, 'utf-8'); } catch {}\n}\n\nfunction clearUpdating(): void {\n try { unlinkSync(daemonUpdatingPath()); } catch {}\n}\n\nexport async function checkAndApply(): Promise<void> {\n clearUpdating(); // clean up stale marker from previous run\n try {\n const update = await checkForUpdate();\n if (!update) return;\n\n console.log(`[sisyphus] Update available: ${update.current} → ${update.latest}`);\n markUpdating(update.latest);\n const success = applyUpdate(update.latest);\n if (success) {\n console.log(`[sisyphus] Updated to ${update.latest}, restarting daemon...`);\n process.exit(0); // launchd respawns with new code\n }\n clearUpdating();\n } catch (err) {\n clearUpdating();\n console.error('[sisyphus] Auto-update check failed:', err);\n }\n}\n"],"mappings":"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","names":["mkdirSync","readFileSync","writeFileSync","unlinkSync","existsSync","execSync","existsSync","writeFileSync","readFileSync","mkdirSync","join","existsSync","readdirSync","rmSync","readFileSync","resolve","readFileSync","readFileSync","writeFileSync","command","readFileSync","writeFileSync","readFileSync","writeFileSync","mkdirSync","readdirSync","existsSync","resolve","execSync","existsSync","mkdirSync","readFileSync","readdirSync","dirname","join","EXEC_ENV","exec","execSync","execSafe","shellQuote","readFileSync","join","mkdirSync","dirname","existsSync","join","mkdirSync","dirname","execSafe","shellQuote","exec","readdirSync","readFileSync","existsSync","join","registryPath","resolve","readFileSync","writeFileSync","existsSync","shellQuote","readdirSync","mkdirSync","orchPaneId","livePanes","livePaneIds","existsSync","readdirSync","rmSync","onAllAgentsDone","sessionWindowMap","join","mkdirSync","writeFileSync","existsSync","readFileSync","sessionWindowMap","resolve","execSync","readFileSync","writeFileSync","unlinkSync","resolve","readFileSync","resolve","resolve","execSync","writeFileSync","unlinkSync","mkdirSync","readFileSync","writeFileSync","execSync","unlinkSync","existsSync","onAllAgentsDone"]}
|
|
1
|
+
{"version":3,"sources":["../src/daemon/index.ts","../src/daemon/server.ts","../src/daemon/session-manager.ts","../src/daemon/state.ts","../src/daemon/orchestrator.ts","../src/daemon/colors.ts","../src/daemon/frontmatter.ts","../src/daemon/tmux.ts","../src/daemon/pane-registry.ts","../src/daemon/agent.ts","../src/daemon/worktree.ts","../src/daemon/summarize.ts","../src/daemon/pane-monitor.ts","../src/daemon/updater.ts"],"sourcesContent":["import { mkdirSync, readFileSync, writeFileSync, unlinkSync, existsSync } from 'node:fs';\nimport { execSync } from 'node:child_process';\nimport { setTimeout as sleep } from 'node:timers/promises';\nimport { globalDir, daemonPidPath, statePath } from '../shared/paths.js';\nimport { loadConfig } from '../shared/config.js';\nimport { startServer, stopServer, registerSessionCwd, registerSessionTmux, loadSessionRegistry } from './server.js';\nimport { startMonitor, stopMonitor, setRespawnCallback, trackSession, updateTrackedWindow } from './pane-monitor.js';\nimport { onAllAgentsDone } from './session-manager.js';\nimport { resetAgentCounterFromState } from './agent.js';\nimport { setWindowId, setOrchestratorPaneId, getOrchestratorPaneId } from './orchestrator.js';\nimport { listPanes, sessionExists } from './tmux.js';\nimport { registerPane } from './pane-registry.js';\nimport * as stateModule from './state.js';\nimport type { Session } from '../shared/types.js';\nimport { checkAndApply } from './updater.js';\n\nfunction ensureDirs(): void {\n mkdirSync(globalDir(), { recursive: true });\n}\n\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction readPid(): number | null {\n const pidFile = daemonPidPath();\n try {\n const pid = parseInt(readFileSync(pidFile, 'utf-8').trim(), 10);\n return pid && isProcessAlive(pid) ? pid : null;\n } catch {\n return null;\n }\n}\n\nfunction acquirePidLock(): void {\n const pid = readPid();\n if (pid) {\n console.error(`[sisyphus] Daemon already running (pid ${pid}). Use 'sisyphusd restart' or 'sisyphusd stop' first.`);\n process.exit(0);\n }\n writeFileSync(daemonPidPath(), String(process.pid), 'utf-8');\n}\n\nfunction isLaunchdManaged(): boolean {\n try {\n execSync('launchctl list com.sisyphus.daemon', { stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction releasePidLock(): void {\n try {\n unlinkSync(daemonPidPath());\n } catch {\n // Already gone\n }\n}\n\nfunction stopDaemon(): boolean {\n const pid = readPid();\n if (!pid) {\n console.log('[sisyphus] Daemon is not running');\n // Clean up stale pid file if it exists\n releasePidLock();\n return false;\n }\n\n console.log(`[sisyphus] Stopping daemon (pid ${pid})...`);\n try {\n process.kill(pid, 'SIGTERM');\n } catch {\n console.error(`[sisyphus] Failed to send SIGTERM to pid ${pid}`);\n return false;\n }\n\n // Wait for process to exit (up to 5s)\n const deadline = Date.now() + 5000;\n while (Date.now() < deadline) {\n if (!isProcessAlive(pid)) {\n console.log('[sisyphus] Daemon stopped');\n releasePidLock();\n return true;\n }\n // Busy-wait in small increments (synchronous — fine for a CLI command)\n const wait = Date.now() + 100;\n while (Date.now() < wait) { /* spin */ }\n }\n\n console.error(`[sisyphus] Daemon (pid ${pid}) did not exit within 5s, sending SIGKILL`);\n try {\n process.kill(pid, 'SIGKILL');\n } catch { /* already dead */ }\n releasePidLock();\n return true;\n}\n\nasync function recoverSessions(): Promise<void> {\n const registry = loadSessionRegistry();\n const entries = Object.entries(registry);\n\n if (entries.length === 0) {\n console.log('[sisyphus] No sessions to recover');\n return;\n }\n\n let recovered = 0;\n for (const [sessionId, cwd] of entries) {\n const stateFile = statePath(cwd, sessionId);\n if (!existsSync(stateFile)) {\n continue;\n }\n\n try {\n const session = JSON.parse(readFileSync(stateFile, 'utf-8')) as Session;\n if (session.status === 'active' || session.status === 'paused') {\n registerSessionCwd(sessionId, cwd);\n resetAgentCounterFromState(sessionId, session.agents ?? []);\n\n // Reconnect to tmux panes if info was persisted\n if (session.tmuxSessionName && session.tmuxWindowId) {\n if (!sessionExists(session.tmuxSessionName)) {\n // Tmux session gone — pause so user can `sisyphus resume`\n if (session.status === 'active') {\n await stateModule.updateSessionStatus(cwd, sessionId, 'paused');\n console.log(`[sisyphus] Session ${sessionId} paused: tmux session no longer exists`);\n }\n recovered++;\n continue;\n }\n const livePanes = listPanes(session.tmuxWindowId);\n if (livePanes.length > 0) {\n registerSessionTmux(sessionId, session.tmuxSessionName, session.tmuxWindowId);\n setWindowId(sessionId, session.tmuxWindowId);\n trackSession(sessionId, cwd, session.tmuxSessionName);\n updateTrackedWindow(sessionId, session.tmuxWindowId);\n\n // Recover orchestrator pane from last incomplete cycle\n const lastIncompleteCycle = [...session.orchestratorCycles].reverse().find(c => !c.completedAt && c.paneId);\n if (lastIncompleteCycle?.paneId) {\n setOrchestratorPaneId(sessionId, lastIncompleteCycle.paneId);\n const livePaneIds = new Set(livePanes.map(p => p.paneId));\n if (livePaneIds.has(lastIncompleteCycle.paneId)) {\n registerPane(lastIncompleteCycle.paneId, sessionId, 'orchestrator');\n }\n }\n\n // Register live agent panes\n for (const agent of session.agents) {\n if (agent.status === 'running' && agent.paneId) {\n const livePaneIds = new Set(livePanes.map(p => p.paneId));\n if (livePaneIds.has(agent.paneId)) {\n registerPane(agent.paneId, sessionId, 'agent', agent.id);\n }\n }\n }\n\n console.log(`[sisyphus] Reconnected session ${sessionId} to tmux window ${session.tmuxWindowId}`);\n\n // Detect sessions stuck in \"all agents done, no orchestrator\" state\n if (session.status === 'active' && session.agents.length > 0) {\n const hasRunningAgents = session.agents.some(a => a.status === 'running');\n if (!hasRunningAgents) {\n const livePaneIds = new Set(livePanes.map(p => p.paneId));\n const orchestratorPaneId = getOrchestratorPaneId(sessionId);\n const orchestratorAlive = orchestratorPaneId && livePaneIds.has(orchestratorPaneId);\n if (!orchestratorAlive) {\n console.log(`[sisyphus] Detected stuck session ${sessionId} on recovery: triggering orchestrator respawn`);\n await onAllAgentsDone(sessionId, cwd, session.tmuxWindowId!);\n }\n }\n }\n } else {\n // Window gone — pause the session so user can `sisyphus resume`\n if (session.status === 'active') {\n await stateModule.updateSessionStatus(cwd, sessionId, 'paused');\n console.log(`[sisyphus] Session ${sessionId} paused: tmux window no longer exists`);\n }\n }\n }\n\n recovered++;\n }\n } catch {\n console.error(`[sisyphus] Failed to read session state for ${sessionId}, skipping`);\n }\n }\n\n console.log(`[sisyphus] Recovered ${recovered} session(s) from registry`);\n}\n\nasync function startDaemon(): Promise<void> {\n console.log('[sisyphus] Starting daemon...');\n ensureDirs();\n\n const config = loadConfig(process.cwd());\n if (config.autoUpdate !== false) {\n await checkAndApply(); // may exit process if update found\n }\n\n acquirePidLock();\n\n setRespawnCallback(onAllAgentsDone);\n\n await startServer();\n startMonitor(config.pollIntervalMs);\n\n await recoverSessions();\n\n const shutdown = async () => {\n console.log('[sisyphus] Shutting down...');\n stopMonitor();\n await stopServer();\n releasePidLock();\n process.exit(0);\n };\n\n process.on('SIGTERM', shutdown);\n process.on('SIGINT', shutdown);\n}\n\nprocess.title = 'sisyphusd';\n\nconst command = process.argv[2];\n\n(async () => {\n switch (command) {\n case 'stop':\n stopDaemon();\n break;\n\n case 'restart': {\n stopDaemon();\n // If launchd is managing the daemon, just exit — it will respawn via KeepAlive\n if (isLaunchdManaged()) {\n // Brief poll so we can report the new PID\n for (let i = 0; i < 6; i++) {\n await sleep(500);\n const respawnedPid = readPid();\n if (respawnedPid) {\n console.log(`[sisyphus] Daemon restarted (pid ${respawnedPid}) by process manager`);\n process.exit(0);\n }\n }\n console.log('[sisyphus] Daemon will be restarted by process manager');\n process.exit(0);\n }\n // No process manager — start in-process\n await startDaemon();\n break;\n }\n\n case 'start':\n case undefined:\n await startDaemon();\n break;\n\n case 'help':\n case '--help':\n case '-h':\n console.log('Usage: sisyphusd [command]');\n console.log('');\n console.log('Commands:');\n console.log(' start Start the daemon (default if no command given)');\n console.log(' stop Stop the running daemon');\n console.log(' restart Stop and restart the daemon');\n console.log(' help Show this help message');\n break;\n\n default:\n console.error(`[sisyphus] Unknown command: ${command}`);\n console.error('Usage: sisyphusd [start|stop|restart|help]');\n process.exit(1);\n }\n})().catch((err) => {\n console.error('[sisyphus] Fatal error:', err);\n process.exit(1);\n});\n","import { createServer, type Server } from 'node:net';\nimport { unlinkSync, existsSync, writeFileSync, readFileSync, mkdirSync, rmSync } from 'node:fs';\nimport { socketPath, globalDir, messagesDir } from '../shared/paths.js';\nimport { join } from 'node:path';\nimport type { Request, Response } from '../shared/protocol.js';\nimport type { MessageSource } from '../shared/types.js';\nimport * as sessionManager from './session-manager.js';\nimport * as state from './state.js';\nimport { lookupPane, unregisterPane } from './pane-registry.js';\n\nlet server: Server | null = null;\n\n// Track the cwd for each session so we can route requests\nconst sessionCwdMap = new Map<string, string>();\n// Monotonic message counter per session\nconst sessionMessageCounters = new Map<string, number>();\n// Track the originating tmux session for each sisyphus session\nconst sessionTmuxMap = new Map<string, string>();\n// Track the originating tmux window for each sisyphus session\nconst sessionWindowMap = new Map<string, string>();\n\nexport function getSessionCwd(sessionId: string): string | undefined {\n return sessionCwdMap.get(sessionId);\n}\n\nexport function getSessionTmux(sessionId: string): string | undefined {\n return sessionTmuxMap.get(sessionId);\n}\n\nfunction registryPath(): string {\n return join(globalDir(), 'session-registry.json');\n}\n\nfunction persistSessionRegistry(): void {\n const dir = globalDir();\n mkdirSync(dir, { recursive: true });\n const registry: Record<string, string> = {};\n for (const [id, cwd] of sessionCwdMap) {\n registry[id] = cwd;\n }\n writeFileSync(registryPath(), JSON.stringify(registry, null, 2), 'utf-8');\n}\n\nexport function loadSessionRegistry(): Record<string, string> {\n const p = registryPath();\n if (!existsSync(p)) return {};\n try {\n return JSON.parse(readFileSync(p, 'utf-8')) as Record<string, string>;\n } catch {\n return {};\n }\n}\n\nexport function registerSessionCwd(sessionId: string, cwd: string): void {\n sessionCwdMap.set(sessionId, cwd);\n persistSessionRegistry();\n}\n\nexport function registerSessionTmux(sessionId: string, tmuxSession: string, windowId: string): void {\n sessionTmuxMap.set(sessionId, tmuxSession);\n sessionWindowMap.set(sessionId, windowId);\n}\n\nasync function handleRequest(req: Request): Promise<Response> {\n try {\n switch (req.type) {\n case 'start': {\n const session = await sessionManager.startSession(req.task, req.cwd, req.context, req.name);\n registerSessionCwd(session.id, req.cwd);\n if (session.tmuxSessionName) sessionTmuxMap.set(session.id, session.tmuxSessionName);\n if (session.tmuxWindowId) sessionWindowMap.set(session.id, session.tmuxWindowId);\n return { ok: true, data: { sessionId: session.id, tmuxSessionName: session.tmuxSessionName } };\n }\n\n case 'spawn': {\n const cwd = sessionCwdMap.get(req.sessionId);\n if (!cwd) return { ok: false, error: `Unknown session: ${req.sessionId}` };\n const result = await sessionManager.handleSpawn(req.sessionId, cwd, req.agentType, req.name, req.instruction, req.worktree);\n return { ok: true, data: { agentId: result.agentId } };\n }\n\n case 'submit': {\n const cwd = sessionCwdMap.get(req.sessionId);\n if (!cwd) return { ok: false, error: `Unknown session: ${req.sessionId}` };\n const windowId = sessionWindowMap.get(req.sessionId);\n if (!windowId) return { ok: false, error: `No tmux window found for session: ${req.sessionId}` };\n await sessionManager.handleSubmit(cwd, req.sessionId, req.agentId, req.report, windowId);\n return { ok: true };\n }\n\n case 'report': {\n const cwd = sessionCwdMap.get(req.sessionId);\n if (!cwd) return { ok: false, error: `Unknown session: ${req.sessionId}` };\n await sessionManager.handleReport(cwd, req.sessionId, req.agentId, req.content);\n return { ok: true };\n }\n\n case 'yield': {\n const cwd = sessionCwdMap.get(req.sessionId);\n if (!cwd) return { ok: false, error: `Unknown session: ${req.sessionId}` };\n await sessionManager.handleYield(req.sessionId, cwd, req.nextPrompt, req.mode);\n return { ok: true };\n }\n\n case 'complete': {\n const cwd = sessionCwdMap.get(req.sessionId);\n if (!cwd) return { ok: false, error: `Unknown session: ${req.sessionId}` };\n await sessionManager.handleComplete(req.sessionId, cwd, req.report);\n return { ok: true };\n }\n\n case 'continue': {\n const cwd = sessionCwdMap.get(req.sessionId);\n if (!cwd) return { ok: false, error: `Unknown session: ${req.sessionId}` };\n await sessionManager.handleContinue(req.sessionId, cwd);\n return { ok: true };\n }\n\n case 'status': {\n if (req.sessionId) {\n const cwd = sessionCwdMap.get(req.sessionId) ?? req.cwd;\n if (!cwd) return { ok: false, error: `Unknown session: ${req.sessionId}` };\n const session = sessionManager.getSessionStatus(cwd, req.sessionId);\n return { ok: true, data: { session: session as unknown as Record<string, unknown> } };\n }\n return { ok: true, data: { message: 'daemon running' } };\n }\n\n case 'list': {\n const allSessions: Array<Record<string, unknown>> = [];\n if (req.all) {\n // List sessions across all known cwds\n const seenCwds = new Set<string>();\n for (const cwd of sessionCwdMap.values()) {\n if (seenCwds.has(cwd)) continue;\n seenCwds.add(cwd);\n const sessions = sessionManager.listSessions(cwd);\n allSessions.push(...sessions.map(s => ({ ...s, cwd } as unknown as Record<string, unknown>)));\n }\n } else {\n // List sessions for the requesting cwd only\n const sessions = sessionManager.listSessions(req.cwd);\n allSessions.push(...sessions.map(s => ({ ...s, cwd: req.cwd } as unknown as Record<string, unknown>)));\n // Count total across all cwds for the hint\n let totalCount = allSessions.length;\n const seenCwds = new Set<string>([req.cwd]);\n for (const cwd of sessionCwdMap.values()) {\n if (seenCwds.has(cwd)) continue;\n seenCwds.add(cwd);\n totalCount += sessionManager.listSessions(cwd).length;\n }\n if (totalCount > allSessions.length) {\n return { ok: true, data: { sessions: allSessions, totalCount, filtered: true } };\n }\n }\n return { ok: true, data: { sessions: allSessions } };\n }\n\n case 'resume': {\n let cwd = sessionCwdMap.get(req.sessionId);\n if (!cwd) {\n // Session not in memory — try to recover from disk using the cwd provided by CLI\n const stateFile = `${req.cwd}/.sisyphus/sessions/${req.sessionId}/state.json`;\n if (existsSync(stateFile)) {\n cwd = req.cwd;\n registerSessionCwd(req.sessionId, cwd);\n } else {\n return { ok: false, error: `Unknown session: ${req.sessionId}. No state.json found at ${stateFile}` };\n }\n }\n const session = await sessionManager.resumeSession(req.sessionId, cwd, req.message);\n if (session.tmuxSessionName) sessionTmuxMap.set(req.sessionId, session.tmuxSessionName);\n if (session.tmuxWindowId) sessionWindowMap.set(req.sessionId, session.tmuxWindowId);\n return { ok: true, data: { sessionId: session.id, status: session.status, tmuxSessionName: session.tmuxSessionName } };\n }\n\n case 'register_claude_session': {\n const cwd = sessionCwdMap.get(req.sessionId);\n if (!cwd) return { ok: false, error: `Unknown session: ${req.sessionId}` };\n await sessionManager.handleRegisterClaudeSession(cwd, req.sessionId, req.agentId, req.claudeSessionId);\n return { ok: true };\n }\n\n case 'kill': {\n const cwd = sessionCwdMap.get(req.sessionId);\n if (!cwd) return { ok: false, error: `Unknown session: ${req.sessionId}` };\n const killedAgents = await sessionManager.handleKill(req.sessionId, cwd);\n sessionCwdMap.delete(req.sessionId);\n sessionTmuxMap.delete(req.sessionId);\n sessionWindowMap.delete(req.sessionId);\n persistSessionRegistry();\n return { ok: true, data: { killedAgents, sessionId: req.sessionId } };\n }\n\n case 'kill-agent': {\n const cwd = sessionCwdMap.get(req.sessionId);\n if (!cwd) return { ok: false, error: `Unknown session: ${req.sessionId}` };\n await sessionManager.handleKillAgent(req.sessionId, cwd, req.agentId);\n return { ok: true, data: { agentId: req.agentId } };\n }\n\n case 'restart-agent': {\n const cwd = sessionCwdMap.get(req.sessionId);\n if (!cwd) return { ok: false, error: `Unknown session: ${req.sessionId}` };\n await sessionManager.handleRestartAgent(req.sessionId, cwd, req.agentId);\n return { ok: true, data: { agentId: req.agentId } };\n }\n\n case 'rollback': {\n let cwd = sessionCwdMap.get(req.sessionId);\n if (!cwd) {\n const stateFile = `${req.cwd}/.sisyphus/sessions/${req.sessionId}/state.json`;\n if (existsSync(stateFile)) {\n cwd = req.cwd;\n registerSessionCwd(req.sessionId, cwd);\n } else {\n return { ok: false, error: `Unknown session: ${req.sessionId}` };\n }\n }\n const result = await sessionManager.handleRollback(req.sessionId, cwd, req.toCycle);\n return { ok: true, data: result as unknown as Record<string, unknown> };\n }\n\n case 'delete': {\n // Kill session if active (best-effort)\n const activeCwd = sessionCwdMap.get(req.sessionId);\n if (activeCwd) {\n try {\n await sessionManager.handleKill(req.sessionId, activeCwd);\n } catch {\n // May already be dead — continue\n }\n sessionCwdMap.delete(req.sessionId);\n sessionTmuxMap.delete(req.sessionId);\n sessionWindowMap.delete(req.sessionId);\n sessionMessageCounters.delete(req.sessionId);\n persistSessionRegistry();\n }\n // Remove session directory\n const { sessionDir } = await import('../shared/paths.js');\n rmSync(sessionDir(req.cwd, req.sessionId), { recursive: true, force: true });\n return { ok: true };\n }\n\n case 'pane-exited': {\n const entry = lookupPane(req.paneId);\n if (!entry) return { ok: true }; // Already handled or unknown\n const cwd = sessionCwdMap.get(entry.sessionId);\n if (!cwd) {\n unregisterPane(req.paneId);\n return { ok: true };\n }\n unregisterPane(req.paneId);\n await sessionManager.handlePaneExited(req.paneId, cwd, entry.sessionId, entry.role, entry.agentId);\n return { ok: true };\n }\n\n case 'update-task': {\n const cwd = sessionCwdMap.get(req.sessionId);\n if (!cwd) return { ok: false, error: `Unknown session: ${req.sessionId}` };\n await state.updateTask(cwd, req.sessionId, req.task);\n return { ok: true };\n }\n\n case 'message': {\n const cwd = sessionCwdMap.get(req.sessionId);\n if (!cwd) return { ok: false, error: `Unknown session: ${req.sessionId}` };\n\n const counter = (sessionMessageCounters.get(req.sessionId) ?? 0) + 1;\n sessionMessageCounters.set(req.sessionId, counter);\n const id = `msg-${String(counter).padStart(3, '0')}`;\n\n const source: MessageSource = req.source ?? { type: 'user' };\n const summary = req.content.length > 200 ? req.content.slice(0, 200) + '...' : req.content;\n\n let filePath: string | undefined;\n if (req.content.length > 200) {\n const dir = messagesDir(cwd, req.sessionId);\n mkdirSync(dir, { recursive: true });\n filePath = join(dir, `${id}.md`);\n writeFileSync(filePath, req.content, 'utf-8');\n }\n\n await state.appendMessage(cwd, req.sessionId, {\n id,\n source,\n content: req.content,\n summary,\n ...(filePath ? { filePath } : {}),\n timestamp: new Date().toISOString(),\n });\n return { ok: true };\n }\n\n default:\n return { ok: false, error: `Unknown request type: ${(req as Record<string, unknown>).type}` };\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { ok: false, error: message };\n }\n}\n\nexport function startServer(): Promise<Server> {\n return new Promise((resolve, reject) => {\n const sock = socketPath();\n\n if (existsSync(sock)) {\n unlinkSync(sock);\n }\n\n server = createServer((conn) => {\n let buffer = '';\n\n conn.on('data', (chunk) => {\n buffer += chunk.toString();\n const lines = buffer.split('\\n');\n buffer = lines.pop()!;\n\n for (const line of lines) {\n if (!line.trim()) continue;\n let req: Request;\n try {\n req = JSON.parse(line) as Request;\n } catch {\n conn.write(JSON.stringify({ ok: false, error: 'Invalid JSON' }) + '\\n');\n continue;\n }\n\n handleRequest(req).then((res) => {\n conn.write(JSON.stringify(res) + '\\n');\n });\n }\n });\n\n conn.on('error', (err) => {\n console.error('[sisyphus] Connection error:', err.message);\n });\n });\n\n server.on('error', reject);\n\n server.listen(sock, () => {\n console.log(`[sisyphus] Daemon listening on ${sock}`);\n resolve(server!);\n });\n });\n}\n\nexport function stopServer(): Promise<void> {\n return new Promise((resolve) => {\n if (!server) {\n resolve();\n return;\n }\n server.close(() => {\n const sock = socketPath();\n if (existsSync(sock)) {\n unlinkSync(sock);\n }\n server = null;\n resolve();\n });\n });\n}\n","import { v4 as uuidv4 } from 'uuid';\nimport { existsSync, readdirSync, rmSync } from 'node:fs';\nimport * as state from './state.js';\nimport * as orchestrator from './orchestrator.js';\nimport * as tmux from './tmux.js';\nimport { spawnAgent, restartAgent, resetAgentCounterFromState, clearAgentCounter, handleAgentSubmit, handleAgentReport, handleAgentKilled } from './agent.js';\nimport { trackSession, untrackSession, updateTrackedWindow } from './pane-monitor.js';\nimport { resetColors } from './colors.js';\nimport { sessionDir, sessionsDir } from '../shared/paths.js';\nimport { unregisterSessionPanes, unregisterAgentPane } from './pane-registry.js';\nimport type { Session } from '../shared/types.js';\nimport { mergeWorktrees, cleanupWorktree } from './worktree.js';\n\nconst NAME_PATTERN = /^[a-zA-Z0-9_-]+$/;\n\nexport async function startSession(task: string, cwd: string, context?: string, name?: string): Promise<Session> {\n const sessionId = uuidv4();\n\n if (name && !NAME_PATTERN.test(name)) {\n throw new Error(`Invalid session name \"${name}\": only alphanumeric, hyphens, and underscores allowed`);\n }\n\n const tmuxName = `sisyphus-${name ?? sessionId.slice(0, 8)}`;\n\n if (tmux.sessionExists(tmuxName)) {\n throw new Error(`Tmux session \"${tmuxName}\" already exists. Choose a different name.`);\n }\n\n const session = state.createSession(sessionId, task, cwd, context, name);\n\n const { windowId, initialPaneId } = tmux.createSession(tmuxName, 'main', cwd);\n tmux.setSessionOption(tmuxName, '@sisyphus_cwd', cwd.replace(/\\/+$/, ''));\n await state.updateSessionTmux(cwd, sessionId, tmuxName, windowId);\n\n trackSession(sessionId, cwd, tmuxName);\n await orchestrator.spawnOrchestrator(sessionId, cwd, windowId);\n updateTrackedWindow(sessionId, windowId);\n\n // Kill the initial pane created by tmux new-session (orchestrator has its own)\n tmux.killPane(initialPaneId);\n\n pruneOldSessions(cwd);\n\n return { ...state.getSession(cwd, sessionId), tmuxSessionName: tmuxName };\n}\n\nconst PRUNE_KEEP_COUNT = 10;\nconst PRUNE_KEEP_DAYS = 7;\n\nfunction pruneOldSessions(cwd: string): void {\n try {\n const dir = sessionsDir(cwd);\n if (!existsSync(dir)) return;\n\n const entries = readdirSync(dir, { withFileTypes: true });\n const candidates: Array<{ id: string; createdAt: number }> = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n try {\n const session = state.getSession(cwd, entry.name);\n if (session.status === 'active' || session.status === 'paused') continue;\n candidates.push({ id: session.id, createdAt: new Date(session.createdAt).getTime() });\n } catch {\n // Unreadable session dir — skip, don't delete\n }\n }\n\n if (candidates.length <= PRUNE_KEEP_COUNT) return;\n\n candidates.sort((a, b) => b.createdAt - a.createdAt);\n\n const cutoff = Date.now() - PRUNE_KEEP_DAYS * 24 * 60 * 60 * 1000;\n const keep = new Set<string>();\n\n for (let i = 0; i < Math.min(PRUNE_KEEP_COUNT, candidates.length); i++) {\n keep.add(candidates[i]!.id);\n }\n for (const c of candidates) {\n if (c.createdAt >= cutoff) keep.add(c.id);\n }\n\n for (const c of candidates) {\n if (keep.has(c.id)) continue;\n rmSync(sessionDir(cwd, c.id), { recursive: true, force: true });\n }\n } catch (err) {\n console.error('[sisyphus] Session pruning failed:', err);\n }\n}\n\nexport async function resumeSession(sessionId: string, cwd: string, message?: string): Promise<Session> {\n const session = state.getSession(cwd, sessionId);\n\n const tmuxName = session.tmuxSessionName ?? `sisyphus-${sessionId.slice(0, 8)}`;\n\n let windowId: string;\n if (tmux.sessionExists(tmuxName) && session.tmuxWindowId) {\n // Reuse existing tmux session\n windowId = session.tmuxWindowId;\n } else {\n // Create fresh tmux session with the same name\n const created = tmux.createSession(tmuxName, 'main', cwd);\n tmux.setSessionOption(tmuxName, '@sisyphus_cwd', cwd.replace(/\\/+$/, ''));\n windowId = created.windowId;\n // Kill the initial pane after orchestrator spawns (below)\n await state.updateSessionTmux(cwd, sessionId, tmuxName, windowId);\n // We'll kill the initial pane after spawning orchestrator\n var initialPaneId = created.initialPaneId;\n }\n\n if (session.status !== 'active') {\n // Determine which agents still have live panes\n const livePaneIds = new Set<string>();\n if (session.tmuxWindowId) {\n const panes = tmux.listPanes(session.tmuxWindowId);\n for (const pane of panes) {\n livePaneIds.add(pane.paneId);\n }\n }\n\n // Mark running agents as \"lost\" only if their pane is gone (or no window ID to check)\n for (const agent of session.agents) {\n if (agent.status === 'running') {\n const isAlive = agent.paneId != null && livePaneIds.has(agent.paneId);\n if (!isAlive) {\n await state.updateAgent(cwd, sessionId, agent.id, {\n status: 'lost',\n completedAt: new Date().toISOString(),\n killedReason: 'session resumed — agent was still running',\n });\n }\n }\n }\n }\n\n await state.updateSessionStatus(cwd, sessionId, 'active');\n await state.updateSessionTmux(cwd, sessionId, tmuxName, windowId);\n\n // Reset counters based on existing agents\n resetAgentCounterFromState(sessionId, session.agents);\n resetColors(sessionId);\n orchestratorDone.delete(sessionId);\n\n trackSession(sessionId, cwd, tmuxName);\n await orchestrator.spawnOrchestrator(sessionId, cwd, windowId, message);\n updateTrackedWindow(sessionId, windowId);\n\n // Kill the initial pane if we created a fresh tmux session\n if (initialPaneId) {\n tmux.killPane(initialPaneId);\n }\n\n return state.getSession(cwd, sessionId);\n}\n\nexport function getSessionStatus(cwd: string, sessionId: string): Session {\n return state.getSession(cwd, sessionId);\n}\n\nexport function listSessions(cwd: string): Array<{ id: string; name?: string; task: string; status: string; createdAt: string; agentCount: number; tmuxSessionName?: string; tmuxWindowId?: string }> {\n const dir = sessionsDir(cwd);\n if (!existsSync(dir)) return [];\n\n const entries = readdirSync(dir, { withFileTypes: true });\n const sessions: Array<{ id: string; name?: string; task: string; status: string; createdAt: string; agentCount: number; tmuxSessionName?: string; tmuxWindowId?: string }> = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n try {\n const session = state.getSession(cwd, entry.name);\n sessions.push({\n id: session.id,\n name: session.name,\n task: session.task,\n status: session.status,\n createdAt: session.createdAt,\n agentCount: session.agents.length,\n tmuxSessionName: session.tmuxSessionName,\n tmuxWindowId: session.tmuxWindowId,\n });\n } catch (err) {\n console.error(`[sisyphus] Failed to read session ${entry.name}:`, err);\n }\n }\n\n return sessions;\n}\n\nconst pendingRespawns = new Set<string>();\n// Track sessions where the orchestrator has exited (yielded, crashed, etc.)\n// Prevents respawning a new orchestrator while the current one is still running\nconst orchestratorDone = new Set<string>();\n\nexport function onAllAgentsDone(sessionId: string, cwd: string, windowId: string): void {\n if (pendingRespawns.has(sessionId)) return;\n\n // Don't respawn while the orchestrator is still running — wait for yield\n if (!orchestratorDone.has(sessionId)) {\n console.log(`[sisyphus] All agents done for session ${sessionId}, waiting for orchestrator to yield`);\n return;\n }\n\n const session = state.getSession(cwd, sessionId);\n if (session.status !== 'active') return;\n\n pendingRespawns.add(sessionId);\n orchestratorDone.delete(sessionId);\n\n // Merge any worktree agents before respawning orchestrator\n const worktreeAgents = session.agents.filter(a => a.worktreePath && a.mergeStatus === 'pending');\n if (worktreeAgents.length > 0) {\n const results = mergeWorktrees(cwd, worktreeAgents);\n for (const result of results) {\n const mergeStatus = result.status as 'merged' | 'no-changes' | 'conflict';\n state.updateAgent(cwd, sessionId, result.agentId, {\n mergeStatus,\n mergeDetails: result.conflictDetails,\n }).catch((err: unknown) => console.error(`[sisyphus] Failed to update merge status for ${result.agentId}:`, err));\n }\n }\n\n // Snapshot state at cycle boundary before respawning orchestrator\n const cycleNumber = session.orchestratorCycles.length;\n if (cycleNumber > 0) {\n state.createSnapshot(cwd, sessionId, cycleNumber);\n }\n\n // Respawn on next tick — agents already finished, no delay needed\n setImmediate(async () => {\n pendingRespawns.delete(sessionId);\n try {\n // Re-check status — pane monitor may have paused us in the meantime\n const freshSession = state.getSession(cwd, sessionId);\n if (freshSession.status !== 'active') return;\n\n // Ensure the tmux session and window still exist.\n // Killing the last pane (orchestrator yield with no agents) destroys the window/session.\n let activeWindowId = windowId;\n const tmuxName = freshSession.tmuxSessionName;\n const needsRecreation = tmuxName && (\n !tmux.sessionExists(tmuxName) ||\n tmux.listPanes(activeWindowId).length === 0\n );\n let initialPaneId: string | undefined;\n if (needsRecreation) {\n // Kill stale session if it exists without our window\n if (tmux.sessionExists(tmuxName!)) {\n tmux.killSession(tmuxName!);\n }\n const created = tmux.createSession(tmuxName!, 'main', cwd);\n tmux.setSessionOption(tmuxName!, '@sisyphus_cwd', cwd.replace(/\\/+$/, ''));\n activeWindowId = created.windowId;\n initialPaneId = created.initialPaneId;\n await state.updateSessionTmux(cwd, sessionId, tmuxName!, activeWindowId);\n trackSession(sessionId, cwd, tmuxName!);\n }\n await orchestrator.spawnOrchestrator(sessionId, cwd, activeWindowId);\n updateTrackedWindow(sessionId, activeWindowId);\n if (initialPaneId) tmux.killPane(initialPaneId);\n\n // Clean up completed agent panes now that the orchestrator is alive\n for (const agent of freshSession.agents) {\n if (agent.status !== 'running' && agent.paneId) {\n tmux.killPane(agent.paneId);\n }\n }\n tmux.selectLayout(activeWindowId);\n } catch (err) {\n console.error(`[sisyphus] Failed to respawn orchestrator for session ${sessionId}:`, err);\n }\n });\n}\n\nexport async function handleSpawn(\n sessionId: string,\n cwd: string,\n agentType: string,\n name: string,\n instruction: string,\n worktree?: boolean,\n): Promise<{ agentId: string }> {\n const windowId = orchestrator.getWindowId(sessionId);\n if (!windowId) throw new Error(`No tmux window found for session ${sessionId}`);\n\n // Re-activate completed sessions so the cycle can resume\n const session = state.getSession(cwd, sessionId);\n if (session.status === 'completed') {\n await state.updateSessionStatus(cwd, sessionId, 'active');\n trackSession(sessionId, cwd, session.tmuxSessionName!);\n }\n\n const agent = await spawnAgent({\n sessionId,\n cwd,\n agentType,\n name,\n instruction,\n windowId,\n worktree,\n });\n\n await state.appendAgentToLastCycle(cwd, sessionId, agent.id);\n\n return { agentId: agent.id };\n}\n\nexport async function handleSubmit(cwd: string, sessionId: string, agentId: string, report: string, windowId: string): Promise<void> {\n const allDone = await handleAgentSubmit(cwd, sessionId, agentId, report);\n if (allDone) {\n onAllAgentsDone(sessionId, cwd, windowId);\n }\n}\n\nexport async function handleReport(cwd: string, sessionId: string, agentId: string, content: string): Promise<void> {\n await handleAgentReport(cwd, sessionId, agentId, content);\n}\n\nexport async function handleYield(sessionId: string, cwd: string, nextPrompt?: string, mode?: string): Promise<void> {\n // Re-activate paused sessions so respawn can proceed\n const pre = state.getSession(cwd, sessionId);\n if (pre.status === 'paused') {\n await state.updateSessionStatus(cwd, sessionId, 'active');\n }\n\n await orchestrator.handleOrchestratorYield(sessionId, cwd, nextPrompt, mode);\n\n // Mark orchestrator as done for this cycle — unblocks respawn\n orchestratorDone.add(sessionId);\n\n const session = state.getSession(cwd, sessionId);\n const hasRunningAgents = session.agents.some(a => a.status === 'running');\n if (!hasRunningAgents) {\n // Fall back to state's tmuxWindowId if in-memory map is missing (e.g., after daemon restart)\n const windowId = orchestrator.getWindowId(sessionId) ?? session.tmuxWindowId;\n if (windowId) {\n onAllAgentsDone(sessionId, cwd, windowId);\n }\n }\n}\n\nexport async function handleComplete(sessionId: string, cwd: string, report: string): Promise<void> {\n await orchestrator.handleOrchestratorComplete(sessionId, cwd, report);\n}\n\nexport async function handleContinue(sessionId: string, cwd: string): Promise<void> {\n await state.continueSession(cwd, sessionId);\n}\n\nexport async function handleRegisterClaudeSession(\n cwd: string,\n sessionId: string,\n agentId: string,\n claudeSessionId: string,\n): Promise<void> {\n await state.updateAgent(cwd, sessionId, agentId, { claudeSessionId });\n}\n\nexport async function handleKill(sessionId: string, cwd: string): Promise<number> {\n const session = state.getSession(cwd, sessionId);\n const windowId = orchestrator.getWindowId(sessionId);\n\n // Kill all running agents\n let killedAgents = 0;\n for (const agent of session.agents) {\n if (agent.status === 'running') {\n await state.updateAgent(cwd, sessionId, agent.id, {\n status: 'killed',\n killedReason: 'session killed by user',\n completedAt: new Date().toISOString(),\n });\n killedAgents++;\n }\n }\n\n // Clean up worktrees for agents that had them\n for (const agent of session.agents) {\n if (agent.worktreePath && agent.branchName) {\n cleanupWorktree(cwd, agent.worktreePath, agent.branchName);\n }\n }\n\n // Kill the orchestrator pane if it exists\n const orchPaneId = orchestrator.getOrchestratorPaneId(sessionId);\n if (orchPaneId) {\n tmux.killPane(orchPaneId);\n }\n\n // Mark session as completed\n await state.updateSessionStatus(cwd, sessionId, 'completed');\n\n // Untrack from pane monitor and pane registry\n untrackSession(sessionId);\n unregisterSessionPanes(sessionId);\n\n // Kill the entire tmux session (destroys all panes/windows atomically)\n if (session.tmuxSessionName) {\n tmux.killSession(session.tmuxSessionName);\n } else if (windowId) {\n tmux.killWindow(windowId);\n }\n\n // Clean up agent counter\n clearAgentCounter(sessionId);\n orchestratorDone.delete(sessionId);\n\n return killedAgents;\n}\n\nexport async function handleRestartAgent(sessionId: string, cwd: string, agentId: string): Promise<void> {\n const session = state.getSession(cwd, sessionId);\n const agent = session.agents.find(a => a.id === agentId);\n if (!agent) throw new Error(`Unknown agent: ${agentId}`);\n\n const windowId = orchestrator.getWindowId(sessionId) ?? session.tmuxWindowId;\n if (!windowId) throw new Error(`No tmux window found for session ${sessionId}`);\n\n await restartAgent(sessionId, cwd, agentId, windowId);\n}\n\nexport async function handleKillAgent(sessionId: string, cwd: string, agentId: string): Promise<void> {\n const session = state.getSession(cwd, sessionId);\n const agent = session.agents.find(a => a.id === agentId);\n if (!agent) throw new Error(`Unknown agent: ${agentId}`);\n if (agent.status !== 'running') throw new Error(`Agent ${agentId} is not running (status: ${agent.status})`);\n\n // Unregister pane first so the pane monitor doesn't trigger a respawn\n unregisterAgentPane(sessionId, agentId);\n\n // Kill the tmux pane\n if (agent.paneId) {\n tmux.killPane(agent.paneId);\n }\n\n // Clean up worktree if applicable\n if (agent.worktreePath && agent.branchName) {\n cleanupWorktree(cwd, agent.worktreePath, agent.branchName);\n }\n\n await state.updateAgent(cwd, sessionId, agentId, {\n status: 'killed',\n killedReason: 'killed by user',\n completedAt: new Date().toISOString(),\n });\n}\n\nexport async function handleRollback(sessionId: string, cwd: string, toCycle: number): Promise<{ sessionId: string; restoredToCycle: number }> {\n const session = state.getSession(cwd, sessionId);\n\n // Validate cycle range\n if (toCycle < 1 || toCycle > session.orchestratorCycles.length) {\n const available = state.listSnapshots(cwd, sessionId);\n throw new Error(\n `Invalid cycle ${toCycle}. Available snapshots: ${available.length > 0 ? available.join(', ') : 'none'}`,\n );\n }\n\n // Validate snapshot exists\n const available = state.listSnapshots(cwd, sessionId);\n if (!available.includes(toCycle)) {\n throw new Error(\n `No snapshot for cycle ${toCycle}. Available snapshots: ${available.length > 0 ? available.join(', ') : 'none'}`,\n );\n }\n\n // Kill running agents (without completing session or killing window)\n for (const agent of session.agents) {\n if (agent.status === 'running') {\n await state.updateAgent(cwd, sessionId, agent.id, {\n status: 'killed',\n killedReason: 'session rolled back',\n completedAt: new Date().toISOString(),\n });\n }\n }\n\n // Clean up worktrees\n for (const agent of session.agents) {\n if (agent.worktreePath && agent.branchName) {\n cleanupWorktree(cwd, agent.worktreePath, agent.branchName);\n }\n }\n\n // Kill orchestrator pane if running\n const orchPaneId = orchestrator.getOrchestratorPaneId(sessionId);\n if (orchPaneId) {\n tmux.killPane(orchPaneId);\n }\n\n // Untrack from monitor and registry\n untrackSession(sessionId);\n unregisterSessionPanes(sessionId);\n clearAgentCounter(sessionId);\n orchestratorDone.delete(sessionId);\n\n // Restore snapshot state\n await state.restoreSnapshot(cwd, sessionId, toCycle);\n\n // Delete snapshots for cycles after the rollback target\n state.deleteSnapshotsAfter(cwd, sessionId, toCycle);\n\n return { sessionId, restoredToCycle: toCycle };\n}\n\nexport async function handlePaneExited(\n paneId: string,\n cwd: string,\n sessionId: string,\n role: 'orchestrator' | 'agent',\n agentId?: string,\n): Promise<void> {\n const session = state.getSession(cwd, sessionId);\n if (session.status !== 'active') return;\n\n if (role === 'agent' && agentId) {\n const agent = session.agents.find(a => a.id === agentId);\n if (!agent || agent.status !== 'running') return;\n\n const allDone = await handleAgentKilled(cwd, sessionId, agentId, 'pane exited');\n if (allDone) {\n const windowId = orchestrator.getWindowId(sessionId) ?? session.tmuxWindowId;\n if (windowId) {\n onAllAgentsDone(sessionId, cwd, windowId);\n }\n }\n } else if (role === 'orchestrator') {\n // Orchestrator pane exited unexpectedly (crash, context exhaustion, /exit)\n orchestratorDone.add(sessionId);\n const hasRunningAgents = session.agents.some(a => a.status === 'running');\n if (!hasRunningAgents && session.agents.length > 0) {\n const windowId = orchestrator.getWindowId(sessionId) ?? session.tmuxWindowId;\n if (windowId) {\n console.log(`[sisyphus] Orchestrator pane exited for session ${sessionId}, all agents done — triggering respawn`);\n onAllAgentsDone(sessionId, cwd, windowId);\n }\n } else if (!hasRunningAgents) {\n // No agents at all — pause session\n await state.updateSessionStatus(cwd, sessionId, 'paused');\n console.log(`[sisyphus] Session ${sessionId} paused: orchestrator pane exited with no agents`);\n }\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { copyFileSync, cpSync, existsSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { contextDir, goalPath, legacyLogsPath, logsDir, roadmapPath, promptsDir, sessionDir, snapshotDir, snapshotsDir, statePath } from '../shared/paths.js';\nimport type { Agent, AgentReport, Message, OrchestratorCycle, Session, SessionStatus } from '../shared/types.js';\n\nconst ROADMAP_SEED = `---\ndescription: >\n Living document tracking development phases and outstanding work.\n---\n`;\n\nconst CONTEXT_CLAUDE_MD = `# context/\n\nAgents save exploration findings, architectural notes, and reference material here for use across cycles.\n`;\n\n// Per-session mutex to prevent read-modify-write races\nconst sessionLocks = new Map<string, Promise<void>>();\n\nasync function withSessionLock<T>(sessionId: string, fn: () => T): Promise<T> {\n const prev = sessionLocks.get(sessionId) ?? Promise.resolve();\n let resolve: () => void;\n const next = new Promise<void>(r => { resolve = r; });\n sessionLocks.set(sessionId, next);\n await prev;\n try {\n return fn();\n } finally {\n resolve!();\n }\n}\n\nfunction atomicWrite(filePath: string, data: string): void {\n const dir = dirname(filePath);\n const tmpPath = join(dir, `.state.${randomUUID()}.tmp`);\n writeFileSync(tmpPath, data, 'utf-8');\n renameSync(tmpPath, filePath);\n}\n\nexport function createSession(id: string, task: string, cwd: string, context?: string, name?: string): Session {\n const dir = sessionDir(cwd, id);\n mkdirSync(dir, { recursive: true });\n mkdirSync(contextDir(cwd, id), { recursive: true });\n mkdirSync(promptsDir(cwd, id), { recursive: true });\n\n writeFileSync(roadmapPath(cwd, id), ROADMAP_SEED, 'utf-8');\n mkdirSync(logsDir(cwd, id), { recursive: true });\n writeFileSync(goalPath(cwd, id), task, 'utf-8');\n writeFileSync(join(contextDir(cwd, id), 'CLAUDE.md'), CONTEXT_CLAUDE_MD, 'utf-8');\n\n const session: Session = {\n id,\n ...(name ? { name } : {}),\n task,\n ...(context ? { context } : {}),\n cwd,\n status: 'active',\n createdAt: new Date().toISOString(),\n agents: [],\n orchestratorCycles: [],\n messages: [],\n };\n\n atomicWrite(statePath(cwd, id), JSON.stringify(session, null, 2));\n return session;\n}\n\nexport function getSession(cwd: string, sessionId: string): Session {\n const content = readFileSync(statePath(cwd, sessionId), 'utf-8');\n return JSON.parse(content) as Session;\n}\n\nfunction saveSession(session: Session): void {\n atomicWrite(statePath(session.cwd, session.id), JSON.stringify(session, null, 2));\n}\n\nexport async function addAgent(cwd: string, sessionId: string, agent: Agent): Promise<void> {\n return withSessionLock(sessionId, () => {\n const session = getSession(cwd, sessionId);\n session.agents.push(agent);\n saveSession(session);\n });\n}\n\nexport async function updateAgent(cwd: string, sessionId: string, agentId: string, updates: Partial<Agent>): Promise<void> {\n return withSessionLock(sessionId, () => {\n const session = getSession(cwd, sessionId);\n const agent = session.agents.slice().reverse().find((a: Agent) => a.id === agentId);\n if (!agent) throw new Error(`Agent ${agentId} not found in session ${sessionId}`);\n Object.assign(agent, updates);\n saveSession(session);\n });\n}\n\nexport async function addOrchestratorCycle(cwd: string, sessionId: string, cycle: OrchestratorCycle): Promise<void> {\n return withSessionLock(sessionId, () => {\n const session = getSession(cwd, sessionId);\n session.orchestratorCycles.push(cycle);\n saveSession(session);\n });\n}\n\nexport async function updateSessionStatus(cwd: string, sessionId: string, status: SessionStatus, completionReport?: string): Promise<void> {\n return withSessionLock(sessionId, () => {\n const session = getSession(cwd, sessionId);\n session.status = status;\n if (completionReport !== undefined) {\n session.completionReport = completionReport;\n }\n saveSession(session);\n });\n}\n\nexport async function appendAgentToLastCycle(cwd: string, sessionId: string, agentId: string): Promise<void> {\n return withSessionLock(sessionId, () => {\n const session = getSession(cwd, sessionId);\n const cycles = session.orchestratorCycles;\n if (cycles.length === 0) return;\n cycles[cycles.length - 1]!.agentsSpawned.push(agentId);\n saveSession(session);\n });\n}\n\nexport async function completeSession(cwd: string, sessionId: string, report: string): Promise<void> {\n return withSessionLock(sessionId, () => {\n const session = getSession(cwd, sessionId);\n session.status = 'completed';\n session.completedAt = new Date().toISOString();\n session.completionReport = report;\n saveSession(session);\n });\n}\n\nexport async function continueSession(cwd: string, sessionId: string): Promise<void> {\n return withSessionLock(sessionId, () => {\n const session = getSession(cwd, sessionId);\n if (session.status !== 'completed') {\n throw new Error(`Session ${sessionId} is not completed (status: ${session.status})`);\n }\n session.status = 'active';\n session.completedAt = undefined;\n session.completionReport = undefined;\n const cycles = session.orchestratorCycles;\n if (cycles.length > 0) {\n cycles[cycles.length - 1]!.completedAt = undefined;\n }\n saveSession(session);\n writeFileSync(roadmapPath(cwd, sessionId), '', 'utf-8');\n });\n}\n\nexport async function appendAgentReport(cwd: string, sessionId: string, agentId: string, entry: AgentReport): Promise<void> {\n return withSessionLock(sessionId, () => {\n const session = getSession(cwd, sessionId);\n const agent = session.agents.slice().reverse().find((a: Agent) => a.id === agentId);\n if (!agent) throw new Error(`Agent ${agentId} not found in session ${sessionId}`);\n agent.reports.push(entry);\n saveSession(session);\n });\n}\n\nexport async function updateReportSummary(\n cwd: string,\n sessionId: string,\n agentId: string,\n filePath: string,\n summary: string,\n): Promise<void> {\n return withSessionLock(sessionId, () => {\n const session = getSession(cwd, sessionId);\n const agent = session.agents.slice().reverse().find((a: Agent) => a.id === agentId);\n if (!agent) return;\n const report = agent.reports.find((r) => r.filePath === filePath);\n if (report) {\n report.summary = summary;\n saveSession(session);\n }\n });\n}\n\nexport async function updateSessionTmux(cwd: string, sessionId: string, tmuxSessionName: string, tmuxWindowId: string): Promise<void> {\n return withSessionLock(sessionId, () => {\n const session = getSession(cwd, sessionId);\n session.tmuxSessionName = tmuxSessionName;\n session.tmuxWindowId = tmuxWindowId;\n saveSession(session);\n });\n}\n\nexport async function drainMessages(cwd: string, sessionId: string, count: number): Promise<void> {\n return withSessionLock(sessionId, () => {\n const session = getSession(cwd, sessionId);\n if (!session.messages || count <= 0) return;\n session.messages = session.messages.slice(count);\n saveSession(session);\n });\n}\n\nexport async function appendMessage(cwd: string, sessionId: string, message: Message): Promise<void> {\n return withSessionLock(sessionId, () => {\n const session = getSession(cwd, sessionId);\n if (!session.messages) session.messages = [];\n session.messages.push(message);\n saveSession(session);\n });\n}\n\nexport async function updateTask(cwd: string, sessionId: string, task: string): Promise<void> {\n return withSessionLock(sessionId, () => {\n const session = getSession(cwd, sessionId);\n session.task = task;\n saveSession(session);\n writeFileSync(goalPath(cwd, sessionId), task, 'utf-8');\n });\n}\n\nexport async function completeOrchestratorCycle(cwd: string, sessionId: string, nextPrompt?: string, mode?: string): Promise<void> {\n return withSessionLock(sessionId, () => {\n const session = getSession(cwd, sessionId);\n const cycles = session.orchestratorCycles;\n if (cycles.length === 0) return;\n const cycle = cycles[cycles.length - 1]!;\n cycle.completedAt = new Date().toISOString();\n if (nextPrompt) cycle.nextPrompt = nextPrompt;\n if (mode) cycle.mode = mode;\n saveSession(session);\n });\n}\n\nexport function createSnapshot(cwd: string, sessionId: string, cycleNumber: number): void {\n const dir = snapshotDir(cwd, sessionId, cycleNumber);\n mkdirSync(dir, { recursive: true });\n\n copyFileSync(statePath(cwd, sessionId), join(dir, 'state.json'));\n\n const roadmap = roadmapPath(cwd, sessionId);\n if (existsSync(roadmap)) copyFileSync(roadmap, join(dir, 'roadmap.md'));\n\n const ld = logsDir(cwd, sessionId);\n if (existsSync(ld)) cpSync(ld, join(dir, 'logs'), { recursive: true });\n const legacyLogs = legacyLogsPath(cwd, sessionId);\n if (existsSync(legacyLogs)) copyFileSync(legacyLogs, join(dir, 'logs.md'));\n}\n\nexport async function restoreSnapshot(cwd: string, sessionId: string, toCycle: number): Promise<void> {\n return withSessionLock(sessionId, () => {\n const dir = snapshotDir(cwd, sessionId, toCycle);\n if (!existsSync(dir)) throw new Error(`No snapshot found for cycle ${toCycle}`);\n\n // Restore state.json atomically\n const snapshotState = readFileSync(join(dir, 'state.json'), 'utf-8');\n const session = JSON.parse(snapshotState) as Session;\n session.status = 'paused';\n session.completedAt = undefined;\n session.completionReport = undefined;\n session.tmuxSessionName = undefined;\n session.tmuxWindowId = undefined;\n atomicWrite(statePath(cwd, sessionId), JSON.stringify(session, null, 2));\n\n // Restore roadmap.md and logs\n const snapshotRoadmap = join(dir, 'roadmap.md');\n if (existsSync(snapshotRoadmap)) copyFileSync(snapshotRoadmap, roadmapPath(cwd, sessionId));\n\n const snapshotLogsDir = join(dir, 'logs');\n if (existsSync(snapshotLogsDir)) {\n const currentLogsDir = logsDir(cwd, sessionId);\n if (existsSync(currentLogsDir)) rmSync(currentLogsDir, { recursive: true, force: true });\n cpSync(snapshotLogsDir, currentLogsDir, { recursive: true });\n } else {\n // Legacy fallback: snapshot has logs.md instead of logs/\n const snapshotLogs = join(dir, 'logs.md');\n if (existsSync(snapshotLogs)) copyFileSync(snapshotLogs, legacyLogsPath(cwd, sessionId));\n }\n });\n}\n\nexport function listSnapshots(cwd: string, sessionId: string): number[] {\n const dir = snapshotsDir(cwd, sessionId);\n if (!existsSync(dir)) return [];\n\n return readdirSync(dir, { withFileTypes: true })\n .filter(e => e.isDirectory() && e.name.startsWith('cycle-'))\n .map(e => parseInt(e.name.replace('cycle-', ''), 10))\n .filter(n => !isNaN(n))\n .sort((a, b) => a - b);\n}\n\nexport function deleteSnapshotsAfter(cwd: string, sessionId: string, afterCycle: number): void {\n const dir = snapshotsDir(cwd, sessionId);\n if (!existsSync(dir)) return;\n\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (!entry.isDirectory() || !entry.name.startsWith('cycle-')) continue;\n const num = parseInt(entry.name.replace('cycle-', ''), 10);\n if (!isNaN(num) && num > afterCycle) {\n rmSync(join(dir, entry.name), { recursive: true, force: true });\n }\n }\n}\n","import { existsSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { resolve, dirname, join } from 'node:path';\nimport { contextDir, goalPath, cycleLogPath, roadmapPath, projectOrchestratorPromptPath, promptsDir, worktreeConfigPath } from '../shared/paths.js';\nimport type { Agent, Session } from '../shared/types.js';\nimport { loadConfig } from '../shared/config.js';\nimport { ORCHESTRATOR_COLOR } from './colors.js';\nimport { discoverAgentTypes } from './frontmatter.js';\nimport * as state from './state.js';\nimport * as tmux from './tmux.js';\nimport { registerPane, unregisterPane, unregisterSessionPanes } from './pane-registry.js';\n\nfunction shellQuote(s: string): string {\n return `'${s.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nconst sessionWindowMap = new Map<string, string>();\nconst sessionOrchestratorPane = new Map<string, string>();\n\nexport function getWindowId(sessionId: string): string | undefined {\n return sessionWindowMap.get(sessionId);\n}\n\nexport function setWindowId(sessionId: string, windowId: string): void {\n sessionWindowMap.set(sessionId, windowId);\n}\n\nexport function getOrchestratorPaneId(sessionId: string): string | undefined {\n return sessionOrchestratorPane.get(sessionId);\n}\n\nexport function setOrchestratorPaneId(sessionId: string, paneId: string): void {\n sessionOrchestratorPane.set(sessionId, paneId);\n}\n\nfunction loadOrchestratorPrompt(cwd: string, mode: string): string {\n const projectPath = projectOrchestratorPromptPath(cwd);\n if (existsSync(projectPath)) {\n return readFileSync(projectPath, 'utf-8');\n }\n\n const basePath = resolve(import.meta.dirname, '../templates/orchestrator-base.md');\n const base = readFileSync(basePath, 'utf-8');\n\n if (mode === 'implementation') {\n const implPath = resolve(import.meta.dirname, '../templates/orchestrator-impl.md');\n return base + '\\n\\n' + readFileSync(implPath, 'utf-8');\n }\n\n // Default: planning mode\n const planningPath = resolve(import.meta.dirname, '../templates/orchestrator-planning.md');\n return base + '\\n\\n' + readFileSync(planningPath, 'utf-8');\n}\n\nfunction formatStateForOrchestrator(session: Session): string {\n const cycleNum = session.orchestratorCycles.length;\n\n const ctxDir = contextDir(session.cwd, session.id);\n const roadmapFile = roadmapPath(session.cwd, session.id);\n const logFile = cycleLogPath(session.cwd, session.id, cycleNum + 1);\n\n // Context section: first cycle shows background context text; subsequent cycles show context dir files\n let contextSection = '';\n if (cycleNum === 0) {\n if (session.context) {\n contextSection = `\\n## Context\\n\\n${session.context}\\n`;\n }\n } else {\n let ctxFiles: string[] = [];\n if (existsSync(ctxDir)) {\n ctxFiles = readdirSync(ctxDir).filter(f => f !== 'CLAUDE.md');\n }\n if (ctxFiles.length > 0) {\n const ctxLines = ctxFiles.map(f => `- ${join(ctxDir, f)}`).join('\\n');\n contextSection = `\\n## Context\\n\\n${ctxLines}\\n`;\n }\n }\n\n // Messages section\n const messages = session.messages ?? [];\n const messagesSection = messages.length > 0\n ? '\\n### Messages\\n\\n' + messages.map(m => {\n const sourceLabel = m.source.type === 'agent'\n ? `agent:${m.source.agentId}`\n : m.source.type === 'system' && m.source.detail\n ? `system:${m.source.detail}`\n : m.source.type;\n const fileRef = m.filePath ? ` → ${m.filePath}` : '';\n return `- [${sourceLabel} @ ${m.timestamp}] \"${m.summary}\"${fileRef}`;\n }).join('\\n') + '\\n'\n : '';\n\n // Previous cycles: all except last, compact format\n let previousCyclesSection = '';\n if (session.orchestratorCycles.length > 1) {\n const previousCycles = session.orchestratorCycles.slice(0, -1);\n const agentMap = new Map(session.agents.map((a: Agent) => [a.id, a]));\n const lines = previousCycles.map(c => {\n const agentDescs = c.agentsSpawned.map(id => {\n const agent = agentMap.get(id);\n return agent ? `${id} (${agent.name})` : id;\n }).join(', ');\n return `Cycle ${c.cycle}: ${agentDescs || '(none)'}`;\n });\n previousCyclesSection = `\\n### Previous Cycles\\n\\n${lines.join('\\n')}\\n`;\n }\n\n // Most recent cycle: full report content\n let mostRecentCycleSection = '';\n const lastCycle = session.orchestratorCycles[session.orchestratorCycles.length - 1];\n if (lastCycle && lastCycle.agentsSpawned.length > 0) {\n const agentMap = new Map(session.agents.map((a: Agent) => [a.id, a]));\n const agentBlocks = lastCycle.agentsSpawned.map(id => {\n const agent = agentMap.get(id);\n if (!agent) return `<agent-${id} status=\"unknown\">\\n(no agent data)\\n</agent-${id}>`;\n\n // Prefer 'final' report, fall back to last report\n const finalReport = agent.reports.find(r => r.type === 'final');\n const reportToUse = finalReport ?? agent.reports[agent.reports.length - 1];\n\n let reportContent = '(no reports)';\n if (reportToUse) {\n try {\n reportContent = readFileSync(reportToUse.filePath, 'utf-8');\n } catch {\n reportContent = `(could not read report: ${reportToUse.filePath})`;\n }\n }\n\n return `<agent-${id} name=\"${agent.name}\" status=\"${agent.status}\">\\n${reportContent}\\n</agent-${id}>`;\n }).join('\\n');\n\n mostRecentCycleSection = `\\n### Most Recent Cycle\\n\\n<last-cycle>\\n${agentBlocks}\\n</last-cycle>\\n`;\n }\n\n // Roadmap section\n const roadmapRef = existsSync(roadmapFile) ? `@${roadmapFile}` : '(empty)';\n\n // Worktree status — only if any agents have worktree info or worktree config exists\n const worktreeAgents = session.agents.filter(a => a.worktreePath);\n let worktreeSection = '';\n if (worktreeAgents.length > 0 || existsSync(worktreeConfigPath(session.cwd))) {\n let wtLines = '';\n if (worktreeAgents.length > 0) {\n wtLines = '\\n' + worktreeAgents.map((a: Agent) => {\n if (a.mergeStatus === 'conflict') {\n return `- ${a.id}: CONFLICT — ${a.mergeDetails ?? 'unknown'}\\n Branch: ${a.branchName}\\n Worktree: ${a.worktreePath}`;\n }\n if (a.mergeStatus === 'no-changes') {\n return `- ${a.id}: NO CHANGES — agent did not commit any work to branch ${a.branchName}`;\n }\n const status = a.mergeStatus ?? 'pending';\n return `- ${a.id}: ${status} (branch ${a.branchName})`;\n }).join('\\n');\n }\n const worktreeHint = existsSync(worktreeConfigPath(session.cwd))\n ? 'Worktree config active (`.sisyphus/worktree.json`). Use `--worktree` flag with `sisyphus spawn` to isolate agents in their own worktrees. Recommended for feature work, especially with potential file overlap.'\n : 'No worktree configuration found. If this session involves parallel work where agents may edit overlapping files, use the `git-management` skill to set up `.sisyphus/worktree.json` and enable worktree isolation.';\n worktreeSection = `\\n\\n## Git Worktrees\\n\\n${worktreeHint}${wtLines}`;\n }\n\n // Goal section: read from goal.md, fall back to session.task\n const goalFile = goalPath(session.cwd, session.id);\n const goalContent = existsSync(goalFile) ? readFileSync(goalFile, 'utf-8').trim() : session.task;\n\n return `## Goal\n\n${goalContent}\n${contextSection}${messagesSection}\n### Cycle Log\n\nWrite your cycle summary to: ${logFile}\n${previousCyclesSection}${mostRecentCycleSection}\n## Roadmap\n\n${roadmapRef}\n${worktreeSection}`;\n}\n\nexport async function spawnOrchestrator(sessionId: string, cwd: string, windowId: string, message?: string): Promise<void> {\n const session = state.getSession(cwd, sessionId);\n\n // Read mode and nextPrompt from last completed cycle\n const lastCycle = [...session.orchestratorCycles].reverse().find(c => c.completedAt);\n const mode = lastCycle?.mode ?? 'planning';\n\n const basePrompt = loadOrchestratorPrompt(cwd, mode);\n const formattedState = formatStateForOrchestrator(session);\n\n // Inject available agent types into system prompt\n const agentPluginPath = resolve(import.meta.dirname, '../templates/agent-plugin');\n const agentTypes = discoverAgentTypes(agentPluginPath, session.cwd);\n\n // Built-in Claude Code agents available via --agent flag\n agentTypes.push(\n { qualifiedName: 'Explore', source: 'bundled', model: 'haiku', description: 'Fast codebase exploration — find files, search code, answer questions about architecture. Use for research and context gathering.' },\n );\n\n const agentTypeLines = agentTypes.length > 0\n ? agentTypes.map(t => {\n const modelTag = t.model ? ` (${t.model})` : '';\n const desc = t.description ? ` — ${t.description}` : '';\n return `- \\`${t.qualifiedName}\\`${modelTag}${desc}`;\n }).join('\\n')\n : ' (none)';\n const systemPrompt = basePrompt.replace('{{AGENT_TYPES}}', agentTypeLines);\n\n // System prompt: template + agent types (no state)\n const cycleNum = session.orchestratorCycles.length + 1;\n const promptFilePath = `${promptsDir(cwd, sessionId)}/orchestrator-system-${cycleNum}.md`;\n writeFileSync(promptFilePath, systemPrompt, 'utf-8');\n\n sessionWindowMap.set(sessionId, windowId);\n\n // Resolve CLI binary path so `sisyphus` works even when installed as a local dependency\n const cliBin = resolve(import.meta.dirname, 'cli.js');\n const npmBinDir = resolve(import.meta.dirname, '../../.bin');\n\n const envExports = [\n `export SISYPHUS_SESSION_ID='${sessionId}'`,\n `export SISYPHUS_AGENT_ID='orchestrator'`,\n `export SISYPHUS_CWD='${cwd}'`,\n `export PATH=\"${npmBinDir}:$PATH\"`,\n ].join(' && ');\n\n // User message: session state + contextual prompt\n let userPrompt = formattedState;\n if (message) {\n userPrompt += `\\n\\n## Continuation Instructions\\n\\nThe user resumed this session with new instructions: ${message}`;\n } else {\n const storedPrompt = lastCycle?.nextPrompt;\n const continuationText = storedPrompt ? storedPrompt : 'Review the current session and delegate the next cycle of work.';\n userPrompt += `\\n\\n## Continuation Instructions\\n\\n${continuationText}`;\n }\n\n const userPromptFilePath = `${promptsDir(cwd, sessionId)}/orchestrator-user-${cycleNum}.md`;\n writeFileSync(userPromptFilePath, userPrompt, 'utf-8');\n\n // Drain rendered messages so they don't reappear in future cycles\n if (session.messages && session.messages.length > 0) {\n await state.drainMessages(cwd, sessionId, session.messages.length);\n }\n\n const pluginPath = resolve(import.meta.dirname, '../templates/orchestrator-plugin');\n const settingsPath = resolve(import.meta.dirname, '../templates/orchestrator-settings.json');\n const config = loadConfig(cwd);\n const effort = config.orchestratorEffort ?? 'high';\n const claudeCmd = `claude --dangerously-skip-permissions --disallowed-tools \"Task,Agent\" --effort ${effort} --settings \"${settingsPath}\" --plugin-dir \"${pluginPath}\" --name \"sisyphus:orch-${sessionId.slice(0, 8)}-cycle-${cycleNum}\" --system-prompt \"$(cat '${promptFilePath}')\" \"$(cat '${userPromptFilePath}')\"`;\n\n const paneId = tmux.createPane(windowId, cwd, 'left');\n\n sessionOrchestratorPane.set(sessionId, paneId);\n registerPane(paneId, sessionId, 'orchestrator');\n tmux.setPaneTitle(paneId, `Sisyphus`);\n tmux.setPaneStyle(paneId, ORCHESTRATOR_COLOR);\n\n const bannerPath = resolve(import.meta.dirname, '../templates/banner.txt');\n const bannerCmd = existsSync(bannerPath) ? `cat '${bannerPath}' &&` : '';\n const notifyCmd = `node \"${cliBin}\" notify pane-exited --pane-id ${paneId}`;\n tmux.sendKeys(paneId, `${bannerCmd} ${envExports} && ${claudeCmd}; ${notifyCmd}`);\n\n await state.addOrchestratorCycle(cwd, sessionId, {\n cycle: cycleNum,\n timestamp: new Date().toISOString(),\n agentsSpawned: [],\n paneId,\n });\n}\n\nfunction resolveOrchestratorPane(sessionId: string, cwd: string): string | undefined {\n const memPane = sessionOrchestratorPane.get(sessionId);\n if (memPane) return memPane;\n const session = state.getSession(cwd, sessionId);\n const lastCycle = session.orchestratorCycles[session.orchestratorCycles.length - 1];\n return lastCycle?.paneId ?? undefined;\n}\n\nexport async function handleOrchestratorYield(sessionId: string, cwd: string, nextPrompt?: string, mode?: string): Promise<void> {\n const paneId = resolveOrchestratorPane(sessionId, cwd);\n if (paneId) {\n tmux.killPane(paneId);\n unregisterPane(paneId);\n sessionOrchestratorPane.delete(sessionId);\n }\n\n const windowId = sessionWindowMap.get(sessionId);\n if (windowId) tmux.selectLayout(windowId);\n\n await state.completeOrchestratorCycle(cwd, sessionId, nextPrompt, mode);\n\n const session = state.getSession(cwd, sessionId);\n const runningAgents = session.agents.filter(a => a.status === 'running');\n if (runningAgents.length === 0) {\n console.log(`[sisyphus] Orchestrator yielded with no running agents for session ${sessionId}`);\n }\n}\n\nexport async function handleOrchestratorComplete(sessionId: string, cwd: string, report: string): Promise<void> {\n await state.completeOrchestratorCycle(cwd, sessionId);\n await state.completeSession(cwd, sessionId, report);\n\n console.log(`[sisyphus] Session ${sessionId} completed: ${report}`);\n}\n\nexport function cleanupSessionMaps(sessionId: string): void {\n sessionOrchestratorPane.delete(sessionId);\n sessionWindowMap.delete(sessionId);\n unregisterSessionPanes(sessionId);\n}\n","export const ORCHESTRATOR_COLOR = 'yellow';\n\nconst AGENT_PALETTE = ['blue', 'green', 'magenta', 'cyan', 'red', 'white'] as const;\n\nconst TMUX_COLOR_MAP: Record<string, string> = {\n orange: 'colour208',\n teal: 'colour6',\n};\n\nexport function normalizeTmuxColor(color: string): string {\n return TMUX_COLOR_MAP[color] ?? color;\n}\n\nconst sessionColorIndex = new Map<string, number>();\n\nexport function getNextColor(sessionId: string): string {\n const idx = sessionColorIndex.get(sessionId) ?? 0;\n const color = AGENT_PALETTE[idx % AGENT_PALETTE.length]!;\n sessionColorIndex.set(sessionId, idx + 1);\n return color;\n}\n\nexport function resetColors(sessionId: string): void {\n sessionColorIndex.delete(sessionId);\n}\n\n","import { readFileSync, existsSync, readdirSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join, basename } from 'node:path';\nimport type { Provider } from '../shared/types.js';\n\nexport interface AgentTypeFrontmatter {\n name?: string;\n model?: string;\n color?: string;\n description?: string;\n skills?: string[];\n permissionMode?: string;\n effort?: string;\n}\n\nexport { type Provider } from '../shared/types.js';\n\nexport function detectProvider(model: string | undefined): Provider {\n if (!model) return 'anthropic';\n if (/^(gpt-|codex-)/.test(model)) return 'openai';\n return 'anthropic';\n}\n\nexport function parseAgentFrontmatter(content: string): AgentTypeFrontmatter {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) return {};\n\n const block = match[1]!;\n const fm: AgentTypeFrontmatter = {};\n\n const str = (key: string): string | undefined => {\n const m = block.match(new RegExp(`^${key}:\\\\s*(.+)$`, 'm'));\n return m ? m[1]!.trim() : undefined;\n };\n\n fm.name = str('name');\n fm.model = str('model');\n fm.color = str('color');\n fm.description = str('description');\n fm.permissionMode = str('permissionMode');\n fm.effort = str('effort');\n\n // Parse skills as a YAML list\n const skillsMatch = block.match(/^skills:\\s*\\n((?:\\s+-\\s+.+\\n?)*)/m);\n if (skillsMatch) {\n fm.skills = skillsMatch[1]!\n .split('\\n')\n .map(line => line.replace(/^\\s+-\\s+/, '').trim())\n .filter(Boolean);\n }\n\n return fm;\n}\n\nexport function extractAgentBody(content: string): string {\n const match = content.match(/^---\\n[\\s\\S]*?\\n---\\n?([\\s\\S]*)$/);\n return match ? match[1]!.trim() : content.trim();\n}\n\nfunction findPluginInstallPath(namespace: string): string | null {\n try {\n const registryPath = join(homedir(), '.claude', 'plugins', 'installed_plugins.json');\n const registry = JSON.parse(readFileSync(registryPath, 'utf-8'));\n for (const key of Object.keys(registry)) {\n if (key.startsWith(`${namespace}@`)) {\n return registry[key].installPath ?? null;\n }\n }\n } catch {\n // File missing, parse error, or no match\n }\n return null;\n}\n\nexport function resolveAgentTypePath(agentType: string, pluginDir: string, cwd: string): string | null {\n if (!agentType) return null;\n\n let namespace: string | undefined;\n let name: string;\n\n if (agentType.includes(':')) {\n [namespace, name] = agentType.split(':', 2) as [string, string];\n } else {\n name = agentType;\n }\n\n const searchPaths: string[] = [];\n\n if (namespace) {\n // Bundled (handles sisyphus:* via pluginDir)\n searchPaths.push(join(pluginDir, 'agents', `${name}.md`));\n // Installed plugin\n const installPath = findPluginInstallPath(namespace);\n if (installPath) {\n searchPaths.push(join(installPath, 'agents', `${name}.md`));\n }\n } else {\n // Project-local\n searchPaths.push(join(cwd, '.claude', 'agents', `${name}.md`));\n // User-global\n searchPaths.push(join(homedir(), '.claude', 'agents', `${name}.md`));\n // Bundled\n searchPaths.push(join(pluginDir, 'agents', `${name}.md`));\n }\n\n for (const path of searchPaths) {\n if (existsSync(path)) return path;\n }\n\n return null;\n}\n\nexport interface DiscoveredAgentType {\n qualifiedName: string;\n source: 'bundled' | 'plugin' | 'project' | 'user';\n description?: string;\n model?: string;\n}\n\nexport function discoverAgentTypes(pluginDir: string, cwd: string): DiscoveredAgentType[] {\n const seen = new Set<string>();\n const results: DiscoveredAgentType[] = [];\n\n function scanDir(dir: string, prefix: string | null, source: DiscoveredAgentType['source']): void {\n let files: string[];\n try {\n files = readdirSync(dir);\n } catch {\n return;\n }\n for (const file of files) {\n if (!file.endsWith('.md') || file === 'CLAUDE.md') continue;\n const name = basename(file, '.md');\n const qualifiedName = prefix ? `${prefix}:${name}` : name;\n if (seen.has(qualifiedName)) continue;\n seen.add(qualifiedName);\n\n try {\n const content = readFileSync(join(dir, file), 'utf-8');\n const fm = parseAgentFrontmatter(content);\n results.push({ qualifiedName, source, description: fm.description, model: fm.model });\n } catch {\n results.push({ qualifiedName, source });\n }\n }\n }\n\n // Priority order: project > user > bundled > plugins\n scanDir(join(cwd, '.claude', 'agents'), null, 'project');\n scanDir(join(homedir(), '.claude', 'agents'), null, 'user');\n scanDir(join(pluginDir, 'agents'), 'sisyphus', 'bundled');\n\n // Installed plugins (handles v1 flat and v2 nested formats)\n try {\n const registryPath = join(homedir(), '.claude', 'plugins', 'installed_plugins.json');\n const registry = JSON.parse(readFileSync(registryPath, 'utf-8'));\n const pluginEntries = registry.plugins ?? registry;\n for (const key of Object.keys(pluginEntries)) {\n const atIdx = key.indexOf('@');\n if (atIdx < 1) continue;\n const namespace = key.slice(0, atIdx);\n const entry = pluginEntries[key];\n const installPath = Array.isArray(entry) ? entry[0]?.installPath : entry?.installPath;\n if (installPath) {\n scanDir(join(installPath, 'agents'), namespace, 'plugin');\n }\n }\n } catch {\n // Registry missing or unparseable\n }\n\n return results;\n}\n\nexport interface ResolvedAgentConfig {\n frontmatter: AgentTypeFrontmatter;\n body: string;\n filePath: string;\n}\n\nexport function resolveAgentConfig(agentType: string, pluginDir: string, cwd: string): ResolvedAgentConfig | null {\n const filePath = resolveAgentTypePath(agentType, pluginDir, cwd);\n if (!filePath) return null;\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n return {\n frontmatter: parseAgentFrontmatter(content),\n body: extractAgentBody(content),\n filePath,\n };\n } catch {\n return null;\n }\n}\n","import { execSync } from 'node:child_process';\n\nconst EXEC_ENV = {\n ...process.env,\n PATH: `/opt/homebrew/bin:/usr/local/bin:${process.env['PATH'] ?? '/usr/bin:/bin'}`,\n};\n\nfunction exec(cmd: string): string {\n return execSync(cmd, { encoding: 'utf-8', env: EXEC_ENV }).trim();\n}\n\nfunction execSafe(cmd: string): string | null {\n try {\n return execSync(cmd, { encoding: 'utf-8', env: EXEC_ENV, stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n } catch {\n return null;\n }\n}\n\nexport function getCurrentTmuxSession(): string {\n const tmuxEnv = process.env['TMUX'];\n if (!tmuxEnv) throw new Error('Not running inside tmux');\n return exec('tmux display-message -p \"#{session_name}\"');\n}\n\nexport function createWindow(sessionName: string, windowName: string, cwd?: string): string {\n const cwdFlag = cwd ? ` -c ${shellQuote(cwd)}` : '';\n exec(`tmux new-window -t \"${sessionName}\" -n \"${windowName}\"${cwdFlag} -P -F \"#{window_id}\"`);\n return exec(`tmux display-message -t \"${sessionName}:${windowName}\" -p \"#{window_id}\"`);\n}\n\nexport function createPane(windowTarget: string, cwd?: string, position: 'left' | 'right' = 'right'): string {\n const cwdFlag = cwd ? ` -c ${shellQuote(cwd)}` : '';\n // Target the first/last pane in the window to ensure absolute left/right placement\n const panes = listPanes(windowTarget);\n const target = position === 'left' ? panes[0]?.paneId : panes[panes.length - 1]?.paneId;\n const targetFlag = target ? ` -t \"${target}\"` : ` -t \"${windowTarget}\"`;\n const beforeFlag = position === 'left' ? 'b' : '';\n const paneId = exec(`tmux split-window -h${beforeFlag}${targetFlag}${cwdFlag} -P -F \"#{pane_id}\"`);\n execSafe(`tmux select-layout -t \"${windowTarget}\" even-horizontal`);\n return paneId;\n}\n\nexport function sendKeys(paneTarget: string, command: string): void {\n exec(`tmux send-keys -t \"${paneTarget}\" ${shellQuote(command)} Enter`);\n}\n\nexport function killPane(paneTarget: string): void {\n execSafe(`tmux kill-pane -t \"${paneTarget}\"`);\n}\n\nexport function killWindow(windowTarget: string): void {\n execSafe(`tmux kill-window -t \"${windowTarget}\"`);\n}\n\nexport function createSession(sessionName: string, windowName: string, cwd: string): { windowId: string; initialPaneId: string } {\n exec(`tmux new-session -d -s \"${sessionName}\" -n \"${windowName}\" -c ${shellQuote(cwd)}`);\n const windowId = exec(`tmux display-message -t \"${sessionName}:${windowName}\" -p \"#{window_id}\"`);\n const initialPaneId = exec(`tmux display-message -t \"${sessionName}:${windowName}\" -p \"#{pane_id}\"`);\n return { windowId, initialPaneId };\n}\n\nexport function paneExists(paneTarget: string): boolean {\n return execSafe(`tmux display-message -t \"${paneTarget}\" -p \"#{pane_id}\"`) !== null;\n}\n\nexport function sessionExists(sessionName: string): boolean {\n return execSafe(`tmux has-session -t \"${sessionName}\"`) !== null;\n}\n\nexport function killSession(sessionName: string): void {\n execSafe(`tmux kill-session -t \"${sessionName}\"`);\n}\n\nexport function setSessionOption(sessionName: string, option: string, value: string): void {\n execSafe(`tmux set-option -t \"${sessionName}\" ${option} ${shellQuote(value)}`);\n}\n\n\nexport interface PaneInfo {\n paneId: string;\n panePid: string;\n}\n\nexport function listPanes(windowTarget: string): PaneInfo[] {\n const output = execSafe(`tmux list-panes -t \"${windowTarget}\" -F \"#{pane_id} #{pane_pid}\"`);\n if (!output) return [];\n return output\n .split('\\n')\n .filter(Boolean)\n .map(line => {\n const [paneId, panePid] = line.split(' ');\n return { paneId: paneId!, panePid: panePid! };\n });\n}\n\nexport function setPaneTitle(paneTarget: string, title: string): void {\n execSafe(`tmux select-pane -t \"${paneTarget}\" -T ${shellQuote(title)}`);\n}\n\nexport function setPaneStyle(paneTarget: string, color: string): void {\n const fmt = `#[fg=${color},bold] #{pane_title} #[fg=${color}]#{pane_current_path} #[default]`;\n execSafe(`tmux set -p -t \"${paneTarget}\" pane-border-format ${shellQuote(fmt)}`);\n // Store color as a per-pane user variable. The window-level border styles use a\n // format string that resolves #{@pane_color} per-pane at render time, giving each\n // pane its own border color (pane-border-style itself is window-level / last-write-wins).\n execSafe(`tmux set -p -t \"${paneTarget}\" @pane_color \"${color}\"`);\n execSafe(`tmux set -w -t \"${paneTarget}\" pane-border-style \"fg=#{?#{@pane_color},#{@pane_color},default}\"`);\n execSafe(`tmux set -w -t \"${paneTarget}\" pane-active-border-style \"fg=#{?#{@pane_color},#{@pane_color},default}\"`);\n}\n\nexport function sendSignal(paneTarget: string, signal: string): void {\n const info = execSafe(`tmux list-panes -t \"${paneTarget}\" -F \"#{pane_pid}\"`);\n if (!info) return;\n const pid = info.split('\\n')[0]?.trim();\n if (pid) {\n execSafe(`kill -${signal} ${pid}`);\n }\n}\n\nexport function selectLayout(windowTarget: string, layout: string = 'even-horizontal'): void {\n execSafe(`tmux select-layout -t \"${windowTarget}\" ${layout}`);\n}\n\nfunction shellQuote(s: string): string {\n return `'${s.replace(/'/g, \"'\\\\''\")}'`;\n}\n","type PaneEntry = {\n sessionId: string;\n role: 'orchestrator' | 'agent';\n agentId?: string;\n};\n\nconst paneMap = new Map<string, PaneEntry>();\n\nexport function registerPane(paneId: string, sessionId: string, role: 'orchestrator' | 'agent', agentId?: string): void {\n paneMap.set(paneId, { sessionId, role, agentId });\n}\n\nexport function unregisterPane(paneId: string): void {\n paneMap.delete(paneId);\n}\n\nexport function unregisterAgentPane(sessionId: string, agentId: string): void {\n for (const [paneId, entry] of paneMap) {\n if (entry.sessionId === sessionId && entry.agentId === agentId) {\n paneMap.delete(paneId);\n return;\n }\n }\n}\n\nexport function unregisterSessionPanes(sessionId: string): void {\n for (const [paneId, entry] of paneMap) {\n if (entry.sessionId === sessionId) {\n paneMap.delete(paneId);\n }\n }\n}\n\nexport function lookupPane(paneId: string): PaneEntry | undefined {\n return paneMap.get(paneId);\n}\n","import { readFileSync, writeFileSync, copyFileSync, mkdirSync, readdirSync, existsSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport type { Agent, AgentReport } from '../shared/types.js';\nimport * as state from './state.js';\nimport * as tmux from './tmux.js';\nimport { getNextColor, normalizeTmuxColor } from './colors.js';\nimport { getWindowId } from './orchestrator.js';\nimport { promptsDir, reportsDir, reportFilePath } from '../shared/paths.js';\nimport { createWorktreeShell, bootstrapWorktree, loadWorktreeConfig, countWorktreeAgents } from './worktree.js';\nimport { registerPane, unregisterPane, unregisterAgentPane } from './pane-registry.js';\nimport { summarizeReport } from './summarize.js';\nimport { resolveAgentConfig, detectProvider } from './frontmatter.js';\nimport { loadConfig } from '../shared/config.js';\n\nconst agentCounters = new Map<string, number>();\n\nexport function resetAgentCounter(sessionId: string, value: number = 0): void {\n agentCounters.set(sessionId, value);\n}\n\nexport function resetAgentCounterFromState(sessionId: string, agents: { id: string }[]): void {\n let max = 0;\n for (const a of agents) {\n const match = a.id.match(/^agent-(\\d+)$/);\n if (match) max = Math.max(max, parseInt(match[1]!, 10));\n }\n agentCounters.set(sessionId, max);\n}\n\nexport function clearAgentCounter(sessionId: string): void {\n agentCounters.delete(sessionId);\n}\n\ninterface WorktreeContext {\n offset: number;\n total: number;\n branchName: string;\n}\n\nfunction renderAgentSuffix(sessionId: string, instruction: string, worktreeContext?: WorktreeContext): string {\n const templatePath = resolve(import.meta.dirname, '../templates/agent-suffix.md');\n let template: string;\n try {\n template = readFileSync(templatePath, 'utf-8');\n } catch {\n template = `# Sisyphus Agent\\nSession: {{SESSION_ID}}\\nTask: {{INSTRUCTION}}`;\n }\n\n let worktreeBlock = '';\n if (worktreeContext) {\n worktreeBlock = [\n '## Worktree Context',\n `You are working in an isolated git worktree on branch \\`${worktreeContext.branchName}\\`.`,\n `If you start any services that require ports, add ${worktreeContext.offset} to the default port.`,\n ].join('\\n');\n }\n\n return template\n .replace(/\\{\\{SESSION_ID\\}\\}/g, sessionId)\n .replace(/\\{\\{INSTRUCTION\\}\\}/g, instruction)\n .replace(/\\{\\{WORKTREE_CONTEXT\\}\\}/g, worktreeBlock);\n}\n\nfunction createAgentPlugin(\n cwd: string,\n sessionId: string,\n agentId: string,\n agentType: string,\n agentConfig: ReturnType<typeof resolveAgentConfig>,\n): string {\n const base = `${promptsDir(cwd, sessionId)}/${agentId}-plugin`;\n mkdirSync(`${base}/.claude-plugin`, { recursive: true });\n mkdirSync(`${base}/agents`, { recursive: true });\n mkdirSync(`${base}/hooks`, { recursive: true });\n\n writeFileSync(\n `${base}/.claude-plugin/plugin.json`,\n JSON.stringify({ name: `sisyphus-agent-${agentId}`, version: '1.0.0' }),\n 'utf-8',\n );\n\n if (agentConfig?.filePath && agentType && agentType !== 'worker') {\n const shortName = agentType.replace(/^sisyphus:/, '');\n copyFileSync(agentConfig.filePath, `${base}/agents/${shortName}.md`);\n }\n\n const srcHooks = resolve(import.meta.dirname, '../templates/agent-plugin/hooks');\n for (const f of ['hooks.json', 'require-submit.sh', 'intercept-send-message.sh']) {\n copyFileSync(`${srcHooks}/${f}`, `${base}/hooks/${f}`);\n }\n\n return base;\n}\n\nexport interface SpawnAgentOpts {\n sessionId: string;\n cwd: string;\n agentType: string;\n name: string;\n instruction: string;\n windowId: string;\n worktree?: boolean;\n}\n\nexport async function spawnAgent(opts: SpawnAgentOpts): Promise<Agent> {\n const { sessionId, cwd, agentType, name, instruction, windowId } = opts;\n const count = (agentCounters.get(sessionId) ?? 0) + 1;\n agentCounters.set(sessionId, count);\n const agentId = `agent-${String(count).padStart(3, '0')}`;\n const bundledPluginPath = resolve(import.meta.dirname, '../templates/agent-plugin');\n\n // Resolve agent config for frontmatter (color, model, provider)\n const agentConfig = resolveAgentConfig(agentType, bundledPluginPath, cwd);\n const provider = detectProvider(agentConfig?.frontmatter.model);\n const color = (agentConfig?.frontmatter.color ? normalizeTmuxColor(agentConfig.frontmatter.color) : null) ?? getNextColor(sessionId);\n\n let paneCwd = cwd;\n let worktreePath: string | undefined;\n let branchName: string | undefined;\n let worktreeContext: WorktreeContext | undefined;\n\n if (opts.worktree) {\n // Fast: git branch + worktree add + symlinks only (no bootstrap/init)\n const wt = createWorktreeShell(cwd, sessionId, agentId);\n worktreePath = wt.worktreePath;\n branchName = wt.branchName;\n paneCwd = worktreePath;\n\n const session = state.getSession(cwd, sessionId);\n const portOffset = countWorktreeAgents(session.agents) + 1;\n worktreeContext = { offset: portOffset, total: portOffset, branchName };\n }\n\n const paneId = tmux.createPane(windowId, paneCwd);\n registerPane(paneId, sessionId, 'agent', agentId);\n const shortType = agentType && agentType !== 'worker'\n ? agentType.replace(/^sisyphus:/, '')\n : '';\n const paneLabel = shortType ? `${name}-${shortType}` : name;\n tmux.setPaneTitle(paneId, `${paneLabel} (${agentId})`);\n tmux.setPaneStyle(paneId, color);\n\n const suffix = renderAgentSuffix(sessionId, instruction, worktreeContext);\n const suffixFilePath = `${promptsDir(cwd, sessionId)}/${agentId}-system.md`;\n writeFileSync(suffixFilePath, suffix, 'utf-8');\n\n const bannerPath = resolve(import.meta.dirname, '../templates/banner.txt');\n const bannerCmd = existsSync(bannerPath) ? `cat '${bannerPath}' &&` : '';\n\n // Resolve CLI binary path so `sisyphus` works even when installed as a local dependency\n const cliBin = resolve(import.meta.dirname, 'cli.js');\n const npmBinDir = resolve(import.meta.dirname, '../../.bin');\n\n const envExports = [\n `export SISYPHUS_SESSION_ID='${sessionId}'`,\n `export SISYPHUS_AGENT_ID='${agentId}'`,\n `export SISYPHUS_CWD='${cwd}'`,\n ...(worktreeContext ? [`export SISYPHUS_PORT_OFFSET='${worktreeContext.offset}'`] : []),\n `export PATH=\"${npmBinDir}:$PATH\"`,\n ].join(' && ');\n\n const notifyCmd = `node \"${cliBin}\" notify pane-exited --pane-id ${paneId}`;\n\n let mainCmd: string;\n\n if (provider === 'openai') {\n // Build combined prompt for codex\n const codexPromptPath = `${promptsDir(cwd, sessionId)}/${agentId}-codex-prompt.md`;\n const parts: string[] = [];\n\n // 1. Agent type body (stripped of frontmatter)\n if (agentConfig?.body) {\n parts.push(agentConfig.body);\n }\n\n // 2. Rendered agent-suffix template\n parts.push(suffix);\n\n // 3. The instruction itself\n parts.push(`## Task\\n\\n${instruction}`);\n\n writeFileSync(codexPromptPath, parts.join('\\n\\n'), 'utf-8');\n\n const model = agentConfig?.frontmatter.model ?? 'codex-mini';\n mainCmd = `codex -m ${shellQuote(model)} --dangerously-bypass-approvals-and-sandbox \"$(cat '${codexPromptPath}')\"`;\n } else {\n // Anthropic (current behavior)\n const agentFlag = agentType && agentType !== 'worker' ? ` --agent ${shellQuote(agentType)}` : '';\n const config = loadConfig(cwd);\n const effort = agentConfig?.frontmatter.effort ?? config.agentEffort ?? 'medium';\n const pluginPath = createAgentPlugin(cwd, sessionId, agentId, agentType, agentConfig);\n mainCmd = `claude --dangerously-skip-permissions --effort ${effort} --plugin-dir \"${pluginPath}\"${agentFlag} --name ${shellQuote(`sisyphus:${name}`)} --append-system-prompt \"$(cat '${suffixFilePath}')\" ${shellQuote(instruction)}`;\n }\n\n const fullCmd = `${bannerCmd} ${envExports} && ${mainCmd}; ${notifyCmd}`;\n\n const agent: Agent = {\n id: agentId,\n name,\n agentType,\n provider,\n color,\n instruction,\n status: 'running',\n spawnedAt: new Date().toISOString(),\n completedAt: null,\n reports: [],\n paneId,\n ...(worktreePath ? { worktreePath, branchName, mergeStatus: 'pending' as const } : {}),\n };\n\n await state.addAgent(cwd, sessionId, agent);\n\n if (opts.worktree && worktreePath) {\n // Defer bootstrap so the daemon can respond to the CLI before running\n // the potentially slow init command (e.g. npm install).\n // The pane is already visible; Claude command is sent after bootstrap.\n const config = loadWorktreeConfig(cwd);\n if (config) {\n const wtPath = worktreePath;\n setImmediate(() => {\n try {\n bootstrapWorktree(cwd, wtPath, config);\n } catch (err) {\n console.error(`[sisyphus] worktree bootstrap failed for ${agentId}: ${err instanceof Error ? err.message : err}`);\n }\n tmux.sendKeys(paneId, fullCmd);\n });\n } else {\n tmux.sendKeys(paneId, fullCmd);\n }\n } else {\n tmux.sendKeys(paneId, fullCmd);\n }\n\n return agent;\n}\n\nexport async function restartAgent(\n sessionId: string,\n cwd: string,\n agentId: string,\n windowId: string,\n): Promise<void> {\n const session = state.getSession(cwd, sessionId);\n const agent = session.agents.find(a => a.id === agentId);\n if (!agent) throw new Error(`Unknown agent: ${agentId}`);\n if (agent.status === 'running') {\n // Check if the pane is actually alive — if not, the agent is a zombie\n const paneAlive = agent.paneId && tmux.paneExists(agent.paneId);\n if (paneAlive) {\n throw new Error(`Agent ${agentId} is already running`);\n }\n // Pane is dead — mark as lost before restarting\n await state.updateAgent(cwd, sessionId, agentId, {\n status: 'lost',\n killedReason: 'pane disappeared (detected on restart)',\n completedAt: new Date().toISOString(),\n });\n }\n\n const { instruction, agentType, name, color } = agent;\n const bundledPluginPath = resolve(import.meta.dirname, '../templates/agent-plugin');\n\n // Resolve agent config for frontmatter (model, provider)\n const agentConfig = resolveAgentConfig(agentType, bundledPluginPath, cwd);\n const provider = detectProvider(agentConfig?.frontmatter.model);\n\n let paneCwd = cwd;\n let worktreeContext: WorktreeContext | undefined;\n\n if (agent.worktreePath) {\n paneCwd = agent.worktreePath;\n const portOffset = countWorktreeAgents(session.agents);\n worktreeContext = {\n offset: portOffset,\n total: portOffset,\n branchName: agent.branchName!,\n };\n }\n\n // Kill old pane if it still exists\n if (agent.paneId) {\n try { tmux.killPane(agent.paneId); } catch { /* already dead */ }\n unregisterAgentPane(sessionId, agentId);\n }\n\n // Create new pane\n const paneId = tmux.createPane(windowId, paneCwd);\n registerPane(paneId, sessionId, 'agent', agentId);\n const shortType = agentType && agentType !== 'worker'\n ? agentType.replace(/^sisyphus:/, '')\n : '';\n const paneLabel = shortType ? `${name}-${shortType}` : name;\n tmux.setPaneTitle(paneId, `${paneLabel} (${agentId})`);\n tmux.setPaneStyle(paneId, color);\n\n const suffix = renderAgentSuffix(sessionId, instruction, worktreeContext);\n const suffixFilePath = `${promptsDir(cwd, sessionId)}/${agentId}-system.md`;\n writeFileSync(suffixFilePath, suffix, 'utf-8');\n\n const bannerPath = resolve(import.meta.dirname, '../templates/banner.txt');\n const bannerCmd = existsSync(bannerPath) ? `cat '${bannerPath}' &&` : '';\n\n const cliBin = resolve(import.meta.dirname, 'cli.js');\n const npmBinDir = resolve(import.meta.dirname, '../../.bin');\n\n const envExports = [\n `export SISYPHUS_SESSION_ID='${sessionId}'`,\n `export SISYPHUS_AGENT_ID='${agentId}'`,\n `export SISYPHUS_CWD='${cwd}'`,\n ...(worktreeContext ? [`export SISYPHUS_PORT_OFFSET='${worktreeContext.offset}'`] : []),\n `export PATH=\"${npmBinDir}:$PATH\"`,\n ].join(' && ');\n\n const notifyCmd = `node \"${cliBin}\" notify pane-exited --pane-id ${paneId}`;\n\n let mainCmd: string;\n\n if (provider === 'openai') {\n const codexPromptPath = `${promptsDir(cwd, sessionId)}/${agentId}-codex-prompt.md`;\n const parts: string[] = [];\n if (agentConfig?.body) parts.push(agentConfig.body);\n parts.push(suffix);\n parts.push(`## Task\\n\\n${instruction}`);\n writeFileSync(codexPromptPath, parts.join('\\n\\n'), 'utf-8');\n const model = agentConfig?.frontmatter.model ?? 'codex-mini';\n mainCmd = `codex -m ${shellQuote(model)} --dangerously-bypass-approvals-and-sandbox \"$(cat '${codexPromptPath}')\"`;\n } else {\n const agentFlag = agentType && agentType !== 'worker' ? ` --agent ${shellQuote(agentType)}` : '';\n const config = loadConfig(cwd);\n const effort = agentConfig?.frontmatter.effort ?? config.agentEffort ?? 'medium';\n const pluginPath = createAgentPlugin(cwd, sessionId, agentId, agentType, agentConfig);\n mainCmd = `claude --dangerously-skip-permissions --effort ${effort} --plugin-dir \"${pluginPath}\"${agentFlag} --name ${shellQuote(`sisyphus:${name}`)} --append-system-prompt \"$(cat '${suffixFilePath}')\" ${shellQuote(instruction)}`;\n }\n\n const fullCmd = `${bannerCmd} ${envExports} && ${mainCmd}; ${notifyCmd}`;\n\n // Update agent state in-place\n await state.updateAgent(cwd, sessionId, agentId, {\n status: 'running',\n paneId,\n provider,\n spawnedAt: new Date().toISOString(),\n completedAt: null,\n killedReason: undefined,\n });\n\n tmux.sendKeys(paneId, fullCmd);\n}\n\nfunction nextReportNumber(cwd: string, sessionId: string, agentId: string): string {\n const dir = reportsDir(cwd, sessionId);\n try {\n const files = readdirSync(dir).filter(f => f.startsWith(`${agentId}-`) && !f.endsWith('-final.md'));\n return String(files.length + 1).padStart(3, '0');\n } catch {\n return '001';\n }\n}\n\nexport async function handleAgentReport(\n cwd: string,\n sessionId: string,\n agentId: string,\n content: string,\n): Promise<void> {\n const dir = reportsDir(cwd, sessionId);\n mkdirSync(dir, { recursive: true });\n\n const num = nextReportNumber(cwd, sessionId, agentId);\n const filePath = reportFilePath(cwd, sessionId, agentId, num);\n writeFileSync(filePath, content, 'utf-8');\n\n const entry: AgentReport = {\n type: 'update',\n filePath,\n summary: content.slice(0, 200),\n timestamp: new Date().toISOString(),\n };\n await state.appendAgentReport(cwd, sessionId, agentId, entry);\n\n // Fire async Haiku summarization (non-blocking)\n summarizeReport(content).then(async (aiSummary) => {\n if (aiSummary) {\n await state.updateReportSummary(cwd, sessionId, agentId, filePath, aiSummary);\n }\n }).catch(() => {});\n}\n\nexport async function handleAgentSubmit(\n cwd: string,\n sessionId: string,\n agentId: string,\n report: string,\n): Promise<boolean> {\n const dir = reportsDir(cwd, sessionId);\n mkdirSync(dir, { recursive: true });\n\n const filePath = reportFilePath(cwd, sessionId, agentId, 'final');\n writeFileSync(filePath, report, 'utf-8');\n\n const entry: AgentReport = {\n type: 'final',\n filePath,\n summary: report.slice(0, 200),\n timestamp: new Date().toISOString(),\n };\n await state.appendAgentReport(cwd, sessionId, agentId, entry);\n\n // Fire async Haiku summarization (non-blocking)\n summarizeReport(report).then(async (aiSummary) => {\n if (aiSummary) {\n await state.updateReportSummary(cwd, sessionId, agentId, filePath, aiSummary);\n }\n }).catch(() => {});\n\n await state.updateAgent(cwd, sessionId, agentId, {\n status: 'completed',\n completedAt: new Date().toISOString(),\n });\n\n // Kill the pane — Claude doesn't exit on its own after running a bash command.\n const session = state.getSession(cwd, sessionId);\n const agent = session.agents.find(a => a.id === agentId);\n if (agent?.paneId) {\n unregisterAgentPane(sessionId, agentId);\n try { tmux.killPane(agent.paneId); } catch { /* already dead */ }\n }\n\n return allAgentsDone(state.getSession(cwd, sessionId));\n}\n\nexport async function handleAgentKilled(\n cwd: string,\n sessionId: string,\n agentId: string,\n reason: string,\n): Promise<boolean> {\n unregisterAgentPane(sessionId, agentId);\n await state.updateAgent(cwd, sessionId, agentId, {\n status: 'killed',\n killedReason: reason,\n completedAt: new Date().toISOString(),\n });\n\n const session = state.getSession(cwd, sessionId);\n return allAgentsDone(session);\n}\n\n// Note: this checks ALL running agents in the session, not just orchestrator-spawned ones.\n// Agents can also call `sisyphus spawn`, and those child agents are included here —\n// the orchestrator won't respawn until every agent (including agent-spawned ones) finishes.\nfunction allAgentsDone(session: import('../shared/types.js').Session): boolean {\n const running = session.agents.filter(a => a.status === 'running');\n return running.length === 0 && session.agents.length > 0;\n}\n\nfunction shellQuote(s: string): string {\n return `'${s.replace(/'/g, \"'\\\\''\")}'`;\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, mkdirSync, readFileSync, readdirSync, rmSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport type { Agent } from '../shared/types.js';\nimport type { WorktreeConfig } from '../shared/config.js';\nimport { worktreeConfigPath, worktreeBaseDir } from '../shared/paths.js';\n\nconst EXEC_ENV = {\n ...process.env,\n PATH: `/opt/homebrew/bin:/usr/local/bin:${process.env['PATH'] ?? '/usr/bin:/bin'}`,\n};\n\nfunction exec(cmd: string, cwd?: string): string {\n return execSync(cmd, { encoding: 'utf-8', env: EXEC_ENV, cwd }).trim();\n}\n\nfunction execSafe(cmd: string, cwd?: string): string | null {\n try {\n return exec(cmd, cwd);\n } catch {\n return null;\n }\n}\n\nfunction shellQuote(s: string): string {\n return `'${s.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nexport interface MergeResult {\n agentId: string;\n name: string;\n status: 'merged' | 'conflict' | 'no-changes';\n conflictDetails?: string;\n}\n\nexport function loadWorktreeConfig(cwd: string): WorktreeConfig | null {\n try {\n const content = readFileSync(worktreeConfigPath(cwd), 'utf-8');\n return JSON.parse(content) as WorktreeConfig;\n } catch {\n return null;\n }\n}\n\n/**\n * Create git worktree (branch + add + symlinks) without running bootstrap.\n * Fast enough to run synchronously before responding to the CLI.\n */\nexport function createWorktreeShell(\n cwd: string,\n sessionId: string,\n agentId: string,\n): { worktreePath: string; branchName: string } {\n const branchName = `sisyphus/${sessionId.slice(0, 8)}/${agentId}`;\n // Bug B: Include session prefix in path to prevent cross-session collisions\n const worktreePath = join(worktreeBaseDir(cwd), sessionId.slice(0, 8), agentId);\n\n mkdirSync(dirname(worktreePath), { recursive: true });\n\n // Bug C: Clean stale worktree entries before creating\n execSafe(`git -C ${shellQuote(cwd)} worktree prune`);\n if (existsSync(worktreePath)) {\n execSafe(`git -C ${shellQuote(cwd)} worktree remove --force ${shellQuote(worktreePath)}`);\n }\n // If the branch already exists from a previous run, remove it\n execSafe(`git -C ${shellQuote(cwd)} branch -D ${shellQuote(branchName)}`);\n\n exec(`git -C ${shellQuote(cwd)} branch ${shellQuote(branchName)} HEAD`);\n exec(`git -C ${shellQuote(cwd)} worktree add ${shellQuote(worktreePath)} ${shellQuote(branchName)}`);\n\n return { worktreePath, branchName };\n}\n\n/**\n * Create git worktree AND run bootstrap synchronously.\n * Use createWorktreeShell + bootstrapWorktree separately when you need\n * to defer the slow bootstrap to avoid blocking.\n */\nexport function createWorktree(\n cwd: string,\n sessionId: string,\n agentId: string,\n): { worktreePath: string; branchName: string } {\n const result = createWorktreeShell(cwd, sessionId, agentId);\n\n const config = loadWorktreeConfig(cwd);\n if (config) {\n bootstrapWorktree(cwd, result.worktreePath, config);\n }\n\n return result;\n}\n\nexport function bootstrapWorktree(cwd: string, worktreePath: string, config: WorktreeConfig): void {\n // Process copy entries\n if (config.copy) {\n for (const entry of config.copy) {\n const dest = join(worktreePath, entry);\n mkdirSync(dirname(dest), { recursive: true });\n execSafe(`cp -r ${shellQuote(join(cwd, entry))} ${shellQuote(dest)}`);\n }\n }\n\n // Process clone entries (APFS CoW on macOS, fallback to cp -r)\n if (config.clone) {\n for (const entry of config.clone) {\n const dest = join(worktreePath, entry);\n mkdirSync(dirname(dest), { recursive: true });\n const src = shellQuote(join(cwd, entry));\n const dstQ = shellQuote(dest);\n if (execSafe(`cp -Rc ${src} ${dstQ}`) === null) {\n execSafe(`cp -r ${src} ${dstQ}`);\n }\n }\n }\n\n // Process symlink entries\n if (config.symlink) {\n for (const entry of config.symlink) {\n const dest = join(worktreePath, entry);\n mkdirSync(dirname(dest), { recursive: true });\n execSafe(`ln -s ${shellQuote(join(cwd, entry))} ${shellQuote(dest)}`);\n }\n }\n\n // Process init command\n if (config.init) {\n try {\n exec(config.init, worktreePath);\n } catch (err) {\n console.error(`[sisyphus] worktree init command failed: ${err instanceof Error ? err.message : err}`);\n }\n }\n}\n\n/**\n * Resolve the branch checked out in a worktree by parsing `git worktree list --porcelain`.\n * Returns null if the worktree isn't found or has a detached HEAD.\n */\nfunction resolveWorktreeBranch(cwd: string, worktreePath: string): string | null {\n const output = execSafe(`git -C ${shellQuote(cwd)} worktree list --porcelain`);\n if (!output) return null;\n\n const lines = output.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n if (lines[i] === `worktree ${worktreePath}`) {\n for (let j = i + 1; j < lines.length; j++) {\n const line = lines[j]!;\n if (line === '') break; // end of this worktree block\n if (line.startsWith('branch refs/heads/')) {\n return line.slice('branch refs/heads/'.length);\n }\n }\n break;\n }\n }\n return null;\n}\n\nexport function mergeWorktrees(cwd: string, agents: Agent[]): MergeResult[] {\n const pending = agents.filter(\n a => a.worktreePath && a.mergeStatus === 'pending',\n );\n\n const results: MergeResult[] = [];\n\n // Snapshot any uncommitted .sisyphus state changes before merging\n // so agent branches don't conflict with main's session state updates\n execSafe(`git -C ${shellQuote(cwd)} add .sisyphus`);\n execSafe(`git -C ${shellQuote(cwd)} commit -m 'sisyphus: snapshot session state before merge'`);\n\n for (const agent of pending) {\n const branch = resolveWorktreeBranch(cwd, agent.worktreePath!);\n\n if (!branch) {\n results.push({ agentId: agent.id, name: agent.name, status: 'no-changes' });\n // Best-effort cleanup — branch name unknown, just remove worktree dir\n execSafe(`git -C ${shellQuote(cwd)} worktree remove ${shellQuote(agent.worktreePath!)} --force`);\n continue;\n }\n\n // Check if branch has commits ahead of merge base\n const aheadLog = execSafe(`git -C ${shellQuote(cwd)} log HEAD..${shellQuote(branch)} --oneline`);\n if (!aheadLog) {\n results.push({ agentId: agent.id, name: agent.name, status: 'no-changes' });\n cleanupWorktree(cwd, agent.worktreePath!, branch);\n continue;\n }\n\n // Attempt merge — capture stderr on failure for conflict details\n const mergeMsg = `sisyphus: merge ${agent.id} (${agent.name})`;\n const mergeCmd = `git -C ${shellQuote(cwd)} merge --no-ff ${shellQuote(branch)} -m ${shellQuote(mergeMsg)}`;\n\n try {\n exec(mergeCmd);\n // Merge succeeded — clean up worktree and branch\n execSafe(`git -C ${shellQuote(cwd)} worktree remove ${shellQuote(agent.worktreePath!)}`);\n execSafe(`git -C ${shellQuote(cwd)} branch -d ${shellQuote(branch)}`);\n results.push({ agentId: agent.id, name: agent.name, status: 'merged' });\n } catch (err: unknown) {\n // Merge failed — abort and leave worktree intact for manual resolution\n execSafe(`git -C ${shellQuote(cwd)} merge --abort`);\n // Git outputs conflict details (which files, conflict type) to stdout, not stderr\n const errObj = err as { stdout?: Buffer | string; stderr?: Buffer | string };\n const stdout = errObj.stdout\n ? (typeof errObj.stdout === 'string' ? errObj.stdout : errObj.stdout.toString('utf-8')).trim()\n : '';\n const stderr = errObj.stderr\n ? (typeof errObj.stderr === 'string' ? errObj.stderr : errObj.stderr.toString('utf-8')).trim()\n : '';\n const conflictDetails = stdout || stderr || (err instanceof Error ? err.message : String(err));\n results.push({ agentId: agent.id, name: agent.name, status: 'conflict', conflictDetails });\n }\n }\n\n return results;\n}\n\nexport function cleanupWorktree(cwd: string, worktreePath: string, branchName: string): void {\n execSafe(`git -C ${shellQuote(cwd)} worktree remove ${shellQuote(worktreePath)} --force`);\n execSafe(`git -C ${shellQuote(cwd)} branch -D ${shellQuote(branchName)}`);\n\n // Remove the worktree base dir if empty\n const baseDir = dirname(worktreePath);\n try {\n const entries = readdirSync(baseDir);\n if (entries.length === 0) {\n rmSync(baseDir, { recursive: true });\n }\n } catch {\n // Ignore — directory may already be gone\n }\n}\n\nexport function countWorktreeAgents(agents: Agent[]): number {\n return agents.filter(a => a.worktreePath && a.status === 'running').length;\n}\n","import { query } from '@r-cli/sdk';\n\nlet disabled = false;\n\n/**\n * Summarize an agent report using Haiku via the SDK.\n * Returns a clean one-sentence summary, or null if unavailable.\n * Non-blocking: callers should fire-and-forget.\n */\nexport async function summarizeReport(reportText: string): Promise<string | null> {\n if (disabled) return null;\n\n try {\n const session = await query({\n prompt: `Summarize this agent work report in one concise sentence (max 120 chars). Focus on what was accomplished and the outcome. Output ONLY the summary sentence, nothing else.\\n\\n${reportText.slice(0, 3000)}`,\n options: {\n model: 'haiku',\n maxTurns: 1,\n },\n });\n\n let text = '';\n for await (const msg of session) {\n if (msg.type === 'assistant' && msg.message?.content) {\n for (const block of msg.message.content) {\n if (block.type === 'text') text += block.text;\n }\n }\n }\n\n const summary = text.trim();\n return summary.length > 0 ? summary : null;\n } catch (err) {\n console.error(`[sisyphus] Haiku summarization failed: ${err instanceof Error ? err.message : err}`);\n // Disable on auth failures\n const status = (err as { status?: number }).status;\n if (status === 401 || status === 403) {\n disabled = true;\n }\n return null;\n }\n}\n","import * as state from './state.js';\nimport * as tmux from './tmux.js';\nimport { getOrchestratorPaneId, cleanupSessionMaps } from './orchestrator.js';\nimport { handleAgentKilled } from './agent.js';\n\ntype RespawnCallback = (sessionId: string, cwd: string, windowId: string) => void;\n\nlet monitorInterval: ReturnType<typeof setInterval> | null = null;\nlet onAllAgentsDone: RespawnCallback | null = null;\n\nexport function setRespawnCallback(cb: RespawnCallback): void {\n onAllAgentsDone = cb;\n}\n\nexport function startMonitor(pollIntervalMs: number = 5000): void {\n if (monitorInterval) return;\n monitorInterval = setInterval(() => {\n pollAllSessions().catch(err => {\n console.error('[sisyphus] Pane monitor error:', err);\n });\n }, pollIntervalMs);\n}\n\nexport function stopMonitor(): void {\n if (monitorInterval) {\n clearInterval(monitorInterval);\n monitorInterval = null;\n }\n}\n\nconst trackedSessions = new Map<string, { id: string; cwd: string; tmuxSession: string; windowId: string | null }>();\n\nexport function trackSession(sessionId: string, cwd: string, tmuxSession: string): void {\n // windowId is registered separately via updateTrackedWindow after spawnOrchestrator sets it\n const existing = trackedSessions.get(sessionId);\n trackedSessions.set(sessionId, { id: sessionId, cwd, tmuxSession, windowId: existing ? existing.windowId : null });\n}\n\nexport function updateTrackedWindow(sessionId: string, windowId: string): void {\n const entry = trackedSessions.get(sessionId);\n if (!entry) throw new Error(`Cannot update window for untracked session: ${sessionId}`);\n entry.windowId = windowId;\n}\n\nexport function untrackSession(sessionId: string): void {\n trackedSessions.delete(sessionId);\n}\n\nasync function pollAllSessions(): Promise<void> {\n for (const { id: sessionId, cwd, windowId } of trackedSessions.values()) {\n if (windowId) {\n await pollSession(sessionId, cwd, windowId);\n }\n }\n}\n\nasync function pollSession(sessionId: string, cwd: string, windowId: string): Promise<void> {\n let session;\n try {\n session = state.getSession(cwd, sessionId);\n } catch (err) {\n console.error(`[sisyphus] Failed to read state for session ${sessionId}:`, err);\n return;\n }\n\n if (session.status === 'completed') {\n const orchPaneId = getOrchestratorPaneId(sessionId);\n if (orchPaneId) {\n const livePanes = tmux.listPanes(windowId);\n const livePaneIds = new Set(livePanes.map(p => p.paneId));\n if (!livePaneIds.has(orchPaneId)) {\n cleanupSessionMaps(sessionId);\n untrackSession(sessionId);\n console.log(`[sisyphus] Session ${sessionId} cleaned up: orchestrator pane closed by user`);\n }\n } else {\n // No orchestrator pane tracked — clean up immediately\n cleanupSessionMaps(sessionId);\n untrackSession(sessionId);\n }\n return;\n }\n\n if (session.status !== 'active') return;\n\n const livePanes = tmux.listPanes(windowId);\n if (livePanes.length === 0) {\n // Check if the entire tmux session was destroyed\n const tracked = trackedSessions.get(sessionId);\n if (tracked && !tmux.sessionExists(tracked.tmuxSession)) {\n await state.updateSessionStatus(cwd, sessionId, 'paused');\n untrackSession(sessionId);\n console.log(`[sisyphus] Session ${sessionId} paused: tmux session destroyed`);\n }\n return;\n }\n\n const livePaneIds = new Set(livePanes.map(p => p.paneId));\n\n let paneRemoved = false;\n for (const agent of session.agents) {\n if (agent.status !== 'running') continue;\n if (!livePaneIds.has(agent.paneId)) {\n paneRemoved = true;\n const allDone = await handleAgentKilled(cwd, sessionId, agent.id, 'pane closed by user');\n if (allDone && onAllAgentsDone) {\n onAllAgentsDone(sessionId, cwd, windowId);\n }\n }\n }\n\n if (paneRemoved) tmux.selectLayout(windowId);\n\n // Check orchestrator pane\n const orchPaneId = getOrchestratorPaneId(sessionId);\n if (orchPaneId && !livePaneIds.has(orchPaneId)) {\n // Orchestrator pane disappeared without a yield command\n const runningAgents = session.agents.filter(a => a.status === 'running');\n if (runningAgents.length === 0) {\n // No agents running and orchestrator gone — pause\n await state.updateSessionStatus(cwd, sessionId, 'paused');\n console.log(`[sisyphus] Session ${sessionId} paused: orchestrator pane disappeared`);\n }\n }\n\n // Re-read state since handleAgentKilled may have mutated it\n session = state.getSession(cwd, sessionId);\n if (\n session.status === 'active' &&\n session.agents.length > 0 &&\n session.agents.every(a => a.status !== 'running') &&\n (!orchPaneId || !livePaneIds.has(orchPaneId)) &&\n onAllAgentsDone\n ) {\n console.log(`[sisyphus] Detected stuck session ${sessionId}: all agents done, no orchestrator — triggering respawn`);\n onAllAgentsDone(sessionId, cwd, windowId);\n }\n}\n","import { execSync } from 'node:child_process';\nimport { readFileSync, writeFileSync, unlinkSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { get } from 'node:https';\nimport { daemonUpdatingPath } from '../shared/paths.js';\n\nfunction isNewer(latest: string, current: string): boolean {\n const a = latest.split('.').map(Number);\n const b = current.split('.').map(Number);\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const av = a[i] ?? 0;\n const bv = b[i] ?? 0;\n if (av > bv) return true;\n if (av < bv) return false;\n }\n return false;\n}\n\nfunction readPackageVersion(): string {\n // Bundled: dist/daemon.js → ../package.json\n // Source (tsx): src/daemon/updater.ts → ../../package.json\n for (const rel of ['../package.json', '../../package.json']) {\n try {\n const raw = readFileSync(resolve(import.meta.dirname, rel), 'utf-8');\n const pkg = JSON.parse(raw) as { name?: string; version?: string };\n if (pkg.name === 'sisyphi' && pkg.version) return pkg.version;\n } catch {}\n }\n return '0.0.0';\n}\n\nconst currentVersion = readPackageVersion();\n\nexport function getCurrentVersion(): string {\n return currentVersion;\n}\n\nexport function checkForUpdate(): Promise<{ current: string; latest: string } | null> {\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n resolve(null);\n }, 5000);\n\n const req = get('https://registry.npmjs.org/sisyphi/latest', (res) => {\n let data = '';\n res.on('data', (chunk: Buffer) => { data += chunk.toString(); });\n res.on('end', () => {\n clearTimeout(timeout);\n try {\n const { version: latest } = JSON.parse(data) as { version: string };\n if (latest && isNewer(latest, currentVersion)) {\n resolve({ current: currentVersion, latest });\n } else {\n resolve(null);\n }\n } catch {\n resolve(null);\n }\n });\n });\n\n req.on('error', () => {\n clearTimeout(timeout);\n resolve(null);\n });\n });\n}\n\nexport function applyUpdate(expectedVersion: string): boolean {\n try {\n // launchd gives a minimal PATH — ensure node/npm directory is on PATH\n const nodeDir = resolve(process.execPath, '..');\n const env = { ...process.env, PATH: `${nodeDir}:${process.env.PATH ?? ''}` };\n execSync('npm install -g sisyphi', { timeout: 15000, stdio: 'pipe', env });\n\n // Verify the install actually landed the expected version\n const result = execSync('npm ls -g sisyphi --json --depth=0', {\n timeout: 5000, encoding: 'utf-8', env,\n });\n const info = JSON.parse(result) as { dependencies?: { sisyphi?: { version?: string } } };\n const installed = info.dependencies?.sisyphi?.version;\n if (installed !== expectedVersion) {\n console.error(`[sisyphus] Update installed ${installed} but expected ${expectedVersion}`);\n return false;\n }\n return true;\n } catch (err) {\n console.error('[sisyphus] Auto-update failed:', err);\n return false;\n }\n}\n\nfunction markUpdating(version: string): void {\n try { writeFileSync(daemonUpdatingPath(), version, 'utf-8'); } catch {}\n}\n\nfunction clearUpdating(): void {\n try { unlinkSync(daemonUpdatingPath()); } catch {}\n}\n\nexport async function checkAndApply(): Promise<void> {\n clearUpdating(); // clean up stale marker from previous run\n try {\n const update = await checkForUpdate();\n if (!update) return;\n\n console.log(`[sisyphus] Update available: ${update.current} → ${update.latest}`);\n markUpdating(update.latest);\n const success = applyUpdate(update.latest);\n if (success) {\n console.log(`[sisyphus] Updated to ${update.latest}, restarting daemon...`);\n process.exit(0); // launchd respawns with new code\n }\n clearUpdating();\n } catch (err) {\n clearUpdating();\n console.error('[sisyphus] Auto-update check failed:', err);\n }\n}\n"],"mappings":"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","names":["mkdirSync","readFileSync","writeFileSync","unlinkSync","existsSync","execSync","existsSync","writeFileSync","readFileSync","mkdirSync","rmSync","join","existsSync","readdirSync","rmSync","resolve","existsSync","readdirSync","readFileSync","writeFileSync","join","readFileSync","existsSync","readdirSync","join","registryPath","command","createSession","existsSync","readFileSync","readdirSync","join","writeFileSync","readFileSync","writeFileSync","copyFileSync","mkdirSync","readdirSync","existsSync","resolve","execSync","existsSync","mkdirSync","readFileSync","readdirSync","rmSync","dirname","join","EXEC_ENV","exec","execSync","execSafe","shellQuote","readFileSync","join","mkdirSync","dirname","existsSync","join","mkdirSync","dirname","execSafe","shellQuote","exec","readdirSync","rmSync","resolve","readFileSync","mkdirSync","writeFileSync","copyFileSync","existsSync","shellQuote","readdirSync","orchPaneId","livePanes","livePaneIds","createSession","existsSync","readdirSync","rmSync","onAllAgentsDone","available","sessionWindowMap","join","mkdirSync","writeFileSync","existsSync","readFileSync","sessionWindowMap","sessionDir","rmSync","resolve","execSync","readFileSync","writeFileSync","unlinkSync","resolve","readFileSync","resolve","resolve","execSync","writeFileSync","unlinkSync","mkdirSync","readFileSync","writeFileSync","execSync","unlinkSync","existsSync","onAllAgentsDone"]}
|