sisyphi 0.1.5 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -627,6 +627,18 @@ function registerUninstall(program2) {
627
627
  });
628
628
  }
629
629
 
630
+ // src/cli/commands/notify.ts
631
+ function registerNotify(program2) {
632
+ const notify = program2.command("notify").description("Internal notifications (fire-and-forget)");
633
+ notify.command("pane-exited").description("Notify daemon that a tmux pane exited").requiredOption("--pane-id <paneId>", "Pane ID that exited").action(async (opts) => {
634
+ try {
635
+ const request = { type: "pane-exited", paneId: opts.paneId };
636
+ await rawSend(request);
637
+ } catch {
638
+ }
639
+ });
640
+ }
641
+
630
642
  // src/cli/index.ts
631
643
  var program = new Command();
632
644
  program.name("sisyphus").description("tmux-integrated orchestration daemon for Claude Code").version("0.1.0");
@@ -641,6 +653,7 @@ registerList(program);
641
653
  registerResume(program);
642
654
  registerKill(program);
643
655
  registerUninstall(program);
656
+ registerNotify(program);
644
657
  program.parseAsync(process.argv).catch((err) => {
645
658
  console.error(err.message);
646
659
  process.exit(1);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/index.ts","../src/cli/client.ts","../src/cli/install.ts","../src/cli/tmux.ts","../src/cli/commands/start.ts","../src/cli/commands/spawn.ts","../src/cli/commands/submit.ts","../src/cli/stdin.ts","../src/cli/commands/yield.ts","../src/cli/commands/complete.ts","../src/cli/commands/status.ts","../src/cli/commands/list.ts","../src/cli/commands/report.ts","../src/cli/commands/resume.ts","../src/cli/commands/kill.ts","../src/cli/commands/uninstall.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { registerStart } from './commands/start.js';\nimport { registerSpawn } from './commands/spawn.js';\nimport { registerSubmit } from './commands/submit.js';\nimport { registerYield } from './commands/yield.js';\nimport { registerComplete } from './commands/complete.js';\nimport { registerStatus } from './commands/status.js';\nimport { registerList } from './commands/list.js';\nimport { registerReport } from './commands/report.js';\nimport { registerResume } from './commands/resume.js';\nimport { registerKill } from './commands/kill.js';\nimport { registerUninstall } from './commands/uninstall.js';\n\nconst program = new Command();\n\nprogram\n .name('sisyphus')\n .description('tmux-integrated orchestration daemon for Claude Code')\n .version('0.1.0');\n\nregisterStart(program);\nregisterSpawn(program);\nregisterSubmit(program);\nregisterReport(program);\nregisterYield(program);\nregisterComplete(program);\nregisterStatus(program);\nregisterList(program);\nregisterResume(program);\nregisterKill(program);\nregisterUninstall(program);\n\nprogram.parseAsync(process.argv).catch((err: Error) => {\n console.error(err.message);\n process.exit(1);\n});\n","import { connect } from 'node:net';\nimport { socketPath } from '../shared/paths.js';\nimport type { Request, Response } from '../shared/protocol.js';\nimport { ensureDaemonInstalled, waitForDaemon } from './install.js';\n\nfunction rawSend(request: Request): Promise<Response> {\n const sock = socketPath();\n\n return new Promise<Response>((resolve, reject) => {\n const socket = connect(sock);\n let data = '';\n\n const timeout = setTimeout(() => {\n socket.destroy();\n reject(new Error('Request timed out after 10s'));\n }, 10_000);\n\n socket.on('connect', () => {\n socket.write(JSON.stringify(request) + '\\n');\n });\n\n socket.on('data', (chunk) => {\n data += chunk.toString();\n const newlineIdx = data.indexOf('\\n');\n if (newlineIdx !== -1) {\n clearTimeout(timeout);\n const line = data.slice(0, newlineIdx);\n socket.destroy();\n try {\n resolve(JSON.parse(line) as Response);\n } catch {\n reject(new Error(`Invalid JSON response from daemon: ${line}`));\n }\n }\n });\n\n socket.on('error', (err) => {\n clearTimeout(timeout);\n reject(err);\n });\n });\n}\n\nexport async function sendRequest(request: Request): Promise<Response> {\n const sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\n const MAX_ATTEMPTS = 5;\n const RETRY_DELAY_MS = 2000;\n let installedDaemon = false;\n let lastErr: unknown;\n\n for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {\n try {\n return await rawSend(request);\n } catch (err) {\n lastErr = err;\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== 'ENOENT' && code !== 'ECONNREFUSED') {\n throw err;\n }\n\n if (attempt === MAX_ATTEMPTS) break;\n\n if (process.platform === 'darwin' && !installedDaemon) {\n installedDaemon = true;\n await ensureDaemonInstalled();\n await waitForDaemon(5000);\n } else {\n process.stderr.write(`Daemon not ready, retrying (${attempt}/${MAX_ATTEMPTS - 1})...\\n`);\n await sleep(RETRY_DELAY_MS);\n }\n }\n }\n\n if (process.platform !== 'darwin') {\n throw new Error(\n `Sisyphus daemon is not running.\\n` +\n ` Start it manually: sisyphusd &\\n` +\n ` Or check logs at: ~/.sisyphus/daemon.log`\n );\n }\n throw lastErr;\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, mkdirSync, rmSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { connect } from 'node:net';\nimport { homedir } from 'node:os';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { daemonLogPath, globalDir, socketPath } from '../shared/paths.js';\n\nconst PLIST_LABEL = 'com.sisyphus.daemon';\nconst PLIST_FILENAME = `${PLIST_LABEL}.plist`;\n\nfunction launchAgentDir(): string {\n return join(homedir(), 'Library', 'LaunchAgents');\n}\n\nfunction plistPath(): string {\n return join(launchAgentDir(), PLIST_FILENAME);\n}\n\nfunction daemonBinPath(): string {\n const installDir = dirname(fileURLToPath(import.meta.url));\n return resolve(installDir, '..', 'daemon.js');\n}\n\nfunction generatePlist(nodePath: string, daemonPath: string, logPath: string): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${PLIST_LABEL}</string>\n <key>ProgramArguments</key>\n <array>\n <string>${nodePath}</string>\n <string>${daemonPath}</string>\n </array>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <true/>\n <key>StandardOutPath</key>\n <string>${logPath}</string>\n <key>StandardErrorPath</key>\n <string>${logPath}</string>\n</dict>\n</plist>\n`;\n}\n\nexport function isInstalled(): boolean {\n return existsSync(plistPath());\n}\n\nexport async function ensureDaemonInstalled(): Promise<void> {\n if (process.platform !== 'darwin') return;\n\n if (!isInstalled()) {\n const nodePath = process.execPath;\n const daemonPath = daemonBinPath();\n const logPath = daemonLogPath();\n\n mkdirSync(globalDir(), { recursive: true });\n mkdirSync(launchAgentDir(), { recursive: true });\n\n const plist = generatePlist(nodePath, daemonPath, logPath);\n writeFileSync(plistPath(), plist, 'utf8');\n\n execSync(`launchctl load -w ${plistPath()}`);\n }\n\n await waitForDaemon();\n}\n\nexport async function uninstallDaemon(purge: boolean): Promise<void> {\n if (process.platform !== 'darwin') {\n console.log('Auto-install is only supported on macOS.');\n return;\n }\n\n const plist = plistPath();\n if (existsSync(plist)) {\n try {\n execSync(`launchctl unload -w ${plist}`, { stdio: 'pipe' });\n } catch {\n // already unloaded or not registered — ignore\n }\n unlinkSync(plist);\n console.log('Daemon unloaded and plist removed.');\n } else {\n console.log('Daemon is not installed (plist not found).');\n }\n\n if (purge) {\n const dir = globalDir();\n if (existsSync(dir)) {\n rmSync(dir, { recursive: true, force: true });\n console.log(`Removed ${dir}`);\n }\n }\n}\n\nfunction testConnection(): Promise<void> {\n return new Promise((resolve, reject) => {\n const sock = connect(socketPath());\n sock.on('connect', () => { sock.destroy(); resolve(); });\n sock.on('error', (err) => { sock.destroy(); reject(err); });\n });\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function waitForDaemon(maxWaitMs = 6000): Promise<void> {\n const start = Date.now();\n while (Date.now() - start < maxWaitMs) {\n if (existsSync(socketPath())) {\n try {\n await testConnection();\n return;\n } catch {\n // not ready yet\n }\n }\n await sleep(300);\n }\n throw new Error(`Daemon did not start within ${maxWaitMs}ms. Check ${daemonLogPath()}`);\n}\n","import { execSync } from 'node:child_process';\n\nexport function assertTmux(): void {\n if (!process.env.TMUX) {\n throw new Error('Not running inside a tmux pane. Sisyphus requires tmux.');\n }\n}\n\nexport function getTmuxSession(): string {\n assertTmux();\n return execSync('tmux display-message -p \"#{session_name}\"', { encoding: 'utf8' }).trim();\n}\n\nexport function getTmuxWindow(): string {\n assertTmux();\n return execSync('tmux display-message -p \"#{window_id}\"', { encoding: 'utf8' }).trim();\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { getTmuxSession, getTmuxWindow } from '../tmux.js';\n\nexport function registerStart(program: Command): void {\n program\n .command('start')\n .description('Start a new sisyphus session')\n .argument('<task>', 'Task description for the orchestrator')\n .action(async (task: string) => {\n const tmuxSession = getTmuxSession();\n const tmuxWindow = getTmuxWindow();\n const request: Request = { type: 'start', task, cwd: process.cwd(), tmuxSession, tmuxWindow };\n const response = await sendRequest(request);\n if (response.ok) {\n const sessionId = response.data?.sessionId as string;\n console.log(`Session started: ${sessionId}`);\n if (response.data?.tmuxWindow) {\n console.log(`Orchestrator spawned in tmux window: ${response.data.tmuxWindow}`);\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { assertTmux } from '../tmux.js';\n\nexport function registerSpawn(program: Command): void {\n program\n .command('spawn')\n .description('Spawn a new agent (orchestrator only)')\n .option('--agent-type <type>', 'Agent role label (default: worker)', 'worker')\n .requiredOption('--name <name>', 'Agent name')\n .requiredOption('--instruction <instruction>', 'Task instruction for the agent')\n .option('--worktree', 'Spawn agent in an isolated git worktree')\n .action(async (opts: { agentType: string; name: string; instruction: string; worktree?: boolean }) => {\n assertTmux();\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n if (!sessionId) {\n console.error('Error: SISYPHUS_SESSION_ID environment variable not set');\n process.exit(1);\n }\n\n const request: Request = {\n type: 'spawn',\n sessionId,\n agentType: opts.agentType,\n name: opts.name,\n instruction: opts.instruction,\n ...(opts.worktree ? { worktree: true } : {}),\n };\n const response = await sendRequest(request);\n if (response.ok) {\n const agentId = response.data?.agentId as string;\n console.log(`Agent spawned: ${agentId}`);\n console.log(\"Run `sisyphus yield` when done spawning agents.\");\n } else {\n console.error(`Error: ${response.error}`);\n if (response.error?.includes(\"Unknown session\")) console.error(\"Hint: run `sisyphus list` to see active sessions.\");\n process.exit(1);\n }\n });\n}\n","import { execSync } from 'node:child_process';\nimport type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { readStdin } from '../stdin.js';\nimport { assertTmux } from '../tmux.js';\n\nfunction isInWorktree(): boolean {\n try {\n const gitDir = execSync('git rev-parse --git-dir', { encoding: 'utf-8' }).trim();\n const commonDir = execSync('git rev-parse --git-common-dir', { encoding: 'utf-8' }).trim();\n return gitDir !== commonDir;\n } catch {\n return false;\n }\n}\n\nfunction getUncommittedChanges(): string | null {\n try {\n const status = execSync('git status --porcelain', { encoding: 'utf-8' }).trim();\n return status || null;\n } catch {\n return null;\n }\n}\n\nexport function registerSubmit(program: Command): void {\n program\n .command('submit')\n .description('Submit work report and exit (agent only)')\n .option('--report <report>', 'Work report (or pipe via stdin)')\n .action(async (opts: { report?: string }) => {\n assertTmux();\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n const agentId = process.env.SISYPHUS_AGENT_ID;\n if (!sessionId || !agentId) {\n console.error('Error: SISYPHUS_SESSION_ID and SISYPHUS_AGENT_ID environment variables must be set');\n process.exit(1);\n }\n\n // Block submit if worktree has uncommitted changes — they'd be lost on merge\n if (isInWorktree()) {\n const changes = getUncommittedChanges();\n if (changes) {\n console.error('Error: uncommitted changes in worktree. Your branch is merged automatically after submit — uncommitted work will be lost.');\n console.error('\\nCommit first:\\n git add -A && git commit -m \"description of changes\"\\n');\n console.error('Or discard:\\n git checkout -- .\\n');\n console.error('Uncommitted changes:');\n console.error(changes);\n process.exit(1);\n }\n }\n\n const report = opts.report ?? await readStdin();\n if (!report) {\n console.error('Error: provide --report or pipe content via stdin');\n process.exit(1);\n }\n\n const request: Request = { type: 'submit', sessionId, agentId, report };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log('Report submitted successfully');\n console.log('Your pane will close. The orchestrator resumes when all agents finish.');\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","export function readStdin(): Promise<string | null> {\n if (process.stdin.isTTY) return Promise.resolve(null);\n\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n process.stdin.on('data', (chunk: Buffer) => chunks.push(chunk));\n process.stdin.on('end', () => {\n const text = Buffer.concat(chunks).toString('utf-8').trim();\n resolve(text || null);\n });\n process.stdin.on('error', reject);\n });\n}\n","import type { Command } from 'commander';\nimport { writeFileSync } from 'node:fs';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { readStdin } from '../stdin.js';\nimport { assertTmux } from '../tmux.js';\n\nexport function registerYield(program: Command): void {\n program\n .command('yield')\n .description('Yield control back to daemon (orchestrator only)')\n .option('--prompt <text>', 'Instructions for the next orchestrator cycle (or pipe via stdin)')\n .action(async (opts: { prompt?: string }) => {\n assertTmux();\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n if (!sessionId) {\n console.error('Error: SISYPHUS_SESSION_ID environment variable not set');\n process.exit(1);\n }\n\n const nextPrompt = opts.prompt ?? await readStdin() ?? undefined;\n\n const request: Request = { type: 'yield', sessionId, agentId: 'orchestrator', nextPrompt };\n const response = await sendRequest(request);\n if (response.ok) {\n writeFileSync(`/tmp/sisyphus-exit-${sessionId}`, '');\n console.log('Yielded. Waiting for agents to complete.');\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { writeFileSync } from 'node:fs';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { assertTmux } from '../tmux.js';\n\nexport function registerComplete(program: Command): void {\n program\n .command('complete')\n .description('Mark session as completed (orchestrator only)')\n .requiredOption('--report <report>', 'Final completion report')\n .action(async (opts: { report: string }) => {\n assertTmux();\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n if (!sessionId) {\n console.error('Error: SISYPHUS_SESSION_ID environment variable not set');\n process.exit(1);\n }\n\n const request: Request = { type: 'complete', sessionId, report: opts.report };\n const response = await sendRequest(request);\n if (response.ok) {\n writeFileSync(`/tmp/sisyphus-exit-${sessionId}`, '');\n console.log('Session completed.');\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport type { Session, Agent, OrchestratorCycle } from '../../shared/types.js';\n\nconst STATUS_COLORS: Record<string, string> = {\n active: '\\x1b[32m', // green\n paused: '\\x1b[33m', // yellow\n completed: '\\x1b[36m', // cyan\n running: '\\x1b[32m', // green\n killed: '\\x1b[31m', // red\n crashed: '\\x1b[31m', // red\n lost: '\\x1b[90m', // gray\n};\nconst RESET = '\\x1b[0m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\n\nfunction colorize(text: string, status: string): string {\n const color = STATUS_COLORS[status] ?? '';\n return `${color}${text}${RESET}`;\n}\n\nfunction formatDuration(startIso: string, endIso?: string | null): string {\n const start = new Date(startIso).getTime();\n const end = endIso ? new Date(endIso).getTime() : Date.now();\n const totalSeconds = Math.floor((end - start) / 1000);\n if (totalSeconds < 0) return '0s';\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n const parts: string[] = [];\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n parts.push(`${seconds}s`);\n return parts.join(' ');\n}\n\nfunction formatAgent(agent: Agent): string {\n const status = colorize(agent.status, agent.status);\n const name = `${BOLD}${agent.name}${RESET}`;\n const type = `${DIM}(${agent.agentType})${RESET}`;\n const duration = formatDuration(agent.spawnedAt, agent.completedAt);\n let line = ` ${agent.id} ${name} ${type} — ${status} ${DIM}(${duration})${RESET}`;\n if (agent.reports.length > 0) {\n for (const r of agent.reports) {\n const label = r.type === 'final' ? 'Final' : 'Update';\n line += `\\n ${label}: ${r.summary}`;\n }\n }\n if (agent.killedReason) {\n line += `\\n Reason: ${agent.killedReason}`;\n }\n return line;\n}\n\nfunction formatCycle(cycle: OrchestratorCycle): string {\n const duration = cycle.completedAt\n ? ` ${DIM}(${formatDuration(cycle.timestamp, cycle.completedAt)})${RESET}`\n : ` ${DIM}(running)${RESET}`;\n const agents = cycle.agentsSpawned.length > 0\n ? ` — agents: ${cycle.agentsSpawned.join(', ')}`\n : '';\n return ` Cycle ${cycle.cycle}${duration}${agents}`;\n}\n\nfunction printSession(session: Session): void {\n const status = colorize(session.status, session.status);\n const sessionDuration = formatDuration(session.createdAt, session.completedAt);\n console.log(`\\n${BOLD}Session: ${session.id}${RESET}`);\n console.log(` Status: ${status}`);\n console.log(` Task: ${session.task}`);\n console.log(` CWD: ${session.cwd}`);\n console.log(` Created: ${session.createdAt}`);\n console.log(` Duration: ${sessionDuration}${session.completedAt ? '' : ' (ongoing)'}`);\n console.log(` Orchestrator cycles: ${session.orchestratorCycles.length}`);\n\n if (session.orchestratorCycles.length > 0) {\n console.log(`\\n ${BOLD}Cycles:${RESET}`);\n for (const cycle of session.orchestratorCycles) {\n console.log(formatCycle(cycle));\n }\n }\n\n if (session.agents.length > 0) {\n console.log(`\\n ${BOLD}Agents:${RESET}`);\n for (const agent of session.agents) {\n console.log(formatAgent(agent));\n }\n }\n}\n\nexport function registerStatus(program: Command): void {\n program\n .command('status')\n .description('Show session status')\n .argument('[session-id]', 'Session ID (defaults to SISYPHUS_SESSION_ID env)')\n .action(async (sessionIdArg?: string) => {\n const sessionId = sessionIdArg ?? process.env.SISYPHUS_SESSION_ID;\n\n const request: Request = { type: 'status', sessionId };\n const response = await sendRequest(request);\n if (response.ok) {\n const session = response.data?.session as Session | undefined;\n if (session) {\n printSession(session);\n } else {\n console.log('No session found');\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { basename } from 'node:path';\n\ninterface SessionSummary {\n id: string;\n task: string;\n status: string;\n agentCount: number;\n createdAt: string;\n cwd?: string;\n}\n\nconst STATUS_COLORS: Record<string, string> = {\n active: '\\x1b[32m',\n paused: '\\x1b[33m',\n completed: '\\x1b[36m',\n};\nconst RESET = '\\x1b[0m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\n\nfunction truncateTask(task: string, max: number): string {\n if (task.length <= max) return task;\n return task.slice(0, max - 1) + '…';\n}\n\nexport function registerList(program: Command): void {\n program\n .command('list')\n .description('List sessions (defaults to current project)')\n .option('-a, --all', 'Show sessions from all projects')\n .action(async (opts: { all?: boolean }) => {\n const cwd = process.cwd();\n const request: Request = { type: 'list', cwd, all: opts.all };\n const response = await sendRequest(request);\n if (response.ok) {\n const sessions = (response.data?.sessions ?? []) as SessionSummary[];\n const totalCount = response.data?.totalCount as number | undefined;\n const filtered = response.data?.filtered as boolean | undefined;\n\n if (sessions.length === 0) {\n if (filtered && totalCount && totalCount > 0) {\n console.log(`No sessions in this project. ${totalCount} session(s) in other projects.`);\n console.log(`${DIM}Run ${RESET}sisyphus list --all${DIM} to show all.${RESET}`);\n } else {\n console.log('No sessions');\n }\n return;\n }\n\n for (const s of sessions) {\n const color = STATUS_COLORS[s.status] ?? '';\n const status = `${color}${s.status}${RESET}`;\n const agents = `${DIM}${s.agentCount} agent(s)${RESET}`;\n const task = truncateTask(s.task, 60);\n const cwdLabel = opts.all && s.cwd ? ` ${DIM}${basename(s.cwd)}${RESET}` : '';\n console.log(` ${BOLD}${s.id}${RESET} ${status} ${agents} ${task}${cwdLabel}`);\n }\n\n if (filtered && totalCount && totalCount > sessions.length) {\n const otherCount = totalCount - sessions.length;\n console.log(`\\n${DIM}${otherCount} more session(s) in other projects. Run ${RESET}sisyphus list --all${DIM} to show all.${RESET}`);\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { readStdin } from '../stdin.js';\nimport { assertTmux } from '../tmux.js';\n\nexport function registerReport(program: Command): void {\n program\n .command('report')\n .description('Send a progress report without exiting (agent only)')\n .option('--message <message>', 'Progress report content')\n .action(async (opts: { message?: string }) => {\n assertTmux();\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n const agentId = process.env.SISYPHUS_AGENT_ID;\n if (!sessionId || !agentId) {\n console.error('Error: SISYPHUS_SESSION_ID and SISYPHUS_AGENT_ID environment variables must be set');\n process.exit(1);\n }\n\n const content = opts.message ?? await readStdin();\n if (!content) {\n console.error('Error: provide --message or pipe content via stdin');\n process.exit(1);\n }\n\n const request: Request = { type: 'report', sessionId, agentId, content };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log('Progress report recorded');\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { getTmuxSession, getTmuxWindow } from '../tmux.js';\n\nexport function registerResume(program: Command): void {\n program\n .command('resume')\n .description('Resume a paused session')\n .argument('<session-id>', 'Session ID to resume')\n .argument('[message]', 'Additional instructions for the orchestrator')\n .action(async (sessionId: string, message?: string) => {\n const tmuxSession = getTmuxSession();\n const tmuxWindow = getTmuxWindow();\n const cwd = process.cwd();\n const request: Request = { type: 'resume', sessionId, cwd, tmuxSession, tmuxWindow, message };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log(`Session ${sessionId} resumed`);\n if (response.data?.tmuxWindow) {\n console.log(`Orchestrator respawned in tmux window: ${response.data.tmuxWindow}`);\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\nexport function registerKill(program: Command): void {\n program\n .command('kill <sessionId>')\n .description('Kill a running session and all its agents')\n .action(async (sessionId: string) => {\n const request: Request = { type: 'kill', sessionId };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log(`Session ${sessionId} killed.`);\n if (response.data) {\n const { killedAgents } = response.data as { killedAgents: number };\n console.log(`Cleaned up: ${killedAgents} agent(s) killed, tmux window removed.`);\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { createInterface } from 'node:readline';\nimport { uninstallDaemon } from '../install.js';\n\nasync function confirm(question: string): Promise<boolean> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim().toLowerCase() === 'y');\n });\n });\n}\n\nexport function registerUninstall(program: Command): void {\n program\n .command('uninstall')\n .description('Unload the sisyphus daemon from launchd and remove the plist')\n .option('--purge', 'Also remove all session data in ~/.sisyphus')\n .option('-y, --yes', 'Skip confirmation prompt for --purge')\n .action(async (opts: { purge?: boolean; yes?: boolean }) => {\n const purge = opts.purge ?? false;\n\n if (purge && !opts.yes) {\n const ok = await confirm('This will delete all session data in ~/.sisyphus. Continue? (y/N) ');\n if (!ok) {\n console.log('Aborted.');\n return;\n }\n }\n\n await uninstallDaemon(purge);\n });\n}\n"],"mappings":"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","names":["connect","resolve","resolve","connect","sleep","execSync","program","program","execSync","resolve","execSync","program","writeFileSync","program","writeFileSync","writeFileSync","program","writeFileSync","program","STATUS_COLORS","RESET","BOLD","DIM","program","program","program","program","resolve","program"]}
1
+ {"version":3,"sources":["../src/cli/index.ts","../src/cli/client.ts","../src/cli/install.ts","../src/cli/tmux.ts","../src/cli/commands/start.ts","../src/cli/commands/spawn.ts","../src/cli/commands/submit.ts","../src/cli/stdin.ts","../src/cli/commands/yield.ts","../src/cli/commands/complete.ts","../src/cli/commands/status.ts","../src/cli/commands/list.ts","../src/cli/commands/report.ts","../src/cli/commands/resume.ts","../src/cli/commands/kill.ts","../src/cli/commands/uninstall.ts","../src/cli/commands/notify.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { registerStart } from './commands/start.js';\nimport { registerSpawn } from './commands/spawn.js';\nimport { registerSubmit } from './commands/submit.js';\nimport { registerYield } from './commands/yield.js';\nimport { registerComplete } from './commands/complete.js';\nimport { registerStatus } from './commands/status.js';\nimport { registerList } from './commands/list.js';\nimport { registerReport } from './commands/report.js';\nimport { registerResume } from './commands/resume.js';\nimport { registerKill } from './commands/kill.js';\nimport { registerUninstall } from './commands/uninstall.js';\nimport { registerNotify } from './commands/notify.js';\n\nconst program = new Command();\n\nprogram\n .name('sisyphus')\n .description('tmux-integrated orchestration daemon for Claude Code')\n .version('0.1.0');\n\nregisterStart(program);\nregisterSpawn(program);\nregisterSubmit(program);\nregisterReport(program);\nregisterYield(program);\nregisterComplete(program);\nregisterStatus(program);\nregisterList(program);\nregisterResume(program);\nregisterKill(program);\nregisterUninstall(program);\nregisterNotify(program);\n\nprogram.parseAsync(process.argv).catch((err: Error) => {\n console.error(err.message);\n process.exit(1);\n});\n","import { connect } from 'node:net';\nimport { socketPath } from '../shared/paths.js';\nimport type { Request, Response } from '../shared/protocol.js';\nimport { ensureDaemonInstalled, waitForDaemon } from './install.js';\n\nexport function rawSend(request: Request): Promise<Response> {\n const sock = socketPath();\n\n return new Promise<Response>((resolve, reject) => {\n const socket = connect(sock);\n let data = '';\n\n const timeout = setTimeout(() => {\n socket.destroy();\n reject(new Error('Request timed out after 10s'));\n }, 10_000);\n\n socket.on('connect', () => {\n socket.write(JSON.stringify(request) + '\\n');\n });\n\n socket.on('data', (chunk) => {\n data += chunk.toString();\n const newlineIdx = data.indexOf('\\n');\n if (newlineIdx !== -1) {\n clearTimeout(timeout);\n const line = data.slice(0, newlineIdx);\n socket.destroy();\n try {\n resolve(JSON.parse(line) as Response);\n } catch {\n reject(new Error(`Invalid JSON response from daemon: ${line}`));\n }\n }\n });\n\n socket.on('error', (err) => {\n clearTimeout(timeout);\n reject(err);\n });\n });\n}\n\nexport async function sendRequest(request: Request): Promise<Response> {\n const sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\n const MAX_ATTEMPTS = 5;\n const RETRY_DELAY_MS = 2000;\n let installedDaemon = false;\n let lastErr: unknown;\n\n for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {\n try {\n return await rawSend(request);\n } catch (err) {\n lastErr = err;\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== 'ENOENT' && code !== 'ECONNREFUSED') {\n throw err;\n }\n\n if (attempt === MAX_ATTEMPTS) break;\n\n if (process.platform === 'darwin' && !installedDaemon) {\n installedDaemon = true;\n await ensureDaemonInstalled();\n await waitForDaemon(5000);\n } else {\n process.stderr.write(`Daemon not ready, retrying (${attempt}/${MAX_ATTEMPTS - 1})...\\n`);\n await sleep(RETRY_DELAY_MS);\n }\n }\n }\n\n if (process.platform !== 'darwin') {\n throw new Error(\n `Sisyphus daemon is not running.\\n` +\n ` Start it manually: sisyphusd &\\n` +\n ` Or check logs at: ~/.sisyphus/daemon.log`\n );\n }\n throw lastErr;\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, mkdirSync, rmSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { connect } from 'node:net';\nimport { homedir } from 'node:os';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { daemonLogPath, globalDir, socketPath } from '../shared/paths.js';\n\nconst PLIST_LABEL = 'com.sisyphus.daemon';\nconst PLIST_FILENAME = `${PLIST_LABEL}.plist`;\n\nfunction launchAgentDir(): string {\n return join(homedir(), 'Library', 'LaunchAgents');\n}\n\nfunction plistPath(): string {\n return join(launchAgentDir(), PLIST_FILENAME);\n}\n\nfunction daemonBinPath(): string {\n const installDir = dirname(fileURLToPath(import.meta.url));\n return resolve(installDir, '..', 'daemon.js');\n}\n\nfunction generatePlist(nodePath: string, daemonPath: string, logPath: string): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${PLIST_LABEL}</string>\n <key>ProgramArguments</key>\n <array>\n <string>${nodePath}</string>\n <string>${daemonPath}</string>\n </array>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <true/>\n <key>StandardOutPath</key>\n <string>${logPath}</string>\n <key>StandardErrorPath</key>\n <string>${logPath}</string>\n</dict>\n</plist>\n`;\n}\n\nexport function isInstalled(): boolean {\n return existsSync(plistPath());\n}\n\nexport async function ensureDaemonInstalled(): Promise<void> {\n if (process.platform !== 'darwin') return;\n\n if (!isInstalled()) {\n const nodePath = process.execPath;\n const daemonPath = daemonBinPath();\n const logPath = daemonLogPath();\n\n mkdirSync(globalDir(), { recursive: true });\n mkdirSync(launchAgentDir(), { recursive: true });\n\n const plist = generatePlist(nodePath, daemonPath, logPath);\n writeFileSync(plistPath(), plist, 'utf8');\n\n execSync(`launchctl load -w ${plistPath()}`);\n }\n\n await waitForDaemon();\n}\n\nexport async function uninstallDaemon(purge: boolean): Promise<void> {\n if (process.platform !== 'darwin') {\n console.log('Auto-install is only supported on macOS.');\n return;\n }\n\n const plist = plistPath();\n if (existsSync(plist)) {\n try {\n execSync(`launchctl unload -w ${plist}`, { stdio: 'pipe' });\n } catch {\n // already unloaded or not registered — ignore\n }\n unlinkSync(plist);\n console.log('Daemon unloaded and plist removed.');\n } else {\n console.log('Daemon is not installed (plist not found).');\n }\n\n if (purge) {\n const dir = globalDir();\n if (existsSync(dir)) {\n rmSync(dir, { recursive: true, force: true });\n console.log(`Removed ${dir}`);\n }\n }\n}\n\nfunction testConnection(): Promise<void> {\n return new Promise((resolve, reject) => {\n const sock = connect(socketPath());\n sock.on('connect', () => { sock.destroy(); resolve(); });\n sock.on('error', (err) => { sock.destroy(); reject(err); });\n });\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function waitForDaemon(maxWaitMs = 6000): Promise<void> {\n const start = Date.now();\n while (Date.now() - start < maxWaitMs) {\n if (existsSync(socketPath())) {\n try {\n await testConnection();\n return;\n } catch {\n // not ready yet\n }\n }\n await sleep(300);\n }\n throw new Error(`Daemon did not start within ${maxWaitMs}ms. Check ${daemonLogPath()}`);\n}\n","import { execSync } from 'node:child_process';\n\nexport function assertTmux(): void {\n if (!process.env.TMUX) {\n throw new Error('Not running inside a tmux pane. Sisyphus requires tmux.');\n }\n}\n\nexport function getTmuxSession(): string {\n assertTmux();\n return execSync('tmux display-message -p \"#{session_name}\"', { encoding: 'utf8' }).trim();\n}\n\nexport function getTmuxWindow(): string {\n assertTmux();\n return execSync('tmux display-message -p \"#{window_id}\"', { encoding: 'utf8' }).trim();\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { getTmuxSession, getTmuxWindow } from '../tmux.js';\n\nexport function registerStart(program: Command): void {\n program\n .command('start')\n .description('Start a new sisyphus session')\n .argument('<task>', 'Task description for the orchestrator')\n .action(async (task: string) => {\n const tmuxSession = getTmuxSession();\n const tmuxWindow = getTmuxWindow();\n const request: Request = { type: 'start', task, cwd: process.cwd(), tmuxSession, tmuxWindow };\n const response = await sendRequest(request);\n if (response.ok) {\n const sessionId = response.data?.sessionId as string;\n console.log(`Session started: ${sessionId}`);\n if (response.data?.tmuxWindow) {\n console.log(`Orchestrator spawned in tmux window: ${response.data.tmuxWindow}`);\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { assertTmux } from '../tmux.js';\n\nexport function registerSpawn(program: Command): void {\n program\n .command('spawn')\n .description('Spawn a new agent (orchestrator only)')\n .option('--agent-type <type>', 'Agent role label (default: worker)', 'worker')\n .requiredOption('--name <name>', 'Agent name')\n .requiredOption('--instruction <instruction>', 'Task instruction for the agent')\n .option('--worktree', 'Spawn agent in an isolated git worktree')\n .action(async (opts: { agentType: string; name: string; instruction: string; worktree?: boolean }) => {\n assertTmux();\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n if (!sessionId) {\n console.error('Error: SISYPHUS_SESSION_ID environment variable not set');\n process.exit(1);\n }\n\n const request: Request = {\n type: 'spawn',\n sessionId,\n agentType: opts.agentType,\n name: opts.name,\n instruction: opts.instruction,\n ...(opts.worktree ? { worktree: true } : {}),\n };\n const response = await sendRequest(request);\n if (response.ok) {\n const agentId = response.data?.agentId as string;\n console.log(`Agent spawned: ${agentId}`);\n console.log(\"Run `sisyphus yield` when done spawning agents.\");\n } else {\n console.error(`Error: ${response.error}`);\n if (response.error?.includes(\"Unknown session\")) console.error(\"Hint: run `sisyphus list` to see active sessions.\");\n process.exit(1);\n }\n });\n}\n","import { execSync } from 'node:child_process';\nimport type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { readStdin } from '../stdin.js';\nimport { assertTmux } from '../tmux.js';\n\nfunction isInWorktree(): boolean {\n try {\n const gitDir = execSync('git rev-parse --git-dir', { encoding: 'utf-8' }).trim();\n const commonDir = execSync('git rev-parse --git-common-dir', { encoding: 'utf-8' }).trim();\n return gitDir !== commonDir;\n } catch {\n return false;\n }\n}\n\nfunction getUncommittedChanges(): string | null {\n try {\n const status = execSync('git status --porcelain', { encoding: 'utf-8' }).trim();\n return status || null;\n } catch {\n return null;\n }\n}\n\nexport function registerSubmit(program: Command): void {\n program\n .command('submit')\n .description('Submit work report and exit (agent only)')\n .option('--report <report>', 'Work report (or pipe via stdin)')\n .action(async (opts: { report?: string }) => {\n assertTmux();\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n const agentId = process.env.SISYPHUS_AGENT_ID;\n if (!sessionId || !agentId) {\n console.error('Error: SISYPHUS_SESSION_ID and SISYPHUS_AGENT_ID environment variables must be set');\n process.exit(1);\n }\n\n // Block submit if worktree has uncommitted changes — they'd be lost on merge\n if (isInWorktree()) {\n const changes = getUncommittedChanges();\n if (changes) {\n console.error('Error: uncommitted changes in worktree. Your branch is merged automatically after submit — uncommitted work will be lost.');\n console.error('\\nCommit first:\\n git add -A && git commit -m \"description of changes\"\\n');\n console.error('Or discard:\\n git checkout -- .\\n');\n console.error('Uncommitted changes:');\n console.error(changes);\n process.exit(1);\n }\n }\n\n const report = opts.report ?? await readStdin();\n if (!report) {\n console.error('Error: provide --report or pipe content via stdin');\n process.exit(1);\n }\n\n const request: Request = { type: 'submit', sessionId, agentId, report };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log('Report submitted successfully');\n console.log('Your pane will close. The orchestrator resumes when all agents finish.');\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","export function readStdin(): Promise<string | null> {\n if (process.stdin.isTTY) return Promise.resolve(null);\n\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n process.stdin.on('data', (chunk: Buffer) => chunks.push(chunk));\n process.stdin.on('end', () => {\n const text = Buffer.concat(chunks).toString('utf-8').trim();\n resolve(text || null);\n });\n process.stdin.on('error', reject);\n });\n}\n","import type { Command } from 'commander';\nimport { writeFileSync } from 'node:fs';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { readStdin } from '../stdin.js';\nimport { assertTmux } from '../tmux.js';\n\nexport function registerYield(program: Command): void {\n program\n .command('yield')\n .description('Yield control back to daemon (orchestrator only)')\n .option('--prompt <text>', 'Instructions for the next orchestrator cycle (or pipe via stdin)')\n .action(async (opts: { prompt?: string }) => {\n assertTmux();\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n if (!sessionId) {\n console.error('Error: SISYPHUS_SESSION_ID environment variable not set');\n process.exit(1);\n }\n\n const nextPrompt = opts.prompt ?? await readStdin() ?? undefined;\n\n const request: Request = { type: 'yield', sessionId, agentId: 'orchestrator', nextPrompt };\n const response = await sendRequest(request);\n if (response.ok) {\n writeFileSync(`/tmp/sisyphus-exit-${sessionId}`, '');\n console.log('Yielded. Waiting for agents to complete.');\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { writeFileSync } from 'node:fs';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { assertTmux } from '../tmux.js';\n\nexport function registerComplete(program: Command): void {\n program\n .command('complete')\n .description('Mark session as completed (orchestrator only)')\n .requiredOption('--report <report>', 'Final completion report')\n .action(async (opts: { report: string }) => {\n assertTmux();\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n if (!sessionId) {\n console.error('Error: SISYPHUS_SESSION_ID environment variable not set');\n process.exit(1);\n }\n\n const request: Request = { type: 'complete', sessionId, report: opts.report };\n const response = await sendRequest(request);\n if (response.ok) {\n writeFileSync(`/tmp/sisyphus-exit-${sessionId}`, '');\n console.log('Session completed.');\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport type { Session, Agent, OrchestratorCycle } from '../../shared/types.js';\n\nconst STATUS_COLORS: Record<string, string> = {\n active: '\\x1b[32m', // green\n paused: '\\x1b[33m', // yellow\n completed: '\\x1b[36m', // cyan\n running: '\\x1b[32m', // green\n killed: '\\x1b[31m', // red\n crashed: '\\x1b[31m', // red\n lost: '\\x1b[90m', // gray\n};\nconst RESET = '\\x1b[0m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\n\nfunction colorize(text: string, status: string): string {\n const color = STATUS_COLORS[status] ?? '';\n return `${color}${text}${RESET}`;\n}\n\nfunction formatDuration(startIso: string, endIso?: string | null): string {\n const start = new Date(startIso).getTime();\n const end = endIso ? new Date(endIso).getTime() : Date.now();\n const totalSeconds = Math.floor((end - start) / 1000);\n if (totalSeconds < 0) return '0s';\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n const parts: string[] = [];\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n parts.push(`${seconds}s`);\n return parts.join(' ');\n}\n\nfunction formatAgent(agent: Agent): string {\n const status = colorize(agent.status, agent.status);\n const name = `${BOLD}${agent.name}${RESET}`;\n const type = `${DIM}(${agent.agentType})${RESET}`;\n const duration = formatDuration(agent.spawnedAt, agent.completedAt);\n let line = ` ${agent.id} ${name} ${type} — ${status} ${DIM}(${duration})${RESET}`;\n if (agent.reports.length > 0) {\n for (const r of agent.reports) {\n const label = r.type === 'final' ? 'Final' : 'Update';\n line += `\\n ${label}: ${r.summary}`;\n }\n }\n if (agent.killedReason) {\n line += `\\n Reason: ${agent.killedReason}`;\n }\n return line;\n}\n\nfunction formatCycle(cycle: OrchestratorCycle): string {\n const duration = cycle.completedAt\n ? ` ${DIM}(${formatDuration(cycle.timestamp, cycle.completedAt)})${RESET}`\n : ` ${DIM}(running)${RESET}`;\n const agents = cycle.agentsSpawned.length > 0\n ? ` — agents: ${cycle.agentsSpawned.join(', ')}`\n : '';\n return ` Cycle ${cycle.cycle}${duration}${agents}`;\n}\n\nfunction printSession(session: Session): void {\n const status = colorize(session.status, session.status);\n const sessionDuration = formatDuration(session.createdAt, session.completedAt);\n console.log(`\\n${BOLD}Session: ${session.id}${RESET}`);\n console.log(` Status: ${status}`);\n console.log(` Task: ${session.task}`);\n console.log(` CWD: ${session.cwd}`);\n console.log(` Created: ${session.createdAt}`);\n console.log(` Duration: ${sessionDuration}${session.completedAt ? '' : ' (ongoing)'}`);\n console.log(` Orchestrator cycles: ${session.orchestratorCycles.length}`);\n\n if (session.orchestratorCycles.length > 0) {\n console.log(`\\n ${BOLD}Cycles:${RESET}`);\n for (const cycle of session.orchestratorCycles) {\n console.log(formatCycle(cycle));\n }\n }\n\n if (session.agents.length > 0) {\n console.log(`\\n ${BOLD}Agents:${RESET}`);\n for (const agent of session.agents) {\n console.log(formatAgent(agent));\n }\n }\n}\n\nexport function registerStatus(program: Command): void {\n program\n .command('status')\n .description('Show session status')\n .argument('[session-id]', 'Session ID (defaults to SISYPHUS_SESSION_ID env)')\n .action(async (sessionIdArg?: string) => {\n const sessionId = sessionIdArg ?? process.env.SISYPHUS_SESSION_ID;\n\n const request: Request = { type: 'status', sessionId };\n const response = await sendRequest(request);\n if (response.ok) {\n const session = response.data?.session as Session | undefined;\n if (session) {\n printSession(session);\n } else {\n console.log('No session found');\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { basename } from 'node:path';\n\ninterface SessionSummary {\n id: string;\n task: string;\n status: string;\n agentCount: number;\n createdAt: string;\n cwd?: string;\n}\n\nconst STATUS_COLORS: Record<string, string> = {\n active: '\\x1b[32m',\n paused: '\\x1b[33m',\n completed: '\\x1b[36m',\n};\nconst RESET = '\\x1b[0m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\n\nfunction truncateTask(task: string, max: number): string {\n if (task.length <= max) return task;\n return task.slice(0, max - 1) + '…';\n}\n\nexport function registerList(program: Command): void {\n program\n .command('list')\n .description('List sessions (defaults to current project)')\n .option('-a, --all', 'Show sessions from all projects')\n .action(async (opts: { all?: boolean }) => {\n const cwd = process.cwd();\n const request: Request = { type: 'list', cwd, all: opts.all };\n const response = await sendRequest(request);\n if (response.ok) {\n const sessions = (response.data?.sessions ?? []) as SessionSummary[];\n const totalCount = response.data?.totalCount as number | undefined;\n const filtered = response.data?.filtered as boolean | undefined;\n\n if (sessions.length === 0) {\n if (filtered && totalCount && totalCount > 0) {\n console.log(`No sessions in this project. ${totalCount} session(s) in other projects.`);\n console.log(`${DIM}Run ${RESET}sisyphus list --all${DIM} to show all.${RESET}`);\n } else {\n console.log('No sessions');\n }\n return;\n }\n\n for (const s of sessions) {\n const color = STATUS_COLORS[s.status] ?? '';\n const status = `${color}${s.status}${RESET}`;\n const agents = `${DIM}${s.agentCount} agent(s)${RESET}`;\n const task = truncateTask(s.task, 60);\n const cwdLabel = opts.all && s.cwd ? ` ${DIM}${basename(s.cwd)}${RESET}` : '';\n console.log(` ${BOLD}${s.id}${RESET} ${status} ${agents} ${task}${cwdLabel}`);\n }\n\n if (filtered && totalCount && totalCount > sessions.length) {\n const otherCount = totalCount - sessions.length;\n console.log(`\\n${DIM}${otherCount} more session(s) in other projects. Run ${RESET}sisyphus list --all${DIM} to show all.${RESET}`);\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { readStdin } from '../stdin.js';\nimport { assertTmux } from '../tmux.js';\n\nexport function registerReport(program: Command): void {\n program\n .command('report')\n .description('Send a progress report without exiting (agent only)')\n .option('--message <message>', 'Progress report content')\n .action(async (opts: { message?: string }) => {\n assertTmux();\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n const agentId = process.env.SISYPHUS_AGENT_ID;\n if (!sessionId || !agentId) {\n console.error('Error: SISYPHUS_SESSION_ID and SISYPHUS_AGENT_ID environment variables must be set');\n process.exit(1);\n }\n\n const content = opts.message ?? await readStdin();\n if (!content) {\n console.error('Error: provide --message or pipe content via stdin');\n process.exit(1);\n }\n\n const request: Request = { type: 'report', sessionId, agentId, content };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log('Progress report recorded');\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { getTmuxSession, getTmuxWindow } from '../tmux.js';\n\nexport function registerResume(program: Command): void {\n program\n .command('resume')\n .description('Resume a paused session')\n .argument('<session-id>', 'Session ID to resume')\n .argument('[message]', 'Additional instructions for the orchestrator')\n .action(async (sessionId: string, message?: string) => {\n const tmuxSession = getTmuxSession();\n const tmuxWindow = getTmuxWindow();\n const cwd = process.cwd();\n const request: Request = { type: 'resume', sessionId, cwd, tmuxSession, tmuxWindow, message };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log(`Session ${sessionId} resumed`);\n if (response.data?.tmuxWindow) {\n console.log(`Orchestrator respawned in tmux window: ${response.data.tmuxWindow}`);\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\nexport function registerKill(program: Command): void {\n program\n .command('kill <sessionId>')\n .description('Kill a running session and all its agents')\n .action(async (sessionId: string) => {\n const request: Request = { type: 'kill', sessionId };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log(`Session ${sessionId} killed.`);\n if (response.data) {\n const { killedAgents } = response.data as { killedAgents: number };\n console.log(`Cleaned up: ${killedAgents} agent(s) killed, tmux window removed.`);\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { createInterface } from 'node:readline';\nimport { uninstallDaemon } from '../install.js';\n\nasync function confirm(question: string): Promise<boolean> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim().toLowerCase() === 'y');\n });\n });\n}\n\nexport function registerUninstall(program: Command): void {\n program\n .command('uninstall')\n .description('Unload the sisyphus daemon from launchd and remove the plist')\n .option('--purge', 'Also remove all session data in ~/.sisyphus')\n .option('-y, --yes', 'Skip confirmation prompt for --purge')\n .action(async (opts: { purge?: boolean; yes?: boolean }) => {\n const purge = opts.purge ?? false;\n\n if (purge && !opts.yes) {\n const ok = await confirm('This will delete all session data in ~/.sisyphus. Continue? (y/N) ');\n if (!ok) {\n console.log('Aborted.');\n return;\n }\n }\n\n await uninstallDaemon(purge);\n });\n}\n","import type { Command } from 'commander';\nimport { rawSend } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\nexport function registerNotify(program: Command): void {\n const notify = program\n .command('notify')\n .description('Internal notifications (fire-and-forget)');\n\n notify\n .command('pane-exited')\n .description('Notify daemon that a tmux pane exited')\n .requiredOption('--pane-id <paneId>', 'Pane ID that exited')\n .action(async (opts: { paneId: string }) => {\n try {\n const request: Request = { type: 'pane-exited', paneId: opts.paneId };\n await rawSend(request);\n } catch {\n // Fire-and-forget: daemon may be stopped, socket gone, etc.\n }\n });\n}\n"],"mappings":"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","names":["connect","resolve","resolve","connect","sleep","execSync","program","program","execSync","resolve","execSync","program","writeFileSync","program","writeFileSync","writeFileSync","program","writeFileSync","program","STATUS_COLORS","RESET","BOLD","DIM","program","program","program","program","resolve","program","program"]}