{"version":3,"file":"index.mjs","names":[],"sources":["../../core/src/orchestration.ts","../../core/src/stop.ts","../src/agent-id.ts","../src/pi-runtime.ts","../src/attach.ts","../src/board.ts","../src/continue.ts","../src/delegate.ts","../src/loop-config.ts","../src/loop.ts","../src/mayor.ts","../src/msg.ts","../src/peek.ts","../src/spawn.ts","../src/stop.ts","../src/version.ts","../src/index.ts"],"sourcesContent":["import { spawn } from \"node:child_process\"\nimport { readFileSync, rmSync, writeFileSync } from \"node:fs\"\nimport { createRequire } from \"node:module\"\nimport { hostname } from \"node:os\"\nimport { fileURLToPath } from \"node:url\"\nimport {\n\tappendAgentMessage,\n\tcreateAgentSessionRecord,\n\tcreateAgentState,\n\tgetAgentDir,\n\tgetAgentSessionsDir,\n\tgetLatestAgentSession,\n\treadAgentState,\n\twriteAgentState,\n} from \"./agents.js\"\nimport { createTaskRecord, readTaskRecord, updateTaskRecordStatus, writeTaskRecord } from \"./tasks.js\"\nimport { assertCommandAvailable, runCommandSync } from \"./shell.js\"\nimport type { AgentSessionRecord, AgentStateSnapshot, TaskRecord } from \"./types.js\"\n\nexport interface SpawnAgentRunOptions {\n\trepoRoot: string\n\tartifactsDir: string\n\trole: string\n\tagentId: string\n\ttask: string | null\n\tappendedSystemPrompt?: string | null | undefined\n\textensionPath?: string | null | undefined\n\ttaskId?: string | null | undefined\n\tautoResumeTarget?: AutoResumeTarget | null | undefined\n}\n\nexport interface SpawnAgentRunResult {\n\tlaunch: {\n\t\tprocessId: number\n\t\tstartedAt: string\n\t}\n\tlatestSession: AgentSessionRecord\n}\n\nexport interface DelegateTaskOptions {\n\trepoRoot: string\n\tartifactsDir: string\n\tfromAgentId: string\n\trole: string\n\tagentId?: string | null | undefined\n\tappendedSystemPrompt?: string | null | undefined\n\textensionPath?: string | null | undefined\n\tcompletionAutoResumeTarget?: AutoResumeTarget | null | undefined\n\ttask: string\n}\n\nexport interface DelegateTaskResult {\n\ttask: TaskRecord\n\tagentId: string\n\tlaunch: SpawnAgentRunResult[\"launch\"]\n\tlatestSession: AgentSessionRecord\n}\n\nexport interface ResolvedAgentSession {\n\tstate: AgentStateSnapshot\n\tsession: AgentSessionRecord\n}\n\nexport interface AutoResumeTarget {\n\tagentId: string\n\tmessage: string\n\tappendedSystemPrompt?: string | null | undefined\n\textensionPath?: string | null | undefined\n}\n\nexport interface ResumeAgentTurnDetachedOptions {\n\trepoRoot: string\n\tartifactsDir: string\n\tagentId: string\n\tmessage: string\n\tfrom?: string\n\tappendedSystemPrompt?: string | null | undefined\n\textensionPath?: string | null | undefined\n}\n\nexport interface RunAgentTurnOptions {\n\trepoRoot: string\n\tartifactsDir: string\n\tagentId: string\n\tmessage: string\n\tfrom?: string\n\truntimeArgs?: string[] | null\n}\n\nexport interface RunAgentTurnResult {\n\tpiResult: { stdout: string; stderr: string; exitCode: number }\n\tlatestSession: AgentSessionRecord\n\tcompletionMessage: string\n}\n\nfunction createPiInvocationArgs(input: {\n\tsessionDir?: string | null\n\tsessionPath?: string | null\n\tprompt?: string | null\n\tappendedSystemPrompt?: string | null | undefined\n\textensionPath?: string | null | undefined\n}): string[] {\n\tconst args: string[] = []\n\n\tif (input.extensionPath) args.push(\"--extension\", input.extensionPath)\n\tif (input.appendedSystemPrompt) args.push(\"--append-system-prompt\", input.appendedSystemPrompt)\n\tif (input.sessionPath) args.push(\"--session\", input.sessionPath)\n\telse if (input.sessionDir) args.push(\"--session-dir\", input.sessionDir)\n\telse throw new Error(\"Pi invocation requires a session path or session directory\")\n\tif (input.prompt) args.push(\"-p\", input.prompt)\n\n\treturn args\n}\n\nfunction createDetachedRunnerInvocation(encodedPayload: string): { command: string; args: string[] } {\n\tconst modulePath = fileURLToPath(import.meta.url)\n\tif (modulePath.endsWith(\".ts\")) {\n\t\tconst require = createRequire(import.meta.url)\n\t\treturn {\n\t\t\tcommand: process.execPath,\n\t\t\targs: [\"--import\", require.resolve(\"tsx\"), fileURLToPath(new URL(\"./agent-runner.ts\", import.meta.url)), encodedPayload],\n\t\t}\n\t}\n\n\treturn {\n\t\tcommand: process.execPath,\n\t\targs: [fileURLToPath(new URL(\"./agent-runner.mjs\", import.meta.url)), encodedPayload],\n\t}\n}\n\nfunction processAlive(pid: number): boolean {\n\tif (!Number.isFinite(pid) || pid <= 0) return false\n\ttry {\n\t\tprocess.kill(pid, 0)\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\nfunction getAgentWakeLockPath(artifactsDir: string, agentId: string) {\n\treturn `${getAgentDir(artifactsDir, agentId)}/auto-resume.lock.json`\n}\n\nfunction tryAcquireAgentWakeLock(artifactsDir: string, agentId: string): string | null {\n\tconst wakeLockPath = getAgentWakeLockPath(artifactsDir, agentId)\n\n\ttry {\n\t\tconst current = JSON.parse(readFileSync(wakeLockPath, \"utf-8\")) as { pid?: number }\n\t\tif (typeof current.pid === \"number\" && processAlive(current.pid)) return null\n\t\trmSync(wakeLockPath, { force: true })\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n\t\t\trmSync(wakeLockPath, { force: true })\n\t\t}\n\t}\n\n\ttry {\n\t\twriteFileSync(\n\t\t\twakeLockPath,\n\t\t\t`${JSON.stringify(\n\t\t\t\t{\n\t\t\t\t\tpid: process.pid,\n\t\t\t\t\thostname: hostname(),\n\t\t\t\t\tacquiredAt: new Date().toISOString(),\n\t\t\t\t},\n\t\t\t\tnull,\n\t\t\t\t2,\n\t\t\t)}\\n`,\n\t\t\t{ encoding: \"utf-8\", flag: \"wx\" },\n\t\t)\n\t\treturn wakeLockPath\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"EEXIST\") return null\n\t\tthrow error\n\t}\n}\n\nexport function createRolePrompt(input: { role: string; task: string | null; repoRoot: string }): string {\n\tconst task = input.task ?? \"pick the next bounded task from the current repo context\"\n\n\tswitch (input.role) {\n\t\tcase \"mayor\":\n\t\t\treturn [\n\t\t\t\t\"You are the Pi Town mayor.\",\n\t\t\t\t\"You coordinate work for this repository and act as the primary human-facing agent.\",\n\t\t\t\t\"\",\n\t\t\t\t`Repository: ${input.repoRoot}`,\n\t\t\t\t`Task: ${task}`,\n\t\t\t\t\"Keep updates concise, choose bounded next steps, and leave a durable artifact trail.\",\n\t\t\t].join(\"\\n\")\n\t\tcase \"reviewer\":\n\t\t\treturn [\n\t\t\t\t\"You are the Pi Town reviewer.\",\n\t\t\t\t\"You review work for correctness, safety, and completeness.\",\n\t\t\t\t\"\",\n\t\t\t\t`Repository: ${input.repoRoot}`,\n\t\t\t\t`Task: ${task}`,\n\t\t\t\t\"Focus on validation confidence, regressions, and whether the output is ready for a human handoff.\",\n\t\t\t].join(\"\\n\")\n\t\tcase \"docs-keeper\":\n\t\t\treturn [\n\t\t\t\t\"You are the Pi Town docs keeper.\",\n\t\t\t\t\"You summarize outcomes, blockers, and continuity in compact factual language.\",\n\t\t\t\t\"\",\n\t\t\t\t`Repository: ${input.repoRoot}`,\n\t\t\t\t`Task: ${task}`,\n\t\t\t\t\"Keep the output concise and useful for the next run or human review.\",\n\t\t\t].join(\"\\n\")\n\t\tdefault:\n\t\t\treturn [\n\t\t\t\t\"You are the Pi Town worker.\",\n\t\t\t\t\"You implement one bounded task at a time.\",\n\t\t\t\t\"\",\n\t\t\t\t`Repository: ${input.repoRoot}`,\n\t\t\t\t`Task: ${task}`,\n\t\t\t\t\"Keep scope tight, prefer explicit validations, and summarize what changed and what still needs follow-up.\",\n\t\t\t].join(\"\\n\")\n\t}\n}\n\nexport function resolveAgentSession(agentId: string, artifactsDir: string): ResolvedAgentSession {\n\tconst state = readAgentState(artifactsDir, agentId)\n\tif (state === null) throw new Error(`Unknown agent: ${agentId}`)\n\n\tconst latestSession = getLatestAgentSession(artifactsDir, agentId)\n\tconst sessionPath = state.session.sessionPath ?? latestSession.sessionPath\n\tconst sessionId = state.session.sessionId ?? latestSession.sessionId\n\tconst sessionDir = state.session.sessionDir ?? latestSession.sessionDir ?? getAgentSessionsDir(artifactsDir, agentId)\n\n\tif (sessionPath === null) {\n\t\tthrow new Error(`Agent ${agentId} does not have a persisted Pi session yet.`)\n\t}\n\n\treturn {\n\t\tstate,\n\t\tsession: createAgentSessionRecord({\n\t\t\tsessionDir,\n\t\t\tsessionId,\n\t\t\tsessionPath,\n\t\t\tprocessId: state.session.processId,\n\t\t\tlastAttachedAt: new Date().toISOString(),\n\t\t}),\n\t}\n}\n\nexport function resumeAgentTurnDetached(options: ResumeAgentTurnDetachedOptions): SpawnAgentRunResult | null {\n\tassertCommandAvailable(\"pi\")\n\n\tconst resolved = resolveAgentSession(options.agentId, options.artifactsDir)\n\tif (\n\t\tresolved.state.status === \"running\" ||\n\t\tresolved.state.status === \"starting\" ||\n\t\tresolved.state.session.processId !== null\n\t) {\n\t\treturn null\n\t}\n\n\tconst wakeLockPath = tryAcquireAgentWakeLock(options.artifactsDir, options.agentId)\n\tif (wakeLockPath === null) return null\n\n\tconst piArgs = createPiInvocationArgs({\n\t\tsessionPath: resolved.session.sessionPath,\n\t\tprompt: options.message,\n\t\tappendedSystemPrompt: options.appendedSystemPrompt,\n\t\textensionPath: options.extensionPath,\n\t})\n\tconst startedAt = new Date().toISOString()\n\tconst encodedPayload = Buffer.from(\n\t\tJSON.stringify({\n\t\t\tkind: \"turn\",\n\t\t\trepoRoot: options.repoRoot,\n\t\t\tartifactsDir: options.artifactsDir,\n\t\t\tagentId: options.agentId,\n\t\t\trole: resolved.state.role,\n\t\t\tmessage: options.message,\n\t\t\tfrom: options.from ?? \"system\",\n\t\t\tpiArgs,\n\t\t\twakeLockPath,\n\t\t}),\n\t\t\"utf-8\",\n\t).toString(\"base64url\")\n\tconst runner = createDetachedRunnerInvocation(encodedPayload)\n\n\twriteAgentState(\n\t\toptions.artifactsDir,\n\t\tcreateAgentState({\n\t\t\t...resolved.state,\n\t\t\tstatus: \"starting\",\n\t\t\tlastMessage: `Auto-resuming from ${options.from ?? \"system\"}: ${options.message}`,\n\t\t\twaitingOn: null,\n\t\t\tblocked: false,\n\t\t\tsession: createAgentSessionRecord({\n\t\t\t\tsessionDir: resolved.session.sessionDir,\n\t\t\t\tsessionId: resolved.session.sessionId,\n\t\t\t\tsessionPath: resolved.session.sessionPath,\n\t\t\t\tprocessId: null,\n\t\t\t\tlastAttachedAt: resolved.session.lastAttachedAt,\n\t\t\t}),\n\t\t}),\n\t)\n\n\tconst child = spawn(runner.command, runner.args, {\n\t\tcwd: options.repoRoot,\n\t\tdetached: true,\n\t\tenv: process.env,\n\t\tstdio: \"ignore\",\n\t})\n\tchild.unref()\n\n\tif (!child.pid) {\n\t\trmSync(wakeLockPath, { force: true })\n\t\tthrow new Error(`Failed to auto-resume ${resolved.state.role} run for ${options.agentId}`)\n\t}\n\n\twriteFileSync(\n\t\twakeLockPath,\n\t\t`${JSON.stringify(\n\t\t\t{\n\t\t\t\tpid: child.pid,\n\t\t\t\thostname: hostname(),\n\t\t\t\tacquiredAt: startedAt,\n\t\t\t},\n\t\t\tnull,\n\t\t\t2,\n\t\t)}\\n`,\n\t\t\"utf-8\",\n\t)\n\n\twriteAgentState(\n\t\toptions.artifactsDir,\n\t\tcreateAgentState({\n\t\t\t...resolved.state,\n\t\t\tstatus: \"running\",\n\t\t\tlastMessage: `Auto-resumed from ${options.from ?? \"system\"}: ${options.message}`,\n\t\t\twaitingOn: null,\n\t\t\tblocked: false,\n\t\t\tsession: createAgentSessionRecord({\n\t\t\t\tsessionDir: resolved.session.sessionDir,\n\t\t\t\tsessionId: resolved.session.sessionId,\n\t\t\t\tsessionPath: resolved.session.sessionPath,\n\t\t\t\tprocessId: child.pid,\n\t\t\t\tlastAttachedAt: resolved.session.lastAttachedAt,\n\t\t\t}),\n\t\t}),\n\t)\n\n\twriteFileSync(\n\t\t`${getAgentDir(options.artifactsDir, options.agentId)}/latest-invocation.json`,\n\t\t`${JSON.stringify(\n\t\t\t{\n\t\t\t\tcommand: \"pi\",\n\t\t\t\targs: piArgs,\n\t\t\t\texitCode: null,\n\t\t\t\tsessionDir: resolved.session.sessionDir,\n\t\t\t\tsessionPath: resolved.session.sessionPath,\n\t\t\t\tsessionId: resolved.session.sessionId,\n\t\t\t\tprocessId: child.pid,\n\t\t\t\tstartedAt,\n\t\t\t},\n\t\t\tnull,\n\t\t\t2,\n\t\t)}\\n`,\n\t\t\"utf-8\",\n\t)\n\n\treturn {\n\t\tlaunch: {\n\t\t\tprocessId: child.pid,\n\t\t\tstartedAt,\n\t\t},\n\t\tlatestSession: resolved.session,\n\t}\n}\n\nexport function queueAgentMessage(input: { artifactsDir: string; agentId: string; from: string; body: string }) {\n\tconst state = readAgentState(input.artifactsDir, input.agentId)\n\tif (state === null) throw new Error(`Unknown agent: ${input.agentId}`)\n\n\tappendAgentMessage({\n\t\tartifactsDir: input.artifactsDir,\n\t\tagentId: input.agentId,\n\t\tbox: \"inbox\",\n\t\tfrom: input.from,\n\t\tbody: input.body,\n\t})\n\n\twriteAgentState(\n\t\tinput.artifactsDir,\n\t\tcreateAgentState({\n\t\t\t...state,\n\t\t\tstatus: state.status === \"idle\" ? \"queued\" : state.status,\n\t\t\tlastMessage: input.body,\n\t\t\twaitingOn: null,\n\t\t\tblocked: false,\n\t\t\tsession: createAgentSessionRecord({\n\t\t\t\tsessionDir: state.session.sessionDir ?? getAgentSessionsDir(input.artifactsDir, input.agentId),\n\t\t\t\tsessionId: state.session.sessionId,\n\t\t\t\tsessionPath: state.session.sessionPath,\n\t\t\t\tprocessId: state.session.processId,\n\t\t\t\tlastAttachedAt: state.session.lastAttachedAt,\n\t\t\t}),\n\t\t}),\n\t)\n}\n\nexport function notifyTaskDelegator(input: {\n\tartifactsDir: string\n\tagentId: string\n\ttaskId: string | null\n\tcompletionMessage: string\n\toutcome: \"completed\" | \"blocked\"\n}) {\n\tif (!input.taskId) return\n\n\tconst task = readTaskRecord(input.artifactsDir, input.taskId)\n\tif (task === null) return\n\tif (!task.createdBy || task.createdBy === input.agentId) return\n\tif (readAgentState(input.artifactsDir, task.createdBy) === null) return\n\n\tconst statusText = input.outcome === \"completed\" ? \"completed\" : \"blocked\"\n\tconst title = task.title.trim()\n\tconst taskLabel = title.length > 0 ? `${task.taskId} (${title})` : task.taskId\n\n\tqueueAgentMessage({\n\t\tartifactsDir: input.artifactsDir,\n\t\tagentId: task.createdBy,\n\t\tfrom: input.agentId,\n\t\tbody: `${input.agentId} ${statusText} ${taskLabel}: ${input.completionMessage}`,\n\t})\n}\n\nexport function updateAgentStatus(input: {\n\tartifactsDir: string\n\tagentId: string\n\tstatus: \"queued\" | \"running\" | \"idle\" | \"blocked\" | \"completed\" | \"failed\" | \"stopped\"\n\tlastMessage?: string | null\n\twaitingOn?: string | null\n\tblocked?: boolean\n}) {\n\tconst state = readAgentState(input.artifactsDir, input.agentId)\n\tif (state === null) throw new Error(`Unknown agent: ${input.agentId}`)\n\n\tif (state.taskId) {\n\t\tconst taskStatus =\n\t\t\tinput.status === \"completed\"\n\t\t\t\t? \"completed\"\n\t\t\t\t: input.status === \"blocked\" || input.status === \"failed\"\n\t\t\t\t\t? \"blocked\"\n\t\t\t\t\t: input.status === \"stopped\"\n\t\t\t\t\t\t? \"aborted\"\n\t\t\t\t\t: input.status === \"running\" || input.status === \"queued\"\n\t\t\t\t\t\t? \"running\"\n\t\t\t\t\t\t: null\n\t\tif (taskStatus) updateTaskRecordStatus(input.artifactsDir, state.taskId, taskStatus)\n\t}\n\n\twriteAgentState(\n\t\tinput.artifactsDir,\n\t\tcreateAgentState({\n\t\t\t...state,\n\t\t\tstatus: input.status,\n\t\t\tlastMessage: input.lastMessage ?? state.lastMessage,\n\t\t\twaitingOn: input.waitingOn ?? state.waitingOn,\n\t\t\tblocked: input.blocked ?? state.blocked,\n\t\t\tsession: state.session,\n\t\t}),\n\t)\n}\n\nexport function spawnAgentRun(options: SpawnAgentRunOptions): SpawnAgentRunResult {\n\tconst sessionDir = getAgentSessionsDir(options.artifactsDir, options.agentId)\n\n\tif (readAgentState(options.artifactsDir, options.agentId) !== null) {\n\t\tthrow new Error(`Agent already exists: ${options.agentId}`)\n\t}\n\n\tassertCommandAvailable(\"pi\")\n\n\tconst state = createAgentState({\n\t\tagentId: options.agentId,\n\t\trole: options.role,\n\t\tstatus: \"queued\",\n\t\ttaskId: options.taskId ?? null,\n\t\ttask: options.task,\n\t\tlastMessage: options.task ? `Spawned with task: ${options.task}` : `Spawned ${options.role} agent`,\n\t\tsession: createAgentSessionRecord({\n\t\t\tsessionDir,\n\t\t}),\n\t})\n\twriteAgentState(options.artifactsDir, state)\n\tif (options.task) {\n\t\tappendAgentMessage({\n\t\t\tartifactsDir: options.artifactsDir,\n\t\t\tagentId: options.agentId,\n\t\t\tbox: \"inbox\",\n\t\t\tfrom: \"system\",\n\t\t\tbody: options.task,\n\t\t})\n\t}\n\n\twriteAgentState(\n\t\toptions.artifactsDir,\n\t\tcreateAgentState({\n\t\t\t...state,\n\t\t\tstatus: \"running\",\n\t\t\tlastMessage: options.task ? `Running ${options.role} task: ${options.task}` : `Running ${options.role} agent`,\n\t\t}),\n\t)\n\n\tconst prompt = createRolePrompt({ role: options.role, task: options.task, repoRoot: options.repoRoot })\n\tconst piArgs = createPiInvocationArgs({\n\t\tsessionDir,\n\t\tprompt,\n\t\tappendedSystemPrompt: options.appendedSystemPrompt,\n\t\textensionPath: options.extensionPath,\n\t})\n\tconst startedAt = new Date().toISOString()\n\tconst encodedPayload = Buffer.from(\n\t\tJSON.stringify({\n\t\t\trepoRoot: options.repoRoot,\n\t\t\tartifactsDir: options.artifactsDir,\n\t\t\tagentId: options.agentId,\n\t\t\trole: options.role,\n\t\t\ttask: options.task,\n\t\t\ttaskId: options.taskId ?? null,\n\t\t\tsessionDir,\n\t\t\tpiArgs,\n\t\t\tautoResumeTarget: options.autoResumeTarget ?? null,\n\t\t}),\n\t\t\"utf-8\",\n\t).toString(\"base64url\")\n\tconst runner = createDetachedRunnerInvocation(encodedPayload)\n\tconst child = spawn(runner.command, runner.args, {\n\t\tcwd: options.repoRoot,\n\t\tdetached: true,\n\t\tenv: process.env,\n\t\tstdio: \"ignore\",\n\t})\n\tchild.unref()\n\n\tif (!child.pid) {\n\t\tthrow new Error(`Failed to launch detached ${options.role} run for ${options.agentId}`)\n\t}\n\n\twriteFileSync(\n\t\t`${getAgentDir(options.artifactsDir, options.agentId)}/latest-invocation.json`,\n\t\t`${JSON.stringify(\n\t\t\t{\n\t\t\t\tcommand: \"pi\",\n\t\t\t\targs: piArgs,\n\t\t\t\texitCode: null,\n\t\t\t\tsessionDir,\n\t\t\t\tsessionPath: null,\n\t\t\t\tsessionId: null,\n\t\t\t\tprocessId: child.pid,\n\t\t\t\tstartedAt,\n\t\t\t},\n\t\t\tnull,\n\t\t\t2,\n\t\t)}\\n`,\n\t\t\"utf-8\",\n\t)\n\n\treturn {\n\t\tlaunch: {\n\t\t\tprocessId: child.pid,\n\t\t\tstartedAt,\n\t\t},\n\t\tlatestSession: createAgentSessionRecord({\n\t\t\tsessionDir,\n\t\t}),\n\t}\n}\n\nexport function runAgentTurn(options: RunAgentTurnOptions): RunAgentTurnResult {\n\tassertCommandAvailable(\"pi\")\n\n\tconst resolved = resolveAgentSession(options.agentId, options.artifactsDir)\n\tconst messageSource = options.from ?? \"human\"\n\twriteAgentState(\n\t\toptions.artifactsDir,\n\t\tcreateAgentState({\n\t\t\t...resolved.state,\n\t\t\tstatus: \"running\",\n\t\t\tlastMessage: `Responding to ${messageSource}: ${options.message}`,\n\t\t\twaitingOn: null,\n\t\t\tblocked: false,\n\t\t\tsession: resolved.session,\n\t\t}),\n\t)\n\n\tconst piArgs =\n\t\toptions.runtimeArgs && options.runtimeArgs.length > 0\n\t\t\t? options.runtimeArgs\n\t\t\t: createPiInvocationArgs({\n\t\t\t\t\tsessionPath: resolved.session.sessionPath,\n\t\t\t\t\tprompt: options.message,\n\t\t\t\t})\n\tconst piResult = runCommandSync(\"pi\", piArgs, {\n\t\tcwd: options.repoRoot,\n\t\tenv: process.env,\n\t})\n\tconst latestSession = getLatestAgentSession(options.artifactsDir, options.agentId)\n\tconst agentArtifactsDir = getAgentDir(options.artifactsDir, options.agentId)\n\twriteFileSync(`${agentArtifactsDir}/latest-stdout.txt`, piResult.stdout, \"utf-8\")\n\twriteFileSync(`${agentArtifactsDir}/latest-stderr.txt`, piResult.stderr, \"utf-8\")\n\twriteFileSync(\n\t\t`${agentArtifactsDir}/latest-invocation.json`,\n\t\t`${JSON.stringify(\n\t\t\t{\n\t\t\t\tcommand: \"pi\",\n\t\t\t\targs: piArgs,\n\t\t\t\texitCode: piResult.exitCode,\n\t\t\t\tsessionDir: latestSession.sessionDir,\n\t\t\t\tsessionPath: latestSession.sessionPath,\n\t\t\t\tsessionId: latestSession.sessionId,\n\t\t\t},\n\t\t\tnull,\n\t\t\t2,\n\t\t)}\\n`,\n\t\t\"utf-8\",\n\t)\n\n\tconst completionMessage =\n\t\tpiResult.stdout.trim() ||\n\t\t(piResult.exitCode === 0\n\t\t\t? `${resolved.state.role} turn completed`\n\t\t\t: `${resolved.state.role} turn exited with code ${piResult.exitCode}`)\n\tappendAgentMessage({\n\t\tartifactsDir: options.artifactsDir,\n\t\tagentId: options.agentId,\n\t\tbox: \"outbox\",\n\t\tfrom: options.agentId,\n\t\tbody: completionMessage,\n\t})\n\n\twriteAgentState(\n\t\toptions.artifactsDir,\n\t\tcreateAgentState({\n\t\t\t...resolved.state,\n\t\t\tstatus: piResult.exitCode === 0 ? \"idle\" : \"blocked\",\n\t\t\tlastMessage: completionMessage,\n\t\t\twaitingOn: piResult.exitCode === 0 ? null : \"human-or-follow-up-run\",\n\t\t\tblocked: piResult.exitCode !== 0,\n\t\t\tsession: createAgentSessionRecord({\n\t\t\t\tsessionDir: latestSession.sessionDir,\n\t\t\t\tsessionId: latestSession.sessionId,\n\t\t\t\tsessionPath: latestSession.sessionPath,\n\t\t\t\tprocessId: null,\n\t\t\t}),\n\t\t}),\n\t)\n\n\treturn { piResult, latestSession, completionMessage }\n}\n\nexport function delegateTask(options: DelegateTaskOptions): DelegateTaskResult {\n\tconst fromState = readAgentState(options.artifactsDir, options.fromAgentId)\n\tif (fromState === null) throw new Error(`Unknown delegating agent: ${options.fromAgentId}`)\n\n\tconst agentId = options.agentId ?? `${options.role}-${Date.now()}`\n\tconst task = createTaskRecord({\n\t\ttaskId: `task-${Date.now()}`,\n\t\ttitle: options.task,\n\t\tstatus: \"queued\",\n\t\trole: options.role,\n\t\tassignedAgentId: agentId,\n\t\tcreatedBy: options.fromAgentId,\n\t})\n\twriteTaskRecord(options.artifactsDir, task)\n\n\tappendAgentMessage({\n\t\tartifactsDir: options.artifactsDir,\n\t\tagentId: options.fromAgentId,\n\t\tbox: \"outbox\",\n\t\tfrom: options.fromAgentId,\n\t\tbody: `Delegated ${task.taskId} to ${agentId}: ${options.task}`,\n\t})\n\n\tconst { launch, latestSession } = spawnAgentRun({\n\t\trepoRoot: options.repoRoot,\n\t\tartifactsDir: options.artifactsDir,\n\t\trole: options.role,\n\t\tagentId,\n\t\tappendedSystemPrompt: options.appendedSystemPrompt,\n\t\textensionPath: options.extensionPath,\n\t\tautoResumeTarget: options.completionAutoResumeTarget,\n\t\ttask: options.task,\n\t\ttaskId: task.taskId,\n\t})\n\n\tappendAgentMessage({\n\t\tartifactsDir: options.artifactsDir,\n\t\tagentId,\n\t\tbox: \"inbox\",\n\t\tfrom: options.fromAgentId,\n\t\tbody: `Delegated by ${options.fromAgentId} as ${task.taskId}: ${options.task}`,\n\t})\n\n\twriteTaskRecord(options.artifactsDir, {\n\t\t...task,\n\t\tstatus: \"running\",\n\t\tupdatedAt: new Date().toISOString(),\n\t})\n\n\treturn {\n\t\ttask: {\n\t\t\t...task,\n\t\t\tstatus: \"running\",\n\t\t\tupdatedAt: new Date().toISOString(),\n\t\t},\n\t\tagentId,\n\t\tlaunch,\n\t\tlatestSession,\n\t}\n}\n","import { readdirSync, readFileSync, rmSync } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { join } from \"node:path\"\nimport {\n\tappendAgentMessage,\n\tcreateAgentSessionRecord,\n\tcreateAgentState,\n\tlistAgentStates,\n\twriteAgentState,\n} from \"./agents.js\"\nimport { updateTaskRecordStatus } from \"./tasks.js\"\nimport type { AgentStateSnapshot } from \"./types.js\"\n\nconst DEFAULT_GRACE_MS = 750\n\ninterface LeaseData {\n\trunId: string\n\trepoId: string\n\tbranch: string\n\tpid: number\n\thostname: string\n\tstartedAt: string\n}\n\nexport interface StopManagedAgentsOptions {\n\tartifactsDir: string\n\tagentId?: string | null\n\texcludeAgentIds?: string[]\n\tactorId?: string | null\n\treason?: string | null\n\tforce?: boolean\n\tgraceMs?: number\n}\n\nexport interface StopAgentResult {\n\tagentId: string\n\tpreviousStatus: AgentStateSnapshot[\"status\"]\n\tnextStatus: AgentStateSnapshot[\"status\"]\n\tprocessId: number | null\n\tsignal: \"SIGTERM\" | \"SIGKILL\" | null\n\texited: boolean\n}\n\nexport interface StopManagedAgentsResult {\n\tresults: StopAgentResult[]\n\tstoppedAgents: number\n\tsignaledProcesses: number\n}\n\nexport interface RepoLeaseRecord extends LeaseData {\n\tpath: string\n}\n\nexport interface StopRepoLeasesOptions {\n\trepoId?: string | null\n\tforce?: boolean\n\tgraceMs?: number\n}\n\nexport interface StopRepoLeaseResult {\n\tpath: string\n\trunId: string\n\trepoId: string\n\tbranch: string\n\tprocessId: number\n\tsignal: \"SIGTERM\" | \"SIGKILL\" | null\n\texited: boolean\n}\n\nexport interface StopRepoLeasesResult {\n\tresults: StopRepoLeaseResult[]\n\tsignaledProcesses: number\n}\n\nfunction sleepMs(ms: number) {\n\tAtomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms)\n}\n\nfunction getLocksDir(): string {\n\treturn join(homedir(), \".pi-town\", \"locks\")\n}\n\nfunction processAlive(pid: number): boolean {\n\tif (!Number.isFinite(pid) || pid <= 0) return false\n\n\ttry {\n\t\tprocess.kill(pid, 0)\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\nfunction terminateProcess(pid: number, options: { force?: boolean; graceMs?: number }): {\n\tsignal: \"SIGTERM\" | \"SIGKILL\" | null\n\texited: boolean\n} {\n\tif (!processAlive(pid)) return { signal: null, exited: true }\n\n\ttry {\n\t\tprocess.kill(pid, \"SIGTERM\")\n\t} catch {\n\t\treturn { signal: null, exited: !processAlive(pid) }\n\t}\n\n\tconst graceMs = options.graceMs ?? DEFAULT_GRACE_MS\n\tconst deadline = Date.now() + graceMs\n\twhile (Date.now() < deadline) {\n\t\tif (!processAlive(pid)) return { signal: \"SIGTERM\", exited: true }\n\t\tsleepMs(25)\n\t}\n\n\tif (!options.force) return { signal: \"SIGTERM\", exited: !processAlive(pid) }\n\n\ttry {\n\t\tprocess.kill(pid, \"SIGKILL\")\n\t} catch {\n\t\treturn { signal: \"SIGTERM\", exited: !processAlive(pid) }\n\t}\n\n\treturn { signal: \"SIGKILL\", exited: !processAlive(pid) }\n}\n\nfunction readLease(path: string): RepoLeaseRecord | null {\n\ttry {\n\t\tconst data = JSON.parse(readFileSync(path, \"utf-8\")) as LeaseData\n\t\treturn { ...data, path }\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction createStopMessage(options: { actorId?: string | null; reason?: string | null }): string {\n\tif (options.reason) return options.reason\n\tif (options.actorId) return `Stopped by ${options.actorId}`\n\treturn \"Stopped by operator\"\n}\n\nfunction createStopMessageInput(options: StopManagedAgentsOptions): { actorId?: string | null; reason?: string | null } {\n\treturn {\n\t\t...(options.actorId === undefined ? {} : { actorId: options.actorId }),\n\t\t...(options.reason === undefined ? {} : { reason: options.reason }),\n\t}\n}\n\nfunction createTerminateOptions(options: { force?: boolean; graceMs?: number }): { force?: boolean; graceMs?: number } {\n\treturn {\n\t\t...(options.force === undefined ? {} : { force: options.force }),\n\t\t...(options.graceMs === undefined ? {} : { graceMs: options.graceMs }),\n\t}\n}\n\nexport function listRepoLeases(repoId?: string | null): RepoLeaseRecord[] {\n\tlet entries: string[]\n\ttry {\n\t\tentries = readdirSync(getLocksDir())\n\t} catch {\n\t\treturn []\n\t}\n\n\treturn entries\n\t\t.filter((entry) => entry.endsWith(\".json\"))\n\t\t.map((entry) => readLease(join(getLocksDir(), entry)))\n\t\t.filter((record): record is RepoLeaseRecord => record !== null)\n\t\t.filter((record) => repoId === undefined || repoId === null || record.repoId === repoId)\n}\n\nexport function stopRepoLeases(options: StopRepoLeasesOptions): StopRepoLeasesResult {\n\tconst results = listRepoLeases(options.repoId).map((lease) => {\n\t\tconst termination = terminateProcess(lease.pid, options)\n\t\tif (termination.exited) rmSync(lease.path, { force: true })\n\n\t\treturn {\n\t\t\tpath: lease.path,\n\t\t\trunId: lease.runId,\n\t\t\trepoId: lease.repoId,\n\t\t\tbranch: lease.branch,\n\t\t\tprocessId: lease.pid,\n\t\t\tsignal: termination.signal,\n\t\t\texited: termination.exited,\n\t\t}\n\t})\n\n\treturn {\n\t\tresults,\n\t\tsignaledProcesses: results.filter((result) => result.signal !== null).length,\n\t}\n}\n\nexport function stopManagedAgents(options: StopManagedAgentsOptions): StopManagedAgentsResult {\n\tconst reason = createStopMessage(createStopMessageInput(options))\n\tconst excluded = new Set(options.excludeAgentIds ?? [])\n\tconst candidates = listAgentStates(options.artifactsDir).filter((agent) => {\n\t\tif (excluded.has(agent.agentId)) return false\n\t\tif (options.agentId && agent.agentId !== options.agentId) return false\n\t\treturn ![\"completed\", \"failed\", \"stopped\"].includes(agent.status)\n\t})\n\n\tconst results = candidates.map((state) => {\n\t\tconst processId = state.session.processId\n\t\tconst termination =\n\t\t\tprocessId === null\n\t\t\t\t? { signal: null, exited: true }\n\t\t\t\t: terminateProcess(processId, createTerminateOptions(options))\n\n\t\tif (state.taskId) updateTaskRecordStatus(options.artifactsDir, state.taskId, \"aborted\")\n\n\t\tappendAgentMessage({\n\t\t\tartifactsDir: options.artifactsDir,\n\t\t\tagentId: state.agentId,\n\t\t\tbox: \"outbox\",\n\t\t\tfrom: options.actorId ?? \"system\",\n\t\t\tbody: reason,\n\t\t})\n\n\t\twriteAgentState(\n\t\t\toptions.artifactsDir,\n\t\t\tcreateAgentState({\n\t\t\t\t...state,\n\t\t\t\tstatus: \"stopped\",\n\t\t\t\tlastMessage: reason,\n\t\t\t\twaitingOn: \"stopped\",\n\t\t\t\tblocked: true,\n\t\t\t\tsession: createAgentSessionRecord({\n\t\t\t\t\tsessionDir: state.session.sessionDir,\n\t\t\t\t\tsessionId: state.session.sessionId,\n\t\t\t\t\tsessionPath: state.session.sessionPath,\n\t\t\t\t\tprocessId: null,\n\t\t\t\t\tlastAttachedAt: state.session.lastAttachedAt,\n\t\t\t\t}),\n\t\t\t}),\n\t\t)\n\n\t\treturn {\n\t\t\tagentId: state.agentId,\n\t\t\tpreviousStatus: state.status,\n\t\t\tnextStatus: \"stopped\" as const,\n\t\t\tprocessId,\n\t\t\tsignal: termination.signal,\n\t\t\texited: termination.exited,\n\t\t}\n\t})\n\n\treturn {\n\t\tresults,\n\t\tstoppedAgents: results.length,\n\t\tsignaledProcesses: results.filter((result) => result.signal !== null).length,\n\t}\n}\n","export function normalizeAgentId(agentId: string): string {\n\treturn agentId\n}\n","import { readPiTownMayorPrompt, resolvePiTownExtensionPath } from \"@schilderlabs/pitown-package\"\n\nexport interface PiTownRuntimeArgsOptions {\n\tagentId: string\n\tsessionPath?: string | null\n\tsessionDir?: string | null\n\tprompt?: string | null\n\tmessage?: string | null\n}\n\nexport function isMayorAgent(agentId: string) {\n\treturn agentId === \"mayor\"\n}\n\nexport function createPiTownRuntimeArgs(options: PiTownRuntimeArgsOptions): string[] {\n\tconst args = [\"--extension\", resolvePiTownExtensionPath()]\n\n\tif (isMayorAgent(options.agentId)) {\n\t\targs.push(\"--append-system-prompt\", readPiTownMayorPrompt())\n\t}\n\n\tif (options.sessionPath) args.push(\"--session\", options.sessionPath)\n\telse if (options.sessionDir) args.push(\"--session-dir\", options.sessionDir)\n\telse throw new Error(\"Pi Town runtime requires either a session path or a session directory\")\n\n\tif (options.prompt) args.push(\"-p\", options.prompt)\n\tif (options.message) args.push(options.message)\n\n\treturn args\n}\n","import {\n\tassertCommandAvailable,\n\tresolveAgentSession,\n\trunCommandInteractive,\n\twriteAgentState,\n} from \"../../core/src/index.js\"\nimport { normalizeAgentId } from \"./agent-id.js\"\nimport { createPiTownRuntimeArgs } from \"./pi-runtime.js\"\nimport { resolveRepoContext } from \"./repo-context.js\"\n\nexport function attachTownAgent(argv = process.argv.slice(2)) {\n\tconst repo = resolveRepoContext(argv)\n\tconst [agentArg] = repo.rest\n\tif (!agentArg) throw new Error(\"Usage: pitown attach [--repo <path>] <agent>\")\n\tconst agentId = normalizeAgentId(agentArg)\n\n\tassertCommandAvailable(\"pi\")\n\tconst resolved = resolveAgentSession(agentId, repo.artifactsDir)\n\twriteAgentState(repo.artifactsDir, { ...resolved.state, session: resolved.session })\n\n\tconsole.log(\"[pitown] attach\")\n\tconsole.log(`- repo root: ${repo.repoRoot}`)\n\tconsole.log(`- agent: ${agentId}`)\n\tconsole.log(`- session: ${resolved.session.sessionPath}`)\n\n\tconst exitCode = runCommandInteractive(\n\t\t\"pi\",\n\t\tcreatePiTownRuntimeArgs({\n\t\t\tagentId,\n\t\t\tsessionPath: resolved.session.sessionPath,\n\t\t}),\n\t\t{\n\t\t\tcwd: repo.repoRoot,\n\t\t\tenv: process.env,\n\t\t},\n\t)\n\tif (exitCode !== 0) process.exitCode = exitCode\n}\n","import { existsSync, readFileSync } from \"node:fs\"\nimport { basename, join } from \"node:path\"\nimport { getCurrentBranch, listAgentStates, listTaskRecords } from \"../../core/src/index.js\"\nimport type { MetricsSnapshot } from \"../../core/src/index.js\"\nimport { resolveRepoContext } from \"./repo-context.js\"\n\nfunction truncate(text: string | null | undefined, max: number): string {\n\tif (!text) return \"—\"\n\tconst single = text.replace(/\\n/g, \" \").trim()\n\tif (single.length <= max) return single\n\treturn `${single.slice(0, max - 1)}…`\n}\n\nexport function showTownBoard(argv = process.argv.slice(2)) {\n\tconst repo = resolveRepoContext(argv)\n\tconst agents = listAgentStates(repo.artifactsDir)\n\tconst tasks = listTaskRecords(repo.artifactsDir)\n\n\tconst repoName = basename(repo.repoRoot)\n\tconst branch = getCurrentBranch(repo.repoRoot)\n\tconst branchLabel = branch ? ` (${branch})` : \"\"\n\n\tconst mayor = agents.find((a) => a.agentId === \"mayor\")\n\tconst workers = agents.filter((a) => a.agentId !== \"mayor\")\n\tconst workersByStatus = (status: string) => workers.filter((a) => a.status === status).length\n\n\tconsole.log(`[pitown] board — ${repoName}${branchLabel}`)\n\tif (mayor) {\n\t\tconst spawned = workers.length\n\t\tconst running = workersByStatus(\"running\") + workersByStatus(\"starting\")\n\t\tconst completed = workersByStatus(\"completed\") + workersByStatus(\"idle\")\n\t\tconst blocked = workersByStatus(\"blocked\") + workersByStatus(\"failed\")\n\t\tconst parts = [`${spawned} spawned`]\n\t\tif (running > 0) parts.push(`${running} running`)\n\t\tif (completed > 0) parts.push(`${completed} done`)\n\t\tif (blocked > 0) parts.push(`${blocked} blocked`)\n\t\tconsole.log(`Mayor workers: ${parts.join(\", \")}`)\n\t}\n\n\t// --- Agents section ---\n\tconsole.log(\"\")\n\tconsole.log(\"Agents:\")\n\tif (agents.length === 0) {\n\t\tconsole.log(\"  (no agents)\")\n\t} else {\n\t\tfor (const agent of agents) {\n\t\t\tconst id = agent.agentId.padEnd(14)\n\t\t\tconst role = agent.role.padEnd(10)\n\t\t\tconst status = agent.status.padEnd(10)\n\t\t\tconst task = truncate(agent.task, 60)\n\t\t\tconst msg = agent.lastMessage ? ` | ${truncate(agent.lastMessage, 40)}` : \"\"\n\t\t\tconst waiting = agent.waitingOn ? ` | waiting on: ${agent.waitingOn}` : \"\"\n\t\t\tconsole.log(`  ${id}${role}${status}${task}${msg}${waiting}`)\n\t\t}\n\t}\n\n\t// --- Tasks section ---\n\tconsole.log(\"\")\n\tconsole.log(\"Tasks:\")\n\tif (tasks.length === 0) {\n\t\tconsole.log(\"  (no tasks)\")\n\t} else {\n\t\tfor (const task of tasks) {\n\t\t\tconst id = task.taskId.padEnd(14)\n\t\t\tconst status = task.status.padEnd(12)\n\t\t\tconst assignee = (task.assignedAgentId ?? \"—\").padEnd(14)\n\t\t\tconst title = truncate(task.title, 60)\n\t\t\tconsole.log(`  ${id}${status}${assignee}${title}`)\n\t\t}\n\t}\n\n\t// --- Metrics section ---\n\tconst metricsPath = join(repo.artifactsDir, \"latest\", \"metrics.json\")\n\tif (existsSync(metricsPath)) {\n\t\ttry {\n\t\t\tconst metrics = JSON.parse(readFileSync(metricsPath, \"utf-8\")) as MetricsSnapshot\n\t\t\tconsole.log(\"\")\n\t\t\tconsole.log(\"Metrics (latest run):\")\n\t\t\tconsole.log(`  Interrupt Rate:              ${fmt(metrics.interruptRate)}`)\n\t\t\tconsole.log(`  Autonomous Completion Rate:  ${fmt(metrics.autonomousCompletionRate)}`)\n\t\t\tconsole.log(`  Context Coverage Score:      ${fmt(metrics.contextCoverageScore)}`)\n\t\t\tconsole.log(`  MTTC:                        ${metrics.meanTimeToCorrectHours != null ? `${metrics.meanTimeToCorrectHours}h` : \"—\"}`)\n\t\t\tconsole.log(`  Feedback-to-Demo:            ${metrics.feedbackToDemoCycleTimeHours != null ? `${metrics.feedbackToDemoCycleTimeHours}h` : \"—\"}`)\n\t\t} catch {\n\t\t\t// skip metrics if unreadable\n\t\t}\n\t}\n}\n\nfunction fmt(value: number | null | undefined): string {\n\tif (value == null) return \"—\"\n\treturn String(value)\n}\n","import {\n\tassertCommandAvailable,\n\tresolveAgentSession,\n\trunCommandInteractive,\n\twriteAgentState,\n} from \"../../core/src/index.js\"\nimport { normalizeAgentId } from \"./agent-id.js\"\nimport { createPiTownRuntimeArgs } from \"./pi-runtime.js\"\nimport { resolveRepoContext } from \"./repo-context.js\"\n\nexport function continueTownAgent(argv = process.argv.slice(2)) {\n\tconst repo = resolveRepoContext(argv)\n\tconst [agentArg, ...messageParts] = repo.rest\n\tif (!agentArg) throw new Error('Usage: pitown continue [--repo <path>] <agent> [\"message\"]')\n\tconst agentId = normalizeAgentId(agentArg)\n\n\tassertCommandAvailable(\"pi\")\n\tconst resolved = resolveAgentSession(agentId, repo.artifactsDir)\n\twriteAgentState(repo.artifactsDir, { ...resolved.state, session: resolved.session })\n\n\tconst message = messageParts.join(\" \").trim()\n\tconst args = createPiTownRuntimeArgs({\n\t\tagentId,\n\t\tsessionPath: resolved.session.sessionPath,\n\t\tmessage: message || null,\n\t})\n\n\tconsole.log(\"[pitown] continue\")\n\tconsole.log(`- repo root: ${repo.repoRoot}`)\n\tconsole.log(`- agent: ${agentId}`)\n\tconsole.log(`- session: ${resolved.session.sessionPath}`)\n\tif (message) console.log(`- message: ${message}`)\n\n\tconst exitCode = runCommandInteractive(\"pi\", args, {\n\t\tcwd: repo.repoRoot,\n\t\tenv: process.env,\n\t})\n\tif (exitCode !== 0) process.exitCode = exitCode\n}\n","import {\n\tdelegateTask,\n\treadAgentState,\n} from \"../../core/src/index.js\"\nimport { readPiTownMayorPrompt, resolvePiTownExtensionPath } from \"@schilderlabs/pitown-package\"\nimport { normalizeAgentId } from \"./agent-id.js\"\nimport { resolveRepoContext } from \"./repo-context.js\"\n\ninterface DelegateFlags {\n\tfrom: string\n\trole: string\n\tagentId: string | null\n\ttask: string\n}\n\nfunction parseDelegateFlags(argv: string[]): DelegateFlags {\n\tlet from = \"mayor\"\n\tlet role = \"worker\"\n\tlet agentId: string | null = null\n\tlet task: string | null = null\n\n\tfor (let index = 0; index < argv.length; index += 1) {\n\t\tconst arg = argv[index]\n\t\tif (arg === undefined) continue\n\n\t\tif (arg.startsWith(\"--from=\")) {\n\t\t\tfrom = arg.slice(\"--from=\".length)\n\t\t\tcontinue\n\t\t}\n\t\tif (arg === \"--from\") {\n\t\t\tfrom = argv[index + 1] ?? from\n\t\t\tindex += 1\n\t\t\tcontinue\n\t\t}\n\t\tif (arg.startsWith(\"--role=\")) {\n\t\t\trole = arg.slice(\"--role=\".length)\n\t\t\tcontinue\n\t\t}\n\t\tif (arg === \"--role\") {\n\t\t\trole = argv[index + 1] ?? role\n\t\t\tindex += 1\n\t\t\tcontinue\n\t\t}\n\t\tif (arg.startsWith(\"--agent=\")) {\n\t\t\tagentId = arg.slice(\"--agent=\".length)\n\t\t\tcontinue\n\t\t}\n\t\tif (arg === \"--agent\") {\n\t\t\tagentId = argv[index + 1] ?? null\n\t\t\tindex += 1\n\t\t\tcontinue\n\t\t}\n\t\tif (arg.startsWith(\"--task=\")) {\n\t\t\ttask = arg.slice(\"--task=\".length)\n\t\t\tcontinue\n\t\t}\n\t\tif (arg === \"--task\") {\n\t\t\ttask = argv[index + 1] ?? null\n\t\t\tindex += 1\n\t\t\tcontinue\n\t\t}\n\n\t\tthrow new Error(`Unknown argument: ${arg}`)\n\t}\n\n\tif (!task) {\n\t\tthrow new Error(\"Usage: pitown delegate [--repo <path>] [--from <agent>] [--role <role>] [--agent <id>] --task <text>\")\n\t}\n\n\treturn { from, role, agentId, task }\n}\n\nexport function delegateTownTask(argv = process.argv.slice(2)) {\n\tconst repo = resolveRepoContext(argv)\n\tconst flags = parseDelegateFlags(repo.rest)\n\tconst fromAgentId = normalizeAgentId(flags.from)\n\tconst fromState = readAgentState(repo.artifactsDir, fromAgentId)\n\tif (fromState === null) throw new Error(`Unknown delegating agent: ${fromAgentId}`)\n\n\tconst { agentId, latestSession, launch, task } = delegateTask({\n\t\trepoRoot: repo.repoRoot,\n\t\tartifactsDir: repo.artifactsDir,\n\t\tfromAgentId: fromAgentId,\n\t\trole: flags.role,\n\t\tagentId: flags.agentId,\n\t\ttask: flags.task,\n\t\textensionPath: resolvePiTownExtensionPath(),\n\t\tcompletionAutoResumeTarget:\n\t\t\tfromAgentId === \"mayor\"\n\t\t\t\t? {\n\t\t\t\t\t\tagentId: \"mayor\",\n\t\t\t\t\t\tmessage: \"New agent check-ins arrived. Review the latest board and inbox updates, then decide the next bounded action.\",\n\t\t\t\t\t\textensionPath: resolvePiTownExtensionPath(),\n\t\t\t\t\t\tappendedSystemPrompt: readPiTownMayorPrompt(),\n\t\t\t\t\t}\n\t\t\t\t: null,\n\t})\n\n\tconsole.log(\"[pitown] delegate\")\n\tconsole.log(`- repo root: ${repo.repoRoot}`)\n\tconsole.log(`- from: ${fromAgentId}`)\n\tconsole.log(`- task id: ${task.taskId}`)\n\tconsole.log(`- agent: ${agentId}`)\n\tconsole.log(`- role: ${flags.role}`)\n\tconsole.log(`- status: ${task.status}`)\n\tconsole.log(`- launch pid: ${launch.processId}`)\n\tif (latestSession.sessionPath) console.log(`- session: ${latestSession.sessionPath}`)\n\telse if (latestSession.sessionDir) console.log(`- session dir: ${latestSession.sessionDir}`)\n}\n","import { existsSync, readFileSync } from \"node:fs\"\nimport { dirname, isAbsolute, resolve } from \"node:path\"\nimport { homedir } from \"node:os\"\nimport { getUserConfigPath } from \"./paths.js\"\n\nconst DEFAULT_GOAL = \"continue from current scaffold state\"\nconst DEFAULT_MAX_ITERATIONS = 10\nconst DEFAULT_MAX_TIME_MINUTES = 60\n\ninterface UserConfig {\n\trepo?: string\n\tplan?: string\n\tgoal?: string\n}\n\nexport interface ResolvedLoopConfig {\n\trepo: string\n\tplan: string | null\n\tgoal: string\n\tmaxIterations: number\n\tmaxTimeMinutes: number\n\tstopOnPiFailure: boolean\n}\n\ninterface LoopCliFlags {\n\trepo?: string\n\tplan?: string\n\tgoal?: string\n\tmaxIterations?: number\n\tmaxTime?: number\n\tnoStopOnFailure: boolean\n}\n\nfunction expandHome(value: string): string {\n\tif (value === \"~\") return homedir()\n\tif (value.startsWith(\"~/\")) return resolve(homedir(), value.slice(2))\n\treturn value\n}\n\nfunction resolvePathValue(value: string | undefined, baseDir: string): string | undefined {\n\tif (!value) return undefined\n\tconst expanded = expandHome(value)\n\treturn isAbsolute(expanded) ? resolve(expanded) : resolve(baseDir, expanded)\n}\n\nfunction parseLoopCliFlags(argv: string[]): LoopCliFlags {\n\tconst flags: LoopCliFlags = { noStopOnFailure: false }\n\n\tfor (let index = 0; index < argv.length; index += 1) {\n\t\tconst arg = argv[index]\n\t\tif (arg === undefined) continue\n\n\t\tif (arg.startsWith(\"--repo=\")) {\n\t\t\tflags.repo = arg.slice(\"--repo=\".length)\n\t\t\tcontinue\n\t\t}\n\t\tif (arg === \"--repo\") {\n\t\t\tconst value = argv[index + 1]\n\t\t\tif (!value) throw new Error(\"Missing value for --repo\")\n\t\t\tflags.repo = value\n\t\t\tindex += 1\n\t\t\tcontinue\n\t\t}\n\n\t\tif (arg.startsWith(\"--plan=\")) {\n\t\t\tflags.plan = arg.slice(\"--plan=\".length)\n\t\t\tcontinue\n\t\t}\n\t\tif (arg === \"--plan\") {\n\t\t\tconst value = argv[index + 1]\n\t\t\tif (!value) throw new Error(\"Missing value for --plan\")\n\t\t\tflags.plan = value\n\t\t\tindex += 1\n\t\t\tcontinue\n\t\t}\n\n\t\tif (arg.startsWith(\"--goal=\")) {\n\t\t\tflags.goal = arg.slice(\"--goal=\".length)\n\t\t\tcontinue\n\t\t}\n\t\tif (arg === \"--goal\") {\n\t\t\tconst value = argv[index + 1]\n\t\t\tif (!value) throw new Error(\"Missing value for --goal\")\n\t\t\tflags.goal = value\n\t\t\tindex += 1\n\t\t\tcontinue\n\t\t}\n\n\t\tif (arg.startsWith(\"--max-iterations=\")) {\n\t\t\tflags.maxIterations = Number.parseInt(arg.slice(\"--max-iterations=\".length), 10)\n\t\t\tcontinue\n\t\t}\n\t\tif (arg === \"--max-iterations\") {\n\t\t\tconst value = argv[index + 1]\n\t\t\tif (!value) throw new Error(\"Missing value for --max-iterations\")\n\t\t\tflags.maxIterations = Number.parseInt(value, 10)\n\t\t\tindex += 1\n\t\t\tcontinue\n\t\t}\n\n\t\tif (arg.startsWith(\"--max-time=\")) {\n\t\t\tflags.maxTime = Number.parseInt(arg.slice(\"--max-time=\".length), 10)\n\t\t\tcontinue\n\t\t}\n\t\tif (arg === \"--max-time\") {\n\t\t\tconst value = argv[index + 1]\n\t\t\tif (!value) throw new Error(\"Missing value for --max-time\")\n\t\t\tflags.maxTime = Number.parseInt(value, 10)\n\t\t\tindex += 1\n\t\t\tcontinue\n\t\t}\n\n\t\tif (arg === \"--no-stop-on-failure\") {\n\t\t\tflags.noStopOnFailure = true\n\t\t\tcontinue\n\t\t}\n\n\t\tthrow new Error(`Unknown argument: ${arg}`)\n\t}\n\n\treturn flags\n}\n\nfunction loadUserConfig(): UserConfig {\n\tconst configPath = getUserConfigPath()\n\tif (!existsSync(configPath)) return {}\n\treturn JSON.parse(readFileSync(configPath, \"utf-8\")) as UserConfig\n}\n\nexport function resolveLoopConfig(argv: string[]): ResolvedLoopConfig {\n\tconst flags = parseLoopCliFlags(argv)\n\tconst configPath = getUserConfigPath()\n\tconst userConfig = loadUserConfig()\n\tconst configDir = dirname(configPath)\n\n\tconst repo =\n\t\tresolvePathValue(flags.repo, process.cwd()) ??\n\t\tresolvePathValue(userConfig.repo, configDir) ??\n\t\tresolve(process.cwd())\n\tconst plan = resolvePathValue(flags.plan, process.cwd()) ?? resolvePathValue(userConfig.plan, configDir) ?? null\n\tconst goal = flags.goal ?? userConfig.goal ?? DEFAULT_GOAL\n\n\treturn {\n\t\trepo,\n\t\tplan,\n\t\tgoal,\n\t\tmaxIterations: flags.maxIterations ?? DEFAULT_MAX_ITERATIONS,\n\t\tmaxTimeMinutes: flags.maxTime ?? DEFAULT_MAX_TIME_MINUTES,\n\t\tstopOnPiFailure: !flags.noStopOnFailure,\n\t}\n}\n","import { existsSync, mkdirSync, statSync } from \"node:fs\"\nimport { readPiTownMayorPrompt, resolvePiTownExtensionPath } from \"@schilderlabs/pitown-package\"\nimport {\n\tcreateRepoSlug,\n\tgetRepoIdentity,\n\tgetRepoRoot,\n\trunLoop,\n\ttype LoopRunResult,\n} from \"../../core/src/index.js\"\nimport { resolveLoopConfig } from \"./loop-config.js\"\nimport {\n\tgetRecommendedPlanDir,\n\tgetRepoArtifactsDir,\n\tgetTownHomeDir,\n} from \"./paths.js\"\n\nfunction assertDirectory(path: string, label: string) {\n\tif (!existsSync(path)) throw new Error(`${label} does not exist: ${path}`)\n\tif (!statSync(path).isDirectory()) throw new Error(`${label} is not a directory: ${path}`)\n}\n\nfunction formatMs(ms: number): string {\n\tif (ms < 1000) return `${ms}ms`\n\treturn `${(ms / 1000).toFixed(1)}s`\n}\n\nexport function loopTown(argv = process.argv.slice(2)): LoopRunResult {\n\tconst config = resolveLoopConfig(argv)\n\tassertDirectory(config.repo, \"Target repo\")\n\tif (config.plan) assertDirectory(config.plan, \"Plan path\")\n\n\tconst townHome = getTownHomeDir()\n\tmkdirSync(townHome, { recursive: true })\n\n\tconst repoRoot = getRepoRoot(config.repo)\n\tconst repoId = getRepoIdentity(repoRoot)\n\tconst repoSlug = createRepoSlug(repoId, repoRoot)\n\tconst recommendedPlanDir = config.plan ? null : getRecommendedPlanDir(repoSlug)\n\tconst artifactsDir = getRepoArtifactsDir(repoSlug)\n\n\tconsole.log(`[pitown-loop] starting loop (max ${config.maxIterations} iterations, ${config.maxTimeMinutes}min wall time)`)\n\n\tconst result = runLoop({\n\t\trunOptions: {\n\t\t\tartifactsDir,\n\t\t\tcwd: repoRoot,\n\t\t\tgoal: config.goal,\n\t\t\tmode: \"single-pi\",\n\t\t\tplanPath: config.plan,\n\t\t\trecommendedPlanDir,\n\t\t\tappendedSystemPrompt: readPiTownMayorPrompt(),\n\t\t\textensionPath: resolvePiTownExtensionPath(),\n\t\t},\n\t\tmaxIterations: config.maxIterations,\n\t\tmaxWallTimeMs: config.maxTimeMinutes * 60_000,\n\t\tstopOnPiFailure: config.stopOnPiFailure,\n\t\tonIterationComplete(iteration) {\n\t\t\tconst board = iteration.boardSnapshot\n\t\t\tconst taskSummary = board.tasks.length > 0\n\t\t\t\t? `${board.tasks.length} tasks (${board.tasks.filter((t) => t.status === \"completed\").length} completed, ${board.tasks.filter((t) => t.status === \"running\").length} running)`\n\t\t\t\t: \"no tasks tracked\"\n\t\t\tconst mayorStatus = board.agents.find((a) => a.agentId === \"mayor\")?.status ?? \"unknown\"\n\n\t\t\tconsole.log(`[pitown-loop] iteration ${iteration.iteration}/${config.maxIterations} completed (${formatMs(iteration.elapsedMs)})`)\n\t\t\tconsole.log(`  - pi exit code: ${iteration.controllerResult.piInvocation.exitCode}`)\n\t\t\tconsole.log(`  - run: ${iteration.controllerResult.runId}`)\n\t\t\tconsole.log(`  - board: ${taskSummary}, mayor ${mayorStatus}`)\n\t\t\tconsole.log(`  - metrics: interrupt rate ${iteration.metrics.interruptRate}, autonomous completion ${iteration.metrics.autonomousCompletionRate}`)\n\t\t\tif (iteration.stopReason) {\n\t\t\t\tconsole.log(`  - stopping: ${iteration.stopReason}`)\n\t\t\t} else {\n\t\t\t\tconsole.log(`  - continuing: ${iteration.continueReason}`)\n\t\t\t}\n\t\t},\n\t})\n\n\tconsole.log(`[pitown-loop] stopped after ${result.totalIterations} iteration${result.totalIterations === 1 ? \"\" : \"s\"} (${formatMs(result.totalElapsedMs)} total)`)\n\tconsole.log(`  - reason: ${result.stopReason}`)\n\tconsole.log(`  - aggregate metrics: interrupt rate ${result.aggregateMetrics.interruptRate}, autonomous completion ${result.aggregateMetrics.autonomousCompletionRate}`)\n\n\treturn result\n}\n","import {\n\tassertCommandAvailable,\n\tcreateAgentSessionRecord,\n\tcreateAgentState,\n\tgetAgentSessionsDir,\n\tgetLatestAgentSession,\n\treadAgentState,\n\trunCommandInteractive,\n\twriteAgentState,\n} from \"../../core/src/index.js\"\nimport { attachTownAgent } from \"./attach.js\"\nimport { continueTownAgent } from \"./continue.js\"\nimport { createPiTownRuntimeArgs } from \"./pi-runtime.js\"\nimport { resolveRepoContext } from \"./repo-context.js\"\nimport { runTown } from \"./run.js\"\n\nfunction startFreshMayorSession(repoRoot: string, artifactsDir: string) {\n\tconst sessionDir = getAgentSessionsDir(artifactsDir, \"mayor\")\n\twriteAgentState(\n\t\tartifactsDir,\n\t\tcreateAgentState({\n\t\t\tagentId: \"mayor\",\n\t\t\trole: \"mayor\",\n\t\t\tstatus: \"running\",\n\t\t\ttask: \"open the mayor session and plan the next steps for this repository\",\n\t\t\tlastMessage: \"Mayor session opened\",\n\t\t\tsession: createAgentSessionRecord({\n\t\t\t\tsessionDir,\n\t\t\t}),\n\t\t}),\n\t)\n\n\tconsole.log(\"[pitown] mayor\")\n\tconsole.log(`- repo root: ${repoRoot}`)\n\tconsole.log(\"- starting a new mayor session\")\n\n\tconst exitCode = runCommandInteractive(\n\t\t\"pi\",\n\t\tcreatePiTownRuntimeArgs({\n\t\t\tagentId: \"mayor\",\n\t\t\tsessionDir,\n\t\t}),\n\t\t{\n\t\t\tcwd: repoRoot,\n\t\t\tenv: process.env,\n\t\t},\n\t)\n\tconst latestSession = getLatestAgentSession(artifactsDir, \"mayor\")\n\tconst previousState = readAgentState(artifactsDir, \"mayor\")\n\tif (previousState !== null) {\n\t\twriteAgentState(\n\t\t\tartifactsDir,\n\t\t\tcreateAgentState({\n\t\t\t\t...previousState,\n\t\t\t\tstatus: exitCode === 0 ? \"idle\" : \"blocked\",\n\t\t\t\tlastMessage: exitCode === 0 ? \"Mayor session closed\" : `Mayor session exited with code ${exitCode}`,\n\t\t\t\tblocked: exitCode !== 0,\n\t\t\t\twaitingOn: exitCode === 0 ? null : \"human-or-follow-up-run\",\n\t\t\t\tsession: createAgentSessionRecord({\n\t\t\t\t\tsessionDir: latestSession.sessionDir,\n\t\t\t\t\tsessionId: latestSession.sessionId,\n\t\t\t\t\tsessionPath: latestSession.sessionPath,\n\t\t\t\t}),\n\t\t\t}),\n\t\t)\n\t}\n\n\tif (exitCode !== 0) process.exitCode = exitCode\n}\n\nexport function openTownMayor(argv = process.argv.slice(2)) {\n\tconst repo = resolveRepoContext(argv)\n\tconst message = repo.rest.join(\" \").trim()\n\tconst mayorState = readAgentState(repo.artifactsDir, \"mayor\")\n\n\tif (mayorState === null) {\n\t\tassertCommandAvailable(\"pi\")\n\t\tif (message) {\n\t\t\trunTown([\"--repo\", repo.repoRoot, \"--goal\", message])\n\t\t\treturn\n\t\t}\n\t\tstartFreshMayorSession(repo.repoRoot, repo.artifactsDir)\n\t\treturn\n\t}\n\n\tif (message) {\n\t\tcontinueTownAgent([\"--repo\", repo.repoRoot, \"mayor\", message])\n\t\treturn\n\t}\n\n\tattachTownAgent([\"--repo\", repo.repoRoot, \"mayor\"])\n}\n","import {\n\tqueueAgentMessage,\n\treadAgentState,\n\trunAgentTurn,\n} from \"../../core/src/index.js\"\nimport { normalizeAgentId } from \"./agent-id.js\"\nimport { createPiTownRuntimeArgs } from \"./pi-runtime.js\"\nimport { resolveRepoContext } from \"./repo-context.js\"\n\nexport function messageTownAgent(argv = process.argv.slice(2)) {\n\tconst repo = resolveRepoContext(argv)\n\tconst [agentArg, ...messageParts] = repo.rest\n\tif (!agentArg || messageParts.length === 0) throw new Error('Usage: pitown msg [--repo <path>] <agent> \"message\"')\n\tconst agentId = normalizeAgentId(agentArg)\n\n\tconst state = readAgentState(repo.artifactsDir, agentId)\n\tif (state === null) throw new Error(`Unknown agent: ${agentId}`)\n\n\tconst body = messageParts.join(\" \").trim()\n\tqueueAgentMessage({ artifactsDir: repo.artifactsDir, agentId, from: \"human\", body })\n\n\tconst deliveredResult =\n\t\tstate.role === \"mayor\"\n\t\t\t? runAgentTurn({\n\t\t\t\t\trepoRoot: repo.repoRoot,\n\t\t\t\t\tartifactsDir: repo.artifactsDir,\n\t\t\t\t\tagentId,\n\t\t\t\t\tmessage: body,\n\t\t\t\t\tfrom: \"human\",\n\t\t\t\t\truntimeArgs: createPiTownRuntimeArgs({\n\t\t\t\t\t\tagentId,\n\t\t\t\t\t\tsessionPath: state.session.sessionPath,\n\t\t\t\t\t\tprompt: body,\n\t\t\t\t\t}),\n\t\t\t\t})\n\t\t\t: null\n\n\tconsole.log(\"[pitown] msg\")\n\tconsole.log(`- repo root: ${repo.repoRoot}`)\n\tconsole.log(`- agent: ${agentId}`)\n\tconsole.log(`- queued message: ${body}`)\n\tif (deliveredResult) {\n\t\tconsole.log(`- delivered to session: ${deliveredResult.latestSession.sessionPath}`)\n\t\tconsole.log(`- mayor response: ${deliveredResult.completionMessage}`)\n\t}\n}\n","import { readAgentMessages, readAgentState } from \"../../core/src/index.js\"\nimport { normalizeAgentId } from \"./agent-id.js\"\nimport { resolveRepoContext } from \"./repo-context.js\"\n\nfunction printMessages(label: string, lines: { from: string; body: string; createdAt: string }[]) {\n\tconsole.log(`- ${label}:`)\n\tif (lines.length === 0) {\n\t\tconsole.log(\"  (empty)\")\n\t\treturn\n\t}\n\n\tfor (const line of lines) {\n\t\tconsole.log(`  ${line.createdAt} ${line.from}: ${line.body}`)\n\t}\n}\n\nexport function peekTownAgent(argv = process.argv.slice(2)) {\n\tconst repo = resolveRepoContext(argv)\n\tconst [agentArg] = repo.rest\n\tconst agentId = normalizeAgentId(agentArg ?? \"mayor\")\n\n\tconst state = readAgentState(repo.artifactsDir, agentId)\n\tif (state === null) throw new Error(`Unknown agent: ${agentId}`)\n\n\tconsole.log(\"[pitown] peek\")\n\tconsole.log(`- repo root: ${repo.repoRoot}`)\n\tconsole.log(`- agent: ${state.agentId}`)\n\tconsole.log(`- role: ${state.role}`)\n\tconsole.log(`- status: ${state.status}`)\n\tif (state.taskId) console.log(`- task id: ${state.taskId}`)\n\tif (state.task) console.log(`- task: ${state.task}`)\n\tif (state.branch) console.log(`- branch: ${state.branch}`)\n\tconsole.log(`- blocked: ${state.blocked}`)\n\tif (state.waitingOn) console.log(`- waiting on: ${state.waitingOn}`)\n\tif (state.lastMessage) console.log(`- last message: ${state.lastMessage}`)\n\tif (state.session.sessionId) console.log(`- session id: ${state.session.sessionId}`)\n\tif (state.session.sessionPath) console.log(`- session path: ${state.session.sessionPath}`)\n\tconsole.log(`- updated at: ${state.updatedAt}`)\n\n\tprintMessages(\"recent inbox\", readAgentMessages(repo.artifactsDir, agentId, \"inbox\").slice(-5))\n\tprintMessages(\"recent outbox\", readAgentMessages(repo.artifactsDir, agentId, \"outbox\").slice(-5))\n}\n","import { spawnAgentRun } from \"../../core/src/index.js\"\nimport { resolvePiTownExtensionPath } from \"@schilderlabs/pitown-package\"\nimport { resolveRepoContext } from \"./repo-context.js\"\n\ninterface SpawnFlags {\n\trole: string\n\tagentId: string | null\n\ttask: string | null\n}\n\nexport interface SpawnAgentOptions {\n\trepoRoot: string\n\tartifactsDir: string\n\trole: string\n\tagentId: string\n\ttask: string | null\n\ttaskId?: string | null\n\tappendedSystemPrompt?: string | null\n\textensionPath?: string | null\n}\n\nfunction parseSpawnFlags(argv: string[]): SpawnFlags {\n\tlet role: string | null = null\n\tlet agentId: string | null = null\n\tlet task: string | null = null\n\n\tfor (let index = 0; index < argv.length; index += 1) {\n\t\tconst arg = argv[index]\n\t\tif (arg === undefined) continue\n\n\t\tif (arg.startsWith(\"--role=\")) {\n\t\t\trole = arg.slice(\"--role=\".length)\n\t\t\tcontinue\n\t\t}\n\n\t\tif (arg === \"--role\") {\n\t\t\trole = argv[index + 1] ?? null\n\t\t\tindex += 1\n\t\t\tcontinue\n\t\t}\n\n\t\tif (arg.startsWith(\"--agent=\")) {\n\t\t\tagentId = arg.slice(\"--agent=\".length)\n\t\t\tcontinue\n\t\t}\n\n\t\tif (arg === \"--agent\") {\n\t\t\tagentId = argv[index + 1] ?? null\n\t\t\tindex += 1\n\t\t\tcontinue\n\t\t}\n\n\t\tif (arg.startsWith(\"--task=\")) {\n\t\t\ttask = arg.slice(\"--task=\".length)\n\t\t\tcontinue\n\t\t}\n\n\t\tif (arg === \"--task\") {\n\t\t\ttask = argv[index + 1] ?? null\n\t\t\tindex += 1\n\t\t\tcontinue\n\t\t}\n\n\t\tthrow new Error(`Unknown argument: ${arg}`)\n\t}\n\n\tif (!role) throw new Error(\"Usage: pitown spawn [--repo <path>] --role <role> [--agent <id>] [--task <text>]\")\n\treturn { role, agentId, task }\n}\n\nexport function spawnAgent(options: SpawnAgentOptions) {\n\treturn spawnAgentRun(options)\n}\n\nexport function spawnTownAgent(argv = process.argv.slice(2)) {\n\tconst repo = resolveRepoContext(argv)\n\tconst flags = parseSpawnFlags(repo.rest)\n\tconst agentId = flags.agentId ?? `${flags.role}-${Date.now()}`\n\tconst task = flags.task\n\tconst { launch, latestSession } = spawnAgent({\n\t\trepoRoot: repo.repoRoot,\n\t\tartifactsDir: repo.artifactsDir,\n\t\trole: flags.role,\n\t\tagentId,\n\t\ttask,\n\t\textensionPath: resolvePiTownExtensionPath(),\n\t})\n\n\tconsole.log(\"[pitown] spawn\")\n\tconsole.log(`- repo root: ${repo.repoRoot}`)\n\tconsole.log(`- agent: ${agentId}`)\n\tconsole.log(`- role: ${flags.role}`)\n\tconsole.log(`- status: running`)\n\tconsole.log(`- launch pid: ${launch.processId}`)\n\tif (task) console.log(`- task: ${task}`)\n\tif (latestSession.sessionPath) console.log(`- session: ${latestSession.sessionPath}`)\n\telse if (latestSession.sessionDir) console.log(`- session dir: ${latestSession.sessionDir}`)\n}\n","import { existsSync, readdirSync } from \"node:fs\"\nimport {\n\tgetRepoIdentity,\n\tstopManagedAgents,\n\tstopRepoLeases,\n} from \"../../core/src/index.js\"\nimport { normalizeAgentId } from \"./agent-id.js\"\nimport { parseOptionalRepoFlag } from \"./config.js\"\nimport { getRepoArtifactsDir, getReposRootDir } from \"./paths.js\"\nimport { resolveRepoContext } from \"./repo-context.js\"\n\ninterface StopFlags {\n\tall: boolean\n\tagentId: string | null\n\tforce: boolean\n}\n\ninterface StopRepoSummary {\n\trepoLabel: string\n\tstoppedAgents: number\n\tsignaledAgentProcesses: number\n\tsignaledLeaseProcesses: number\n}\n\nfunction parseStopFlags(argv: string[]): StopFlags {\n\tlet all = false\n\tlet agentId: string | null = null\n\tlet force = false\n\n\tfor (let index = 0; index < argv.length; index += 1) {\n\t\tconst arg = argv[index]\n\t\tif (arg === undefined) continue\n\n\t\tif (arg === \"--all\") {\n\t\t\tall = true\n\t\t\tcontinue\n\t\t}\n\n\t\tif (arg === \"--force\") {\n\t\t\tforce = true\n\t\t\tcontinue\n\t\t}\n\n\t\tif (arg.startsWith(\"--agent=\")) {\n\t\t\tagentId = normalizeAgentId(arg.slice(\"--agent=\".length))\n\t\t\tcontinue\n\t\t}\n\n\t\tif (arg === \"--agent\") {\n\t\t\tconst value = argv[index + 1]\n\t\t\tif (!value) throw new Error(\"Missing value for --agent\")\n\t\t\tagentId = normalizeAgentId(value)\n\t\t\tindex += 1\n\t\t\tcontinue\n\t\t}\n\n\t\tthrow new Error(`Unknown argument: ${arg}`)\n\t}\n\n\treturn { all, agentId, force }\n}\n\nfunction stopRepo(repoRoot: string, artifactsDir: string, flags: StopFlags): StopRepoSummary {\n\tconst repoId = getRepoIdentity(repoRoot)\n\tconst leaseResult = flags.agentId ? { signaledProcesses: 0 } : stopRepoLeases({ repoId, force: flags.force })\n\tconst agentResult = stopManagedAgents({\n\t\tartifactsDir,\n\t\tagentId: flags.agentId,\n\t\tactorId: \"human\",\n\t\treason: flags.agentId ? `Stopped ${flags.agentId} via pitown stop` : \"Stopped via pitown stop\",\n\t\tforce: flags.force,\n\t})\n\n\treturn {\n\t\trepoLabel: repoRoot,\n\t\tstoppedAgents: agentResult.stoppedAgents,\n\t\tsignaledAgentProcesses: agentResult.signaledProcesses,\n\t\tsignaledLeaseProcesses: leaseResult.signaledProcesses,\n\t}\n}\n\nfunction listTrackedArtifactsDirs(): string[] {\n\tconst reposRoot = getReposRootDir()\n\tif (!existsSync(reposRoot)) return []\n\n\treturn readdirSync(reposRoot)\n\t\t.map((entry) => getRepoArtifactsDir(entry))\n\t\t.filter((path) => existsSync(path))\n}\n\nexport function stopTown(argv = process.argv.slice(2)): StopRepoSummary[] {\n\tconst { repo, rest } = parseOptionalRepoFlag(argv)\n\tconst flags = parseStopFlags(rest)\n\n\tif (flags.all && repo) throw new Error(\"Do not combine --all with --repo\")\n\tif (flags.all && flags.agentId) throw new Error(\"Do not combine --all with --agent\")\n\n\tif (flags.all) {\n\t\tconst repoSummaries = listTrackedArtifactsDirs().map((artifactsDir) => {\n\t\t\tconst result = stopManagedAgents({\n\t\t\t\tartifactsDir,\n\t\t\t\tactorId: \"human\",\n\t\t\t\treason: \"Stopped via pitown stop --all\",\n\t\t\t\tforce: flags.force,\n\t\t\t})\n\n\t\t\treturn {\n\t\t\t\trepoLabel: artifactsDir,\n\t\t\t\tstoppedAgents: result.stoppedAgents,\n\t\t\t\tsignaledAgentProcesses: result.signaledProcesses,\n\t\t\t\tsignaledLeaseProcesses: 0,\n\t\t\t}\n\t\t})\n\t\tconst leaseResult = stopRepoLeases({ force: flags.force })\n\t\tconst totalAgents = repoSummaries.reduce((sum, result) => sum + result.stoppedAgents, 0)\n\t\tconst totalAgentProcesses = repoSummaries.reduce((sum, result) => sum + result.signaledAgentProcesses, 0)\n\t\tconst totalLeaseProcesses =\n\t\t\tleaseResult.signaledProcesses + repoSummaries.reduce((sum, result) => sum + result.signaledLeaseProcesses, 0)\n\n\t\tconsole.log(\"[pitown] stop\")\n\t\tconsole.log(\"- scope: all repos\")\n\t\tconsole.log(`- stopped agents: ${totalAgents}`)\n\t\tconsole.log(`- signaled agent processes: ${totalAgentProcesses}`)\n\t\tconsole.log(`- signaled lease processes: ${totalLeaseProcesses}`)\n\t\tif (repoSummaries.length === 0 && leaseResult.results.length === 0) console.log(\"- nothing was running\")\n\t\treturn repoSummaries\n\t}\n\n\tconst resolved = repo ? resolveRepoContext([\"--repo\", repo]) : resolveRepoContext([])\n\tconst result = stopRepo(resolved.repoRoot, resolved.artifactsDir, flags)\n\n\tconsole.log(\"[pitown] stop\")\n\tconsole.log(`- repo root: ${result.repoLabel}`)\n\tif (flags.agentId) console.log(`- agent: ${flags.agentId}`)\n\tconsole.log(`- stopped agents: ${result.stoppedAgents}`)\n\tconsole.log(`- signaled agent processes: ${result.signaledAgentProcesses}`)\n\tif (!flags.agentId) console.log(`- signaled lease processes: ${result.signaledLeaseProcesses}`)\n\tif (result.stoppedAgents === 0 && result.signaledAgentProcesses === 0 && result.signaledLeaseProcesses === 0) {\n\t\tconsole.log(\"- nothing was running\")\n\t}\n\n\treturn [result]\n}\n","import { readFileSync } from \"node:fs\"\n\nconst packageJson = JSON.parse(readFileSync(new URL(\"../package.json\", import.meta.url), \"utf-8\")) as {\n\tversion: string\n}\n\nexport const CLI_VERSION = packageJson.version\n","#!/usr/bin/env node\n\nimport { attachTownAgent } from \"./attach.js\"\nimport { showTownBoard } from \"./board.js\"\nimport { continueTownAgent } from \"./continue.js\"\nimport { delegateTownTask } from \"./delegate.js\"\nimport { runDoctor } from \"./doctor.js\"\nimport { isDirectExecution } from \"./entrypoint.js\"\nimport { loopTown } from \"./loop.js\"\nimport { openTownMayor } from \"./mayor.js\"\nimport { messageTownAgent } from \"./msg.js\"\nimport { peekTownAgent } from \"./peek.js\"\nimport { runTown } from \"./run.js\"\nimport { spawnTownAgent } from \"./spawn.js\"\nimport { showTownStatus } from \"./status.js\"\nimport { stopTown } from \"./stop.js\"\nimport { CLI_VERSION } from \"./version.js\"\nimport { watchTown } from \"./watch.js\"\n\nexport function printHelp(showAdvanced = false) {\n\tconsole.log(\n\t\t[\n\t\t\t\"pitown\",\n\t\t\t\"\",\n\t\t\t\"Usage:\",\n\t\t\t'  pitown [--repo <path>] [\"message\"]',\n\t\t\t\"  pitown board [--repo <path>]\",\n\t\t\t\"  pitown peek [--repo <path>] [agent]\",\n\t\t\t'  pitown msg [--repo <path>] <agent> \"message\"',\n\t\t\t\"  pitown status [--repo <path>]\",\n\t\t\t\"  pitown stop [--repo <path>] [--agent <id>] [--all] [--force]\",\n\t\t\t\"  pitown doctor\",\n\t\t\t\"  pitown --version\",\n\t\t\t\"\",\n\t\t\t\"Mayor workflow:\",\n\t\t\t\"  pitown\",\n\t\t\t'  pitown \"plan the next milestones\"',\n\t\t\t\"  /plan\",\n\t\t\t\"  /todos\",\n\t\t\t\"\",\n\t\t\t\"Inside the mayor session, `/plan` toggles read-only planning mode and `/todos` shows the captured plan.\",\n\t\t\t\"Aliases still work: `pitown mayor`, `pitown help`, `pitown --help`, `pitown -v`.\",\n\t\t\t\"\",\n\t\t\t\"If --repo is omitted, Pi Town uses the repo for the current working directory when possible.\",\n\t\t\t...(showAdvanced\n\t\t\t\t? [\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\"Advanced commands:\",\n\t\t\t\t\t\t\"  pitown run [--repo <path>] [--plan <path>] [--goal <text>]\",\n\t\t\t\t\t\t\"  pitown loop [--repo <path>] [--plan <path>] [--goal <text>] [--max-iterations N] [--max-time M] [--no-stop-on-failure]\",\n\t\t\t\t\t\t\"  pitown attach [--repo <path>] <agent>\",\n\t\t\t\t\t\t'  pitown continue [--repo <path>] <agent> [\"message\"]',\n\t\t\t\t\t\t\"  pitown delegate [--repo <path>] [--from <agent>] [--role <role>] [--agent <id>] --task <text>\",\n\t\t\t\t\t\t\"  pitown spawn [--repo <path>] --role <role> [--agent <id>] [--task <text>]\",\n\t\t\t\t\t\t\"  pitown watch [--repo <path>]\",\n\t\t\t\t\t]\n\t\t\t\t: []),\n\t\t].join(\"\\n\"),\n\t)\n}\n\nexport function runCli(argv = process.argv.slice(2)) {\n\tconst [command, ...args] = argv\n\tconst showAdvancedHelp = args.includes(\"--all\")\n\n\tswitch (command) {\n\t\tcase undefined:\n\t\t\topenTownMayor([])\n\t\t\tbreak\n\t\tcase \"help\":\n\t\tcase \"--help\":\n\t\tcase \"-h\":\n\t\t\tprintHelp(showAdvancedHelp)\n\t\t\tbreak\n\t\tcase \"-v\":\n\t\tcase \"--version\":\n\t\tcase \"version\":\n\t\t\tconsole.log(CLI_VERSION)\n\t\t\tbreak\n\t\tcase \"run\": {\n\t\t\tconst result = runTown(args)\n\t\t\tconst latestIteration = result.iterations[result.iterations.length - 1]\n\t\t\tif (latestIteration && latestIteration.controllerResult.piInvocation.exitCode !== 0) {\n\t\t\t\tprocess.exitCode = latestIteration.controllerResult.piInvocation.exitCode\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tcase \"loop\": {\n\t\t\tconst result = loopTown(args)\n\t\t\tconst lastIteration = result.iterations[result.iterations.length - 1]\n\t\t\tif (lastIteration && lastIteration.controllerResult.piInvocation.exitCode !== 0) {\n\t\t\t\tprocess.exitCode = lastIteration.controllerResult.piInvocation.exitCode\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tcase \"attach\":\n\t\t\tattachTownAgent(args)\n\t\t\tbreak\n\t\tcase \"board\":\n\t\t\tshowTownBoard(args)\n\t\t\tbreak\n\t\tcase \"continue\":\n\t\t\tcontinueTownAgent(args)\n\t\t\tbreak\n\t\tcase \"delegate\":\n\t\t\tdelegateTownTask(args)\n\t\t\tbreak\n\t\tcase \"mayor\":\n\t\t\topenTownMayor(args)\n\t\t\tbreak\n\t\tcase \"msg\":\n\t\t\tmessageTownAgent(args)\n\t\t\tbreak\n\t\tcase \"peek\":\n\t\t\tpeekTownAgent(args)\n\t\t\tbreak\n\t\tcase \"spawn\":\n\t\t\tspawnTownAgent(args)\n\t\t\tbreak\n\t\tcase \"status\":\n\t\t\tshowTownStatus(args)\n\t\t\tbreak\n\t\tcase \"stop\":\n\t\t\tstopTown(args)\n\t\t\tbreak\n\t\tcase \"watch\":\n\t\t\twatchTown(args)\n\t\t\tbreak\n\t\tcase \"doctor\": {\n\t\t\tconst result = runDoctor()\n\t\t\tif (!result.ok) process.exitCode = 1\n\t\t\tbreak\n\t\t}\n\t\tdefault:\n\t\t\tconsole.log(`Unknown command: ${command}`)\n\t\t\tprintHelp()\n\t\t\tprocess.exitCode = 1\n\t\t\tbreak\n\t}\n}\n\nif (isDirectExecution(import.meta.url)) {\n\trunCli()\n}\n"],"mappings":"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"}