@agentproto/worktree 0.13.0 → 0.14.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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/exec.ts","../src/glob.ts","../src/config.ts","../src/local-config.ts","../src/clone.ts","../src/env.ts","../src/lifecycle.ts","../src/provenance.ts","../src/provider/bodies/provision-worktree.body.ts","../src/fast-remove.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","join","resolve","mkdir","dirname","homedir","readdir","readFile","lstat","appendFile","writeFile","spawn","basename","implementTool","ToolError"],"mappings":"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","file":"chunk-MYH5XOX6.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\n/** A `cloneGlobs`/`copyGlobs` pattern that could resolve outside its root — a\n * leading `/`, or a literal `..` path segment. */\nexport class GlobTraversalError extends Error {\n constructor(pattern: string) {\n super(`glob pattern '${pattern}' escapes the repo root (path traversal)`)\n this.name = \"GlobTraversalError\"\n }\n}\n\nfunction assertNoTraversal(pattern: string): void {\n if (pattern.startsWith(\"/\")) throw new GlobTraversalError(pattern)\n if (pattern.split(\"/\").some((seg) => seg === \"..\")) throw new GlobTraversalError(pattern)\n}\n\n/**\n * Expand a glob against `root` for CLONING a whole entry. Unlike\n * {@link expandGlob} — which enumerates individual FILES and deliberately\n * skips descending into `node_modules` — this matches whole entries (files\n * OR directories) and never descends past a match: a matching directory is\n * returned as a single unit for the caller to clone as a whole tree, so a\n * pattern like `node_modules` costs one `readdir`, not a walk of everything\n * inside it. `**` is not supported (a clone target must be a single named\n * entry per level, not an arbitrary-depth wildcard) and throws.\n *\n * Throws {@link GlobTraversalError} on a pattern that could resolve outside\n * `root` (a leading `/`, or any `..` segment) — checked before any\n * filesystem access.\n */\nexport async function expandCloneGlob(root: string, pattern: string): Promise<string[]> {\n assertNoTraversal(pattern)\n const segments = pattern.split(\"/\").filter((seg) => seg.length > 0)\n if (segments.length === 0) return []\n if (segments.includes(\"**\")) {\n throw new Error(\n `cloneGlobs pattern '${pattern}' uses '**', which is not supported — name each ` +\n \"path segment explicitly so a directory match clones as one unit.\",\n )\n }\n\n async function walkMatch(dirRel: string, idx: number): Promise<string[]> {\n // `idx` never exceeds `segments.length - 1` — the only caller is this\n // function itself (recursing with `idx + 1`, guarded by `!isLast`) and\n // the initial `walkMatch(\"\", 0)` below, with `segments.length >= 1`\n // already checked above.\n const seg = segments[idx]!\n const isLast = idx === segments.length - 1\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 regex = new RegExp(`^${escapeSegment(seg)}$`)\n const out: string[] = []\n for (const entry of entries) {\n if (entry.name === \".git\") continue\n if (!regex.test(entry.name)) continue\n const rel = dirRel ? posix.join(dirRel, entry.name) : entry.name\n if (isLast) {\n out.push(rel)\n continue\n }\n // Only a directory can hold the next segment; a match this deep that\n // isn't one is a dead end for the rest of the pattern.\n if (entry.isDirectory()) {\n out.push(...(await walkMatch(rel, idx + 1)))\n }\n }\n return out\n }\n\n return walkMatch(\"\", 0)\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 /** Command to install deps inside a freshly provisioned worktree, e.g.\n * 'pnpm install --prefer-offline'. Same trust model as `setup`/\n * `teardown` — see the SECURITY note above. An explicit `depsCmd`\n * passed straight to the `worktree.provision` tool still wins over\n * this declarative default. */\n depsCmd: z.string().optional(),\n /** Gitignored dirs/files (e.g. `node_modules`, sibling workspace\n * repos) symlinked from the host repo into the worktree before\n * `depsCmd` runs, so the dependency graph resolves without a full\n * reinstall. Same fallback rule as `depsCmd`: an explicit `linkPaths`\n * tool input wins over this one. */\n linkPaths: z.array(z.string()).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","import { readFile } from \"node:fs/promises\"\nimport { resolve } from \"node:path\"\nimport { z } from \"zod\"\nimport { ConfigError } from \"./config.js\"\n\n/**\n * `<workspace>/.agentproto/worktree.json` — a LOCAL, host-owned worktree\n * lifecycle default, read straight off disk (never `git show`, never a\n * worktree's own tree). Same idea as `<workspace>/.agentproto/allowed-\n * commands.json` (`command-allowlist.ts`): a per-machine setting that lets\n * one host declare what a fresh worktree needs (a `node_modules` clone, a\n * per-worktree pnpm store) without committing that machine's paths into the\n * repo. `.agentproto/` is gitignored repo-wide (see this repo's own\n * `.gitignore`), so this file can never ride in on a branch — there is\n * nothing here for `config.ts`'s \"only what a reviewer merged\" guarantee to\n * defend against; the trust model is simply \"whoever owns this machine's\n * filesystem\".\n *\n * `workspace` is the SOURCE checkout — the same directory passed as\n * `provisionWorktreeTool`'s `repoRoot` — never the freshly created worktree\n * (which starts with no `.agentproto/worktree.json` of its own, since the\n * dir is gitignored and nothing copies it in).\n */\nexport const LOCAL_WORKTREE_CONFIG_REL = \".agentproto/worktree.json\"\n\nconst localWriteFileEntrySchema = z.object({\n path: z.string().min(1, \"writeFiles[].path must be non-empty\"),\n content: z.string(),\n mode: z.enum([\"create\", \"append\"]).optional(),\n})\n\nconst localWorktreeConfigSchema = z.object({\n copyGlobs: z.array(z.string()).optional(),\n /** Gitignored dirs/files cloned (copy-on-write where the filesystem\n * supports it) from the source checkout into the worktree before\n * `depsCmd` runs — see `clone.ts`. */\n cloneGlobs: z.array(z.string()).optional(),\n writeFiles: z.array(localWriteFileEntrySchema).optional(),\n depsCmd: z.string().optional(),\n linkPaths: z.array(z.string()).optional(),\n})\n\nexport type LocalWriteFileEntry = z.infer<typeof localWriteFileEntrySchema>\nexport type LocalWorktreeConfig = z.infer<typeof localWorktreeConfigSchema>\n\n/**\n * Parse + validate raw `worktree.json` text. Throws {@link ConfigError} on\n * malformed JSON or a schema violation — same failure shape as\n * `config.ts`'s `parseConfig`, so callers can handle both uniformly.\n */\nexport function parseLocalWorktreeConfig(raw: string): LocalWorktreeConfig {\n let json: unknown\n try {\n json = JSON.parse(raw)\n } catch (err) {\n throw new ConfigError(\n `${LOCAL_WORKTREE_CONFIG_REL} is not valid JSON: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n const result = localWorktreeConfigSchema.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(`${LOCAL_WORKTREE_CONFIG_REL} failed validation: ${issues}`)\n }\n return result.data\n}\n\n/**\n * Load `<workspace>/.agentproto/worktree.json` straight off disk. Returns\n * `null` when the file is absent (the common case — most workspaces don't\n * opt in). Throws {@link ConfigError} on a present-but-invalid file.\n */\nexport async function loadLocalWorktreeConfig(\n workspace: string,\n): Promise<LocalWorktreeConfig | null> {\n const path = resolve(workspace, LOCAL_WORKTREE_CONFIG_REL)\n let raw: string\n try {\n raw = await readFile(path, \"utf8\")\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return null\n throw err\n }\n return parseLocalWorktreeConfig(raw)\n}\n\nconst SLUG_PLACEHOLDER = /\\{slug\\}/g\n\n/** Substitute the literal `{slug}` token for `slug` in `text`. */\nexport function applySlugPlaceholder(text: string, slug: string): string {\n return text.replace(SLUG_PLACEHOLDER, slug)\n}\n\n/**\n * Resolve a local config's `writeFiles` for one concrete worktree: expands\n * `{slug}` in `path`/`content` so a declarative entry (e.g. a pnpm\n * `virtualStoreDir` pointed outside the worktree) can be written once and\n * still land at a distinct, collision-free path per worktree.\n */\nexport function resolveLocalWriteFiles(\n files: readonly LocalWriteFileEntry[] | undefined,\n slug: string,\n): LocalWriteFileEntry[] {\n return (files ?? []).map((file) => ({\n ...file,\n path: applySlugPlaceholder(file.path, slug),\n content: applySlugPlaceholder(file.content, slug),\n }))\n}\n","import { mkdir, lstat } from \"node:fs/promises\"\nimport { dirname, join } from \"node:path\"\nimport { execArgv } from \"./exec.js\"\nimport { expandCloneGlob } from \"./glob.js\"\n\n/**\n * Copy one matched entry (file or directory) from `src` to `dest` using a\n * copy-on-write clone where the filesystem supports it:\n * - macOS: `cp -Rc` — clonefile(2). Per `cp(1)`, if the source and target\n * are on different filesystems, or the target filesystem doesn't\n * support cloning, `cp` itself falls back to a regular copy — so a\n * non-zero exit here is a genuine failure, not \"no CoW support\".\n * - Linux: `cp -r --reflink=auto` — GNU coreutils' own auto-fallback,\n * same guarantee.\n * - Any other platform: no CoW attempt, straight to the plain-copy\n * fallback below.\n * Never a symlink: the clone must be an independent, writable tree a\n * package manager can repair/mutate without touching the source checkout.\n */\nasync function cloneEntry(src: string, dest: string): Promise<void> {\n await mkdir(dirname(dest), { recursive: true })\n const platform = process.platform\n const cloneArgs =\n platform === \"darwin\"\n ? [\"-Rc\", src, dest]\n : platform === \"linux\"\n ? [\"-r\", \"--reflink=auto\", src, dest]\n : null\n if (cloneArgs) {\n const result = await execArgv(\"cp\", cloneArgs, dirname(dest))\n if (result.exitCode === 0) return\n }\n const fallback = await execArgv(\"cp\", [\"-R\", src, dest], dirname(dest))\n if (fallback.exitCode !== 0) {\n throw new Error(\n `clone of '${src}' into '${dest}' failed: ${fallback.stderr || fallback.stdout}`,\n )\n }\n}\n\n/**\n * Clone every entry matched by `patterns` (see {@link expandCloneGlob}) from\n * `repoRoot` into `cwd`, meant to run BEFORE `depsCmd` so a gitignored,\n * expensive-to-recreate tree (e.g. `node_modules`) is already present when\n * the package manager runs — turning `depsCmd` into a quick verify/repair\n * instead of a full reinstall. Skips an entry whose destination already\n * exists — same never-clobber rule `linkPaths`/`writeFiles` follow in\n * `provision-worktree.body.ts`.\n */\nexport async function cloneEntries(\n repoRoot: string,\n cwd: string,\n patterns: readonly string[],\n): Promise<void> {\n for (const pattern of patterns) {\n const matches = await expandCloneGlob(repoRoot, pattern)\n for (const rel of matches) {\n const dest = join(cwd, rel)\n const existing = await lstat(dest).catch(() => null)\n if (existing) continue\n await cloneEntry(join(repoRoot, rel), dest)\n }\n }\n}\n","import { homedir } from \"node:os\"\nimport { join, resolve } from \"node:path\"\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\n/** Explicit override for {@link resolveWorktreesTurboCacheDir} — a daemon-\n * level pin, same naming shape as `AGENTPROTO_WORKTREES_ROOT`/\n * `AGENTPROTO_WORKTREES_ISOLATION` in `@agentproto/runtime`. */\nexport const WORKTREES_TURBO_CACHE_DIR_ENV = \"AGENTPROTO_WORKTREES_TURBO_CACHE_DIR\"\n\n/**\n * Resolve the turbo build-cache directory `runSetup` points every\n * provisioned worktree's setup hooks at (`TURBO_CACHE_DIR` — see turbo's own\n * `--cache-dir` flag, which this env var sets). Measured on a real machine\n * (WP-F): a repo's main checkout carries a turbo cache in the hundreds of MB;\n * a freshly provisioned worktree, with none, pays a full cold `pnpm build`\n * (~103 tasks) instead of a cache restore. `agentproto.json`'s own\n * `worktree.setup` never set this, so every worktree paid that cost\n * independently — this closes it by pointing every worktree at ONE shared\n * directory instead.\n *\n * Deliberately NOT inside any worktree (would die with `worktree rm`) and\n * NOT inside the monorepo checkout being built (would otherwise sit inside\n * pnpm's/turbo's own workspace-relative globs, risking either tool treating\n * its own cache as workspace content). Precedence, matching the rest of this\n * codebase's `worktrees.*` knobs:\n * 1. `AGENTPROTO_WORKTREES_TURBO_CACHE_DIR` — explicit override.\n * 2. a bare `TURBO_CACHE_DIR` already in this process's env — an operator\n * who already exports it (AGENTS.md's own advice, for a *manually*\n * driven worktree) is respected rather than silently redirected.\n * 3. `~/.agentproto/turbo-cache` — a real, single default, mirroring\n * `worktrees.root`'s own reasoning: zero-config still converges every\n * worktree's build cache to one shared place rather than leaving it\n * unset (today's behaviour — each worktree builds cold).\n */\nexport function resolveWorktreesTurboCacheDir(): string {\n const pinned = process.env[WORKTREES_TURBO_CACHE_DIR_ENV]\n if (pinned) return resolve(pinned)\n const ambient = process.env.TURBO_CACHE_DIR\n if (ambient) return ambient\n return join(homedir(), \".agentproto\", \"turbo-cache\")\n}\n","import { mkdir, appendFile } from \"node:fs/promises\"\nimport { dirname } from \"node:path\"\nimport { normalizeHook, type AgentprotoConfig } from \"./config.js\"\nimport { hookEnv, resolveWorktreesTurboCacheDir, 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/**\n * Lines that are pure environment noise, never diagnostic signal — filtered\n * OUT of the short `HookError` message (but never out of the persisted full\n * log; {@link appendHookLog} writes the raw, unfiltered result). Today this\n * is exactly the per-worktree `.npmrc` warning every `pnpm` invocation prints\n * when `NODE_AUTH_TOKEN` isn't set in the hook's env — harmless, but its\n * bare presence in `result.stderr` used to make the OLD `(stderr ||\n * stdout)` selection below pick stderr and silently drop the real failure,\n * which lived in stdout (turbo's per-task build output). See `HookError`'s\n * doc for the incident this fixes.\n */\nconst NOISE_LINE_RES: readonly RegExp[] = [\n /Failed to replace env in config: \\$\\{NODE_AUTH_TOKEN\\}/,\n /^\\s*WARN\\s+Issue while reading \".*\\.npmrc\"\\.?\\s*$/,\n]\n\n/** How many trailing lines of the combined, noise-filtered output ride along\n * in the short `HookError` message. Large enough to carry the actual\n * failing task's own error (a tsup/tsc diagnostic, a turbo task summary),\n * small enough to stay a \"short, readable\" `lastError`\n * (`sessions.ts`'s `PendingAgentOutcome.message` doc) — the FULL output\n * always lives in the persisted log file (see {@link appendHookLog}),\n * referenced by path in this same message. */\nconst TAIL_LINES = 60\n\n/**\n * Combine stdout+stderr (stdout first — turbo/tsup/tsc write a failing\n * task's own diagnostics there; stderr is usually just the shell's own\n * \"command exited\" noise) and take the last {@link TAIL_LINES} non-noise\n * lines. This is deliberately DIFFERENT from the old\n * `(stderr || stdout).trim()` selection, which picked ONE stream whole and\n * silently dropped the other — see `HookError`'s doc.\n */\nfunction filteredTail(result: ExecResult): string {\n const combined = [result.stdout, result.stderr].filter(Boolean).join(\"\\n\")\n const lines = combined\n .split(\"\\n\")\n .filter(line => !NOISE_LINE_RES.some(re => re.test(line)))\n const tail = lines.slice(-TAIL_LINES).join(\"\\n\").trim()\n return tail || \"(no output captured)\"\n}\n\n/** Raised when a `setup` hook exits non-zero — carries the captured output\n * (see {@link result}) plus a short, noise-filtered tail in `message` for\n * callers that only surface a single string (e.g.\n * `SessionDescriptor.lastError`).\n *\n * Incident (2026-09-27): three back-to-back `agent_start` worktree\n * provisions all failed at `pnpm build`, but every `lastError` showed only\n * the `.npmrc`/`NODE_AUTH_TOKEN` warning + turbo's one-line run summary —\n * never the actual tsup/tsc error. Root cause: the OLD message used\n * `(run.result.stderr || run.result.stdout).trim()` — since that WARN line\n * (and turbo's failure banner) land on stderr, ANY non-empty stderr threw\n * away stdout WHOLESALE, and stdout is exactly where a failing package's\n * own build error prints. Fixed by combining both streams, filtering only\n * the known-noise lines (not a whole stream), and keeping a real tail of\n * the combined output instead of picking one stream whole. */\nexport class HookError extends Error {\n readonly command: string\n readonly result: ExecResult\n /** Path to the full, unfiltered stdout+stderr log for this and every\n * other hook command in the same run, when the caller asked for one to\n * be persisted (see {@link runSetup}'s `opts.logPath`). */\n readonly logPath?: string\n constructor(phase: \"setup\" | \"teardown\", run: HookRun, logPath?: string) {\n super(\n `worktree ${phase} hook failed (exit ${run.result.exitCode}): ${run.command}\\n` +\n filteredTail(run.result) +\n (logPath ? `\\n\\n(full hook output: ${logPath})` : \"\"),\n )\n this.name = \"HookError\"\n this.command = run.command\n this.result = run.result\n if (logPath !== undefined) this.logPath = logPath\n }\n}\n\n/**\n * Append one hook command's FULL, unfiltered stdout+stderr to `logPath` —\n * best-effort: a log-write failure (unwritable dir, full disk) is swallowed\n * rather than letting log persistence itself break worktree provisioning.\n * No-op when `logPath` is omitted (the common case: a bare `worktree new`\n * from the CLI has no session to log into).\n */\nasync function appendHookLog(\n logPath: string | undefined,\n command: string,\n result: ExecResult,\n): Promise<void> {\n if (!logPath) return\n try {\n await mkdir(dirname(logPath), { recursive: true })\n const parts = [\n `$ ${command}`,\n result.stdout,\n result.stderr,\n `(exit ${result.exitCode})`,\n \"\",\n ].filter(Boolean)\n await appendFile(logPath, parts.join(\"\\n\") + \"\\n\", \"utf8\")\n } catch {\n // Best-effort — see doc above.\n }\n}\n\n/**\n * Run the `worktree.setup` hooks sequentially in the worktree, with the\n * `AGENTPROTO_*` context env injected — plus `TURBO_CACHE_DIR`, pointed at a\n * directory shared across every provisioned worktree (see\n * {@link resolveWorktreesTurboCacheDir}), so a `pnpm build` (or any other\n * turbo-driven build) run BY a setup hook restores from cache instead of\n * paying a full cold build every single time a worktree is provisioned. A\n * setup hook that doesn't use turbo simply never reads the var. The first\n * non-zero exit throws {@link HookError} (setup failure must fail\n * provisioning). No-op when the repo declares no setup.\n *\n * `opts.logPath`, when given, gets every command's FULL stdout+stderr\n * appended (success or failure) — see {@link appendHookLog}. Callers that\n * know the failure will surface through a single short string (the daemon's\n * `agent_start` path, via `SessionDescriptor.lastError`) should pass a path\n * under that session's own directory so the full log outlives a\n * subsequently-reclaimed worktree.\n *\n * `opts.retryOnFailure` (default `false`) re-runs a failing command exactly\n * ONCE before giving up — a COMPLEMENT to, never a substitute for, an actual\n * root-cause fix. It exists for the unattended `agent_start` path: a caller\n * with no human watching has no way to retry a transient failure itself\n * short of minting an entirely new worktree (a fresh `git worktree add`,\n * paying the full setup cost again) — see `session-spawn.ts`'s\n * `worktreeSetupLogPath` call sites, which both opt in. Left `false` for the\n * default (`agentproto worktree new`, and this function's own default): an\n * interactive human watching a genuine, deterministic build failure gets it\n * on the first try instead of waiting through an identical, doomed rerun.\n * Both attempts are logged (when `logPath` is given); the thrown\n * `HookError` carries the RETRY's own result, since that's the one the\n * caller is actually giving up on.\n */\nexport async function runSetup(\n config: AgentprotoConfig,\n ctx: WorktreeEnvContext,\n opts: { logPath?: string; retryOnFailure?: boolean } = {},\n): Promise<HookRun[]> {\n const commands = normalizeHook(config.worktree?.setup)\n const runs: HookRun[] = []\n const env = { ...hookEnv(ctx), TURBO_CACHE_DIR: resolveWorktreesTurboCacheDir() }\n for (const command of commands) {\n let result = await execShell(command, ctx.worktreePath, { env })\n let run = { command, result }\n runs.push(run)\n await appendHookLog(opts.logPath, command, result)\n if (result.exitCode !== 0 && opts.retryOnFailure) {\n result = await execShell(command, ctx.worktreePath, { env })\n run = { command, result }\n runs.push(run)\n await appendHookLog(opts.logPath, `${command} (retry 1/1)`, result)\n }\n if (result.exitCode !== 0) throw new HookError(\"setup\", run, opts.logPath)\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 * `opts.logPath` mirrors {@link runSetup}'s — best-effort, full output.\n */\nexport async function runTeardown(\n config: AgentprotoConfig,\n ctx: WorktreeEnvContext,\n opts: { logPath?: string } = {},\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 await appendHookLog(opts.logPath, 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 * (`packages/runtime/src/sessions.ts`) — upholding the no-registry\n * principle (PLAN.md §1.4): nothing new is mirrored, this only reads\n * files another package already owns and persists. Read directly off disk\n * (not via a running daemon) so `worktree ls --status` works with no\n * daemon required, matching `worktree check`'s posture (PLAN.md §3.3).\n *\n * ## Where the registry lives (AIP-46 §State partitioning)\n *\n * It is no longer one file. The runtime partitions per workspace —\n * `~/.agentproto/workspaces/<slug>/sessions.json` — and leaves the old\n * global `~/.agentproto/sessions.json` in place, frozen, as the\n * pre-partition history. So the default read is the UNION of every bucket\n * plus that legacy artifact.\n *\n * Reading only the legacy file would be quietly destructive here rather\n * than merely stale: this feeds `computeWorktreeStatus` → the GC plan →\n * `applyGc`, which REMOVES worktrees. A worktree whose sessions all live\n * in a bucket would present as never-touched and become eligible for\n * removal. Under-reporting provenance deletes work; over-reporting only\n * keeps a worktree around. The union is the safe direction, and the\n * legacy file stays in the union precisely because provenance's job is\n * history.\n *\n * The bucket layout is duplicated here rather than imported, matching\n * what this file already did with the sessions path: `@agentproto/worktree`\n * does not depend on `@agentproto/runtime` and this join is not worth\n * inverting that.\n *\n * Two known limits, both designed in rather than hidden (PLAN.md §1.5):\n * - each snapshot is a recency window (`HISTORY_CAP = 200` per bucket,\n * `packages/runtime/src/sessions.ts`), 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 { readdir, 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\n/** The pre-partition global snapshot. Still read — it holds every session\n * from before the split and the runtime leaves it intact — but no longer\n * written. See this file's header. */\nexport const SESSIONS_FILE_PATH = (): string => resolve(homedir(), \".agentproto\", \"sessions.json\")\n\n/** Root of the runtime's per-workspace state buckets (AIP-46 §Layout):\n * `<root>/<slug>/sessions.json`. */\nexport const SESSIONS_BUCKETS_ROOT = (): string => resolve(homedir(), \".agentproto\", \"workspaces\")\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 // Optional echoes from SessionDescriptor; kept optional for back-compat with\n // registry rows written before these fields were persisted. The GC logic\n // ignores them; they are surfaced in local provenance footers.\n adapterSlug: z.string().optional(),\n model: z.string().optional(),\n authMode: z.string().optional(),\n costUsd: z.number().optional(),\n tokensIn: z.number().optional(),\n tokensOut: z.number().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 registry.\n *\n * With `path`: that exact file, nothing else — what callers pinning a\n * fixture want.\n *\n * Without: the union of every per-workspace bucket plus the legacy global\n * snapshot (see this file's header for why the union, and why\n * under-reporting here is dangerous rather than merely lossy). Deduped by\n * session id, buckets winning over the frozen legacy copy of the same row.\n *\n * Missing file (no daemon has ever run) is a legitimate empty registry,\n * not an error — mirrors `loadHistorySnapshot`'s own ENOENT handling in\n * `sessions.ts`. A malformed file (present but unparseable) is surfaced by\n * returning `null` so callers can distinguish \"no history\" from \"history\n * is unreadable\"; in the union that means null only when every source that\n * exists is unreadable, since one corrupt bucket shouldn't blind the join\n * to the rest.\n */\nexport async function readSessionsRegistry(path?: string): Promise<SessionRef[] | null> {\n if (path !== undefined) return readSessionsFile(path)\n\n let buckets: string[] = []\n try {\n const root = SESSIONS_BUCKETS_ROOT()\n buckets = (await readdir(root, { withFileTypes: true }))\n .filter((e) => e.isDirectory())\n .map((e) => resolve(root, e.name, \"sessions.json\"))\n } catch {\n buckets = [] // ENOENT — nothing partitioned yet.\n }\n\n // Buckets first: on an id present in both, the live bucket row wins\n // over the frozen legacy one.\n const results = await Promise.all(\n [...buckets, SESSIONS_FILE_PATH()].map((p) => readSessionsFile(p)),\n )\n const readable = results.filter((r): r is SessionRef[] => r !== null)\n if (readable.length === 0) return null\n\n const byId = new Map<string, SessionRef>()\n for (const list of readable) {\n for (const session of list) {\n if (!byId.has(session.id)) byId.set(session.id, session)\n }\n }\n return Array.from(byId.values())\n}\n\nasync function readSessionsFile(path: string): 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 rawEntry = entry as Record<string, unknown> | undefined\n const ref = sessionRefSchema.safeParse({\n ...rawEntry,\n // SessionDescriptor stores billing-auth mode under `auth.mode`; mirror it\n // onto the flattened `authMode` field for footer consumers.\n authMode: rawEntry?.authMode ?? (rawEntry?.auth as { mode?: string } | undefined)?.mode,\n })\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 *\n * Spawn `cwd` is anchored to `repoRoot`, NOT `worktreePath` — `worktreePath`\n * targets the git command via `-C`, but a linked worktree can be removed by\n * a concurrent `gc` reap (or by this very call's caller, moments later) while\n * `repoRoot` (the main checkout) never is (`gc.ts`'s docblock: git itself\n * refuses to remove the main working tree). A spawn whose `cwd` no longer\n * exists on disk fails `ENOENT` on the COMMAND itself (a Node/libuv quirk,\n * not a \"not found\" for the directory) — see `exec.ts`'s `execGit` for the\n * same anchor, established first.\n */\nexport async function readWorktreeMarker(repoRoot: string, worktreePath: string): Promise<WorktreeMarker | null> {\n const gitDirRes = await execArgv(\n \"git\",\n [\"-C\", worktreePath, \"rev-parse\", \"--path-format=absolute\", \"--git-dir\"],\n repoRoot,\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 *\n * Spawn `cwd` is anchored to `repoRoot`, not `worktreePath` — see\n * `readWorktreeMarker`'s doc for why.\n */\nexport async function writeWorktreeMarker(\n repoRoot: string,\n worktreePath: string,\n marker: WorktreeMarker,\n): Promise<void> {\n const gitDirRes = await execArgv(\n \"git\",\n [\"-C\", worktreePath, \"rev-parse\", \"--path-format=absolute\", \"--git-dir\"],\n repoRoot,\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 repoRoot: string,\n worktreePath: string,\n options: ComputeProvenanceOptions = {},\n): Promise<ProvenanceInfo> {\n const [registry, marker] = await Promise.all([\n // No `sessionsPath` ⇒ the bucket ∪ legacy union, NOT the legacy file\n // alone — pinning it here would hide every partitioned session from\n // the GC join. See this file's header.\n readSessionsRegistry(options.sessionsPath),\n readWorktreeMarker(repoRoot, 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, appendFile, writeFile } 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 { loadLocalWorktreeConfig, resolveLocalWriteFiles } from \"../../local-config.js\"\nimport { cloneEntries } from \"../../clone.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(input.repoRoot, cwd, {\n worktreeId: `wt_${randomUUID().slice(0, 8)}`,\n createdAt: new Date().toISOString(),\n })\n\n // Declarative lifecycle config, read once from the base tree's committed\n // agentproto.json (never the working tree — see config.ts's SECURITY\n // note), and once more from the source checkout's LOCAL, host-owned\n // `.agentproto/worktree.json` (never the working tree of the fresh\n // worktree either — see local-config.ts's doc). Both gated on `runSetup`\n // since that flag is the opt-out for the whole declarative lifecycle, not\n // just the setup/teardown hooks. Loaded here (rather than at each call\n // site) so every caller of this tool — the CLI's `worktree new` and the\n // daemon's spawn-time provisioner alike — picks up a repo's declared\n // defaults automatically, without duplicating the load-and-merge logic\n // per call site. Precedence: explicit tool input > local worktree.json >\n // committed agentproto.json.\n const config = input.runSetup !== false ? await loadConfigFromBase(input.repoRoot, base) : null\n const localConfig =\n input.runSetup !== false ? await loadLocalWorktreeConfig(input.repoRoot) : null\n const linkPaths = input.linkPaths ?? localConfig?.linkPaths ?? config?.worktree?.linkPaths ?? []\n const depsCmd = input.depsCmd ?? localConfig?.depsCmd ?? config?.worktree?.depsCmd\n const copyGlobs = input.copyGlobs ?? localConfig?.copyGlobs ?? []\n const cloneGlobs = input.cloneGlobs ?? localConfig?.cloneGlobs ?? []\n // `copyGlobs`/`cloneGlobs`/`writeFiles` have no committed-agentproto.json\n // equivalent, so their fallback chain stops at the local file.\n const writeFiles = input.writeFiles ?? resolveLocalWriteFiles(localConfig?.writeFiles, input.slug)\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 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 // Write generated, worktree-specific config BEFORE depsCmd, so a tool it\n // invokes (e.g. a package manager) sees it on first run.\n for (const file of writeFiles) {\n const dest = join(cwd, file.path)\n await mkdir(dirname(dest), { recursive: true })\n if (file.mode === \"append\") {\n await appendFile(dest, file.content)\n // Mark skip-worktree so this worktree-local tweak to a (likely)\n // tracked file never shows up as a modification the caller could\n // accidentally commit. Best-effort: a no-op path (never tracked to\n // begin with) makes `update-index --skip-worktree` fail — that's\n // fine, there's nothing to hide from `git status` for it anyway.\n await execGit(cwd, [\"update-index\", \"--skip-worktree\", file.path]).catch(() => {})\n } else {\n const existing = await lstat(dest).catch(() => null)\n if (existing) continue\n await writeFile(dest, file.content)\n }\n }\n\n // Clone gitignored, expensive-to-recreate trees (e.g. node_modules) from\n // the source checkout BEFORE depsCmd, same ordering reasoning as\n // linkPaths/writeFiles above — except a clone is an independent,\n // writable copy (copy-on-write where the filesystem supports it), not a\n // symlink, so depsCmd can freely mutate it without touching the source\n // checkout, and a subsequent install becomes a quick verify/repair\n // rather than a full reinstall.\n if (cloneGlobs.length > 0) {\n try {\n await cloneEntries(input.repoRoot, cwd, cloneGlobs)\n } catch (err) {\n throw new ToolError({\n code: \"execution_failed\",\n message: `cloneGlobs failed: ${err instanceof Error ? err.message : String(err)}`,\n })\n }\n }\n\n if (depsCmd) {\n const result = await execShell(depsCmd, cwd)\n if (result.exitCode !== 0) {\n throw new ToolError({\n code: \"execution_failed\",\n message: `depsCmd '${depsCmd}' failed (exit ${result.exitCode}): ${result.stderr || result.stdout}`,\n })\n }\n }\n\n for (const pattern of 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. `config` was already loaded above (same\n // `runSetup` gate) — reused here rather than re-reading the base tree.\n if (config) {\n try {\n await runSetup(\n config,\n {\n sourceCheckoutPath: input.repoRoot,\n worktreePath: cwd,\n branchName: branch,\n },\n {\n ...(input.setupLogPath ? { logPath: input.setupLogPath } : {}),\n ...(input.retrySetupOnFailure ? { retryOnFailure: true } : {}),\n },\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 return { cwd, branch }\n },\n)\n","/**\n * Fast worktree removal: `rename` to a same-volume trash dir + `git worktree\n * prune`, with the bytes deleted by a detached background child.\n *\n * WHY THIS EXISTS: `git worktree remove` deletes the worktree tree in\n * process, one file at a time — on a pnpm worktree (its own `node_modules` /\n * `.pnpm-vstores`, hundreds of thousands of files) on an external SSD that\n * measured ~10 minutes PER WORKTREE. Every part of the removal that callers\n * actually wait on is instant:\n *\n * 1. `rename` the worktree directory to `<dirname(path)>/.trash/<base>-\n * <timestamp>` — same volume by construction, so it's a metadata\n * operation, not a copy. `git worktree remove`'s per-file refusals have\n * already run (see `removeWorktreeFast`), so at this point the bytes\n * are authorized to die; only the cost is being moved.\n * 2. `git worktree prune` — git forgets the (now missing) registration.\n * The worktree disappears from `git worktree list` immediately.\n * 3. `rm -rf` on the trash dir runs in a DETACHED child\n * (`spawn(\"rm\", [\"-rf\", trashDir], { detached: true, stdio: \"ignore\" })`\n * + `.unref()`) — the parent never waits for the hundreds of thousands\n * of unlinks, and survives its own exit. The next `gc` apply also\n * sweeps stale `.trash` dirs (`sweepWorktreeTrash`) so nothing leaks\n * even if a child is killed mid-delete.\n *\n * SAFETY — the plain/forced `git worktree remove` semantics this must not\n * weaken, verified empirically against git (see the brief):\n * - A non-force removal must refuse a dirty tree: the caller passes\n * `force: false` only for a tree already checked clean, and\n * `removeWorktreeFast` re-checks `git status --porcelain` itself and\n * throws (leaving the worktree in place) rather than renaming dirt away.\n * - A forced removal is only ever passed after a salvage snapshot or an\n * explicit user-granted discard flag upstream — this module doesn't\n * loosen that; it just performs the same destruction instantly.\n *\n * Fallback: if the `rename` fails for any reason (cross-device, permissions,\n * the trash parent unmountable), the function falls back to today's plain\n * `git worktree remove [--force]` — behavior identical to before, just slow.\n */\n\nimport { spawn } from \"node:child_process\"\nimport { existsSync, mkdirSync, readdirSync, realpathSync } from \"node:fs\"\nimport { rename } from \"node:fs/promises\"\nimport { basename, join } from \"node:path\"\nimport { execArgv, execGit } from \"./exec.js\"\n\n/** Directory (inside the worktrees root's repo bucket) background-delete leftovers land in. */\nexport const WORKTREE_TRASH_DIRNAME = \".trash\"\n\n/**\n * `realpath`, falling back to the input for a path that doesn't exist —\n * mirrors gc.ts's `realOrResolved` convention (git reports worktree paths\n * realpath'd; callers may pass a symlinked spelling like macOS `/tmp`).\n */\nfunction realOrResolved(path: string): string {\n\ttry {\n\t\treturn realpathSync(path)\n\t} catch {\n\t\treturn path\n\t}\n}\n\nexport interface RemoveWorktreeFastOptions {\n\t/**\n\t * `false` (default): re-verify the tree is clean via `git status\n\t * --porcelain` and refuse (throw) on any dirt — the same refusal a plain\n\t * `git worktree remove` performs. `true`: skip the cleanliness gate,\n\t * exactly like `git worktree remove --force` — only pass this when dirt\n\t * has been authorized (salvage snapshot durable / discard flags granted)\n\t * upstream.\n\t */\n\tforce?: boolean\n\t/**\n\t * Injectable clock for the trash dir's timestamp suffix — tests freeze it\n\t * so the dir name is deterministic. Defaults to `Date.now`.\n\t */\n\tnow?: () => number\n\t/**\n\t * Test seam — overrides the detached `rm -rf` child (e.g. an in-process\n\t * spy). Receives the trash dir path. Default: a detached\n\t * `spawn(\"rm\", [\"-rf\", …])` the parent never waits on.\n\t */\n\tspawnRemoval?: (trashDir: string) => void\n}\n\n/**\n * Remove a linked git worktree instantly: validate → rename to trash →\n * prune → delete the trash in the background. Throws the same *shape* of\n * error `execGit` would on refusal (message carries git's own stderr where\n * git produced one) so callers' existing error handling keeps working.\n */\nexport async function removeWorktreeFast(\n\trepoRoot: string,\n\tpath: string,\n\toptions: RemoveWorktreeFastOptions = {},\n): Promise<void> {\n\tconst force = options.force === true\n\n\t// Safety gate (1): a non-force removal must refuse a dirty tree, exactly\n\t// like `git worktree remove` without `--force`, whose arbiter is git's\n\t// own refusal rules — so the gate re-derives git's verdict without\n\t// mutating anything (there is no `worktree remove --dry-run` flag):\n\t//\n\t// a. the registration check below;\n\t// b. `git status --porcelain=v2 --ignored=matching` in the worktree —\n\t// ANY output at all refuses. That one probe reproduces the exact\n\t// tolerance table git's non-force removal enforces, verified\n\t// empirically against this repo's own git: modified/staged/unignored\n\t// dirt (`1`/`2`/`?`/`u` records) refuses it, and — the case a\n\t// plain `--porcelain` cannot see — gitignored files refuse it too\n\t// (`!` records), which is why git's plain removal of a\n\t// gitignore-only tree errors out even though `status --porcelain`\n\t// reads empty;\n\t// c. submodule dirt: git plain-refuses a tree with modified submodule\n\t// content, which a `!`/`?`-free porcelain read would miss — a\n\t// read-only `worktree remove` probe catches that residual class,\n\t// and only that class, by its 128 exit with the dir still intact.\n\t//\n\t// A refused probe throws before anything moves; a passing one is the\n\t// tree git itself certifies removable, which is the moment the rename\n\t// is safe to be instant.\n\tif (!force) {\n\t\tconst status = await execArgv(\n\t\t\t\"git\",\n\t\t\t[\"-C\", path, \"status\", \"--porcelain=v2\", \"--ignored=matching\"],\n\t\t\trepoRoot,\n\t\t)\n\t\tif (status.exitCode !== 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`git status failed in ${path} (exit ${status.exitCode}): ${status.stderr.trim() || status.stdout.trim()}`,\n\t\t\t)\n\t\t}\n\t\tif (status.stdout.trim().length > 0) {\n\t\t\tconst probe = await execArgv(\"git\", [\"-C\", repoRoot, \"worktree\", \"remove\", path], repoRoot)\n\t\t\tif (probe.exitCode !== 0) {\n\t\t\t\t// Git's own refusal (the common case: real dirt). Nothing moved.\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`git worktree remove failed (exit ${probe.exitCode}): ${probe.stderr.trim() || probe.stdout.trim()}`,\n\t\t\t\t)\n\t\t\t}\n\t\t\t// The status read saw dirt the removal tolerates (a gitignored path\n\t\t\t// that a `.gitignore` in the worktree shadows differently than in\n\t\t\t// the main repo, etc.) — git itself just removed the worktree, so\n\t\t\t// there is nothing left to rename; fall back to the old path's\n\t\t\t// final steps (branch handling stays the caller's).\n\t\t\tawait execGit(repoRoot, [\"worktree\", \"prune\"])\n\t\t\treturn\n\t\t}\n\t}\n\n\t// Safety gate (2): the path must actually be a linked worktree of\n\t// `repoRoot` before we rename anything — a stale/duplicate call must fail\n\t// loudly here, not leave git's registration pointing at a renamed dir it\n\t// still tracks.\n\tconst list = await execArgv(\"git\", [\"-C\", repoRoot, \"worktree\", \"list\", \"--porcelain\"], repoRoot)\n\tif (list.exitCode !== 0) {\n\t\tthrow new Error(\n\t\t\t`git worktree list failed (exit ${list.exitCode}): ${list.stderr.trim() || list.stdout.trim()}`,\n\t\t)\n\t}\n\tconst registered = new Set(\n\t\tlist.stdout\n\t\t\t.split(\"\\n\")\n\t\t\t.filter((line) => line.startsWith(\"worktree \"))\n\t\t\t.map((line) => line.slice(\"worktree \".length).trim()),\n\t)\n\t// git reports each worktree under its own realpath — a caller passing a\n\t// symlinked spelling (macOS /tmp → /private/tmp, the default test/tmpdir\n\t// shape on this host) would never string-match. Compare through realpath\n\t// on BOTH sides (falling back to the literal path when realpath fails,\n\t// e.g. a dangling registration); a genuinely-unregistered path still\n\t// fails here, leaving everything untouched.\n\tconst registeredReal = new Set([...registered].map(realOrResolved))\n\tif (!registeredReal.has(realOrResolved(path))) {\n\t\tthrow new Error(`not a linked worktree of ${repoRoot}: ${path}`)\n\t}\n\n\t// Fast path: rename to a same-volume trash dir (instant, even for\n\t// hundreds of thousands of files), prune the registration, hand the\n\t// bytes to a detached background child.\n\tconst poolDir = join(path, \"..\")\n\tconst stamp = (options.now ?? Date.now)()\n\tconst trashDir = join(poolDir, WORKTREE_TRASH_DIRNAME, `${basename(path)}-${stamp}`)\n\ttry {\n\t\t// The trash parent may not exist yet (first removal in this pool) —\n\t\t// `rename` gives ENOENT rather than creating it. `mkdirSync` is\n\t\t// idempotent and instant; a failure here (or in `rename` below) falls\n\t\t// back to the plain removal.\n\t\tif (!existsSync(join(poolDir, WORKTREE_TRASH_DIRNAME))) {\n\t\t\tmkdirSync(join(poolDir, WORKTREE_TRASH_DIRNAME))\n\t\t}\n\t\tawait rename(path, trashDir)\n\t} catch {\n\t\t// Fallback (cross-device link, permission, trash parent unmountable…):\n\t\t// today's slow, plain removal — behavior identical to before.\n\t\tawait execGit(repoRoot, force ? [\"worktree\", \"remove\", \"--force\", path] : [\"worktree\", \"remove\", path])\n\t\treturn\n\t}\n\tawait execGit(repoRoot, [\"worktree\", \"prune\"])\n\n\t// Background deletion: detached so the parent (and its event loop) never\n\t// waits for the unlinks; `.unref()` so the parent can exit first.\n\tif (options.spawnRemoval) {\n\t\toptions.spawnRemoval(trashDir)\n\t} else {\n\t\tspawn(\"rm\", [\"-rf\", trashDir], { detached: true, stdio: \"ignore\" }).unref()\n\t}\n}\n\n/**\n * Delete every leftover `.trash/*` dir under `root` in the background — the\n * sweep that keeps rename-removal self-cleaning when a detached `rm` child\n * was killed before finishing (or a host rebooted mid-delete). Called at the\n * start of a `gc` apply, where seconds of stale bytes are harmless. Missing\n * root is a no-op, not an error.\n */\nexport function sweepWorktreeTrash(root: string, options: { spawnRemoval?: (dir: string) => void } = {}): void {\n\t// Sync read is deliberate: the caller (gc apply) wants to fire the sweep\n\t// and move on in the same tick, without awaiting an async dependency\n\t// chain just to list a directory. A missing/unreadable trash dir means\n\t// \"nothing swept\", not an error.\n\tlet names: string[]\n\ttry {\n\t\tnames = readdirSync(join(root, WORKTREE_TRASH_DIRNAME))\n\t} catch {\n\t\treturn\n\t}\n\tfor (const name of names) {\n\t\tconst trashDir = join(root, WORKTREE_TRASH_DIRNAME, name)\n\t\tif (options.spawnRemoval) {\n\t\t\toptions.spawnRemoval(trashDir)\n\t\t} else {\n\t\t\tspawn(\"rm\", [\"-rf\", trashDir], { detached: true, stdio: \"ignore\" }).unref()\n\t\t}\n\t}\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 type ComputeProvenanceOptions,\n type ProvenanceInfo,\n} from \"./provenance.js\"\n\n// ── tree axis ─────────────────────────────────────────────────────────\n\nexport type TreeState =\n | {\n state: \"clean\"\n /**\n * Set only when the tree is clean BECAUSE every dirty path was on the\n * caller's noise allowlist (`ComputeTreeStateOptions.noisePaths`) — the\n * paths a removal must restore/delete first, since git's own\n * non-`--force` `worktree remove` still sees them as dirt.\n */\n noise?: string[]\n }\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 * Set to `.plans/` when every non-noise dirty path starts with it —\n * i.e. the ENTIRE tree's dirt lives under `.plans/`. `undefined`\n * otherwise (mixed dirt, or dirt outside `.plans/` entirely). Feeds\n * gc's plans-only salvage rule (`classifyForGc`, gc.ts): `.plans/`\n * holds the user's plan files, never to be discarded, but also never a\n * reason to hold a no-commit worktree forever.\n */\n onlyUnder?: string\n }\n\nexport interface ComputeTreeStateOptions {\n /**\n * Worktree-relative paths whose dirt is known noise (e.g. a tool's lockfile\n * churn that shows up in every agent worktree). A tree whose ONLY dirt is\n * on this list reads `clean` (with `noise` set). Default none — callers\n * opt in; see `DEFAULT_GC_NOISE_PATHS` in `gc.ts` for gc's default.\n */\n noisePaths?: readonly string[]\n}\n\n/** The (current) path of one `status --porcelain=v2` record, `null` for a header/unknown line. */\nfunction porcelainV2Path(line: string): string | null {\n const parts = line.split(\" \")\n if (line.startsWith(\"? \") || line.startsWith(\"! \")) return line.slice(2)\n if (line.startsWith(\"1 \")) return parts.slice(8).join(\" \")\n if (line.startsWith(\"2 \")) return (parts.slice(9).join(\" \").split(\"\\t\")[0] ?? \"\")\n if (line.startsWith(\"u \")) return parts.slice(10).join(\" \")\n return null\n}\n\n/**\n * `git status --porcelain=v2` in the worktree itself, via `-C worktreePath`\n * (tree state is per-worktree, not `repoRoot`'s). The spawn's own `cwd`,\n * though, is `repoRoot` — the main checkout, which git itself refuses to\n * remove (`gc.ts`'s docblock) — NOT `worktreePath`: a linked worktree can be\n * removed by a concurrent `gc` reap while this call (or a racing caller\n * reading the same worktree, e.g. a status poll) is in flight, and a spawn\n * whose `cwd` no longer exists on disk fails `ENOENT` on the COMMAND itself\n * (a Node/libuv quirk, not \"directory not found\") — exactly the failure mode\n * `exec.ts`'s `execGit` already anchors against. Gitignored files never\n * appear here (no `--ignored` flag passed), matching git's own non-`--force`\n * `worktree remove` tolerance for them (PLAN.md §0.5) — the two notions of\n * \"clean\" agree by construction.\n */\nexport async function computeTreeState(\n repoRoot: string,\n worktreePath: string,\n options: ComputeTreeStateOptions = {},\n): Promise<TreeState> {\n // `--no-optional-locks`: a plain `status` opportunistically rewrites the\n // index to refresh its stat cache — in a live worktree that is both a lock\n // contender for the session working there and a false \"recent activity\"\n // signal for anything reading the index mtime. A read must not write.\n const noiseSet = new Set(options.noisePaths ?? [])\n // With an allowlist, untracked files must be listed one by one: by default\n // git collapses a wholly-untracked directory to `? dir/`, which no noise\n // path could ever match.\n const statusArgs = [\"--no-optional-locks\", \"-C\", worktreePath, \"status\", \"--porcelain=v2\"]\n if (noiseSet.size > 0) statusArgs.push(\"--untracked-files=all\")\n const res = await execArgv(\"git\", statusArgs, repoRoot)\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 const noise: string[] = []\n const dirtyPaths: string[] = []\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 const path = porcelainV2Path(line)\n if (path !== null && noiseSet.has(path)) {\n noise.push(path)\n continue\n }\n if (path !== null) dirtyPaths.push(path)\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 noise.length > 0 ? { state: \"clean\", noise } : { state: \"clean\" }\n const onlyUnder = dirtyPaths.length > 0 && dirtyPaths.every((p) => p.startsWith(\".plans/\")) ? \".plans/\" : undefined\n return {\n state: \"dirty\",\n modified,\n staged,\n untracked,\n newestMtimeMs: await newestDirtyMtimeMs(repoRoot, worktreePath),\n ...(onlyUnder ? { onlyUnder } : {}),\n }\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. Spawn\n * `cwd` is `repoRoot`, not `worktreePath` — see `computeTreeState`'s doc.\n */\nasync function newestDirtyMtimeMs(repoRoot: string, worktreePath: string): Promise<number | null> {\n const [unstaged, staged, untracked] = await Promise.all([\n execArgv(\"git\", [\"--no-optional-locks\", \"-C\", worktreePath, \"diff\", \"--name-only\", \"-z\"], repoRoot),\n execArgv(\"git\", [\"--no-optional-locks\", \"-C\", worktreePath, \"diff\", \"--cached\", \"--name-only\", \"-z\"], repoRoot),\n execArgv(\"git\", [\"--no-optional-locks\", \"-C\", worktreePath, \"ls-files\", \"--others\", \"--exclude-standard\", \"-z\"], repoRoot),\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\n/**\n * NUL joins the parts because it cannot occur in a repo name, a git ref, or a\n * sha — so the key needs no escaping to stay unambiguous. It is written as the\n * `\\u0000` escape and must stay that way: a literal NUL byte in the source\n * makes this whole file read as binary to `grep` and `file`, which silently\n * returns no matches for it rather than erroring.\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 * Set to git's own reason string (e.g. `\"gitdir file points to\n * non-existent location\"`) when `git worktree list --porcelain` itself\n * marks this entry prunable — its working directory is gone, so no git\n * command can be run with it as `-C` target. `undefined` for every\n * ordinary, live entry. This is git's own signal, not re-derived via\n * `existsSync` or any other filesystem check of our own.\n */\n prunable?: string\n}\n\n/** Pure parser for `git worktree list --porcelain` output — split out so the line format can be unit-tested without a real repo. */\nexport function parseGitWorktreePorcelain(stdout: string): GitWorktreeRef[] {\n const entries: GitWorktreeRef[] = []\n let current: GitWorktreeRef | null = null\n for (const line of 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 } else if (current && line.startsWith(\"prunable \")) {\n current.prunable = line.slice(\"prunable \".length)\n }\n }\n if (current) entries.push(current)\n return entries\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 return parseGitWorktreePorcelain(res.stdout)\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 *\n * `options.sessionsPath` is passed straight to `readSessionsRegistry`\n * un-defaulted — same as `computeProvenance` — so an omitted path resolves\n * to the bucket-union-plus-legacy read (AIP-46 §State partitioning,\n * `provenance.ts`'s header), not just the frozen legacy file. Defaulting to\n * `SESSIONS_FILE_PATH()` here used to silently blind this check to every\n * session living in a per-workspace bucket — i.e. every session created\n * after the AIP-46 partitioning shipped — which is how a running session's\n * own cwd got classified `reclaim` by `gc` in production.\n */\nexport async function computeLiveness(\n worktreePath: string,\n options: ComputeProvenanceOptions = {},\n): Promise<LivenessState> {\n const registry = await readSessionsRegistry(options.sessionsPath)\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 // A live session in the worktree holds it regardless of how the dirt\n // looks — `salvage` must never archive/remove a worktree out from under\n // a running agent, exactly like the reclaim branch above. Only then does\n // the recent-write backstop apply.\n if (!idleOrUnreachable) return { reclaimable: false, class: \"hold\" }\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// ── base divergence ──────────────────────────────────────────────────\n\n/** How far a worktree's tip has moved from the base it is compared against. */\nexport interface BaseDivergence {\n /** The ref the tip is compared against (`defaultBranchRef`, e.g. `origin/main`). */\n ref: string\n /** Commits on the tip that the base doesn't have. */\n ahead: number\n /** Commits on the base that the tip doesn't have. */\n behind: number\n}\n\n/**\n * `git rev-list --left-right --count <base>...<head>`: one read, both sides\n * of the symmetric difference. `null` for a detached/unborn tip, or when git\n * can't resolve either side (base ref never fetched, object gone) — a\n * best-effort display fact, never a reason to fail a status sweep. Spawn\n * `cwd` is `repoRoot`, like every other read here (see `computeTreeState`).\n */\nexport async function computeBaseDivergence(\n repoRoot: string,\n head: string,\n baseRef: string,\n): Promise<BaseDivergence | null> {\n if (!head) return null\n const res = await execArgv(\n \"git\",\n [\"-C\", repoRoot, \"rev-list\", \"--left-right\", \"--count\", `${baseRef}...${head}`],\n repoRoot,\n )\n if (res.exitCode !== 0) return null\n const [behind, ahead] = res.stdout.trim().split(/\\s+/).map((n) => Number.parseInt(n, 10))\n if (!Number.isFinite(ahead) || !Number.isFinite(behind)) return null\n return { ref: baseRef, ahead: ahead as number, behind: behind as number }\n}\n\n// ── orchestration ────────────────────────────────────────────────────\n\nexport interface WorktreeStatusEntry {\n path: string\n branch: string | null\n head: string\n /** Ahead/behind vs `defaultBranchRef` — see `computeBaseDivergence`. */\n base: BaseDivergence | null\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 /** See `ComputeTreeStateOptions.noisePaths`. Default none. */\n noisePaths?: readonly string[]\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, base] = await Promise.all([\n computeTreeState(input.repoRoot, input.worktree.path, input.noisePaths ? { noisePaths: input.noisePaths } : {}),\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.repoRoot, input.worktree.path, { sessionsPath: input.sessionsPath }),\n computeBaseDivergence(input.repoRoot, input.worktree.head, input.defaultBranchRef ?? \"origin/main\"),\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 base,\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 * Compute only the worktrees at these paths (compared resolved) — a\n * single-worktree read (the per-session `worktree_status` lookup) costs one\n * forge round-trip instead of one per worktree in the repo. Omitted = all.\n */\n paths?: readonly 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 all = await listGitWorktrees(input.repoRoot)\n const only = input.paths ? new Set(input.paths.map((p) => resolve(p))) : null\n const worktrees = only ? all.filter((w) => only.has(resolve(w.path))) : all\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 { removeWorktreeFast } from \"../../fast-remove.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 // Every removal below goes through `removeWorktreeFast` (fast-remove.ts):\n // rename to a same-volume trash dir + `worktree prune`, bytes deleted by\n // a detached background child — `git worktree remove`'s per-file unlink\n // loop measured ~10 minutes on a pnpm worktree on an external SSD, and\n // nothing here waits on that. The fast helper performs the same\n // cleanliness gate a plain `git worktree remove` performs (and falls\n // back to it wholesale when the rename fails), so the refusal semantics\n // each branch below encodes are unchanged.\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.repoRoot, 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 removeWorktreeFast(input.repoRoot, input.cwd, { force: true })\n } else {\n await removeWorktreeFast(input.repoRoot, input.cwd)\n }\n } else {\n // No discard flag: git's own refusal is the final arbiter (PLAN.md\n // §5.2 layer 3) — re-implemented by `removeWorktreeFast` as the same\n // non-force gate (refuse on `git status --porcelain` output). A\n // dirty tree surfaces as the same typed error without claiming to\n // know which class blocked it (we never asked).\n try {\n await removeWorktreeFast(input.repoRoot, 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"]}