@schilderlabs/pitown 0.2.1 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["writeJson","DEFAULT_MAX_ITERATIONS","packageJson.version"],"sources":["../../core/src/tasks.ts","../../core/src/loop.ts","../../core/src/orchestration.ts","../src/agent-id.ts","../src/pi-runtime.ts","../src/repo-context.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","../package.json","../src/version.ts","../src/index.ts"],"sourcesContent":["import { mkdirSync, readFileSync, readdirSync, writeFileSync } from \"node:fs\"\nimport { dirname, join } from \"node:path\"\nimport type { TaskRecord, TaskStatus } from \"./types.js\"\n\nfunction writeJson(path: string, value: unknown) {\n\tmkdirSync(dirname(path), { recursive: true })\n\twriteFileSync(path, `${JSON.stringify(value, null, 2)}\\n`, \"utf-8\")\n}\n\nexport function getTasksDir(artifactsDir: string): string {\n\treturn join(artifactsDir, \"tasks\")\n}\n\nexport function getTaskPath(artifactsDir: string, taskId: string): string {\n\treturn join(getTasksDir(artifactsDir), `${taskId}.json`)\n}\n\nexport function createTaskRecord(input: {\n\ttaskId: string\n\ttitle: string\n\tstatus: TaskStatus\n\trole: string\n\tassignedAgentId: string\n\tcreatedBy: string\n}): TaskRecord {\n\tconst now = new Date().toISOString()\n\treturn {\n\t\ttaskId: input.taskId,\n\t\ttitle: input.title,\n\t\tstatus: input.status,\n\t\trole: input.role,\n\t\tassignedAgentId: input.assignedAgentId,\n\t\tcreatedBy: input.createdBy,\n\t\tcreatedAt: now,\n\t\tupdatedAt: now,\n\t}\n}\n\nexport function writeTaskRecord(artifactsDir: string, task: TaskRecord) {\n\twriteJson(getTaskPath(artifactsDir, task.taskId), task)\n}\n\nexport function updateTaskRecordStatus(artifactsDir: string, taskId: string, status: TaskStatus): TaskRecord | null {\n\tconst task = readTaskRecord(artifactsDir, taskId)\n\tif (task === null) return null\n\n\tconst updatedTask: TaskRecord = {\n\t\t...task,\n\t\tstatus,\n\t\tupdatedAt: new Date().toISOString(),\n\t}\n\twriteTaskRecord(artifactsDir, updatedTask)\n\treturn updatedTask\n}\n\nexport function readTaskRecord(artifactsDir: string, taskId: string): TaskRecord | null {\n\tconst path = getTaskPath(artifactsDir, taskId)\n\ttry {\n\t\treturn JSON.parse(readFileSync(path, \"utf-8\")) as TaskRecord\n\t} catch {\n\t\treturn null\n\t}\n}\n\nexport function listTaskRecords(artifactsDir: string): TaskRecord[] {\n\tconst tasksDir = getTasksDir(artifactsDir)\n\tlet entries: string[]\n\ttry {\n\t\tentries = readdirSync(tasksDir)\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) => readTaskRecord(artifactsDir, entry.replace(/\\.json$/, \"\")))\n\t\t.filter((task): task is TaskRecord => task !== null)\n\t\t.sort((left, right) => left.taskId.localeCompare(right.taskId))\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\"\nimport { join } from \"node:path\"\nimport { listAgentStates } from \"./agents.js\"\nimport { runController } from \"./controller.js\"\nimport { appendJsonl } from \"./events.js\"\nimport { computeMetrics } from \"./metrics.js\"\nimport { listTaskRecords } from \"./tasks.js\"\nimport type {\n\tBoardSnapshot,\n\tControllerRunResult,\n\tLoopIterationResult,\n\tLoopOptions,\n\tLoopRunResult,\n\tLoopStopReason,\n\tMetricsSnapshot,\n} from \"./types.js\"\n\nconst DEFAULT_MAX_ITERATIONS = 10\nconst DEFAULT_MAX_WALL_TIME_MS = 3_600_000\n\nfunction createLoopId(): string {\n\treturn `loop-${new Date().toISOString().replace(/[:.]/g, \"-\")}`\n}\n\nfunction writeJson(path: string, value: unknown) {\n\twriteFileSync(path, `${JSON.stringify(value, null, 2)}\\n`, \"utf-8\")\n}\n\nexport function snapshotBoard(artifactsDir: string): BoardSnapshot {\n\tconst tasks = listTaskRecords(artifactsDir)\n\tconst agents = listAgentStates(artifactsDir)\n\n\tconst taskEntries = tasks.map((task) => ({ taskId: task.taskId, status: task.status }))\n\tconst agentEntries = agents.map((agent) => ({\n\t\tagentId: agent.agentId,\n\t\tstatus: agent.status,\n\t\tblocked: agent.blocked,\n\t}))\n\n\tconst allTasksCompleted = tasks.length > 0 && tasks.every((task) => task.status === \"completed\")\n\tconst allRemainingTasksBlocked =\n\t\ttasks.length > 0 && tasks.every((task) => task.status === \"completed\" || task.status === \"blocked\")\n\n\tconst leader = agents.find((agent) => agent.agentId === \"leader\")\n\tconst leaderBlocked = leader?.blocked === true\n\n\tconst hasQueuedOrRunningWork =\n\t\tagents.some((agent) => agent.status === \"queued\" || agent.status === \"running\" || agent.status === \"starting\") ||\n\t\ttasks.some((task) => task.status === \"queued\" || task.status === \"running\")\n\n\treturn {\n\t\ttasks: taskEntries,\n\t\tagents: agentEntries,\n\t\tallTasksCompleted,\n\t\tallRemainingTasksBlocked,\n\t\tleaderBlocked,\n\t\thasQueuedOrRunningWork,\n\t}\n}\n\nexport function evaluateStopCondition(input: {\n\titeration: number\n\tmaxIterations: number\n\telapsedMs: number\n\tmaxWallTimeMs: number\n\tpiExitCode: number\n\tstopOnPiFailure: boolean\n\tboard: BoardSnapshot\n\tmetrics: MetricsSnapshot\n\tinterruptRateThreshold: number | null\n}): { stopReason: LoopStopReason | null; continueReason: string | null } {\n\tif (input.iteration >= input.maxIterations) {\n\t\treturn { stopReason: \"max-iterations-reached\", continueReason: null }\n\t}\n\n\tif (input.elapsedMs >= input.maxWallTimeMs) {\n\t\treturn { stopReason: \"max-wall-time-reached\", continueReason: null }\n\t}\n\n\tif (input.stopOnPiFailure && input.piExitCode !== 0) {\n\t\treturn { stopReason: \"pi-exit-nonzero\", continueReason: null }\n\t}\n\n\tif (input.board.allTasksCompleted) {\n\t\treturn { stopReason: \"all-tasks-completed\", continueReason: null }\n\t}\n\n\tif (input.board.leaderBlocked) {\n\t\treturn { stopReason: \"leader-blocked\", continueReason: null }\n\t}\n\n\tif (input.board.allRemainingTasksBlocked) {\n\t\treturn { stopReason: \"all-remaining-tasks-blocked\", continueReason: null }\n\t}\n\n\tif (\n\t\tinput.interruptRateThreshold !== null &&\n\t\tinput.metrics.interruptRate > input.interruptRateThreshold\n\t) {\n\t\treturn { stopReason: \"high-interrupt-rate\", continueReason: null }\n\t}\n\n\tconst reasons: string[] = []\n\tif (input.board.hasQueuedOrRunningWork) reasons.push(\"queued or running work remains\")\n\tif (input.board.tasks.length === 0) reasons.push(\"no tasks tracked yet\")\n\tif (reasons.length === 0) reasons.push(\"leader idle, no stop condition met\")\n\n\treturn { stopReason: null, continueReason: reasons.join(\"; \") }\n}\n\nfunction aggregateMetrics(iterations: LoopIterationResult[]): MetricsSnapshot {\n\tif (iterations.length === 0) {\n\t\treturn computeMetrics({ taskAttempts: [], interrupts: [] })\n\t}\n\n\tlet totalTaskAttempts = 0\n\tlet totalCompletedTasks = 0\n\tlet totalInterrupts = 0\n\tlet totalObservedInterruptCategories = 0\n\tlet totalCoveredInterruptCategories = 0\n\tlet interruptRateSum = 0\n\tlet autonomousCompletionRateSum = 0\n\tlet contextCoverageScoreSum = 0\n\tlet mttcValues: number[] = []\n\tlet ftdValues: number[] = []\n\n\tfor (const iter of iterations) {\n\t\tconst m = iter.metrics\n\t\ttotalTaskAttempts += m.totals.taskAttempts\n\t\ttotalCompletedTasks += m.totals.completedTasks\n\t\ttotalInterrupts += m.totals.interrupts\n\t\ttotalObservedInterruptCategories += m.totals.observedInterruptCategories\n\t\ttotalCoveredInterruptCategories += m.totals.coveredInterruptCategories\n\t\tinterruptRateSum += m.interruptRate\n\t\tautonomousCompletionRateSum += m.autonomousCompletionRate\n\t\tcontextCoverageScoreSum += m.contextCoverageScore\n\t\tif (m.meanTimeToCorrectHours !== null) mttcValues.push(m.meanTimeToCorrectHours)\n\t\tif (m.feedbackToDemoCycleTimeHours !== null) ftdValues.push(m.feedbackToDemoCycleTimeHours)\n\t}\n\n\tconst count = iterations.length\n\tconst round = (v: number) => Math.round(v * 1000) / 1000\n\tconst avg = (values: number[]) => (values.length === 0 ? null : round(values.reduce((s, v) => s + v, 0) / values.length))\n\n\treturn {\n\t\tinterruptRate: round(interruptRateSum / count),\n\t\tautonomousCompletionRate: round(autonomousCompletionRateSum / count),\n\t\tcontextCoverageScore: round(contextCoverageScoreSum / count),\n\t\tmeanTimeToCorrectHours: avg(mttcValues),\n\t\tfeedbackToDemoCycleTimeHours: avg(ftdValues),\n\t\ttotals: {\n\t\t\ttaskAttempts: totalTaskAttempts,\n\t\t\tcompletedTasks: totalCompletedTasks,\n\t\t\tinterrupts: totalInterrupts,\n\t\t\tobservedInterruptCategories: totalObservedInterruptCategories,\n\t\t\tcoveredInterruptCategories: totalCoveredInterruptCategories,\n\t\t},\n\t}\n}\n\nexport function runLoop(options: LoopOptions): LoopRunResult {\n\tconst maxIterations = options.maxIterations ?? DEFAULT_MAX_ITERATIONS\n\tconst maxWallTimeMs = options.maxWallTimeMs ?? DEFAULT_MAX_WALL_TIME_MS\n\tconst stopOnPiFailure = options.stopOnPiFailure ?? true\n\tconst interruptRateThreshold = options.interruptRateThreshold ?? null\n\tconst loopId = createLoopId()\n\tconst artifactsDir = options.runOptions.artifactsDir\n\tconst loopDir = join(artifactsDir, \"loops\", loopId)\n\n\tmkdirSync(loopDir, { recursive: true })\n\n\tconst loopStartedAt = Date.now()\n\tconst iterations: LoopIterationResult[] = []\n\tlet finalStopReason: LoopStopReason = \"max-iterations-reached\"\n\n\tappendJsonl(join(loopDir, \"events.jsonl\"), {\n\t\ttype: \"loop_started\",\n\t\tloopId,\n\t\tmaxIterations,\n\t\tmaxWallTimeMs,\n\t\tstopOnPiFailure,\n\t\tcreatedAt: new Date().toISOString(),\n\t})\n\n\tfor (let iteration = 1; iteration <= maxIterations; iteration++) {\n\t\tconst iterationStart = Date.now()\n\n\t\tlet controllerResult: ControllerRunResult\n\t\ttry {\n\t\t\tcontrollerResult = runController(options.runOptions)\n\t\t} catch (error) {\n\t\t\t// If controller fails to run (e.g. lease issue), record and stop\n\t\t\tappendJsonl(join(loopDir, \"events.jsonl\"), {\n\t\t\t\ttype: \"loop_iteration_error\",\n\t\t\t\tloopId,\n\t\t\t\titeration,\n\t\t\t\terror: (error as Error).message,\n\t\t\t\tcreatedAt: new Date().toISOString(),\n\t\t\t})\n\t\t\tfinalStopReason = \"pi-exit-nonzero\"\n\t\t\tbreak\n\t\t}\n\n\t\tconst iterationElapsedMs = Date.now() - iterationStart\n\t\tconst totalElapsedMs = Date.now() - loopStartedAt\n\t\tconst board = snapshotBoard(artifactsDir)\n\t\tconst metrics = controllerResult.metrics\n\n\t\tconst { stopReason, continueReason } = evaluateStopCondition({\n\t\t\titeration,\n\t\t\tmaxIterations,\n\t\t\telapsedMs: totalElapsedMs,\n\t\t\tmaxWallTimeMs,\n\t\t\tpiExitCode: controllerResult.piInvocation.exitCode,\n\t\t\tstopOnPiFailure,\n\t\t\tboard,\n\t\t\tmetrics,\n\t\t\tinterruptRateThreshold,\n\t\t})\n\n\t\tconst iterationResult: LoopIterationResult = {\n\t\t\titeration,\n\t\t\tcontrollerResult,\n\t\t\tboardSnapshot: board,\n\t\t\tmetrics,\n\t\t\telapsedMs: iterationElapsedMs,\n\t\t\tcontinueReason,\n\t\t\tstopReason,\n\t\t}\n\n\t\titerations.push(iterationResult)\n\n\t\twriteJson(join(loopDir, `iteration-${iteration}.json`), {\n\t\t\titeration,\n\t\t\trunId: controllerResult.runId,\n\t\t\tboardSnapshot: board,\n\t\t\tmetrics,\n\t\t\telapsedMs: iterationElapsedMs,\n\t\t\tcontinueReason,\n\t\t\tstopReason,\n\t\t})\n\n\t\tappendJsonl(join(loopDir, \"events.jsonl\"), {\n\t\t\ttype: \"loop_iteration_completed\",\n\t\t\tloopId,\n\t\t\titeration,\n\t\t\trunId: controllerResult.runId,\n\t\t\tpiExitCode: controllerResult.piInvocation.exitCode,\n\t\t\tstopReason,\n\t\t\tcontinueReason,\n\t\t\tcreatedAt: new Date().toISOString(),\n\t\t})\n\n\t\tif (options.onIterationComplete) {\n\t\t\toptions.onIterationComplete(iterationResult)\n\t\t}\n\n\t\tif (stopReason !== null) {\n\t\t\tfinalStopReason = stopReason\n\t\t\tbreak\n\t\t}\n\t}\n\n\tconst totalElapsedMs = Date.now() - loopStartedAt\n\tconst finalBoard = iterations.length > 0 ? iterations[iterations.length - 1].boardSnapshot : snapshotBoard(artifactsDir)\n\tconst aggregate = aggregateMetrics(iterations)\n\n\tconst loopResult: LoopRunResult = {\n\t\tloopId,\n\t\titerations,\n\t\tstopReason: finalStopReason,\n\t\ttotalIterations: iterations.length,\n\t\ttotalElapsedMs,\n\t\tfinalBoardSnapshot: finalBoard,\n\t\taggregateMetrics: aggregate,\n\t}\n\n\twriteJson(join(loopDir, \"loop-summary.json\"), {\n\t\tloopId,\n\t\tstopReason: finalStopReason,\n\t\ttotalIterations: iterations.length,\n\t\ttotalElapsedMs,\n\t\tfinalBoardSnapshot: finalBoard,\n\t\taggregateMetrics: aggregate,\n\t})\n\n\tappendJsonl(join(loopDir, \"events.jsonl\"), {\n\t\ttype: \"loop_finished\",\n\t\tloopId,\n\t\tstopReason: finalStopReason,\n\t\ttotalIterations: iterations.length,\n\t\ttotalElapsedMs,\n\t\tcreatedAt: new Date().toISOString(),\n\t})\n\n\treturn loopResult\n}\n","import { writeFileSync } from \"node:fs\"\nimport {\n\tappendAgentMessage,\n\tcreateAgentSessionRecord,\n\tcreateAgentState,\n\tgetAgentDir,\n\tgetAgentSessionsDir,\n\tgetLatestAgentSession,\n\treadAgentState,\n\twriteAgentState,\n} from \"./agents.js\"\nimport { createTaskRecord, 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\n\textensionPath?: string | null\n\ttaskId?: string | null\n}\n\nexport interface SpawnAgentRunResult {\n\tpiResult: { stdout: string; stderr: string; exitCode: number }\n\tlatestSession: AgentSessionRecord\n\tcompletionMessage: string\n}\n\nexport interface DelegateTaskOptions {\n\trepoRoot: string\n\tartifactsDir: string\n\tfromAgentId: string\n\trole: string\n\tagentId?: string | null\n\tappendedSystemPrompt?: string | null\n\textensionPath?: string | null\n\ttask: string\n}\n\nexport interface DelegateTaskResult {\n\ttask: TaskRecord\n\tagentId: string\n\tpiResult: { stdout: string; stderr: string; exitCode: number }\n\tlatestSession: AgentSessionRecord\n}\n\nexport interface ResolvedAgentSession {\n\tstate: AgentStateSnapshot\n\tsession: AgentSessionRecord\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\n\textensionPath?: string | null\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\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 \"leader\":\n\t\t\treturn [\n\t\t\t\t\"You are the Pi Town leader.\",\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\tlastAttachedAt: new Date().toISOString(),\n\t\t}),\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\tlastAttachedAt: state.session.lastAttachedAt,\n\t\t\t}),\n\t\t}),\n\t)\n}\n\nexport function updateAgentStatus(input: {\n\tartifactsDir: string\n\tagentId: string\n\tstatus: \"queued\" | \"running\" | \"idle\" | \"blocked\" | \"completed\" | \"failed\"\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 === \"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 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,\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 ? `${options.role} run completed` : `${options.role} run 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\twriteAgentState(\n\t\toptions.artifactsDir,\n\t\tcreateAgentState({\n\t\t\t...state,\n\t\t\tstatus: piResult.exitCode === 0 ? \"idle\" : \"blocked\",\n\t\t\tlastMessage: completionMessage,\n\t\t\tblocked: piResult.exitCode !== 0,\n\t\t\twaitingOn: piResult.exitCode === 0 ? null : \"human-or-follow-up-run\",\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}),\n\t\t}),\n\t)\n\n\treturn { piResult, latestSession, completionMessage }\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}),\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 { piResult, 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\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: piResult.exitCode === 0 ? \"completed\" : \"blocked\",\n\t\tupdatedAt: new Date().toISOString(),\n\t})\n\n\treturn {\n\t\ttask: {\n\t\t\t...task,\n\t\t\tstatus: piResult.exitCode === 0 ? \"completed\" : \"blocked\",\n\t\t\tupdatedAt: new Date().toISOString(),\n\t\t},\n\t\tagentId,\n\t\tpiResult,\n\t\tlatestSession,\n\t}\n}\n","export function normalizeAgentId(agentId: string): string {\n\treturn agentId === \"mayor\" ? \"leader\" : 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 === \"leader\" || 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 { existsSync, readFileSync } from \"node:fs\"\nimport { createRepoSlug, getRepoIdentity, getRepoRoot, isGitRepo } from \"../../core/src/index.js\"\nimport { parseOptionalRepoFlag } from \"./config.js\"\nimport { getLatestRunPointerPath, getRepoArtifactsDir } from \"./paths.js\"\n\ninterface LatestRunPointer {\n\trepoSlug: string\n\trepoRoot: string\n}\n\nexport interface ResolvedRepoContext {\n\trepoRoot: string\n\trepoSlug: string\n\tartifactsDir: string\n\trest: string[]\n}\n\nexport function resolveRepoContext(argv: string[]): ResolvedRepoContext {\n\tconst { repo, rest } = parseOptionalRepoFlag(argv)\n\n\tif (repo) {\n\t\tconst repoRoot = getRepoRoot(repo)\n\t\tconst repoSlug = createRepoSlug(getRepoIdentity(repoRoot), repoRoot)\n\t\treturn {\n\t\t\trepoRoot,\n\t\t\trepoSlug,\n\t\t\tartifactsDir: getRepoArtifactsDir(repoSlug),\n\t\t\trest,\n\t\t}\n\t}\n\n\tconst cwd = process.cwd()\n\tconst repoRoot = getRepoRoot(cwd)\n\tconst repoSlug = createRepoSlug(getRepoIdentity(repoRoot), repoRoot)\n\tconst artifactsDir = getRepoArtifactsDir(repoSlug)\n\tif (isGitRepo(cwd) || existsSync(artifactsDir)) {\n\t\treturn {\n\t\t\trepoRoot,\n\t\t\trepoSlug,\n\t\t\tartifactsDir,\n\t\t\trest,\n\t\t}\n\t}\n\n\tconst latestPointerPath = getLatestRunPointerPath()\n\tif (!existsSync(latestPointerPath)) {\n\t\treturn {\n\t\t\trepoRoot,\n\t\t\trepoSlug,\n\t\t\tartifactsDir,\n\t\t\trest,\n\t\t}\n\t}\n\n\tconst latest = JSON.parse(readFileSync(latestPointerPath, \"utf-8\")) as LatestRunPointer\n\treturn {\n\t\trepoRoot: latest.repoRoot,\n\t\trepoSlug: latest.repoSlug,\n\t\tartifactsDir: getRepoArtifactsDir(latest.repoSlug),\n\t\trest,\n\t}\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 { listAgentStates } from \"../../core/src/index.js\"\nimport { getRepoAgentsDir } from \"./paths.js\"\nimport { resolveRepoContext } from \"./repo-context.js\"\n\nexport function showTownBoard(argv = process.argv.slice(2)) {\n\tconst repo = resolveRepoContext(argv)\n\tconst agents = listAgentStates(repo.artifactsDir)\n\n\tconsole.log(\"[pitown] board\")\n\tconsole.log(`- repo root: ${repo.repoRoot}`)\n\tconsole.log(`- agents dir: ${getRepoAgentsDir(repo.repoSlug)}`)\n\n\tif (agents.length === 0) {\n\t\tconsole.log(\"- no agents found yet\")\n\t\treturn\n\t}\n\n\tfor (const agent of agents) {\n\t\tconst task = agent.task ?? \"no active task\"\n\t\tconst note = agent.lastMessage ? ` | ${agent.lastMessage}` : \"\"\n\t\tconst waitingOn = agent.waitingOn ? ` | waiting on: ${agent.waitingOn}` : \"\"\n\t\tconst taskId = agent.taskId ? ` [${agent.taskId}]` : \"\"\n\t\tconsole.log(`${agent.agentId.padEnd(12)} ${agent.status.padEnd(8)} ${task}${taskId}${note}${waitingOn}`)\n\t}\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 { 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 | null\n}\n\nfunction parseDelegateFlags(argv: string[]): DelegateFlags {\n\tlet from = \"leader\"\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\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, piResult, 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})\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(`- pi exit code: ${piResult.exitCode}`)\n\tif (latestSession.sessionPath) console.log(`- session: ${latestSession.sessionPath}`)\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\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 leaderStatus = board.agents.find((a) => a.agentId === \"leader\")?.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}, leader ${leaderStatus}`)\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, \"leader\")\n\twriteAgentState(\n\t\tartifactsDir,\n\t\tcreateAgentState({\n\t\t\tagentId: \"leader\",\n\t\t\trole: \"leader\",\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: \"leader\",\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, \"leader\")\n\tconst previousState = readAgentState(artifactsDir, \"leader\")\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, \"leader\")\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 === \"leader\"\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(`- leader 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}\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\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 { piResult, 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(`- pi exit code: ${piResult.exitCode}`)\n\tif (task) console.log(`- task: ${task}`)\n\tif (latestSession.sessionPath) console.log(`- session: ${latestSession.sessionPath}`)\n}\n","","import packageJson from \"../package.json\" with { type: \"json\" }\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 { 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\",\n\t\t\t' pitown mayor [--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>] mayor \"message\"',\n\t\t\t\" pitown status [--repo <path>]\",\n\t\t\t\" pitown doctor\",\n\t\t\t\" pitown help\",\n\t\t\t\" pitown help --all\",\n\t\t\t\" pitown --help\",\n\t\t\t\" pitown -v\",\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 mayor\",\n\t\t\t' pitown mayor \"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\"\",\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\tif (result.piInvocation.exitCode !== 0) process.exitCode = result.piInvocation.exitCode\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 \"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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"}
1
+ {"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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"}