sisyphi 0.1.0 → 0.1.1
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/README.md +10 -0
- package/dist/{chunk-5WP7O7D3.js → chunk-T6Z5F4SP.js} +6 -2
- package/dist/{chunk-5WP7O7D3.js.map → chunk-T6Z5F4SP.js.map} +1 -1
- package/dist/cli.js +4 -3
- package/dist/cli.js.map +1 -1
- package/dist/daemon.js +51 -19
- package/dist/daemon.js.map +1 -1
- package/dist/templates/agent-suffix.md +15 -36
- package/dist/templates/orchestrator.md +81 -71
- package/package.json +1 -1
- package/templates/agent-suffix.md +15 -36
- package/templates/orchestrator.md +81 -71
package/README.md
CHANGED
|
@@ -52,6 +52,16 @@ This gives you two commands:
|
|
|
52
52
|
- `sisyphus` — the CLI for interacting with sessions
|
|
53
53
|
- `sisyphusd` — the background daemon
|
|
54
54
|
|
|
55
|
+
### Claude Code Plugin (optional)
|
|
56
|
+
|
|
57
|
+
The companion plugin on the [crouton-kit](https://github.com/CaptainCrouton89/crouton-kit) marketplace adds 11 specialized agent types and an orchestration skill with task breakdown patterns for common workflows (bug fixes, feature builds, refactors, reviews, etc.).
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
claude plugins install CaptainCrouton89/crouton-kit sisyphus
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
This makes `sisyphus:debug`, `sisyphus:implement`, `sisyphus:plan`, and other agent types available for `sisyphus spawn --agent-type`.
|
|
64
|
+
|
|
55
65
|
## Quick Start
|
|
56
66
|
|
|
57
67
|
### 1. Start the daemon
|
|
@@ -39,6 +39,9 @@ function reportsDir(cwd, sessionId) {
|
|
|
39
39
|
function reportFilePath(cwd, sessionId, agentId, suffix) {
|
|
40
40
|
return join(reportsDir(cwd, sessionId), `${agentId}-${suffix}.md`);
|
|
41
41
|
}
|
|
42
|
+
function contextDir(cwd, sessionId) {
|
|
43
|
+
return join(sessionDir(cwd, sessionId), "context");
|
|
44
|
+
}
|
|
42
45
|
|
|
43
46
|
export {
|
|
44
47
|
globalDir,
|
|
@@ -51,6 +54,7 @@ export {
|
|
|
51
54
|
sessionDir,
|
|
52
55
|
statePath,
|
|
53
56
|
reportsDir,
|
|
54
|
-
reportFilePath
|
|
57
|
+
reportFilePath,
|
|
58
|
+
contextDir
|
|
55
59
|
};
|
|
56
|
-
//# sourceMappingURL=chunk-
|
|
60
|
+
//# sourceMappingURL=chunk-T6Z5F4SP.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/paths.ts"],"sourcesContent":["import { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nexport function globalDir(): string {\n return join(homedir(), '.sisyphus');\n}\n\nexport function socketPath(): string {\n return join(globalDir(), 'daemon.sock');\n}\n\nexport function globalConfigPath(): string {\n return join(globalDir(), 'config.json');\n}\n\nexport function daemonLogPath(): string {\n return join(globalDir(), 'daemon.log');\n}\n\nexport function daemonPidPath(): string {\n return join(globalDir(), 'daemon.pid');\n}\n\nexport function projectDir(cwd: string): string {\n return join(cwd, '.sisyphus');\n}\n\nexport function projectConfigPath(cwd: string): string {\n return join(projectDir(cwd), 'config.json');\n}\n\nexport function projectOrchestratorPromptPath(cwd: string): string {\n return join(projectDir(cwd), 'orchestrator.md');\n}\n\nexport function sessionsDir(cwd: string): string {\n return join(projectDir(cwd), 'sessions');\n}\n\nexport function sessionDir(cwd: string, sessionId: string): string {\n return join(sessionsDir(cwd), sessionId);\n}\n\nexport function statePath(cwd: string, sessionId: string): string {\n return join(sessionDir(cwd, sessionId), 'state.json');\n}\n\nexport function reportsDir(cwd: string, sessionId: string): string {\n return join(sessionDir(cwd, sessionId), 'reports');\n}\n\nexport function reportFilePath(cwd: string, sessionId: string, agentId: string, suffix: string): string {\n return join(reportsDir(cwd, sessionId), `${agentId}-${suffix}.md`);\n}\n"],"mappings":";;;AAAA,SAAS,eAAe;AACxB,SAAS,YAAY;AAEd,SAAS,YAAoB;AAClC,SAAO,KAAK,QAAQ,GAAG,WAAW;AACpC;AAEO,SAAS,aAAqB;AACnC,SAAO,KAAK,UAAU,GAAG,aAAa;AACxC;AAEO,SAAS,mBAA2B;AACzC,SAAO,KAAK,UAAU,GAAG,aAAa;AACxC;AAMO,SAAS,gBAAwB;AACtC,SAAO,KAAK,UAAU,GAAG,YAAY;AACvC;AAEO,SAAS,WAAW,KAAqB;AAC9C,SAAO,KAAK,KAAK,WAAW;AAC9B;AAEO,SAAS,kBAAkB,KAAqB;AACrD,SAAO,KAAK,WAAW,GAAG,GAAG,aAAa;AAC5C;AAEO,SAAS,8BAA8B,KAAqB;AACjE,SAAO,KAAK,WAAW,GAAG,GAAG,iBAAiB;AAChD;AAEO,SAAS,YAAY,KAAqB;AAC/C,SAAO,KAAK,WAAW,GAAG,GAAG,UAAU;AACzC;AAEO,SAAS,WAAW,KAAa,WAA2B;AACjE,SAAO,KAAK,YAAY,GAAG,GAAG,SAAS;AACzC;AAEO,SAAS,UAAU,KAAa,WAA2B;AAChE,SAAO,KAAK,WAAW,KAAK,SAAS,GAAG,YAAY;AACtD;AAEO,SAAS,WAAW,KAAa,WAA2B;AACjE,SAAO,KAAK,WAAW,KAAK,SAAS,GAAG,SAAS;AACnD;AAEO,SAAS,eAAe,KAAa,WAAmB,SAAiB,QAAwB;AACtG,SAAO,KAAK,WAAW,KAAK,SAAS,GAAG,GAAG,OAAO,IAAI,MAAM,KAAK;AACnE;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/shared/paths.ts"],"sourcesContent":["import { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nexport function globalDir(): string {\n return join(homedir(), '.sisyphus');\n}\n\nexport function socketPath(): string {\n return join(globalDir(), 'daemon.sock');\n}\n\nexport function globalConfigPath(): string {\n return join(globalDir(), 'config.json');\n}\n\nexport function daemonLogPath(): string {\n return join(globalDir(), 'daemon.log');\n}\n\nexport function daemonPidPath(): string {\n return join(globalDir(), 'daemon.pid');\n}\n\nexport function projectDir(cwd: string): string {\n return join(cwd, '.sisyphus');\n}\n\nexport function projectConfigPath(cwd: string): string {\n return join(projectDir(cwd), 'config.json');\n}\n\nexport function projectOrchestratorPromptPath(cwd: string): string {\n return join(projectDir(cwd), 'orchestrator.md');\n}\n\nexport function sessionsDir(cwd: string): string {\n return join(projectDir(cwd), 'sessions');\n}\n\nexport function sessionDir(cwd: string, sessionId: string): string {\n return join(sessionsDir(cwd), sessionId);\n}\n\nexport function statePath(cwd: string, sessionId: string): string {\n return join(sessionDir(cwd, sessionId), 'state.json');\n}\n\nexport function reportsDir(cwd: string, sessionId: string): string {\n return join(sessionDir(cwd, sessionId), 'reports');\n}\n\nexport function reportFilePath(cwd: string, sessionId: string, agentId: string, suffix: string): string {\n return join(reportsDir(cwd, sessionId), `${agentId}-${suffix}.md`);\n}\n\nexport function contextDir(cwd: string, sessionId: string): string {\n return join(sessionDir(cwd, sessionId), 'context');\n}\n"],"mappings":";;;AAAA,SAAS,eAAe;AACxB,SAAS,YAAY;AAEd,SAAS,YAAoB;AAClC,SAAO,KAAK,QAAQ,GAAG,WAAW;AACpC;AAEO,SAAS,aAAqB;AACnC,SAAO,KAAK,UAAU,GAAG,aAAa;AACxC;AAEO,SAAS,mBAA2B;AACzC,SAAO,KAAK,UAAU,GAAG,aAAa;AACxC;AAMO,SAAS,gBAAwB;AACtC,SAAO,KAAK,UAAU,GAAG,YAAY;AACvC;AAEO,SAAS,WAAW,KAAqB;AAC9C,SAAO,KAAK,KAAK,WAAW;AAC9B;AAEO,SAAS,kBAAkB,KAAqB;AACrD,SAAO,KAAK,WAAW,GAAG,GAAG,aAAa;AAC5C;AAEO,SAAS,8BAA8B,KAAqB;AACjE,SAAO,KAAK,WAAW,GAAG,GAAG,iBAAiB;AAChD;AAEO,SAAS,YAAY,KAAqB;AAC/C,SAAO,KAAK,WAAW,GAAG,GAAG,UAAU;AACzC;AAEO,SAAS,WAAW,KAAa,WAA2B;AACjE,SAAO,KAAK,YAAY,GAAG,GAAG,SAAS;AACzC;AAEO,SAAS,UAAU,KAAa,WAA2B;AAChE,SAAO,KAAK,WAAW,KAAK,SAAS,GAAG,YAAY;AACtD;AAEO,SAAS,WAAW,KAAa,WAA2B;AACjE,SAAO,KAAK,WAAW,KAAK,SAAS,GAAG,SAAS;AACnD;AAEO,SAAS,eAAe,KAAa,WAAmB,SAAiB,QAAwB;AACtG,SAAO,KAAK,WAAW,KAAK,SAAS,GAAG,GAAG,OAAO,IAAI,MAAM,KAAK;AACnE;AAEO,SAAS,WAAW,KAAa,WAA2B;AACjE,SAAO,KAAK,WAAW,KAAK,SAAS,GAAG,SAAS;AACnD;","names":[]}
|
package/dist/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
socketPath
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-T6Z5F4SP.js";
|
|
5
5
|
|
|
6
6
|
// src/cli/index.ts
|
|
7
7
|
import { Command } from "commander";
|
|
@@ -156,13 +156,14 @@ function registerSubmit(program2) {
|
|
|
156
156
|
|
|
157
157
|
// src/cli/commands/yield.ts
|
|
158
158
|
function registerYield(program2) {
|
|
159
|
-
program2.command("yield").description("Yield control back to daemon (orchestrator only)").action(async () => {
|
|
159
|
+
program2.command("yield").description("Yield control back to daemon (orchestrator only)").option("--prompt <text>", "Instructions for the next orchestrator cycle (or pipe via stdin)").action(async (opts) => {
|
|
160
160
|
const sessionId = process.env.SISYPHUS_SESSION_ID;
|
|
161
161
|
if (!sessionId) {
|
|
162
162
|
console.error("Error: SISYPHUS_SESSION_ID environment variable not set");
|
|
163
163
|
process.exit(1);
|
|
164
164
|
}
|
|
165
|
-
const
|
|
165
|
+
const nextPrompt = opts.prompt ?? await readStdin() ?? void 0;
|
|
166
|
+
const request = { type: "yield", sessionId, agentId: "orchestrator", nextPrompt };
|
|
166
167
|
const response = await sendRequest(request);
|
|
167
168
|
if (response.ok) {
|
|
168
169
|
console.log("Yielded. Waiting for agents to complete.");
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/index.ts","../src/cli/commands/start.ts","../src/cli/client.ts","../src/cli/commands/spawn.ts","../src/cli/stdin.ts","../src/cli/commands/submit.ts","../src/cli/commands/yield.ts","../src/cli/commands/complete.ts","../src/cli/commands/status.ts","../src/cli/commands/tasks.ts","../src/cli/commands/list.ts","../src/cli/commands/report.ts","../src/cli/commands/resume.ts","../src/cli/commands/kill.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 { registerTasks } from './commands/tasks.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';\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);\nregisterTasks(program);\nregisterList(program);\nregisterResume(program);\nregisterKill(program);\n\nprogram.parseAsync(process.argv).catch((err: Error) => {\n console.error(err.message);\n process.exit(1);\n});\n","import type { Command } from 'commander';\nimport { execSync } from 'node:child_process';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\nfunction getTmuxSession(): string {\n try {\n return execSync('tmux display-message -p \"#{session_name}\"', { encoding: 'utf8' }).trim();\n } catch {\n throw new Error('Not running inside tmux');\n }\n}\n\nfunction getTmuxWindow(): string {\n try {\n return execSync('tmux display-message -p \"#{window_id}\"', { encoding: 'utf8' }).trim();\n } catch {\n throw new Error('Not running inside tmux');\n }\n}\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 { connect } from 'node:net';\nimport { socketPath } from '../shared/paths.js';\nimport type { Request, Response } from '../shared/protocol.js';\n\nexport async function sendRequest(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 if ((err as NodeJS.ErrnoException).code === 'ENOENT' || (err as NodeJS.ErrnoException).code === 'ECONNREFUSED') {\n reject(new Error(\n `Sisyphus daemon is not running.\\n` +\n ` Start it with: launchctl load ~/Library/LaunchAgents/com.sisyphus.daemon.plist\\n` +\n ` Or check logs at: ~/.sisyphus/daemon.log`\n ));\n } else {\n reject(err);\n }\n });\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.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 .action(async (opts: { agentType: string; name: string; instruction: string }) => {\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 };\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","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 { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { readStdin } from '../stdin.js';\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 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 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","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\nexport function registerYield(program: Command): void {\n program\n .command('yield')\n .description('Yield control back to daemon (orchestrator only)')\n .action(async () => {\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: 'yield', sessionId, agentId: 'orchestrator' };\n const response = await sendRequest(request);\n if (response.ok) {\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 { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.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 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 console.log('Session completed.');\n console.log('All panes will close.');\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, Task, 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 draft: '\\x1b[2m', // dim\n pending: '\\x1b[90m', // gray\n in_progress: '\\x1b[33m', // yellow\n done: '\\x1b[32m', // green\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 formatTask(task: Task): string {\n const status = colorize(task.status, task.status);\n return ` ${task.id}: ${task.description} [${status}]`;\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.tasks.length > 0) {\n console.log(`\\n ${BOLD}Tasks:${RESET}`);\n for (const task of session.tasks) {\n console.log(formatTask(task));\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 type { Task } from '../../shared/types.js';\nimport { readStdin } from '../stdin.js';\n\nfunction getSessionId(): string {\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 return sessionId;\n}\n\nconst STATUS_COLORS: Record<string, string> = {\n draft: '\\x1b[2m', // dim\n pending: '\\x1b[90m', // gray\n in_progress: '\\x1b[33m', // yellow\n done: '\\x1b[32m', // green\n};\nconst RESET = '\\x1b[0m';\n\nexport function registerTasks(program: Command): void {\n const tasks = program\n .command('tasks')\n .description('Manage session tasks');\n\n tasks\n .command('add')\n .description('Add a new task')\n .argument('[description]', 'Task description (or pipe via stdin)')\n .option('--status <status>', 'Initial status (draft|pending)', 'pending')\n .action(async (descriptionArg: string | undefined, opts: { status: string }) => {\n const description = descriptionArg ?? await readStdin();\n if (!description) {\n console.error('Error: provide a description argument or pipe via stdin');\n process.exit(1);\n }\n const sessionId = getSessionId();\n const request: Request = { type: 'tasks_add', sessionId, description, status: opts.status !== 'pending' ? opts.status : undefined };\n const response = await sendRequest(request);\n if (response.ok) {\n const taskId = response.data?.taskId as string;\n console.log(`Task added: ${taskId} [${opts.status}]`);\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 tasks\n .command('update')\n .description('Update a task')\n .argument('<task-id>', 'Task ID (e.g. t1)')\n .option('--status <status>', 'New status (draft|pending|in_progress|done)')\n .option('--description <description>', 'New description')\n .action(async (taskId: string, opts: { status?: string; description?: string }) => {\n if (!opts.status && !opts.description) {\n console.error('Error: provide --status and/or --description');\n process.exit(1);\n }\n const sessionId = getSessionId();\n const request: Request = { type: 'tasks_update', sessionId, taskId, status: opts.status, description: opts.description };\n const response = await sendRequest(request);\n if (response.ok) {\n const parts: string[] = [];\n if (opts.status) parts.push(`status → ${opts.status}`);\n if (opts.description) parts.push(`description updated`);\n console.log(`Task ${taskId}: ${parts.join(', ')}`);\n } else {\n console.error(`Error: ${response.error}`);\n if (response.error?.includes(\"not found\")) console.error(\"Hint: run `sisyphus tasks list` to see current tasks.\");\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 tasks\n .command('list')\n .description('List all tasks')\n .action(async () => {\n const sessionId = getSessionId();\n const request: Request = { type: 'tasks_list', sessionId };\n const response = await sendRequest(request);\n if (response.ok) {\n const taskList = (response.data?.tasks ?? []) as Task[];\n if (taskList.length === 0) {\n console.log('No tasks');\n return;\n }\n for (const task of taskList) {\n const color = STATUS_COLORS[task.status] ?? '';\n console.log(` ${task.id}: ${task.description} [${color}${task.status}${RESET}]`);\n }\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 type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\ninterface SessionSummary {\n id: string;\n task: string;\n status: string;\n agentCount: number;\n createdAt: 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\nexport function registerList(program: Command): void {\n program\n .command('list')\n .description('List all sessions')\n .action(async () => {\n const request: Request = { type: 'list' };\n const response = await sendRequest(request);\n if (response.ok) {\n const sessions = (response.data?.sessions ?? []) as SessionSummary[];\n if (sessions.length === 0) {\n console.log('No sessions');\n return;\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 console.log(` ${BOLD}${s.id}${RESET} ${status} ${agents} ${s.task}`);\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';\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 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 { execSync } from 'node:child_process';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\nfunction getTmuxSession(): string {\n try {\n return execSync('tmux display-message -p \"#{session_name}\"', { encoding: 'utf8' }).trim();\n } catch {\n throw new Error('Not running inside tmux');\n }\n}\n\nfunction getTmuxWindow(): string {\n try {\n return execSync('tmux display-message -p \"#{window_id}\"', { encoding: 'utf8' }).trim();\n } catch {\n throw new Error('Not running inside tmux');\n }\n}\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"],"mappings":";;;;;;AAAA,SAAS,eAAe;;;ACCxB,SAAS,gBAAgB;;;ACDzB,SAAS,eAAe;AAIxB,eAAsB,YAAY,SAAqC;AACrE,QAAM,OAAO,WAAW;AAExB,SAAO,IAAI,QAAkB,CAAC,SAAS,WAAW;AAChD,UAAM,SAAS,QAAQ,IAAI;AAC3B,QAAI,OAAO;AAEX,UAAM,UAAU,WAAW,MAAM;AAC/B,aAAO,QAAQ;AACf,aAAO,IAAI,MAAM,6BAA6B,CAAC;AAAA,IACjD,GAAG,GAAM;AAET,WAAO,GAAG,WAAW,MAAM;AACzB,aAAO,MAAM,KAAK,UAAU,OAAO,IAAI,IAAI;AAAA,IAC7C,CAAC;AAED,WAAO,GAAG,QAAQ,CAAC,UAAU;AAC3B,cAAQ,MAAM,SAAS;AACvB,YAAM,aAAa,KAAK,QAAQ,IAAI;AACpC,UAAI,eAAe,IAAI;AACrB,qBAAa,OAAO;AACpB,cAAM,OAAO,KAAK,MAAM,GAAG,UAAU;AACrC,eAAO,QAAQ;AACf,YAAI;AACF,kBAAQ,KAAK,MAAM,IAAI,CAAa;AAAA,QACtC,QAAQ;AACN,iBAAO,IAAI,MAAM,sCAAsC,IAAI,EAAE,CAAC;AAAA,QAChE;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,GAAG,SAAS,CAAC,QAAQ;AAC1B,mBAAa,OAAO;AACpB,UAAK,IAA8B,SAAS,YAAa,IAA8B,SAAS,gBAAgB;AAC9G,eAAO,IAAI;AAAA,UACT;AAAA;AAAA;AAAA,QAGF,CAAC;AAAA,MACH,OAAO;AACL,eAAO,GAAG;AAAA,MACZ;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;;;AD3CA,SAAS,iBAAyB;AAChC,MAAI;AACF,WAAO,SAAS,6CAA6C,EAAE,UAAU,OAAO,CAAC,EAAE,KAAK;AAAA,EAC1F,QAAQ;AACN,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AACF;AAEA,SAAS,gBAAwB;AAC/B,MAAI;AACF,WAAO,SAAS,0CAA0C,EAAE,UAAU,OAAO,CAAC,EAAE,KAAK;AAAA,EACvF,QAAQ;AACN,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AACF;AAEO,SAAS,cAAcA,UAAwB;AACpD,EAAAA,SACG,QAAQ,OAAO,EACf,YAAY,8BAA8B,EAC1C,SAAS,UAAU,uCAAuC,EAC1D,OAAO,OAAO,SAAiB;AAC9B,UAAM,cAAc,eAAe;AACnC,UAAM,aAAa,cAAc;AACjC,UAAM,UAAmB,EAAE,MAAM,SAAS,MAAM,KAAK,QAAQ,IAAI,GAAG,aAAa,WAAW;AAC5F,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,SAAS,IAAI;AACf,YAAM,YAAY,SAAS,MAAM;AACjC,cAAQ,IAAI,oBAAoB,SAAS,EAAE;AAC3C,UAAI,SAAS,MAAM,YAAY;AAC7B,gBAAQ,IAAI,wCAAwC,SAAS,KAAK,UAAU,EAAE;AAAA,MAChF;AAAA,IACF,OAAO;AACL,cAAQ,MAAM,UAAU,SAAS,KAAK,EAAE;AACxC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AEtCO,SAAS,cAAcC,UAAwB;AACpD,EAAAA,SACG,QAAQ,OAAO,EACf,YAAY,uCAAuC,EACnD,OAAO,uBAAuB,sCAAsC,QAAQ,EAC5E,eAAe,iBAAiB,YAAY,EAC5C,eAAe,+BAA+B,gCAAgC,EAC9E,OAAO,OAAO,SAAmE;AAChF,UAAM,YAAY,QAAQ,IAAI;AAC9B,QAAI,CAAC,WAAW;AACd,cAAQ,MAAM,yDAAyD;AACvE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,UAAmB;AAAA,MACvB,MAAM;AAAA,MACN;AAAA,MACA,WAAW,KAAK;AAAA,MAChB,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,IACpB;AACA,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,SAAS,IAAI;AACf,YAAM,UAAU,SAAS,MAAM;AAC/B,cAAQ,IAAI,kBAAkB,OAAO,EAAE;AACvC,cAAQ,IAAI,iDAAiD;AAAA,IAC/D,OAAO;AACL,cAAQ,MAAM,UAAU,SAAS,KAAK,EAAE;AACxC,UAAI,SAAS,OAAO,SAAS,iBAAiB,EAAG,SAAQ,MAAM,mDAAmD;AAClH,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;ACpCO,SAAS,YAAoC;AAClD,MAAI,QAAQ,MAAM,MAAO,QAAO,QAAQ,QAAQ,IAAI;AAEpD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,SAAmB,CAAC;AAC1B,YAAQ,MAAM,GAAG,QAAQ,CAAC,UAAkB,OAAO,KAAK,KAAK,CAAC;AAC9D,YAAQ,MAAM,GAAG,OAAO,MAAM;AAC5B,YAAM,OAAO,OAAO,OAAO,MAAM,EAAE,SAAS,OAAO,EAAE,KAAK;AAC1D,cAAQ,QAAQ,IAAI;AAAA,IACtB,CAAC;AACD,YAAQ,MAAM,GAAG,SAAS,MAAM;AAAA,EAClC,CAAC;AACH;;;ACPO,SAAS,eAAeC,UAAwB;AACrD,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,0CAA0C,EACtD,OAAO,qBAAqB,iCAAiC,EAC7D,OAAO,OAAO,SAA8B;AAC3C,UAAM,YAAY,QAAQ,IAAI;AAC9B,UAAM,UAAU,QAAQ,IAAI;AAC5B,QAAI,CAAC,aAAa,CAAC,SAAS;AAC1B,cAAQ,MAAM,oFAAoF;AAClG,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,SAAS,KAAK,UAAU,MAAM,UAAU;AAC9C,QAAI,CAAC,QAAQ;AACX,cAAQ,MAAM,mDAAmD;AACjE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,UAAmB,EAAE,MAAM,UAAU,WAAW,SAAS,OAAO;AACtE,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,SAAS,IAAI;AACf,cAAQ,IAAI,+BAA+B;AAC3C,cAAQ,IAAI,wEAAwE;AAAA,IACtF,OAAO;AACL,cAAQ,MAAM,UAAU,SAAS,KAAK,EAAE;AACxC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AC9BO,SAAS,cAAcC,UAAwB;AACpD,EAAAA,SACG,QAAQ,OAAO,EACf,YAAY,kDAAkD,EAC9D,OAAO,YAAY;AAClB,UAAM,YAAY,QAAQ,IAAI;AAC9B,QAAI,CAAC,WAAW;AACd,cAAQ,MAAM,yDAAyD;AACvE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,UAAmB,EAAE,MAAM,SAAS,WAAW,SAAS,eAAe;AAC7E,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,SAAS,IAAI;AACf,cAAQ,IAAI,0CAA0C;AAAA,IACxD,OAAO;AACL,cAAQ,MAAM,UAAU,SAAS,KAAK,EAAE;AACxC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;ACpBO,SAAS,iBAAiBC,UAAwB;AACvD,EAAAA,SACG,QAAQ,UAAU,EAClB,YAAY,+CAA+C,EAC3D,eAAe,qBAAqB,yBAAyB,EAC7D,OAAO,OAAO,SAA6B;AAC1C,UAAM,YAAY,QAAQ,IAAI;AAC9B,QAAI,CAAC,WAAW;AACd,cAAQ,MAAM,yDAAyD;AACvE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,UAAmB,EAAE,MAAM,YAAY,WAAW,QAAQ,KAAK,OAAO;AAC5E,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,SAAS,IAAI;AACf,cAAQ,IAAI,oBAAoB;AAChC,cAAQ,IAAI,uBAAuB;AAAA,IACrC,OAAO;AACL,cAAQ,MAAM,UAAU,SAAS,KAAK,EAAE;AACxC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;ACrBA,IAAM,gBAAwC;AAAA,EAC5C,QAAQ;AAAA;AAAA,EACR,QAAQ;AAAA;AAAA,EACR,WAAW;AAAA;AAAA,EACX,SAAS;AAAA;AAAA,EACT,QAAQ;AAAA;AAAA,EACR,SAAS;AAAA;AAAA,EACT,MAAM;AAAA;AAAA,EACN,OAAO;AAAA;AAAA,EACP,SAAS;AAAA;AAAA,EACT,aAAa;AAAA;AAAA,EACb,MAAM;AAAA;AACR;AACA,IAAM,QAAQ;AACd,IAAM,OAAO;AACb,IAAM,MAAM;AAEZ,SAAS,SAAS,MAAc,QAAwB;AACtD,QAAM,QAAQ,cAAc,MAAM,KAAK;AACvC,SAAO,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK;AAChC;AAEA,SAAS,eAAe,UAAkB,QAAgC;AACxE,QAAM,QAAQ,IAAI,KAAK,QAAQ,EAAE,QAAQ;AACzC,QAAM,MAAM,SAAS,IAAI,KAAK,MAAM,EAAE,QAAQ,IAAI,KAAK,IAAI;AAC3D,QAAM,eAAe,KAAK,OAAO,MAAM,SAAS,GAAI;AACpD,MAAI,eAAe,EAAG,QAAO;AAC7B,QAAM,QAAQ,KAAK,MAAM,eAAe,IAAI;AAC5C,QAAM,UAAU,KAAK,MAAO,eAAe,OAAQ,EAAE;AACrD,QAAM,UAAU,eAAe;AAC/B,QAAM,QAAkB,CAAC;AACzB,MAAI,QAAQ,EAAG,OAAM,KAAK,GAAG,KAAK,GAAG;AACrC,MAAI,UAAU,EAAG,OAAM,KAAK,GAAG,OAAO,GAAG;AACzC,QAAM,KAAK,GAAG,OAAO,GAAG;AACxB,SAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAS,YAAY,OAAsB;AACzC,QAAM,SAAS,SAAS,MAAM,QAAQ,MAAM,MAAM;AAClD,QAAM,OAAO,GAAG,IAAI,GAAG,MAAM,IAAI,GAAG,KAAK;AACzC,QAAM,OAAO,GAAG,GAAG,IAAI,MAAM,SAAS,IAAI,KAAK;AAC/C,QAAM,WAAW,eAAe,MAAM,WAAW,MAAM,WAAW;AAClE,MAAI,OAAO,OAAO,MAAM,EAAE,IAAI,IAAI,IAAI,IAAI,WAAM,MAAM,IAAI,GAAG,IAAI,QAAQ,IAAI,KAAK;AAClF,MAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,eAAW,KAAK,MAAM,SAAS;AAC7B,YAAM,QAAQ,EAAE,SAAS,UAAU,UAAU;AAC7C,cAAQ;AAAA,QAAW,KAAK,KAAK,EAAE,OAAO;AAAA,IACxC;AAAA,EACF;AACA,MAAI,MAAM,cAAc;AACtB,YAAQ;AAAA,gBAAmB,MAAM,YAAY;AAAA,EAC/C;AACA,SAAO;AACT;AAEA,SAAS,WAAW,MAAoB;AACtC,QAAM,SAAS,SAAS,KAAK,QAAQ,KAAK,MAAM;AAChD,SAAO,OAAO,KAAK,EAAE,KAAK,KAAK,WAAW,KAAK,MAAM;AACvD;AAEA,SAAS,YAAY,OAAkC;AACrD,QAAM,WAAW,MAAM,cACnB,IAAI,GAAG,IAAI,eAAe,MAAM,WAAW,MAAM,WAAW,CAAC,IAAI,KAAK,KACtE,IAAI,GAAG,YAAY,KAAK;AAC5B,QAAM,SAAS,MAAM,cAAc,SAAS,IACxC,mBAAc,MAAM,cAAc,KAAK,IAAI,CAAC,KAC5C;AACJ,SAAO,aAAa,MAAM,KAAK,GAAG,QAAQ,GAAG,MAAM;AACrD;AAEA,SAAS,aAAa,SAAwB;AAC5C,QAAM,SAAS,SAAS,QAAQ,QAAQ,QAAQ,MAAM;AACtD,QAAM,kBAAkB,eAAe,QAAQ,WAAW,QAAQ,WAAW;AAC7E,UAAQ,IAAI;AAAA,EAAK,IAAI,YAAY,QAAQ,EAAE,GAAG,KAAK,EAAE;AACrD,UAAQ,IAAI,aAAa,MAAM,EAAE;AACjC,UAAQ,IAAI,WAAW,QAAQ,IAAI,EAAE;AACrC,UAAQ,IAAI,UAAU,QAAQ,GAAG,EAAE;AACnC,UAAQ,IAAI,cAAc,QAAQ,SAAS,EAAE;AAC7C,UAAQ,IAAI,eAAe,eAAe,GAAG,QAAQ,cAAc,KAAK,YAAY,EAAE;AACtF,UAAQ,IAAI,0BAA0B,QAAQ,mBAAmB,MAAM,EAAE;AAEzE,MAAI,QAAQ,mBAAmB,SAAS,GAAG;AACzC,YAAQ,IAAI;AAAA,IAAO,IAAI,UAAU,KAAK,EAAE;AACxC,eAAW,SAAS,QAAQ,oBAAoB;AAC9C,cAAQ,IAAI,YAAY,KAAK,CAAC;AAAA,IAChC;AAAA,EACF;AAEA,MAAI,QAAQ,MAAM,SAAS,GAAG;AAC5B,YAAQ,IAAI;AAAA,IAAO,IAAI,SAAS,KAAK,EAAE;AACvC,eAAW,QAAQ,QAAQ,OAAO;AAChC,cAAQ,IAAI,WAAW,IAAI,CAAC;AAAA,IAC9B;AAAA,EACF;AAEA,MAAI,QAAQ,OAAO,SAAS,GAAG;AAC7B,YAAQ,IAAI;AAAA,IAAO,IAAI,UAAU,KAAK,EAAE;AACxC,eAAW,SAAS,QAAQ,QAAQ;AAClC,cAAQ,IAAI,YAAY,KAAK,CAAC;AAAA,IAChC;AAAA,EACF;AACF;AAEO,SAAS,eAAeC,UAAwB;AACrD,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,qBAAqB,EACjC,SAAS,gBAAgB,kDAAkD,EAC3E,OAAO,OAAO,iBAA0B;AACvC,UAAM,YAAY,gBAAgB,QAAQ,IAAI;AAE9C,UAAM,UAAmB,EAAE,MAAM,UAAU,UAAU;AACrD,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,SAAS,IAAI;AACf,YAAM,UAAU,SAAS,MAAM;AAC/B,UAAI,SAAS;AACX,qBAAa,OAAO;AAAA,MACtB,OAAO;AACL,gBAAQ,IAAI,kBAAkB;AAAA,MAChC;AAAA,IACF,OAAO;AACL,cAAQ,MAAM,UAAU,SAAS,KAAK,EAAE;AACxC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AC5HA,SAAS,eAAuB;AAC9B,QAAM,YAAY,QAAQ,IAAI;AAC9B,MAAI,CAAC,WAAW;AACd,YAAQ,MAAM,yDAAyD;AACvE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAEA,IAAMC,iBAAwC;AAAA,EAC5C,OAAO;AAAA;AAAA,EACP,SAAS;AAAA;AAAA,EACT,aAAa;AAAA;AAAA,EACb,MAAM;AAAA;AACR;AACA,IAAMC,SAAQ;AAEP,SAAS,cAAcC,UAAwB;AACpD,QAAM,QAAQA,SACX,QAAQ,OAAO,EACf,YAAY,sBAAsB;AAErC,QACG,QAAQ,KAAK,EACb,YAAY,gBAAgB,EAC5B,SAAS,iBAAiB,sCAAsC,EAChE,OAAO,qBAAqB,kCAAkC,SAAS,EACvE,OAAO,OAAO,gBAAoC,SAA6B;AAC9E,UAAM,cAAc,kBAAkB,MAAM,UAAU;AACtD,QAAI,CAAC,aAAa;AAChB,cAAQ,MAAM,yDAAyD;AACvE,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,YAAY,aAAa;AAC/B,UAAM,UAAmB,EAAE,MAAM,aAAa,WAAW,aAAa,QAAQ,KAAK,WAAW,YAAY,KAAK,SAAS,OAAU;AAClI,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,SAAS,IAAI;AACf,YAAM,SAAS,SAAS,MAAM;AAC9B,cAAQ,IAAI,eAAe,MAAM,KAAK,KAAK,MAAM,GAAG;AAAA,IACtD,OAAO;AACL,cAAQ,MAAM,UAAU,SAAS,KAAK,EAAE;AACxC,UAAI,SAAS,OAAO,SAAS,iBAAiB,EAAG,SAAQ,MAAM,mDAAmD;AAClH,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,eAAe,EAC3B,SAAS,aAAa,mBAAmB,EACzC,OAAO,qBAAqB,6CAA6C,EACzE,OAAO,+BAA+B,iBAAiB,EACvD,OAAO,OAAO,QAAgB,SAAoD;AACjF,QAAI,CAAC,KAAK,UAAU,CAAC,KAAK,aAAa;AACrC,cAAQ,MAAM,8CAA8C;AAC5D,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,YAAY,aAAa;AAC/B,UAAM,UAAmB,EAAE,MAAM,gBAAgB,WAAW,QAAQ,QAAQ,KAAK,QAAQ,aAAa,KAAK,YAAY;AACvH,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,SAAS,IAAI;AACf,YAAM,QAAkB,CAAC;AACzB,UAAI,KAAK,OAAQ,OAAM,KAAK,iBAAY,KAAK,MAAM,EAAE;AACrD,UAAI,KAAK,YAAa,OAAM,KAAK,qBAAqB;AACtD,cAAQ,IAAI,QAAQ,MAAM,KAAK,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,IACnD,OAAO;AACL,cAAQ,MAAM,UAAU,SAAS,KAAK,EAAE;AACxC,UAAI,SAAS,OAAO,SAAS,WAAW,EAAG,SAAQ,MAAM,uDAAuD;AAChH,UAAI,SAAS,OAAO,SAAS,iBAAiB,EAAG,SAAQ,MAAM,mDAAmD;AAClH,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,gBAAgB,EAC5B,OAAO,YAAY;AAClB,UAAM,YAAY,aAAa;AAC/B,UAAM,UAAmB,EAAE,MAAM,cAAc,UAAU;AACzD,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,SAAS,IAAI;AACf,YAAM,WAAY,SAAS,MAAM,SAAS,CAAC;AAC3C,UAAI,SAAS,WAAW,GAAG;AACzB,gBAAQ,IAAI,UAAU;AACtB;AAAA,MACF;AACA,iBAAW,QAAQ,UAAU;AAC3B,cAAM,QAAQF,eAAc,KAAK,MAAM,KAAK;AAC5C,gBAAQ,IAAI,KAAK,KAAK,EAAE,KAAK,KAAK,WAAW,KAAK,KAAK,GAAG,KAAK,MAAM,GAAGC,MAAK,GAAG;AAAA,MAClF;AAAA,IACF,OAAO;AACL,cAAQ,MAAM,UAAU,SAAS,KAAK,EAAE;AACxC,UAAI,SAAS,OAAO,SAAS,iBAAiB,EAAG,SAAQ,MAAM,mDAAmD;AAClH,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AC1FA,IAAME,iBAAwC;AAAA,EAC5C,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,WAAW;AACb;AACA,IAAMC,SAAQ;AACd,IAAMC,QAAO;AACb,IAAMC,OAAM;AAEL,SAAS,aAAaC,UAAwB;AACnD,EAAAA,SACG,QAAQ,MAAM,EACd,YAAY,mBAAmB,EAC/B,OAAO,YAAY;AAClB,UAAM,UAAmB,EAAE,MAAM,OAAO;AACxC,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,SAAS,IAAI;AACf,YAAM,WAAY,SAAS,MAAM,YAAY,CAAC;AAC9C,UAAI,SAAS,WAAW,GAAG;AACzB,gBAAQ,IAAI,aAAa;AACzB;AAAA,MACF;AACA,iBAAW,KAAK,UAAU;AACxB,cAAM,QAAQJ,eAAc,EAAE,MAAM,KAAK;AACzC,cAAM,SAAS,GAAG,KAAK,GAAG,EAAE,MAAM,GAAGC,MAAK;AAC1C,cAAM,SAAS,GAAGE,IAAG,GAAG,EAAE,UAAU,YAAYF,MAAK;AACrD,gBAAQ,IAAI,KAAKC,KAAI,GAAG,EAAE,EAAE,GAAGD,MAAK,KAAK,MAAM,KAAK,MAAM,KAAK,EAAE,IAAI,EAAE;AAAA,MACzE;AAAA,IACF,OAAO;AACL,cAAQ,MAAM,UAAU,SAAS,KAAK,EAAE;AACxC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;ACxCO,SAAS,eAAeI,UAAwB;AACrD,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,qDAAqD,EACjE,OAAO,uBAAuB,yBAAyB,EACvD,OAAO,OAAO,SAA+B;AAC5C,UAAM,YAAY,QAAQ,IAAI;AAC9B,UAAM,UAAU,QAAQ,IAAI;AAC5B,QAAI,CAAC,aAAa,CAAC,SAAS;AAC1B,cAAQ,MAAM,oFAAoF;AAClG,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,UAAU,KAAK,WAAW,MAAM,UAAU;AAChD,QAAI,CAAC,SAAS;AACZ,cAAQ,MAAM,oDAAoD;AAClE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,UAAmB,EAAE,MAAM,UAAU,WAAW,SAAS,QAAQ;AACvE,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,SAAS,IAAI;AACf,cAAQ,IAAI,0BAA0B;AAAA,IACxC,OAAO;AACL,cAAQ,MAAM,UAAU,SAAS,KAAK,EAAE;AACxC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AChCA,SAAS,YAAAC,iBAAgB;AAIzB,SAASC,kBAAyB;AAChC,MAAI;AACF,WAAOC,UAAS,6CAA6C,EAAE,UAAU,OAAO,CAAC,EAAE,KAAK;AAAA,EAC1F,QAAQ;AACN,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AACF;AAEA,SAASC,iBAAwB;AAC/B,MAAI;AACF,WAAOD,UAAS,0CAA0C,EAAE,UAAU,OAAO,CAAC,EAAE,KAAK;AAAA,EACvF,QAAQ;AACN,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AACF;AAEO,SAAS,eAAeE,UAAwB;AACrD,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,yBAAyB,EACrC,SAAS,gBAAgB,sBAAsB,EAC/C,SAAS,aAAa,8CAA8C,EACpE,OAAO,OAAO,WAAmB,YAAqB;AACrD,UAAM,cAAcH,gBAAe;AACnC,UAAM,aAAaE,eAAc;AACjC,UAAM,MAAM,QAAQ,IAAI;AACxB,UAAM,UAAmB,EAAE,MAAM,UAAU,WAAW,KAAK,aAAa,YAAY,QAAQ;AAC5F,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,SAAS,IAAI;AACf,cAAQ,IAAI,WAAW,SAAS,UAAU;AAC1C,UAAI,SAAS,MAAM,YAAY;AAC7B,gBAAQ,IAAI,0CAA0C,SAAS,KAAK,UAAU,EAAE;AAAA,MAClF;AAAA,IACF,OAAO;AACL,cAAQ,MAAM,UAAU,SAAS,KAAK,EAAE;AACxC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;ACvCO,SAAS,aAAaE,UAAwB;AACnD,EAAAA,SACG,QAAQ,kBAAkB,EAC1B,YAAY,2CAA2C,EACvD,OAAO,OAAO,cAAsB;AACnC,UAAM,UAAmB,EAAE,MAAM,QAAQ,UAAU;AACnD,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,SAAS,IAAI;AACf,cAAQ,IAAI,WAAW,SAAS,UAAU;AAC1C,UAAI,SAAS,MAAM;AACjB,cAAM,EAAE,aAAa,IAAI,SAAS;AAClC,gBAAQ,IAAI,eAAe,YAAY,wCAAwC;AAAA,MACjF;AAAA,IACF,OAAO;AACL,cAAQ,MAAM,UAAU,SAAS,KAAK,EAAE;AACxC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AbTA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,UAAU,EACf,YAAY,sDAAsD,EAClE,QAAQ,OAAO;AAElB,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,cAAc,OAAO;AACrB,iBAAiB,OAAO;AACxB,eAAe,OAAO;AACtB,cAAc,OAAO;AACrB,aAAa,OAAO;AACpB,eAAe,OAAO;AACtB,aAAa,OAAO;AAEpB,QAAQ,WAAW,QAAQ,IAAI,EAAE,MAAM,CAAC,QAAe;AACrD,UAAQ,MAAM,IAAI,OAAO;AACzB,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["program","program","program","program","program","program","STATUS_COLORS","RESET","program","STATUS_COLORS","RESET","BOLD","DIM","program","program","execSync","getTmuxSession","execSync","getTmuxWindow","program","program"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli/index.ts","../src/cli/commands/start.ts","../src/cli/client.ts","../src/cli/commands/spawn.ts","../src/cli/stdin.ts","../src/cli/commands/submit.ts","../src/cli/commands/yield.ts","../src/cli/commands/complete.ts","../src/cli/commands/status.ts","../src/cli/commands/tasks.ts","../src/cli/commands/list.ts","../src/cli/commands/report.ts","../src/cli/commands/resume.ts","../src/cli/commands/kill.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 { registerTasks } from './commands/tasks.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';\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);\nregisterTasks(program);\nregisterList(program);\nregisterResume(program);\nregisterKill(program);\n\nprogram.parseAsync(process.argv).catch((err: Error) => {\n console.error(err.message);\n process.exit(1);\n});\n","import type { Command } from 'commander';\nimport { execSync } from 'node:child_process';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\nfunction getTmuxSession(): string {\n try {\n return execSync('tmux display-message -p \"#{session_name}\"', { encoding: 'utf8' }).trim();\n } catch {\n throw new Error('Not running inside tmux');\n }\n}\n\nfunction getTmuxWindow(): string {\n try {\n return execSync('tmux display-message -p \"#{window_id}\"', { encoding: 'utf8' }).trim();\n } catch {\n throw new Error('Not running inside tmux');\n }\n}\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 { connect } from 'node:net';\nimport { socketPath } from '../shared/paths.js';\nimport type { Request, Response } from '../shared/protocol.js';\n\nexport async function sendRequest(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 if ((err as NodeJS.ErrnoException).code === 'ENOENT' || (err as NodeJS.ErrnoException).code === 'ECONNREFUSED') {\n reject(new Error(\n `Sisyphus daemon is not running.\\n` +\n ` Start it with: launchctl load ~/Library/LaunchAgents/com.sisyphus.daemon.plist\\n` +\n ` Or check logs at: ~/.sisyphus/daemon.log`\n ));\n } else {\n reject(err);\n }\n });\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.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 .action(async (opts: { agentType: string; name: string; instruction: string }) => {\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 };\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","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 { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { readStdin } from '../stdin.js';\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 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 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","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { readStdin } from '../stdin.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 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 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 { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.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 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 console.log('Session completed.');\n console.log('All panes will close.');\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, Task, 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 draft: '\\x1b[2m', // dim\n pending: '\\x1b[90m', // gray\n in_progress: '\\x1b[33m', // yellow\n done: '\\x1b[32m', // green\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 formatTask(task: Task): string {\n const status = colorize(task.status, task.status);\n return ` ${task.id}: ${task.description} [${status}]`;\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.tasks.length > 0) {\n console.log(`\\n ${BOLD}Tasks:${RESET}`);\n for (const task of session.tasks) {\n console.log(formatTask(task));\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 type { Task } from '../../shared/types.js';\nimport { readStdin } from '../stdin.js';\n\nfunction getSessionId(): string {\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 return sessionId;\n}\n\nconst STATUS_COLORS: Record<string, string> = {\n draft: '\\x1b[2m', // dim\n pending: '\\x1b[90m', // gray\n in_progress: '\\x1b[33m', // yellow\n done: '\\x1b[32m', // green\n};\nconst RESET = '\\x1b[0m';\n\nexport function registerTasks(program: Command): void {\n const tasks = program\n .command('tasks')\n .description('Manage session tasks');\n\n tasks\n .command('add')\n .description('Add a new task')\n .argument('[description]', 'Task description (or pipe via stdin)')\n .option('--status <status>', 'Initial status (draft|pending)', 'pending')\n .action(async (descriptionArg: string | undefined, opts: { status: string }) => {\n const description = descriptionArg ?? await readStdin();\n if (!description) {\n console.error('Error: provide a description argument or pipe via stdin');\n process.exit(1);\n }\n const sessionId = getSessionId();\n const request: Request = { type: 'tasks_add', sessionId, description, status: opts.status !== 'pending' ? opts.status : undefined };\n const response = await sendRequest(request);\n if (response.ok) {\n const taskId = response.data?.taskId as string;\n console.log(`Task added: ${taskId} [${opts.status}]`);\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 tasks\n .command('update')\n .description('Update a task')\n .argument('<task-id>', 'Task ID (e.g. t1)')\n .option('--status <status>', 'New status (draft|pending|in_progress|done)')\n .option('--description <description>', 'New description')\n .action(async (taskId: string, opts: { status?: string; description?: string }) => {\n if (!opts.status && !opts.description) {\n console.error('Error: provide --status and/or --description');\n process.exit(1);\n }\n const sessionId = getSessionId();\n const request: Request = { type: 'tasks_update', sessionId, taskId, status: opts.status, description: opts.description };\n const response = await sendRequest(request);\n if (response.ok) {\n const parts: string[] = [];\n if (opts.status) parts.push(`status → ${opts.status}`);\n if (opts.description) parts.push(`description updated`);\n console.log(`Task ${taskId}: ${parts.join(', ')}`);\n } else {\n console.error(`Error: ${response.error}`);\n if (response.error?.includes(\"not found\")) console.error(\"Hint: run `sisyphus tasks list` to see current tasks.\");\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 tasks\n .command('list')\n .description('List all tasks')\n .action(async () => {\n const sessionId = getSessionId();\n const request: Request = { type: 'tasks_list', sessionId };\n const response = await sendRequest(request);\n if (response.ok) {\n const taskList = (response.data?.tasks ?? []) as Task[];\n if (taskList.length === 0) {\n console.log('No tasks');\n return;\n }\n for (const task of taskList) {\n const color = STATUS_COLORS[task.status] ?? '';\n console.log(` ${task.id}: ${task.description} [${color}${task.status}${RESET}]`);\n }\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 type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\ninterface SessionSummary {\n id: string;\n task: string;\n status: string;\n agentCount: number;\n createdAt: 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\nexport function registerList(program: Command): void {\n program\n .command('list')\n .description('List all sessions')\n .action(async () => {\n const request: Request = { type: 'list' };\n const response = await sendRequest(request);\n if (response.ok) {\n const sessions = (response.data?.sessions ?? []) as SessionSummary[];\n if (sessions.length === 0) {\n console.log('No sessions');\n return;\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 console.log(` ${BOLD}${s.id}${RESET} ${status} ${agents} ${s.task}`);\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';\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 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 { execSync } from 'node:child_process';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\nfunction getTmuxSession(): string {\n try {\n return execSync('tmux display-message -p \"#{session_name}\"', { encoding: 'utf8' }).trim();\n } catch {\n throw new Error('Not running inside tmux');\n }\n}\n\nfunction getTmuxWindow(): string {\n try {\n return execSync('tmux display-message -p \"#{window_id}\"', { encoding: 'utf8' }).trim();\n } catch {\n throw new Error('Not running inside tmux');\n }\n}\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"],"mappings":"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","names":["program","program","program","program","program","program","STATUS_COLORS","RESET","program","STATUS_COLORS","RESET","BOLD","DIM","program","program","execSync","getTmuxSession","execSync","getTmuxWindow","program","program"]}
|
package/dist/daemon.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
|
+
contextDir,
|
|
3
4
|
daemonPidPath,
|
|
4
5
|
globalConfigPath,
|
|
5
6
|
globalDir,
|
|
@@ -11,7 +12,7 @@ import {
|
|
|
11
12
|
sessionsDir,
|
|
12
13
|
socketPath,
|
|
13
14
|
statePath
|
|
14
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-T6Z5F4SP.js";
|
|
15
16
|
|
|
16
17
|
// src/daemon/index.ts
|
|
17
18
|
import { mkdirSync as mkdirSync4, readFileSync as readFileSync6, writeFileSync as writeFileSync5, unlinkSync as unlinkSync2, existsSync as existsSync4 } from "fs";
|
|
@@ -42,7 +43,7 @@ import { join as join2 } from "path";
|
|
|
42
43
|
|
|
43
44
|
// src/daemon/session-manager.ts
|
|
44
45
|
import { v4 as uuidv4 } from "uuid";
|
|
45
|
-
import { existsSync as existsSync2, readdirSync as
|
|
46
|
+
import { existsSync as existsSync2, readdirSync as readdirSync3 } from "fs";
|
|
46
47
|
|
|
47
48
|
// src/daemon/state.ts
|
|
48
49
|
import { readFileSync as readFileSync2, writeFileSync, mkdirSync, renameSync } from "fs";
|
|
@@ -72,6 +73,7 @@ function atomicWrite(filePath, data) {
|
|
|
72
73
|
function createSession(id, task, cwd) {
|
|
73
74
|
const dir = sessionDir(cwd, id);
|
|
74
75
|
mkdirSync(dir, { recursive: true });
|
|
76
|
+
mkdirSync(contextDir(cwd, id), { recursive: true });
|
|
75
77
|
const session = {
|
|
76
78
|
id,
|
|
77
79
|
task,
|
|
@@ -176,18 +178,20 @@ async function appendAgentReport(cwd, sessionId, agentId, entry) {
|
|
|
176
178
|
saveSession(session);
|
|
177
179
|
});
|
|
178
180
|
}
|
|
179
|
-
async function completeOrchestratorCycle(cwd, sessionId) {
|
|
181
|
+
async function completeOrchestratorCycle(cwd, sessionId, nextPrompt) {
|
|
180
182
|
return withSessionLock(sessionId, () => {
|
|
181
183
|
const session = getSession(cwd, sessionId);
|
|
182
184
|
const cycles = session.orchestratorCycles;
|
|
183
185
|
if (cycles.length === 0) return;
|
|
184
|
-
cycles[cycles.length - 1]
|
|
186
|
+
const cycle = cycles[cycles.length - 1];
|
|
187
|
+
cycle.completedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
188
|
+
if (nextPrompt) cycle.nextPrompt = nextPrompt;
|
|
185
189
|
saveSession(session);
|
|
186
190
|
});
|
|
187
191
|
}
|
|
188
192
|
|
|
189
193
|
// src/daemon/orchestrator.ts
|
|
190
|
-
import { readFileSync as readFileSync3, existsSync, writeFileSync as writeFileSync2 } from "fs";
|
|
194
|
+
import { readFileSync as readFileSync3, existsSync, writeFileSync as writeFileSync2, readdirSync } from "fs";
|
|
191
195
|
import { resolve } from "path";
|
|
192
196
|
|
|
193
197
|
// src/daemon/tmux.ts
|
|
@@ -233,7 +237,10 @@ function setPaneTitle(paneTarget, title) {
|
|
|
233
237
|
execSafe(`tmux select-pane -t "${paneTarget}" -T ${shellQuote(title)}`);
|
|
234
238
|
}
|
|
235
239
|
function setPaneStyle(paneTarget, color) {
|
|
236
|
-
|
|
240
|
+
const fmt = `#[fg=${color},bold] #{pane_title} #[fg=${color}]#{pane_current_path} #[default]`;
|
|
241
|
+
execSafe(`tmux set -p -t "${paneTarget}" pane-border-format ${shellQuote(fmt)}`);
|
|
242
|
+
execSafe(`tmux set -p -t "${paneTarget}" pane-border-style "fg=${color}"`);
|
|
243
|
+
execSafe(`tmux set -p -t "${paneTarget}" pane-active-border-style "fg=${color}"`);
|
|
237
244
|
}
|
|
238
245
|
function shellQuote(s) {
|
|
239
246
|
return `'${s.replace(/'/g, "'\\''")}'`;
|
|
@@ -274,6 +281,14 @@ function formatStateForOrchestrator(session) {
|
|
|
274
281
|
const shortId = session.id.slice(0, 8);
|
|
275
282
|
const cycleNum = session.orchestratorCycles.length;
|
|
276
283
|
const taskLines = session.tasks.length > 0 ? session.tasks.map((t) => `- ${t.id}: [${t.status}] ${t.description}`).join("\n") : " (none)";
|
|
284
|
+
const ctxDir = contextDir(session.cwd, session.id);
|
|
285
|
+
let contextLines;
|
|
286
|
+
if (existsSync(ctxDir)) {
|
|
287
|
+
const files = readdirSync(ctxDir);
|
|
288
|
+
contextLines = files.length > 0 ? files.map((f) => `- ${f}`).join("\n") : " (none)";
|
|
289
|
+
} else {
|
|
290
|
+
contextLines = " (none)";
|
|
291
|
+
}
|
|
277
292
|
const agentLines = session.agents.length > 0 ? session.agents.map((a) => {
|
|
278
293
|
const header = `- ${a.id} (${a.name}): ${a.status} \u2014 ${a.reports.length} report(s)`;
|
|
279
294
|
if (a.reports.length === 0) return header;
|
|
@@ -297,6 +312,9 @@ function formatStateForOrchestrator(session) {
|
|
|
297
312
|
"## Tasks",
|
|
298
313
|
taskLines,
|
|
299
314
|
"",
|
|
315
|
+
"## Context Files",
|
|
316
|
+
contextLines,
|
|
317
|
+
"",
|
|
300
318
|
"## Agents",
|
|
301
319
|
agentLines,
|
|
302
320
|
"",
|
|
@@ -309,18 +327,32 @@ async function spawnOrchestrator(sessionId, cwd, windowId, message) {
|
|
|
309
327
|
const session = getSession(cwd, sessionId);
|
|
310
328
|
const basePrompt = loadOrchestratorPrompt(cwd);
|
|
311
329
|
const formattedState = formatStateForOrchestrator(session);
|
|
312
|
-
const fullPrompt = `${basePrompt}
|
|
313
|
-
|
|
314
|
-
${formattedState}`;
|
|
315
330
|
const cycleNum = session.orchestratorCycles.length + 1;
|
|
316
331
|
const promptFilePath = `${sessionDir(cwd, sessionId)}/orchestrator-prompt-${cycleNum}.md`;
|
|
317
|
-
writeFileSync2(promptFilePath,
|
|
332
|
+
writeFileSync2(promptFilePath, basePrompt, "utf-8");
|
|
318
333
|
sessionWindowMap.set(sessionId, windowId);
|
|
319
334
|
const envExports = [
|
|
320
335
|
`export SISYPHUS_SESSION_ID='${sessionId}'`,
|
|
321
336
|
`export SISYPHUS_AGENT_ID='orchestrator'`
|
|
322
337
|
].join(" && ");
|
|
323
|
-
|
|
338
|
+
let userPrompt;
|
|
339
|
+
if (message) {
|
|
340
|
+
userPrompt = `${formattedState}
|
|
341
|
+
|
|
342
|
+
The user resumed this session with new instructions: ${message}`;
|
|
343
|
+
} else {
|
|
344
|
+
const lastCycle = [...session.orchestratorCycles].reverse().find((c) => c.completedAt);
|
|
345
|
+
const storedPrompt = lastCycle?.nextPrompt;
|
|
346
|
+
if (storedPrompt) {
|
|
347
|
+
userPrompt = `${formattedState}
|
|
348
|
+
|
|
349
|
+
${storedPrompt}`;
|
|
350
|
+
} else {
|
|
351
|
+
userPrompt = `${formattedState}
|
|
352
|
+
|
|
353
|
+
Review the current session state and execute the next cycle of work.`;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
324
356
|
const userPromptFilePath = `${sessionDir(cwd, sessionId)}/orchestrator-user-${cycleNum}.md`;
|
|
325
357
|
writeFileSync2(userPromptFilePath, userPrompt, "utf-8");
|
|
326
358
|
const claudeCmd = `claude --dangerously-skip-permissions --append-system-prompt "$(cat '${promptFilePath}')" "$(cat '${userPromptFilePath}')"`;
|
|
@@ -343,13 +375,13 @@ function resolveOrchestratorPane(sessionId, cwd) {
|
|
|
343
375
|
const lastCycle = session.orchestratorCycles[session.orchestratorCycles.length - 1];
|
|
344
376
|
return lastCycle?.paneId ?? void 0;
|
|
345
377
|
}
|
|
346
|
-
async function handleOrchestratorYield(sessionId, cwd) {
|
|
378
|
+
async function handleOrchestratorYield(sessionId, cwd, nextPrompt) {
|
|
347
379
|
const paneId = resolveOrchestratorPane(sessionId, cwd);
|
|
348
380
|
if (paneId) {
|
|
349
381
|
killPane(paneId);
|
|
350
382
|
sessionOrchestratorPane.delete(sessionId);
|
|
351
383
|
}
|
|
352
|
-
await completeOrchestratorCycle(cwd, sessionId);
|
|
384
|
+
await completeOrchestratorCycle(cwd, sessionId, nextPrompt);
|
|
353
385
|
const session = getSession(cwd, sessionId);
|
|
354
386
|
const runningAgents = session.agents.filter((a) => a.status === "running");
|
|
355
387
|
if (runningAgents.length === 0) {
|
|
@@ -369,7 +401,7 @@ async function handleOrchestratorComplete(sessionId, cwd, report) {
|
|
|
369
401
|
}
|
|
370
402
|
|
|
371
403
|
// src/daemon/agent.ts
|
|
372
|
-
import { readFileSync as readFileSync4, writeFileSync as writeFileSync3, mkdirSync as mkdirSync2, readdirSync } from "fs";
|
|
404
|
+
import { readFileSync as readFileSync4, writeFileSync as writeFileSync3, mkdirSync as mkdirSync2, readdirSync as readdirSync2 } from "fs";
|
|
373
405
|
import { resolve as resolve2 } from "path";
|
|
374
406
|
var agentCounters = /* @__PURE__ */ new Map();
|
|
375
407
|
function resetAgentCounter(sessionId, value = 0) {
|
|
@@ -427,7 +459,7 @@ async function spawnAgent(opts) {
|
|
|
427
459
|
function nextReportNumber(cwd, sessionId, agentId) {
|
|
428
460
|
const dir = reportsDir(cwd, sessionId);
|
|
429
461
|
try {
|
|
430
|
-
const files =
|
|
462
|
+
const files = readdirSync2(dir).filter((f) => f.startsWith(`${agentId}-`) && !f.endsWith("-final.md"));
|
|
431
463
|
return String(files.length + 1).padStart(3, "0");
|
|
432
464
|
} catch {
|
|
433
465
|
return "001";
|
|
@@ -592,7 +624,7 @@ function getSessionStatus(cwd, sessionId) {
|
|
|
592
624
|
function listSessions(cwd) {
|
|
593
625
|
const dir = sessionsDir(cwd);
|
|
594
626
|
if (!existsSync2(dir)) return [];
|
|
595
|
-
const entries =
|
|
627
|
+
const entries = readdirSync3(dir, { withFileTypes: true });
|
|
596
628
|
const sessions = [];
|
|
597
629
|
for (const entry of entries) {
|
|
598
630
|
if (!entry.isDirectory()) continue;
|
|
@@ -641,8 +673,8 @@ async function handleSubmit(cwd, sessionId, agentId, report, windowId) {
|
|
|
641
673
|
async function handleReport(cwd, sessionId, agentId, content) {
|
|
642
674
|
await handleAgentReport(cwd, sessionId, agentId, content);
|
|
643
675
|
}
|
|
644
|
-
async function handleYield(sessionId, cwd) {
|
|
645
|
-
await handleOrchestratorYield(sessionId, cwd);
|
|
676
|
+
async function handleYield(sessionId, cwd, nextPrompt) {
|
|
677
|
+
await handleOrchestratorYield(sessionId, cwd, nextPrompt);
|
|
646
678
|
}
|
|
647
679
|
async function handleComplete(sessionId, cwd, report) {
|
|
648
680
|
untrackSession(sessionId);
|
|
@@ -761,7 +793,7 @@ async function handleRequest(req) {
|
|
|
761
793
|
case "yield": {
|
|
762
794
|
const cwd = sessionCwdMap.get(req.sessionId);
|
|
763
795
|
if (!cwd) return { ok: false, error: `Unknown session: ${req.sessionId}` };
|
|
764
|
-
await handleYield(req.sessionId, cwd);
|
|
796
|
+
await handleYield(req.sessionId, cwd, req.nextPrompt);
|
|
765
797
|
return { ok: true };
|
|
766
798
|
}
|
|
767
799
|
case "complete": {
|