sisyphi 0.1.18 → 0.1.21

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.
@@ -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/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);\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): Promise<Session> {\n const sessionId = uuidv4();\n const session = state.createSession(sessionId, task, cwd);\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): 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 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 return `<state>\nsession: ${shortId} (cycle ${cycleNum})\ntask: ${session.task}\nstatus: ${session.status}\n\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 --agent-name Sisyphus --agent-id orchestrator --team-name sisyphus-${sessionId.slice(0, 8)} --settings \"${settingsPath}\" --plugin-dir \"${pluginPath}\" --append-system-prompt \"$(cat '${promptFilePath}')\" \"$(cat '${userPromptFilePath}')\"`;\n\n const paneId = tmux.createPane(windowId, cwd);\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","import { readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nexport 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\nfunction 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\nfunction extractFrontmatterColor(content: string): string | null {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) return null;\n const colorMatch = match[1]!.match(/^color:\\s*(.+)$/m);\n return colorMatch ? colorMatch[1]!.trim() : null;\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 resolveAgentTypeColor(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 try {\n const content = readFileSync(path, 'utf-8');\n const color = extractFrontmatterColor(content);\n if (color) return normalizeTmuxColor(color);\n } catch {\n // File doesn't exist, try next\n }\n }\n\n return null;\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): string {\n const cwdFlag = cwd ? ` -c ${shellQuote(cwd)}` : '';\n const paneId = exec(`tmux split-window -h -t \"${windowTarget}\"${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, resolveAgentTypeColor } 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';\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 const color = resolveAgentTypeColor(agentType, pluginPath, cwd) ?? 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 agentFlag = agentType && agentType !== 'worker' ? ` --agent ${shellQuote(agentType)}` : '';\n const agentNameFlag = ` --agent-name ${shellQuote(paneLabel)}`;\n const teamFlag = ` --agent-id ${shellQuote(agentId)} --team-name sisyphus-${sessionId.slice(0, 8)}`;\n const claudeCmd = `claude --dangerously-skip-permissions --plugin-dir \"${pluginPath}\"${agentFlag}${agentNameFlag}${teamFlag} --append-system-prompt \"$(cat '${suffixFilePath}')\" ${shellQuote(instruction)}`;\n const notifyCmd = `sisyphus notify pane-exited --pane-id ${paneId}`;\n const fullCmd = `${bannerCmd} ${envExports} && ${claudeCmd}; ${notifyCmd}`;\n\n const agent: Agent = {\n id: agentId,\n name,\n agentType,\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 * 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","readFileSync","join","registryPath","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","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/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"]}