@agentproto/worktree 0.2.0 → 0.3.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/exec.ts","../src/glob.ts","../src/config.ts","../src/env.ts","../src/lifecycle.ts","../src/provenance.ts","../src/provider/bodies/provision-worktree.body.ts","../src/services/ports.ts","../src/services/slug.ts","../src/services/supervisor.ts","../src/services/proxy-table.ts","../src/services/context.ts","../src/services/runtime.ts","../src/status.ts","../src/provider/bodies/cleanup-worktree.body.ts","../src/provider/bodies/run-gate.body.ts","../src/provider/bodies/run-script.body.ts","../src/provider/bodies/start-service.body.ts","../src/provider/bodies/stop-service.body.ts","../src/provider/bodies/list-services.body.ts","../src/provider/worktree-provider.ts"],"names":["z","resolve","join","spawn","homedir","readFile","mkdir","dirname","writeFile","implementTool","ToolError"],"mappings":"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","file":"chunk-SEVCUXPY.mjs","sourcesContent":["import { spawn } from \"node:child_process\"\n\nexport interface ExecResult {\n exitCode: number\n stdout: string\n stderr: string\n}\n\n/** Extra `AGENTPROTO_*` (or any) vars, merged onto `process.env` for the child. */\nexport interface ExecOptions {\n env?: Record<string, string>\n}\n\n/** Merge caller-supplied vars onto the inherited env (caller wins). */\nfunction mergedEnv(extra: Record<string, string> | undefined): NodeJS.ProcessEnv {\n return extra ? { ...process.env, ...extra } : process.env\n}\n\n/** Run an argv (no shell — args pass through verbatim, no injection risk). */\nexport function execArgv(\n command: string,\n args: readonly string[],\n cwd: string,\n opts: ExecOptions = {},\n): Promise<ExecResult> {\n return new Promise((resolvePromise, reject) => {\n const child = spawn(command, args, { cwd, shell: false, env: mergedEnv(opts.env) })\n let stdout = \"\"\n let stderr = \"\"\n child.stdout?.on(\"data\", (d) => (stdout += d.toString(\"utf8\")))\n child.stderr?.on(\"data\", (d) => (stderr += d.toString(\"utf8\")))\n child.on(\"error\", reject)\n child.on(\"close\", (code) => resolvePromise({ exitCode: code ?? -1, stdout, stderr }))\n })\n}\n\n/**\n * Run a single command string through a shell. Callers pass `depsCmd` /\n * `gateCmd` / a config `setup` line as a trusted, developer-authored value\n * (the same trust model as a CI job's `script:` line) — not untrusted\n * end-user input. `opts.env` layers `AGENTPROTO_*` vars onto the child.\n */\nexport function execShell(cmd: string, cwd: string, opts: ExecOptions = {}): Promise<ExecResult> {\n return new Promise((resolvePromise, reject) => {\n const child = spawn(cmd, { cwd, shell: true, env: mergedEnv(opts.env) })\n let stdout = \"\"\n let stderr = \"\"\n child.stdout?.on(\"data\", (d) => (stdout += d.toString(\"utf8\")))\n child.stderr?.on(\"data\", (d) => (stderr += d.toString(\"utf8\")))\n child.on(\"error\", reject)\n child.on(\"close\", (code) => resolvePromise({ exitCode: code ?? -1, stdout, stderr }))\n })\n}\n\nexport async function execGit(repoRoot: string, args: readonly string[]): Promise<ExecResult> {\n // `repoRoot` is the main repo root (resolved via --git-common-dir upstream),\n // which always exists — so it's a safe spawn cwd even mid-archive, when the\n // worktree being torn down has already been removed.\n const result = await execArgv(\"git\", [\"-C\", repoRoot, ...args], repoRoot)\n if (result.exitCode !== 0) {\n throw new Error(`git ${args.join(\" \")} failed (exit ${result.exitCode}): ${result.stderr || result.stdout}`)\n }\n return result\n}\n","import { readdir } from \"node:fs/promises\"\nimport { join, posix } from \"node:path\"\n\nfunction escapeSegment(seg: string): string {\n let out = \"\"\n for (const ch of seg) {\n if (ch === \"*\") out += \"[^/]*\"\n else if (ch === \"?\") out += \"[^/]\"\n else out += ch.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n }\n return out\n}\n\n/** Compile a `/`-separated glob (supporting `*`, `?`, `**`) into an anchored regex. */\nexport function globToRegExp(pattern: string): RegExp {\n const segments = pattern.split(\"/\")\n let out = \"^\"\n segments.forEach((seg, i) => {\n const isLast = i === segments.length - 1\n if (seg === \"**\") {\n out += isLast ? \".*\" : \"(?:[^/]+/)*\"\n return\n }\n out += escapeSegment(seg)\n if (!isLast) out += \"/\"\n })\n return new RegExp(out + \"$\")\n}\n\n/** The literal (non-wildcard) directory prefix of a glob — where to start walking. */\nfunction globBaseDir(pattern: string): string {\n const segments = pattern.split(\"/\")\n const literal: string[] = []\n for (const seg of segments) {\n if (seg.includes(\"*\") || seg.includes(\"?\")) break\n literal.push(seg)\n }\n // Drop the last literal segment if it's the pattern's final segment (a filename),\n // not a directory to walk into.\n if (literal.length === segments.length) literal.pop()\n return literal.join(\"/\")\n}\n\nasync function walk(root: string, dirRel: string): Promise<string[]> {\n const abs = dirRel ? join(root, dirRel) : root\n let entries\n try {\n entries = await readdir(abs, { withFileTypes: true })\n } catch {\n return []\n }\n const out: string[] = []\n for (const entry of entries) {\n if (entry.name === \".git\" || entry.name === \"node_modules\") continue\n const rel = dirRel ? posix.join(dirRel, entry.name) : entry.name\n // entry.isDirectory() is false for symlinked dirs (Dirent reports the link's own\n // type, not the target's) — keep it that way so we never follow symlinks.\n if (entry.isDirectory()) {\n const children = await walk(root, rel)\n for (const child of children) out.push(child)\n } else if (entry.isFile()) {\n out.push(rel)\n }\n }\n return out\n}\n\n/** Expand a glob against `root`, returning root-relative posix paths of matching files. */\nexport async function expandGlob(root: string, pattern: string): Promise<string[]> {\n const regex = globToRegExp(pattern)\n const base = globBaseDir(pattern)\n const candidates = await walk(root, base)\n return candidates.filter((rel) => regex.test(rel))\n}\n","import { z } from \"zod\"\nimport { execArgv } from \"./exec.js\"\n\n/**\n * `agentproto.json` — the declarative per-repo worktree lifecycle.\n *\n * SECURITY: this file is always read from the **committed tree of the base\n * ref** (`git show <base>:agentproto.json`), never from a worktree's working\n * tree. A branch (or an agent editing files inside a worktree) therefore\n * cannot inject setup/teardown hooks or service commands that run on the host\n * — only what a reviewer merged into the base branch executes.\n */\nexport const CONFIG_FILENAME = \"agentproto.json\"\n\n/** A hook body: one multiline shell string, or a list of commands run in order. */\nconst hookSchema = z.union([z.string(), z.array(z.string())])\n\n/** `scripts.<name>` — a command, optionally a long-running service with a port. */\nconst scriptSchema = z.object({\n command: z.string().min(1, \"script command must be non-empty\"),\n type: z.literal(\"service\").optional(),\n port: z.number().int().min(1).max(65535).optional(),\n})\n\nconst configSchema = z.object({\n worktree: z\n .object({\n setup: hookSchema.optional(),\n teardown: hookSchema.optional(),\n })\n .optional(),\n scripts: z.record(z.string(), scriptSchema).optional(),\n})\n\nexport type ScriptConfig = z.infer<typeof scriptSchema>\nexport type AgentprotoConfig = z.infer<typeof configSchema>\n\n/** A validation failure with the offending file surfaced for error messages. */\nexport class ConfigError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"ConfigError\"\n }\n}\n\n/**\n * Parse + validate raw `agentproto.json` text. Throws {@link ConfigError} on\n * malformed JSON or a schema violation.\n */\nexport function parseConfig(raw: string): AgentprotoConfig {\n let json: unknown\n try {\n json = JSON.parse(raw)\n } catch (err) {\n throw new ConfigError(\n `${CONFIG_FILENAME} is not valid JSON: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n const result = configSchema.safeParse(json)\n if (!result.success) {\n const issues = result.error.issues\n .map((i) => `${i.path.join(\".\") || \"<root>\"}: ${i.message}`)\n .join(\"; \")\n throw new ConfigError(`${CONFIG_FILENAME} failed validation: ${issues}`)\n }\n return result.data\n}\n\n/** Normalise a hook (string | string[] | undefined) into an ordered command list. */\nexport function normalizeHook(hook: string | readonly string[] | undefined): string[] {\n if (hook === undefined) return []\n return typeof hook === \"string\" ? [hook] : [...hook]\n}\n\n/** A named script, with its config attached — the shape supervisor/tools consume. */\nexport interface NamedScript extends ScriptConfig {\n name: string\n}\n\n/** All declared scripts as a list. */\nexport function listScripts(config: AgentprotoConfig): NamedScript[] {\n return Object.entries(config.scripts ?? {}).map(([name, cfg]) => ({ name, ...cfg }))\n}\n\n/** Only the `type: \"service\"` scripts. */\nexport function listServices(config: AgentprotoConfig): NamedScript[] {\n return listScripts(config).filter((s) => s.type === \"service\")\n}\n\n/** Look up a single named script, or `undefined` if it isn't declared. */\nexport function getScript(config: AgentprotoConfig, name: string): NamedScript | undefined {\n const cfg = config.scripts?.[name]\n return cfg ? { name, ...cfg } : undefined\n}\n\n/**\n * Load `agentproto.json` from the **committed tree** of `base` (default\n * `origin/main`) via `git show <base>:agentproto.json`. Returns `null` when\n * the base tree has no such file (the common \"repo hasn't opted in\" case).\n * Throws {@link ConfigError} on a present-but-invalid file.\n */\nexport async function loadConfigFromBase(\n repoRoot: string,\n base = \"origin/main\",\n): Promise<AgentprotoConfig | null> {\n const spec = `${base}:${CONFIG_FILENAME}`\n const result = await execArgv(\"git\", [\"-C\", repoRoot, \"show\", spec], repoRoot)\n if (result.exitCode !== 0) {\n // `git show` fails when the path doesn't exist in the tree, or the ref is\n // unknown. Treat \"no config\" (path/ref absent) as opt-out; surface other\n // git failures so a typo'd base ref isn't silently ignored.\n const stderr = result.stderr.toLowerCase()\n const pathAbsent =\n stderr.includes(\"does not exist\") || stderr.includes(\"exists on disk, but not in\")\n const refAbsent =\n stderr.includes(\"unknown revision\") ||\n stderr.includes(\"bad revision\") ||\n stderr.includes(\"invalid object name\") ||\n stderr.includes(\"ambiguous argument\")\n if (pathAbsent || refAbsent) return null\n throw new ConfigError(\n `could not read ${CONFIG_FILENAME} from '${spec}': ${result.stderr.trim() || `git exited ${result.exitCode}`}`,\n )\n }\n return parseConfig(result.stdout)\n}\n","/**\n * Typed env surface for worktree lifecycle hooks, scripts, and services.\n *\n * Every `AGENTPROTO_*` variable the lifecycle feature injects is named here\n * once — bodies compose env via {@link hookEnv} / {@link serviceEnv} rather\n * than reading `process.env` (or writing literal `\"AGENTPROTO_...\"` keys)\n * ad hoc. Keeps the contract in one place and the derivations testable.\n */\n\n/** The `AGENTPROTO_*` variables injected into every hook / script / service. */\nexport const ENV_VARS = {\n /** Absolute path to the original repo checkout the worktree was cut from. */\n sourceCheckoutPath: \"AGENTPROTO_SOURCE_CHECKOUT_PATH\",\n /** Absolute path to the worktree directory. */\n worktreePath: \"AGENTPROTO_WORKTREE_PATH\",\n /** The worktree's branch name. */\n branchName: \"AGENTPROTO_BRANCH_NAME\",\n /** A service's own allocated port. */\n port: \"AGENTPROTO_PORT\",\n /** A service's own reverse-proxy URL. */\n url: \"AGENTPROTO_URL\",\n} as const\n\n/** The shared context every worktree lifecycle command runs against. */\nexport interface WorktreeEnvContext {\n /** Absolute path to the original repo checkout. */\n sourceCheckoutPath: string\n /** Absolute path to the worktree directory. */\n worktreePath: string\n /** The worktree's branch name. */\n branchName: string\n}\n\n/**\n * Base env shared by hooks, scripts, and services — the worktree location and\n * the branch/checkout it derives from. Values are strings only (never\n * `undefined`), so the result merges cleanly onto `process.env`.\n */\nexport function hookEnv(ctx: WorktreeEnvContext): Record<string, string> {\n return {\n [ENV_VARS.sourceCheckoutPath]: ctx.sourceCheckoutPath,\n [ENV_VARS.worktreePath]: ctx.worktreePath,\n [ENV_VARS.branchName]: ctx.branchName,\n }\n}\n\n/** A sibling service, as seen by a peer's env. */\nexport interface PeerService {\n /** The declared script name (e.g. `\"web\"`). */\n name: string\n /** The port the service listens on. */\n port: number\n /** The service's reverse-proxy URL. */\n url: string\n}\n\n/**\n * Upper-case a service name and replace every non-alphanumeric run with a\n * single `_`, for use inside an env var key (`web-api` → `WEB_API`).\n */\nexport function serviceEnvToken(name: string): string {\n return name\n .toUpperCase()\n .replace(/[^A-Z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n}\n\n/** `AGENTPROTO_SERVICE_<TOKEN>_PORT` / `..._URL` for a named peer. */\nexport function peerEnvKey(name: string, suffix: \"PORT\" | \"URL\"): string {\n return `AGENTPROTO_SERVICE_${serviceEnvToken(name)}_${suffix}`\n}\n\n/**\n * Peer-discovery env for a set of sibling services: each contributes\n * `AGENTPROTO_SERVICE_<NAME>_PORT` and `AGENTPROTO_SERVICE_<NAME>_URL`.\n */\nexport function peerEnv(peers: readonly PeerService[]): Record<string, string> {\n const out: Record<string, string> = {}\n for (const peer of peers) {\n out[peerEnvKey(peer.name, \"PORT\")] = String(peer.port)\n out[peerEnvKey(peer.name, \"URL\")] = peer.url\n }\n return out\n}\n\n/**\n * Full env for a running service: the shared {@link hookEnv}, the service's\n * own `AGENTPROTO_PORT` / `AGENTPROTO_URL`, and {@link peerEnv} for every\n * sibling.\n */\nexport function serviceEnv(args: {\n ctx: WorktreeEnvContext\n self: PeerService\n peers: readonly PeerService[]\n}): Record<string, string> {\n return {\n ...hookEnv(args.ctx),\n [ENV_VARS.port]: String(args.self.port),\n [ENV_VARS.url]: args.self.url,\n ...peerEnv(args.peers),\n }\n}\n","import { normalizeHook, type AgentprotoConfig } from \"./config.js\"\nimport { hookEnv, type WorktreeEnvContext } from \"./env.js\"\nimport { execShell, type ExecResult } from \"./exec.js\"\n\n/** One hook command's result, kept for error reporting / logging. */\nexport interface HookRun {\n command: string\n result: ExecResult\n}\n\n/** Raised when a `setup` hook exits non-zero — carries the captured output. */\nexport class HookError extends Error {\n readonly command: string\n readonly result: ExecResult\n constructor(phase: \"setup\" | \"teardown\", run: HookRun) {\n super(\n `worktree ${phase} hook failed (exit ${run.result.exitCode}): ${run.command}\\n` +\n (run.result.stderr || run.result.stdout).trim(),\n )\n this.name = \"HookError\"\n this.command = run.command\n this.result = run.result\n }\n}\n\n/**\n * Run the `worktree.setup` hooks sequentially in the worktree, with the\n * `AGENTPROTO_*` context env injected. The first non-zero exit throws\n * {@link HookError} (setup failure must fail provisioning). No-op when the\n * repo declares no setup.\n */\nexport async function runSetup(\n config: AgentprotoConfig,\n ctx: WorktreeEnvContext,\n): Promise<HookRun[]> {\n const commands = normalizeHook(config.worktree?.setup)\n const runs: HookRun[] = []\n const env = hookEnv(ctx)\n for (const command of commands) {\n const result = await execShell(command, ctx.worktreePath, { env })\n const run = { command, result }\n runs.push(run)\n if (result.exitCode !== 0) throw new HookError(\"setup\", run)\n }\n return runs\n}\n\n/**\n * Run the `worktree.teardown` hooks sequentially. Unlike setup, a failing\n * teardown hook does NOT throw — cleanup must proceed — so failures are\n * returned for the caller to log. No-op when no teardown is declared.\n */\nexport async function runTeardown(\n config: AgentprotoConfig,\n ctx: WorktreeEnvContext,\n): Promise<HookRun[]> {\n const commands = normalizeHook(config.worktree?.teardown)\n const runs: HookRun[] = []\n const env = hookEnv(ctx)\n for (const command of commands) {\n const result = await execShell(command, ctx.worktreePath, { env })\n runs.push({ command, result })\n }\n return runs\n}\n","/**\n * Provenance — which session(s) worked in this worktree, historically,\n * including dead ones (PLAN.md §1.5). Not a fourth status axis: it never\n * changes `class`, only triage (\"what was the session doing when it\n * stranded these files?\").\n *\n * The join is over the EXISTING sessions registry\n * (`~/.agentproto/sessions.json`, `packages/runtime/src/sessions.ts`) —\n * upholding the no-registry principle (PLAN.md §1.4): nothing new is\n * mirrored, this only reads a file another package already owns and\n * persists. Read directly off disk (not via a running daemon) so `worktree\n * ls --status` works with no daemon required, matching `worktree check`'s\n * posture (PLAN.md §3.3).\n *\n * Two known limits, both designed in rather than hidden (PLAN.md §1.5):\n * - `sessions.json` is a recency window (`HISTORY_CAP = 200`,\n * `packages/runtime/src/sessions.ts:583`), not an archive — an old\n * worktree's sessions may already be evicted.\n * - Without a per-worktree creation marker, the join can span\n * generations (a worktree removed and recreated at the same path\n * inherits the old generation's sessions). PR-B writes that marker\n * (`agentproto-worktree.json` in the worktree's private gitdir); this PR\n * only reads it if present and is honest — `confidence: \"best-effort\"`\n * — when it's absent, which is every worktree today.\n */\n\nimport { readFile, writeFile } from \"node:fs/promises\"\nimport { homedir } from \"node:os\"\nimport { sep } from \"node:path\"\nimport { resolve } from \"node:path\"\nimport { z } from \"zod\"\nimport { execArgv } from \"./exec.js\"\n\nexport const SESSIONS_FILE_PATH = (): string => resolve(homedir(), \".agentproto\", \"sessions.json\")\n\n/** The subset of `SessionDescriptor` (`packages/runtime/src/sessions.ts`) provenance needs. */\nconst sessionRefSchema = z.object({\n id: z.string(),\n label: z.string().optional(),\n startedAt: z.string(),\n endedAt: z.string().optional(),\n status: z.string(),\n cwd: z.string().optional(),\n})\nexport type SessionRef = z.infer<typeof sessionRefSchema>\n\nconst sessionsFileSchema = z.object({ sessions: z.array(z.unknown()) })\n\nexport type ProvenanceConfidence = \"exact\" | \"best-effort\"\n\nexport interface ProvenanceInfo {\n confidence: ProvenanceConfidence\n sessions: SessionRef[]\n}\n\n/**\n * Read the persisted sessions snapshot. Missing file (no daemon has ever\n * run) is a legitimate empty registry, not an error — mirrors\n * `loadHistorySnapshot`'s own ENOENT handling in `sessions.ts`. A malformed\n * file (present but unparseable) is surfaced by returning `null` so callers\n * can distinguish \"no history\" from \"history is unreadable\".\n */\nexport async function readSessionsRegistry(path: string = SESSIONS_FILE_PATH()): Promise<SessionRef[] | null> {\n let raw: string\n try {\n raw = await readFile(path, \"utf8\")\n } catch (err) {\n if (typeof err === \"object\" && err !== null && Reflect.get(err, \"code\") === \"ENOENT\") return []\n return null\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch {\n return null\n }\n const file = sessionsFileSchema.safeParse(parsed)\n if (!file.success) return null\n const refs: SessionRef[] = []\n for (const entry of file.data.sessions) {\n const ref = sessionRefSchema.safeParse(entry)\n if (ref.success) refs.push(ref.data)\n }\n return refs\n}\n\n/** `session.cwd == wtPath || session.cwd.startsWith(wtPath + sep)` (PLAN.md §1.5 — containment, not equality). */\nexport function sessionInWorktree(session: SessionRef, worktreePath: string): boolean {\n if (session.cwd === undefined) return false\n return session.cwd === worktreePath || session.cwd.startsWith(worktreePath + sep)\n}\n\n/** The creation marker PR-B writes into `$(git rev-parse --git-dir)/agentproto-worktree.json`. */\nconst worktreeMarkerSchema = z.object({\n worktreeId: z.string(),\n createdAt: z.string(),\n createdBySessionId: z.string().optional(),\n})\nexport type WorktreeMarker = z.infer<typeof worktreeMarkerSchema>\n\n/**\n * Read the per-worktree creation marker, if PR-B has written one. This PR\n * never writes it — only reads, so a worktree created before PR-B shipped\n * (all of them, today) honestly reports `confidence: \"best-effort\"`.\n */\nexport async function readWorktreeMarker(worktreePath: string): Promise<WorktreeMarker | null> {\n const gitDirRes = await execArgv(\n \"git\",\n [\"-C\", worktreePath, \"rev-parse\", \"--path-format=absolute\", \"--git-dir\"],\n worktreePath,\n )\n if (gitDirRes.exitCode !== 0) return null\n const gitDir = gitDirRes.stdout.trim()\n if (!gitDir) return null\n let raw: string\n try {\n raw = await readFile(resolve(gitDir, \"agentproto-worktree.json\"), \"utf8\")\n } catch {\n return null\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch {\n return null\n }\n const result = worktreeMarkerSchema.safeParse(parsed)\n return result.success ? result.data : null\n}\n\n/**\n * Write the creation marker into `$(git rev-parse --git-dir)/agentproto-\n * worktree.json` — the worktree's own private gitdir, not the shared\n * `.git/config` (PLAN.md §1.5 rejected `git config --local` for exactly\n * this reason: in a linked worktree it reads/writes the main repo's shared\n * config, so it wouldn't die with the worktree and would collide across\n * worktrees). Called once, by `worktree.provision`, right after the\n * worktree is created; nothing else ever rewrites it.\n */\nexport async function writeWorktreeMarker(worktreePath: string, marker: WorktreeMarker): Promise<void> {\n const gitDirRes = await execArgv(\n \"git\",\n [\"-C\", worktreePath, \"rev-parse\", \"--path-format=absolute\", \"--git-dir\"],\n worktreePath,\n )\n if (gitDirRes.exitCode !== 0) {\n throw new Error(\n `git rev-parse --git-dir failed in ${worktreePath} (exit ${gitDirRes.exitCode}): ${gitDirRes.stderr.trim()}`,\n )\n }\n const gitDir = gitDirRes.stdout.trim()\n await writeFile(resolve(gitDir, \"agentproto-worktree.json\"), JSON.stringify(marker, null, 2) + \"\\n\", \"utf8\")\n}\n\nexport interface ComputeProvenanceOptions {\n sessionsPath?: string\n}\n\n/**\n * The §1.5 join: sessions whose `cwd` is contained in `worktreePath`,\n * bounded by the marker's `createdAt` when present (filters out sessions\n * from a prior generation at the same path). `confidence` is `\"exact\"` only\n * when that marker exists; otherwise `\"best-effort\"` — the join may span\n * generations and is bounded by `HISTORY_CAP`'s recency window.\n */\nexport async function computeProvenance(\n worktreePath: string,\n options: ComputeProvenanceOptions = {},\n): Promise<ProvenanceInfo> {\n const [registry, marker] = await Promise.all([\n readSessionsRegistry(options.sessionsPath ?? SESSIONS_FILE_PATH()),\n readWorktreeMarker(worktreePath),\n ])\n const sessions = registry ?? []\n const matched = sessions\n .filter((s) => sessionInWorktree(s, worktreePath))\n .filter((s) => (marker ? s.startedAt >= marker.createdAt : true))\n .sort((a, b) => a.startedAt.localeCompare(b.startedAt))\n return {\n confidence: marker ? \"exact\" : \"best-effort\",\n sessions: matched,\n }\n}\n","import { randomUUID } from \"node:crypto\"\nimport { mkdir, copyFile, symlink, lstat } from \"node:fs/promises\"\nimport { dirname, join, resolve } from \"node:path\"\nimport { implementTool } from \"@agentproto/driver\"\nimport { ToolError } from \"@agentproto/tool\"\nimport { provisionWorktreeTool } from \"../../tools/provision-worktree.tool.js\"\nimport { execGit, execShell } from \"../../exec.js\"\nimport { expandGlob } from \"../../glob.js\"\nimport { loadConfigFromBase } from \"../../config.js\"\nimport { runSetup, HookError } from \"../../lifecycle.js\"\nimport { writeWorktreeMarker } from \"../../provenance.js\"\n\nexport const provisionWorktreeBuiltin = implementTool(\n provisionWorktreeTool,\n async ({ input }) => {\n const base = input.base ?? \"origin/main\"\n const branch = input.branch ?? `wt/${input.slug}`\n const cwd = input.dir ? resolve(input.dir) : resolve(input.repoRoot, \"..\", \"_worktrees\", input.slug)\n\n await execGit(input.repoRoot, [\"worktree\", \"add\", \"-b\", branch, cwd, base])\n\n // PLAN.md §1.5: the creation marker, written once, right after the\n // worktree exists. Lives in the worktree's own private gitdir, so it\n // dies with `git worktree remove`/`prune` and never shows up in `git\n // status` — colocated with the artifact it describes, not a registry.\n // `createdBySessionId` is omitted: nothing in this codebase threads a\n // session id into `worktree.provision` today (it runs before any\n // session is spawned into the worktree), and recording a guess would be\n // worse than the honest `best-effort` provenance callers already fall\n // back to.\n await writeWorktreeMarker(cwd, {\n worktreeId: `wt_${randomUUID().slice(0, 8)}`,\n createdAt: new Date().toISOString(),\n })\n\n // Symlink gitignored, expensive-to-recreate trees from the host repo into\n // the worktree BEFORE depsCmd, so a workspace whose graph spans gitignored\n // dirs (sibling repos, node_modules) resolves without a full reinstall.\n for (const rel of input.linkPaths ?? []) {\n const target = resolve(input.repoRoot, rel)\n const dest = join(cwd, rel)\n // A fresh worktree shouldn't already carry a gitignored path; if it does\n // (a tracked dir, or a re-run), leave it untouched rather than clobber.\n const existing = await lstat(dest).catch(() => null)\n if (existing) continue\n await mkdir(dirname(dest), { recursive: true })\n await symlink(target, dest, \"dir\")\n }\n\n if (input.depsCmd) {\n const result = await execShell(input.depsCmd, cwd)\n if (result.exitCode !== 0) {\n throw new ToolError({\n code: \"execution_failed\",\n message: `depsCmd '${input.depsCmd}' failed (exit ${result.exitCode}): ${result.stderr || result.stdout}`,\n })\n }\n }\n\n for (const pattern of input.copyGlobs ?? []) {\n const matches = await expandGlob(input.repoRoot, pattern)\n for (const rel of matches) {\n const dest = join(cwd, rel)\n await mkdir(dirname(dest), { recursive: true })\n await copyFile(join(input.repoRoot, rel), dest)\n }\n }\n\n // Declarative lifecycle: run the repo's committed `agentproto.json` setup\n // hooks in the fresh worktree. Read from the base tree (never the working\n // tree) so a branch/agent can't inject host-side commands. A failing setup\n // hook fails provisioning, carrying the captured output.\n if (input.runSetup !== false) {\n const config = await loadConfigFromBase(input.repoRoot, base)\n if (config) {\n try {\n await runSetup(config, {\n sourceCheckoutPath: input.repoRoot,\n worktreePath: cwd,\n branchName: branch,\n })\n } catch (err) {\n if (err instanceof HookError) {\n throw new ToolError({ code: \"execution_failed\", message: err.message })\n }\n throw err\n }\n }\n }\n\n return { cwd, branch }\n },\n)\n","import { createServer } from \"node:net\"\n\n/**\n * Port allocation for supervised services.\n *\n * A service declares a preferred `port`; we use it if free, otherwise we fall\n * back to an OS-assigned ephemeral port. Allocation binds a probe socket on\n * 127.0.0.1 to decide — there's an inherent TOCTOU window between the probe\n * closing and the service binding, but for local dev supervision that's the\n * same race every \"is this port free\" check has, and the service will simply\n * fail to bind if something grabbed it in between.\n */\n\n/** Resolve to `true` if a TCP listen on `127.0.0.1:<port>` succeeds. */\nexport function isPortFree(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const server = createServer()\n server.once(\"error\", () => resolve(false))\n server.once(\"listening\", () => {\n server.close(() => resolve(true))\n })\n server.listen(port, \"127.0.0.1\")\n })\n}\n\n/** Ask the OS for a free ephemeral port (bind to 0, read the assigned port). */\nexport function ephemeralPort(): Promise<number> {\n return new Promise((resolve, reject) => {\n const server = createServer()\n server.once(\"error\", reject)\n server.listen(0, \"127.0.0.1\", () => {\n const address = server.address()\n if (address && typeof address === \"object\") {\n const port = address.port\n server.close(() => resolve(port))\n } else {\n server.close(() => reject(new Error(\"could not determine an ephemeral port\")))\n }\n })\n })\n}\n\n/**\n * Allocate a port for a service: the declared `preferred` if it's free,\n * otherwise an OS-assigned ephemeral port. Ports in `reserved` (already handed\n * out to sibling services this session) are treated as taken.\n */\nexport async function allocatePort(\n preferred: number | undefined,\n reserved: ReadonlySet<number> = new Set(),\n): Promise<number> {\n if (preferred !== undefined && !reserved.has(preferred) && (await isPortFree(preferred))) {\n return preferred\n }\n // Retry ephemeral picks a few times in case we draw one already reserved for\n // a sibling that hasn't bound yet.\n for (let attempt = 0; attempt < 20; attempt++) {\n const port = await ephemeralPort()\n if (!reserved.has(port)) return port\n }\n throw new Error(\"could not allocate a free port after 20 attempts\")\n}\n","/**\n * Hostname derivation for the `*.localhost` reverse proxy.\n *\n * A service is reachable at:\n * http://<script>--<branch-slug>--<repo-slug>.localhost:<proxy-port>\n * except on the repo's default branch, where the branch label is dropped:\n * http://<script>--<repo-slug>.localhost:<proxy-port>\n *\n * `*.localhost` resolves to 127.0.0.1 on modern systems, so no DNS work is\n * needed — the proxy just matches on the Host header.\n */\n\n/** Lowercase, non-alphanumerics → `-`, collapse repeats, trim leading/trailing `-`. */\nexport function slugify(input: string): string {\n return input\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n}\n\nexport interface HostnameParts {\n /** The script/service name (e.g. `\"web\"`). */\n script: string\n /** The worktree's branch (e.g. `\"wt/fix-flaky\"`). */\n branch: string\n /** The repo identifier (e.g. its directory basename). */\n repo: string\n /** True when `branch` is the repo's default branch — drops the branch label. */\n isDefaultBranch: boolean\n}\n\n/** The bare hostname (no scheme, no port) a service is proxied under. */\nexport function serviceHostname(parts: HostnameParts): string {\n const labels = parts.isDefaultBranch\n ? [slugify(parts.script), slugify(parts.repo)]\n : [slugify(parts.script), slugify(parts.branch), slugify(parts.repo)]\n return `${labels.join(\"--\")}.localhost`\n}\n\n/** The full proxy URL (`http://<hostname>:<proxy-port>`) for a service. */\nexport function serviceUrl(parts: HostnameParts, proxyPort: number): string {\n return `http://${serviceHostname(parts)}:${proxyPort}`\n}\n","import { spawn, type ChildProcess } from \"node:child_process\"\nimport type { NamedScript } from \"../config.js\"\nimport {\n hookEnv,\n peerEnv,\n ENV_VARS,\n type WorktreeEnvContext,\n type PeerService,\n} from \"../env.js\"\nimport { allocatePort } from \"./ports.js\"\nimport { serviceHostname } from \"./slug.js\"\nimport type { ProxyTable } from \"./proxy-table.js\"\n\n/** A declared service with its resolved port / hostname / proxy URL. */\nexport interface ServiceRuntime {\n name: string\n command: string\n hostname: string\n port: number\n url: string\n}\n\n/** The observable state of a service (v1: no restart — just track the exit). */\nexport interface ServiceStatus {\n name: string\n hostname: string\n port: number\n url: string\n pid: number | null\n status: \"running\" | \"exited\"\n exitCode: number | null\n startedAt: string | null\n}\n\nexport interface SupervisorOptions {\n ctx: WorktreeEnvContext\n /** The `type: \"service\"` scripts from the repo's `agentproto.json`. */\n services: readonly NamedScript[]\n /** Repo label for the hostname (typically the repo dir basename). */\n repo: string\n /** Whether the worktree's branch is the repo default (drops the branch label). */\n isDefaultBranch: boolean\n /** Port the reverse proxy listens on — used to build each service's URL. */\n proxyPort: number\n /** When given, service hostnames are (de)registered here as they start/stop. */\n proxyTable?: ProxyTable\n}\n\ninterface Tracked {\n runtime: ServiceRuntime\n child: ChildProcess | null\n status: \"running\" | \"exited\"\n exitCode: number | null\n startedAt: string | null\n}\n\n/**\n * Supervises the long-running services declared for one worktree. Ports are\n * allocated up front for every declared service so peer discovery is complete\n * (a service started later is visible to one started earlier only if its port\n * was reserved — which it is), and hostnames register with the proxy table as\n * services come up.\n *\n * v1 scope: no crash-restart loop. A service that exits is marked `exited`\n * with its code; callers decide what to do.\n */\nexport class ServiceSupervisor {\n private readonly opts: SupervisorOptions\n private readonly tracked = new Map<string, Tracked>()\n\n private constructor(opts: SupervisorOptions, tracked: Map<string, Tracked>) {\n this.opts = opts\n this.tracked = tracked\n }\n\n /**\n * Build a supervisor, allocating a port for every declared service (declared\n * port if free, else ephemeral) and resolving each one's hostname + URL.\n * Nothing is spawned yet.\n */\n static async create(opts: SupervisorOptions): Promise<ServiceSupervisor> {\n const tracked = new Map<string, Tracked>()\n const reserved = new Set<number>()\n for (const svc of opts.services) {\n const port = await allocatePort(svc.port, reserved)\n reserved.add(port)\n const hostname = serviceHostname({\n script: svc.name,\n branch: opts.ctx.branchName,\n repo: opts.repo,\n isDefaultBranch: opts.isDefaultBranch,\n })\n const runtime: ServiceRuntime = {\n name: svc.name,\n command: svc.command,\n hostname,\n port,\n url: `http://${hostname}:${opts.proxyPort}`,\n }\n tracked.set(svc.name, {\n runtime,\n child: null,\n status: \"exited\",\n exitCode: null,\n startedAt: null,\n })\n }\n return new ServiceSupervisor(opts, tracked)\n }\n\n /** Every declared service's resolved runtime (ports/urls), regardless of state. */\n runtimes(): ServiceRuntime[] {\n return [...this.tracked.values()].map((t) => t.runtime)\n }\n\n /** Peers of `name` — every other declared service, as `PeerService` records. */\n private peersOf(name: string): PeerService[] {\n return this.runtimes()\n .filter((r) => r.name !== name)\n .map((r) => ({ name: r.name, port: r.port, url: r.url }))\n }\n\n private toStatus(t: Tracked): ServiceStatus {\n return {\n name: t.runtime.name,\n hostname: t.runtime.hostname,\n port: t.runtime.port,\n url: t.runtime.url,\n pid: t.child?.pid ?? null,\n status: t.status,\n exitCode: t.exitCode,\n startedAt: t.startedAt,\n }\n }\n\n /**\n * Start a declared service. Idempotent: returns the current status if it's\n * already running. Injects `AGENTPROTO_PORT` / `AGENTPROTO_URL` for itself\n * plus `AGENTPROTO_SERVICE_<PEER>_PORT|URL` for every sibling.\n */\n start(name: string): ServiceStatus {\n const t = this.tracked.get(name)\n if (!t) throw new Error(`no service \"${name}\" declared in agentproto.json`)\n if (t.status === \"running\" && t.child) return this.toStatus(t)\n\n const env: Record<string, string> = {\n ...hookEnv(this.opts.ctx),\n [ENV_VARS.port]: String(t.runtime.port),\n [ENV_VARS.url]: t.runtime.url,\n ...peerEnv(this.peersOf(name)),\n }\n\n const child = spawn(t.runtime.command, {\n cwd: this.opts.ctx.worktreePath,\n shell: true,\n env: { ...process.env, ...env },\n stdio: \"inherit\",\n })\n t.child = child\n t.status = \"running\"\n t.exitCode = null\n t.startedAt = new Date().toISOString()\n\n child.on(\"exit\", (code) => {\n t.status = \"exited\"\n t.exitCode = code\n })\n child.on(\"error\", () => {\n t.status = \"exited\"\n if (t.exitCode === null) t.exitCode = -1\n })\n\n this.opts.proxyTable?.set(t.runtime.hostname, t.runtime.port)\n return this.toStatus(t)\n }\n\n /** Stop a running service (SIGTERM). Returns whether one was running. */\n async stop(name: string): Promise<boolean> {\n const t = this.tracked.get(name)\n if (!t) throw new Error(`no service \"${name}\" declared in agentproto.json`)\n this.opts.proxyTable?.delete(t.runtime.hostname)\n const child = t.child\n if (!child || t.status !== \"running\") return false\n return new Promise<boolean>((resolve) => {\n const done = (): void => {\n t.status = \"exited\"\n resolve(true)\n }\n child.once(\"exit\", done)\n child.kill(\"SIGTERM\")\n })\n }\n\n /** Stop every running service. */\n async stopAll(): Promise<void> {\n await Promise.all([...this.tracked.keys()].map((name) => this.stop(name)))\n }\n\n /** Current status of a single service, or `undefined` if not declared. */\n get(name: string): ServiceStatus | undefined {\n const t = this.tracked.get(name)\n return t ? this.toStatus(t) : undefined\n }\n\n /** Current status of every declared service. */\n list(): ServiceStatus[] {\n return [...this.tracked.values()].map((t) => this.toStatus(t))\n }\n}\n","/**\n * The proxy routing table: `<hostname>` → local service port.\n *\n * Kept separate from the HTTP server (see `proxy-server.ts`) so the supervisor\n * can register/unregister routes without owning a live socket, and so routing\n * can be unit-tested without binding a port.\n */\nexport class ProxyTable {\n private readonly routes = new Map<string, number>()\n\n /** Register (or replace) the target port for a hostname. */\n set(hostname: string, port: number): void {\n this.routes.set(hostname.toLowerCase(), port)\n }\n\n /** Remove a hostname's route. Returns whether it was present. */\n delete(hostname: string): boolean {\n return this.routes.delete(hostname.toLowerCase())\n }\n\n /** The target port registered for an exact hostname, if any. */\n get(hostname: string): number | undefined {\n return this.routes.get(hostname.toLowerCase())\n }\n\n /**\n * Resolve a raw `Host` header (which may carry a `:port` suffix, and for\n * IPv6 a bracketed host) to a target port.\n */\n lookup(hostHeader: string | undefined): number | undefined {\n if (!hostHeader) return undefined\n const host = stripPort(hostHeader).toLowerCase()\n return this.routes.get(host)\n }\n\n /** All `[hostname, port]` routes currently registered. */\n entries(): Array<[string, number]> {\n return [...this.routes.entries()]\n }\n\n /** Number of registered routes. */\n get size(): number {\n return this.routes.size\n }\n}\n\n/** Strip a trailing `:port` from a Host header, honouring `[ipv6]:port`. */\nexport function stripPort(hostHeader: string): string {\n const trimmed = hostHeader.trim()\n if (trimmed.startsWith(\"[\")) {\n // [::1]:8080 → [::1]\n const close = trimmed.indexOf(\"]\")\n return close === -1 ? trimmed : trimmed.slice(0, close + 1)\n }\n const colon = trimmed.indexOf(\":\")\n return colon === -1 ? trimmed : trimmed.slice(0, colon)\n}\n","import { basename } from \"node:path\"\nimport { execArgv } from \"../exec.js\"\n\n/**\n * Derive the hostname-facing repo label from a repo root path — its directory\n * basename (the proxy slugs it further).\n */\nexport function repoLabel(repoRoot: string): string {\n return basename(repoRoot.replace(/[/\\\\]+$/, \"\"))\n}\n\n/**\n * Best-effort detection of a repo's default branch, for deciding whether the\n * branch label is dropped from a service hostname. Prefers the symbolic\n * `origin/HEAD` ref, falls back to `main` / `master` presence, then `main`.\n */\nexport async function detectDefaultBranch(repoRoot: string): Promise<string> {\n const head = await execArgv(\n \"git\",\n [\"-C\", repoRoot, \"symbolic-ref\", \"--short\", \"refs/remotes/origin/HEAD\"],\n repoRoot,\n )\n if (head.exitCode === 0) {\n const ref = head.stdout.trim() // e.g. \"origin/main\"\n const slash = ref.lastIndexOf(\"/\")\n if (slash !== -1) return ref.slice(slash + 1)\n if (ref) return ref\n }\n for (const candidate of [\"main\", \"master\"]) {\n const exists = await execArgv(\n \"git\",\n [\"-C\", repoRoot, \"rev-parse\", \"--verify\", \"--quiet\", `refs/heads/${candidate}`],\n repoRoot,\n )\n if (exists.exitCode === 0) return candidate\n }\n return \"main\"\n}\n","import { loadConfigFromBase, listServices, type AgentprotoConfig } from \"../config.js\"\nimport type { WorktreeEnvContext } from \"../env.js\"\nimport { ServiceSupervisor } from \"./supervisor.js\"\nimport { ProxyTable } from \"./proxy-table.js\"\nimport { repoLabel, detectDefaultBranch } from \"./context.js\"\n\n/**\n * Process-wide service state shared by the AIP-14 service tools. Independent\n * `run-script` / `start-service` / `stop-service` / `list-services` calls all\n * route through one supervisor per worktree and one proxy routing table, the\n * same way a daemon holds tunnel state in memory across requests.\n */\nconst supervisors = new Map<string, ServiceSupervisor>()\n\n/** The shared reverse-proxy routing table (hostname → service port). */\nexport const sharedProxyTable = new ProxyTable()\n\n/** Default reverse-proxy port when a caller doesn't pin one. */\nexport const DEFAULT_PROXY_PORT = 18780\n\nexport interface ResolveSupervisorInput {\n repoRoot: string\n worktreePath: string\n branch: string\n base?: string\n proxyPort?: number\n}\n\n/** The context the service tools resolve before touching the supervisor. */\nexport interface ResolvedWorktreeRuntime {\n supervisor: ServiceSupervisor\n config: AgentprotoConfig\n}\n\n/**\n * Resolve (creating on first use) the supervisor for a worktree: read the\n * committed `agentproto.json` from `base`, build service runtimes with\n * allocated ports, and cache it keyed by worktree path.\n */\nexport async function resolveSupervisor(\n input: ResolveSupervisorInput,\n): Promise<ResolvedWorktreeRuntime> {\n const config = (await loadConfigFromBase(input.repoRoot, input.base)) ?? {}\n const existing = supervisors.get(input.worktreePath)\n if (existing) return { supervisor: existing, config }\n\n const ctx: WorktreeEnvContext = {\n sourceCheckoutPath: input.repoRoot,\n worktreePath: input.worktreePath,\n branchName: input.branch,\n }\n const defaultBranch = await detectDefaultBranch(input.repoRoot)\n const supervisor = await ServiceSupervisor.create({\n ctx,\n services: listServices(config),\n repo: repoLabel(input.repoRoot),\n isDefaultBranch: input.branch === defaultBranch,\n proxyPort: input.proxyPort ?? DEFAULT_PROXY_PORT,\n proxyTable: sharedProxyTable,\n })\n supervisors.set(input.worktreePath, supervisor)\n return { supervisor, config }\n}\n\n/** The cached supervisor for a worktree, if one has been resolved. */\nexport function getSupervisor(worktreePath: string): ServiceSupervisor | undefined {\n return supervisors.get(worktreePath)\n}\n\n/** Stop all services for a worktree and drop its supervisor (used by cleanup). */\nexport async function disposeSupervisor(worktreePath: string): Promise<void> {\n const supervisor = supervisors.get(worktreePath)\n if (!supervisor) return\n await supervisor.stopAll()\n supervisors.delete(worktreePath)\n}\n","/**\n * The status engine (PLAN.md §1–§1.5): a worktree's status is derived at\n * read time from three orthogonal axes — `tree`, `integration`, `liveness`\n * — plus a `provenance` field that never affects classification. Nothing\n * here is a registry: every value is recomputed from git, the forge, and\n * the sessions snapshot on every call (PLAN.md §1.4's no-registry\n * principle). The one piece of durable state, the verdict memo\n * (`~/.agentproto/worktree-verdicts.json`), is a memo of *immutable* facts\n * only (a merged PR stays merged) — deleting it changes nothing but speed\n * and offline honesty, the acid test a real registry fails.\n *\n * The reconciliation rule (`reconcileIntegration`, PLAN.md §1.3) is the\n * heart of this module: it is why ad-hoc shell answers to \"how many\n * worktrees are stale?\" went 5 → 22 → 21+8 in one session, and why this is\n * code with tests instead. Every step is a pure function of `(T,\n * origin/main, the forge's merged-PR records)` — content-addressed inputs,\n * so two runs at the same repo state produce byte-identical answers.\n */\n\nimport { mkdir, readFile, stat, writeFile } from \"node:fs/promises\"\nimport { homedir } from \"node:os\"\nimport { dirname, resolve } from \"node:path\"\nimport { z } from \"zod\"\nimport { execArgv, execGit } from \"./exec.js\"\nimport type { ForgeClient, ForgePullRequestRef } from \"./forge.js\"\nimport {\n computeProvenance,\n readSessionsRegistry,\n sessionInWorktree,\n SESSIONS_FILE_PATH,\n type ComputeProvenanceOptions,\n type ProvenanceInfo,\n} from \"./provenance.js\"\n\n// ── tree axis ─────────────────────────────────────────────────────────\n\nexport type TreeState =\n | { state: \"clean\" }\n | {\n state: \"dirty\"\n modified: number\n staged: number\n untracked: number\n /**\n * Newest mtime (epoch ms) among the worktree's own dirty paths\n * (unstaged, staged, and untracked), or `null` if it couldn't be\n * determined. Feeds `classify`'s `RECENT_WRITE_HOLD_WINDOW_MS` guard —\n * a liveness-independent \"someone touched this a moment ago\" signal.\n */\n newestMtimeMs: number | null\n }\n\n/**\n * `git status --porcelain=v2` in the worktree itself (not `repoRoot` — tree\n * state is per-worktree). Gitignored files never appear here (no\n * `--ignored` flag passed), matching git's own non-`--force` `worktree\n * remove` tolerance for them (PLAN.md §0.5) — the two notions of \"clean\"\n * agree by construction.\n */\nexport async function computeTreeState(worktreePath: string): Promise<TreeState> {\n const res = await execArgv(\"git\", [\"-C\", worktreePath, \"status\", \"--porcelain=v2\"], worktreePath)\n if (res.exitCode !== 0) {\n throw new Error(\n `git status --porcelain=v2 failed in ${worktreePath} (exit ${res.exitCode}): ${res.stderr.trim() || res.stdout.trim()}`,\n )\n }\n let modified = 0\n let staged = 0\n let untracked = 0\n for (const line of res.stdout.split(\"\\n\")) {\n if (!line) continue\n if (line.startsWith(\"? \")) {\n untracked++\n continue\n }\n if (line.startsWith(\"1 \") || line.startsWith(\"2 \") || line.startsWith(\"u \")) {\n const xy = line.split(\" \", 2)[1] ?? \"..\"\n if (xy[0] !== \".\") staged++\n if (xy[1] !== \".\") modified++\n }\n }\n if (modified === 0 && staged === 0 && untracked === 0) return { state: \"clean\" }\n return { state: \"dirty\", modified, staged, untracked, newestMtimeMs: await newestDirtyMtimeMs(worktreePath) }\n}\n\n/**\n * Newest on-disk mtime among unstaged, staged, and untracked paths, read via\n * three plain plumbing commands (`-z`-delimited, so odd filenames can't\n * confuse the split) rather than by parsing `status --porcelain=v2`'s mixed\n * ordinary/rename record shapes. A path that stats out from under us\n * (removed/renamed between the status read and this call) is skipped, not\n * fatal — this is a best-effort recency signal, not a source of truth.\n */\nasync function newestDirtyMtimeMs(worktreePath: string): Promise<number | null> {\n const [unstaged, staged, untracked] = await Promise.all([\n execArgv(\"git\", [\"-C\", worktreePath, \"diff\", \"--name-only\", \"-z\"], worktreePath),\n execArgv(\"git\", [\"-C\", worktreePath, \"diff\", \"--cached\", \"--name-only\", \"-z\"], worktreePath),\n execArgv(\"git\", [\"-C\", worktreePath, \"ls-files\", \"--others\", \"--exclude-standard\", \"-z\"], worktreePath),\n ])\n const paths = new Set<string>()\n for (const res of [unstaged, staged, untracked]) {\n if (res.exitCode !== 0) continue\n for (const p of res.stdout.split(\"\\0\")) if (p) paths.add(p)\n }\n let newest: number | null = null\n for (const p of paths) {\n try {\n const st = await stat(resolve(worktreePath, p))\n if (newest === null || st.mtimeMs > newest) newest = st.mtimeMs\n } catch {\n // deleted/renamed since the status read — not a live write, skip.\n }\n }\n return newest\n}\n\n// ── integration axis ─────────────────────────────────────────────────\n\nconst integrationBase = { checkedAt: z.string() }\n\nconst integrationStateSchema = z.union([\n z.object({ ...integrationBase, state: z.literal(\"fresh\") }),\n z.object({\n ...integrationBase,\n state: z.literal(\"merged\"),\n via: z.literal(\"squash\"),\n pr: z.number(),\n offline: z.boolean(),\n }),\n z.object({\n ...integrationBase,\n state: z.literal(\"partial\"),\n pr: z.number(),\n aheadBy: z.number(),\n offline: z.boolean(),\n }),\n z.object({ ...integrationBase, state: z.literal(\"open\"), pr: z.number(), offline: z.boolean() }),\n z.object({ ...integrationBase, state: z.literal(\"pushed-no-pr\") }),\n z.object({ ...integrationBase, state: z.literal(\"unpushed\"), aheadBy: z.number() }),\n z.object({ ...integrationBase, state: z.literal(\"local-only\") }),\n z.object({ ...integrationBase, state: z.literal(\"gone-unexplained\") }),\n z.object({ ...integrationBase, state: z.literal(\"diverged\"), offline: z.boolean() }),\n z.object({ ...integrationBase, state: z.literal(\"detached\") }),\n z.object({ ...integrationBase, state: z.literal(\"unknown\"), reason: z.literal(\"offline\") }),\n])\n\n/** PLAN.md §1.2's `integration` axis, in full — every state the rule can produce. */\nexport type IntegrationState = z.infer<typeof integrationStateSchema>\n\n// ── verdict memo (PLAN.md §1.4) ─────────────────────────────────────────\n\nconst verdictMemoRecordSchema = z.object({\n repo: z.string(),\n branch: z.string(),\n tipSha: z.string(),\n verdict: integrationStateSchema,\n checkedAt: z.string(),\n})\nexport type VerdictMemoRecord = z.infer<typeof verdictMemoRecordSchema>\n\nconst verdictMemoFileSchema = z.object({ entries: z.array(verdictMemoRecordSchema) })\n\nexport const VERDICT_MEMO_PATH = (): string => resolve(homedir(), \".agentproto\", \"worktree-verdicts.json\")\n\nfunction memoKey(repo: string, branch: string, tipSha: string): string {\n return `${repo}\u0000${branch}\u0000${tipSha}`\n}\n\n/** Only forge-derived verdicts are ever memoised (PLAN.md §1.4/§2) — local-only classifications need no cache. */\nexport interface VerdictMemoStore {\n get(repo: string, branch: string, tipSha: string): Promise<VerdictMemoRecord | null>\n set(record: VerdictMemoRecord): Promise<void>\n}\n\n/**\n * `~/.agentproto/worktree-verdicts.json` — entries keyed by `(repo, branch,\n * tipSha)`. This is NOT a third status authority (PLAN.md §1.4): every\n * entry memoises an immutable fact (a containment check between two fixed\n * SHAs has one eternal answer; a merged PR stays merged). Deleting the file\n * changes nothing but speed and offline honesty.\n */\nexport class FileVerdictMemoStore implements VerdictMemoStore {\n private cache: Map<string, VerdictMemoRecord> | null = null\n\n constructor(private readonly path: string = VERDICT_MEMO_PATH()) {}\n\n private async load(): Promise<Map<string, VerdictMemoRecord>> {\n if (this.cache) return this.cache\n const map = new Map<string, VerdictMemoRecord>()\n this.cache = map\n let raw: string\n try {\n raw = await readFile(this.path, \"utf8\")\n } catch {\n return map\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch {\n return map\n }\n const result = verdictMemoFileSchema.safeParse(parsed)\n if (!result.success) return map\n for (const entry of result.data.entries) map.set(memoKey(entry.repo, entry.branch, entry.tipSha), entry)\n return map\n }\n\n async get(repo: string, branch: string, tipSha: string): Promise<VerdictMemoRecord | null> {\n const map = await this.load()\n return map.get(memoKey(repo, branch, tipSha)) ?? null\n }\n\n async set(record: VerdictMemoRecord): Promise<void> {\n const map = await this.load()\n map.set(memoKey(record.repo, record.branch, record.tipSha), record)\n await mkdir(dirname(this.path), { recursive: true })\n await writeFile(this.path, JSON.stringify({ entries: [...map.values()] }, null, 2) + \"\\n\", \"utf8\")\n }\n}\n\n/** In-memory-only store — for tests, or callers that don't want a durable memo. */\nexport class InMemoryVerdictMemoStore implements VerdictMemoStore {\n private readonly map = new Map<string, VerdictMemoRecord>()\n async get(repo: string, branch: string, tipSha: string): Promise<VerdictMemoRecord | null> {\n return this.map.get(memoKey(repo, branch, tipSha)) ?? null\n }\n async set(record: VerdictMemoRecord): Promise<void> {\n this.map.set(memoKey(record.repo, record.branch, record.tipSha), record)\n }\n}\n\n// ── local git read helpers ──────────────────────────────────────────────\n\n/**\n * `git merge-base --is-ancestor A B`: exit 0 = true, exit 1 = false, any\n * other exit is a real git error (e.g. `B` isn't a known local ref).\n * Resilient callers (the rule's own step 1) treat that as \"not an\n * ancestor\" rather than crash a whole sweep over one worktree.\n */\nasync function isAncestor(repoRoot: string, ancestor: string, descendant: string): Promise<boolean> {\n const res = await execArgv(\n \"git\",\n [\"-C\", repoRoot, \"merge-base\", \"--is-ancestor\", ancestor, descendant],\n repoRoot,\n )\n if (res.exitCode === 0) return true\n if (res.exitCode === 1) return false\n throw new Error(\n `git merge-base --is-ancestor ${ancestor} ${descendant} failed (exit ${res.exitCode}): ${res.stderr.trim()}`,\n )\n}\n\nasync function revListCount(repoRoot: string, range: string): Promise<number> {\n const res = await execGit(repoRoot, [\"rev-list\", \"--count\", range])\n return Number.parseInt(res.stdout.trim(), 10)\n}\n\ninterface UpstreamInfo {\n upstream: string | null\n gone: boolean\n aheadBy: number\n}\n\n/** `for-each-ref '%(upstream)' '%(upstream:track)'` for one branch (PLAN.md §1.3 step 4). */\nasync function readUpstreamTrack(repoRoot: string, branch: string): Promise<UpstreamInfo> {\n const res = await execArgv(\n \"git\",\n [\"-C\", repoRoot, \"for-each-ref\", \"--format=%(upstream)%09%(upstream:track)\", `refs/heads/${branch}`],\n repoRoot,\n )\n if (res.exitCode !== 0) return { upstream: null, gone: false, aheadBy: 0 }\n const [rawUpstream, rawTrack] = res.stdout.split(\"\\t\")\n const upstream = (rawUpstream ?? \"\").trim()\n if (!upstream) return { upstream: null, gone: false, aheadBy: 0 }\n const track = (rawTrack ?? \"\").trim()\n const aheadMatch = track.match(/ahead (\\d+)/)\n return {\n upstream,\n gone: track.includes(\"[gone]\"),\n aheadBy: aheadMatch ? Number.parseInt(aheadMatch[1] ?? \"0\", 10) : 0,\n }\n}\n\nexport interface GitWorktreeRef {\n path: string\n /** `null` for a detached HEAD. */\n branch: string | null\n head: string\n}\n\n/** Parses `git worktree list --porcelain` — every linked worktree of `repoRoot`, wherever it lives. */\nexport async function listGitWorktrees(repoRoot: string): Promise<GitWorktreeRef[]> {\n const res = await execGit(repoRoot, [\"worktree\", \"list\", \"--porcelain\"])\n const entries: GitWorktreeRef[] = []\n let current: { path: string; branch: string | null; head: string } | null = null\n for (const line of res.stdout.split(\"\\n\")) {\n if (line.startsWith(\"worktree \")) {\n if (current) entries.push(current)\n current = { path: line.slice(\"worktree \".length), branch: null, head: \"\" }\n } else if (current && line.startsWith(\"HEAD \")) {\n current.head = line.slice(\"HEAD \".length)\n } else if (current && line.startsWith(\"branch \")) {\n current.branch = line.slice(\"branch \".length).replace(/^refs\\/heads\\//, \"\")\n } else if (current && line === \"detached\") {\n current.branch = null\n }\n }\n if (current) entries.push(current)\n return entries\n}\n\n// ── the reconciliation rule (PLAN.md §1.3) ──────────────────────────────\n\nexport interface ReconcileIntegrationInput {\n repoRoot: string\n repoName: string\n /** `null` for a detached HEAD — short-circuits to `{ state: \"detached\" }` (step 0). */\n branch: string | null\n tipSha: string\n forge: ForgeClient\n memo: VerdictMemoStore\n /** Default `\"origin/main\"` — matches `loadConfigFromBase`'s own default. */\n defaultBranchRef?: string\n /** Injectable clock so callers (the determinism test) can freeze `checkedAt`. */\n now?: () => string\n}\n\nfunction newestMergedFirst(prs: readonly ForgePullRequestRef[]): ForgePullRequestRef[] {\n return prs\n .filter((pr) => pr.merged)\n .slice()\n .sort((a, b) => (b.mergedAt ?? \"\").localeCompare(a.mergedAt ?? \"\"))\n}\n\nfunction dedupeByNumber(prs: readonly ForgePullRequestRef[]): ForgePullRequestRef[] {\n const byNumber = new Map<number, ForgePullRequestRef>()\n for (const pr of prs) byNumber.set(pr.number, pr)\n return [...byNumber.values()]\n}\n\n/**\n * PLAN.md §1.3 — the heart of the design. Implements the six-step rule\n * exactly: local ancestry first (cheap, no forge), then the forge's\n * merged-PR containment check (the squash-proof signal), then open PRs,\n * then local upstream tracking, with the verdict memo as the only fallback\n * when the forge is unreachable. Never guesses (step 5): a memo miss while\n * offline is `unknown(offline)`, full stop.\n */\nexport async function reconcileIntegration(input: ReconcileIntegrationInput): Promise<IntegrationState> {\n const now = input.now ?? (() => new Date().toISOString())\n const defaultBranchRef = input.defaultBranchRef ?? \"origin/main\"\n\n // Step 0: detached HEAD.\n if (input.branch === null) {\n return { state: \"detached\", checkedAt: now() }\n }\n const branch = input.branch\n\n // Step 1: local ancestry against the default branch — no forge needed.\n //\n // This can ONLY prove \"every commit tipSha can reach is also on\n // defaultBranchRef\" — it cannot tell WHY. That's `fresh`, not `merged`:\n // a branch created straight off main with zero commits of its own reaches\n // this exact same true (`worktree new` produces exactly that branch), and\n // — because a fast-forward merge moves the ref with no new commit object —\n // a branch that *did* have real commits, fast-forwarded into main, is\n // git-graph-identical to \"always sat on main\" afterward. There is no local\n // (or forge) signal that tells the two apart from here. `classify` still\n // lets a clean `fresh` worktree reclaim (nothing dirty ⇒ nothing to lose),\n // but it must never treat `fresh` as forge-confirmed enough to license\n // discarding uncommitted work — that ambiguity is exactly what destroyed a\n // live worktree via `gc --apply --salvage-dirty` on 2026-07-15.\n const ancestryOk = await isAncestor(input.repoRoot, input.tipSha, defaultBranchRef).catch(() => false)\n if (ancestryOk) {\n return { state: \"fresh\", checkedAt: now() }\n }\n\n // Steps 2/3: forge lookup. Any failure here means \"forge unreachable\" — step 5.\n let candidatePrs: ForgePullRequestRef[]\n try {\n const [byBranch, byCommit] = await Promise.all([\n input.forge.pullRequestsForBranch(branch),\n input.forge.pullRequestsForCommit(input.tipSha),\n ])\n candidatePrs = dedupeByNumber([...byBranch, ...byCommit])\n } catch {\n return reconcileOffline(input, now())\n }\n\n let verdict: IntegrationState | null\n try {\n verdict = await classifyAgainstPulls(input.repoRoot, input.tipSha, candidatePrs, now, input.forge)\n } catch {\n // A fetch of a PR's head, or a local git op mid-step-2, failed — treat as unreachable.\n return reconcileOffline(input, now())\n }\n if (verdict) {\n // Only forge-derived verdicts are memoised (PLAN.md §1.4/§2). A memo-write\n // failure is a cache miss next time, not a reason to downgrade this\n // already-fresh answer to offline.\n await input.memo.set({ repo: input.repoName, branch, tipSha: input.tipSha, verdict, checkedAt: verdict.checkedAt }).catch(() => {})\n return verdict\n }\n\n // Step 4: no PR at all — local upstream tracking, no forge needed.\n const upstream = await readUpstreamTrack(input.repoRoot, branch)\n if (upstream.upstream === null) return { state: \"local-only\", checkedAt: now() }\n if (upstream.gone) return { state: \"gone-unexplained\", checkedAt: now() }\n if (upstream.aheadBy > 0) return { state: \"unpushed\", aheadBy: upstream.aheadBy, checkedAt: now() }\n return { state: \"pushed-no-pr\", checkedAt: now() }\n}\n\n/**\n * Steps 2/3 proper: walk merged PRs newest-first for containment, then fall\n * back to \"any open PR\". Returns `null` when neither applies (the caller\n * proceeds to step 4's local upstream check) — distinct from throwing, which\n * means \"the forge/local git op itself failed\" (step 5).\n */\nasync function classifyAgainstPulls(\n repoRoot: string,\n tipSha: string,\n candidatePrs: readonly ForgePullRequestRef[],\n now: () => string,\n forge: ForgeClient,\n): Promise<IntegrationState | null> {\n for (const pr of newestMergedFirst(candidatePrs)) {\n const H = pr.headRefOid\n await forge.ensurePullHeadFetched(pr.number, H)\n if (await isAncestor(repoRoot, tipSha, H)) {\n return { state: \"merged\", via: \"squash\", pr: pr.number, checkedAt: now(), offline: false }\n }\n if (await isAncestor(repoRoot, H, tipSha)) {\n const aheadBy = await revListCount(repoRoot, `${H}..${tipSha}`)\n return { state: \"partial\", pr: pr.number, aheadBy, checkedAt: now(), offline: false }\n }\n // Neither contains the other — try the next merged PR.\n }\n\n const [firstOpenPr] = candidatePrs.filter((pr) => pr.state === \"open\").sort((a, b) => a.number - b.number)\n if (firstOpenPr) {\n return { state: \"open\", pr: firstOpenPr.number, checkedAt: now(), offline: false }\n }\n\n // A merged PR was found by the forge but contained neither T nor was contained by it.\n if (newestMergedFirst(candidatePrs).length > 0) {\n return { state: \"diverged\", checkedAt: now(), offline: false }\n }\n return null\n}\n\n/** Step 5: forge unreachable — memo hit for the exact `(repo, branch, tipSha)`, else `unknown(offline)`. Never guess. */\nasync function reconcileOffline(input: ReconcileIntegrationInput, checkedAt: string): Promise<IntegrationState> {\n if (input.branch === null) return { state: \"detached\", checkedAt }\n const cached = await input.memo.get(input.repoName, input.branch, input.tipSha)\n if (cached) {\n return offlineCopy(cached.verdict, checkedAt)\n }\n return { state: \"unknown\", reason: \"offline\", checkedAt }\n}\n\n/** Re-stamp a memoised verdict as an offline read, at the current check time. */\nfunction offlineCopy(verdict: IntegrationState, checkedAt: string): IntegrationState {\n if (verdict.state === \"merged\" && verdict.via === \"squash\") {\n return { ...verdict, checkedAt, offline: true }\n }\n if (verdict.state === \"partial\" || verdict.state === \"open\" || verdict.state === \"diverged\") {\n return { ...verdict, checkedAt, offline: true }\n }\n return verdict\n}\n\n// ── liveness axis ────────────────────────────────────────────────────\n\nconst LIVE_SESSION_STATUSES = new Set([\"starting\", \"running\"])\n\n/** `services` is always empty in PR-A — service liveness needs the daemon's in-process `ServiceSupervisor` (out of scope, see below). */\nexport type LivenessState =\n | { state: \"idle\"; sessions: ProvenanceInfo[\"sessions\"]; services: string[] }\n | { state: \"sessions\"; sessions: ProvenanceInfo[\"sessions\"]; services: string[] }\n | { state: \"daemon-unreachable\"; sessions: ProvenanceInfo[\"sessions\"]; services: string[] }\n\n/**\n * Live sessions whose `cwd` is contained in this worktree, read off the\n * same persisted sessions snapshot as provenance (PLAN.md §1.5) — no\n * running daemon required, matching `worktree check`'s no-daemon posture\n * (PLAN.md §3.3). Service liveness needs the daemon's in-process\n * `ServiceSupervisor` and is out of scope here (`services` is always `[]`);\n * `daemon-unreachable` fires only when the sessions snapshot itself is\n * present but unreadable (corrupt/permission-denied), not merely absent —\n * \"no daemon has ever run\" is a legitimate empty registry, not an error.\n */\nexport async function computeLiveness(\n worktreePath: string,\n options: ComputeProvenanceOptions = {},\n): Promise<LivenessState> {\n const registry = await readSessionsRegistry(options.sessionsPath ?? SESSIONS_FILE_PATH())\n if (registry === null) return { state: \"daemon-unreachable\", sessions: [], services: [] }\n const live = registry\n .filter((s) => sessionInWorktree(s, worktreePath))\n .filter((s) => LIVE_SESSION_STATUSES.has(s.status))\n if (live.length > 0) return { state: \"sessions\", sessions: live, services: [] }\n return { state: \"idle\", sessions: [], services: [] }\n}\n\n// ── gate (PR-F fills this in; PR-A always reports \"none\") ──────────────\n\nexport type GateState = { state: \"none\" }\n\n// ── classification (PLAN.md §1.2) ───────────────────────────────────────\n\nexport type WorktreeClass = \"reclaim\" | \"salvage\" | \"hold\"\n\nexport interface Classification {\n reclaimable: boolean\n class: WorktreeClass\n}\n\n/**\n * How recently a worktree's own dirty paths must have been written for\n * `classify` to hold it regardless of what `liveness` says. Liveness is\n * read off the agentproto session registry (`computeLiveness`) — it only\n * sees a worker that registered as a session, so it goes blind the instant\n * a daemon restart zeroes the registry, or an agent isn't registered at\n * all. This window is a liveness-independent backstop for exactly that\n * blind spot: work written in the last 15 minutes is presumptively still\n * in flight no matter what the (possibly-stale) session registry reports.\n * 15 minutes is deliberately generous — it costs nothing but a delayed gc\n * pass, while the cost of guessing wrong the other way is a destroyed\n * worktree.\n */\nexport const RECENT_WRITE_HOLD_WINDOW_MS = 15 * 60 * 1000\n\n/**\n * `reclaimable ⇔ tree=clean ∧ integration ∈ {merged, fresh} ∧ liveness ∈\n * {idle, daemon-unreachable}` (PLAN.md §1.2). `daemon-unreachable` is\n * allowed because the hard guarantee against losing work is git's own\n * non-`--force` removal refusal, not the liveness probe. `fresh` reclaims\n * when clean for the same reason: a clean tree has nothing uncommitted to\n * lose, so it doesn't matter that `fresh` can't distinguish \"never had\n * commits\" from \"real commits, fast-forwarded into main\" (see\n * `reconcileIntegration` step 1) — either way there's nothing at risk.\n *\n * Salvage is narrower than reclaim on purpose: only `merged` (always\n * forge-confirmed — see `reconcileIntegration`) ever licenses destroying\n * dirty, uncommitted work — `fresh` never does, clean or not, because the\n * ambiguity in what `fresh` can prove is exactly what destroyed a live\n * worktree via `gc --apply --salvage-dirty` on 2026-07-15: a branch with\n * zero commits of its own read as \"merged\" and its uncommitted work was\n * salvaged-then-removed out from under a running agent. A `merged ∧ dirty`\n * worktree written to inside `RECENT_WRITE_HOLD_WINDOW_MS` also holds\n * instead of salvaging — see that constant's doc. Everything else is\n * `hold`.\n */\nexport function classify(\n tree: TreeState,\n integration: IntegrationState,\n liveness: LivenessState,\n nowMs: number = Date.now(),\n): Classification {\n const merged = integration.state === \"merged\"\n const fresh = integration.state === \"fresh\"\n const clean = tree.state === \"clean\"\n const idleOrUnreachable = liveness.state === \"idle\" || liveness.state === \"daemon-unreachable\"\n if ((merged || fresh) && clean && idleOrUnreachable) return { reclaimable: true, class: \"reclaim\" }\n if (merged && !clean) {\n const writtenRecently =\n tree.state === \"dirty\" &&\n typeof tree.newestMtimeMs === \"number\" &&\n nowMs - tree.newestMtimeMs < RECENT_WRITE_HOLD_WINDOW_MS\n if (writtenRecently) return { reclaimable: false, class: \"hold\" }\n return { reclaimable: false, class: \"salvage\" }\n }\n return { reclaimable: false, class: \"hold\" }\n}\n\n// ── orchestration ────────────────────────────────────────────────────\n\nexport interface WorktreeStatusEntry {\n path: string\n branch: string | null\n head: string\n tree: TreeState\n integration: IntegrationState\n liveness: LivenessState\n provenance: ProvenanceInfo\n gate: GateState\n reclaimable: boolean\n class: WorktreeClass\n}\n\nexport interface ComputeWorktreeStatusInput {\n repoRoot: string\n repoName: string\n worktree: GitWorktreeRef\n forge: ForgeClient\n memo: VerdictMemoStore\n defaultBranchRef?: string\n sessionsPath?: string\n now?: () => string\n /**\n * Clock for `classify`'s `RECENT_WRITE_HOLD_WINDOW_MS` guard — deliberately\n * separate from `now`. `now` freezes `checkedAt` stamps for deterministic\n * tests and is often a fixed past instant; file mtimes are always real\n * wall-clock, so comparing them against a frozen-past `now` would make\n * every dirty fixture look like it was written in the future (a negative,\n * and therefore always-\"recent\", delta). Defaults to `Date.now()`.\n */\n nowMs?: number\n}\n\n/** Computes all three axes + provenance + classification for one worktree. */\nexport async function computeWorktreeStatus(input: ComputeWorktreeStatusInput): Promise<WorktreeStatusEntry> {\n const [tree, integration, liveness, provenance] = await Promise.all([\n computeTreeState(input.worktree.path),\n reconcileIntegration({\n repoRoot: input.repoRoot,\n repoName: input.repoName,\n branch: input.worktree.branch,\n tipSha: input.worktree.head,\n forge: input.forge,\n memo: input.memo,\n defaultBranchRef: input.defaultBranchRef,\n now: input.now,\n }),\n computeLiveness(input.worktree.path, { sessionsPath: input.sessionsPath }),\n computeProvenance(input.worktree.path, { sessionsPath: input.sessionsPath }),\n ])\n const { reclaimable, class: cls } = classify(tree, integration, liveness, input.nowMs)\n return {\n path: input.worktree.path,\n branch: input.worktree.branch,\n head: input.worktree.head,\n tree,\n integration,\n liveness,\n provenance,\n gate: { state: \"none\" },\n reclaimable,\n class: cls,\n }\n}\n\nexport interface ListWorktreeStatusesInput {\n repoRoot: string\n repoName: string\n forge: ForgeClient\n memo: VerdictMemoStore\n defaultBranchRef?: string\n sessionsPath?: string\n now?: () => string\n}\n\n/** Enumerates every linked worktree of `repoRoot` (`git worktree list`) and computes its status. */\nexport async function listWorktreeStatuses(input: ListWorktreeStatusesInput): Promise<WorktreeStatusEntry[]> {\n const worktrees = await listGitWorktrees(input.repoRoot)\n const results: WorktreeStatusEntry[] = []\n for (const worktree of worktrees) {\n results.push(\n await computeWorktreeStatus({\n repoRoot: input.repoRoot,\n repoName: input.repoName,\n worktree,\n forge: input.forge,\n memo: input.memo,\n defaultBranchRef: input.defaultBranchRef,\n sessionsPath: input.sessionsPath,\n now: input.now,\n }),\n )\n }\n return results\n}\n","import { implementTool } from \"@agentproto/driver\"\nimport { cleanupWorktreeTool } from \"../../tools/cleanup-worktree.tool.js\"\nimport { execGit } from \"../../exec.js\"\nimport { loadConfigFromBase } from \"../../config.js\"\nimport { runTeardown } from \"../../lifecycle.js\"\nimport { disposeSupervisor } from \"../../services/runtime.js\"\nimport { computeTreeState } from \"../../status.js\"\n\n/**\n * Raised when `worktree.cleanup` can't remove the worktree: either we\n * categorized the tree ourselves and found a dirty class the caller didn't\n * authorize (`blocked` names it), or — the no-flags default path — git's own\n * `worktree remove` refused and we never asked why (`blocked` is empty,\n * `message` carries git's stderr verbatim).\n */\nexport class WorktreeNotRemovableError extends Error {\n readonly cwd: string\n readonly blocked: readonly (\"untracked\" | \"modified\")[]\n\n /**\n * `blocked` is empty when git itself refused without us categorizing the\n * tree first (the no-flags default path, PLAN.md §5.2 layer 3) — `detail`\n * then carries git's own stderr instead of a named class.\n */\n constructor(cwd: string, blocked: readonly (\"untracked\" | \"modified\")[], detail?: string) {\n const flags = blocked.map((b) => (b === \"untracked\" ? \"discardUntracked\" : \"discardModified\"))\n const message =\n blocked.length > 0\n ? `worktree at ${cwd} has ${blocked.join(\" and \")} changes; refusing to remove. ` +\n `Pass ${flags.join(\" and \")} to authorize discarding ${blocked.length > 1 ? \"them\" : \"it\"}, ` +\n `or use 'worktree archive' to salvage first.`\n : `worktree at ${cwd} is not clean; git refused to remove it${detail ? `: ${detail}` : \"\"}. ` +\n `Pass discardUntracked/discardModified to authorize discarding, or use 'worktree archive' to salvage first.`\n super(message)\n this.name = \"WorktreeNotRemovableError\"\n this.cwd = cwd\n this.blocked = blocked\n }\n}\n\nexport const cleanupWorktreeBuiltin = implementTool(\n cleanupWorktreeTool,\n async ({ input }) => {\n // Stop any supervised services for this worktree before we tear anything\n // down — orphaned children would otherwise keep ports (and the proxy\n // route) held after the directory is gone.\n await disposeSupervisor(input.cwd)\n\n // Declarative lifecycle: run teardown hooks (from the base tree's\n // agentproto.json) while the worktree still exists. Teardown failures are\n // logged, never blocking — cleanup's whole job is to tear the dir down.\n if (input.runTeardown !== false) {\n const config = await loadConfigFromBase(input.repoRoot, input.base).catch(() => null)\n if (config) {\n const runs = await runTeardown(config, {\n sourceCheckoutPath: input.repoRoot,\n worktreePath: input.cwd,\n branchName: input.branch ?? \"\",\n }).catch((err: unknown) => {\n process.stderr.write(\n `worktree.cleanup: teardown hook error (ignored): ${err instanceof Error ? err.message : String(err)}\\n`,\n )\n return []\n })\n for (const run of runs) {\n if (run.result.exitCode !== 0) {\n process.stderr.write(\n `worktree.cleanup: teardown '${run.command}' exited ${run.result.exitCode} (ignored): ` +\n `${(run.result.stderr || run.result.stdout).trim()}\\n`,\n )\n }\n }\n }\n }\n\n const discardUntracked = input.discardUntracked === true\n const discardModified = input.discardModified === true\n\n if (discardUntracked || discardModified) {\n // At least one discard flag is set: git's own `--force` is all-or-\n // nothing, so we categorize the tree ourselves first to make sure the\n // granted flag(s) actually cover everything dirty before force-passing\n // — otherwise a lone `discardUntracked` could silently also destroy\n // modified tracked files it never authorized.\n const tree = await computeTreeState(input.cwd)\n if (tree.state === \"dirty\") {\n const blocked: (\"untracked\" | \"modified\")[] = []\n if (tree.untracked > 0 && !discardUntracked) blocked.push(\"untracked\")\n if ((tree.modified > 0 || tree.staged > 0) && !discardModified) blocked.push(\"modified\")\n if (blocked.length > 0) throw new WorktreeNotRemovableError(input.cwd, blocked)\n await execGit(input.repoRoot, [\"worktree\", \"remove\", \"--force\", input.cwd])\n } else {\n await execGit(input.repoRoot, [\"worktree\", \"remove\", input.cwd])\n }\n } else {\n // No discard flag: git's own refusal is the final arbiter (PLAN.md\n // §5.2 layer 3) — no need to re-implement the dirty check here. A\n // clean tree (or one with only gitignored files) removes fine; a\n // dirty one makes git itself fail, which we surface as the same typed\n // error without claiming to know which class blocked it (we never\n // asked).\n try {\n await execGit(input.repoRoot, [\"worktree\", \"remove\", input.cwd])\n } catch (err) {\n throw new WorktreeNotRemovableError(input.cwd, [], err instanceof Error ? err.message : String(err))\n }\n }\n\n if (input.deleteBranch && input.branch) {\n await execGit(input.repoRoot, [\"branch\", \"-D\", input.branch])\n }\n return { removed: true as const }\n },\n)\n","import { implementTool } from \"@agentproto/driver\"\nimport { runGateTool } from \"../../tools/run-gate.tool.js\"\nimport { execShell } from \"../../exec.js\"\n\nexport const runGateBuiltin = implementTool(runGateTool, async ({ input }) => {\n const result = await execShell(input.cmd, input.cwd)\n return { passed: result.exitCode === 0, ...result }\n})\n","import { implementTool } from \"@agentproto/driver\"\nimport { ToolError } from \"@agentproto/tool\"\nimport { runScriptTool } from \"../../tools/run-script.tool.js\"\nimport { loadConfigFromBase, getScript } from \"../../config.js\"\nimport { hookEnv } from \"../../env.js\"\nimport { execShell } from \"../../exec.js\"\n\nexport const runScriptBuiltin = implementTool(runScriptTool, async ({ input }) => {\n const config = await loadConfigFromBase(input.repoRoot, input.base)\n const script = config ? getScript(config, input.script) : undefined\n if (!script) {\n throw new ToolError({\n code: \"not_found\",\n message: `no script \"${input.script}\" in ${input.base ?? \"origin/main\"}:agentproto.json`,\n })\n }\n const env = hookEnv({\n sourceCheckoutPath: input.repoRoot,\n worktreePath: input.worktreePath,\n branchName: input.branch,\n })\n const result = await execShell(script.command, input.worktreePath, { env })\n return { passed: result.exitCode === 0, ...result }\n})\n","import { implementTool } from \"@agentproto/driver\"\nimport { ToolError } from \"@agentproto/tool\"\nimport { startServiceTool } from \"../../tools/start-service.tool.js\"\nimport { resolveSupervisor } from \"../../services/runtime.js\"\n\nexport const startServiceBuiltin = implementTool(startServiceTool, async ({ input }) => {\n const { supervisor } = await resolveSupervisor({\n repoRoot: input.repoRoot,\n worktreePath: input.worktreePath,\n branch: input.branch,\n base: input.base,\n proxyPort: input.proxyPort,\n })\n if (!supervisor.get(input.script)) {\n throw new ToolError({\n code: \"not_found\",\n message: `no service \"${input.script}\" declared (type: \"service\") in ${input.base ?? \"origin/main\"}:agentproto.json`,\n })\n }\n return supervisor.start(input.script)\n})\n","import { implementTool } from \"@agentproto/driver\"\nimport { stopServiceTool } from \"../../tools/stop-service.tool.js\"\nimport { getSupervisor } from \"../../services/runtime.js\"\n\nexport const stopServiceBuiltin = implementTool(stopServiceTool, async ({ input }) => {\n const supervisor = getSupervisor(input.worktreePath)\n if (!supervisor) return { stopped: false }\n const stopped = await supervisor.stop(input.script)\n return { stopped }\n})\n","import { implementTool } from \"@agentproto/driver\"\nimport { listServicesTool } from \"../../tools/list-services.tool.js\"\nimport { resolveSupervisor } from \"../../services/runtime.js\"\n\nexport const listServicesBuiltin = implementTool(listServicesTool, async ({ input }) => {\n const { supervisor } = await resolveSupervisor({\n repoRoot: input.repoRoot,\n worktreePath: input.worktreePath,\n branch: input.branch,\n base: input.base,\n proxyPort: input.proxyPort,\n })\n return { services: supervisor.list() }\n})\n","import { defineDriver } from \"@agentproto/driver\"\nimport { provisionWorktreeBuiltin } from \"./bodies/provision-worktree.body.js\"\nimport { cleanupWorktreeBuiltin } from \"./bodies/cleanup-worktree.body.js\"\nimport { runGateBuiltin } from \"./bodies/run-gate.body.js\"\nimport { runScriptBuiltin } from \"./bodies/run-script.body.js\"\nimport { startServiceBuiltin } from \"./bodies/start-service.body.js\"\nimport { stopServiceBuiltin } from \"./bodies/stop-service.body.js\"\nimport { listServicesBuiltin } from \"./bodies/list-services.body.js\"\n\n/**\n * AIP-30 PROVIDER for the three `worktree.*` TOOL contracts. `kind: \"builtin\"`\n * — runs in-process, shelling out to `git` / the caller's commands directly.\n * No subprocess-DRIVER indirection, no network hop.\n */\nexport const worktreeProvider = defineDriver({\n id: \"worktree-builtin\",\n name: \"Git Worktree (built-in)\",\n description:\n \"In-process provision / gate / cleanup of git worktrees via direct git \" +\n \"and shell invocations. No sandboxing — the host owns the filesystem \" +\n \"and process boundary.\",\n version: \"0.1.0\",\n kind: \"builtin\",\n implements: [\n { tool: \"worktree.provision\", version: \"0.2.0\" },\n { tool: \"worktree.cleanup\", version: \"0.2.0\" },\n { tool: \"worktree.run-gate\", version: \"0.1.0\" },\n { tool: \"worktree.run-script\", version: \"0.1.0\" },\n { tool: \"worktree.start-service\", version: \"0.1.0\" },\n { tool: \"worktree.stop-service\", version: \"0.1.0\" },\n { tool: \"worktree.list-services\", version: \"0.1.0\" },\n ],\n implementations: [\n provisionWorktreeBuiltin,\n cleanupWorktreeBuiltin,\n runGateBuiltin,\n runScriptBuiltin,\n startServiceBuiltin,\n stopServiceBuiltin,\n listServicesBuiltin,\n ],\n})\n"]}