@agentproto/cli 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/registry/resolve.ts","../src/commands/setup.ts","../src/commands/install-profile.ts","../src/commands/install.ts","../src/util/stdin.ts","../src/commands/run.ts","../src/util/credentials.ts","../src/util/pty-factory.ts","../../runtime/src/config.ts","../../runtime/src/workspaces-config.ts","../../define-doctype/src/index.ts","../../manifest/src/index.ts","../../extension/src/schema.ts","../../extension/src/define-extension.ts","../../extension/src/manifest/index.ts","../../extension/src/spec-from-extension.ts","../../mcp-server/src/index.ts","../../runtime/src/agentproto-dir.ts","../../runtime/src/command-tools.ts","../../runtime/src/conversations.ts","../../runtime/src/events.ts","../../runtime/src/fs-tools.ts","../../runtime/src/mcp-discovery.ts","../../runtime/src/mcp-imports.ts","../../runtime/src/session-tools.ts","../../runtime/src/heartbeat.ts","../../runtime/src/http-server.ts","../../runtime/src/resume-strategies.ts","../../runtime/src/sessions.ts","../../runtime/src/mcp-proxy.ts","../../runtime/src/remote-providers/quick.ts","../../runtime/src/remote-controller.ts","../../runtime/src/remote-tools.ts","../../runtime/src/workspace-fs.ts","../../runtime/src/index.ts","../src/commands/serve.ts"],"names":["fs","resolvePath","stat","resolve","input","output","parseArgs","ledgerPathFor","loadLedger","readFile","chmod","saveLedger","dirname","writeFile","mkdir","join","homedir","createHash","spawn","text","isAbsolute","rm","matter","z","readdir","unlink","existsSync","normalize","relative","WORKSPACES_CONFIG_VERSION","DEFAULT_CONFIG_DIR","DEFAULT_CONFIG_PATH","sanitizeSlug","loadWorkspacesConfig","normalizeConfig","server","id","EventEmitter","rt","randomBytes","sha256","fsReadFile","fsWriteFile","randomUUID","createAgentCliRuntime","headers"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Resolve a slug like \"claude-code\" to a runnable `AgentCliHandle`.\n *\n * Resolution order:\n * 1. `@agentproto/adapter-<slug>` from npm (must default-export or\n * named-export an `AgentCliHandle` — convention is the camelCased\n * slug, e.g. `claudeCode`).\n * 2. (TODO) `~/.agentproto/adapters/<slug>/AGENT-CLI.md` on disk.\n * 3. (TODO) bundled fallbacks for the canonical adapters.\n *\n * Step 1 covers 100% of v0 usage. The on-disk path is only there for\n * users authoring their own adapters; we'll add it once `defineAgentCli`\n * supports MD-source authoring end to end.\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { resolve as resolvePath } from \"node:path\"\nimport type { AgentCliHandle } from \"@agentproto/driver-agent-cli\"\n\nexport interface ResolvedAdapter {\n readonly slug: string\n readonly handle: AgentCliHandle\n readonly source: \"npm\" | \"file\" | \"bundled\"\n readonly packageName?: string\n}\n\n/**\n * Compact metadata about an installed adapter — the shape returned\n * by `listInstalledAdapters()` and exposed via the daemon's\n * `GET /adapters` route + `list_adapters` MCP tool. Only fields\n * safe to surface in a UI list (no install scripts, no env keys).\n * For full handle access call `resolveAdapter(slug)`.\n */\nexport interface AdapterInfo {\n slug: string\n /** Display name from the manifest. */\n name: string\n /** Adapter package version (matches npm package.json `version`). */\n version: string\n /** One-line user-facing description. */\n description: string\n /** Wire protocol — informs prompt/multi-turn semantics. */\n protocol: string\n /** True when the adapter advertises a streaming session contract. */\n streaming: boolean\n /** npm package name (for install hints / \"open in npmjs.com\" links). */\n packageName: string\n}\n\nconst slugToCamel = (slug: string): string =>\n slug.replace(/-([a-z0-9])/g, (_, c: string) => c.toUpperCase())\n\nexport async function resolveAdapter(slug: string): Promise<ResolvedAdapter> {\n if (!/^[a-z][a-z0-9-]*$/.test(slug)) {\n throw new Error(\n `agentproto: invalid adapter slug '${slug}'. Slugs are lower-kebab.`\n )\n }\n\n const packageName = `@agentproto/adapter-${slug}`\n let mod: Record<string, unknown>\n try {\n mod = (await import(packageName)) as Record<string, unknown>\n } catch (err) {\n const cause = err instanceof Error ? err.message : String(err)\n throw new Error(\n `agentproto: could not load adapter '${slug}'. ` +\n `Tried '${packageName}'. Install it with: npm i -g ${packageName}\\n cause: ${cause}`\n )\n }\n\n const camel = slugToCamel(slug)\n const candidate =\n (mod[camel] as AgentCliHandle | undefined) ??\n (mod.default as AgentCliHandle | undefined) ??\n (mod.handle as AgentCliHandle | undefined)\n\n if (!candidate || typeof candidate !== \"object\" || !(\"name\" in candidate)) {\n throw new Error(\n `agentproto: adapter '${packageName}' does not export an AgentCliHandle ` +\n `(looked for export '${camel}', 'default', or 'handle').`\n )\n }\n\n return { slug, handle: candidate, source: \"npm\", packageName }\n}\n\n/**\n * Enumerate every `@agentproto/adapter-*` package reachable from the\n * current node module-resolution path. Used by the daemon's\n * `GET /adapters` route and `list_adapters` MCP tool so UIs (web\n * spawn dialog) and operators can pick from the installed set\n * without trial-and-error against `resolveAdapter(slug)`.\n *\n * Implementation: walk `node_modules/@agentproto` looking for\n * `adapter-*` directories; for each, dynamic-import the package +\n * extract the AgentCliHandle's display fields. Failures (broken\n * exports, missing dist) are collected as warnings rather than\n * thrown — partial discovery beats failing the whole listing on\n * one bad adapter.\n *\n * Discovery is async + reads disk on every call; cache at the\n * caller layer if you list often. v0 does no caching here because\n * adapter sets typically change rarely (npm i / rm) and a fresh\n * scan stays fast (~10 packages worth of dynamic imports).\n */\nexport async function listInstalledAdapters(opts?: {\n /** Override the search root. Defaults to walking up from the cli\n * package's own location until we hit a `node_modules/@agentproto`. */\n searchRoot?: string\n}): Promise<AdapterInfo[]> {\n const roots = await collectAgentprotoNamespaceRoots(opts?.searchRoot)\n const seen = new Set<string>()\n const out: AdapterInfo[] = []\n // Two failure buckets so we can produce ONE summary line for the\n // expected case (adapter dir found by the walker but not importable\n // from the daemon's resolution path — i.e. workspace-hoisted, not\n // globally installed) and keep per-adapter warnings only for the\n // genuinely surprising ones (broken exports, missing dist, etc.).\n const notImportable: string[] = []\n\n for (const root of roots) {\n let entries: string[] = []\n try {\n entries = await fs.readdir(root)\n } catch {\n continue\n }\n for (const entry of entries) {\n if (!entry.startsWith(\"adapter-\")) continue\n const slug = entry.slice(\"adapter-\".length)\n if (seen.has(slug)) continue\n seen.add(slug)\n try {\n const resolved = await resolveAdapter(slug)\n const handle = resolved.handle as Record<string, unknown>\n const info: AdapterInfo = {\n slug,\n name: typeof handle.name === \"string\" ? handle.name : slug,\n version: typeof handle.version === \"string\" ? handle.version : \"?\",\n description:\n typeof handle.description === \"string\" ? handle.description : \"\",\n protocol:\n typeof handle.protocol === \"string\" ? handle.protocol : \"unknown\",\n streaming: !!(handle.capabilities as { streaming?: boolean })\n ?.streaming,\n packageName: resolved.packageName ?? `@agentproto/adapter-${slug}`,\n }\n out.push(info)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n // ERR_MODULE_NOT_FOUND / \"Cannot find package\" is the expected\n // shape when the walker finds an adapter dir hoisted in a\n // workspace's node_modules but that dir isn't reachable from\n // the daemon binary's NODE_PATH. Collapse those into a single\n // summary line below; anything else (broken handle export,\n // syntax error in dist, etc.) still warns individually.\n if (\n /Cannot find package|ERR_MODULE_NOT_FOUND/i.test(msg) &&\n msg.includes(`@agentproto/adapter-${slug}`)\n ) {\n notImportable.push(slug)\n } else {\n console.warn(\n `[agentproto/cli] listInstalledAdapters: skipping broken adapter '${slug}': ${msg}`\n )\n }\n }\n }\n }\n\n // We deliberately do NOT log `notImportable` to console. The\n // discovery walker often finds adapter directories hoisted in a\n // workspace's node_modules that aren't reachable from the daemon's\n // own NODE_PATH — that's a normal state for a fresh checkout and\n // not actionable from a daemon log line. Callers who want the info\n // can inspect the `listInstalledAdapters` return value (importable\n // adapters only); a future `agentproto adapters doctor` verb is the\n // right home for surfacing the unimportable slugs interactively.\n void notImportable\n\n return out.sort((a, b) => a.slug.localeCompare(b.slug))\n}\n\n/**\n * Walk up from the cli package looking for `node_modules/@agentproto`\n * directories. Returns every match (pnpm + global + nvm hoisting can\n * produce more than one) so adapters installed in any reachable\n * scope are discoverable.\n */\nasync function collectAgentprotoNamespaceRoots(\n start?: string\n): Promise<string[]> {\n const roots: string[] = []\n // Start from this package's own dir — works in ESM (import.meta.url\n // route would be cleaner but isn't needed; cwd is reliable enough\n // for the daemon use case where it boots from a known dir).\n let cur = start ?? process.cwd()\n // Both classic + pnpm-hoist locations. Classic npm puts the\n // namespace at node_modules/@agentproto; pnpm hoists to\n // node_modules/.pnpm/node_modules/@agentproto and symlinks\n // individual packages from there. We need to scan the hoist dir\n // for the listing because the namespace dir is the only place\n // where every adapter package is enumerable.\n const candidatesAt = (dir: string): string[] => [\n resolvePath(dir, \"node_modules\", \"@agentproto\"),\n resolvePath(dir, \"node_modules\", \".pnpm\", \"node_modules\", \"@agentproto\"),\n ]\n for (let depth = 0; depth < 16; depth++) {\n for (const candidate of candidatesAt(cur)) {\n try {\n const stat = await fs.stat(candidate)\n if (stat.isDirectory()) roots.push(candidate)\n } catch {\n /* not present at this level */\n }\n }\n const parent = resolvePath(cur, \"..\")\n if (parent === cur) break\n cur = parent\n }\n return roots\n}\n","/**\n * `agentproto setup <slug>` + `runSetup()` engine.\n *\n * Implements AIP-29 § Setup — the post-install configuration pipeline.\n * Steps run in declared order. Idempotency comes from three layers:\n *\n * 1. Manifest's `version_check` — already covered by `install`. If the\n * binary's version answers, install steps are skipped entirely\n * before setup ever runs.\n *\n * 2. Per-step `skip_if.cmd` — runs first; matching exit code skips\n * the step. Asks the live system, so it works on fresh machines\n * without any local state.\n *\n * 3. Setup ledger — `~/.agentproto/setup/<slug>.json`, records each\n * successful step with timestamp + (when applicable) which slot\n * received the value. Re-runs short-circuit ledger-known steps\n * unless --force is passed.\n *\n * The `runSetup()` export is what `agentproto install` calls after the\n * install array succeeds; `runSetupCommand()` is the standalone verb\n * (re-runs only setup, no install).\n *\n * Step `kind` matrix (current support):\n *\n * - cmd ✓ — shell command, optional skip_if + persist (stdout)\n * - prompt ✓ — text / boolean / select / secret; persist via env / secret_slug / cmd\n * - oauth ✗ — placeholder; needs a SECRETS.md driver wire-up\n * - external ⚠ — opens URL via xdg-open/open; callback polling not yet wired\n *\n * The unsupported kinds surface a clear \"not yet implemented\" message\n * so adapter authors can lean on cmd + prompt today and migrate later.\n */\n\nimport { spawn } from \"node:child_process\"\nimport { mkdir, readFile, writeFile, chmod } from \"node:fs/promises\"\nimport { homedir, platform } from \"node:os\"\nimport { join, dirname } from \"node:path\"\nimport { parseArgs } from \"node:util\"\nimport { createInterface } from \"node:readline/promises\"\nimport { stdin as input, stdout as output } from \"node:process\"\nimport type {\n AgentCliHandle,\n AgentCliSetupStep,\n AgentCliSetupSkipIf,\n AgentCliSetupPersist,\n} from \"@agentproto/driver-agent-cli\"\nimport { resolveAdapter } from \"../registry/resolve.js\"\n\ninterface LedgerEntry {\n /** Step id from the manifest. */\n stepId: string\n /** ISO-8601 timestamp the step succeeded (or was skipped via skip_if). */\n completedAt: string\n /** What kind of step this was — for forensic scrubbing. Persist values\n * are NEVER stored in the ledger; only the slot name where they\n * landed. */\n kind: AgentCliSetupStep[\"kind\"]\n /** Slot the captured value went into, when applicable. Format:\n * - `env:OPENCLAW_GATEWAY_URL`\n * - `secret:openclaw/gateway-token`\n * - `cmd` (the value was piped to a config command, not stored here)\n */\n persistedTo?: string\n /** True when the step short-circuited via skip_if instead of running. */\n skippedViaSkipIf?: boolean\n}\n\ninterface Ledger {\n /** Bundle id, matches the manifest's `id`. */\n slug: string\n /** When the ledger was last touched. */\n updatedAt: string\n /** One per step id. Most recent run wins. */\n steps: Record<string, LedgerEntry>\n /** Captured env-bound values — persist.env steps land here. The\n * installer + runner read from the secrets backend in production;\n * for the local CLI host we mirror them into the ledger so\n * `agentproto run` can lift them onto the spawn env without hitting\n * a remote vault. Restricted to 0600 perms by the writer. */\n envValues?: Record<string, string>\n}\n\nexport interface RunSetupOptions {\n slug: string\n handle: AgentCliHandle\n /** When true, ignore the ledger AND skip_if; re-runs every step. */\n force?: boolean\n /** When true, log what would happen but don't spawn / prompt. */\n dryRun?: boolean\n /** When set, only run the named step ids (in declared order). Useful\n * for re-running a single step after a manual fix. */\n only?: string[]\n}\n\nexport async function runSetup(opts: RunSetupOptions): Promise<number> {\n const steps = opts.handle.setup ?? []\n if (steps.length === 0) {\n process.stdout.write(`agentproto setup: no setup steps for '${opts.slug}'.\\n`)\n return 0\n }\n\n const ledgerPath = ledgerPathFor(opts.slug)\n const ledger = await loadLedger(ledgerPath, opts.slug)\n const onlySet = opts.only && opts.only.length > 0 ? new Set(opts.only) : null\n\n for (const [i, step] of steps.entries()) {\n if (onlySet && !onlySet.has(step.id)) continue\n\n const idx = `[${i + 1}/${steps.length}]`\n const head = `${idx} ${step.kind}/${step.id}`\n\n // Layer 3: ledger short-circuit (skipped on --force).\n const prev = ledger.steps[step.id]\n if (!opts.force && prev) {\n process.stdout.write(\n `${head} ✓ already completed (${prev.completedAt}${prev.skippedViaSkipIf ? \", via skip_if\" : \"\"}). Pass --force to re-run.\\n`\n )\n continue\n }\n\n // Layer 2: per-step skip_if.\n if (step.skip_if && !opts.force) {\n const ok = await checkSkipIf(step.skip_if)\n if (ok) {\n process.stdout.write(`${head} ✓ skip_if matched — skipping.\\n`)\n ledger.steps[step.id] = {\n stepId: step.id,\n kind: step.kind,\n completedAt: new Date().toISOString(),\n skippedViaSkipIf: true,\n }\n continue\n }\n }\n\n if (opts.dryRun) {\n process.stdout.write(`${head} (dry-run) — would execute.\\n`)\n continue\n }\n\n // Run the step.\n let entry: LedgerEntry | null = null\n try {\n switch (step.kind) {\n case \"cmd\":\n entry = await runCmdStep(step, ledger, head)\n break\n case \"prompt\":\n entry = await runPromptStep(step, ledger, head)\n break\n case \"external\":\n entry = await runExternalStep(step, ledger, head)\n break\n case \"oauth\":\n process.stderr.write(\n `${head} ✗ kind=oauth is not yet implemented in the local CLI host. ` +\n `Run the OAuth flow on the host that ships a SECRETS.md driver, then re-invoke.\\n`\n )\n return 1\n }\n } catch (err) {\n process.stderr.write(\n `${head} ✗ failed: ${err instanceof Error ? err.message : String(err)}\\n`\n )\n await saveLedger(ledgerPath, ledger)\n return 1\n }\n\n if (entry) {\n ledger.steps[step.id] = entry\n // Persist incrementally so a later step's failure doesn't lose\n // earlier successes (avoids re-prompting on next run).\n await saveLedger(ledgerPath, ledger)\n }\n }\n\n process.stdout.write(`agentproto: setup for '${opts.slug}' complete.\\n`)\n return 0\n}\n\n/**\n * `agentproto setup <slug>` — re-run the setup pipeline for an\n * already-installed bundle. Useful when adding new steps to an\n * adapter, fixing a broken step, or after a `--skip-setup` install.\n */\nexport async function runSetupCommand(args: readonly string[]): Promise<number> {\n const { values, positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {\n force: { type: \"boolean\", short: \"f\" },\n \"dry-run\": { type: \"boolean\" },\n only: { type: \"string\", multiple: true },\n },\n })\n const slug = positionals[0]\n if (!slug) {\n process.stderr.write(\n \"agentproto setup: missing adapter slug. Try: agentproto setup openclaw\\n\"\n )\n return 2\n }\n const adapter = await resolveAdapter(slug)\n return runSetup({\n slug,\n handle: adapter.handle,\n force: values.force ?? false,\n dryRun: values[\"dry-run\"] ?? false,\n ...(values.only ? { only: values.only } : {}),\n })\n}\n\n// ── Step runners ─────────────────────────────────────────────────────\n\nasync function runCmdStep(\n step: Extract<AgentCliSetupStep, { kind: \"cmd\" }>,\n ledger: Ledger,\n head: string\n): Promise<LedgerEntry> {\n if (step.description) process.stdout.write(`${head} ${step.description}\\n`)\n process.stdout.write(`${head} $ ${step.cmd}\\n`)\n const captured = await runShellCapturing(step.cmd, {\n timeoutMs: step.timeout_ms ?? 60_000,\n interactive: step.interactive ?? false,\n })\n if (captured.exitCode !== 0) {\n throw new Error(\n `cmd exited ${captured.exitCode}${captured.stderr ? \": \" + truncate(captured.stderr, 400) : \"\"}`\n )\n }\n // Persist the trimmed stdout when the step asks for it.\n let persistedTo: string | undefined\n if (step.persist) {\n const value = captured.stdout.trim()\n persistedTo = await applyPersist(step.persist, value, ledger)\n }\n return {\n stepId: step.id,\n kind: step.kind,\n completedAt: new Date().toISOString(),\n ...(persistedTo ? { persistedTo } : {}),\n }\n}\n\nasync function runPromptStep(\n step: Extract<AgentCliSetupStep, { kind: \"prompt\" }>,\n ledger: Ledger,\n head: string\n): Promise<LedgerEntry> {\n if (step.description) process.stdout.write(`${head} ${step.description}\\n`)\n const type = step.type ?? \"text\"\n\n let value: string\n switch (type) {\n case \"text\":\n case \"secret\":\n value = await promptString(step.prompt, {\n defaultValue: step.default,\n masked: type === \"secret\",\n })\n break\n case \"boolean\":\n value = (await promptBoolean(step.prompt, step.default === \"true\"))\n ? \"true\"\n : \"false\"\n break\n case \"select\": {\n const options = await resolveSelectOptions(step.options)\n if (options.length === 0) {\n throw new Error(\"select prompt has no options to choose from\")\n }\n value = await promptSelect(step.prompt, options, step.default)\n break\n }\n }\n\n let persistedTo: string | undefined\n if (step.persist) {\n persistedTo = await applyPersist(step.persist, value, ledger)\n }\n\n return {\n stepId: step.id,\n kind: step.kind,\n completedAt: new Date().toISOString(),\n ...(persistedTo ? { persistedTo } : {}),\n }\n}\n\nasync function runExternalStep(\n step: Extract<AgentCliSetupStep, { kind: \"external\" }>,\n ledger: Ledger,\n head: string\n): Promise<LedgerEntry> {\n if (step.description) process.stdout.write(`${head} ${step.description}\\n`)\n process.stdout.write(`${head} opening ${step.url}\\n`)\n const opener =\n platform() === \"darwin\"\n ? \"open\"\n : platform() === \"win32\"\n ? \"cmd\"\n : \"xdg-open\"\n const args = platform() === \"win32\" ? [\"/c\", \"start\", step.url] : [step.url]\n await new Promise<void>((resolve) => {\n const child = spawn(opener, args, { stdio: \"ignore\", detached: true })\n child.once(\"error\", () => resolve()) // best-effort\n child.once(\"spawn\", () => resolve())\n })\n\n // Callback polling (a host-allocated callback URL holding the result)\n // requires a local HTTP listener, which is reasonable in some hosts\n // but overkill for the agentproto CLI in v0.1. For now we fall back\n // to \"paste the result\" when the step declares a callback param;\n // the URL was opened above to start the flow.\n let value = \"\"\n if (step.callback?.param) {\n value = await promptString(\n `Paste the value of '${step.callback.param}' from the redirect`,\n { masked: false }\n )\n } else {\n process.stdout.write(`${head} done — press Enter when finished.\\n`)\n await promptString(\"(press Enter to continue)\", { masked: false })\n }\n\n let persistedTo: string | undefined\n if (step.persist && value) {\n persistedTo = await applyPersist(step.persist, value, ledger)\n }\n return {\n stepId: step.id,\n kind: step.kind,\n completedAt: new Date().toISOString(),\n ...(persistedTo ? { persistedTo } : {}),\n }\n}\n\n// ── skip_if check ────────────────────────────────────────────────────\n\nasync function checkSkipIf(skip: AgentCliSetupSkipIf): Promise<boolean> {\n const expectedCode = skip.exit_code ?? 0\n const captured = await runShellCapturing(skip.cmd, {\n timeoutMs: skip.timeout_ms ?? 5_000,\n interactive: false,\n })\n return captured.exitCode === expectedCode\n}\n\n// ── persist (env / secret_slug / cmd) ────────────────────────────────\n\nasync function applyPersist(\n persist: AgentCliSetupPersist,\n value: string,\n ledger: Ledger\n): Promise<string> {\n if (\"env\" in persist && persist.env) {\n if (!ledger.envValues) ledger.envValues = {}\n ledger.envValues[persist.env] = value\n return `env:${persist.env}`\n }\n if (\"secret_slug\" in persist && persist.secret_slug) {\n // The secrets backend is host-supplied. The local CLI host doesn't\n // ship one yet; we surface the slug so the operator can pipe the\n // value into their vault out-of-band. Recording the slug (NOT the\n // value) in the ledger is intentional — the ledger isn't a vault.\n process.stdout.write(\n `agentproto setup: store the prompted value in your secrets backend under slug '${persist.secret_slug}' ` +\n `(value not echoed; ledger records the slot only).\\n`\n )\n return `secret:${persist.secret_slug}`\n }\n if (\"cmd\" in persist && persist.cmd) {\n const cmd = persist.cmd.replace(/\\$\\{value\\}/g, shellEscape(value))\n const captured = await runShellCapturing(cmd, {\n timeoutMs: 60_000,\n interactive: false,\n })\n if (captured.exitCode !== 0) {\n throw new Error(`persist cmd exited ${captured.exitCode}`)\n }\n return \"cmd\"\n }\n throw new Error(\"persist block must declare exactly one of env / secret_slug / cmd\")\n}\n\n// ── prompt helpers ───────────────────────────────────────────────────\n\nasync function promptString(\n question: string,\n opts: { defaultValue?: string; masked?: boolean }\n): Promise<string> {\n // Node's readline doesn't natively mask; for `masked: true` we set\n // the terminal to no-echo for the duration of the prompt. Best-effort\n // — some non-TTY environments fall back to plain input with a warning.\n const isTty = process.stdin.isTTY ?? false\n const suffix = opts.defaultValue ? ` [${opts.defaultValue}]` : \"\"\n const prompt = `${question}${suffix}: `\n if (opts.masked && !isTty) {\n process.stdout.write(\n `agentproto: stdin is not a TTY — masked input falls back to plain. Avoid piping secrets in non-interactive mode.\\n`\n )\n }\n const rl = createInterface({ input, output, terminal: isTty })\n if (opts.masked && isTty) {\n // Toggle echo off via raw mode.\n process.stdin.setRawMode?.(true)\n let buf = \"\"\n process.stdout.write(prompt)\n return new Promise<string>((resolve) => {\n const onData = (chunk: Buffer) => {\n for (const code of chunk) {\n if (code === 0x0d /* CR */ || code === 0x0a /* LF */) {\n process.stdin.off(\"data\", onData)\n process.stdin.setRawMode?.(false)\n process.stdout.write(\"\\n\")\n rl.close()\n resolve(buf || opts.defaultValue || \"\")\n return\n }\n if (code === 0x03 /* Ctrl-C */) {\n process.stdin.off(\"data\", onData)\n process.stdin.setRawMode?.(false)\n rl.close()\n process.exit(130)\n }\n if (code === 0x7f /* DEL / backspace */ || code === 0x08) {\n buf = buf.slice(0, -1)\n continue\n }\n buf += String.fromCharCode(code)\n process.stdout.write(\"•\")\n }\n }\n process.stdin.on(\"data\", onData)\n })\n }\n try {\n const ans = (await rl.question(prompt)).trim()\n return ans || opts.defaultValue || \"\"\n } finally {\n rl.close()\n }\n}\n\nasync function promptBoolean(\n question: string,\n defaultYes: boolean\n): Promise<boolean> {\n const def = defaultYes ? \"Y/n\" : \"y/N\"\n const ans = await promptString(`${question} [${def}]`, { masked: false })\n if (!ans) return defaultYes\n return /^y(es)?$/i.test(ans)\n}\n\nasync function promptSelect(\n question: string,\n options: { value: string; label?: string }[],\n defaultValue: string | undefined\n): Promise<string> {\n process.stdout.write(`${question}\\n`)\n for (const [i, o] of options.entries()) {\n const star =\n defaultValue && o.value === defaultValue ? \"*\" : i === 0 ? \" \" : \" \"\n process.stdout.write(\n ` ${star} ${i + 1}) ${o.label ?? o.value}${o.label ? ` (${o.value})` : \"\"}\\n`\n )\n }\n const ans = await promptString(\n `Choose 1-${options.length}`,\n defaultValue ? { defaultValue } : { masked: false }\n )\n // Accept either the numeric index or a literal value.\n const asNum = Number.parseInt(ans, 10)\n if (Number.isFinite(asNum) && asNum >= 1 && asNum <= options.length) {\n return options[asNum - 1]!.value\n }\n const exact = options.find((o) => o.value === ans)\n if (exact) return exact.value\n if (defaultValue && options.some((o) => o.value === defaultValue)) {\n return defaultValue\n }\n throw new Error(\n `invalid selection '${ans}'; expected one of ${options.map((o) => o.value).join(\", \")}`\n )\n}\n\nasync function resolveSelectOptions(\n options: Extract<AgentCliSetupStep, { kind: \"prompt\" }>[\"options\"]\n): Promise<{ value: string; label?: string }[]> {\n if (!options) return []\n if (Array.isArray(options)) {\n return options.map((v) => ({ value: v }))\n }\n // Dynamic options: run the cmd, parse stdout (one option per line,\n // optional `value\\tlabel`).\n const captured = await runShellCapturing(options.cmd, {\n timeoutMs: options.timeout_ms ?? 30_000,\n interactive: false,\n })\n if (captured.exitCode !== 0) {\n throw new Error(\n `select options cmd exited ${captured.exitCode}: ${truncate(captured.stderr, 400)}`\n )\n }\n return captured.stdout\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter(Boolean)\n .map((line) => {\n const [value, label] = line.split(\"\\t\")\n const out: { value: string; label?: string } = { value: value! }\n if (label) out.label = label\n return out\n })\n}\n\n// ── shell helper ─────────────────────────────────────────────────────\n\nasync function runShellCapturing(\n cmd: string,\n opts: { timeoutMs: number; interactive: boolean }\n): Promise<{ exitCode: number; stdout: string; stderr: string }> {\n return new Promise((resolve) => {\n const child = spawn(\"bash\", [\"-lc\", cmd], {\n stdio: opts.interactive\n ? \"inherit\"\n : [\"ignore\", \"pipe\", \"pipe\"],\n })\n let stdout = \"\"\n let stderr = \"\"\n child.stdout?.on(\"data\", (c: Buffer) => {\n stdout += c.toString(\"utf8\")\n })\n child.stderr?.on(\"data\", (c: Buffer) => {\n stderr += c.toString(\"utf8\")\n })\n const timer = setTimeout(() => {\n child.kill(\"SIGTERM\")\n setTimeout(() => child.kill(\"SIGKILL\"), 1000)\n }, opts.timeoutMs)\n child.once(\"error\", () => {\n clearTimeout(timer)\n resolve({ exitCode: 127, stdout, stderr: stderr || \"spawn error\" })\n })\n child.once(\"exit\", (code) => {\n clearTimeout(timer)\n resolve({ exitCode: code ?? 0, stdout, stderr })\n })\n })\n}\n\nfunction shellEscape(s: string): string {\n // POSIX-style single-quote escape — wraps in single quotes and\n // closes/reopens around any literal single quote in the value.\n return `'${s.replace(/'/g, `'\"'\"'`)}'`\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length <= max ? s : s.slice(0, max - 3) + \"…\"\n}\n\n// ── ledger ───────────────────────────────────────────────────────────\n\nfunction ledgerPathFor(slug: string): string {\n const base =\n process.env[\"AGENTPROTO_HOME\"] ?? join(homedir(), \".agentproto\")\n return join(base, \"setup\", `${slug}.json`)\n}\n\nasync function loadLedger(path: string, slug: string): Promise<Ledger> {\n try {\n const raw = await readFile(path, \"utf8\")\n const parsed = JSON.parse(raw) as Ledger\n if (parsed.slug === slug && typeof parsed.steps === \"object\") return parsed\n } catch {\n // No ledger yet, or malformed — start fresh.\n }\n return {\n slug,\n updatedAt: new Date().toISOString(),\n steps: {},\n }\n}\n\nasync function saveLedger(path: string, ledger: Ledger): Promise<void> {\n ledger.updatedAt = new Date().toISOString()\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, JSON.stringify(ledger, null, 2))\n await chmod(path, 0o600).catch(() => {\n // chmod failures on Windows are non-fatal — the file lives in\n // %USERPROFILE% which is already user-private.\n })\n}\n","/**\n * `agentproto install runtime-profile/<name>` — copy a declared file\n * tree from `@agentproto/runtime-profile-<name>` into the user's repo.\n *\n * Source of truth: the profile package's `profile.json` manifest +\n * `files/` tree. The handler is dumb on purpose — it copies declared\n * files with per-entry merge strategies and records what landed in a\n * local ledger so re-runs can be idempotent and detect drift.\n */\n\nimport { readFile, writeFile, mkdir, stat, chmod } from \"node:fs/promises\"\nimport { dirname, resolve as resolvePath, join } from \"node:path\"\nimport { createHash } from \"node:crypto\"\nimport { homedir } from \"node:os\"\nimport { parseArgs } from \"node:util\"\n\ntype Strategy = \"overwrite\" | \"preserve\" | \"merge-json-deep\" | \"append\"\n\ntype ProfileFile = {\n src: string\n dest: string\n strategy: Strategy\n executable?: boolean\n}\n\ntype ProfileManifest = {\n schema: string\n slug: string\n version: string\n name: string\n description: string\n files: ProfileFile[]\n}\n\ntype LedgerEntry = {\n dest: string\n strategy: Strategy\n hashAfter: string\n appliedAt: string\n}\n\ntype Ledger = {\n slug: string\n version: string\n installedAt: string\n updatedAt: string\n files: LedgerEntry[]\n}\n\nexport async function runInstallProfile(\n slug: string,\n args: readonly string[]\n): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {\n force: { type: \"boolean\", short: \"f\" },\n \"dry-run\": { type: \"boolean\" },\n \"skip-setup\": { type: \"boolean\" },\n cwd: { type: \"string\" },\n package: { type: \"string\" },\n },\n })\n\n if (!slug.startsWith(\"runtime-profile/\")) {\n process.stderr.write(\n `agentproto install: expected slug starting with 'runtime-profile/', got '${slug}'.\\n`\n )\n return 2\n }\n const profileName = slug.slice(\"runtime-profile/\".length)\n if (!/^[a-z][a-z0-9-]*$/.test(profileName)) {\n process.stderr.write(\n `agentproto install: invalid profile name '${profileName}'. Lower-kebab only.\\n`\n )\n return 2\n }\n\n // Resolution order for the backing npm package:\n // 1. Explicit `--package <name>` override.\n // 2. `profileAliases[<slug>]` in `~/.agentproto/config.json`.\n // 3. Default convention: `@agentproto/runtime-profile-<slug>`.\n let packageName: string\n if (typeof values.package === \"string\" && values.package) {\n packageName = values.package\n } else {\n const aliased = await readProfileAlias(profileName)\n packageName = aliased ?? `@agentproto/runtime-profile-${profileName}`\n }\n let mod: Record<string, unknown>\n try {\n mod = (await import(packageName)) as Record<string, unknown>\n } catch (err) {\n const cause = err instanceof Error ? err.message : String(err)\n process.stderr.write(\n `agentproto install: could not load profile package '${packageName}'. Install it first with: npm i -g ${packageName}\\n cause: ${cause}\\n`\n )\n return 1\n }\n const filesDir =\n typeof mod.FILES_DIR === \"string\" ? (mod.FILES_DIR as string) : null\n const loadProfileManifest = mod.loadProfileManifest as\n | (() => Promise<ProfileManifest>)\n | undefined\n if (!filesDir || !loadProfileManifest) {\n process.stderr.write(\n `agentproto install: profile package '${packageName}' does not export FILES_DIR + loadProfileManifest.\\n`\n )\n return 1\n }\n\n const manifest = await loadProfileManifest()\n\n const cwd = values.cwd ? resolvePath(values.cwd) : process.cwd()\n const dryRun = values[\"dry-run\"] === true\n const force = values.force === true\n\n process.stdout.write(\n `agentproto install ${slug} v${manifest.version} → ${cwd}\\n` +\n ` ${manifest.description}\\n`\n )\n\n const ledgerPath = ledgerPathFor(profileName)\n const prevLedger = await loadLedger(ledgerPath)\n\n const newLedger: Ledger = {\n slug,\n version: manifest.version,\n installedAt: prevLedger?.installedAt ?? new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n files: [],\n }\n\n let applied = 0\n let skipped = 0\n let failed = 0\n\n for (const entry of manifest.files) {\n const src = resolvePath(filesDir, entry.src)\n const dest = resolvePath(cwd, entry.dest)\n const prev = prevLedger?.files.find((f) => f.dest === entry.dest) ?? null\n\n try {\n const srcBuf = await readFile(src)\n const result = await applyStrategy({\n strategy: entry.strategy,\n srcBuf,\n dest,\n prev,\n force,\n dryRun,\n })\n newLedger.files.push({\n dest: entry.dest,\n strategy: entry.strategy,\n hashAfter: result.hashAfter,\n appliedAt: result.wrote ? new Date().toISOString() : prev?.appliedAt ?? new Date().toISOString(),\n })\n if (result.wrote) {\n applied += 1\n process.stdout.write(` ${result.action.padEnd(10)} ${entry.dest}\\n`)\n if (entry.executable && !dryRun) {\n await chmod(dest, 0o755)\n }\n } else {\n skipped += 1\n process.stdout.write(` ${result.action.padEnd(10)} ${entry.dest}\\n`)\n }\n } catch (err) {\n failed += 1\n const msg = err instanceof Error ? err.message : String(err)\n process.stderr.write(` FAIL ${entry.dest} — ${msg}\\n`)\n }\n }\n\n if (!dryRun) {\n await saveLedger(ledgerPath, newLedger)\n }\n\n process.stdout.write(\n `agentproto install ${slug}: ${applied} applied, ${skipped} skipped, ${failed} failed${dryRun ? \" (dry-run)\" : \"\"}\\n`\n )\n\n return failed === 0 ? 0 : 1\n}\n\ntype ApplyResult = {\n wrote: boolean\n action: string\n hashAfter: string\n}\n\nasync function applyStrategy(opts: {\n strategy: Strategy\n srcBuf: Buffer\n dest: string\n prev: LedgerEntry | null\n force: boolean\n dryRun: boolean\n}): Promise<ApplyResult> {\n const { strategy, srcBuf, dest, prev, force, dryRun } = opts\n\n const destExists = await fileExists(dest)\n\n if (strategy === \"preserve\") {\n if (destExists) {\n const currentHash = await hashFile(dest)\n return { wrote: false, action: \"preserve\", hashAfter: currentHash }\n }\n if (!dryRun) {\n await ensureDir(dirname(dest))\n await writeFile(dest, srcBuf)\n }\n return { wrote: true, action: \"create\", hashAfter: sha256(srcBuf) }\n }\n\n if (strategy === \"overwrite\") {\n const srcHash = sha256(srcBuf)\n if (destExists && !force) {\n const destHash = await hashFile(dest)\n if (destHash === srcHash) {\n return { wrote: false, action: \"unchanged\", hashAfter: destHash }\n }\n if (prev && prev.hashAfter !== destHash) {\n // The user edited this file after our last install. Don't\n // clobber without --force.\n return {\n wrote: false,\n action: \"user-edit\",\n hashAfter: destHash,\n }\n }\n }\n if (!dryRun) {\n await ensureDir(dirname(dest))\n await writeFile(dest, srcBuf)\n }\n return {\n wrote: true,\n action: destExists ? \"update\" : \"create\",\n hashAfter: srcHash,\n }\n }\n\n if (strategy === \"merge-json-deep\") {\n const srcJson = parseJsonOrThrow(srcBuf.toString(\"utf8\"), \"src\")\n let merged: unknown = srcJson\n if (destExists) {\n const destRaw = await readFile(dest, \"utf8\")\n const destJson = parseJsonOrThrow(destRaw, \"dest\")\n merged = deepMerge(destJson, srcJson)\n }\n const out = `${JSON.stringify(merged, null, 2)}\\n`\n const outBuf = Buffer.from(out, \"utf8\")\n const outHash = sha256(outBuf)\n if (destExists) {\n const destHash = await hashFile(dest)\n if (destHash === outHash) {\n return { wrote: false, action: \"unchanged\", hashAfter: destHash }\n }\n }\n if (!dryRun) {\n await ensureDir(dirname(dest))\n await writeFile(dest, outBuf)\n }\n return {\n wrote: true,\n action: destExists ? \"merge\" : \"create\",\n hashAfter: outHash,\n }\n }\n\n if (strategy === \"append\") {\n const srcText = srcBuf.toString(\"utf8\")\n if (destExists) {\n const destText = await readFile(dest, \"utf8\")\n if (destText.includes(srcText)) {\n return {\n wrote: false,\n action: \"unchanged\",\n hashAfter: sha256(Buffer.from(destText, \"utf8\")),\n }\n }\n const out = `${destText.endsWith(\"\\n\") ? destText : `${destText}\\n`}${srcText}`\n const outBuf = Buffer.from(out, \"utf8\")\n if (!dryRun) {\n await ensureDir(dirname(dest))\n await writeFile(dest, outBuf)\n }\n return { wrote: true, action: \"append\", hashAfter: sha256(outBuf) }\n }\n if (!dryRun) {\n await ensureDir(dirname(dest))\n await writeFile(dest, srcBuf)\n }\n return { wrote: true, action: \"create\", hashAfter: sha256(srcBuf) }\n }\n\n throw new Error(`Unknown strategy: ${strategy}`)\n}\n\nfunction deepMerge(target: unknown, source: unknown): unknown {\n if (\n target &&\n source &&\n typeof target === \"object\" &&\n typeof source === \"object\" &&\n !Array.isArray(target) &&\n !Array.isArray(source)\n ) {\n const out: Record<string, unknown> = { ...(target as Record<string, unknown>) }\n for (const [k, v] of Object.entries(source as Record<string, unknown>)) {\n out[k] = deepMerge((target as Record<string, unknown>)[k], v)\n }\n return out\n }\n if (Array.isArray(target) && Array.isArray(source)) {\n // Concat + dedup-by-JSON. Cheap and safe for hook arrays and\n // permission lists (which are the realistic merge targets).\n const seen = new Set<string>()\n const out: unknown[] = []\n for (const item of [...target, ...source]) {\n const key = JSON.stringify(item)\n if (seen.has(key)) continue\n seen.add(key)\n out.push(item)\n }\n return out\n }\n return source ?? target\n}\n\nfunction parseJsonOrThrow(raw: string, side: \"src\" | \"dest\"): unknown {\n try {\n return JSON.parse(raw)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n throw new Error(`merge-json-deep ${side} not valid JSON: ${msg}`)\n }\n}\n\nfunction sha256(buf: Buffer): string {\n return createHash(\"sha256\").update(buf).digest(\"hex\")\n}\n\nasync function hashFile(path: string): Promise<string> {\n const buf = await readFile(path)\n return sha256(buf)\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await stat(path)\n return true\n } catch {\n return false\n }\n}\n\nasync function ensureDir(dir: string): Promise<void> {\n try {\n await stat(dir)\n } catch {\n await mkdir(dir, { recursive: true })\n }\n}\n\nfunction ledgerPathFor(profileName: string): string {\n return join(homedir(), \".agentproto\", \"profiles\", `${profileName}.json`)\n}\n\nasync function loadLedger(path: string): Promise<Ledger | null> {\n try {\n const raw = await readFile(path, \"utf8\")\n return JSON.parse(raw) as Ledger\n } catch {\n return null\n }\n}\n\nasync function saveLedger(path: string, ledger: Ledger): Promise<void> {\n await ensureDir(dirname(path))\n await writeFile(path, `${JSON.stringify(ledger, null, 2)}\\n`)\n}\n\n/**\n * Look up a profile-slug → npm-package alias in\n * `~/.agentproto/config.json` (or `$AGENTPROTO_HOME/config.json`).\n *\n * { \"profileAliases\": { \"guilde\": \"@guilde/runtime-profile-guilde\" } }\n *\n * Returns the resolved package name, or `null` if no alias is set.\n */\nasync function readProfileAlias(profileName: string): Promise<string | null> {\n const base =\n process.env[\"AGENTPROTO_HOME\"] ?? join(homedir(), \".agentproto\")\n const path = join(base, \"config.json\")\n try {\n const raw = await readFile(path, \"utf8\")\n const parsed = JSON.parse(raw) as {\n profileAliases?: Record<string, string>\n }\n const aliased = parsed.profileAliases?.[profileName]\n return typeof aliased === \"string\" ? aliased : null\n } catch {\n return null\n }\n}\n","/**\n * `agentproto install <slug>`\n *\n * Reads the adapter manifest's `install` block and shells out to the\n * declared package manager. Idempotent: if `version_check` passes, we\n * skip and report \"already installed\" (override with --force).\n *\n * The adapter package itself must already be in node_modules (we resolve\n * it before reading its manifest). Bootstrapping the adapter package is\n * a separate concern — `npm i -g @agentproto/adapter-<slug>` first.\n *\n * Method support matrix:\n * - `npm` ✓\n * - `brew` ✓ (macOS / Linux Homebrew)\n * - `curl` ✓ (with optional verify_sha256)\n * - `download` ✓ (tarball/zip + extract_bin + optional verify_sha256)\n * - `pip` ✓ (with optional `user: true`)\n * - `cargo` ✓\n * - `go` ✓\n * - `apt/dnf/pacman` ✗ (privilege escalation needs explicit sudo policy)\n * - `choco/scoop` ✗ (Windows-only; not yet platform-detected)\n * - `vendored` ✗ (workspace-relative; needs a workspace root)\n *\n * After install, runs the optional `setup[]` pipeline (AIP-29 § Setup).\n */\n\nimport { spawn } from \"node:child_process\"\nimport { createHash } from \"node:crypto\"\nimport { mkdir, mkdtemp, rm, writeFile, chmod } from \"node:fs/promises\"\nimport { tmpdir } from \"node:os\"\nimport { join } from \"node:path\"\nimport { parseArgs } from \"node:util\"\nimport type { AgentCliInstallMethod } from \"@agentproto/driver-agent-cli\"\nimport { resolveAdapter } from \"../registry/resolve.js\"\nimport { runSetup } from \"./setup.js\"\nimport { runInstallProfile } from \"./install-profile.js\"\n\nexport async function runInstall(args: readonly string[]): Promise<number> {\n // Peek at the slug before parseArgs — it influences which option set is\n // valid. Adapter slugs and runtime-profile/* slugs share the verb but\n // route through separate handlers with different flags.\n const slugPeek = args.find((a) => !a.startsWith(\"-\"))\n if (slugPeek?.startsWith(\"runtime-profile/\")) {\n return runInstallProfile(\n slugPeek,\n args.filter((a) => a !== slugPeek)\n )\n }\n\n const { values, positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {\n force: { type: \"boolean\", short: \"f\" },\n \"dry-run\": { type: \"boolean\" },\n \"skip-setup\": { type: \"boolean\" },\n },\n })\n\n const slug = positionals[0]\n if (!slug) {\n process.stderr.write(\n \"agentproto install: missing adapter slug. Try: agentproto install claude-code\\n\"\n )\n return 2\n }\n\n const adapter = await resolveAdapter(slug)\n const installSteps: AgentCliInstallMethod[] = adapter.handle.install ?? []\n if (installSteps.length === 0) {\n process.stderr.write(\n `agentproto install: adapter '${slug}' declares no install steps.\\n`\n )\n return 0\n }\n\n let alreadyInstalled = false\n if (!values.force) {\n const checked = await runVersionCheck(adapter.handle.version_check)\n if (checked.ok) {\n process.stdout.write(\n `agentproto: '${slug}' already installed (${checked.message}). Pass --force to reinstall.\\n`\n )\n alreadyInstalled = true\n }\n }\n\n if (!alreadyInstalled) {\n let lastFailure: { step: AgentCliInstallMethod; code: number } | null = null\n let succeeded = false\n for (const [i, step] of installSteps.entries()) {\n // Spec: hosts try install methods *in order until one succeeds*.\n // Pre-this-fix the runner aborted on the first failure, which made\n // the curl-fallback pattern in opencode/openclaw unreachable\n // whenever npm wasn't viable. Now we collect failures and only\n // surface the last one if every method falls through.\n if (step.experimental) {\n process.stdout.write(\n `agentproto install [${i + 1}/${installSteps.length}] ${describeStep(step)} (experimental — skipping)\\n`\n )\n continue\n }\n process.stdout.write(\n `agentproto install [${i + 1}/${installSteps.length}] ${describeStep(step)}\\n`\n )\n if (values[\"dry-run\"]) {\n succeeded = true\n continue\n }\n const code = await runStep(step)\n if (code === 0) {\n succeeded = true\n break\n }\n lastFailure = { step, code }\n process.stdout.write(\n `agentproto install: method '${step.method}' returned ${code}; trying next.\\n`\n )\n }\n if (!succeeded && lastFailure) {\n process.stderr.write(\n `agentproto install: all ${installSteps.length} install methods failed. Last failure: ${lastFailure.step.method} → exit ${lastFailure.code}.\\n`\n )\n return lastFailure.code\n }\n if (!succeeded && !lastFailure) {\n // Every method was experimental/skipped.\n process.stderr.write(\n `agentproto install: no usable install method found for '${slug}'.\\n`\n )\n return 1\n }\n process.stdout.write(`agentproto: '${slug}' installed.\\n`)\n }\n\n // Run the AIP-29 § Setup pipeline (post-install configuration). Skipped\n // when --skip-setup is passed or the manifest declares no setup. The\n // setup engine is idempotent — already-satisfied steps short-circuit\n // via skip_if; previously-completed steps short-circuit via the ledger.\n if (!values[\"skip-setup\"] && (adapter.handle.setup?.length ?? 0) > 0) {\n process.stdout.write(`agentproto: running setup for '${slug}'…\\n`)\n const setupCode = await runSetup({\n slug,\n handle: adapter.handle,\n force: values.force ?? false,\n dryRun: values[\"dry-run\"] ?? false,\n })\n if (setupCode !== 0) return setupCode\n }\n\n return 0\n}\n\nfunction describeStep(step: AgentCliInstallMethod): string {\n switch (step.method) {\n case \"npm\":\n return `npm install ${step.global ? \"-g \" : \"\"}${step.package ?? \"(?)\"}`\n case \"brew\":\n return `brew install ${step.package ?? \"(?)\"}`\n case \"pip\":\n return `pip install ${step.user ? \"--user \" : \"\"}${step.package ?? \"(?)\"}`\n case \"cargo\":\n return `cargo install ${step.package ?? \"(?)\"}`\n case \"go\":\n return `go install ${step.package ?? \"(?)\"}`\n case \"curl\":\n return `curl ${step.url ?? \"(?)\"} | bash`\n case \"download\":\n return `download ${step.url ?? \"(?)\"} → ${step.extract_bin ?? \"(?)\"}`\n default:\n return `${step.method} ${step.package ?? step.url ?? step.path ?? \"(?)\"}`\n }\n}\n\nasync function runStep(step: AgentCliInstallMethod): Promise<number> {\n switch (step.method) {\n case \"npm\": {\n if (!step.package) {\n process.stderr.write(\"agentproto install: npm step missing package.\\n\")\n return 2\n }\n const argv = [\"install\"]\n if (step.global) argv.push(\"-g\")\n argv.push(step.package)\n return spawnInherit(\"npm\", argv)\n }\n case \"brew\": {\n if (!step.package) {\n process.stderr.write(\"agentproto install: brew step missing package.\\n\")\n return 2\n }\n // Namespaced packages (e.g. `stripe/stripe-cli/stripe`) need an\n // implicit `brew tap`; `brew install` accepts the fully-qualified\n // form, so we pass it through verbatim. Bare names work too.\n return spawnInherit(\"brew\", [\"install\", step.package])\n }\n case \"pip\": {\n if (!step.package) {\n process.stderr.write(\"agentproto install: pip step missing package.\\n\")\n return 2\n }\n const argv = [\"install\"]\n if (step.user) argv.push(\"--user\")\n argv.push(step.package)\n // Prefer pip3 when it exists; fall back to pip. We just call `pip`\n // here because the user's PATH ordering is the right authority.\n return spawnInherit(\"pip\", argv)\n }\n case \"cargo\": {\n if (!step.package) {\n process.stderr.write(\n \"agentproto install: cargo step missing package.\\n\"\n )\n return 2\n }\n return spawnInherit(\"cargo\", [\"install\", step.package])\n }\n case \"go\": {\n if (!step.package) {\n process.stderr.write(\"agentproto install: go step missing package.\\n\")\n return 2\n }\n return spawnInherit(\"go\", [\"install\", step.package])\n }\n case \"curl\": {\n if (!step.url) {\n process.stderr.write(\"agentproto install: curl step missing url.\\n\")\n return 2\n }\n return runCurlInstaller(step.url, step.verify_sha256)\n }\n case \"download\": {\n if (!step.url || !step.extract_bin) {\n process.stderr.write(\n \"agentproto install: download step missing url or extract_bin.\\n\"\n )\n return 2\n }\n return runDownloadInstaller({\n url: step.url,\n extractBin: step.extract_bin,\n verifySha256: step.verify_sha256,\n })\n }\n default:\n process.stderr.write(\n `agentproto install: method '${step.method}' not yet implemented in this CLI version. ` +\n `Run it manually for now (see the adapter's docs).\\n`\n )\n return 1\n }\n}\n\n/**\n * `curl <url> | bash` with optional SHA-256 verification of the\n * installer script *before* executing it. Spec posture (AIP-29 §\n * Install methods → §curl): hosts SHOULD refuse curl-style installers\n * without a verify_sha256 in production. We surface a warning when\n * one is missing but still execute — the agentproto CLI runs in\n * developer / first-run contexts where the trade-off is acceptable.\n */\nasync function runCurlInstaller(\n url: string,\n verifySha256?: string\n): Promise<number> {\n if (!verifySha256) {\n process.stdout.write(\n `agentproto install: curl ${url} (⚠ no verify_sha256 declared — installer integrity not verified)\\n`\n )\n }\n const dir = await mkdtemp(join(tmpdir(), \"agentproto-curl-\"))\n const scriptPath = join(dir, \"install.sh\")\n try {\n const res = await fetch(url, { redirect: \"follow\" })\n if (!res.ok) {\n process.stderr.write(\n `agentproto install: curl fetch failed: ${res.status} ${res.statusText}\\n`\n )\n return res.status\n }\n const buf = Buffer.from(await res.arrayBuffer())\n if (verifySha256) {\n const got = createHash(\"sha256\").update(buf).digest(\"hex\")\n if (got !== verifySha256.toLowerCase()) {\n process.stderr.write(\n `agentproto install: SHA-256 mismatch for ${url}\\n expected: ${verifySha256}\\n got: ${got}\\n`\n )\n return 4\n }\n process.stdout.write(\n `agentproto install: SHA-256 verified (${got.slice(0, 16)}…)\\n`\n )\n }\n await writeFile(scriptPath, buf)\n await chmod(scriptPath, 0o755)\n return spawnInherit(\"bash\", [scriptPath])\n } catch (err) {\n process.stderr.write(\n `agentproto install: curl install failed: ${err instanceof Error ? err.message : String(err)}\\n`\n )\n return 1\n } finally {\n await rm(dir, { recursive: true, force: true }).catch(() => {})\n }\n}\n\n/**\n * Download an archive, optionally verify SHA-256, extract the binary\n * named in `extract_bin`, drop it into `~/.local/bin/<id>` (or the\n * AGENTPROTO_BIN_DIR override), and chmod +x. Supports tar.gz, tgz,\n * zip via the host's `tar` and `unzip`. The CLI doesn't decide the\n * binary's final name — `extract_bin`'s basename becomes the symlink\n * name on PATH.\n */\nasync function runDownloadInstaller(opts: {\n url: string\n extractBin: string\n verifySha256?: string\n}): Promise<number> {\n const dir = await mkdtemp(join(tmpdir(), \"agentproto-dl-\"))\n try {\n const filename = opts.url.split(\"/\").pop() || \"archive.bin\"\n const archivePath = join(dir, filename)\n const res = await fetch(opts.url, { redirect: \"follow\" })\n if (!res.ok) {\n process.stderr.write(\n `agentproto install: download fetch failed: ${res.status} ${res.statusText}\\n`\n )\n return res.status\n }\n const buf = Buffer.from(await res.arrayBuffer())\n if (opts.verifySha256) {\n const got = createHash(\"sha256\").update(buf).digest(\"hex\")\n if (got !== opts.verifySha256.toLowerCase()) {\n process.stderr.write(\n `agentproto install: SHA-256 mismatch\\n expected: ${opts.verifySha256}\\n got: ${got}\\n`\n )\n return 4\n }\n }\n await writeFile(archivePath, buf)\n\n const extractDir = join(dir, \"extract\")\n await mkdir(extractDir, { recursive: true })\n let extractCode: number\n if (\n filename.endsWith(\".tar.gz\") ||\n filename.endsWith(\".tgz\") ||\n filename.endsWith(\".tar\")\n ) {\n extractCode = await spawnInherit(\"tar\", [\n \"-xf\",\n archivePath,\n \"-C\",\n extractDir,\n ])\n } else if (filename.endsWith(\".zip\")) {\n extractCode = await spawnInherit(\"unzip\", [\n \"-q\",\n archivePath,\n \"-d\",\n extractDir,\n ])\n } else {\n process.stderr.write(\n `agentproto install: unsupported archive format for ${filename}. ` +\n `Supported: .tar, .tar.gz, .tgz, .zip.\\n`\n )\n return 5\n }\n if (extractCode !== 0) return extractCode\n\n const srcBin = join(extractDir, opts.extractBin)\n const binDir =\n process.env[\"AGENTPROTO_BIN_DIR\"] ?? join(homedir(), \".local\", \"bin\")\n await mkdir(binDir, { recursive: true })\n const destBin = join(binDir, opts.extractBin.split(\"/\").pop()!)\n // Use cp -p to preserve mode bits then chmod +x to be safe.\n const cpCode = await spawnInherit(\"cp\", [\"-p\", srcBin, destBin])\n if (cpCode !== 0) return cpCode\n await chmod(destBin, 0o755)\n process.stdout.write(`agentproto install: ${destBin}\\n`)\n if (!process.env[\"PATH\"]?.includes(binDir)) {\n process.stdout.write(\n `agentproto install: ⚠ ${binDir} is not on PATH — add it to your shell profile so the binary is reachable.\\n`\n )\n }\n return 0\n } catch (err) {\n process.stderr.write(\n `agentproto install: download failed: ${err instanceof Error ? err.message : String(err)}\\n`\n )\n return 1\n } finally {\n await rm(dir, { recursive: true, force: true }).catch(() => {})\n }\n}\n\nfunction homedir(): string {\n return process.env[\"HOME\"] ?? process.env[\"USERPROFILE\"] ?? \"/\"\n}\n\nfunction spawnInherit(cmd: string, argv: string[]): Promise<number> {\n return new Promise((resolve, reject) => {\n const child = spawn(cmd, argv, { stdio: \"inherit\" })\n child.once(\"error\", reject)\n child.once(\"exit\", (code) => resolve(code ?? 0))\n })\n}\n\nasync function runVersionCheck(\n check: Awaited<\n ReturnType<typeof resolveAdapter>\n >[\"handle\"][\"version_check\"]\n): Promise<{ ok: boolean; message: string }> {\n if (!check) return { ok: false, message: \"no version_check declared\" }\n return new Promise((resolve) => {\n const child = spawn(\"bash\", [\"-lc\", check.cmd], {\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n })\n let buf = \"\"\n child.stdout.on(\"data\", (c: Buffer) => {\n buf += c.toString(\"utf8\")\n })\n child.once(\"error\", () => resolve({ ok: false, message: \"check failed\" }))\n child.once(\"exit\", (code) => {\n if (code !== 0) {\n resolve({ ok: false, message: `check exited ${code}` })\n return\n }\n const re = new RegExp(check.parse)\n const m = buf.match(re)\n if (!m || !m[1]) {\n resolve({ ok: false, message: \"could not parse version\" })\n return\n }\n // semver-range matching is left to a future helper; we report\n // the captured version and trust it. --force remains the\n // escape hatch when range gating actually matters.\n resolve({ ok: true, message: `version ${m[1]}` })\n })\n })\n}\n","/**\n * Read piped stdin to a string. Returns null if stdin is a TTY (no pipe).\n * Used by `agentproto run` to accept prompts via:\n * echo \"summarise this repo\" | agentproto run claude-code\n */\n\nexport async function readStdinIfPiped(): Promise<string | null> {\n if (process.stdin.isTTY) return null\n const chunks: Buffer[] = []\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))\n }\n const text = Buffer.concat(chunks).toString(\"utf8\").trim()\n return text.length > 0 ? text : null\n}\n","/**\n * `agentproto run <slug> [--cwd <dir>] [--prompt <text>] [--resume <id>]`\n *\n * Boots the named adapter, dispatches a single user turn, streams events\n * to stdout, then exits. Designed for two use-cases:\n * - one-shot scripting (pipe a prompt in, get stream back)\n * - quick smoke-test from a fresh checkout (\"does claude even spawn?\")\n *\n * Long-lived multiplexing belongs to `agentproto serve`, not here.\n */\n\nimport { resolve as resolvePath } from \"node:path\"\nimport { parseArgs } from \"node:util\"\nimport {\n createAgentCliRuntime,\n type AgentCliRuntimeSession,\n type StreamEvent,\n} from \"@agentproto/driver-agent-cli\"\nimport { resolveAdapter } from \"../registry/resolve.js\"\nimport { readStdinIfPiped } from \"../util/stdin.js\"\n\nexport async function runRun(args: readonly string[]): Promise<number> {\n const { values, positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {\n cwd: { type: \"string\" },\n prompt: { type: \"string\", short: \"p\" },\n resume: { type: \"string\" },\n json: { type: \"boolean\" },\n },\n })\n\n const slug = positionals[0]\n if (!slug) {\n process.stderr.write(\n \"agentproto run: missing adapter slug. Try: agentproto run claude-code\\n\"\n )\n return 2\n }\n\n const cwd = values.cwd ? resolvePath(values.cwd) : process.cwd()\n const promptArg = values.prompt ?? (await readStdinIfPiped())\n if (!promptArg) {\n process.stderr.write(\n \"agentproto run: no prompt provided. Pass --prompt or pipe one over stdin.\\n\"\n )\n return 2\n }\n\n const adapter = await resolveAdapter(slug)\n const runtime = createAgentCliRuntime(adapter.handle)\n\n const controller = new AbortController()\n const onSignal = (sig: NodeJS.Signals) => {\n process.stderr.write(`\\nagentproto: received ${sig}, cancelling…\\n`)\n controller.abort()\n }\n process.once(\"SIGINT\", onSignal)\n process.once(\"SIGTERM\", onSignal)\n\n let session: AgentCliRuntimeSession | null = null\n try {\n session = await runtime.start({\n cwd,\n signal: controller.signal,\n resumeSessionId: values.resume,\n })\n\n const printer = values.json ? printJson : printPretty\n let exit = 0\n for await (const ev of session.send(promptArg)) {\n printer(ev)\n if (ev.kind === \"turn-end\" && ev.reason !== \"completed\") exit = 1\n if (ev.kind === \"error\") exit = 1\n }\n return exit\n } finally {\n process.off(\"SIGINT\", onSignal)\n process.off(\"SIGTERM\", onSignal)\n if (session) await session.close().catch(() => {})\n }\n}\n\nfunction printJson(ev: StreamEvent): void {\n process.stdout.write(`${JSON.stringify(ev)}\\n`)\n}\n\nfunction printPretty(ev: StreamEvent): void {\n switch (ev.kind) {\n case \"text-delta\":\n process.stdout.write(ev.text)\n break\n case \"thought\":\n process.stderr.write(`\\x1b[2m[thought] ${ev.text}\\x1b[0m\\n`)\n break\n case \"tool-call\":\n process.stderr.write(`\\x1b[36m[tool] ${ev.toolName}\\x1b[0m\\n`)\n break\n case \"tool-result\":\n if (ev.isError)\n process.stderr.write(`\\x1b[31m[tool-error]\\x1b[0m\\n`)\n break\n case \"agent-prompt\":\n process.stderr.write(`\\x1b[33m[agent-prompt: needs input]\\x1b[0m\\n`)\n break\n case \"turn-end\":\n process.stdout.write(`\\n\\x1b[2m[turn-end: ${ev.reason}]\\x1b[0m\\n`)\n break\n case \"error\": {\n const code =\n typeof ev.error.code === \"number\" ? ` (code ${ev.error.code})` : \"\"\n process.stderr.write(\n `\\x1b[31m[error]${code} ${ev.error.message}\\x1b[0m\\n`,\n )\n // Attached child stderr (added by define-agent-cli) — usually\n // the most useful line (\"not authenticated\", \"model gated\",\n // missing binary path). Print after the headline so the\n // headline still scans first.\n const data = ev.error.data\n if (data && typeof data === \"object\") {\n const stderr = (data as { stderr?: unknown }).stderr\n if (typeof stderr === \"string\" && stderr.trim()) {\n process.stderr.write(`\\x1b[2m── child stderr ──\\n${stderr}\\x1b[0m\\n`)\n }\n // Surface any non-stderr fields as JSON so callers don't\n // have to switch to --json to see what payload was rejected.\n const rest = { ...(data as Record<string, unknown>) }\n delete rest.stderr\n if (Object.keys(rest).length > 0) {\n process.stderr.write(\n `\\x1b[2m── error.data ──\\n${JSON.stringify(rest, null, 2)}\\x1b[0m\\n`,\n )\n }\n }\n break\n }\n }\n}\n","/**\n * Credential store for `agentproto auth login`.\n *\n * Format on disk (JSON, mode 0600):\n *\n * {\n * \"version\": 1,\n * \"hosts\": {\n * \"wss://guilde.work/api/v1/agentproto/tunnel\": {\n * \"token\": \"eyJ…\",\n * \"tokenType\": \"Bearer\",\n * \"expiresAt\": \"2026-08-08T12:34:56.000Z\",\n * \"refreshToken\": \"rt_…\", // optional\n * \"scope\": \"tunnel:connect\",\n * \"subject\": \"user_abc\",\n * \"obtainedAt\": \"2026-05-10T08:21:11.000Z\",\n * \"deviceLabel\": \"jeremy@laptop\"\n * }\n * }\n * }\n *\n * One file per *user*, multiple hosts under the same file. Hosts are\n * keyed by the URL the user passed to `agentproto auth login --host`,\n * stripped of trailing slash. `agentproto serve --connect <url>` looks\n * up the same key when no `--token` is passed.\n *\n * Storage location:\n * - `$AGENTPROTO_HOME/credentials.json`, falling back to\n * - `~/.agentproto/credentials.json`\n *\n * The file holds bearer tokens, so it's chmod'd 0600 on every write.\n * On Windows we rely on the per-user profile path being already\n * private and skip chmod. Never log the token contents.\n */\n\nimport { mkdir, readFile, writeFile, chmod, unlink } from \"node:fs/promises\"\nimport { homedir } from \"node:os\"\nimport { join, dirname } from \"node:path\"\n\nexport interface HostCredential {\n /** Bearer token. Bearer-form is the only one supported for v1. */\n token: string\n /** Always \"Bearer\" today; reserved for future schemes. */\n tokenType: \"Bearer\"\n /** ISO-8601. May be in the past — callers must check `isExpired`. */\n expiresAt: string\n /** OAuth 2.0 refresh token. Present when the host issues one. */\n refreshToken?: string\n /** Space-separated scopes the token was issued with. */\n scope?: string\n /** Human-readable subject — usually the user id, surfaced in `auth status`. */\n subject?: string\n /** ISO-8601 of when this credential was minted. */\n obtainedAt: string\n /** Friendly device label shown on the host's Machine-tokens page. */\n deviceLabel?: string\n /** Opaque revocation hint surfaced by the host (e.g. JTI). The CLI\n * passes it back on `auth logout` so the host can revoke the right\n * row server-side, not just delete the local copy. */\n revocationId?: string\n}\n\ninterface CredentialsFile {\n version: 1\n hosts: Record<string, HostCredential>\n}\n\nconst FILE_VERSION = 1 as const\n\nexport function credentialsPath(): string {\n const base = process.env[\"AGENTPROTO_HOME\"] ?? join(homedir(), \".agentproto\")\n return join(base, \"credentials.json\")\n}\n\nexport function normaliseHost(host: string): string {\n return host.replace(/\\/+$/, \"\")\n}\n\nexport async function loadCredentials(): Promise<CredentialsFile> {\n const path = credentialsPath()\n try {\n const raw = await readFile(path, \"utf8\")\n const parsed = JSON.parse(raw) as CredentialsFile\n if (parsed.version !== FILE_VERSION) {\n throw new Error(\n `credentials.json: unknown version ${parsed.version}; expected ${FILE_VERSION}. ` +\n `Delete the file and re-run \\`agentproto auth login\\`.`\n )\n }\n return parsed\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return { version: FILE_VERSION, hosts: {} }\n }\n throw err\n }\n}\n\nexport async function saveCredentials(file: CredentialsFile): Promise<void> {\n const path = credentialsPath()\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, JSON.stringify(file, null, 2))\n await chmod(path, 0o600).catch(() => {\n // Windows + some sandboxed FSes (e.g. WSL on a Windows mount) don't\n // honour chmod. The file lives under the user profile in those\n // cases, which is already user-private; not worth refusing.\n })\n}\n\nexport async function readHost(host: string): Promise<HostCredential | null> {\n const f = await loadCredentials()\n return f.hosts[normaliseHost(host)] ?? null\n}\n\nexport async function writeHost(\n host: string,\n cred: HostCredential\n): Promise<void> {\n const f = await loadCredentials()\n f.hosts[normaliseHost(host)] = cred\n await saveCredentials(f)\n}\n\nexport async function deleteHost(host: string): Promise<HostCredential | null> {\n const f = await loadCredentials()\n const key = normaliseHost(host)\n const prev = f.hosts[key] ?? null\n if (prev) {\n delete f.hosts[key]\n if (Object.keys(f.hosts).length === 0) {\n // Empty file is a valid state (`auth login` re-creates), but\n // unlinking is cleaner — `auth status` then prints \"no credentials\".\n await unlink(credentialsPath()).catch(() => {})\n } else {\n await saveCredentials(f)\n }\n }\n return prev\n}\n\nexport function isExpired(cred: HostCredential, gracePeriodMs = 30_000): boolean {\n const exp = Date.parse(cred.expiresAt)\n if (!Number.isFinite(exp)) return false // unparseable expiry → trust the host\n return exp - gracePeriodMs <= Date.now()\n}\n\nexport function formatExpiry(cred: HostCredential): string {\n const exp = new Date(cred.expiresAt)\n if (Number.isNaN(exp.getTime())) return \"unknown\"\n const ms = exp.getTime() - Date.now()\n if (ms < 0) return `expired ${formatRelative(-ms)} ago`\n return `expires in ${formatRelative(ms)}`\n}\n\nfunction formatRelative(ms: number): string {\n if (ms < 60_000) return `${Math.round(ms / 1000)}s`\n if (ms < 3_600_000) return `${Math.round(ms / 60_000)}m`\n if (ms < 86_400_000) return `${Math.round(ms / 3_600_000)}h`\n return `${Math.round(ms / 86_400_000)}d`\n}\n","/**\n * Shared PTY factory loader.\n *\n * `node-pty` is an optional native dep — when present, the factory\n * returns a function that spawns child processes under a real PTY\n * (so ANSI escapes, alt-screen apps, key bindings and resize all\n * work). When absent, returns null and callers degrade to\n * `child_process.spawn` (no PTY).\n *\n * Two consumers today:\n * - `createTunnelServer` (packages/acp/src/tunnel/server.ts) — cloud-\n * dispatched spawns over the tunnel use this factory when the\n * spawn frame requests `pty: true`.\n * - `createGateway` (packages/runtime/src/index.ts) — local\n * `POST /sessions/terminal` route + MCP `start_terminal_session`\n * tool use this factory to register PTY-backed sessions in the\n * daemon's registry.\n *\n * Both consumers agree on the same minimal `PtyProcess` shape\n * (defined in `@agentproto/acp/tunnel`); the function we return here\n * satisfies both their `spawnPty` option types structurally.\n */\n\nimport type { PtyProcess } from \"@agentproto/acp/tunnel\"\n\nexport interface PtyFactoryOptions {\n command: string\n args: string[]\n cwd?: string\n env?: Record<string, string>\n cols: number\n rows: number\n}\n\nexport type PtyFactory = (opts: PtyFactoryOptions) => PtyProcess\n\nexport async function loadNodePtyFactory(): Promise<PtyFactory | null> {\n try {\n const nodePtyMod = await import(\"node-pty\")\n // node-pty is CJS — `import()` wraps the module under `.default` in ESM.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const nodePty = (nodePtyMod as any).default ?? nodePtyMod\n if (typeof nodePty.spawn !== \"function\") return null\n return (opts) => {\n const pty = nodePty.spawn(opts.command, opts.args, {\n name: \"xterm-256color\",\n cols: opts.cols,\n rows: opts.rows,\n cwd: opts.cwd,\n env: {\n ...(process.env as Record<string, string>),\n ...(opts.env ?? {}),\n },\n })\n const proc: PtyProcess = {\n get pid() {\n return pty.pid\n },\n write(data: string) {\n pty.write(data)\n },\n resize(cols: number, rows: number) {\n pty.resize(cols, rows)\n },\n kill(signal?: string) {\n pty.kill(signal)\n },\n onData(handler: (data: string) => void) {\n pty.onData(handler)\n },\n onExit(handler: (event: { exitCode: number; signal?: number }) => void) {\n pty.onExit(handler)\n },\n }\n return proc\n }\n } catch {\n return null\n }\n}\n","/**\n * `~/.agentproto/config.json` — single hand-editable JSON for the\n * agentproto control plane's defaults. Sits alongside the existing\n * surface files (workspaces.json, credentials.json, sessions.json):\n *\n * workspaces.json which directories are workspaces + which is active\n * credentials.json tunnel host bearer tokens (mode 0600)\n * sessions.json last-known snapshot of the registry (informational)\n * config.json daemon defaults: port, bind, allowed origins,\n * tunnel host, feature toggles\n *\n * Resolution order for every daemon knob is:\n * 1. CLI flag (e.g. --port)\n * 2. Env var (where one exists, e.g. AGENTPROTO_TOKEN)\n * 3. config.json\n * 4. Hardcoded default\n *\n * This means a user can call `agentproto config set daemon.port 18791`\n * once and never re-pass `--port 18791` to `serve install` etc. CLI\n * flags still win for one-off overrides.\n *\n * Schema is intentionally narrow + extensible — unknown keys are\n * preserved on save (deep-merge), so a newer CLI writing a new\n * field won't drop one an older CLI doesn't know about. No secrets\n * here; credentials stay in credentials.json (mode 0600).\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { dirname, join } from \"node:path\"\n\nexport const CONFIG_VERSION = 1 as const\n\nexport interface DaemonConfig {\n /** Absolute path to the workspace the daemon binds to at boot. */\n workspace?: string\n /** HTTP port. Default 18790. */\n port?: number\n /** Bind addr. Default 127.0.0.1. */\n bind?: string\n /** Trusted browser origins for mutating /sessions/* routes (in\n * addition to the hardcoded localhost defaults). */\n allowedOrigins?: string[]\n /** When true, the daemon does NOT auto-trust localhost-on-any-port.\n * Only origins explicitly listed in `allowedOrigins` are allowed.\n * Pair with a curated list (e.g. `[\"http://localhost:3000\"]`) for\n * hardened setups. Default false. */\n strictOrigins?: boolean\n /** Server label sent in tunnel hello frames. */\n label?: string\n}\n\nexport interface TunnelConfig {\n /** Cloud WS URL. When set + autoconnect=true, `agentproto serve`\n * bootstraps with `--connect <host>`. */\n host?: string\n /** apt_ daemon token to present at the tunnel upgrade. When set,\n * `agentproto serve` uses this BEFORE falling back to\n * credentials.json — handy in profiles where the token-per-host\n * mapping in credentials.json doesn't fit (e.g. host = tunnel URL\n * but credentials were minted against the api URL). */\n token?: string\n /** Whether `agentproto daemon start` connects the tunnel by\n * default. v0 only — implementer can ignore until daemon needs it. */\n autoconnect?: boolean\n}\n\nexport interface FeaturesConfig {\n /** Hint that PTY is desired — informational; the daemon still\n * detects node-pty's presence at runtime. */\n pty?: boolean\n}\n\n/**\n * Per-environment connection bundle. A profile overrides specific\n * fields of the top-level `daemon` / `tunnel` / `features` blocks\n * when selected via `--profile <name>` (or the top-level\n * `activeProfile` setting). Missing fields fall through to the\n * top-level config, so a profile only needs to declare what's\n * different — typically just `tunnel.host` + `tunnel.token`.\n *\n * Example:\n * {\n * \"daemon\": { \"workspace\": \"/code\", \"port\": 18790 },\n * \"activeProfile\": \"local\",\n * \"profiles\": {\n * \"local\": { \"tunnel\": { \"host\": \"ws://localhost:3200/connect\",\n * \"token\": \"apt_local\", \"autoconnect\": true } },\n * \"prod\": { \"tunnel\": { \"host\": \"wss://tunnel.guilde.work/connect\",\n * \"token\": \"apt_prod\", \"autoconnect\": true },\n * \"daemon\": { \"port\": 18791 } }\n * }\n * }\n *\n * Sandbox daemons generate per-sandbox profile entries at provision\n * time so the daemon inside the sandbox boots with\n * `agentproto serve --profile sandbox-<id>` and no extra plumbing.\n */\nexport interface ProfileConfig {\n daemon?: DaemonConfig\n tunnel?: TunnelConfig\n features?: FeaturesConfig\n}\n\nexport interface AgentprotoConfig {\n version?: number\n daemon?: DaemonConfig\n tunnel?: TunnelConfig\n features?: FeaturesConfig\n /** Named connection profiles. See `ProfileConfig` for the merge\n * semantics — a profile's fields shallow-override the top-level\n * defaults for the selected run. */\n profiles?: Record<string, ProfileConfig>\n /** Profile name to use when `--profile` isn't passed. When unset,\n * the top-level `daemon` / `tunnel` blocks are used directly. */\n activeProfile?: string\n /** Unknown keys preserved across save round-trips. */\n [unknown: string]: unknown\n}\n\nexport const CONFIG_FILE_PATH = (): string =>\n join(homedir(), \".agentproto\", \"config.json\")\n\n/**\n * Load config.json. Returns an empty object (NOT null) when the file\n * is missing, malformed, or unreadable — callers can `cfg.daemon?.port`\n * safely without null-guards. Errors during a malformed-read are\n * logged once so the user notices the file is broken without the\n * daemon refusing to boot.\n */\nexport async function loadConfig(path?: string): Promise<AgentprotoConfig> {\n const target = path ?? CONFIG_FILE_PATH()\n try {\n const raw = await fs.readFile(target, \"utf8\")\n const parsed = JSON.parse(raw) as unknown\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as AgentprotoConfig\n }\n console.warn(\n `[runtime/config] ${target}: top-level value is not an object — ignoring`,\n )\n return {}\n } catch (err) {\n // ENOENT is the common case; only warn on other shapes.\n const code = (err as NodeJS.ErrnoException).code\n if (code && code !== \"ENOENT\") {\n console.warn(\n `[runtime/config] failed to read ${target}: ${\n err instanceof Error ? err.message : String(err)\n }`,\n )\n }\n return {}\n }\n}\n\n/**\n * Write config.json atomically (tmp + rename) so a concurrent\n * `agentproto config edit` can't half-truncate the file. Writes\n * `next` AS-IS — callers are expected to pass the full desired\n * state (loaded the existing config, mutated, passed it back).\n *\n * Earlier versions deep-merged with the on-disk file, but that made\n * deletions impossible: `setConfigKey(cfg, \"x\", undefined)` would\n * remove the key from memory, then the deep-merge would silently\n * re-add it from disk. The current design trusts the caller's\n * snapshot and uses atomic rename for crash safety.\n */\nexport async function saveConfig(\n next: AgentprotoConfig,\n path?: string,\n): Promise<void> {\n const target = path ?? CONFIG_FILE_PATH()\n const payload = { ...next, version: CONFIG_VERSION }\n const dir = dirname(target)\n await fs.mkdir(dir, { recursive: true })\n const tmp = `${target}.tmp`\n await fs.writeFile(tmp, JSON.stringify(payload, null, 2) + \"\\n\", \"utf8\")\n await fs.rename(tmp, target)\n}\n\n/**\n * Read a dot-notation key (`daemon.port`) out of a config. Returns\n * `undefined` when any segment is missing.\n */\nexport function getConfigKey(\n cfg: AgentprotoConfig,\n dotted: string,\n): unknown {\n let cur: unknown = cfg\n for (const part of dotted.split(\".\")) {\n if (cur == null || typeof cur !== \"object\") return undefined\n cur = (cur as Record<string, unknown>)[part]\n }\n return cur\n}\n\n/**\n * Set a dot-notation key in a config. Returns a new object — does\n * NOT mutate. Creates intermediate objects as needed. Setting\n * `value: undefined` is treated as a delete.\n */\nexport function setConfigKey(\n cfg: AgentprotoConfig,\n dotted: string,\n value: unknown,\n): AgentprotoConfig {\n const parts = dotted.split(\".\")\n const out: AgentprotoConfig = { ...cfg }\n let cur: Record<string, unknown> = out as Record<string, unknown>\n for (let i = 0; i < parts.length - 1; i++) {\n const k = parts[i]!\n const next = cur[k]\n if (next && typeof next === \"object\" && !Array.isArray(next)) {\n cur[k] = { ...(next as Record<string, unknown>) }\n } else {\n cur[k] = {}\n }\n cur = cur[k] as Record<string, unknown>\n }\n const leaf = parts[parts.length - 1]!\n if (value === undefined) {\n delete cur[leaf]\n } else {\n cur[leaf] = value\n }\n return out\n}\n\n/**\n * Deep merge — objects are recursively combined, everything else\n * (arrays, primitives) is replaced wholesale by `b`. Mirrors what\n * `Object.assign({}, a, b)` does for shallow keys.\n */\nfunction deepMerge<A extends Record<string, unknown>, B extends Record<string, unknown>>(\n a: A,\n b: B,\n): A & B {\n const out: Record<string, unknown> = { ...a }\n for (const [k, v] of Object.entries(b)) {\n const cur = out[k]\n if (\n v &&\n typeof v === \"object\" &&\n !Array.isArray(v) &&\n cur &&\n typeof cur === \"object\" &&\n !Array.isArray(cur)\n ) {\n out[k] = deepMerge(\n cur as Record<string, unknown>,\n v as Record<string, unknown>,\n )\n } else {\n out[k] = v\n }\n }\n return out as A & B\n}\n","/**\n * `~/.agentproto/workspaces.json` — single source of truth for the\n * local agentproto control plane. Tracks which directories the user\n * has opted into as agentproto workspaces, plus which one is \"active\"\n * (the daemon's default working set when no workspace is named in\n * a tool call).\n *\n * Why a config file instead of recreating an MCP entry per workspace:\n * - One daemon = one MCP entry in the user's IDE (clean to read in\n * `claude mcp list`, no `dapper_willow` / `noble_lantern` spam).\n * - The daemon walks `workspaces[]` at boot and exposes them all;\n * tools that need a target take an optional `workspace` arg and\n * fall back to `active` when omitted.\n * - The CLI (`agentproto workspace add/list/remove/use`), the daemon,\n * and the guilde-web onboarding dialog all read+write the same\n * file, so changes from one surface are immediately visible to\n * the others.\n *\n * File layout is intentionally boring (small, hand-editable JSON) —\n * future fields go on top, never break v1 readers.\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { dirname, isAbsolute, resolve } from \"node:path\"\n\nexport const WORKSPACES_CONFIG_VERSION = 1 as const\n\nexport interface WorkspaceEntry {\n /** Stable handle — what tools accept as `workspace`. Lowercase\n * ASCII, hyphen-only. The CLI sanitises arbitrary names down to\n * this shape so paste-from-finder Just Works. */\n slug: string\n /** Absolute filesystem path. Required absolute so the daemon can\n * serve the workspace regardless of its own cwd. */\n path: string\n /** ISO-8601 — first time the entry was added. Pure metadata, no\n * behavioural impact. */\n addedAt: string\n /** Last time the entry was touched (renamed, path edited, used as\n * active). Lets the CLI sort by recency without an N+1 stat. */\n updatedAt: string\n /** Free-text label the user can attach so workspaces with similar\n * slugs stay distinguishable in `agentproto workspace list`. */\n label?: string\n}\n\nexport interface WorkspacesConfig {\n version: typeof WORKSPACES_CONFIG_VERSION\n /** Active workspace slug — daemon defaults to this when no\n * `workspace` arg is passed. May be undefined when no workspaces\n * are registered yet. */\n active?: string\n workspaces: WorkspaceEntry[]\n}\n\nexport const DEFAULT_CONFIG_DIR = (): string =>\n resolve(homedir(), \".agentproto\")\nexport const DEFAULT_CONFIG_PATH = (): string =>\n resolve(DEFAULT_CONFIG_DIR(), \"workspaces.json\")\n\n/** Reduce arbitrary user input to a safe slug. Aligns with what most\n * tooling validates against (`/^[a-z0-9][a-z0-9-]{0,63}$/`) so the\n * daemon never has to encode it for URLs or filesystem paths. */\nexport function sanitizeSlug(input: string): string {\n const trimmed = input.trim().toLowerCase()\n const cleaned = trimmed\n .replace(/[^a-z0-9_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 64)\n // Edge case: input was entirely non-conforming — fall back to a\n // generic so we never return an empty string.\n return cleaned || \"workspace\"\n}\n\n/** Read the config from disk. Returns an empty config (no workspaces,\n * no active) when the file is missing — this is the legitimate\n * first-boot state, not an error. */\nexport async function loadWorkspacesConfig(\n path: string = DEFAULT_CONFIG_PATH()\n): Promise<WorkspacesConfig> {\n let raw: string\n try {\n raw = await fs.readFile(path, \"utf8\")\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return { version: WORKSPACES_CONFIG_VERSION, workspaces: [] }\n }\n throw err\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (err) {\n throw new Error(\n `agentproto: ${path} is not valid JSON (${\n err instanceof Error ? err.message : String(err)\n }). Delete the file or fix it manually.`\n )\n }\n return normalizeConfig(parsed)\n}\n\n/** Write the config back. Creates the parent directory if missing.\n * Atomic-ish: writes to a temp file first, then renames over the\n * target — avoids the partial-write window where a concurrent reader\n * sees half a JSON object. */\nexport async function saveWorkspacesConfig(\n config: WorkspacesConfig,\n path: string = DEFAULT_CONFIG_PATH()\n): Promise<void> {\n const normalized = normalizeConfig(config)\n await fs.mkdir(dirname(path), { recursive: true })\n const tmp = `${path}.tmp.${process.pid}`\n await fs.writeFile(tmp, JSON.stringify(normalized, null, 2) + \"\\n\", \"utf8\")\n await fs.rename(tmp, path)\n}\n\n/**\n * Pure helpers — caller manages persistence. Returns a NEW config\n * (never mutates) so callers can compose multiple updates before\n * a single save.\n */\nexport function addWorkspace(\n config: WorkspacesConfig,\n input: { slug: string; path: string; label?: string }\n): WorkspacesConfig {\n if (!isAbsolute(input.path)) {\n throw new Error(\n `addWorkspace: path must be absolute, got \"${input.path}\".`\n )\n }\n const slug = sanitizeSlug(input.slug)\n const now = new Date().toISOString()\n const existingIdx = config.workspaces.findIndex(w => w.slug === slug)\n const next: WorkspaceEntry = existingIdx >= 0\n ? {\n ...config.workspaces[existingIdx]!,\n path: input.path,\n ...(input.label !== undefined ? { label: input.label } : {}),\n updatedAt: now,\n }\n : {\n slug,\n path: input.path,\n ...(input.label ? { label: input.label } : {}),\n addedAt: now,\n updatedAt: now,\n }\n const workspaces = [...config.workspaces]\n if (existingIdx >= 0) workspaces[existingIdx] = next\n else workspaces.push(next)\n // First-add becomes active automatically — saves the user a\n // separate `workspace use` call right after a fresh `add`.\n const active = config.active ?? slug\n return { ...config, workspaces, active }\n}\n\nexport function removeWorkspace(\n config: WorkspacesConfig,\n slug: string\n): WorkspacesConfig {\n const sanitised = sanitizeSlug(slug)\n const workspaces = config.workspaces.filter(w => w.slug !== sanitised)\n // If the removed workspace was active, hand off to whatever's\n // first — predictable and avoids leaving the daemon in an\n // unreachable state when the user removes the only one.\n let active = config.active\n if (active === sanitised) {\n active = workspaces[0]?.slug\n }\n const next: WorkspacesConfig = { ...config, workspaces }\n if (active !== undefined) next.active = active\n else delete next.active\n return next\n}\n\nexport function setActiveWorkspace(\n config: WorkspacesConfig,\n slug: string\n): WorkspacesConfig {\n const sanitised = sanitizeSlug(slug)\n if (!config.workspaces.some(w => w.slug === sanitised)) {\n throw new Error(\n `setActiveWorkspace: no workspace registered with slug \"${sanitised}\". ` +\n `Run \\`agentproto workspace add <path> --slug ${sanitised}\\` first.`\n )\n }\n return { ...config, active: sanitised }\n}\n\nexport function findWorkspace(\n config: WorkspacesConfig,\n slug: string\n): WorkspaceEntry | undefined {\n return config.workspaces.find(w => w.slug === sanitizeSlug(slug))\n}\n\n/** The active workspace, or undefined when none is registered. Pure\n * convenience to avoid re-implementing the lookup at every caller. */\nexport function getActiveWorkspace(\n config: WorkspacesConfig\n): WorkspaceEntry | undefined {\n if (!config.active) return config.workspaces[0]\n return findWorkspace(config, config.active) ?? config.workspaces[0]\n}\n\n/**\n * Coerce arbitrary parsed JSON into a valid config. Skips entries\n * with missing required fields rather than throwing — partial recovery\n * is friendlier than \"your config file is corrupted, here's a stack\n * trace\". Logs nothing here; the CLI shells that consume this should\n * decide whether to surface a warning.\n */\nfunction normalizeConfig(parsed: unknown): WorkspacesConfig {\n if (!parsed || typeof parsed !== \"object\") {\n return { version: WORKSPACES_CONFIG_VERSION, workspaces: [] }\n }\n const obj = parsed as Record<string, unknown>\n const workspaces: WorkspaceEntry[] = []\n if (Array.isArray(obj.workspaces)) {\n for (const entry of obj.workspaces) {\n if (!entry || typeof entry !== \"object\") continue\n const e = entry as Record<string, unknown>\n const slug = typeof e.slug === \"string\" ? sanitizeSlug(e.slug) : \"\"\n const path = typeof e.path === \"string\" ? e.path : \"\"\n if (!slug || !path) continue\n const addedAt =\n typeof e.addedAt === \"string\" ? e.addedAt : new Date().toISOString()\n const updatedAt = typeof e.updatedAt === \"string\" ? e.updatedAt : addedAt\n const we: WorkspaceEntry = { slug, path, addedAt, updatedAt }\n if (typeof e.label === \"string\" && e.label.trim()) {\n we.label = e.label.trim()\n }\n workspaces.push(we)\n }\n }\n // De-dupe by slug (last wins) — the file is hand-editable so a\n // typo could have produced two entries with the same slug.\n const dedup = new Map<string, WorkspaceEntry>()\n for (const w of workspaces) dedup.set(w.slug, w)\n const finalList = Array.from(dedup.values())\n const active =\n typeof obj.active === \"string\" && finalList.some(w => w.slug === obj.active)\n ? (obj.active as string)\n : finalList[0]?.slug\n const out: WorkspacesConfig = {\n version: WORKSPACES_CONFIG_VERSION,\n workspaces: finalList,\n }\n if (active !== undefined) out.active = active\n return out\n}\n","/**\n * @agentproto/define-doctype — meta-factory for AIP `defineX` constructors.\n *\n * Every AIP that defines a markdown-with-frontmatter doctype ships a\n * `defineX(definition)` constructor (`defineTool` for AIP-14, `defineDriver`\n * for AIP-30, future `defineSkill` / `defineKnowledge` / …). Those\n * constructors share a small invariant prologue: validate the `id`\n * against a regex, validate `description` length, throw with a canonical\n * error prefix, freeze the returned handle.\n *\n * `createDoctype` lifts that prologue to one place. Each per-AIP\n * package supplies the spec-specific bits via `validate(def)` and\n * `build(def)`; the factory wires them together with the shared rules.\n *\n * Recommended scaffold for new AIPs (referenced from AIP-1).\n */\n\n/**\n * Default shape every AIP definition is assumed to satisfy when no\n * custom `readIdentity` / `readDescription` extractors are passed.\n *\n * Most AIPs (AIP-14 TOOL, AIP-30 DRIVER, AIP-3 SKILL, …) carry\n * `id` + `description`. AIPs that depart from this convention (e.g.\n * AIP-7 POLICY uses `slug` + `name`, with `description` optional)\n * supply their own extractors via `DoctypeOptions`.\n */\nexport interface DoctypeDefinitionBase {\n id: string\n description: string\n}\n\nexport interface DoctypeOptions<TDef, THandle> {\n /**\n * AIP number — surfaces in error messages so a thrown stack frame\n * inside a framework adapter still tells you which spec rejected\n * the definition.\n */\n aip: number\n /**\n * Doctype name (lower-case singular). Used to build the error\n * prefix: `name = \"tool\"` → \"defineTool: …\".\n */\n name: string\n /**\n * Extract the identity string (kebab-id, slug, …) to validate against\n * `idPattern`. Default: `(def) => (def as { id: string }).id` —\n * works for any AIP whose definition has an `id` field. AIPs whose\n * identity field has a different name (e.g. AIP-7 POLICY's `slug`)\n * supply their own reader.\n */\n readIdentity?: (def: TDef) => string\n /**\n * Override the default identity pattern. Default:\n * `/^[a-z0-9][a-z0-9._-]{1,79}$/` — kebab/snake/dot separated,\n * 2-80 chars, leading alphanumeric. AIPs with stricter rules\n * (AIP-7 POLICY uses `^[a-z0-9][a-z0-9-]*$`, no dots) override.\n */\n idPattern?: RegExp\n /**\n * Extract the LLM-facing prose used by the length check. Default:\n * `(def) => (def as { description: string }).description`. Pass\n * `false` to skip the length validation (e.g. AIPs where\n * description is optional, or where the human-readable string lives\n * in a different field).\n */\n readDescription?: ((def: TDef) => string | undefined) | false\n /**\n * Override the maximum prose length. Default 2000. AIPs whose\n * doctypes carry longer normative text on the doctype itself can\n * raise this; most should keep the default for prompt-injection\n * resistance.\n */\n maxDescriptionLen?: number\n /**\n * Spec-specific validations that run AFTER the default id and\n * description checks. Throw on failure. Stays out of `build()` so\n * the build path can assume a validated definition.\n */\n validate?: (def: TDef) => void\n /**\n * Build the immutable handle from a validated definition. Apply\n * defaults, freeze nested arrays/objects per the spec's freezing\n * rules, return the handle. The factory takes care of the\n * top-level `Object.freeze`.\n */\n build: (def: TDef) => THandle\n}\n\nconst DEFAULT_ID_PATTERN = /^[a-z0-9][a-z0-9._-]{1,79}$/\nconst MAX_DESCRIPTION_LEN = 2000\n\n/**\n * Build a `defineX(definition)` constructor that enforces the\n * cross-AIP invariants and delegates spec-specific behaviour to\n * `validate` / `build`.\n *\n * Usage (from `@agentproto/tool/src/define-tool.ts`):\n *\n * export const defineTool = createDoctype<ToolDefinition, ToolHandle>({\n * aip: 14,\n * name: \"tool\",\n * validate(def) { ...spec-14 checks... },\n * build(def) { ...defaulting + nested freezing... },\n * })\n */\nexport function createDoctype<TDef, THandle>(\n opts: DoctypeOptions<TDef, THandle>,\n): (def: TDef) => THandle {\n const idPattern = opts.idPattern ?? DEFAULT_ID_PATTERN\n const readIdentity =\n opts.readIdentity ?? ((def: TDef) => (def as { id: string }).id)\n const readDescription =\n opts.readDescription === false\n ? null\n : (opts.readDescription ??\n ((def: TDef) => (def as { description: string }).description))\n const maxLen = opts.maxDescriptionLen ?? MAX_DESCRIPTION_LEN\n const prefix = `define${capitalize(opts.name)}`\n const aipTag = `(AIP-${opts.aip})`\n\n return function constructDoctype(def: TDef): THandle {\n const identity = readIdentity(def)\n if (typeof identity !== \"string\" || !idPattern.test(identity)) {\n throw new Error(\n `${prefix} ${aipTag}: invalid id '${String(\n identity,\n )}' — must match ${idPattern}`,\n )\n }\n if (readDescription) {\n const description = readDescription(def)\n if (\n typeof description !== \"string\" ||\n description.length === 0 ||\n description.length > maxLen\n ) {\n throw new Error(\n `${prefix} ${aipTag}: id='${identity}' description must be 1–${maxLen} chars`,\n )\n }\n }\n opts.validate?.(def)\n return Object.freeze(opts.build(def)) as THandle\n }\n}\n\nfunction capitalize(s: string): string {\n return s.length === 0 ? s : s.charAt(0).toUpperCase() + s.slice(1)\n}\n\nexport const DOCTYPE_DEFAULT_ID_PATTERN = DEFAULT_ID_PATTERN\nexport const DOCTYPE_MAX_DESCRIPTION_LEN = MAX_DESCRIPTION_LEN\n\n/**\n * Filter a value to its YAML-serialisable subset:\n * - functions removed (e.g. driver `execute[id]: ExecuteFn`)\n * - zod schemas removed (e.g. tool `inputSchema`, `outputSchema`,\n * `contextSchema` — they live in TS, not in frontmatter)\n * - `undefined` values dropped from objects (so the YAML output\n * doesn't carry empty keys; `null` is preserved as a real value)\n *\n * Used by per-AIP `createX(params, opts)` to project a validated\n * definition into a manifest-shaped object before writing to disk.\n * Pure function; no I/O.\n */\nexport function filterSerializable(value: unknown): unknown {\n if (value === null || value === undefined) return value\n if (typeof value === \"function\") return undefined\n if (\n typeof value === \"object\" &&\n value !== null &&\n Object.prototype.hasOwnProperty.call(value, \"_def\") &&\n \"parse\" in value &&\n typeof (value as { parse?: unknown }).parse === \"function\"\n ) {\n return undefined\n }\n if (Array.isArray(value)) {\n return value.map(filterSerializable).filter((v) => v !== undefined)\n }\n if (typeof value === \"object\") {\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n const filtered = filterSerializable(v)\n if (filtered !== undefined) out[k] = filtered\n }\n return out\n }\n return value\n}\n","/**\n * @agentproto/manifest — generic verbs for AIP doctypes.\n *\n * Every per-AIP package (`@agentproto/tool`, `@agentproto/driver`, …)\n * supplies a `DoctypeSpec` describing the per-package knobs (name,\n * AIP number, schema literal, path convention, validator, parser).\n * `createVerbs(spec)` returns the full lifecycle:\n *\n * create(params, opts) params → .md on disk\n * load(path) .md on disk → handle\n * list(dir, filter?) walk → handle[]\n * update(path, mutator) load → patch → write back\n * resolve(block, ctx?) { inline | ref | file } → handle\n * delete(path) fs.unlink\n *\n * Adding a new verb is a single place; every package picks it up\n * automatically — same model as `createDoctype` for the validation\n * pipeline.\n */\n\nimport { filterSerializable } from \"@agentproto/define-doctype\"\nimport matter from \"gray-matter\"\nimport type { Dirent } from \"node:fs\"\nimport { mkdir, readFile, readdir, rm, writeFile } from \"node:fs/promises\"\nimport { dirname, isAbsolute, join } from \"node:path\"\n\n/**\n * Per-package descriptor consumed by `createVerbs`.\n *\n * Generic over the params shape (input to `define`) and the handle\n * shape (output of `define`). For most AIPs `THandle` extends\n * `TParams` — handles are just frozen, defaulted definitions.\n */\nexport interface DoctypeSpec<\n TParams extends { id?: string; slug?: string; name?: string },\n THandle,\n> {\n /** Lower-case singular: \"tool\", \"driver\", \"operator\". Used in errors. */\n name: string\n /** AIP number — surfaces in error messages for provenance. */\n aip: number\n /** Frontmatter `schema:` literal (e.g. \"agentproto/tool/v1\"). */\n schemaLiteral: string\n /**\n * Filename of the doctype's manifest. By default `<DOCTYPE>.md`,\n * derived from `name.toUpperCase()`. Override only when the\n * doctype's filename diverges from convention.\n */\n filename?: string\n /**\n * Path-of-handle convention. Given a validated handle, return the\n * workspace-relative path the manifest lives at. Examples:\n * tool: `(h) => `${h.id}/TOOL.md``\n * policy: `(h) => `policies/${h.slug}/POLICY.md``\n * operator: `(h) => `${h.id}/OPERATOR.md``\n */\n pathOf(handle: THandle): string\n /** TS authoring path: validates params + applies defaults. */\n define(params: TParams): THandle\n /** MD authoring path: parses YAML+body. Throws on invalid frontmatter. */\n parse(source: string): { frontmatter: Record<string, unknown>; body: string }\n /**\n * Optional projection: handle → manifest-shaped frontmatter object.\n * Default: pass the params through `filterSerializable` (drops zod\n * schemas + functions). Override when the handle and frontmatter\n * shapes diverge non-trivially.\n */\n toFrontmatter?(params: TParams): Record<string, unknown>\n}\n\nexport interface CreateOptions {\n /** Workspace-relative or absolute base directory. */\n dir: string\n /** Body markdown after the frontmatter. Defaults to a one-line stub. */\n body?: string\n /** Render only — don't write. Returns the rendered string. */\n dryRun?: boolean\n}\n\nexport interface VerbResult<THandle> {\n path: string\n handle: THandle\n rendered: string\n}\n\nexport interface ListOptions {\n /** Filter the discovered handles. Receives the loaded handle. */\n filter?: <H>(handle: H) => boolean\n /** Skip subdirectories matching these names. Default: [\"node_modules\", \".git\", \"dist\", \".next\"]. */\n skipDirs?: readonly string[]\n}\n\nexport type RefBlock<TParams> =\n | { inline: TParams }\n | { ref: string }\n | { file: string }\n\nexport interface ResolveContext {\n /** Base dir for `file:` references. Required when resolving file blocks. */\n baseDir?: string\n /**\n * Registry resolver for `ref:` strings (e.g. `@agentik/runners/python-3.12`\n * → handle). Optional; throws when an unresolvable ref is encountered.\n */\n resolveRef?: (ref: string) => Promise<unknown> | unknown\n}\n\nexport interface Verbs<TParams, THandle> {\n /** TS-authored params → write `<dir>/<pathOf(handle)>` on disk. */\n create(params: TParams, opts: CreateOptions): Promise<VerbResult<THandle>>\n /** Read a manifest from disk → handle. */\n load(path: string): Promise<{ path: string; handle: THandle; body: string }>\n /** Walk `dir` for the doctype's `*.md` files; return loaded handles. */\n list(dir: string, opts?: ListOptions): Promise<THandle[]>\n /** Load → mutate → write back. Mutator receives the loaded params. */\n update(\n path: string,\n mutator: (params: TParams, ctx: { handle: THandle; body: string }) => TParams | Promise<TParams>,\n opts?: { body?: string; dryRun?: boolean },\n ): Promise<VerbResult<THandle>>\n /**\n * Resolve a `{ inline | ref | file }` block to a handle. Used by\n * doctypes that compose other doctypes (AIP-17/30/36 pattern).\n */\n resolve(\n block: RefBlock<TParams>,\n ctx?: ResolveContext,\n ): Promise<THandle>\n /** Remove the manifest file. Does NOT recurse into the containing dir. */\n delete(path: string): Promise<void>\n}\n\nconst DEFAULT_SKIP_DIRS: readonly string[] = [\n \"node_modules\",\n \".git\",\n \"dist\",\n \".next\",\n \".turbo\",\n]\n\nexport function createVerbs<\n TParams extends { id?: string; slug?: string; name?: string },\n THandle,\n>(spec: DoctypeSpec<TParams, THandle>): Verbs<TParams, THandle> {\n const filename = spec.filename ?? `${spec.name.toUpperCase()}.md`\n const toFrontmatter =\n spec.toFrontmatter ??\n ((params: TParams) =>\n filterSerializable({\n schema: spec.schemaLiteral,\n ...params,\n }) as Record<string, unknown>)\n\n async function create(\n params: TParams,\n opts: CreateOptions,\n ): Promise<VerbResult<THandle>> {\n const handle = spec.define(params)\n const relativePath = spec.pathOf(handle)\n const path = join(opts.dir, relativePath)\n const frontmatter = toFrontmatter(params)\n const rendered = matter.stringify(\n opts.body ?? defaultBody(spec, frontmatter),\n frontmatter,\n )\n if (!opts.dryRun) {\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, rendered, \"utf8\")\n }\n return { path, handle, rendered }\n }\n\n async function load(\n path: string,\n ): Promise<{ path: string; handle: THandle; body: string }> {\n const source = await readFile(path, \"utf8\")\n const { frontmatter, body } = spec.parse(source)\n // The frontmatter is already zod-validated by `parse` (each per-\n // package parser runs the schema). Cast through `define` so the\n // cross-AIP invariants run too — same path the TS authoring uses.\n const handle = spec.define(frontmatter as unknown as TParams)\n return { path, handle, body }\n }\n\n async function list(\n dir: string,\n opts: ListOptions = {},\n ): Promise<THandle[]> {\n const skip = new Set(opts.skipDirs ?? DEFAULT_SKIP_DIRS)\n const out: THandle[] = []\n\n async function walk(current: string): Promise<void> {\n // The Dirent overload returns `Dirent<NonSharedBuffer>[]` in\n // Node 22+'s @types/node when called with non-string buffer\n // input. Coerce by typing the entries as `Dirent[]` (string\n // names by default) since we always pass a string path.\n let entries: Dirent[]\n try {\n entries = (await readdir(current, { withFileTypes: true })) as Dirent[]\n } catch {\n return\n }\n for (const entry of entries) {\n const entryName = String(entry.name)\n if (entry.isDirectory()) {\n if (skip.has(entryName)) continue\n await walk(join(current, entryName))\n continue\n }\n if (!entry.isFile()) continue\n if (entryName !== filename) continue\n try {\n const { handle } = await load(join(current, entryName))\n if (!opts.filter || opts.filter(handle)) out.push(handle)\n } catch {\n // Malformed manifests skip the list — `load` will throw the\n // useful diagnostic when a caller wants to see it.\n }\n }\n }\n\n await walk(dir)\n return out\n }\n\n async function update(\n path: string,\n mutator: (\n params: TParams,\n ctx: { handle: THandle; body: string },\n ) => TParams | Promise<TParams>,\n opts: { body?: string; dryRun?: boolean } = {},\n ): Promise<VerbResult<THandle>> {\n const { handle, body } = await load(path)\n // Reconstruct params from the frontmatter — the load path already\n // validated, so this is just a reverse projection.\n const source = await readFile(path, \"utf8\")\n const { frontmatter } = spec.parse(source)\n const params = frontmatter as unknown as TParams\n const mutated = await mutator(params, { handle, body })\n const newHandle = spec.define(mutated)\n const newFrontmatter = toFrontmatter(mutated)\n const rendered = matter.stringify(\n opts.body ?? body,\n newFrontmatter,\n )\n if (!opts.dryRun) {\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, rendered, \"utf8\")\n }\n return { path, handle: newHandle, rendered }\n }\n\n async function resolve(\n block: RefBlock<TParams>,\n ctx: ResolveContext = {},\n ): Promise<THandle> {\n if (\"inline\" in block) {\n return spec.define(block.inline)\n }\n if (\"file\" in block) {\n const baseDir = ctx.baseDir ?? \".\"\n const path = isAbsolute(block.file) ? block.file : join(baseDir, block.file)\n const { handle } = await load(path)\n return handle\n }\n if (\"ref\" in block) {\n if (!ctx.resolveRef) {\n throw new Error(\n `${spec.name}.resolve (AIP-${spec.aip}): block has \\`ref: '${block.ref}'\\` but no resolveRef provided in context — registries must inject their own resolver`,\n )\n }\n const resolved = await ctx.resolveRef(block.ref)\n return spec.define(resolved as TParams)\n }\n throw new Error(\n `${spec.name}.resolve (AIP-${spec.aip}): block must have one of inline | ref | file`,\n )\n }\n\n async function deleteFn(path: string): Promise<void> {\n await rm(path, { force: true })\n }\n\n return { create, load, list, update, resolve, delete: deleteFn }\n}\n\nfunction defaultBody<P, H>(\n spec: DoctypeSpec<P extends { id?: string; slug?: string; name?: string } ? P : never, H>,\n frontmatter: Record<string, unknown>,\n): string {\n const id =\n typeof frontmatter.name === \"string\"\n ? frontmatter.name\n : typeof frontmatter.id === \"string\"\n ? frontmatter.id\n : typeof frontmatter.slug === \"string\"\n ? frontmatter.slug\n : spec.name\n return `# ${id}\\n`\n}\n\n","/**\n * AIP-40 EXTENSION.md frontmatter zod schema.\n *\n * Generated from `resources/aip-40/draft/EXTENSION.schema.json` via\n * json-schema-to-zod. Imported by both `define-extension.ts` (TS path\n * validation) and `manifest/index.ts` (.md path validation) so every\n * field-level constraint runs in both authoring paths from a single\n * source of truth — re-run scaffold-aip to refresh after spec changes.\n *\n * Cross-field rules (if/then/allOf in JSON Schema) don't translate\n * cleanly and live in `define-extension.ts`'s `validate(def)` instead.\n */\n\nimport { z } from \"zod\"\n\nexport const extensionFrontmatterSchema = z.object({ \"schema\": z.literal(\"agentproto/extension/v1\").describe(\"Pins the spec version this manifest conforms to.\"), \"slug\": z.string().regex(new RegExp(\"^[a-z][a-z0-9-]*:[a-z][a-z0-9-]*[a-z0-9]$\")).describe(\"Namespaced identifier — `<namespace>:<name>`. Lowercase, digits, dashes; single colon separator. Example: `acme:deal`.\"), \"title\": z.string().min(1).max(80).describe(\"Human-readable display name.\"), \"description\": z.string().min(1).max(2000).describe(\"One-paragraph statement of the extension's purpose.\"), \"version\": z.string().regex(new RegExp(\"^\\\\d+\\\\.\\\\d+\\\\.\\\\d+(?:[-+][a-zA-Z0-9.-]+)?$\")).describe(\"Extension's own semver. Bump on breaking change.\"), \"status\": z.literal(\"Local\").describe(\"Extensions are perpetually Local — they never enter the public registry's Draft/Review/Final lifecycle.\"), \"extends\": z.union([z.string().regex(new RegExp(\"^aip-\\\\d+$\")).describe(\"Inherit a public AIP's schema (e.g. `aip-14`).\"), z.literal(\"none\").describe(\"Brand-new doctype, no inheritance.\")]).describe(\"Parent AIP this extension inherits from, or `none` for a root doctype.\"), \"add_fields\": z.object({ \"properties\": z.record(z.string(), z.any()).describe(\"JSON Schema property definitions to merge into the parent's properties. Collisions are an error — use `tighten` to narrow an existing field.\").optional(), \"required\": z.array(z.string()).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), { message: \"All items must be unique!\" }).describe(\"Field names that become required in addition to parent's required[]. Unioned with parent's required, never replaces.\").default([] as never) }).strict().describe(\"Schema-level additions: new properties + new required entries.\").optional(), \"tighten\": z.record(z.string(), z.object({ \"pattern\": z.string().optional(), \"enum\": z.array(z.any()).optional(), \"minLength\": z.number().int().gte(0).optional(), \"maxLength\": z.number().int().gte(0).optional(), \"minimum\": z.number().optional(), \"maximum\": z.number().optional() }).strict()).describe(\"Per-field constraint overrides. Each entry MUST tighten (not loosen) the parent's constraints; runtimes verify monotonicity at registration.\").optional(), \"defaults\": z.record(z.string(), z.any()).describe(\"Default values applied when a field is omitted. Layered on top of parent's defaults; extension's value wins on the same key.\").optional(), \"path_convention\": z.string().min(1).describe(\"Filesystem convention template, e.g. `\\\"deals/<slug>/DEAL.md\\\"`. Tokens: `<slug>` (doctype identity), `<DOCTYPE>` (extension's slug name part). Falls back to parent's convention when omitted.\").optional(), \"requires\": z.array(z.number().int().gte(1)).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), { message: \"All items must be unique!\" }).describe(\"Public AIPs the extension depends on, in addition to its parent.\").default([] as never), \"metadata\": z.record(z.string(), z.any()).describe(\"Free-form vendor extensions under namespaced keys (`metadata.<vendor>.<field>`).\").default({} as never) }).strict().describe(\"Validates the YAML frontmatter portion of an AIP-40 EXTENSION.md manifest. An extension declares a workspace-local doctype that inherits a public AIP's schema and may add fields, tighten constraints, set defaults, and override the path convention.\")\n\nexport type ExtensionFrontmatter = z.infer<typeof extensionFrontmatterSchema>\n","import { createDoctype } from \"@agentproto/define-doctype\"\nimport { extensionFrontmatterSchema } from \"./schema.js\"\nimport type { ExtensionDefinition, ExtensionHandle } from \"./types.js\"\n\n/**\n * AIP-40 reference implementation of `defineExtension`.\n *\n * Built on `createDoctype` so the cross-AIP invariants (id pattern,\n * description length, top-level freeze, \"defineExtension (AIP-40): …\"\n * error prefix) run uniformly with every other AIP defineX.\n *\n * Field-level validation runs the schema-derived zod from\n * `./schema.ts` against the input. Same source of truth as the .md\n * path uses (`parseExtensionManifest`), so a malformed TS-authored\n * definition fails with the same diagnostic as a malformed manifest.\n * Cross-field rules go in `validate(def)` after the zod check.\n *\n * Identity / description extractors detected from the JSON Schema:\n * readIdentity: def.slug\n * readDescription: def.description.\n */\nexport const defineExtension = createDoctype<ExtensionDefinition, ExtensionHandle>({\n aip: 40,\n name: \"extension\",\n // Extension slugs are namespaced: `<namespace>:<name>` (e.g.\n // `acme:deal`). Override the default kebab-only pattern.\n idPattern: /^[a-z][a-z0-9-]*:[a-z][a-z0-9-]*[a-z0-9]$/,\n readIdentity: (def) => def.slug,\n validate(def) {\n const result = extensionFrontmatterSchema.safeParse(def)\n if (!result.success) {\n throw new Error(\n `defineExtension (AIP-40): ${result.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \")}`,\n )\n }\n // TODO: spec-40-specific cross-field rules (if/then/allOf in\n // the JSON Schema) — those don't translate to zod cleanly and\n // belong here. See @agentproto/operator's autonomy=gated rule.\n },\n build(def) {\n // Default build: spread the validated definition into a fresh object.\n // Hand-tune for nested freezing (Object.freeze on arrays/objects) and\n // for fields that need defaults applied — see @agentproto/operator\n // for a reference shape.\n return { ...def } as ExtensionHandle\n },\n})\n","/**\n * AIP-40 EXTENSION.md sidecar parser + manifest-to-handle constructor.\n *\n * Mirror of `@agentproto/tool/manifest` and `@agentproto/driver/manifest`:\n * the .md provides metadata; the TS module supplies any spec-specific\n * runtime bits (schemas, execute bodies, …) that can't live in\n * frontmatter. Both inputs end up in `defineExtension` so the cross-AIP\n * invariants run uniformly.\n *\n *\n * The frontmatter zod schema below was generated from\n * `resources/aip-40/draft/EXTENSION.schema.json` via json-schema-to-zod.\n * Re-run scaffold-aip to refresh after spec changes (or hand-tune\n * any constraint the converter doesn't capture cleanly).\n */\n\nimport matter from \"gray-matter\"\nimport { extensionFrontmatterSchema, type ExtensionFrontmatter } from \"../schema.js\"\nimport { defineExtension } from \"../define-extension.js\"\nimport type { ExtensionDefinition, ExtensionHandle } from \"../types.js\"\n\n// Re-export so consumers can import the schema + inferred type either\n// from \"@@agentproto/extension/manifest\" or directly from \"@@agentproto/extension/schema\".\nexport { extensionFrontmatterSchema, type ExtensionFrontmatter }\n\nexport interface ExtensionManifest {\n frontmatter: ExtensionFrontmatter\n body: string\n}\n\nexport function parseExtensionManifest(source: string): ExtensionManifest {\n const parsed = matter(source)\n if (Object.keys(parsed.data).length === 0) {\n throw new Error(\"parseExtensionManifest: missing or empty frontmatter\")\n }\n const result = extensionFrontmatterSchema.safeParse(parsed.data)\n if (!result.success) {\n throw new Error(\n `parseExtensionManifest: invalid frontmatter — ${result.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \")}`,\n )\n }\n return { frontmatter: result.data, body: parsed.content }\n}\n\nexport function extensionFromManifest(manifest: ExtensionManifest): ExtensionHandle {\n // The zod-validated frontmatter is structurally compatible with\n // ExtensionDefinition; the cast pins the typing once the manifest\n // schema and the TS interface diverge (e.g. handle has frozen fields\n // a literal config doesn't carry yet).\n return defineExtension(manifest.frontmatter as unknown as ExtensionDefinition)\n}\n","/**\n * `specFromExtension(handle, parent)` — turn a parsed EXTENSION.md\n * into a runtime `DoctypeSpec` consumable by\n * `@agentproto/manifest.createVerbs`.\n *\n * The parent argument is the public AIP's spec (e.g. `toolSpec` from\n * `@agentproto/tool`). The function composes:\n *\n * schema parent.schema ∪ ext.add_fields, then ext.tighten\n * path ext.path_convention ?? parent.pathOf\n * defaults parent defaults ⨁ ext.defaults\n * define wraps parent.define with default-application\n * parse parent.parse (frontmatter shape stays compatible)\n *\n * Tightening monotonicity is verified by-field: pattern subset\n * (cheap heuristic — full regex-language inclusion is undecidable),\n * enum subset (set membership), minLength/minimum ≥, maxLength/maximum ≤.\n *\n * For `extends: none`, `parent` is null/undefined and the extension\n * acts as a root doctype: the `add_fields` becomes its full schema,\n * `path_convention` is required (no parent fallback).\n */\n\nimport type { DoctypeSpec } from \"@agentproto/manifest\"\nimport type { ExtensionDefinition } from \"./types.js\"\n\nexport interface SpecFromExtensionOptions<\n TParams extends { id?: string; slug?: string; name?: string },\n THandle,\n> {\n /**\n * Parent doctype spec. Required when `extension.extends !== \"none\"`.\n * Pass e.g. `toolSpec` from `@agentproto/tool`.\n */\n parent?: DoctypeSpec<TParams, THandle>\n}\n\nexport function specFromExtension<\n TParams extends { id?: string; slug?: string; name?: string },\n THandle,\n>(\n extension: ExtensionDefinition,\n opts: SpecFromExtensionOptions<TParams, THandle> = {},\n): DoctypeSpec<TParams, THandle> {\n const { parent } = opts\n const isRoot = extension.extends === \"none\"\n\n if (!isRoot && !parent) {\n throw new Error(\n `specFromExtension (AIP-40): extension '${extension.slug}' extends '${extension.extends}' but no parent spec was provided in opts.parent`,\n )\n }\n if (isRoot && !extension.path_convention) {\n throw new Error(\n `specFromExtension (AIP-40): extension '${extension.slug}' is a root doctype (extends: none) and MUST declare path_convention`,\n )\n }\n\n // Tightening monotonicity check — see Specification §\"Composition rules\" #3.\n if (parent && extension.tighten) {\n verifyTightening(extension, parent)\n }\n\n const slugName = extension.slug.split(\":\")[1] ?? extension.slug\n const pathTemplate = extension.path_convention ?? null\n\n // Keys the extension is authoritative over — anything declared in\n // `add_fields.properties`. Computed once at spec-composition time so\n // the per-call `define` is a hot-path lookup, not a re-derivation.\n const extensionKeys = new Set(\n Object.keys(extension.add_fields?.properties ?? {}),\n )\n\n const define = (params: TParams) => {\n // Layered defaults: parent defaults are baked into parent.define;\n // extension defaults apply on top, only for keys the user omitted.\n const withDefaults = { ...params } as Record<string, unknown>\n if (extension.defaults) {\n for (const [key, value] of Object.entries(extension.defaults)) {\n if (withDefaults[key] === undefined && value !== undefined) {\n withDefaults[key] = value\n }\n }\n }\n if (isRoot) {\n // Root doctype — no parent.define to delegate to. Return the\n // params verbatim, frozen. (A more disciplined runtime would\n // compile the add_fields schema to zod and validate; deferred\n // because root doctypes are rare and the manifest layer's\n // schema-level zod catches malformed input.)\n return Object.freeze(withDefaults) as unknown as THandle\n }\n // Split params before delegating: parent specs typically validate\n // through `zod.strict()` (e.g. AIP-42 `agentFrontmatterSchema`),\n // which rejects extension-owned keys as \"Unrecognized\". Hand the\n // parent only what it owns, then re-attach extension fields onto\n // the resulting handle. Extension-side validation of these fields\n // is the manifest layer's responsibility (compiled from\n // `add_fields` JSON Schema at parse time); the runtime trusts\n // input it received via that path.\n const parentOnly: Record<string, unknown> = {}\n const extensionOnly: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(withDefaults)) {\n if (extensionKeys.has(key)) extensionOnly[key] = value\n else parentOnly[key] = value\n }\n const parentHandle = parent!.define(parentOnly as unknown as TParams)\n return Object.freeze({\n ...(parentHandle as object),\n ...extensionOnly,\n }) as unknown as THandle\n }\n\n const parse = isRoot ? rootParse(extension) : parent!.parse\n\n const pathOf = (handle: THandle) => {\n if (pathTemplate) {\n return resolvePathTemplate(\n pathTemplate,\n handle as unknown as Record<string, unknown>,\n slugName,\n )\n }\n return parent!.pathOf(handle)\n }\n\n return {\n name: extension.slug,\n aip: 40,\n schemaLiteral: parent?.schemaLiteral ?? `agentproto/extension/v1`,\n pathOf,\n define,\n parse,\n }\n}\n\nfunction verifyTightening<\n TParams extends { id?: string; slug?: string; name?: string },\n THandle,\n>(\n extension: ExtensionDefinition,\n parent: DoctypeSpec<TParams, THandle>,\n): void {\n // Best-effort: the manifest layer doesn't expose the parent's raw\n // JSON Schema, so we can only verify what the spec ships in\n // `extension.tighten` against itself for self-consistency. Full\n // parent-vs-extension monotonicity verification belongs to a future\n // version once parent specs expose `schema:` introspection.\n const t = extension.tighten ?? {}\n for (const [field, override] of Object.entries(t)) {\n if (\n typeof override.minLength === \"number\" &&\n typeof override.maxLength === \"number\" &&\n override.minLength > override.maxLength\n ) {\n throw new Error(\n `specFromExtension (AIP-40): extension '${extension.slug}' tighten.${field}: minLength (${override.minLength}) > maxLength (${override.maxLength})`,\n )\n }\n if (\n typeof override.minimum === \"number\" &&\n typeof override.maximum === \"number\" &&\n override.minimum > override.maximum\n ) {\n throw new Error(\n `specFromExtension (AIP-40): extension '${extension.slug}' tighten.${field}: minimum (${override.minimum}) > maximum (${override.maximum})`,\n )\n }\n if (override.enum !== undefined && !Array.isArray(override.enum)) {\n throw new Error(\n `specFromExtension (AIP-40): extension '${extension.slug}' tighten.${field}: enum must be an array`,\n )\n }\n }\n}\n\nfunction rootParse(extension: ExtensionDefinition) {\n return (source: string) => {\n // Root doctypes don't have a parent parser — fall back to bare\n // gray-matter. The manifest layer applies `define` afterwards.\n // We don't import gray-matter here to keep this module dependency-\n // light; the caller wires their own parse if they really want a\n // root doctype, or uses the standard parse from a sibling package.\n void source\n void extension\n throw new Error(\n `specFromExtension (AIP-40): extension '${extension.slug}' is a root doctype — supply your own parser or extend a public AIP for parser inheritance`,\n )\n }\n}\n\nfunction resolvePathTemplate(\n template: string,\n handle: Record<string, unknown>,\n doctypeSlug: string,\n): string {\n // Tokens supported in v1: <slug> (the doctype's identity field —\n // tries id, slug, name in that order) and <DOCTYPE> (uppercase\n // version of the extension's slug name part, e.g. \"DEAL\").\n const identity =\n (typeof handle.id === \"string\" && handle.id) ||\n (typeof handle.slug === \"string\" && handle.slug) ||\n (typeof handle.name === \"string\" && handle.name) ||\n \"unknown\"\n return template\n .replace(/<slug>/g, identity)\n .replace(/<DOCTYPE>/g, doctypeSlug.toUpperCase())\n}\n","/**\n * @agentproto/mcp-server — exposes AIP doctype verbs as MCP tools.\n *\n * Hand a list of `DoctypeSpec` instances (one per registered AIP) and\n * optionally a workspace dir; the server registers\n * `create_<name> / load_<name> / list_<name> / update_<name> /\n * resolve_<name> / delete_<name>` for each spec, including AIP-40\n * extensions auto-loaded from `<workspace>/extensions/<slug>/EXTENSION.md`.\n *\n * Two ways to run it:\n * 1. **Embedded** — call `createMcpServer({ specs, workspace })` and\n * attach to your own transport (stdio, websocket, …).\n * 2. **Standalone** — `runStdioServer({ specs, workspace })` wires\n * stdio for you. Useful as a `mcp_servers.<id>` config entry on\n * Claude Desktop / Cursor / any MCP host.\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\"\nimport { z } from \"zod\"\nimport { existsSync } from \"node:fs\"\nimport { readFile } from \"node:fs/promises\"\nimport { isAbsolute, join, resolve } from \"node:path\"\nimport { createVerbs, type DoctypeSpec } from \"@agentproto/manifest\"\nimport {\n parseExtensionManifest,\n specFromExtension,\n} from \"@agentproto/extension\"\n\n// `RegisterableSpec<TParams, THandle>` is just `DoctypeSpec` plus the\n// constraint that callers passing different generics across the array\n// must type-erase via `as unknown as DoctypeSpec<...>` at the boundary.\n// We don't try to express the heterogeneous list in TS — same trick\n// `@agentproto/driver`'s `implementations[]` uses.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnySpec = DoctypeSpec<any, any>\n\nexport interface CreateMcpServerOptions {\n /** Doctype specs registered as MCP tools. One per AIP. */\n specs: readonly AnySpec[]\n /**\n * Optional workspace dir. If provided, the server scans\n * `<workspace>/extensions/` for `EXTENSION.md` files and registers\n * each as a local doctype. The parent of each extension is resolved\n * by matching the extension's `extends:` field (`aip-N`) against\n * `specs.find(s => s.aip === N)` — so the spec list MUST include the\n * parents the extensions reference, else loading throws.\n */\n workspace?: string\n /** Server name advertised over MCP. Default `agentproto-mcp-server`. */\n name?: string\n /** Server version advertised over MCP. Default `0.1.0-alpha`. */\n version?: string\n}\n\nexport interface CreateMcpServerResult {\n /** The wired McpServer; attach a transport to start serving. */\n server: McpServer\n /**\n * The list of doctype names the server registered tools for —\n * useful for tests + diagnostics. Includes any extensions loaded\n * from `workspace/extensions/`.\n */\n registered: readonly string[]\n}\n\nexport async function createMcpServer(\n opts: CreateMcpServerOptions,\n): Promise<CreateMcpServerResult> {\n const server = new McpServer({\n name: opts.name ?? \"agentproto-mcp-server\",\n version: opts.version ?? \"0.1.0-alpha\",\n })\n\n const allSpecs: AnySpec[] = [...opts.specs]\n\n // Load extensions when a workspace is given.\n if (opts.workspace) {\n const extensions = await loadExtensions(opts.workspace, opts.specs)\n allSpecs.push(...extensions)\n }\n\n // Path-anchoring: when a workspace is set, resolve all relative\n // dir/path arguments against it. Agents pass logical paths like\n // \"tools\" or \"tools/echo/TOOL.md\"; the server pins them to the\n // workspace so they don't leak into process.cwd() (which is\n // wherever the host happened to spawn the server).\n const anchor = (p: string): string =>\n isAbsolute(p) || !opts.workspace ? p : join(opts.workspace, p)\n\n for (const spec of allSpecs) {\n registerVerbs(server, spec, anchor)\n }\n\n return {\n server,\n registered: allSpecs.map((s) => s.name),\n }\n}\n\n/**\n * Wire `createMcpServer` to stdio for use as an `mcp_servers.<id>`\n * entry on Claude Desktop / Cursor / etc. Resolves once the\n * transport closes.\n */\nexport async function runStdioServer(\n opts: CreateMcpServerOptions,\n): Promise<void> {\n const { server } = await createMcpServer(opts)\n const transport = new StdioServerTransport()\n await server.connect(transport)\n}\n\n// ── verb registration ───────────────────────────────────────────────\n\nfunction registerVerbs(\n server: McpServer,\n spec: AnySpec,\n anchor: (p: string) => string,\n): void {\n const verbs = createVerbs(spec)\n // Tool name uses snake_case to match MCP convention; spec.name may\n // be kebab (driver-cli) or namespaced (acme:deal). Map all to snake.\n const verbName = (verb: string) =>\n `${verb}_${spec.name.replace(/[-:]/g, \"_\")}`\n const description = (verb: string, body: string) =>\n `${verb} the AIP-${spec.aip} ${spec.name} doctype. ${body}`\n\n // create\n server.tool(\n verbName(\"create\"),\n description(\n \"create\",\n \"Author a new manifest from params. Returns { path, rendered }.\",\n ),\n {\n params: z\n .record(z.string(), z.unknown())\n .describe(`The ${spec.name} definition fields.`),\n dir: z.string().describe(\"Workspace-relative or absolute target directory.\"),\n body: z\n .string()\n .optional()\n .describe(\"Markdown body after the frontmatter. Defaults to a stub.\"),\n dryRun: z\n .boolean()\n .optional()\n .describe(\"Render only — don't write to disk.\"),\n },\n async ({ params, dir, body, dryRun }) => {\n const result = await verbs.create(params, {\n dir: anchor(dir),\n body,\n dryRun,\n })\n return contentText({\n path: result.path,\n rendered: result.rendered,\n })\n },\n )\n\n // load\n server.tool(\n verbName(\"load\"),\n description(\"load\", \"Read a manifest from disk. Returns the parsed handle.\"),\n {\n path: z.string().describe(\"Absolute or workspace-relative path to the .md file.\"),\n },\n async ({ path }) => {\n const result = await verbs.load(anchor(path))\n return contentText({ path: result.path, handle: result.handle })\n },\n )\n\n // list\n server.tool(\n verbName(\"list\"),\n description(\n \"list\",\n \"Walk a directory tree and return all manifests of this doctype.\",\n ),\n {\n dir: z.string().describe(\"Directory to walk.\"),\n skipDirs: z\n .array(z.string())\n .optional()\n .describe(\"Subdir names to skip (default: node_modules, .git, dist).\"),\n },\n async ({ dir, skipDirs }) => {\n const handles = await verbs.list(anchor(dir), { skipDirs })\n return contentText({ count: handles.length, handles })\n },\n )\n\n // update\n server.tool(\n verbName(\"update\"),\n description(\n \"update\",\n \"Patch an existing manifest. The patch is shallow-merged into the existing params.\",\n ),\n {\n path: z.string().describe(\"Path to the manifest to update.\"),\n patch: z\n .record(z.string(), z.unknown())\n .describe(\"Partial fields to merge into the existing manifest.\"),\n body: z.string().optional().describe(\"New body markdown (default: keep existing).\"),\n },\n async ({ path, patch, body }) => {\n const result = await verbs.update(\n anchor(path),\n (existing: Record<string, unknown>) => ({ ...existing, ...patch }),\n { body },\n )\n return contentText({ path: result.path, rendered: result.rendered })\n },\n )\n\n // resolve\n server.tool(\n verbName(\"resolve\"),\n description(\n \"resolve\",\n \"Resolve an inline | ref | file block to a fully-typed handle.\",\n ),\n {\n block: z\n .union([\n z.object({ inline: z.record(z.string(), z.unknown()) }),\n z.object({ ref: z.string() }),\n z.object({ file: z.string() }),\n ])\n .describe(\"The composition block.\"),\n baseDir: z\n .string()\n .optional()\n .describe(\"Base dir for `file:` references.\"),\n },\n async ({ block, baseDir }) => {\n const handle = await verbs.resolve(block, {\n baseDir: baseDir ? anchor(baseDir) : undefined,\n })\n return contentText({ handle })\n },\n )\n\n // delete\n server.tool(\n verbName(\"delete\"),\n description(\"delete\", \"Remove a manifest file from disk.\"),\n {\n path: z.string().describe(\"Path to the manifest to delete.\"),\n },\n async ({ path }) => {\n const target = anchor(path)\n await verbs.delete(target)\n return contentText({ deleted: target })\n },\n )\n}\n\n// ── extension loader ────────────────────────────────────────────────\n\nasync function loadExtensions(\n workspace: string,\n specs: readonly AnySpec[],\n): Promise<AnySpec[]> {\n const extDir = resolve(workspace, \"extensions\")\n if (!existsSync(extDir)) return []\n\n const out: AnySpec[] = []\n const { readdir } = await import(\"node:fs/promises\")\n type SimpleDirent = { name: string; isDirectory(): boolean }\n\n let entries: SimpleDirent[]\n try {\n entries = (await readdir(extDir, {\n withFileTypes: true,\n })) as unknown as SimpleDirent[]\n } catch {\n return out\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue\n const manifestPath = join(extDir, String(entry.name), \"EXTENSION.md\")\n if (!existsSync(manifestPath)) continue\n\n const source = await readFile(manifestPath, \"utf8\")\n const parsed = parseExtensionManifest(source)\n const ext = parsed.frontmatter\n\n let parent: AnySpec | undefined\n if (ext.extends && ext.extends !== \"none\") {\n const aipMatch = ext.extends.match(/^aip-(\\d+)$/)\n if (!aipMatch) {\n throw new Error(\n `mcp-server: extension '${ext.slug}' has invalid extends '${ext.extends}'`,\n )\n }\n const parentAip = Number(aipMatch[1])\n parent = specs.find((s) => s.aip === parentAip)\n if (!parent) {\n throw new Error(\n `mcp-server: extension '${ext.slug}' extends aip-${parentAip}, but no spec for that AIP was registered. Pass the parent spec in opts.specs.`,\n )\n }\n }\n\n out.push(specFromExtension(ext, { parent }) as AnySpec)\n }\n\n return out\n}\n\n// ── tool result helpers ─────────────────────────────────────────────\n\nfunction contentText(payload: unknown): {\n content: Array<{ type: \"text\"; text: string }>\n} {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(payload, null, 2),\n },\n ],\n }\n}\n","/**\n * `.agentproto/` config dir — runtime-managed state at the root of\n * every workspace. Mirrors the `.git/` model: user-content stays at\n * the workspace root (HEARTBEAT.md, conversations/, .agents/) while\n * everything the runtime owns lives in `<workspace>/.agentproto/`.\n *\n * What goes here today:\n * - `runtime.json` — boot-time snapshot of the live config (PID,\n * port, resolved workspace, MCP server name, startedAt). Useful\n * for `cat .agentproto/runtime.json` diagnostics + future tooling\n * that wants to discover a running gateway from disk.\n *\n * What does NOT go here:\n * - HEARTBEAT.md — user-edited content\n * - conversations/ — user-readable chat history\n * - .agents/ — user-authored manifests\n *\n * The `.agentproto/` dir is safe to gitignore. The `runtime.json`\n * file contains a per-boot bearer token used to gate mutating HTTP\n * routes (POST /sessions/*, WS /sessions/:id/pty). The token lives\n * in RAM + on disk only — never logged. File mode 0600 below; only\n * processes running as the workspace user (and the daemon itself)\n * can read it. A browser-loaded localhost page CAN'T read this file,\n * which is what defends against the localhost-DNS-rebinding drive-by\n * spawn vector.\n */\n\nimport { mkdir, readFile, stat, unlink, writeFile } from \"node:fs/promises\"\nimport { join } from \"node:path\"\n\nexport interface RuntimeMeta {\n /** Absolute path to the workspace root the gateway is bound to. */\n workspace: string\n /** HTTP listener port. */\n port: number\n /** HTTP bind address (loopback or `0.0.0.0`). */\n bind: string\n /** Process id of the running gateway. */\n pid: number\n /** Wall-clock ISO timestamp at boot. */\n startedAt: string\n /** MCP server name advertised in the initialize handshake. */\n name: string\n /** AIP doctype names + extensions registered as MCP CRUD tools. */\n registered: readonly string[]\n /**\n * Per-boot bearer token. Required on mutating routes (POST\n * /sessions/*, POST /sessions/:id/kill, DELETE /sessions/:id, and\n * WS upgrade to /sessions/:id/pty). Random uuid generated at boot\n * by createGateway; regenerated each restart.\n */\n token: string\n}\n\n/**\n * Create `<workspace>/.agentproto/` (idempotent) and write the\n * `runtime.json` snapshot. Errors are logged but non-fatal — losing\n * the meta file shouldn't crash the gateway, the runtime is still\n * fully functional without it.\n */\nexport async function writeRuntimeMeta(\n workspace: string,\n meta: RuntimeMeta,\n): Promise<void> {\n const dir = join(workspace, \".agentproto\")\n try {\n await mkdir(dir, { recursive: true })\n // mode 0600 so other local users can't read the bearer token.\n await writeFile(\n join(dir, \"runtime.json\"),\n JSON.stringify(meta, null, 2) + \"\\n\",\n { encoding: \"utf8\", mode: 0o600 },\n )\n } catch (err) {\n console.error(\"[runtime] failed to write .agentproto/runtime.json:\", err)\n }\n}\n\n/**\n * Delete `<workspace>/.agentproto/runtime.json`. Best-effort — called\n * from the daemon's graceful shutdown path so a CLI looking for the\n * live daemon doesn't pick up a stale token after this process exits.\n * Missing file is a no-op (the daemon may never have written one).\n */\nexport async function unlinkRuntimeMeta(workspace: string): Promise<void> {\n try {\n await unlink(join(workspace, \".agentproto\", \"runtime.json\"))\n } catch {\n // ENOENT / permission — not worth surfacing on shutdown.\n }\n}\n\n/**\n * Read a runtime.json from `<workspace>/.agentproto/`. Returns the\n * parsed object (no validation) plus the on-disk mtime, or null when\n * the file is missing / unreadable / malformed.\n */\nexport async function readRuntimeMeta(workspace: string): Promise<{\n meta: Partial<RuntimeMeta> & Record<string, unknown>\n mtime: Date\n} | null> {\n const path = join(workspace, \".agentproto\", \"runtime.json\")\n try {\n const [raw, st] = await Promise.all([readFile(path, \"utf8\"), stat(path)])\n const meta = JSON.parse(raw) as Record<string, unknown>\n return { meta, mtime: st.mtime }\n } catch {\n return null\n }\n}\n\n/**\n * For each `workspace` path, check whether its runtime.json points\n * at a now-dead PID; if so, delete it. Returns the list of paths\n * that were cleaned. Called by `agentproto serve` at boot to keep\n * the discovery layer's view of \"live daemons\" honest — a stale\n * file with the same port as the new daemon is the classic source\n * of `sessions_unauthorized` 401s.\n *\n * Skips the running daemon's own workspace (passed in as\n * `currentWorkspace`) since that file is OURS to write.\n */\nexport async function sweepStaleRuntimeMetas(\n workspaces: readonly string[],\n currentWorkspace: string,\n): Promise<string[]> {\n const cleaned: string[] = []\n for (const ws of workspaces) {\n if (ws === currentWorkspace) continue\n const meta = await readRuntimeMeta(ws)\n if (!meta) continue\n const pid = meta.meta.pid\n if (typeof pid === \"number\" && !isPidAlive(pid)) {\n try {\n await unlink(join(ws, \".agentproto\", \"runtime.json\"))\n cleaned.push(join(ws, \".agentproto\", \"runtime.json\"))\n } catch {\n // ignore — best-effort\n }\n }\n }\n return cleaned\n}\n\nfunction isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0)\n return true\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code\n if (code === \"EPERM\") return true // exists, foreign user\n return false\n }\n}\n","/**\n * Shell-execution MCP tools for the runtime.\n *\n * The runtime is a remote shell as far as cloud agents are concerned —\n * the workspace lives on the user's machine, so the only place a\n * `claude -p`, `gh pr view`, `pnpm test` etc. can actually run *is*\n * the user's machine. This module exposes one MCP tool,\n * `execute_command`, that any MCP client (cloud Guilde Blake,\n * Claude Code as a sub-agent, …) can call to spawn a subprocess.\n *\n * ## Allowlist\n *\n * Default-deny. The runtime reads\n * `<workspace>/.agentproto/allowed-commands.json` on every call (cheap\n * stat; cached for 1s) for the list of allowed command basenames.\n * Missing / empty file ⇒ no commands run. The error message points the\n * user at the file path so they know exactly where to opt in.\n *\n * Allowlist file shape:\n * { \"version\": 1, \"commands\": [\"claude\", \"gh\", \"pnpm\", \"node\"] }\n *\n * Match is by command BASENAME (`/usr/local/bin/claude` → `claude`)\n * to keep the allowlist short and not break when users have multiple\n * binaries on their PATH.\n *\n * ## Safety notes\n *\n * - We use `spawn()` with `shell: false` so arguments are passed\n * verbatim — no shell interpolation surprises.\n * - `cwd` is anchored to the workspace root via the same path-escape\n * guard used by `fs-tools.ts`. Callers can't run a subprocess in\n * `/etc` unless they also bind-mounted it inside the workspace.\n * - Every spawn has a `timeoutMs` cap (default 60s, max 600s). Hung\n * subprocesses can't pin the runtime forever.\n */\n\nimport { spawn } from \"node:child_process\"\nimport { existsSync } from \"node:fs\"\nimport { readFile, stat } from \"node:fs/promises\"\nimport {\n basename,\n isAbsolute,\n join,\n normalize,\n relative,\n resolve,\n} from \"node:path\"\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { z } from \"zod\"\n\nconst DEFAULT_TIMEOUT_MS = 60_000\nconst MAX_TIMEOUT_MS = 600_000\nconst ALLOWLIST_REL = \".agentproto/allowed-commands.json\"\n\nexport interface RegisterCommandToolsOptions {\n workspace: string\n}\n\ninterface AllowlistFile {\n version?: number\n commands?: string[]\n}\n\ninterface AllowlistCacheEntry {\n mtimeMs: number\n commands: Set<string>\n}\n\nlet allowlistCache: { path: string; entry: AllowlistCacheEntry } | null = null\n\nasync function loadAllowlist(workspace: string): Promise<Set<string>> {\n const path = resolve(workspace, ALLOWLIST_REL)\n if (!existsSync(path)) {\n allowlistCache = null\n return new Set()\n }\n try {\n const s = await stat(path)\n if (\n allowlistCache &&\n allowlistCache.path === path &&\n allowlistCache.entry.mtimeMs === s.mtimeMs\n ) {\n return allowlistCache.entry.commands\n }\n const raw = await readFile(path, \"utf8\")\n const parsed = JSON.parse(raw) as AllowlistFile\n const list = Array.isArray(parsed.commands) ? parsed.commands : []\n const commands = new Set(\n list\n .filter((x): x is string => typeof x === \"string\" && x.length > 0)\n .map(x => x.trim()),\n )\n allowlistCache = { path, entry: { mtimeMs: s.mtimeMs, commands } }\n return commands\n } catch (err) {\n // Bad JSON / unreadable file ⇒ deny all and surface in the error\n // the next caller gets. Don't poison the cache.\n console.error(\n `[runtime] failed to load ${ALLOWLIST_REL} (will deny all):`,\n err,\n )\n allowlistCache = null\n return new Set()\n }\n}\n\nfunction makeCwdAnchor(workspace: string): (input: string | undefined) => string {\n const root = resolve(workspace)\n return (input?: string) => {\n if (!input || input.length === 0) return root\n const candidate = isAbsolute(input)\n ? normalize(input)\n : normalize(join(root, input))\n const rel = relative(root, candidate)\n if (rel.startsWith(\"..\") || isAbsolute(rel)) {\n throw new Error(\n `cwd escapes the workspace: '${input}' (workspace=${root})`,\n )\n }\n return candidate\n }\n}\n\nexport interface ExecuteResult {\n exitCode: number\n signal: string | null\n stdout: string\n stderr: string\n truncated?: boolean\n durationMs: number\n}\n\n/**\n * Register `execute_command` on the given MCP server. The tool returns\n * a JSON-encoded `ExecuteResult` as a single text content item — that\n * matches the response shape `@modelcontextprotocol/server-filesystem`\n * uses for `read_file` and friends, so the existing\n * `parseReadFileResponse`-style parsers in workspace-providers can\n * decode it without bespoke logic.\n */\nexport function registerCommandTools(\n server: McpServer,\n opts: RegisterCommandToolsOptions,\n): void {\n const anchorCwd = makeCwdAnchor(opts.workspace)\n\n server.tool(\n \"execute_command\",\n \"Run a shell command on the host running the runtime. The command basename must be in `<workspace>/.agentproto/allowed-commands.json`; default-deny otherwise. Captures stdout / stderr / exit code and returns them as JSON. Use this to drive local CLIs (Claude Code, gh, pnpm, …) from a remote agent.\",\n {\n command: z\n .string()\n .min(1)\n .describe(\n \"Executable name or absolute path. Must be allowlisted by basename in the workspace's allowed-commands.json.\",\n ),\n args: z\n .array(z.string())\n .optional()\n .describe(\n \"Argv array. Passed verbatim — no shell expansion (we spawn with shell:false so quoting doesn't bite).\",\n ),\n cwd: z\n .string()\n .optional()\n .describe(\n \"Working directory, workspace-relative or an absolute path inside the workspace. Defaults to the workspace root.\",\n ),\n stdin: z\n .string()\n .optional()\n .describe(\"Optional input piped to the process's stdin.\"),\n timeoutMs: z\n .number()\n .int()\n .positive()\n .max(MAX_TIMEOUT_MS)\n .optional()\n .describe(\n `Hard kill after this many ms. Defaults to ${DEFAULT_TIMEOUT_MS}; capped at ${MAX_TIMEOUT_MS}.`,\n ),\n },\n async ({ command, args, cwd, stdin, timeoutMs }) => {\n const allowlist = await loadAllowlist(opts.workspace)\n const baseName = basename(command)\n if (!allowlist.has(baseName)) {\n const allowed = [...allowlist].sort().join(\", \") || \"(empty)\"\n throw new Error(\n `command '${baseName}' is not in the allowlist. ` +\n `Add it to ${join(opts.workspace, ALLOWLIST_REL)} ` +\n `under \"commands\": [...]. Currently allowed: ${allowed}.`,\n )\n }\n const resolvedCwd = anchorCwd(cwd)\n const limit = Math.min(timeoutMs ?? DEFAULT_TIMEOUT_MS, MAX_TIMEOUT_MS)\n const result = await runCommand({\n command,\n args: args ?? [],\n cwd: resolvedCwd,\n stdin,\n timeoutMs: limit,\n })\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(result) }],\n }\n },\n )\n}\n\ninterface RunCommandInput {\n command: string\n args: string[]\n cwd: string\n stdin?: string\n timeoutMs: number\n}\n\nconst STREAM_BUFFER_CAP = 1_048_576 // 1 MiB per stream\n\nasync function runCommand(input: RunCommandInput): Promise<ExecuteResult> {\n return new Promise<ExecuteResult>(resolvePromise => {\n const startedAt = Date.now()\n const child = spawn(input.command, input.args, {\n cwd: input.cwd,\n shell: false,\n // Inherit user env so PATH lookups for `claude`, `gh`, etc. work.\n env: process.env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n })\n\n let stdout = \"\"\n let stderr = \"\"\n let truncated = false\n let timedOut = false\n\n function appendCapped(buf: string, chunk: Buffer): string {\n if (buf.length >= STREAM_BUFFER_CAP) {\n truncated = true\n return buf\n }\n const room = STREAM_BUFFER_CAP - buf.length\n const text = chunk.toString(\"utf8\")\n if (text.length > room) {\n truncated = true\n return buf + text.slice(0, room)\n }\n return buf + text\n }\n child.stdout?.on(\"data\", d => {\n stdout = appendCapped(stdout, d)\n })\n child.stderr?.on(\"data\", d => {\n stderr = appendCapped(stderr, d)\n })\n\n if (input.stdin) {\n child.stdin?.write(input.stdin)\n }\n child.stdin?.end()\n\n const timer = setTimeout(() => {\n timedOut = true\n // SIGTERM first; the close handler resolves either way. Ignore\n // EPERM if the child is already gone.\n try {\n child.kill(\"SIGTERM\")\n } catch {\n /* noop */\n }\n // Hard kill 2s later if it hasn't exited.\n setTimeout(() => {\n try {\n child.kill(\"SIGKILL\")\n } catch {\n /* noop */\n }\n }, 2_000).unref()\n }, input.timeoutMs)\n timer.unref()\n\n child.on(\"error\", err => {\n clearTimeout(timer)\n // spawn errors (ENOENT, EACCES) become exitCode -1 with the\n // message in stderr — the JSON shape stays consistent.\n resolvePromise({\n exitCode: -1,\n signal: null,\n stdout,\n stderr: stderr + (stderr ? \"\\n\" : \"\") + (err as Error).message,\n truncated,\n durationMs: Date.now() - startedAt,\n })\n })\n child.on(\"close\", (code, signal) => {\n clearTimeout(timer)\n resolvePromise({\n exitCode: typeof code === \"number\" ? code : -1,\n signal: signal ?? (timedOut ? \"SIGTERM-timeout\" : null),\n stdout,\n stderr,\n truncated,\n durationMs: Date.now() - startedAt,\n })\n })\n })\n}\n","/**\n * Append-only conversation persistence as plain markdown.\n *\n * Each conversation is a file at `<workspace>/conversations/<id>.md`\n * with a frontmatter header (`schema: conversation/v1`, `id`, `agent`,\n * `started`, `status`) and a body composed of `## <role> — <iso>`\n * blocks. Append-only: turns are concatenated to the body, never\n * rewritten in place. Readers tolerant to clock skew use the timestamp\n * in each block, not file mtime.\n *\n * The format is intentionally trivial — git-diffable, human-editable,\n * survives `cat`. Designed to converge with the AIP runtime/v1 spec\n * (TBD) once it lands.\n */\n\nimport { existsSync } from \"node:fs\"\nimport { mkdir, readFile, readdir, writeFile } from \"node:fs/promises\"\nimport { join } from \"node:path\"\n\nconst FRONTMATTER_RE = /^---\\n([\\s\\S]*?)\\n---\\n/\n\nexport type ConvRole = \"user\" | \"assistant\" | \"system\"\n\nexport interface ConversationMeta {\n id: string\n agent: string\n started: string\n status: \"open\" | \"closed\"\n}\n\nexport interface ConversationTurn {\n role: ConvRole\n at: string\n /** Optional sub-attribution after the role (e.g. agent id). */\n attribution?: string\n content: string\n}\n\nexport interface ConversationStore {\n /**\n * Open a conversation. If the file doesn't exist, it's created with\n * a frontmatter header. If it exists, no-op (idempotent).\n */\n open(id: string, meta: { agent: string }): Promise<void>\n appendTurn(\n id: string,\n role: ConvRole,\n content: string,\n opts?: { attribution?: string; at?: string },\n ): Promise<void>\n read(\n id: string,\n ): Promise<{ meta: ConversationMeta; turns: ConversationTurn[] }>\n list(): Promise<Array<{ id: string; meta: ConversationMeta }>>\n /** Workspace-relative path to the conv file, for tooling. */\n pathFor(id: string): string\n}\n\nexport interface FileConversationStoreOptions {\n /** Absolute workspace root. */\n workspace: string\n /** Override `<workspace>/conversations`. */\n dir?: string\n}\n\nexport function fileConversationStore(\n opts: FileConversationStoreOptions,\n): ConversationStore {\n const dir = opts.dir ?? join(opts.workspace, \"conversations\")\n\n const filePath = (id: string) => join(dir, `${id}.md`)\n\n return {\n pathFor: filePath,\n\n async open(id, meta) {\n await mkdir(dir, { recursive: true })\n const path = filePath(id)\n if (existsSync(path)) return\n const header = renderHeader({\n id,\n agent: meta.agent,\n started: new Date().toISOString(),\n status: \"open\",\n })\n await writeFile(path, header, \"utf8\")\n },\n\n async appendTurn(id, role, content, options) {\n const path = filePath(id)\n // Lazy-open: if a caller appends without opening, create the\n // file so the operation never silently drops a turn.\n if (!existsSync(path)) {\n await this.open(id, { agent: options?.attribution ?? \"unknown\" })\n }\n const block = renderTurn({\n role,\n at: options?.at ?? new Date().toISOString(),\n attribution: options?.attribution,\n content,\n })\n // Append a leading blank line so the new block is always\n // separated from whatever's above (header or prev turn).\n await writeFile(path, block, { encoding: \"utf8\", flag: \"a\" })\n },\n\n async read(id) {\n const path = filePath(id)\n const source = await readFile(path, \"utf8\")\n return parseConversation(source, id)\n },\n\n async list() {\n if (!existsSync(dir)) return []\n const entries = await readdir(dir, { withFileTypes: true })\n const out: Array<{ id: string; meta: ConversationMeta }> = []\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith(\".md\")) continue\n const id = entry.name.slice(0, -3)\n try {\n const source = await readFile(join(dir, entry.name), \"utf8\")\n const { meta } = parseConversation(source, id)\n out.push({ id, meta })\n } catch {\n // Skip malformed conv files rather than crash list().\n }\n }\n return out\n },\n }\n}\n\n// ── render ───────────────────────────────────────────────────────────\n\nfunction renderHeader(meta: ConversationMeta): string {\n return [\n \"---\",\n `schema: conversation/v1`,\n `id: ${meta.id}`,\n `agent: ${meta.agent}`,\n `started: ${meta.started}`,\n `status: ${meta.status}`,\n \"---\",\n \"\",\n \"\",\n ].join(\"\\n\")\n}\n\nfunction renderTurn(turn: ConversationTurn): string {\n const heading = turn.attribution\n ? `## ${turn.role} — ${turn.at} (${turn.attribution})`\n : `## ${turn.role} — ${turn.at}`\n return `${heading}\\n\\n${turn.content.trimEnd()}\\n\\n`\n}\n\n// ── parse ────────────────────────────────────────────────────────────\n\ninterface ParsedConversation {\n meta: ConversationMeta\n turns: ConversationTurn[]\n}\n\nfunction parseConversation(source: string, fallbackId: string): ParsedConversation {\n const match = source.match(FRONTMATTER_RE)\n let meta: ConversationMeta = {\n id: fallbackId,\n agent: \"unknown\",\n started: \"\",\n status: \"open\",\n }\n let body = source\n if (match) {\n meta = parseFrontmatter(match[1] ?? \"\", fallbackId)\n body = source.slice(match[0].length)\n }\n\n const turns: ConversationTurn[] = []\n // Split on `## <role> — <iso>` headings. Conservative — anything\n // that doesn't match is treated as continuation of the prior turn.\n const lines = body.split(\"\\n\")\n let current: ConversationTurn | null = null\n let buffer: string[] = []\n\n const flush = () => {\n if (!current) return\n current.content = buffer.join(\"\\n\").trim()\n turns.push(current)\n current = null\n buffer = []\n }\n\n const headingRe =\n /^##\\s+(user|assistant|system)\\s+—\\s+(\\S+)(?:\\s+\\(([^)]+)\\))?\\s*$/\n\n for (const line of lines) {\n const m = line.match(headingRe)\n if (m) {\n flush()\n current = {\n role: m[1] as ConvRole,\n at: m[2] ?? \"\",\n attribution: m[3],\n content: \"\",\n }\n continue\n }\n if (current) buffer.push(line)\n }\n flush()\n\n return { meta, turns }\n}\n\nfunction parseFrontmatter(\n raw: string,\n fallbackId: string,\n): ConversationMeta {\n const out: Record<string, string> = {}\n for (const line of raw.split(\"\\n\")) {\n const colon = line.indexOf(\":\")\n if (colon < 1) continue\n const key = line.slice(0, colon).trim()\n const value = line.slice(colon + 1).trim()\n out[key] = value\n }\n return {\n id: out.id ?? fallbackId,\n agent: out.agent ?? \"unknown\",\n started: out.started ?? \"\",\n status: (out.status === \"closed\" ? \"closed\" : \"open\"),\n }\n}\n","/**\n * In-process event bus for the runtime gateway. Anything the daemon\n * does that an external observer might want to watch (heartbeat fired,\n * conversation turn appended, boot completed, …) flows through here.\n *\n * The HTTP server's `/events` SSE stream subscribes to it and forwards\n * each event as a `data: <json>\\n\\n` frame. Tests and embedded usage\n * subscribe directly via `events.on()`.\n */\n\nimport { EventEmitter } from \"node:events\"\n\nexport interface BootEvent {\n type: \"boot\"\n at: string\n workspace: string\n registered: readonly string[]\n}\n\nexport interface HeartbeatFiredEvent {\n type: \"heartbeat-fired\"\n at: string\n agent: string\n conversationId: string\n prompt: string\n reply: string\n durationMs: number\n}\n\nexport interface HeartbeatErrorEvent {\n type: \"heartbeat-error\"\n at: string\n agent?: string\n error: string\n}\n\nexport interface ConvTurnEvent {\n type: \"conv-turn-appended\"\n at: string\n conversationId: string\n role: \"user\" | \"assistant\"\n contentPreview: string\n}\n\n/**\n * One log line from a supervised tunnel provider (cloudflared today).\n * Surfaced verbatim so users can debug \"why didn't my remote URL come\n * up\" by tailing /events.\n */\nexport interface RemoteLogEvent {\n type: \"remote-log\"\n at: string\n line: string\n}\n\nexport type RuntimeEvent =\n | BootEvent\n | HeartbeatFiredEvent\n | HeartbeatErrorEvent\n | ConvTurnEvent\n | RemoteLogEvent\n\nexport interface RuntimeEvents {\n on<E extends RuntimeEvent[\"type\"]>(\n type: E,\n handler: (ev: Extract<RuntimeEvent, { type: E }>) => void,\n ): () => void\n onAny(handler: (ev: RuntimeEvent) => void): () => void\n emit(ev: RuntimeEvent): void\n}\n\nexport function createRuntimeEvents(): RuntimeEvents {\n const ee = new EventEmitter()\n ee.setMaxListeners(50)\n\n return {\n on(type, handler) {\n const wrapped = (ev: RuntimeEvent) => {\n if (ev.type === type) handler(ev as Extract<RuntimeEvent, { type: typeof type }>)\n }\n ee.on(\"event\", wrapped)\n return () => ee.off(\"event\", wrapped)\n },\n onAny(handler) {\n ee.on(\"event\", handler)\n return () => ee.off(\"event\", handler)\n },\n emit(ev) {\n ee.emit(\"event\", ev)\n },\n }\n}\n","/**\n * Filesystem MCP tools registered on the runtime's MCP server.\n *\n * The runtime already exposes AIP CRUD verbs (create_tool, load_agent, …)\n * via @agentproto/mcp-server. To make the workspace genuinely reachable\n * to remote MCP clients (Guilde cloud agents through a tunnel, IDEs,\n * etc.), we also register canonical filesystem tools that match the\n * shape used by `@modelcontextprotocol/server-filesystem` so existing\n * MCP-fs proxy clients can target the runtime without bespoke logic:\n *\n * read_file ({ path }) → string\n * write_file ({ path, content }) → \"ok\"\n * list_directory ({ path? }) → \"[FILE] x\\n[DIR] y\" lines\n * get_file_info ({ path }) → { name, type, size, modified }\n * create_directory ({ path }) → \"ok\"\n * delete_file ({ path }) → \"ok\"\n *\n * All paths are resolved relative to the workspace root via the same\n * escape guard used by `WorkspaceFs`. Absolute paths inside the root\n * are accepted (so callers that prefix `basePath` with the absolute\n * workspace path keep working).\n */\n\nimport {\n mkdir,\n readFile,\n readdir,\n rm,\n stat,\n writeFile,\n} from \"node:fs/promises\"\nimport { dirname, isAbsolute, join, normalize, relative, resolve } from \"node:path\"\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { z } from \"zod\"\n\nexport interface RegisterFsToolsOptions {\n workspace: string\n}\n\nclass FsPathError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"FsPathError\"\n }\n}\n\nfunction makeAnchor(workspace: string): (input: string) => string {\n const root = resolve(workspace)\n return (input: string) => {\n if (typeof input !== \"string\" || input.length === 0) {\n throw new FsPathError(\"path must be a non-empty string\")\n }\n const candidate = isAbsolute(input)\n ? normalize(input)\n : normalize(join(root, input))\n const rel = relative(root, candidate)\n if (rel.startsWith(\"..\") || isAbsolute(rel)) {\n throw new FsPathError(`path escapes the workspace: '${input}'`)\n }\n return candidate\n }\n}\n\nfunction text(value: string | object): {\n content: Array<{ type: \"text\"; text: string }>\n} {\n return {\n content: [\n {\n type: \"text\",\n text: typeof value === \"string\" ? value : JSON.stringify(value),\n },\n ],\n }\n}\n\nexport function registerFsTools(\n server: McpServer,\n opts: RegisterFsToolsOptions,\n): void {\n const anchor = makeAnchor(opts.workspace)\n\n server.tool(\n \"read_file\",\n \"Read a UTF-8 file from the workspace.\",\n { path: z.string().describe(\"Workspace-relative path to the file.\") },\n async ({ path }) => {\n const abs = anchor(path)\n const buf = await readFile(abs)\n return text(buf.toString(\"utf8\"))\n },\n )\n\n server.tool(\n \"write_file\",\n \"Write a file to the workspace. Parent directories are created on demand.\",\n {\n path: z.string().describe(\"Workspace-relative path to the file.\"),\n content: z.string().describe(\"File body (UTF-8).\"),\n },\n async ({ path, content }) => {\n const abs = anchor(path)\n await mkdir(dirname(abs), { recursive: true })\n await writeFile(abs, content, \"utf8\")\n return text(\"ok\")\n },\n )\n\n server.tool(\n \"list_directory\",\n \"List entries of a directory in the workspace. Returns one '[FILE]' or '[DIR]' line per entry, mirroring `@modelcontextprotocol/server-filesystem`.\",\n {\n path: z\n .string()\n .optional()\n .describe(\"Workspace-relative directory (defaults to workspace root).\"),\n },\n async ({ path }) => {\n const abs = anchor(path && path.length > 0 ? path : \".\")\n const entries = await readdir(abs, { withFileTypes: true })\n const lines = entries.map(e =>\n e.isDirectory() ? `[DIR] ${e.name}` : `[FILE] ${e.name}`,\n )\n return text(lines.join(\"\\n\"))\n },\n )\n\n server.tool(\n \"get_file_info\",\n \"Stat a file or directory in the workspace.\",\n { path: z.string().describe(\"Workspace-relative path.\") },\n async ({ path }) => {\n const abs = anchor(path)\n const info = await stat(abs)\n return text({\n name: abs.split(\"/\").pop() ?? path,\n path,\n type: info.isDirectory() ? \"directory\" : \"file\",\n size: info.size,\n modified: info.mtime.toISOString(),\n created: info.birthtime.toISOString(),\n })\n },\n )\n\n server.tool(\n \"create_directory\",\n \"Create a directory (recursive) in the workspace.\",\n { path: z.string().describe(\"Workspace-relative directory path.\") },\n async ({ path }) => {\n const abs = anchor(path)\n await mkdir(abs, { recursive: true })\n return text(\"ok\")\n },\n )\n\n server.tool(\n \"delete_file\",\n \"Delete a file or empty directory in the workspace.\",\n { path: z.string().describe(\"Workspace-relative path.\") },\n async ({ path }) => {\n const abs = anchor(path)\n await rm(abs, { recursive: true, force: true })\n return text(\"ok\")\n },\n )\n}\n","/**\n * Discover MCP servers already configured in the user's local agent\n * tooling — claude-code, cursor, goose, etc. — so the daemon can\n * surface them in the UI without making the user re-enter the same\n * credentials and URLs they already painstakingly configured for\n * one host.\n *\n * v1 is read-only discovery: we report what's there with source\n * attribution. Future v1.1 ships an \"import to daemon\" verb that\n * proxies the discovered server through the daemon's own /mcp\n * endpoint so every operator (cloud Guilde, local agents) sees a\n * unified set without per-host config drift.\n *\n * Sources scanned (in priority order):\n * - ~/.claude.json (claude-code) — `mcpServers` top-level + nested\n * under `projects[<path>].mcpServers`. Most users land here.\n * - ~/.cursor/mcp.json (cursor) — flat `mcpServers` map.\n * - ~/.config/goose/config.yaml (goose) — TOML/YAML hybrid; we\n * only handle the YAML form for now.\n * - any `.mcp.json` under the user's home that follows the\n * standard mcpServers shape.\n *\n * Each source contributes 0..N entries. Errors are caught + logged\n * (broken JSON, missing files, permission denied) — partial\n * discovery beats failing the whole listing on one bad file.\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { resolve as resolvePath } from \"node:path\"\nimport {\n loadWorkspacesConfig,\n type WorkspaceEntry,\n} from \"./workspaces-config.js\"\n\nexport interface DiscoveredMcp {\n /** Stable id within (source, scope, name) — for de-dupe and\n * cross-call identity (UI treat as React key). */\n id: string\n /** Where we found it. Lets the UI render a source badge. */\n source: \"claude-code\" | \"cursor\" | \"goose\" | \"workspace\"\n /** \"global\" when the entry sits at the top level of the host's\n * config; \"project:<path>\" when it's scoped to a single\n * workspace. claude-code in particular nests per-project. */\n scope: string\n /** The host's name for the entry (key in the mcpServers map). */\n name: string\n /** Wire transport — `stdio` (command + args) or `http` / `sse` (url). */\n type: \"stdio\" | \"http\" | \"sse\" | \"unknown\"\n /** stdio entries: argv to spawn. */\n command?: string\n args?: string[]\n /** stdio entries: env injected into the child. */\n env?: Record<string, string>\n /** http/sse entries: target URL. */\n url?: string\n /** http/sse entries: extra headers (Authorization, etc.). */\n headers?: Record<string, string>\n /** Free-form tags from the source config — claude-code's project\n * scope is the most common. */\n tags?: string[]\n /** Reason field when `type === \"unknown\"` — surfaces why the\n * parser couldn't classify the entry (e.g. neither command nor\n * url present). */\n parseNote?: string\n}\n\nexport interface DiscoverMcpsOptions {\n /** Override the home dir — handy for tests that pin a tmpdir. */\n home?: string\n}\n\nexport async function discoverMcps(\n opts: DiscoverMcpsOptions = {}\n): Promise<DiscoveredMcp[]> {\n const home = opts.home ?? homedir()\n const out: DiscoveredMcp[] = []\n const errors: string[] = []\n await Promise.all([\n scanClaudeCode(home, out, errors),\n scanCursor(home, out, errors),\n scanGoose(home, out, errors),\n scanRegisteredWorkspaces(out, errors),\n ])\n // De-dupe identical entries that show up in multiple scopes\n // (e.g. user copied a project entry to global) — keep the first\n // occurrence so the source attribution stays meaningful.\n const seen = new Set<string>()\n const dedup: DiscoveredMcp[] = []\n for (const m of out) {\n const key = `${m.source}:${m.scope}:${m.name}`\n if (seen.has(key)) continue\n seen.add(key)\n dedup.push(m)\n }\n if (errors.length > 0) {\n // One log line per error — operators can trace which file\n // failed without us bubbling the whole stack into the response.\n for (const e of errors) console.warn(`[mcp-discovery] ${e}`)\n }\n return dedup.sort((a, b) => {\n if (a.source !== b.source) return a.source.localeCompare(b.source)\n if (a.scope !== b.scope) return a.scope.localeCompare(b.scope)\n return a.name.localeCompare(b.name)\n })\n}\n\ninterface RawMcpEntry {\n type?: string\n command?: string\n args?: string[]\n env?: Record<string, string>\n url?: string\n headers?: Record<string, string>\n}\n\n/** claude-code stores entries either at top-level `mcpServers` OR\n * per-project under `projects[<absolute-path>].mcpServers`. We\n * surface both with `scope` set so the UI can group by project. */\nasync function scanClaudeCode(\n home: string,\n out: DiscoveredMcp[],\n errors: string[]\n): Promise<void> {\n const path = resolvePath(home, \".claude.json\")\n let raw: string\n try {\n raw = await fs.readFile(path, \"utf8\")\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return\n errors.push(`claude-code: read ${path} — ${(err as Error).message}`)\n return\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (err) {\n errors.push(`claude-code: JSON parse ${path} — ${(err as Error).message}`)\n return\n }\n if (!parsed || typeof parsed !== \"object\") return\n const root = parsed as Record<string, unknown>\n const top = root.mcpServers\n if (top && typeof top === \"object\") {\n pushMcpMap({\n out,\n source: \"claude-code\",\n scope: \"global\",\n map: top as Record<string, unknown>,\n })\n }\n const projects = root.projects\n if (projects && typeof projects === \"object\") {\n for (const [projPath, proj] of Object.entries(\n projects as Record<string, unknown>\n )) {\n if (!proj || typeof proj !== \"object\") continue\n const projMcps = (proj as Record<string, unknown>).mcpServers\n if (!projMcps || typeof projMcps !== \"object\") continue\n pushMcpMap({\n out,\n source: \"claude-code\",\n scope: `project:${projPath}`,\n map: projMcps as Record<string, unknown>,\n })\n }\n }\n}\n\n/** cursor uses ~/.cursor/mcp.json (standard mcpServers shape).\n * Also supports per-workspace `.cursor/mcp.json` but those need\n * the user's project paths — out of scope for v1. */\nasync function scanCursor(\n home: string,\n out: DiscoveredMcp[],\n errors: string[]\n): Promise<void> {\n const path = resolvePath(home, \".cursor\", \"mcp.json\")\n let raw: string\n try {\n raw = await fs.readFile(path, \"utf8\")\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return\n errors.push(`cursor: read ${path} — ${(err as Error).message}`)\n return\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (err) {\n errors.push(`cursor: JSON parse ${path} — ${(err as Error).message}`)\n return\n }\n if (!parsed || typeof parsed !== \"object\") return\n const root = parsed as Record<string, unknown>\n const map = root.mcpServers\n if (map && typeof map === \"object\") {\n pushMcpMap({\n out,\n source: \"cursor\",\n scope: \"global\",\n map: map as Record<string, unknown>,\n })\n }\n}\n\n/** goose stores config in ~/.config/goose/config.yaml. The full\n * parser is non-trivial (yaml + extension manifests); v1 looks for\n * the simple `extensions:` block with `mcp_servers` declarations\n * and emits a parseNote so the user knows we found goose but\n * punted on the details. */\nasync function scanGoose(\n home: string,\n out: DiscoveredMcp[],\n errors: string[]\n): Promise<void> {\n // ~/.config on macOS / Linux; goose hasn't shipped Windows-native yet.\n const path = resolvePath(home, \".config\", \"goose\", \"config.yaml\")\n try {\n await fs.access(path)\n } catch {\n return\n }\n // We don't ship a yaml parser as a runtime dep — record presence\n // but punt on parsing. The user sees \"goose detected — open\n // ~/.config/goose/config.yaml to inspect entries\" which is enough\n // signal to drive a v2 enhancement.\n out.push({\n id: \"goose:global:_detected\",\n source: \"goose\",\n scope: \"global\",\n name: \"(goose config detected)\",\n type: \"unknown\",\n parseNote:\n \"Goose config found but YAML parsing is not yet implemented. \" +\n \"Open ~/.config/goose/config.yaml to inspect MCP entries.\",\n })\n}\n\n/**\n * Per-workspace scan — for each registered workspace, look at the\n * common per-project MCP locations (.mcp.json, .cursor/mcp.json,\n * .vscode/mcp.json). Lets the UI surface \"this workspace ships\n * its own chrome-devtools MCP\" instead of only\n * showing what the user configured globally in claude/cursor.\n */\nasync function scanRegisteredWorkspaces(\n out: DiscoveredMcp[],\n errors: string[]\n): Promise<void> {\n let workspaces: WorkspaceEntry[] = []\n try {\n const cfg = await loadWorkspacesConfig()\n workspaces = cfg.workspaces\n } catch (err) {\n errors.push(`workspaces: load failed — ${(err as Error).message}`)\n return\n }\n // Walk each workspace + each candidate path. We don't recurse —\n // these are conventional top-level files. Errors per-file are\n // collected; one bad file doesn't fail the rest.\n await Promise.all(\n workspaces.map(async ws => {\n const candidates = [\n resolvePath(ws.path, \".mcp.json\"),\n resolvePath(ws.path, \".cursor\", \"mcp.json\"),\n resolvePath(ws.path, \".vscode\", \"mcp.json\"),\n ]\n for (const path of candidates) {\n let raw: string\n try {\n raw = await fs.readFile(path, \"utf8\")\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") continue\n errors.push(\n `workspace ${ws.slug}: read ${path} — ${(err as Error).message}`\n )\n continue\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (err) {\n errors.push(\n `workspace ${ws.slug}: JSON parse ${path} — ${(err as Error).message}`\n )\n continue\n }\n if (!parsed || typeof parsed !== \"object\") continue\n const map = (parsed as Record<string, unknown>).mcpServers\n if (!map || typeof map !== \"object\") continue\n pushMcpMap({\n out,\n source: \"workspace\",\n scope: `workspace:${ws.slug}`,\n map: map as Record<string, unknown>,\n })\n }\n })\n )\n}\n\nfunction pushMcpMap(args: {\n out: DiscoveredMcp[]\n source: DiscoveredMcp[\"source\"]\n scope: string\n map: Record<string, unknown>\n}): void {\n for (const [name, raw] of Object.entries(args.map)) {\n if (!raw || typeof raw !== \"object\") continue\n const entry = raw as RawMcpEntry\n const id = `${args.source}:${args.scope}:${name}`\n const declared = typeof entry.type === \"string\" ? entry.type : null\n const url = typeof entry.url === \"string\" ? entry.url : undefined\n const command = typeof entry.command === \"string\" ? entry.command : undefined\n let type: DiscoveredMcp[\"type\"]\n if (declared === \"http\" || declared === \"sse\" || declared === \"stdio\") {\n type = declared\n } else if (url) {\n type = \"http\"\n } else if (command) {\n type = \"stdio\"\n } else {\n type = \"unknown\"\n }\n const m: DiscoveredMcp = {\n id,\n source: args.source,\n scope: args.scope,\n name,\n type,\n }\n if (command !== undefined) m.command = command\n if (Array.isArray(entry.args)) {\n m.args = entry.args.filter((a): a is string => typeof a === \"string\")\n }\n if (entry.env && typeof entry.env === \"object\") {\n m.env = stringifyValues(entry.env)\n }\n if (url !== undefined) m.url = url\n if (entry.headers && typeof entry.headers === \"object\") {\n m.headers = stringifyValues(entry.headers)\n }\n if (type === \"unknown\") {\n m.parseNote =\n \"Entry has neither `command` nor `url` — couldn't classify transport.\"\n }\n args.out.push(m)\n }\n}\n\nfunction stringifyValues(\n raw: Record<string, unknown>\n): Record<string, string> {\n const out: Record<string, string> = {}\n for (const [k, v] of Object.entries(raw)) {\n if (typeof v === \"string\") out[k] = v\n else if (v != null) out[k] = String(v)\n }\n return out\n}\n","/**\n * `~/.agentproto/imported-mcps.json` — the user's curated set of\n * discovered MCPs they want the daemon to know about. v1 is just\n * persistence + read-side; the actual MCP-proxy implementation\n * (where the daemon's /mcp endpoint aggregates the imported\n * servers' tools under namespace prefixes) is v2 work.\n *\n * Purpose: today, \"I see you have chrome-devtools in claude\" is\n * read-only. Once a user imports it, the operator agent can refer\n * to it (\"the user said it's enabled — call it\") and a future\n * proxy layer can actually expose it. We persist the choice now so\n * the data is in place when the proxy lands.\n *\n * File shape:\n * {\n * \"version\": 1,\n * \"imports\": [\n * {\n * \"id\": \"claude-code:project:/path:chrome-devtools\",\n * \"alias\": \"chrome-devtools\",\n * \"addedAt\": \"2026-05-10T...\",\n * \"snapshot\": { ...the DiscoveredMcp at import time }\n * }\n * ]\n * }\n *\n * Snapshotting at import time keeps the daemon resilient to the\n * source config getting deleted (user runs `claude mcp remove ...`).\n * The imported entry stays usable; only the next discovery pass\n * stops listing it as \"available to import.\"\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { dirname, resolve as resolvePath } from \"node:path\"\nimport type { DiscoveredMcp } from \"./mcp-discovery.js\"\n\nexport const IMPORTED_MCPS_PATH = (): string =>\n resolvePath(homedir(), \".agentproto\", \"imported-mcps.json\")\n\nexport const IMPORTED_MCPS_VERSION = 1 as const\n\nexport interface ImportedMcpEntry {\n id: string\n alias: string\n addedAt: string\n snapshot: DiscoveredMcp\n}\n\nexport interface ImportedMcpsConfig {\n version: typeof IMPORTED_MCPS_VERSION\n imports: ImportedMcpEntry[]\n}\n\nconst EMPTY: ImportedMcpsConfig = {\n version: IMPORTED_MCPS_VERSION,\n imports: [],\n}\n\nexport async function loadImportedMcps(\n path: string = IMPORTED_MCPS_PATH()\n): Promise<ImportedMcpsConfig> {\n let raw: string\n try {\n raw = await fs.readFile(path, \"utf8\")\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return EMPTY\n throw err\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (err) {\n throw new Error(\n `agentproto: ${path} is not valid JSON (${\n err instanceof Error ? err.message : String(err)\n }). Delete or fix manually.`\n )\n }\n return normalize(parsed)\n}\n\nexport async function saveImportedMcps(\n config: ImportedMcpsConfig,\n path: string = IMPORTED_MCPS_PATH()\n): Promise<void> {\n await fs.mkdir(dirname(path), { recursive: true })\n const tmp = `${path}.tmp.${process.pid}`\n await fs.writeFile(tmp, JSON.stringify(config, null, 2) + \"\\n\", \"utf8\")\n await fs.rename(tmp, path)\n}\n\n/**\n * Add (or replace) an import. Snapshots the discovered MCP at\n * import time so the entry stays usable when the source config\n * disappears.\n */\nexport function addImport(\n config: ImportedMcpsConfig,\n input: { snapshot: DiscoveredMcp; alias?: string }\n): ImportedMcpsConfig {\n const alias = (input.alias ?? input.snapshot.name).trim()\n if (!alias) {\n throw new Error(\"addImport: alias resolves to empty string\")\n }\n const addedAt = new Date().toISOString()\n const next: ImportedMcpEntry = {\n id: input.snapshot.id,\n alias,\n addedAt,\n snapshot: input.snapshot,\n }\n const others = config.imports.filter(e => e.id !== input.snapshot.id)\n return { ...config, imports: [...others, next] }\n}\n\nexport function removeImport(\n config: ImportedMcpsConfig,\n id: string\n): ImportedMcpsConfig {\n return { ...config, imports: config.imports.filter(e => e.id !== id) }\n}\n\nexport function findImport(\n config: ImportedMcpsConfig,\n id: string\n): ImportedMcpEntry | undefined {\n return config.imports.find(e => e.id === id)\n}\n\nfunction normalize(parsed: unknown): ImportedMcpsConfig {\n if (!parsed || typeof parsed !== \"object\") return EMPTY\n const obj = parsed as Record<string, unknown>\n const imports: ImportedMcpEntry[] = []\n if (Array.isArray(obj.imports)) {\n for (const entry of obj.imports) {\n if (!entry || typeof entry !== \"object\") continue\n const e = entry as Record<string, unknown>\n const id = typeof e.id === \"string\" ? e.id : \"\"\n const alias = typeof e.alias === \"string\" ? e.alias : id\n const addedAt =\n typeof e.addedAt === \"string\" ? e.addedAt : new Date().toISOString()\n const snapshot = e.snapshot as DiscoveredMcp | undefined\n if (!id || !snapshot) continue\n imports.push({ id, alias, addedAt, snapshot })\n }\n }\n return { version: IMPORTED_MCPS_VERSION, imports }\n}\n","/**\n * MCP tools that expose the sessions registry to agents connected to\n * the daemon. Lets a remote operator (Mastra agent in cloud Guilde,\n * Claude Code as a sub-agent, …) spawn + drive agent CLIs on the\n * user's machine through the same MCP connection they already use\n * for fs/exec.\n *\n * Five tools:\n * start_agent_session spawn a long-running agent (claude / hermes / …)\n * prompt_agent_session send a follow-up turn to a live session\n * list_agent_sessions browse alive + recent sessions\n * get_agent_session_output tail the ring buffer\n * kill_agent_session SIGTERM the session\n *\n * Auth: same as every other daemon tool — gated by the gateway's\n * auth source (loopback bypass when no tunnel is up).\n */\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { z } from \"zod\"\nimport type { SessionsRegistry } from \"./sessions.js\"\nimport type {\n AgentAdapterResolver,\n AgentAdapterLister,\n} from \"./http-server.js\"\nimport {\n loadWorkspacesConfig,\n findWorkspace,\n getActiveWorkspace,\n} from \"./workspaces-config.js\"\nimport { discoverMcps } from \"./mcp-discovery.js\"\nimport {\n loadImportedMcps,\n saveImportedMcps,\n addImport,\n removeImport,\n} from \"./mcp-imports.js\"\nimport type { McpProxyRegistry } from \"./mcp-proxy.js\"\n\ninterface RegisterSessionToolsOptions {\n registry: SessionsRegistry\n /** Optional adapter resolver — required for `start_agent_session`\n * (the others work with raw spawn sessions too). When unset the\n * start tool returns a clear error pointing at the host wiring. */\n resolveAgentAdapter?: AgentAdapterResolver\n /** Optional adapter lister — when wired, exposes `list_adapters`\n * MCP tool. Without it the tool returns a clear \"not configured\"\n * error pointing at the host wiring. */\n listAgentAdapters?: AgentAdapterLister\n /** Optional MCP proxy registry — when wired, exposes 3 tools that\n * let the operator drive imported MCPs (chrome-devtools, goose-bridge,\n * …) through the daemon as a single MCP entry point. */\n mcpProxy?: McpProxyRegistry\n /** Whether the registry was constructed with a PTY factory — when\n * true, expose the four terminal session tools. When false, the\n * tools return a clear \"not configured\" error. */\n ptyEnabled?: boolean\n}\n\nexport function registerSessionTools(\n server: McpServer,\n opts: RegisterSessionToolsOptions\n): void {\n const { registry, resolveAgentAdapter, listAgentAdapters, mcpProxy } = opts\n const ptyEnabled = opts.ptyEnabled === true\n\n // ── start_agent_session ────────────────────────────────────────\n server.tool(\n \"start_agent_session\",\n \"Spawn a long-running agent CLI (claude-code, hermes, …) on the host. \" +\n \"The session stays alive across multiple turns — call `prompt_agent_session` \" +\n \"to continue the conversation. Returns the session id + initial descriptor. \" +\n \"When `workspaceSlug` is set, resolves the cwd via \" +\n \"`~/.agentproto/workspaces.json`; otherwise pass `cwd` explicitly or \" +\n \"fall back to the active workspace.\",\n {\n adapter: z\n .string()\n .min(1)\n .describe(\n \"Adapter slug — one of the installed `@agentproto/adapter-*` packages \" +\n \"(e.g. 'claude-code', 'hermes', 'aider').\"\n ),\n workspaceSlug: z\n .string()\n .optional()\n .describe(\n \"Workspace slug from `agentproto workspace list`. The daemon resolves it \" +\n \"to an absolute path. Omit to use the `cwd` field or the active workspace.\"\n ),\n cwd: z\n .string()\n .optional()\n .describe(\n \"Absolute path to spawn the agent in. Wins over `workspaceSlug` when both are set.\"\n ),\n prompt: z\n .string()\n .optional()\n .describe(\n \"Optional initial prompt. The session is spawned and the prompt dispatched \" +\n \"in one shot — equivalent to `start` then `prompt` back-to-back. Skip to spawn idle.\"\n ),\n label: z\n .string()\n .optional()\n .describe(\n \"Free-text label that surfaces in `list_agent_sessions` and the UI — useful \" +\n \"for tagging sessions with a conversation id or operator name.\"\n ),\n },\n async input => {\n if (!resolveAgentAdapter) {\n return {\n content: [\n {\n type: \"text\",\n text:\n \"start_agent_session is not enabled — the daemon was started without \" +\n \"an adapter resolver. Re-run the daemon with the `@agentproto/cli` \" +\n \"shim wired (see playground/scripts/gateway.ts).\",\n },\n ],\n isError: true,\n }\n }\n // cwd resolution mirrors the HTTP route: explicit cwd wins,\n // then workspaceSlug lookup, then active workspace, then a\n // hard error (the operator probably forgot a step).\n let cwd = input.cwd\n let resolvedSlug = input.workspaceSlug ?? \"default\"\n if (!cwd) {\n try {\n const config = await loadWorkspacesConfig()\n const ws = input.workspaceSlug\n ? findWorkspace(config, input.workspaceSlug)\n : getActiveWorkspace(config)\n if (ws) {\n cwd = ws.path\n resolvedSlug = ws.slug\n }\n } catch {\n // fall through to error below\n }\n }\n if (!cwd) {\n return {\n content: [\n {\n type: \"text\",\n text:\n \"start_agent_session: no cwd resolvable. Pass `cwd` explicitly, \" +\n \"or pass `workspaceSlug` matching `agentproto workspace list`, \" +\n \"or set an active workspace via `agentproto workspace use <slug>`.\",\n },\n ],\n isError: true,\n }\n }\n const resolved = await resolveAgentAdapter(input.adapter)\n if (!resolved) {\n return {\n content: [\n {\n type: \"text\",\n text: `start_agent_session: adapter \"${input.adapter}\" not found. Try \\`agentproto install <slug>\\` first.`,\n },\n ],\n isError: true,\n }\n }\n try {\n const agentSession = await resolved.startSession({ cwd })\n const desc = registry.spawnAgent({\n workspaceSlug: resolvedSlug,\n cwd,\n agentSession,\n adapterSlug: input.adapter,\n ...(input.prompt ? { initialPrompt: input.prompt } : {}),\n ...(input.label ? { label: input.label } : {}),\n ...(resolved.commandPreview\n ? { commandPreview: resolved.commandPreview }\n : {}),\n })\n return {\n content: [{ type: \"text\", text: JSON.stringify(desc, null, 2) }],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `start_agent_session: spawn failed — ${\n err instanceof Error ? err.message : String(err)\n }`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── prompt_agent_session ───────────────────────────────────────\n server.tool(\n \"prompt_agent_session\",\n \"Send a follow-up prompt to a live agent session — multi-turn continuity \" +\n \"without re-spawning. The session id comes from `start_agent_session` \" +\n \"(or `list_agent_sessions`). Returns immediately; tail output via \" +\n \"`get_agent_session_output` or the SSE /sessions/:id/stream endpoint.\",\n {\n sessionId: z.string().describe(\"Session id returned by start_agent_session.\"),\n prompt: z.string().min(1).describe(\"The next user turn (plain text).\"),\n },\n async input => {\n try {\n // Note: sendPrompt awaits the full turn (drains the event\n // stream into the ring buffer). For long turns the operator\n // would prefer fire-and-forget — kick the promise without\n // awaiting and report \"queued\". The caller polls\n // get_agent_session_output for completion.\n void registry.sendPrompt(input.sessionId, input.prompt).catch(() => {\n // Errors land in the ring buffer; nothing to do here.\n })\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n { ok: true, sessionId: input.sessionId, queued: true },\n null,\n 2\n ),\n },\n ],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `prompt_agent_session: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── list_sessions (canonical lister) ──────────────────────────\n server.tool(\n \"list_sessions\",\n \"List sessions tracked by the daemon — agent-CLI sessions (claude-code, \" +\n \"hermes, …), terminal/PTY sessions (claude TUI, bash, …), and raw \" +\n \"commands. Each entry includes `kind`, `pty` (true for real PTYs), \" +\n \"`name` (when set at spawn), `status`, `command`, age + exit code. Use \" +\n \"this when you need to know what's already running before spawning \" +\n \"anything new, or to discover a session id by name.\",\n {\n kind: z\n .enum([\"terminal\", \"agent-cli\", \"command\", \"all\"])\n .optional()\n .describe(\n \"Filter by session kind. `all` (default) returns every kind. \" +\n \"Use `terminal` to list only PTY sessions, `agent-cli` for \" +\n \"structured ACP agents.\",\n ),\n onlyAlive: z\n .boolean()\n .optional()\n .describe(\"When true, only running/starting sessions. Default false.\"),\n status: z\n .enum([\"starting\", \"running\", \"exited\", \"killed\", \"error\"])\n .optional()\n .describe(\"Filter by exact status (overrides onlyAlive).\"),\n },\n async input => {\n let rows = registry.list()\n if (input.kind && input.kind !== \"all\") {\n rows = rows.filter(s => s.kind === input.kind)\n }\n if (input.status) {\n rows = rows.filter(s => s.status === input.status)\n } else if (input.onlyAlive) {\n rows = rows.filter(\n s => s.status === \"running\" || s.status === \"starting\",\n )\n }\n return {\n content: [\n { type: \"text\", text: JSON.stringify({ sessions: rows }, null, 2) },\n ],\n }\n },\n )\n\n // ── list_agent_sessions (kept for backwards compatibility) ─────\n server.tool(\n \"list_agent_sessions\",\n \"DEPRECATED — prefer `list_sessions` which returns ALL kinds + filters. \" +\n \"Despite the name this tool already returns every kind, not just \" +\n \"agent-cli sessions; the new tool's name reflects the actual surface.\",\n {\n onlyAlive: z\n .boolean()\n .optional()\n .describe(\"Filter to status running/starting only. Default false.\"),\n },\n async input => {\n const all = registry.list()\n const filtered = input.onlyAlive\n ? all.filter(s => s.status === \"running\" || s.status === \"starting\")\n : all\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ sessions: filtered }, null, 2),\n },\n ],\n }\n }\n )\n\n // ── get_agent_session_output ───────────────────────────────────\n server.tool(\n \"get_agent_session_output\",\n \"Tail the recent output of a session. Returns the last N lines of the \" +\n \"ring buffer (stdout + stderr inter-leaved, newest last). Use this to read \" +\n \"an agent's reply after `prompt_agent_session`.\",\n {\n sessionId: z.string().describe(\"Session id.\"),\n lastN: z\n .number()\n .int()\n .min(1)\n .max(500)\n .optional()\n .describe(\"Max lines to return. Default 80, max 500.\"),\n },\n async input => {\n const desc = registry.get(input.sessionId)\n if (!desc) {\n return {\n content: [\n { type: \"text\", text: `get_agent_session_output: no session \"${input.sessionId}\"` },\n ],\n isError: true,\n }\n }\n // Best-effort tail — re-attach with a temp listener, capture\n // backfill (which is the recent ring buffer), unsubscribe.\n const limit = input.lastN ?? 80\n const lines: string[] = []\n const unsub = registry.attach(input.sessionId, (line, _stream) => {\n lines.push(line)\n })\n if (unsub) unsub()\n const tail = lines.slice(-limit)\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n {\n sessionId: input.sessionId,\n status: desc.status,\n lastOutputAt: desc.lastOutputAt,\n lines: tail,\n },\n null,\n 2\n ),\n },\n ],\n }\n }\n )\n\n // ── list_adapters ──────────────────────────────────────────────\n server.tool(\n \"list_adapters\",\n \"Enumerate every agent CLI adapter installed on the host (claude-code, \" +\n \"hermes, aider, …). Returns slug + display name + version + protocol so \" +\n \"callers can let users pick from the installed set instead of guessing. \" +\n \"Use before `start_agent_session` when the model doesn't already know \" +\n \"what's available.\",\n {},\n async () => {\n if (!listAgentAdapters) {\n return {\n content: [\n {\n type: \"text\",\n text:\n \"list_adapters is not enabled — the daemon was started without \" +\n \"an adapter lister. Wire `@agentproto/cli`'s \" +\n \"`listInstalledAdapters` via `createGateway({ listAgentAdapters })`.\",\n },\n ],\n isError: true,\n }\n }\n try {\n const adapters = await listAgentAdapters()\n return {\n content: [{ type: \"text\", text: JSON.stringify({ adapters }, null, 2) }],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `list_adapters failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── list_discovered_mcps ───────────────────────────────────────\n server.tool(\n \"list_discovered_mcps\",\n \"Discover MCP servers already configured in the user's other agent \" +\n \"tooling (claude-code, cursor, goose). Returns the union with source \" +\n \"attribution so the operator can suggest 'I see you have a chrome-devtools \" +\n \"MCP set up in claude — want me to use it?' instead of asking the user \" +\n \"to re-configure. Read-only — does not modify any host's config.\",\n {},\n async () => {\n try {\n const mcps = await discoverMcps()\n return {\n content: [{ type: \"text\", text: JSON.stringify({ mcps }, null, 2) }],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `list_discovered_mcps failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── list_imported_mcps ─────────────────────────────────────────\n server.tool(\n \"list_imported_mcps\",\n \"Return the user's curated set of MCP servers — the ones they've \" +\n \"imported from claude / cursor / workspace configs into the daemon. \" +\n \"Use to know which MCPs the operator may freely call vs. ones still \" +\n \"showing up in `list_discovered_mcps` waiting on the user's blessing.\",\n {},\n async () => {\n try {\n const config = await loadImportedMcps()\n return {\n content: [\n { type: \"text\", text: JSON.stringify(config, null, 2) },\n ],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `list_imported_mcps failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── import_mcp ─────────────────────────────────────────────────\n server.tool(\n \"import_mcp\",\n \"Import a discovered MCP into the daemon's curated set. The agent \" +\n \"calls `list_discovered_mcps` first, asks the user, then commits the \" +\n \"choice via this tool. The snapshot is captured at import time so \" +\n \"the entry stays usable if the source config (claude/cursor) is \" +\n \"later removed.\",\n {\n sourceMcpId: z\n .string()\n .min(1)\n .describe(\n \"The discovered MCP id from `list_discovered_mcps` \" +\n \"(e.g. 'claude-code:project:/path:chrome-devtools').\"\n ),\n alias: z\n .string()\n .optional()\n .describe(\n \"Optional friendly name to display. Defaults to the source MCP's name.\"\n ),\n },\n async input => {\n try {\n const discovered = await discoverMcps()\n const snapshot = discovered.find(d => d.id === input.sourceMcpId)\n if (!snapshot) {\n return {\n content: [\n {\n type: \"text\",\n text: `import_mcp: discovered MCP \"${input.sourceMcpId}\" not found. Re-run list_discovered_mcps to get current ids.`,\n },\n ],\n isError: true,\n }\n }\n const cfg = await loadImportedMcps()\n const next = addImport(cfg, {\n snapshot,\n ...(input.alias ? { alias: input.alias } : {}),\n })\n await saveImportedMcps(next)\n const entry = next.imports.find(e => e.id === snapshot.id)\n return {\n content: [{ type: \"text\", text: JSON.stringify(entry, null, 2) }],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `import_mcp failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── remove_imported_mcp ────────────────────────────────────────\n server.tool(\n \"remove_imported_mcp\",\n \"Remove a previously-imported MCP from the daemon's curated set. \" +\n \"Use when the user no longer wants the operator referencing it.\",\n {\n id: z\n .string()\n .min(1)\n .describe(\n \"The imported MCP id (matches the discovered MCP id at import time).\"\n ),\n },\n async input => {\n try {\n const cfg = await loadImportedMcps()\n if (!cfg.imports.some(e => e.id === input.id)) {\n return {\n content: [\n {\n type: \"text\",\n text: `remove_imported_mcp: id \"${input.id}\" not in imports. Use list_imported_mcps to see current entries.`,\n },\n ],\n isError: true,\n }\n }\n await saveImportedMcps(removeImport(cfg, input.id))\n return {\n content: [\n { type: \"text\", text: JSON.stringify({ ok: true, id: input.id }, null, 2) },\n ],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `remove_imported_mcp failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── mcp_imported_status ────────────────────────────────────────\n // The 3 proxy tools share the same wiring guard — register them\n // only when the host injected a proxy registry, otherwise emit a\n // clear \"not enabled\" error so the agent doesn't think the daemon\n // silently dropped the call.\n server.tool(\n \"mcp_imported_status\",\n \"Snapshot every imported MCP server with its connection status, \" +\n \"transport type, and tool count. Use this first when an operator \" +\n \"wonders 'what MCPs do I actually have access to right now?' — the \" +\n \"answer covers both 'imported but not yet connected' and 'connected \" +\n \"with N tools'. Errors during connect surface in `lastError`.\",\n {},\n async () => {\n if (!mcpProxy) {\n return {\n content: [\n {\n type: \"text\",\n text:\n \"mcp_imported_status is not enabled — daemon was started without \" +\n \"an MCP proxy. The host must wire `mcpProxy` in createGateway.\",\n },\n ],\n isError: true,\n }\n }\n try {\n const aliases = await mcpProxy.listAliases()\n return {\n content: [\n { type: \"text\", text: JSON.stringify({ imports: aliases }, null, 2) },\n ],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `mcp_imported_status failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── mcp_imported_list_tools ────────────────────────────────────\n server.tool(\n \"mcp_imported_list_tools\",\n \"List the tools exposed by one imported MCP server. The proxy \" +\n \"lazily connects on first call — first-use latency includes the \" +\n \"transport handshake (stdio: ~1-2s for npx-spawned servers; \" +\n \"http/sse: <100ms). Returns the upstream `inputSchema` (JSON \" +\n \"Schema) verbatim so the operator can build a valid `arguments` \" +\n \"object for the follow-up `mcp_imported_call` invocation.\",\n {\n alias: z\n .string()\n .min(1)\n .describe(\n \"Alias from `list_imported_mcps` / `mcp_imported_status` \" +\n \"(typically the original MCP name, e.g. 'chrome-devtools').\"\n ),\n },\n async input => {\n if (!mcpProxy) {\n return {\n content: [\n {\n type: \"text\",\n text: \"mcp_imported_list_tools is not enabled — see mcp_imported_status.\",\n },\n ],\n isError: true,\n }\n }\n const out = await mcpProxy.listTools(input.alias)\n if (!out.ok) {\n return {\n content: [\n {\n type: \"text\",\n text: `mcp_imported_list_tools \"${input.alias}\": ${out.error}`,\n },\n ],\n isError: true,\n }\n }\n return {\n content: [\n { type: \"text\", text: JSON.stringify({ alias: input.alias, tools: out.tools }, null, 2) },\n ],\n }\n }\n )\n\n // ── mcp_imported_call ──────────────────────────────────────────\n server.tool(\n \"mcp_imported_call\",\n \"Invoke a tool on an imported MCP server. The daemon proxies the \" +\n \"call through the live client connection — the upstream server \" +\n \"validates `arguments` against its own input schema (which you \" +\n \"can fetch via `mcp_imported_list_tools`). The full upstream \" +\n \"result is returned verbatim, including `isError` flags so the \" +\n \"operator sees the original failure shape.\",\n {\n alias: z.string().min(1).describe(\"Imported MCP alias.\"),\n toolName: z\n .string()\n .min(1)\n .describe(\n \"Tool name as it appears in `mcp_imported_list_tools` \" +\n \"(NOT a namespaced version — pass the upstream's own name).\"\n ),\n args: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\n \"Tool arguments as a JSON object. Schema is the upstream's \" +\n \"— the proxy doesn't validate, only forwards. Default: empty object.\"\n ),\n },\n async input => {\n if (!mcpProxy) {\n return {\n content: [\n {\n type: \"text\",\n text: \"mcp_imported_call is not enabled — see mcp_imported_status.\",\n },\n ],\n isError: true,\n }\n }\n const out = await mcpProxy.callTool(\n input.alias,\n input.toolName,\n input.args ?? {}\n )\n if (!out.ok) {\n return {\n content: [\n {\n type: \"text\",\n text: `mcp_imported_call \"${input.alias}\".${input.toolName}: ${out.error}`,\n },\n ],\n isError: true,\n }\n }\n // Forward the upstream result. The MCP SDK's CallToolResult is\n // already in the {content, isError?} shape we return — pass it\n // through with a note that it came from the proxy.\n return out.result as {\n content: Array<{ type: \"text\"; text: string }>\n isError?: boolean\n }\n }\n )\n\n // ── kill_agent_session ─────────────────────────────────────────\n server.tool(\n \"kill_agent_session\",\n \"Stop a session — SIGTERM the underlying child + close the agent protocol \" +\n \"session. Use to free resources after the operator is done, or when a \" +\n \"session is wedged.\",\n {\n sessionId: z.string().describe(\"Session id.\"),\n },\n async input => {\n const ok = registry.kill(input.sessionId)\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ ok, sessionId: input.sessionId }, null, 2),\n },\n ],\n }\n }\n )\n\n // ── Terminal session tools ─────────────────────────────────────\n // Four tools that mirror the agent-session set but operate on raw\n // PTY sessions (real terminal, ANSI bytes, multi-subscriber). Use\n // these to drive interactive CLIs like `claude` in TUI mode, or\n // for one agent to orchestrate other shells. Read/write/exit\n // happen over the byte ring buffer; the WS at /sessions/:id/pty\n // is the streaming alternative.\n\n const ptyNotConfigured = (toolName: string): {\n content: Array<{ type: \"text\"; text: string }>\n isError: true\n } => ({\n content: [\n {\n type: \"text\",\n text:\n `${toolName}: PTY support not enabled — the daemon was started without ` +\n \"a node-pty factory. Re-run `agentproto serve` from a build that ships \" +\n \"node-pty (the optional dep ships with @agentproto/cli).\",\n },\n ],\n isError: true,\n })\n\n server.tool(\n \"start_terminal_session\",\n \"Spawn a process under a real PTY (node-pty) on the host. Bytes (including \" +\n \"ANSI escapes, alt-screen sequences) flow through the daemon's byte ring \" +\n \"buffer; subscribers attach via the WS at /sessions/:id/pty. Use for \" +\n \"interactive TUIs (claude, vim, htop) or to orchestrate shells from another \" +\n \"agent. Returns the session descriptor.\",\n {\n argv: z\n .array(z.string())\n .min(1)\n .describe(\n \"Argv array. First element is the binary, rest are arguments. \" +\n \"e.g. ['claude'] or ['bash', '-l'].\"\n ),\n workspaceSlug: z\n .string()\n .optional()\n .describe(\n \"Workspace slug from `agentproto workspace list`. Resolves cwd. Omit \" +\n \"to use `cwd` explicitly or the active workspace.\"\n ),\n cwd: z\n .string()\n .optional()\n .describe(\"Absolute cwd. Wins over workspaceSlug when both set.\"),\n cols: z.number().int().min(1).max(500).optional().describe(\"Initial cols. Default 80.\"),\n rows: z.number().int().min(1).max(200).optional().describe(\"Initial rows. Default 24.\"),\n name: z\n .string()\n .optional()\n .describe(\n \"User-friendly slug. Becomes an alias for the session id in \" +\n \"subsequent tool calls (read/write/kill accept either).\"\n ),\n label: z\n .string()\n .optional()\n .describe(\n \"Free-text label surfaced in list_agent_sessions and the UI.\"\n ),\n },\n async input => {\n if (!ptyEnabled) return ptyNotConfigured(\"start_terminal_session\")\n let cwd = input.cwd\n let resolvedSlug = input.workspaceSlug ?? \"default\"\n if (!cwd) {\n try {\n const config = await loadWorkspacesConfig()\n const ws = input.workspaceSlug\n ? findWorkspace(config, input.workspaceSlug)\n : getActiveWorkspace(config)\n if (ws) {\n cwd = ws.path\n resolvedSlug = ws.slug\n }\n } catch {\n // fall through to error\n }\n }\n if (!cwd) {\n return {\n content: [\n {\n type: \"text\",\n text:\n \"start_terminal_session: no cwd resolvable. Pass `cwd` explicitly \" +\n \"or `workspaceSlug` matching `agentproto workspace list`.\",\n },\n ],\n isError: true,\n }\n }\n try {\n const desc = registry.spawnPty({\n argv: input.argv,\n cwd,\n workspaceSlug: resolvedSlug,\n cols: input.cols ?? 80,\n rows: input.rows ?? 24,\n ...(input.name ? { name: input.name } : {}),\n ...(input.label ? { label: input.label } : {}),\n })\n return {\n content: [{ type: \"text\", text: JSON.stringify(desc, null, 2) }],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `start_terminal_session: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n server.tool(\n \"write_terminal_input\",\n \"Send keystrokes to a PTY session's stdin. The text is forwarded verbatim — \" +\n \"include trailing newlines if the target needs them (e.g. shell commands). \" +\n \"Use after `start_terminal_session` to drive an interactive CLI.\",\n {\n sessionId: z\n .string()\n .describe(\"Session id OR name from start_terminal_session.\"),\n text: z.string().describe(\"Text to write. Sent as-is to the PTY's stdin.\"),\n },\n async input => {\n if (!ptyEnabled) return ptyNotConfigured(\"write_terminal_input\")\n const desc = registry.findByIdOrName(input.sessionId)\n if (!desc) {\n return {\n content: [\n {\n type: \"text\",\n text: `write_terminal_input: no session \"${input.sessionId}\"`,\n },\n ],\n isError: true,\n }\n }\n const ok = registry.writeTerminalInput(desc.id, input.text)\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ ok, sessionId: desc.id }, null, 2),\n },\n ],\n ...(ok ? {} : { isError: true as const }),\n }\n }\n )\n\n server.tool(\n \"read_terminal_output\",\n \"Snapshot the recent byte buffer of a PTY session. Returns base64-encoded \" +\n \"bytes (the buffer is RAW including ANSI escapes — strip with a regex if \" +\n \"you want plain text). `lastBytes` caps the read from the tail.\",\n {\n sessionId: z\n .string()\n .describe(\"Session id OR name from start_terminal_session.\"),\n lastBytes: z\n .number()\n .int()\n .min(1)\n .max(64 * 1024)\n .optional()\n .describe(\"Max bytes from the tail. Default: full ring buffer (~64 KiB).\"),\n },\n async input => {\n if (!ptyEnabled) return ptyNotConfigured(\"read_terminal_output\")\n const desc = registry.findByIdOrName(input.sessionId)\n if (!desc) {\n return {\n content: [\n {\n type: \"text\",\n text: `read_terminal_output: no session \"${input.sessionId}\"`,\n },\n ],\n isError: true,\n }\n }\n const buf = registry.readTerminalOutput(\n desc.id,\n input.lastBytes,\n )\n if (!buf) {\n return {\n content: [\n {\n type: \"text\",\n text: `read_terminal_output: session \"${desc.id}\" is not a PTY`,\n },\n ],\n isError: true,\n }\n }\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n {\n sessionId: desc.id,\n status: desc.status,\n bytes: buf.byteLength,\n b64: buf.toString(\"base64\"),\n },\n null,\n 2,\n ),\n },\n ],\n }\n }\n )\n\n server.tool(\n \"kill_terminal_session\",\n \"SIGTERM a PTY session and drop it from the alive set. Same effect as \" +\n \"`kill_agent_session` for the PTY family — separate name so it's obvious \" +\n \"what's being stopped.\",\n {\n sessionId: z\n .string()\n .describe(\"Session id OR name from start_terminal_session.\"),\n },\n async input => {\n if (!ptyEnabled) return ptyNotConfigured(\"kill_terminal_session\")\n const desc = registry.findByIdOrName(input.sessionId)\n if (!desc) {\n return {\n content: [\n {\n type: \"text\",\n text: `kill_terminal_session: no session \"${input.sessionId}\"`,\n },\n ],\n isError: true,\n }\n }\n const ok = registry.kill(desc.id)\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ ok, sessionId: desc.id }, null, 2),\n },\n ],\n }\n }\n )\n}\n","/**\n * HEARTBEAT.md autonomy loop.\n *\n * A workspace can ship a `HEARTBEAT.md` at its root. Frontmatter:\n *\n * schema: heartbeat/v1\n * agent: <id> (matches `<workspace>/.agents/<id>/AGENT.md`)\n * every: \"60s\" (Ns | Nm | Nh | Nd; cron support TODO)\n * enabled: true (default true; set false to register-but-skip)\n * conversation: heartbeat-{date} (templated id; defaults to per-day)\n *\n * Body = the prompt body the agent receives each tick. Reread fresh\n * on every tick so editing HEARTBEAT.md takes effect without restart.\n *\n * Ticks resolve the agent via the injected `buildAgent` callback,\n * call `agent.generate(prompt)`, and append the prompt + reply to a\n * conversation (default: daily-rolling `heartbeat-YYYY-MM-DD`).\n *\n * When the file is missing, frontmatter is invalid, `enabled: false`,\n * or the resolved agent has no usable model — the runner skips the\n * tick silently and emits a `heartbeat-error` event. The daemon\n * stays up.\n */\n\nimport matter from \"gray-matter\"\nimport { existsSync } from \"node:fs\"\nimport { readFile } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport type { ConversationStore } from \"./conversations.js\"\nimport type { RuntimeEvents } from \"./events.js\"\n\nexport interface HeartbeatAgent {\n generate(prompt: string): Promise<{ text: string }>\n}\n\nexport interface BuildHeartbeatAgent {\n (id: string): Promise<HeartbeatAgent | null>\n}\n\nexport interface HeartbeatRunnerOptions {\n workspace: string\n conversations: ConversationStore\n events: RuntimeEvents\n /** Resolves a heartbeat-runnable agent from its workspace id. */\n buildAgent: BuildHeartbeatAgent\n /** Filename inside the workspace root. Default `HEARTBEAT.md`. */\n filename?: string\n /** Skip ticks while this returns false. Default: always true. */\n shouldFire?: () => boolean\n /** Override clock for tests. */\n now?: () => Date\n}\n\nexport interface HeartbeatRunner {\n /** Start the timer loop. Idempotent. */\n start(): void\n /** Stop the timer loop. Pending ticks finish out. */\n stop(): void\n /** Force-fire one tick now (used by `POST /heartbeat/tick`). */\n fireNow(): Promise<void>\n}\n\ninterface ParsedHeartbeat {\n agent: string\n everyMs: number\n enabled: boolean\n conversationTemplate: string\n body: string\n}\n\nexport function startHeartbeat(opts: HeartbeatRunnerOptions): HeartbeatRunner {\n const filename = opts.filename ?? \"HEARTBEAT.md\"\n const path = join(opts.workspace, filename)\n const now = opts.now ?? (() => new Date())\n\n let timer: NodeJS.Timeout | null = null\n let currentEveryMs: number | null = null\n let firing = false\n\n async function load(): Promise<ParsedHeartbeat | null> {\n if (!existsSync(path)) return null\n let source: string\n try {\n source = await readFile(path, \"utf8\")\n } catch {\n return null\n }\n const parsed = matter(source)\n const fm = parsed.data as Record<string, unknown>\n const agent = typeof fm.agent === \"string\" ? fm.agent : null\n if (!agent) return null\n const enabled = fm.enabled === undefined ? true : Boolean(fm.enabled)\n const everyRaw = typeof fm.every === \"string\" ? fm.every : \"60s\"\n const everyMs = parseDuration(everyRaw)\n if (!everyMs) return null\n const conversationTemplate =\n typeof fm.conversation === \"string\"\n ? fm.conversation\n : \"heartbeat-{date}\"\n return {\n agent,\n everyMs,\n enabled,\n conversationTemplate,\n body: parsed.content.trim(),\n }\n }\n\n async function tick(): Promise<void> {\n if (firing) return\n if (opts.shouldFire && !opts.shouldFire()) return\n firing = true\n let agentId: string | undefined\n try {\n const hb = await load()\n if (!hb || !hb.enabled) return\n agentId = hb.agent\n const agent = await opts.buildAgent(hb.agent)\n if (!agent) {\n opts.events.emit({\n type: \"heartbeat-error\",\n at: now().toISOString(),\n agent: hb.agent,\n error: `buildAgent('${hb.agent}') returned null`,\n })\n return\n }\n if (!hb.body) {\n opts.events.emit({\n type: \"heartbeat-error\",\n at: now().toISOString(),\n agent: hb.agent,\n error: \"HEARTBEAT.md body is empty\",\n })\n return\n }\n\n const conversationId = expandTemplate(hb.conversationTemplate, now())\n await opts.conversations.open(conversationId, { agent: hb.agent })\n\n const startedAt = now()\n await opts.conversations.appendTurn(\n conversationId,\n \"user\",\n hb.body,\n { at: startedAt.toISOString(), attribution: \"heartbeat\" },\n )\n opts.events.emit({\n type: \"conv-turn-appended\",\n at: startedAt.toISOString(),\n conversationId,\n role: \"user\",\n contentPreview: preview(hb.body),\n })\n\n const t0 = Date.now()\n const reply = await agent.generate(hb.body)\n const durationMs = Date.now() - t0\n\n const finishedAt = now()\n await opts.conversations.appendTurn(\n conversationId,\n \"assistant\",\n reply.text,\n { at: finishedAt.toISOString(), attribution: hb.agent },\n )\n opts.events.emit({\n type: \"conv-turn-appended\",\n at: finishedAt.toISOString(),\n conversationId,\n role: \"assistant\",\n contentPreview: preview(reply.text),\n })\n opts.events.emit({\n type: \"heartbeat-fired\",\n at: finishedAt.toISOString(),\n agent: hb.agent,\n conversationId,\n prompt: hb.body,\n reply: reply.text,\n durationMs,\n })\n\n // Adapt the timer if `every` changed since we started.\n if (currentEveryMs !== null && currentEveryMs !== hb.everyMs) {\n reschedule(hb.everyMs)\n }\n } catch (err) {\n opts.events.emit({\n type: \"heartbeat-error\",\n at: now().toISOString(),\n agent: agentId,\n error: err instanceof Error ? err.message : String(err),\n })\n } finally {\n firing = false\n }\n }\n\n function reschedule(everyMs: number): void {\n if (timer) clearInterval(timer)\n currentEveryMs = everyMs\n timer = setInterval(() => {\n void tick()\n }, everyMs)\n }\n\n return {\n start() {\n if (timer) return\n // Bootstrap interval from the file (or fall back to 60s if\n // unreadable — first real tick will refresh from disk).\n void load().then((hb) => {\n const everyMs = hb?.everyMs ?? 60_000\n reschedule(everyMs)\n })\n },\n stop() {\n if (timer) {\n clearInterval(timer)\n timer = null\n currentEveryMs = null\n }\n },\n async fireNow() {\n await tick()\n },\n }\n}\n\n// ── helpers ──────────────────────────────────────────────────────────\n\nconst DURATION_RE = /^(\\d+)\\s*(s|m|h|d)$/\n\n/**\n * Parse `Ns | Nm | Nh | Nd` into milliseconds. Returns `null` if the\n * string doesn't match. (AIP-41 supports more units, but the daemon's\n * heartbeat sticks to coarse durations to keep ticks observable.)\n */\nexport function parseDuration(input: string): number | null {\n const trimmed = input.trim()\n const match = trimmed.match(DURATION_RE)\n if (!match) return null\n const n = Number(match[1])\n if (!Number.isFinite(n) || n <= 0) return null\n switch (match[2]) {\n case \"s\":\n return n * 1_000\n case \"m\":\n return n * 60_000\n case \"h\":\n return n * 3_600_000\n case \"d\":\n return n * 86_400_000\n default:\n return null\n }\n}\n\n/**\n * Replace `{date}` with `YYYY-MM-DD` (UTC) in conversation templates.\n * Other tokens pass through unchanged — extend later if needed.\n */\nfunction expandTemplate(template: string, when: Date): string {\n const date = when.toISOString().slice(0, 10)\n return template.replace(/\\{date\\}/g, date)\n}\n\nfunction preview(text: string, max = 120): string {\n const flat = text.replace(/\\s+/g, \" \").trim()\n return flat.length > max ? `${flat.slice(0, max - 1)}…` : flat\n}\n","/**\n * Tiny node:http server that fronts the runtime gateway.\n *\n * Routes:\n * GET /health — { status, workspace, registered, uptime }\n * GET /events — SSE stream of RuntimeEvent\n * POST /mcp — MCP Streamable HTTP transport (POST)\n * GET /mcp — MCP SSE response stream (GET)\n * DELETE /mcp — close MCP session\n * GET /conversations — JSON list of conversation summaries\n * GET /conversations/<id> — markdown body of one conversation\n * POST /heartbeat/tick — force-fire one heartbeat tick\n *\n * No auth in `mode: \"none\"` (loopback default). `mode: \"bearer\"`\n * checks `Authorization: Bearer <token>` against the configured\n * token. Health is always public so external monitors can probe.\n *\n * MCP transport: stateless mode for v1 — each request is independent.\n * Stateful session pinning can come later when long-running streaming\n * tool calls become a real use case.\n */\n\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\"\nimport type { Duplex } from \"node:stream\"\nimport { mkdir, stat, writeFile } from \"node:fs/promises\"\nimport { isAbsolute, join, resolve as resolvePath } from \"node:path\"\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\"\nimport { WebSocketServer, type WebSocket } from \"ws\"\nimport type { ConversationStore } from \"./conversations.js\"\nimport type { HeartbeatRunner } from \"./heartbeat.js\"\nimport type { RuntimeEvents, RuntimeEvent } from \"./events.js\"\nimport type { SessionsRegistry, AgentSessionLike } from \"./sessions.js\"\nimport {\n loadWorkspacesConfig,\n findWorkspace,\n getActiveWorkspace,\n} from \"./workspaces-config.js\"\nimport { discoverMcps } from \"./mcp-discovery.js\"\nimport type { McpProxyRegistry } from \"./mcp-proxy.js\"\nimport {\n loadImportedMcps,\n saveImportedMcps,\n addImport,\n removeImport,\n} from \"./mcp-imports.js\"\n\n/**\n * Default Origin allowlist used when `RuntimeHttpServerOptions.allowedOrigins`\n * is undefined. Localhost on any port covers the user's own dev environments\n * (Guilde web dev server, playground demos, embedded panels). Production\n * origins (https://guilde.work, …) are NOT included by default — those are\n * opt-in via `agentproto serve --allow-origin <url>`.\n */\nconst DEFAULT_ALLOWED_ORIGINS: readonly string[] = [\n \"http://localhost:*\",\n \"http://127.0.0.1:*\",\n \"https://localhost:*\",\n]\n\n/**\n * Pluggable adapter resolver — keeps the runtime package free of any\n * @agentproto/cli dep. The host (cli `serve`, playground, embedding\n * apps) builds the resolver and hands it in. Returning null means\n * \"adapter not found\" → 404.\n */\nexport type AgentAdapterResolver = (slug: string) => Promise<{\n /** Build a fresh AgentSessionLike for the given cwd. The driver\n * spawns the adapter binary, opens the protocol, and the\n * registry holds the result.\n *\n * When `resumeSessionId` is set, the driver reattaches to that\n * pre-existing adapter session (claude-code's conversation id,\n * hermes' chat handle, …) rather than starting blank. Same\n * mechanism as `agentproto run --resume <id>` — exposed over\n * HTTP so `agentproto sessions restart` works on agent-cli\n * sessions, not just PTY ones. */\n startSession(opts: {\n cwd: string\n resumeSessionId?: string\n }): Promise<AgentSessionLike>\n /** Display label for the descriptor's `command` field. */\n commandPreview?: string\n} | null>\n\n/**\n * Compact adapter metadata for the discovery endpoints. Independent\n * of the resolver function above — hosts that can list installed\n * adapters wire this; hosts that can only resolve by-slug skip it\n * (the routes 501).\n */\nexport interface AdapterListEntry {\n slug: string\n name: string\n version: string\n description: string\n protocol: string\n streaming: boolean\n packageName: string\n}\n\nexport type AgentAdapterLister = () => Promise<AdapterListEntry[]>\n\nexport interface AuthOptions {\n mode: \"none\" | \"bearer\"\n token?: string\n}\n\n/**\n * Auth can be a fixed value (set at startup) or a getter (re-read on\n * every request). The getter form lets `remote_enable` flip bearer on\n * at runtime without restarting the gateway.\n */\nexport type AuthSource = AuthOptions | (() => AuthOptions)\n\nexport interface RuntimeHttpServerOptions {\n port: number\n bind?: string\n auth?: AuthSource\n /**\n * Per-request McpServer factory.\n *\n * The SDK's `StreamableHTTPServerTransport` is single-use — once a\n * transport has handled one request, the underlying `Protocol`\n * cannot be reattached, so subsequent requests on a shared transport\n * 500. The official stateless pattern (see SDK\n * `examples/server/simpleStatelessStreamableHttp.js`) builds a\n * fresh `McpServer` and `StreamableHTTPServerTransport` per request,\n * connects them, and tears both down on `res.close`. We follow that.\n *\n * The factory is invoked once per `/mcp` POST. It must register\n * tools / resources / prompts on the returned server before\n * resolving — by the time the transport's `handleRequest` fires,\n * the server is locked in.\n */\n mcpServerFactory: () => Promise<McpServer>\n conversations: ConversationStore\n events: RuntimeEvents\n heartbeat: HeartbeatRunner\n /** Optional — when wired, exposes /sessions routes for the CLI\n * TUI and the guilde-web Active tab to navigate live child\n * processes. Daemons that don't spawn anything (pure MCP servers)\n * can omit this and the routes 404. */\n sessions?: SessionsRegistry\n /** Optional — when wired alongside `sessions`, enables\n * `POST /sessions/agent` and `POST /sessions/:id/prompt` routes.\n * Hosts that ship adapters (`agentproto serve`, playground)\n * pass the cli's `resolveAdapter` via a thin shim. */\n resolveAgentAdapter?: AgentAdapterResolver\n /** Optional — when wired, enables `GET /adapters` route + the\n * MCP `list_adapters` tool so UIs can discover what's installed\n * without trial-and-error against the resolver. Hosts ship the\n * cli's `listInstalledAdapters` via a thin shim. */\n listAgentAdapters?: AgentAdapterLister\n /** Optional — MCP proxy registry. When wired, exposes\n * `/mcps/proxy/*` routes that let the browser drive imported MCPs\n * without going through the MCP wire protocol (useful for the\n * /providers/mcp page's \"Local\" tab). */\n mcpProxy?: McpProxyRegistry\n /** Per-boot bearer token. When set, mutating /sessions/* routes\n * + the /sessions/:id/pty WebSocket upgrade require either\n * `Authorization: Bearer <token>` or an `Origin` header that\n * matches `allowedOrigins`. Read-only routes (GET, SSE stream)\n * stay open since the CORS surface already restricts origins\n * enough for them. */\n token?: string\n /** Trusted browser origins. When a mutating request carries an\n * `Origin: <url>` header (browser-set, JS can't forge), and that\n * url is in this list, the request is allowed without a Bearer\n * token. Browsers can't read the daemon's runtime.json (mode 0600)\n * so they can't send the token — Origin-based auth lets a trusted\n * page (Guilde web UI, local dev) drive the daemon. Non-browser\n * callers (curl, the CLI) still use the token.\n *\n * Match policy: exact origin (`https://guilde.work`) OR prefix\n * with `:*` for any-port match (`http://localhost:*` matches\n * `http://localhost:3000`).\n *\n * Default (when undefined): localhost on any port is allowed via\n * `DEFAULT_ALLOWED_ORIGINS`. Production origins are opt-in via\n * `agentproto serve --allow-origin <url>`. Pair with `strictOrigins`\n * to remove the localhost defaults entirely. */\n allowedOrigins?: readonly string[]\n /** When true, skip the localhost-wildcard defaults — only the\n * explicit `allowedOrigins` list is honoured. Useful for daemons\n * on shared hosts or when the user wants to lock dev to a\n * specific port. Default false (current behaviour — any browser\n * on `localhost` is trusted). */\n strictOrigins?: boolean\n /** Whether `POST /sessions/terminal` + WS upgrade are advertised.\n * Reflects whether the host injected a PTY factory into the\n * SessionsRegistry. When false, the terminal HTTP route returns\n * 501 and the WS upgrade rejects. */\n ptyEnabled?: boolean\n /** Static fields surfaced via `/health`. */\n meta: {\n workspace: string\n registered: readonly string[]\n }\n}\n\nexport interface RuntimeHttpServerHandle {\n url: string\n stop(): Promise<void>\n}\n\nexport async function startHttpServer(\n opts: RuntimeHttpServerOptions,\n): Promise<RuntimeHttpServerHandle> {\n const startedAt = Date.now()\n const authSource: AuthSource = opts.auth ?? { mode: \"none\" }\n const readAuth = (): AuthOptions =>\n typeof authSource === \"function\" ? authSource() : authSource\n\n /**\n * Loopback bypass — requests originating from 127.0.0.1 / ::1 with\n * no `X-Forwarded-For` header skip the bearer check even when one is\n * configured. Rationale:\n *\n * 1. The bearer is meant to gate the *public tunnel*, not the\n * loopback socket. Without this, calling `remote_enable` from a\n * local MCP client immediately 401s that same local client —\n * the user locks themselves out and the only recovery is a\n * gateway restart. Hit this in real use; not a theoretical edge.\n *\n * 2. Cloudflared (and any reasonable tunnel) sets X-Forwarded-For\n * when forwarding a public request to the loopback origin. So\n * \"loopback AND no XFF\" is a tight characterisation of \"this\n * request never left the machine.\"\n *\n * 3. Local FS access already trumps bearer (the user can read\n * runtime.json, kill -9 the daemon, etc.). Adding another check\n * here doesn't raise the bar for someone with shell on the box.\n *\n * If your threat model is \"untrusted users on the same loopback\n * interface\" (unusual — usually a multi-tenant container scenario),\n * pass `auth: { mode: \"bearer\", … }` at startup instead of relying\n * on the controller's runtime flip; the auth getter will return the\n * stricter of the two and the bypass still applies (intentional —\n * the operator opted in to bearer with full knowledge of the trade).\n */\n function isLoopback(req: IncomingMessage): boolean {\n const addr = req.socket.remoteAddress ?? \"\"\n const isLocalAddr =\n addr === \"127.0.0.1\" || addr === \"::1\" || addr === \"::ffff:127.0.0.1\"\n if (!isLocalAddr) return false\n // X-Forwarded-For present ⇒ a tunnel is in front of us; the\n // request crossed the public internet to reach this socket.\n if (req.headers[\"x-forwarded-for\"]) return false\n return true\n }\n\n function authorize(req: IncomingMessage, res: ServerResponse): boolean {\n const auth = readAuth()\n if (auth.mode === \"none\") return true\n if (isLoopback(req)) return true\n const header = req.headers.authorization\n const expected = `Bearer ${auth.token}`\n if (header !== expected) {\n res.writeHead(401, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"unauthorized\" }))\n return false\n }\n return true\n }\n\n /**\n * Per-boot auth gate for mutating /sessions/* routes and the WS\n * upgrade for /sessions/:id/pty. Accepts EITHER:\n *\n * 1. `Authorization: Bearer <token>` matching the per-boot token\n * (the CLI path — reads runtime.json mode 0600).\n * 2. A WS-upgrade query-string `?token=<token>` (browser\n * WebSocket can't set headers; some non-browser clients use\n * this too).\n * 3. An `Origin: <url>` header matching `allowedOrigins` — the\n * browser path. Origin is browser-set, JS can't forge.\n *\n * UNLIKE `authorize()`, this does NOT have a loopback bypass: the\n * threat we're defending against (browser drive-by spawning shells\n * via fetch to 127.0.0.1) IS loopback. Browsers can't read\n * runtime.json (mode 0600); a same-origin trusted page can rely on\n * its Origin instead.\n *\n * When `opts.token` is unset (older host integrations), this is a\n * no-op so existing call sites keep working.\n */\n function checkSessionsToken(req: IncomingMessage): \"ok\" | \"missing\" | \"bad\" {\n if (!opts.token) return \"ok\"\n\n // 1. Header bearer token.\n const header = req.headers.authorization\n const expected = `Bearer ${opts.token}`\n if (header === expected) return \"ok\"\n\n // 2. ?token=<token> in the URL (WS upgrade convenience).\n const urlStr = req.url ?? \"\"\n if (urlStr.includes(\"?\")) {\n const qs = new URLSearchParams(urlStr.slice(urlStr.indexOf(\"?\") + 1))\n const qsToken = qs.get(\"token\")\n if (qsToken && qsToken === opts.token) return \"ok\"\n }\n\n // 3. Origin allowlist (browser path).\n const origin = req.headers.origin\n if (typeof origin === \"string\" && originAllowed(origin)) return \"ok\"\n\n return header ? \"bad\" : \"missing\"\n }\n\n function originAllowed(origin: string): boolean {\n // Defaults are normally in effect — `opts.allowedOrigins` extends\n // them rather than replacing. Otherwise setting one production\n // origin via config silently locks out `http://localhost:*`,\n // breaking local dev. Users who genuinely want a curated list\n // (shared host, paranoid local-only ports) set `strictOrigins:true`\n // which drops the defaults entirely.\n const list = opts.strictOrigins\n ? (opts.allowedOrigins ?? [])\n : [...DEFAULT_ALLOWED_ORIGINS, ...(opts.allowedOrigins ?? [])]\n for (const pattern of list) {\n if (pattern === origin) return true\n // `http://localhost:*` style: match the host prefix, any port.\n if (pattern.endsWith(\":*\")) {\n const prefix = pattern.slice(0, -2) // drop \":*\"\n if (origin === prefix || origin.startsWith(prefix + \":\")) return true\n }\n }\n return false\n }\n\n function rejectUnauthorizedSession(\n req: IncomingMessage,\n res: ServerResponse,\n kind: \"missing\" | \"bad\",\n ): void {\n const origin = req.headers.origin ?? null\n const allowList = opts.strictOrigins\n ? (opts.allowedOrigins ?? [])\n : [...DEFAULT_ALLOWED_ORIGINS, ...(opts.allowedOrigins ?? [])]\n res.writeHead(401, { \"content-type\": \"application/json\" })\n const message =\n kind === \"missing\"\n ? origin\n ? `Origin \"${origin}\" not in the daemon's allowlist, and no Bearer token sent. ` +\n `Either add it (\\`agentproto config set daemon.allowedOrigins ${origin}\\` then restart the daemon), ` +\n `or send Authorization: Bearer <token> read from <workspace>/.agentproto/runtime.json.`\n : `Authorization: Bearer <token> required on mutating /sessions/* routes. ` +\n `Read the token from <workspace>/.agentproto/runtime.json. ` +\n `(Browser callers can use an Origin in the allowlist instead.)`\n : `Invalid bearer token. The daemon regenerated its token on its last boot — ` +\n `re-read <workspace>/.agentproto/runtime.json.`\n res.end(\n JSON.stringify({\n error: \"sessions_unauthorized\",\n message,\n // Debug data so a UI / network-tab inspection points the user\n // straight at the fix without needing the daemon's stderr.\n rejectedOrigin: origin,\n allowedOrigins: allowList,\n // We never echo the token; only the absence-or-presence flag.\n receivedAuthHeader: typeof req.headers.authorization === \"string\",\n }),\n )\n }\n\n /**\n * Returns true when this `path` + `method` is a mutating /sessions/*\n * route that should require the per-boot token. Kept narrow: GETs\n * (list, get, SSE stream) stay open for read-only telemetry from\n * existing tools that haven't learned about the token yet.\n */\n function isMutatingSessionsRoute(method: string, path: string): boolean {\n if (!path.startsWith(\"/sessions\")) return false\n if (method === \"POST\" || method === \"DELETE\" || method === \"PUT\" || method === \"PATCH\") {\n return true\n }\n return false\n }\n\n async function handleMcp(req: IncomingMessage, res: ServerResponse): Promise<void> {\n if (!authorize(req, res)) return\n // Per-request server + transport, per the SDK's stateless pattern.\n // Sharing either across requests breaks after the first one because\n // `Protocol.connect` rejects re-attachment.\n const server = await opts.mcpServerFactory()\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n })\n // `onerror` is an unofficial SDK hook — guard before assigning so\n // a future SDK rename doesn't silently drop transport error logs.\n const transportInternal = transport as unknown as Record<string, unknown>\n if (\"onerror\" in (transport as object)) {\n transportInternal[\"onerror\"] = (err: unknown) => {\n console.error(\"[mcp transport.onerror]\", err)\n }\n }\n\n res.on(\"close\", () => {\n void transport.close()\n void server.close()\n })\n\n try {\n await server.connect(transport)\n await transport.handleRequest(req, res)\n } catch (err) {\n console.error(\"[mcp] handleRequest threw:\", err)\n if (!res.headersSent) {\n res.writeHead(500, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"mcp_transport_failed\",\n message: err instanceof Error ? err.message : String(err),\n }),\n )\n }\n }\n }\n\n function handleHealth(_req: IncomingMessage, res: ServerResponse): void {\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n status: \"ok\",\n workspace: opts.meta.workspace,\n registered: opts.meta.registered,\n uptimeMs: Date.now() - startedAt,\n }),\n )\n }\n\n function handleEvents(req: IncomingMessage, res: ServerResponse): void {\n if (!authorize(req, res)) return\n res.writeHead(200, {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache, no-transform\",\n connection: \"keep-alive\",\n })\n res.write(`: connected\\n\\n`)\n const off = opts.events.onAny((ev: RuntimeEvent) => {\n res.write(`data: ${JSON.stringify(ev)}\\n\\n`)\n })\n req.on(\"close\", off)\n }\n\n async function handleListConversations(\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n if (!authorize(req, res)) return\n const list = await opts.conversations.list()\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(list))\n }\n\n async function handleGetConversation(\n req: IncomingMessage,\n res: ServerResponse,\n id: string,\n ): Promise<void> {\n if (!authorize(req, res)) return\n try {\n const data = await opts.conversations.read(id)\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(data))\n } catch (err) {\n res.writeHead(404, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"not_found\",\n message: err instanceof Error ? err.message : String(err),\n }),\n )\n }\n }\n\n async function handleHeartbeatTick(\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n if (!authorize(req, res)) return\n await opts.heartbeat.fireNow()\n res.writeHead(202, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ status: \"fired\" }))\n }\n\n /**\n * POST /files/upload?cwd=<abs-dir>&name=<filename>\n *\n * Writes the raw request body bytes to\n * `{cwd}/.agentproto-attachments/{safe-name}`, creating the\n * subdirectory on demand, and returns `{path}` with the absolute\n * path the agent CLI can read. Used by the host UI's terminal\n * drag-drop: the browser can't read the dragged file's source path\n * (security), so we copy the bytes to a known location and tell the\n * UI to paste THAT path into the terminal — claude-code (and any\n * CLI with a Read tool) picks it up natively.\n *\n * Gated by `checkSessionsToken` so a drive-by HTTP request can't\n * write arbitrary files: only sessions-authorized callers (CLI or\n * an allow-listed browser origin) can hit it.\n *\n * Hardening:\n * - `cwd` must be absolute and exist as a directory.\n * - `name` is basename-sanitized (no `/`, `..`, NULs).\n * - The resolved write target must stay within\n * `{cwd}/.agentproto-attachments/` (defense-in-depth in case the\n * name sanitizer ever drifts).\n * - Body capped at 32 MiB. Larger uploads error 413 instead of\n * filling the daemon's disk.\n */\n async function handleFileUpload(\n req: IncomingMessage,\n res: ServerResponse,\n url: string,\n ): Promise<void> {\n const reply = (status: number, body: unknown): void => {\n res.writeHead(status, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(body))\n }\n const qs = new URLSearchParams(url.includes(\"?\") ? url.slice(url.indexOf(\"?\") + 1) : \"\")\n const cwd = qs.get(\"cwd\")\n const rawName = qs.get(\"name\")\n if (!cwd || !rawName) {\n reply(400, { error: \"missing_cwd_or_name\" })\n return\n }\n if (!isAbsolute(cwd)) {\n reply(400, { error: \"cwd_not_absolute\" })\n return\n }\n // basename-style sanitize: strip path separators + parent refs +\n // NUL bytes; collapse leading dots so the file is visible. The\n // resolvePath check below catches anything this misses.\n const safeName = rawName\n .replace(/[\u0000/\\\\]/g, \"_\")\n .replace(/\\.\\.+/g, \".\")\n .replace(/^\\.+/, \"\")\n .slice(0, 200)\n if (safeName.length === 0) {\n reply(400, { error: \"invalid_name\" })\n return\n }\n try {\n const st = await stat(cwd)\n if (!st.isDirectory()) {\n reply(400, { error: \"cwd_not_a_directory\" })\n return\n }\n } catch {\n reply(400, { error: \"cwd_not_found\" })\n return\n }\n const dir = join(cwd, \".agentproto-attachments\")\n const target = resolvePath(dir, safeName)\n // Defense-in-depth: the sanitized name should never escape `dir`,\n // but if the sanitizer ever drifts, this catches the escape.\n if (!target.startsWith(resolvePath(dir) + (dir.endsWith(\"/\") ? \"\" : \"/\"))) {\n reply(400, { error: \"path_traversal_blocked\" })\n return\n }\n const MAX_BYTES = 32 * 1024 * 1024 // 32 MiB\n const chunks: Buffer[] = []\n let total = 0\n let aborted = false\n await new Promise<void>((resolveBody, rejectBody) => {\n req.on(\"data\", chunk => {\n if (aborted) return\n const buf = chunk as Buffer\n total += buf.length\n if (total > MAX_BYTES) {\n aborted = true\n reply(413, { error: \"file_too_large\", maxBytes: MAX_BYTES })\n rejectBody(new Error(\"too_large\"))\n return\n }\n chunks.push(buf)\n })\n req.on(\"end\", () => {\n if (!aborted) resolveBody()\n })\n req.on(\"error\", err => rejectBody(err))\n }).catch(() => undefined)\n if (aborted) return\n try {\n await mkdir(dir, { recursive: true })\n await writeFile(target, Buffer.concat(chunks))\n reply(200, { path: target, bytes: total })\n } catch (err) {\n reply(500, {\n error: \"write_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n }\n }\n\n // Permissive CORS for the loopback gateway. The Guilde web app\n // (localhost:3041) probes /health from the browser; without these\n // headers the browser blocks the response and the panel says\n // \"not reachable\" even though curl works. Auth still gates the\n // sensitive routes — this just lifts the cross-origin block.\n //\n // Private Network Access (Chrome 105+): when an HTTPS page like\n // https://guilde.work fetches a loopback URL, Chrome sends a\n // preflight with `Access-Control-Request-Private-Network: true`.\n // Without `Access-Control-Allow-Private-Network: true` in the\n // response, the browser blocks the actual GET. Mirror the flag\n // when the request asked for it.\n function applyCors(req: IncomingMessage, res: ServerResponse): void {\n const origin = (req.headers.origin as string | undefined) ?? \"*\"\n res.setHeader(\"Access-Control-Allow-Origin\", origin)\n res.setHeader(\"Vary\", \"Origin\")\n res.setHeader(\"Access-Control-Allow-Credentials\", \"true\")\n res.setHeader(\n \"Access-Control-Allow-Headers\",\n req.headers[\"access-control-request-headers\"] ??\n \"authorization,content-type,mcp-session-id\",\n )\n res.setHeader(\n \"Access-Control-Allow-Methods\",\n \"GET,POST,PUT,PATCH,DELETE,OPTIONS\",\n )\n if (req.headers[\"access-control-request-private-network\"] === \"true\") {\n res.setHeader(\"Access-Control-Allow-Private-Network\", \"true\")\n }\n }\n\n const server: Server = createServer((req, res) => {\n void (async () => {\n try {\n const url = req.url ?? \"/\"\n const path = url.split(\"?\")[0] ?? \"/\"\n // Diagnostic: emit forwarded requests (those carrying XFF) onto\n // the events stream so /events tailers can see what cloudflared\n // actually sends. Loopback-only traffic stays quiet to avoid\n // flooding subscribers during normal local use.\n if (req.headers[\"x-forwarded-for\"]) {\n opts.events.emit({\n type: \"remote-log\",\n at: new Date().toISOString(),\n line: `[http-in] ${req.method} ${url} host=${req.headers.host ?? \"?\"} xff=${String(req.headers[\"x-forwarded-for\"])}`,\n })\n }\n\n applyCors(req, res)\n if (req.method === \"OPTIONS\") {\n res.writeHead(204)\n res.end()\n return\n }\n\n if (path === \"/health\" && req.method === \"GET\") {\n handleHealth(req, res)\n return\n }\n if (path === \"/events\" && req.method === \"GET\") {\n handleEvents(req, res)\n return\n }\n if (path === \"/mcp\") {\n await handleMcp(req, res)\n return\n }\n if (path === \"/conversations\" && req.method === \"GET\") {\n await handleListConversations(req, res)\n return\n }\n if (path.startsWith(\"/conversations/\") && req.method === \"GET\") {\n const id = path.slice(\"/conversations/\".length)\n await handleGetConversation(req, res, id)\n return\n }\n if (path === \"/heartbeat/tick\" && req.method === \"POST\") {\n await handleHeartbeatTick(req, res)\n return\n }\n\n if (path === \"/files/upload\" && req.method === \"POST\") {\n // Same auth gate as the mutating /sessions/* routes — drive-by\n // HTTP shouldn't be able to write arbitrary files to disk.\n const gate = checkSessionsToken(req)\n if (gate !== \"ok\") {\n rejectUnauthorizedSession(req, res, gate)\n return\n }\n await handleFileUpload(req, res, url)\n return\n }\n\n // Sessions routes — only registered when the gateway was\n // built with a SessionsRegistry. /sessions, /sessions/:id,\n // /sessions/:id/stream (SSE), POST /sessions/:id/kill,\n // DELETE /sessions/:id (forget after exit).\n if (opts.sessions && path.startsWith(\"/sessions\")) {\n if (isMutatingSessionsRoute(req.method ?? \"GET\", path)) {\n const gate = checkSessionsToken(req)\n if (gate !== \"ok\") {\n rejectUnauthorizedSession(req, res, gate)\n return\n }\n }\n const handled = await handleSessions(\n req,\n res,\n path,\n opts.sessions,\n opts.resolveAgentAdapter,\n opts.ptyEnabled === true,\n )\n if (handled) return\n }\n\n if (path === \"/workspaces\" && req.method === \"GET\") {\n // Surface ~/.agentproto/workspaces.json for UIs that\n // want a workspace dropdown (spawn dialog, MCP discovery\n // grouping, etc.). Read-only; mutate via the CLI's\n // `agentproto workspace add/remove/use` verbs.\n try {\n const config = await loadWorkspacesConfig()\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(config))\n } catch (err) {\n res.writeHead(500, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"workspaces_load_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n )\n }\n return\n }\n\n if (path === \"/mcps/imports\" && req.method === \"GET\") {\n const config = await loadImportedMcps()\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(config))\n return\n }\n if (path === \"/mcps/imports\" && req.method === \"POST\") {\n const body = (await readJsonBody(req)) as {\n sourceMcpId?: string\n alias?: string\n } | null\n if (!body || typeof body.sourceMcpId !== \"string\") {\n res.writeHead(400, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"missing_sourceMcpId\" }))\n return\n }\n const discovered = await discoverMcps()\n const snapshot = discovered.find(d => d.id === body.sourceMcpId)\n if (!snapshot) {\n res.writeHead(404, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"discovered_mcp_not_found\",\n sourceMcpId: body.sourceMcpId,\n })\n )\n return\n }\n const cfg = await loadImportedMcps()\n const next = addImport(cfg, {\n snapshot,\n ...(body.alias ? { alias: body.alias } : {}),\n })\n await saveImportedMcps(next)\n res.writeHead(201, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(next.imports.find(e => e.id === snapshot.id)))\n return\n }\n const importMatch = path.match(/^\\/mcps\\/imports\\/(.+)$/)\n if (importMatch && req.method === \"DELETE\") {\n // The id is URL-encoded since it contains colons + slashes\n // (e.g. claude-code:project:/path:name).\n const id = decodeURIComponent(importMatch[1] ?? \"\")\n const cfg = await loadImportedMcps()\n if (!cfg.imports.some(e => e.id === id)) {\n res.writeHead(404, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"import_not_found\", id }))\n return\n }\n await saveImportedMcps(removeImport(cfg, id))\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ ok: true, id }))\n return\n }\n\n if (path === \"/mcps/discovered\" && req.method === \"GET\") {\n // No host wiring needed — the scanner reads\n // ~/.claude.json + ~/.cursor/mcp.json + goose config\n // directly. Always available; cheap (~5ms typical).\n try {\n const mcps = await discoverMcps()\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ mcps }))\n } catch (err) {\n res.writeHead(500, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"discovery_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n )\n }\n return\n }\n\n // Browser-friendly proxy surface — same operations the MCP\n // tools expose (mcp_imported_status / list_tools / call) but\n // over plain HTTP so the /providers/mcp page can render them\n // without embedding an MCP client.\n if (path === \"/mcps/proxy/status\" && req.method === \"GET\") {\n if (!opts.mcpProxy) {\n res.writeHead(501, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"mcp_proxy_not_configured\" }))\n return\n }\n try {\n const imports = await opts.mcpProxy.listAliases()\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ imports }))\n } catch (err) {\n res.writeHead(500, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"proxy_status_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n )\n }\n return\n }\n const proxyToolsMatch = path.match(/^\\/mcps\\/proxy\\/tools\\/(.+)$/)\n if (proxyToolsMatch && req.method === \"GET\") {\n if (!opts.mcpProxy) {\n res.writeHead(501, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"mcp_proxy_not_configured\" }))\n return\n }\n const alias = decodeURIComponent(proxyToolsMatch[1] ?? \"\")\n const out = await opts.mcpProxy.listTools(alias)\n res.writeHead(out.ok ? 200 : 502, {\n \"content-type\": \"application/json\",\n })\n res.end(JSON.stringify(out))\n return\n }\n if (path === \"/mcps/proxy/call\" && req.method === \"POST\") {\n if (!opts.mcpProxy) {\n res.writeHead(501, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"mcp_proxy_not_configured\" }))\n return\n }\n const body = (await readJsonBody(req)) as {\n alias?: unknown\n toolName?: unknown\n args?: unknown\n } | null\n if (\n !body ||\n typeof body.alias !== \"string\" ||\n typeof body.toolName !== \"string\"\n ) {\n res.writeHead(400, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"invalid_body\",\n message: \"expected { alias, toolName, args? }\",\n })\n )\n return\n }\n const result = await opts.mcpProxy.callTool(\n body.alias,\n body.toolName,\n body.args ?? {}\n )\n res.writeHead(result.ok ? 200 : 502, {\n \"content-type\": \"application/json\",\n })\n res.end(JSON.stringify(result))\n return\n }\n\n if (path === \"/adapters\" && req.method === \"GET\") {\n if (!opts.listAgentAdapters) {\n res.writeHead(501, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"lister_not_configured\",\n message:\n \"Daemon was started without `listAgentAdapters` — see \" +\n \"@agentproto/cli's `listInstalledAdapters` for the canonical impl.\",\n })\n )\n return\n }\n try {\n const adapters = await opts.listAgentAdapters()\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ adapters }))\n } catch (err) {\n res.writeHead(500, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"list_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n )\n }\n return\n }\n\n res.writeHead(404, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"not_found\", path }))\n } catch (err) {\n if (!res.headersSent) {\n res.writeHead(500, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"internal_error\",\n message: err instanceof Error ? err.message : String(err),\n }),\n )\n }\n }\n })()\n })\n\n // ── WebSocket upgrade: /sessions/:id/pty ──\n // Single WSS bound to the HTTP server's `upgrade` event. Connections\n // are accepted only when the SessionsRegistry is wired AND PTY\n // support is advertised. Frames are JSON-encoded over text WS\n // messages (binary mode is a future optimization — JSON keeps\n // wireshark/devtools debuggable):\n // server → client: {kind:\"data\", b64:\"...\"}\n // server → client: {kind:\"exit\", exitCode:0, signal?:1}\n // client → server: {kind:\"input\", b64:\"...\"} (or {kind:\"input\", text:\"...\"})\n // client → server: {kind:\"resize\", cols:80, rows:24}\n // client → server: {kind:\"ping\"} (no-op keepalive)\n const wss = new WebSocketServer({ noServer: true })\n server.on(\"upgrade\", (req, socket, head) => {\n const url = req.url ?? \"/\"\n const path = url.split(\"?\")[0] ?? \"/\"\n const ptyMatch = path.match(/^\\/sessions\\/([^/]+)\\/pty$/)\n if (!ptyMatch) {\n socket.destroy()\n return\n }\n if (!opts.sessions || opts.ptyEnabled !== true) {\n rejectUpgrade(socket, 501, \"pty_not_configured\")\n return\n }\n // Per-boot token gate, no loopback bypass — see comment on\n // checkSessionsToken for why.\n const gate = checkSessionsToken(req)\n if (gate !== \"ok\") {\n rejectUpgrade(socket, 401, gate === \"missing\" ? \"missing_token\" : \"bad_token\")\n return\n }\n const id = ptyMatch[1]\n if (!id) {\n rejectUpgrade(socket, 400, \"missing_id\")\n return\n }\n // Resolve id-or-name BEFORE upgrading so a typo returns a clean\n // 404 instead of a successful WS that immediately closes.\n const desc = opts.sessions.findByIdOrName(id)\n if (!desc) {\n rejectUpgrade(socket, 404, \"session_not_found\")\n return\n }\n if (desc.pty !== true) {\n rejectUpgrade(socket, 400, \"session_not_pty\")\n return\n }\n // A descriptor for an exited/killed/error session lives on as\n // history — its PTY child is gone. Reject the upgrade with a\n // clear reason so the CLI/web client can suggest `restart`\n // instead of letting the user see a generic 1011 mid-attach.\n if (\n desc.status === \"exited\" ||\n desc.status === \"killed\" ||\n desc.status === \"error\"\n ) {\n rejectUpgrade(\n socket,\n 410,\n `session_${desc.status}`,\n `Session ${desc.id}${desc.name ? ` (${desc.name})` : \"\"} has ${desc.status}. ` +\n `Spawn a fresh one with: agentproto sessions restart ${desc.name ?? desc.id}`,\n )\n return\n }\n wss.handleUpgrade(req, socket, head, ws => {\n handlePtyWebSocket(ws, req, desc.id, opts.sessions!)\n })\n })\n\n const bind = opts.bind ?? \"127.0.0.1\"\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject)\n server.listen(opts.port, bind, () => resolve())\n })\n\n return {\n url: `http://${bind}:${opts.port}`,\n async stop() {\n // Per-request transports/servers are torn down on `res.close`,\n // so we only need to stop the HTTP listener here. The WSS is\n // bound `noServer:true` so closing the HTTP server also tears\n // down its underlying TCP socket; live WS connections receive\n // a close frame from the kernel.\n wss.close()\n await new Promise<void>((resolve) => server.close(() => resolve()))\n },\n }\n}\n\n/**\n * Reject an HTTP upgrade attempt with a structured plaintext body.\n * `ws.handleUpgrade` is meant to be the success path — if we can't\n * accept the upgrade we write a minimal HTTP response and destroy\n * the socket, matching ws's own internal error path.\n */\nfunction rejectUpgrade(\n socket: Duplex,\n status: number,\n reason: string,\n message?: string,\n): void {\n const reasonText = `${status} ${reason}`\n const body: { error: string; message?: string } = { error: reason }\n if (message) body.message = message\n try {\n socket.write(\n `HTTP/1.1 ${reasonText}\\r\\n` +\n `Content-Type: application/json\\r\\n` +\n `Connection: close\\r\\n\\r\\n` +\n JSON.stringify(body) +\n `\\n`,\n )\n } catch {\n // socket already gone — fall through\n }\n socket.destroy()\n}\n\n/**\n * Per-connection WS handler for /sessions/:id/pty. Attaches as a\n * subscriber to the SessionsRegistry; bridges JSON frames in both\n * directions. Per-subscriber backpressure: if the WS's `bufferedAmount`\n * exceeds a threshold, the next chunk is dropped (slow client must\n * not stall the daemon's fan-out to other subscribers).\n */\nfunction handlePtyWebSocket(\n ws: WebSocket,\n req: IncomingMessage,\n sessionId: string,\n registry: SessionsRegistry,\n): void {\n // Parse cols/rows from the query string for the initial dimension\n // hint. Real clients will send a {kind:\"resize\"} immediately after\n // connecting; this seeds the registry's min-size calculation so the\n // first replay frames render at a sensible width if no resize comes.\n const query = new URLSearchParams(\n (req.url ?? \"\").includes(\"?\") ? (req.url ?? \"\").split(\"?\")[1] : \"\",\n )\n const cols = clampPositiveInt(query.get(\"cols\"), 80)\n const rows = clampPositiveInt(query.get(\"rows\"), 24)\n\n // Backpressure threshold — when the socket has more than 256 KiB\n // queued, drop the next data frame for THIS subscriber rather than\n // letting the registry block on send. Other subscribers stay live.\n const BACKPRESSURE_BYTES = 256 * 1024\n\n const handle = registry.attachPty(\n sessionId,\n { cols, rows },\n chunk => {\n if (ws.readyState !== ws.OPEN) return\n if (ws.bufferedAmount > BACKPRESSURE_BYTES) return // drop\n ws.send(\n JSON.stringify({ kind: \"data\", b64: chunk.toString(\"base64\") }),\n )\n },\n evt => {\n if (ws.readyState !== ws.OPEN) return\n ws.send(\n JSON.stringify({\n kind: \"exit\",\n exitCode: evt.exitCode,\n ...(evt.signal != null ? { signal: evt.signal } : {}),\n }),\n )\n // Close ourselves once we've emitted exit — the session can be\n // reattached for a buffer replay but this socket is done.\n try {\n ws.close(1000, \"session exited\")\n } catch {\n // ignore\n }\n },\n )\n\n if (!handle) {\n // Race: the session may have vanished between the upgrade and\n // attach. Close politely.\n try {\n ws.close(1011, \"session not attachable\")\n } catch {\n // ignore\n }\n return\n }\n\n ws.on(\"message\", (raw, isBinary) => {\n if (isBinary) {\n // Binary frames not supported yet — wire format is JSON-only.\n return\n }\n let frame: unknown\n try {\n frame = JSON.parse(raw.toString(\"utf8\"))\n } catch {\n return // malformed\n }\n if (!frame || typeof frame !== \"object\") return\n const f = frame as Record<string, unknown>\n switch (f.kind) {\n case \"input\": {\n // Accept either {text} (UTF-8) or {b64} (arbitrary bytes,\n // useful for clients sending raw key sequences).\n if (typeof f.text === \"string\") {\n handle.write(f.text)\n } else if (typeof f.b64 === \"string\") {\n try {\n handle.write(Buffer.from(f.b64, \"base64\").toString(\"utf8\"))\n } catch {\n // ignore malformed base64\n }\n }\n break\n }\n case \"resize\": {\n const c =\n typeof f.cols === \"number\" && f.cols > 0 ? Math.floor(f.cols) : null\n const r =\n typeof f.rows === \"number\" && f.rows > 0 ? Math.floor(f.rows) : null\n if (c && r) handle.resize(c, r)\n break\n }\n case \"ping\":\n // Reply with pong so client keepalive logic works. Optional.\n try {\n ws.send(JSON.stringify({ kind: \"pong\" }))\n } catch {\n // ignore\n }\n break\n // Unknown kinds silently dropped; reserved for forward compat.\n }\n })\n\n ws.on(\"close\", () => {\n handle.detach()\n })\n ws.on(\"error\", () => {\n handle.detach()\n })\n}\n\nfunction clampPositiveInt(raw: string | null, fallback: number): number {\n if (!raw) return fallback\n const n = Number.parseInt(raw, 10)\n return Number.isFinite(n) && n > 0 ? n : fallback\n}\n\nfunction clampInt(\n raw: string | null,\n fallback: number,\n min: number,\n max: number,\n): number {\n if (!raw) return fallback\n const n = Number.parseInt(raw, 10)\n if (!Number.isFinite(n)) return fallback\n if (n < min) return min\n if (n > max) return max\n return n\n}\n\n/**\n * /sessions routes — split out of the main switch so the surface\n * stays scannable. Returns `true` when it handled the request, so\n * the dispatcher knows to skip the 404 path.\n *\n * GET /sessions → list of SessionDescriptor[]\n * GET /sessions/:id → one SessionDescriptor\n * GET /sessions/:id/stream → SSE stream {line,stream} events\n * POST /sessions/:id/kill → SIGTERM, returns {ok}\n * DELETE /sessions/:id → forget (drop from registry; only\n * valid for exited/killed/error)\n */\nasync function handleSessions(\n req: IncomingMessage,\n res: ServerResponse,\n path: string,\n registry: SessionsRegistry,\n resolveAgentAdapter?: AgentAdapterResolver,\n ptyEnabled = false,\n): Promise<boolean> {\n const json = (status: number, body: unknown): void => {\n res.writeHead(status, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(body))\n }\n\n if (path === \"/sessions\" && req.method === \"GET\") {\n json(200, { sessions: registry.list() })\n return true\n }\n\n // Long-running agent session — spawn via the cli's adapter\n // resolver, hold across multiple turns. Body shape:\n // {adapter: \"claude-code\"|\"hermes\"|...,\n // workspaceSlug, cwd, prompt?, label?}\n if (path === \"/sessions/agent\" && req.method === \"POST\") {\n if (!resolveAgentAdapter) {\n json(501, {\n error: \"agent_resolver_not_configured\",\n message:\n \"POST /sessions/agent needs the host to inject `resolveAgentAdapter` \" +\n \"(e.g. via @agentproto/cli's resolveAdapter shim).\",\n })\n return true\n }\n const body = await readJsonBody(req)\n if (!body || typeof body !== \"object\") {\n json(400, { error: \"invalid_body\" })\n return true\n }\n const b = body as Record<string, unknown>\n const adapter = typeof b.adapter === \"string\" ? b.adapter : \"\"\n if (!adapter) {\n json(400, { error: \"missing_adapter\" })\n return true\n }\n // cwd resolution priority:\n // 1. explicit `cwd` in the body\n // 2. lookup `workspaceSlug` in ~/.agentproto/workspaces.json\n // 3. active workspace from the same config\n // 4. process.cwd() (last resort, almost certainly not what\n // the user wants — log it so the operator notices)\n let cwd: string | null =\n typeof b.cwd === \"string\" && b.cwd.length > 0 ? b.cwd : null\n let workspaceSlug =\n typeof b.workspaceSlug === \"string\" ? b.workspaceSlug : \"\"\n if (!cwd) {\n try {\n const config = await loadWorkspacesConfig()\n const ws = workspaceSlug\n ? findWorkspace(config, workspaceSlug)\n : getActiveWorkspace(config)\n if (ws) {\n cwd = ws.path\n workspaceSlug = ws.slug\n }\n } catch {\n // Config missing / unreadable — fall through to process.cwd()\n }\n }\n if (!cwd) {\n cwd = process.cwd()\n console.warn(\n `[/sessions/agent] no cwd resolvable for adapter=${adapter} ` +\n `(no body.cwd, no workspaceSlug match in ~/.agentproto/workspaces.json, ` +\n `no active workspace) — falling back to daemon's cwd ${cwd}`\n )\n }\n if (!workspaceSlug) workspaceSlug = \"default\"\n const resolved = await resolveAgentAdapter(adapter)\n if (!resolved) {\n json(404, { error: \"adapter_not_found\", adapter })\n return true\n }\n try {\n const resumeSessionId =\n typeof b.resumeSessionId === \"string\" && b.resumeSessionId.length > 0\n ? b.resumeSessionId\n : undefined\n const agentSession = await resolved.startSession({\n cwd,\n ...(resumeSessionId ? { resumeSessionId } : {}),\n })\n const desc = registry.spawnAgent({\n workspaceSlug,\n cwd,\n agentSession,\n adapterSlug: adapter,\n ...(typeof b.prompt === \"string\" ? { initialPrompt: b.prompt } : {}),\n ...(typeof b.label === \"string\" ? { label: b.label } : {}),\n ...(resolved.commandPreview\n ? { commandPreview: resolved.commandPreview }\n : {}),\n })\n json(201, desc)\n } catch (err) {\n json(500, {\n error: \"agent_spawn_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n }\n return true\n }\n\n // Long-running PTY session — spawn argv under node-pty. Bytes flow\n // through the registry's byte ring buffer; attach via the WebSocket\n // upgrade at /sessions/:id/pty. Body shape:\n // {argv: string[], cwd?, workspaceSlug?, cols, rows, env?, name?, label?}\n if (path === \"/sessions/terminal\" && req.method === \"POST\") {\n if (!ptyEnabled) {\n json(501, {\n error: \"pty_not_configured\",\n message:\n \"POST /sessions/terminal needs the host to inject `spawnPty` into createGateway \" +\n \"(node-pty optional dep — install in @agentproto/cli).\",\n })\n return true\n }\n const body = await readJsonBody(req)\n if (!body || typeof body !== \"object\") {\n json(400, { error: \"invalid_body\" })\n return true\n }\n const b = body as Record<string, unknown>\n const argv = Array.isArray(b.argv)\n ? (b.argv as unknown[]).filter((v): v is string => typeof v === \"string\")\n : []\n if (argv.length === 0) {\n json(400, { error: \"missing_argv\" })\n return true\n }\n const cols = typeof b.cols === \"number\" && b.cols > 0 ? Math.floor(b.cols) : 80\n const rows = typeof b.rows === \"number\" && b.rows > 0 ? Math.floor(b.rows) : 24\n // cwd resolution mirrors /sessions/agent exactly.\n let cwd: string | null =\n typeof b.cwd === \"string\" && b.cwd.length > 0 ? b.cwd : null\n let workspaceSlug =\n typeof b.workspaceSlug === \"string\" ? b.workspaceSlug : \"\"\n if (!cwd) {\n try {\n const config = await loadWorkspacesConfig()\n const ws = workspaceSlug\n ? findWorkspace(config, workspaceSlug)\n : getActiveWorkspace(config)\n if (ws) {\n cwd = ws.path\n workspaceSlug = ws.slug\n }\n } catch {\n // fall through to process.cwd()\n }\n }\n if (!cwd) {\n cwd = process.cwd()\n console.warn(\n `[/sessions/terminal] no cwd resolvable for argv=${argv.join(\" \")} ` +\n `— falling back to daemon's cwd ${cwd}`\n )\n }\n if (!workspaceSlug) workspaceSlug = \"default\"\n try {\n const desc = registry.spawnPty({\n argv,\n cwd,\n workspaceSlug,\n cols,\n rows,\n ...(b.env && typeof b.env === \"object\"\n ? { env: b.env as Record<string, string> }\n : {}),\n ...(typeof b.name === \"string\" ? { name: b.name } : {}),\n ...(typeof b.label === \"string\" ? { label: b.label } : {}),\n })\n json(201, desc)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n const status = msg.includes(\"already in use\")\n ? 409\n : msg.includes(\"no PTY factory\")\n ? 501\n : 500\n json(status, { error: \"pty_spawn_failed\", message: msg })\n }\n return true\n }\n\n // Send a follow-up turn to a live agent session.\n // Body: { prompt: string | ContentBlock | ContentBlock[] }\n // - string → auto-wrapped to a single text block by\n // the registry (legacy / convenience).\n // - ContentBlock → e.g. `{type:\"image\", source:{...}}`\n // - ContentBlock[] → text + image mix for multimodal turns.\n // Forwarded as-is to `agentSession.send`\n // so the adapter (claude-agent-acp, …)\n // negotiates its own content shape.\n //\n // Validation is intentionally loose — we accept anything object-\n // shaped + non-empty arrays + non-empty strings. The adapter will\n // reject ill-formed blocks with a clear error projected into the\n // session's ring buffer; throwing here would just duplicate that.\n //\n // Query: ?wait=false → fire-and-forget (return 202 after sync\n // validation; output streams via /sessions/:id/stream). Default\n // wait=true keeps the call blocking until the turn drains, which\n // is what curl scripts + the MCP bridge expect.\n const promptMatch = path.match(/^\\/sessions\\/([^/]+)\\/prompt$/)\n if (promptMatch && req.method === \"POST\") {\n const id = promptMatch[1]\n if (!id) return false\n const body = await readJsonBody(req)\n const prompt = (body as { prompt?: unknown } | null)?.prompt\n const validPrompt =\n (typeof prompt === \"string\" && prompt.length > 0) ||\n (Array.isArray(prompt) &&\n prompt.length > 0 &&\n prompt.every(b => b !== null && typeof b === \"object\")) ||\n (prompt !== null && typeof prompt === \"object\" && !Array.isArray(prompt))\n if (!validPrompt) {\n json(400, {\n error: \"missing_prompt\",\n message:\n \"Body `prompt` must be a non-empty string, a content block object, or an array of content blocks.\",\n })\n return true\n }\n const reqUrl = req.url ?? \"\"\n const queryString = reqUrl.includes(\"?\")\n ? reqUrl.slice(reqUrl.indexOf(\"?\") + 1)\n : \"\"\n const wait = new URLSearchParams(queryString).get(\"wait\")\n const fireAndForget = wait === \"false\" || wait === \"0\"\n try {\n if (fireAndForget) {\n registry.enqueuePrompt(id, prompt)\n json(202, { ok: true, id, queued: true })\n } else {\n await registry.sendPrompt(id, prompt)\n json(200, { ok: true, id })\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n // Differentiate \"not found\" / \"wrong kind\" / \"busy\" — they\n // surface as readable thrown messages from the registry.\n const status = msg.includes(\"no session\")\n ? 404\n : msg.includes(\"not an agent\")\n ? 400\n : msg.includes(\"mid-turn\")\n ? 409\n : 500\n json(status, { error: \"send_prompt_failed\", message: msg })\n }\n return true\n }\n\n if (path === \"/sessions\" && req.method === \"POST\") {\n const body = await readJsonBody(req)\n if (!body || typeof body !== \"object\") {\n json(400, { error: \"invalid_body\" })\n return true\n }\n const b = body as Record<string, unknown>\n const argv = Array.isArray(b.argv)\n ? (b.argv as unknown[]).filter((v): v is string => typeof v === \"string\")\n : []\n if (argv.length === 0) {\n json(400, { error: \"missing_argv\" })\n return true\n }\n try {\n const desc = registry.spawn({\n kind:\n b.kind === \"terminal\" || b.kind === \"agent-cli\" || b.kind === \"command\"\n ? b.kind\n : \"command\",\n workspaceSlug:\n typeof b.workspaceSlug === \"string\" ? b.workspaceSlug : \"default\",\n cwd: typeof b.cwd === \"string\" ? b.cwd : process.cwd(),\n argv,\n env:\n b.env && typeof b.env === \"object\"\n ? (b.env as Record<string, string>)\n : undefined,\n label: typeof b.label === \"string\" ? b.label : undefined,\n })\n json(201, desc)\n } catch (err) {\n json(500, {\n error: \"spawn_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n }\n return true\n }\n\n // Per-id routes. The `:id` slot also accepts a session's `name`\n // when one was set at spawn time — `findByIdOrName` resolves both\n // and the rest of the handler operates on the canonical id.\n const idMatch = path.match(\n /^\\/sessions\\/([^/]+)(\\/stream|\\/kill|\\/preview)?$/,\n )\n if (!idMatch) return false\n const [, rawIdOrName, suffix] = idMatch\n if (!rawIdOrName) return false\n const resolvedDesc = registry.findByIdOrName(rawIdOrName)\n const id = resolvedDesc?.id ?? rawIdOrName\n\n if (suffix === \"/preview\" && req.method === \"GET\") {\n // Read-only snapshot of the recent ring buffer — used by the\n // dashboard's detail pane so the user sees what the session was\n // doing without committing to an attach. Returns BOTH lines\n // (for agent-cli/command sessions) and recent-bytes (for PTY).\n // Caller picks whichever is populated.\n if (!resolvedDesc) {\n json(404, { error: \"session_not_found\", id: rawIdOrName })\n return true\n }\n const reqUrl = req.url ?? \"\"\n const qs = new URLSearchParams(\n reqUrl.includes(\"?\") ? reqUrl.slice(reqUrl.indexOf(\"?\") + 1) : \"\",\n )\n const lineCap = clampInt(qs.get(\"lines\"), 10, 1, 200)\n const byteCap = clampInt(qs.get(\"bytes\"), 16 * 1024, 256, 64 * 1024)\n // No registry method exists for \"give me the recent buffer\n // snapshot\" — readTerminalOutput is the closest. For non-PTY\n // sessions, attach with a no-op subscriber, read backfill,\n // detach. Cheap; the backfill is synchronous on attach.\n const lines: string[] = []\n if (resolvedDesc.pty !== true) {\n const unsub = registry.attach(id, line => {\n lines.push(line)\n })\n if (unsub) unsub()\n }\n const bufBytes = registry.readTerminalOutput(id, byteCap)\n json(200, {\n id: resolvedDesc.id,\n lines: lines.slice(-lineCap),\n bytes: bufBytes ? bufBytes.toString(\"base64\") : null,\n })\n return true\n }\n\n if (suffix === \"/stream\" && req.method === \"GET\") {\n if (!resolvedDesc) {\n json(404, { error: \"session_not_found\", id: rawIdOrName })\n return true\n }\n res.writeHead(200, {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n })\n // Keep-alive ping every 25s — proxies / browsers eventually\n // close idle SSE connections; the comment line keeps the pipe\n // warm without confusing the EventSource parser (it ignores\n // anything starting with `:`).\n const ping = setInterval(() => {\n try {\n res.write(`: keep-alive\\n\\n`)\n } catch {\n clearInterval(ping)\n }\n }, 25_000)\n const unsub = registry.attach(id, (line, stream) => {\n try {\n res.write(\n `data: ${JSON.stringify({ line, stream })}\\n\\n`\n )\n } catch {\n // Client gone — cleanup happens on `close`.\n }\n })\n if (!unsub) {\n clearInterval(ping)\n res.end()\n return true\n }\n req.once(\"close\", () => {\n unsub()\n clearInterval(ping)\n })\n return true\n }\n\n if (suffix === \"/kill\" && req.method === \"POST\") {\n const ok = registry.kill(id)\n json(ok ? 200 : 404, { ok, id })\n return true\n }\n\n if (!suffix && req.method === \"GET\") {\n if (!resolvedDesc) {\n json(404, { error: \"session_not_found\", id: rawIdOrName })\n return true\n }\n json(200, resolvedDesc)\n return true\n }\n\n if (!suffix && req.method === \"DELETE\") {\n const ok = registry.forget(id)\n json(ok ? 200 : 404, { ok, id })\n return true\n }\n\n return false\n}\n\nasync function readJsonBody(req: IncomingMessage): Promise<unknown> {\n const chunks: Buffer[] = []\n for await (const chunk of req) {\n chunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk)\n }\n if (chunks.length === 0) return null\n try {\n return JSON.parse(Buffer.concat(chunks).toString(\"utf8\"))\n } catch {\n return null\n }\n}\n","/**\n * Per-adapter resume strategies — the daemon's view of \"how do I\n * continue a previous session for THIS adapter?\".\n *\n * The driver already has an `AgentCliContinuation` declaration in\n * the adapter manifest (AIP-45). That covers strategy NAMES\n * (`native-resume`, `pinned-session`, `transcript`, `none`) but is\n * silent on the mechanics that live OUTSIDE the runtime — like\n * \"where on disk does this adapter store its conversations?\" or\n * \"what argv do I pass to resume into PTY mode?\".\n *\n * This table is that practical bridge. Each entry declares three\n * optional hooks:\n *\n * outputHint regex matched against each output line; group 1 is\n * the resume id. Stored as `desc.resumeMetadata[storeAs]`.\n * fsProbe async function that probes a per-adapter directory\n * for a stored session id, scoped to a workspace cwd.\n * Used when `outputHint` never matched.\n * spawnArgs given a captured id, returns the argv to spawn a\n * PTY that resumes the session. agentproto then\n * bypasses ACP/agent-cli and runs the provider\n * directly — the most reliable resume path because\n * it leans on the provider's native UX.\n *\n * Adapters that don't declare anything here fall back to:\n * 1. ACP-level resume via `resumeSessionId` on POST /sessions/agent\n * 2. Fresh spawn (same shape, no continuity)\n *\n * Eventually each adapter should ship its own strategy on\n * `AgentCliHandle.resumeStrategy` (driver-side). This central table\n * is the bootstrap: it lets a new adapter become resume-capable\n * without bumping its npm package; once that lands, entries\n * graduate into the adapter packages.\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { join, resolve } from \"node:path\"\n\n/** Where on disk the resume id ends up on the session descriptor. */\nexport type ResumeMetadataKey =\n | \"claudeResumeId\"\n | \"hermesResumeId\"\n | \"codexResumeId\"\n | \"openClawResumeId\"\n | \"openCodeResumeId\"\n\nexport interface ResumeStrategy {\n /** When set, run on every output line for this adapter. Group 1\n * captures the resume id. The match is saved on the descriptor\n * as `resumeMetadata[storeAs]`. */\n outputHint?: RegExp\n /** Where the matched id is recorded on the descriptor. */\n storeAs: ResumeMetadataKey\n /** Probe the adapter's on-disk session store for the most-recently\n * modified session in the given workspace. Returns the resume id\n * or null when nothing eligible. Files older than `prevStartedAt`\n * are ignored (avoids resuming an unrelated prior conversation).\n *\n * Skip when the adapter doesn't persist sessions externally. */\n fsProbe?(cwd: string, prevStartedAt: string): Promise<string | null>\n /** Return the argv to spawn a PTY that resumes into the given id.\n * When omitted, the daemon falls back to ACP-level resume via\n * the agent-cli protocol instead of the provider's native CLI. */\n spawnArgs?(id: string): string[]\n}\n\nexport const RESUME_STRATEGIES: Record<string, ResumeStrategy> = {\n \"claude-code\": {\n // Printed by claude on graceful exit when session persistence\n // is on (default). Example: `claude --resume 0e483f81-1a44-4bec-9667-b37158450296`\n outputHint: /claude\\s+--resume\\s+([0-9a-f-]{8,})/i,\n storeAs: \"claudeResumeId\",\n fsProbe: probeMtimeLatestJsonl(\".claude/projects\"),\n spawnArgs: id => [\"claude\", \"--resume\", id],\n },\n\n // Stubs for other shipped adapters — fill in as we learn each\n // provider's resume mechanism. Today they fall back to ACP-level\n // resume (whatever the agent-cli runtime supports) or fresh spawn.\n //\n // hermes: { storeAs: \"hermesResumeId\", ... }\n // codex: { storeAs: \"codexResumeId\", ... }\n // openclaw: { storeAs: \"openClawResumeId\", ... }\n // opencode: { storeAs: \"openCodeResumeId\", ... }\n}\n\n/**\n * Build an `fsProbe` for adapters that store one `.jsonl` per session\n * inside `~/<storeRel>/<cwd-encoded>/`. The encoded cwd is the\n * absolute path with `/` → `-` (claude's convention; others tend to\n * use the same scheme). Returns the UUID of the most-recently\n * modified `.jsonl`, filtered to files at-or-after `prevStartedAt`.\n */\nfunction probeMtimeLatestJsonl(\n storeRel: string,\n): (cwd: string, prevStartedAt: string) => Promise<string | null> {\n return async (cwd, prevStartedAt) => {\n const encoded = cwd.replace(/\\//g, \"-\")\n const dir = resolve(homedir(), storeRel, encoded)\n let entries: string[]\n try {\n entries = await fs.readdir(dir)\n } catch {\n return null\n }\n const jsonl = entries.filter(e => e.endsWith(\".jsonl\"))\n if (jsonl.length === 0) return null\n const startedAtMs = Date.parse(prevStartedAt)\n const candidates: { name: string; mtime: number }[] = []\n for (const f of jsonl) {\n try {\n const st = await fs.stat(join(dir, f))\n if (!Number.isFinite(startedAtMs) || st.mtimeMs >= startedAtMs - 1000) {\n candidates.push({ name: f, mtime: st.mtimeMs })\n }\n } catch {\n // ignore unreadable entry\n }\n }\n if (candidates.length === 0) return null\n candidates.sort((a, b) => b.mtime - a.mtime)\n return candidates[0]!.name.replace(/\\.jsonl$/, \"\")\n }\n}\n\n/**\n * Helper: which adapters declare any resume capability? Used by\n * `agentproto sessions restart` to print a helpful \"this adapter\n * doesn't support resume; falling back to fresh spawn\" hint when\n * applicable.\n */\nexport function hasResumeStrategy(adapterSlug: string | undefined): boolean {\n if (!adapterSlug) return false\n const s = RESUME_STRATEGIES[adapterSlug]\n return !!(s && (s.outputHint || s.fsProbe || s.spawnArgs))\n}\n","/**\n * Sessions registry — tracks long-lived child processes spawned by\n * the agentproto daemon (terminals, agent CLIs, custom commands).\n *\n * The registry lives in-memory for the daemon's lifetime; a recent\n * snapshot also persists to `~/.agentproto/sessions.json` so a fresh\n * daemon restart can show \"you had these running before\" instead of\n * losing all visibility on a crash.\n *\n * Each session owns:\n * - identity: id, kind, workspace slug, command + args, started time\n * - lifecycle: status (starting/running/exited/killed/error)\n * - output: last N lines (ring buffer) for instant attach + a\n * Node EventEmitter for live streaming consumers\n *\n * Consumers:\n * - HTTP routes (GET /sessions, /sessions/:id, /sessions/:id/stream,\n * POST /sessions/:id/kill)\n * - CLI `agentproto sessions` (TUI navigation + attach)\n * - guilde-web Active tab (session cards + terminal viewer)\n */\n\nimport { spawn, type ChildProcess } from \"node:child_process\"\nimport { EventEmitter } from \"node:events\"\nimport { mkdirSync, writeFileSync, promises as fs, readFileSync } from \"node:fs\"\nimport { RESUME_STRATEGIES } from \"./resume-strategies.js\"\nimport { dirname, resolve } from \"node:path\"\nimport { homedir } from \"node:os\"\nimport { randomUUID } from \"node:crypto\"\n\n/**\n * Minimal shape we need from a driver-agent-cli session — kept as a\n * structural type so the runtime package doesn't take a hard\n * dependency on @agentproto/driver-agent-cli (the http-server route\n * imports it and passes the constructed session in).\n */\nexport interface AgentSessionLike {\n sessionId: string\n send(message: unknown): AsyncIterable<AgentStreamEvent>\n cancel(): Promise<void>\n close(): Promise<void>\n}\n\n/**\n * Minimal PTY surface — structurally compatible with\n * @agentproto/acp/tunnel's PtyProcess (node-pty's IPty wrapper). The\n * runtime declares its own so this package stays native-free; the\n * cli's pty-factory util constructs values that satisfy both.\n */\nexport interface PtyProcess {\n readonly pid: number\n write(data: string): void\n resize(cols: number, rows: number): void\n kill(signal?: string): void\n onData(handler: (data: string) => void): void\n onExit(handler: (event: { exitCode: number; signal?: number }) => void): void\n}\n\nexport interface PtyFactoryOptions {\n command: string\n args: string[]\n cwd?: string\n env?: Record<string, string>\n cols: number\n rows: number\n}\n\nexport type PtyFactory = (opts: PtyFactoryOptions) => PtyProcess\n\nexport interface AgentStreamEvent {\n kind: string\n text?: string\n toolName?: string\n isError?: boolean\n reason?: string\n error?: { message: string; code?: number; data?: unknown }\n}\n\nexport const SESSIONS_FILE_PATH = (): string =>\n resolve(homedir(), \".agentproto\", \"sessions.json\")\n\nexport type SessionKind = \"terminal\" | \"agent-cli\" | \"command\"\nexport type SessionStatus =\n | \"starting\"\n | \"running\"\n | \"exited\"\n | \"killed\"\n | \"error\"\n\nexport interface SessionDescriptor {\n id: string\n kind: SessionKind\n workspaceSlug: string\n /** What was actually run — quoted joined for display purposes\n * (`bash -lc \"claude --resume xyz\"`). */\n command: string\n pid: number | null\n status: SessionStatus\n startedAt: string\n endedAt?: string\n exitCode?: number\n /** Last time anything was written to stdout/stderr. Lets the UI\n * spot stuck sessions (\"running for 2h, last output 12min ago\"). */\n lastOutputAt?: string\n /** Free-text label the spawner can attach (e.g. conversation id,\n * operator name) so the UI can group/filter. */\n label?: string\n /** True when the session was spawned under a real PTY (node-pty)\n * instead of `child_process.spawn`. PTY sessions carry raw ANSI\n * bytes (alt-screen, key bindings, colors); attach goes through\n * WS /sessions/:id/pty rather than SSE /sessions/:id/stream. */\n pty?: boolean\n /** User-friendly slug supplied at spawn time. Optional; when set,\n * attach/stop/kill commands accept it as an alias for the id. */\n name?: string\n /** Argv that was spawned. Persisted so `agentproto sessions restart`\n * can clone the original shape without re-tokenizing the display\n * `command` string. Empty for agent-cli sessions (we record\n * `adapterSlug` separately). */\n argv?: readonly string[]\n /** Working directory the session was spawned in. Cloned by restart. */\n cwd?: string\n /** Adapter slug for agent-cli sessions — restart uses this with\n * `/sessions/agent` to spin up a fresh ACP runtime. Undefined for\n * pty/command kinds. */\n adapterSlug?: string\n /** ACP-level session id (the adapter's own handle — claude-code's\n * conversation id, hermes' chat id, …). Set at spawnAgent time\n * from `agentSession.sessionId`. Survives across daemon restarts\n * via sessions.json so `restart` can pass it as `resumeSessionId`\n * and reattach to the prior conversation history. */\n adapterSessionId?: string\n /** Provider-specific resume hints sniffed from the session's\n * output. claude-code prints `claude --resume <uuid>` on exit;\n * we capture that uuid as `claudeResumeId`. On `restart`, when a\n * hint is present, agentproto prefers a PTY spawn with the\n * provider's native resume command (`claude --resume <id>`) over\n * the ACP-level resume — works wherever the provider persisted\n * the session, not just when the ACP wrapper did.\n *\n * Keys are adapter-specific so future adapters can add their own\n * (\"hermesResumeId\", etc.) without changing this type. */\n resumeMetadata?: Record<string, string>\n}\n\ninterface SessionRuntime {\n desc: SessionDescriptor\n /** Set when the session is a raw spawn (`kind: \"command\"|\"terminal\"`).\n * Agent sessions don't expose the underlying process — the\n * driver-agent-cli runtime owns it. */\n child?: ChildProcess\n /** Set when the session is an agent-cli (multi-turn). The registry\n * keeps it alive across turns; sendPrompt(id, prompt) re-uses it. */\n agentSession?: AgentSessionLike\n /** Adapter slug — only set for agent sessions, helps the UI render\n * \"claude-code\" / \"hermes\" badges. */\n adapterSlug?: string\n /** Set when the session is a PTY (spawnPty). Bytes flow through\n * pty.onData → recentBytes ring + emitter \"data\" event. */\n pty?: PtyProcess\n /** Per-subscriber size requests for the PTY. Min cols/rows\n * across the live set is what we actually call pty.resize with\n * (mirrors tmux's \"smallest attached client wins\" rule). */\n ptySubscribers?: Map<number, { cols: number; rows: number }>\n /** Ring buffer of recent stdout+stderr lines. Capped so a runaway\n * child can't blow the daemon's heap. */\n recentLines: string[]\n /** Ring buffer of recent PTY bytes for replay-on-attach. Total\n * size capped at RECENT_BYTES_CAP — oldest chunks dropped first. */\n recentBytes: Buffer[]\n recentBytesSize: number\n emitter: EventEmitter\n /** True while a turn is in flight. POST /sessions/:id/prompt rejects\n * with 409 when busy — the agent can only handle one turn at a\n * time per session. */\n busy: boolean\n /** Buffer for partial text-delta fragments — agent text events\n * arrive as chunks, we coalesce them across deltas and split on\n * newlines so each line lands as a discrete ring-buffer entry. */\n textBuf: string\n /** Same as textBuf but for `thought` events. Some agents (hermes)\n * stream chain-of-thought as one delta per token, which made the\n * ring buffer unreadable when each token got its own\n * `[thought]` line — coalesce the same way text-delta does. */\n thoughtBuf: string\n /** In-flight resume promise. Deduplicates concurrent prompt\n * attempts on a dead agent session — only one resume call hits\n * the adapter, the rest await this promise. Cleared once\n * resolved (success or failure). */\n resumePromise?: Promise<void>\n}\n\nconst RECENT_LINES_CAP = 500\nconst RECENT_BYTES_CAP = 64 * 1024\nconst PERSIST_DEBOUNCE_MS = 1_500\n/** Cap on the number of historical descriptors loaded from\n * sessions.json at boot. Older entries (by startedAt) are dropped\n * on overflow — newest history wins. Adjust upward if the file\n * starts feeling sparse; downward if the dashboard takes too long\n * to render. */\nconst HISTORY_CAP = 200\n\n/** Strip CSI / SGR ANSI sequences so resume-pattern matching works\n * on dim/coloured output. Liberal regex covering most cases — we\n * don't need byte-perfect parsing here. */\nfunction stripAnsiCodes(s: string): string {\n return s.replace(/\\x1b\\[[0-9;?]*[A-Za-z]/g, \"\")\n}\n\nexport interface SessionsRegistry {\n spawn(input: SpawnSessionInput): SessionDescriptor\n /** Adopt a ChildProcess that was spawned outside the registry —\n * e.g. by the tunnel server when the host dispatches a spawn\n * frame. The registry attaches its stdout/stderr listeners and\n * tracks the descriptor so the child shows up in /sessions and\n * the LocalDaemonSessionsCard. The caller keeps lifecycle\n * ownership (kill / wait); this is purely for observability.\n * Returns the descriptor for the registered session. */\n register(input: RegisterSessionInput): SessionDescriptor\n /** Register an already-built agent session (caller resolves the\n * adapter + builds the runtime). Sets kind=\"agent-cli\", consumes\n * the optional initial prompt synchronously, returns the\n * descriptor. The agent stays alive — call `sendPrompt(id, ...)`\n * for follow-up turns until `kill(id)` closes it. */\n spawnAgent(input: SpawnAgentInput): SessionDescriptor\n /** Spawn a process under a real PTY (node-pty). Bytes flow through\n * the registry's byte ring buffer + emitter; attach with\n * `attachPty(id, ...)`. Throws when the registry was constructed\n * without a `spawnPty` factory (node-pty optional dep missing). */\n spawnPty(input: SpawnPtyInput): SessionDescriptor\n /** Send a follow-up turn to a live agent session. Throws when the\n * session is missing, not an agent-cli kind, or busy. The events\n * stream into the existing ring buffer + line emitter so /stream\n * consumers see them as they arrive. */\n sendPrompt(id: string, message: unknown): Promise<void>\n /** Fire-and-forget variant of `sendPrompt`. Validates the same\n * preconditions synchronously — throws on missing session / wrong\n * kind / busy — but returns immediately after the turn is started,\n * letting the caller stream output via the SSE endpoint instead of\n * blocking on the full turn. Async errors during the turn are\n * pushed into the ring buffer as `[error]` lines so `/stream`\n * subscribers see them. Used by the web UI's chat input where a\n * long turn would otherwise freeze the textbox. */\n enqueuePrompt(id: string, message: unknown): void\n list(): SessionDescriptor[]\n get(id: string): SessionDescriptor | undefined\n /** Subscribe to a session's output. Returns an unsubscribe fn.\n * Initial backfill: synchronously invokes `onLine` once for each\n * line currently in the ring buffer so attaches show context. */\n attach(\n id: string,\n onLine: (line: string, stream: \"stdout\" | \"stderr\") => void\n ): (() => void) | null\n /** Subscribe to a PTY session's byte stream. Returns a control\n * handle (write/resize/detach) and null when the session is\n * missing or not a PTY kind. Replays the ring buffer\n * synchronously before live frames start. Initial `cols`/`rows`\n * are required so the registry can compute min-size across\n * subscribers; recompute on every `resize` call. */\n attachPty(\n id: string,\n initial: { cols: number; rows: number },\n onData: (chunk: Buffer) => void,\n onExit: (event: { exitCode: number; signal?: number }) => void\n ): {\n write(data: string): void\n resize(cols: number, rows: number): void\n detach(): void\n } | null\n /** Find a session by exact id OR exact name match. Returns the\n * descriptor or undefined. Used by HTTP/MCP routes so callers\n * can refer to \"claude-main\" instead of \"sess_a3f8c1b2\". */\n findByIdOrName(query: string): SessionDescriptor | undefined\n /** Write a chunk of text to a PTY session's stdin. Returns true\n * on success, false when the session is missing or not a PTY.\n * Single-shot variant of attachPty().write — useful for MCP\n * tools that drive a session through tool calls. */\n writeTerminalInput(id: string, data: string): boolean\n /** Snapshot the recent PTY byte buffer as one Buffer. Newest\n * bytes at the end; `lastBytes` caps the returned size from the\n * tail. Returns null when the session is missing or not a PTY. */\n readTerminalOutput(id: string, lastBytes?: number): Buffer | null\n kill(id: string, signal?: NodeJS.Signals): boolean\n /** Stop tracking a session (after it exited and the user clicked\n * \"clear\"). Doesn't kill — use `kill` first. */\n forget(id: string): boolean\n /** Stop persisting + close all sessions. Killed children are not\n * awaited — the daemon shutdown loop handles process tree teardown. */\n shutdown(): void\n}\n\nexport interface RegisterSessionInput {\n /** Pre-existing child process to adopt (e.g. from a tunnel spawn). */\n child: ChildProcess\n /** Stable id — typically the tunnel's execId so callers cross-ref. */\n id: string\n workspaceSlug: string\n /** Display label for the descriptor's `command` field. */\n command: string\n kind?: SessionKind\n label?: string\n}\n\nexport interface SpawnAgentInput {\n workspaceSlug: string\n cwd: string\n /** Driver-built session ready to receive turns. Caller resolves\n * the adapter, calls createAgentCliRuntime(handle).start({cwd}),\n * and hands the result here. */\n agentSession: AgentSessionLike\n /** Adapter slug for the descriptor (display only). */\n adapterSlug: string\n /** Optional initial prompt to dispatch immediately. The promise\n * the registry returns resolves AFTER the spawn — the prompt\n * runs in the background, projecting events into the ring\n * buffer. Skip to spawn idle. */\n initialPrompt?: string\n label?: string\n /** Pretty command for the descriptor (display only). */\n commandPreview?: string\n}\n\nexport interface SpawnSessionInput {\n kind: SessionKind\n workspaceSlug: string\n /** Path of the workspace root (for the child's cwd). The registry\n * doesn't validate it against the workspaces config — caller has\n * already resolved this. */\n cwd: string\n /** Argv. First element is the binary; rest are passed verbatim. */\n argv: string[]\n /** Extra env on top of the daemon's process.env. */\n env?: Record<string, string>\n /** Optional pre-set id (lets the spawner reference the session\n * before the spawn returns — useful for telemetry). */\n id?: string\n label?: string\n /** Keep the child's stdin open (default: closed). Most spawned\n * agents are non-interactive and emit a warning when stdin is a\n * pipe with no writer (claude-code prints \"no stdin data\n * received in 3s, proceeding without it\"). Closing stdin lets\n * them skip the wait. PTY/terminal kinds that genuinely need\n * bidirectional IO should opt in via `keepStdin: true` and the\n * caller is then responsible for writing to `child.stdin`. */\n keepStdin?: boolean\n}\n\nexport interface SpawnPtyInput {\n workspaceSlug: string\n cwd: string\n argv: string[]\n /** Initial PTY dimensions. The registry uses min(cols, rows) across\n * active subscribers thereafter — these are the seed values used\n * before anyone attaches. */\n cols: number\n rows: number\n /** Extra env on top of process.env. TERM/LANG/PATH are forced by\n * the factory layer (node-pty.spawn options); don't try to clear\n * them here. */\n env?: Record<string, string>\n /** User-friendly slug. Used by `findByIdOrName(query)`. Must not\n * collide with an existing session's name. */\n name?: string\n label?: string\n}\n\n/**\n * Hook the registry uses to rebuild a dead agent session on demand.\n * Invoked when a prompt arrives for an agent-cli session whose\n * `agentSession` was lost (typically daemon restart). Returns a fresh\n * `AgentSessionLike` bound to the same upstream conversation via\n * `resumeSessionId`, OR null if resume isn't possible (adapter gone,\n * upstream rejected). When null, the prompt path surfaces the same\n * \"not an agent session\" error as before — caller knows the row is a\n * ghost.\n *\n * The CLI wires this into the registry by passing in a closure that\n * calls `resolveAgentAdapter(slug)?.startSession({cwd, resumeSessionId})`,\n * which is the same path the gateway's POST /sessions/agent uses.\n */\nexport type AgentSessionResumer = (input: {\n adapterSlug: string\n cwd: string\n resumeSessionId: string\n}) => Promise<AgentSessionLike | null>\n\nexport function createSessionsRegistry(opts?: {\n /** Override the persistence path — tests pin a tmpdir. */\n persistPath?: string\n /** Disable persistence entirely. */\n persist?: boolean\n /** PTY factory (node-pty wrapper). When omitted, `spawnPty()`\n * throws — the daemon advertises PTY support only when the cli\n * layer resolved node-pty successfully. */\n spawnPty?: PtyFactory\n /** Hook called when a prompt arrives for an agent-cli session whose\n * agentSession binding is gone (daemon restart). When provided,\n * the registry transparently resumes the session via the adapter's\n * resumeSessionId before dispatching the turn. When omitted,\n * killed agent-cli sessions surface the legacy \"not an agent\n * session\" error and the user must spawn fresh. */\n resumeAgent?: AgentSessionResumer\n}): SessionsRegistry {\n const persistPath = opts?.persistPath ?? SESSIONS_FILE_PATH()\n const persist = opts?.persist ?? true\n const ptyFactory = opts?.spawnPty\n const resumeAgent = opts?.resumeAgent\n const sessions = new Map<string, SessionRuntime>()\n let persistTimer: ReturnType<typeof setTimeout> | null = null\n // Monotonically-growing PTY-subscriber id. Detach is O(1) on\n // Map.delete(subId), so we never reuse — overflow at Number.MAX_-\n // SAFE_INTEGER would take ~285 years at 1M attaches/sec.\n let nextSubId = 1\n // Guards `shutdown()` from running twice — double-stop happens in\n // serve --interactive's Ctrl-C race; without this, the second\n // call writes an empty snapshot over the real one.\n let shutdownDone = false\n\n // ── boot-time history load ──\n // Read sessions.json synchronously at construction so the dashboard\n // shows historical sessions immediately on daemon restart. Anything\n // that was \"running\" or \"starting\" when the daemon last died gets\n // marked \"killed\" — we have no way to know if the orphan child\n // survived the daemon's exit, and pretending it's still alive would\n // make attach calls fail mysteriously.\n //\n // Historical entries are GHOSTS: descriptor only, no child / no\n // agentSession / no pty. Calls like kill(id) / attach(id) work on\n // them but degrade to no-ops (the underlying process is gone). The\n // session's `endedAt` is set to now when we infer a kill, so the\n // dashboard ages them from this boot rather than the daemon's last\n // life.\n if (persist) {\n loadHistorySnapshot(persistPath, sessions)\n }\n\n // Belt-and-suspenders: `process.on(\"exit\")` runs even on uncaught\n // throws, terminal-close (SIGHUP), and any termination path that\n // bypassed the regular SIGINT/SIGTERM cleanup. The handler must be\n // sync (Node won't await async there); we already use sync IO in\n // `shutdown()` so this is safe. Idempotency guard inside shutdown\n // prevents a double-write when both this handler and the explicit\n // SIGINT path fire.\n const onProcessExit = (): void => {\n shutdownImpl()\n }\n if (persist) {\n process.on(\"exit\", onProcessExit)\n }\n\n const schedulePersist = (): void => {\n if (!persist) return\n if (persistTimer) clearTimeout(persistTimer)\n persistTimer = setTimeout(() => {\n void persistSnapshot()\n }, PERSIST_DEBOUNCE_MS)\n }\n\n const persistSnapshot = async (): Promise<void> => {\n try {\n const snapshot = {\n savedAt: new Date().toISOString(),\n sessions: Array.from(sessions.values()).map(s => s.desc),\n }\n await fs.mkdir(dirname(persistPath), { recursive: true })\n await fs.writeFile(persistPath, JSON.stringify(snapshot, null, 2) + \"\\n\")\n } catch (err) {\n // Persistence is best-effort — log only, never throw.\n console.warn(\n `[sessions] persist failed: ${\n err instanceof Error ? err.message : String(err)\n }`\n )\n }\n }\n\n const appendLine = (\n rt: SessionRuntime,\n line: string,\n stream: \"stdout\" | \"stderr\"\n ): void => {\n rt.recentLines.push(line)\n if (rt.recentLines.length > RECENT_LINES_CAP) {\n rt.recentLines.splice(0, rt.recentLines.length - RECENT_LINES_CAP)\n }\n rt.desc.lastOutputAt = new Date().toISOString()\n sniffResumeHints(rt, line)\n rt.emitter.emit(\"line\", { line, stream })\n }\n\n /**\n * Provider-specific resume-hint sniffer. Looks up the adapter's\n * strategy in `RESUME_STRATEGIES` and runs its `outputHint` regex\n * against each agent-cli line. The captured id is recorded on the\n * descriptor so `agentproto sessions restart` can use it.\n *\n * ANSI-stripped before matching so dim/color codes don't break the\n * pattern. Adapters without a strategy entry (or without an\n * outputHint) are skipped — they fall back to ACP-level resume.\n */\n const sniffResumeHints = (rt: SessionRuntime, line: string): void => {\n if (rt.desc.kind !== \"agent-cli\") return\n const strategy = rt.desc.adapterSlug\n ? RESUME_STRATEGIES[rt.desc.adapterSlug]\n : undefined\n if (!strategy?.outputHint) return\n const plain = stripAnsiCodes(line)\n const m = plain.match(strategy.outputHint)\n if (m && m[1]) {\n rt.desc.resumeMetadata = {\n ...(rt.desc.resumeMetadata ?? {}),\n [strategy.storeAs]: m[1],\n }\n schedulePersist()\n }\n }\n\n /**\n * PTY byte ring buffer. Keeps the last ~64 KiB of raw bytes so a\n * fresh attacher sees the current screenful (alt-screen apps like\n * Claude TUI / vim repaint on next interaction but a snapshot is\n * still better than blank). Drops oldest chunks when over cap;\n * never splits within a chunk — Buffer arithmetic on UTF-8 mid-\n * sequence would corrupt multi-byte glyphs.\n */\n const appendBytes = (rt: SessionRuntime, chunk: Buffer): void => {\n rt.recentBytes.push(chunk)\n rt.recentBytesSize += chunk.byteLength\n while (\n rt.recentBytesSize > RECENT_BYTES_CAP &&\n rt.recentBytes.length > 1\n ) {\n const dropped = rt.recentBytes.shift()\n if (dropped) rt.recentBytesSize -= dropped.byteLength\n }\n rt.desc.lastOutputAt = new Date().toISOString()\n rt.emitter.emit(\"data\", chunk)\n }\n\n /**\n * Recompute the smallest cols/rows across the active subscriber\n * set and resize the PTY accordingly (tmux's \"smallest attached\n * client wins\" rule). No-op when the subscriber map is empty.\n */\n const reconcilePtySize = (rt: SessionRuntime): void => {\n if (!rt.pty || !rt.ptySubscribers || rt.ptySubscribers.size === 0) return\n let cols = Infinity\n let rows = Infinity\n for (const dim of rt.ptySubscribers.values()) {\n if (dim.cols < cols) cols = dim.cols\n if (dim.rows < rows) rows = dim.rows\n }\n if (!Number.isFinite(cols) || !Number.isFinite(rows)) return\n try {\n rt.pty.resize(cols, rows)\n } catch {\n // pty may have exited between the emit and the resize — swallow.\n }\n }\n\n /**\n * Project ACP-style stream events into ring-buffer lines. Keeps\n * the line shape simple so the existing /stream SSE consumer\n * (and the xterm panel) just renders them as-is.\n */\n const projectEvent = (rt: SessionRuntime, evt: AgentStreamEvent): void => {\n switch (evt.kind) {\n case \"text-delta\":\n if (evt.text) {\n // text-delta is a stream of chunks — split on newlines so\n // each line lands in the ring buffer separately. Coalesce\n // a trailing fragment via rt.textBuf.\n const combined = rt.textBuf + evt.text\n const lines = combined.split(/\\r?\\n/)\n rt.textBuf = lines.pop() ?? \"\"\n for (const line of lines) appendLine(rt, line, \"stdout\")\n }\n break\n case \"thought\":\n if (evt.text) {\n // Same coalescing as text-delta — some adapters stream\n // chain-of-thought one token at a time, which would\n // otherwise produce ~100 [thought] lines per turn.\n const combined = rt.thoughtBuf + evt.text\n const lines = combined.split(/\\r?\\n/)\n rt.thoughtBuf = lines.pop() ?? \"\"\n for (const line of lines) {\n if (line.trim()) {\n appendLine(rt, `\\x1b[2m[thought] ${line}\\x1b[0m`, \"stdout\")\n }\n }\n }\n break\n case \"tool-call\":\n appendLine(\n rt,\n `\\x1b[36m[tool] ${evt.toolName ?? \"?\"}\\x1b[0m`,\n \"stdout\"\n )\n break\n case \"tool-result\":\n if (evt.isError)\n appendLine(rt, `\\x1b[31m[tool-error]\\x1b[0m`, \"stderr\")\n break\n case \"agent-prompt\":\n appendLine(rt, `\\x1b[33m[awaiting input]\\x1b[0m`, \"stdout\")\n break\n case \"turn-end\": {\n // Flush any buffered text/thought fragments as final lines.\n if (rt.thoughtBuf.trim()) {\n appendLine(\n rt,\n `\\x1b[2m[thought] ${rt.thoughtBuf}\\x1b[0m`,\n \"stdout\"\n )\n }\n rt.thoughtBuf = \"\"\n if (rt.textBuf) {\n appendLine(rt, rt.textBuf, \"stdout\")\n rt.textBuf = \"\"\n }\n appendLine(\n rt,\n `\\x1b[2m── turn-end (${evt.reason ?? \"completed\"}) ──\\x1b[0m`,\n \"stdout\"\n )\n break\n }\n case \"error\": {\n const code =\n typeof evt.error?.code === \"number\" ? ` (code ${evt.error.code})` : \"\"\n appendLine(\n rt,\n `\\x1b[31m[error]${code} ${evt.error?.message ?? \"unknown\"}\\x1b[0m`,\n \"stderr\"\n )\n // Project the child's stderr tail when define-agent-cli\n // attached it — otherwise the user sees only \"Invalid\n // params\" and has to dig into the daemon log for context.\n const data = evt.error?.data as\n | { stderr?: unknown }\n | null\n | undefined\n if (data && typeof data === \"object\" && typeof data.stderr === \"string\") {\n for (const line of data.stderr.split(/\\r?\\n/)) {\n if (line) appendLine(rt, `\\x1b[2m ${line}\\x1b[0m`, \"stderr\")\n }\n }\n break\n }\n }\n }\n\n /**\n * Drive one agent turn. Sets busy=true, drains the event stream\n * into the ring buffer, clears busy on completion. Bumps the\n * descriptor status to \"error\" if the iteration throws (network\n * drop, child died mid-turn).\n */\n /**\n * Shared sync validation for sendPrompt + enqueuePrompt. Throws on\n * missing session / wrong kind / busy so both code paths surface\n * the exact same error messages — the only difference is whether\n * the caller awaits the turn.\n */\n const validateAgentTurn = (id: string, caller: string): SessionRuntime => {\n const rt = sessions.get(id)\n if (!rt) throw new Error(`${caller}: no session \"${id}\"`)\n if (!rt.agentSession) {\n throw new Error(\n `${caller}: session \"${id}\" is not an agent session (kind=${rt.desc.kind})`\n )\n }\n if (rt.busy) {\n throw new Error(\n `${caller}: session \"${id}\" is mid-turn — wait for it to finish or cancel`\n )\n }\n return rt\n }\n\n /**\n * Attempt to resume a dead agent-cli session by re-spawning the\n * adapter with the persisted `adapterSessionId`. The conversation\n * continues from where it left off — ACP's `resumeSessionId`\n * contract guarantees the adapter rehydrates state from the\n * upstream provider (Anthropic / OpenAI / etc.) when supported.\n *\n * Returns silently when:\n * - resumeAgent hook wasn't provided (older daemon embedding)\n * - session is already alive (binding present)\n * - session is a non-agent kind (terminal/command can't resume)\n * - descriptor lacks adapterSessionId or adapterSlug (legacy row\n * persisted before resume metadata was tracked)\n *\n * Concurrent prompt arrivals share one resume attempt via\n * `rt.resumePromise`.\n */\n const maybeResumeAgent = async (rt: SessionRuntime): Promise<void> => {\n if (rt.agentSession) return\n if (!resumeAgent) return\n if (rt.desc.kind !== \"agent-cli\") return\n const adapterSlug = rt.desc.adapterSlug ?? rt.adapterSlug\n const adapterSessionId = rt.desc.adapterSessionId\n const cwd = rt.desc.cwd\n if (!adapterSlug || !adapterSessionId || !cwd) return\n if (rt.resumePromise) {\n await rt.resumePromise\n return\n }\n rt.resumePromise = (async () => {\n appendLine(\n rt,\n `── resuming ${adapterSlug} session ${adapterSessionId} ──`,\n \"stdout\"\n )\n try {\n const fresh = await resumeAgent({\n adapterSlug,\n cwd,\n resumeSessionId: adapterSessionId,\n })\n if (!fresh) {\n appendLine(\n rt,\n `[error] resume failed: adapter '${adapterSlug}' returned null`,\n \"stderr\"\n )\n return\n }\n rt.agentSession = fresh\n rt.adapterSlug = adapterSlug\n rt.desc.adapterSessionId = fresh.sessionId\n if (rt.desc.status !== \"running\") {\n rt.desc.status = \"running\"\n delete rt.desc.endedAt\n delete rt.desc.exitCode\n rt.emitter.emit(\"status\", rt.desc.status)\n }\n schedulePersist()\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n appendLine(rt, `[error] resume failed: ${msg}`, \"stderr\")\n }\n })()\n try {\n await rt.resumePromise\n } finally {\n rt.resumePromise = undefined\n }\n }\n\n const runAgentTurn = async (\n rt: SessionRuntime,\n message: unknown\n ): Promise<void> => {\n if (!rt.agentSession) {\n throw new Error(\"runAgentTurn: session has no agentSession\")\n }\n rt.busy = true\n try {\n appendLine(\n rt,\n `\\x1b[2m── ▶ ${typeof message === \"string\" ? message : JSON.stringify(message)} ──\\x1b[0m`,\n \"stdout\"\n )\n // ACP's `prompt` field expects ContentBlock[] (or a single\n // block). Hosts that send a raw string get auto-wrapped into\n // `{type: \"text\", text: \"...\"}` so callers can hand us\n // human-friendly prompts without shaping the wire format.\n const wrapped =\n typeof message === \"string\" ? { type: \"text\", text: message } : message\n for await (const evt of rt.agentSession.send(wrapped)) {\n projectEvent(rt, evt)\n }\n } catch (err) {\n rt.desc.status = \"error\"\n rt.desc.endedAt = new Date().toISOString()\n appendLine(\n rt,\n `[turn error] ${err instanceof Error ? err.message : String(err)}`,\n \"stderr\"\n )\n schedulePersist()\n } finally {\n rt.busy = false\n }\n }\n\n const wireOutputStreams = (rt: SessionRuntime): void => {\n const onChunk =\n (stream: \"stdout\" | \"stderr\") =>\n (chunk: Buffer | string): void => {\n const text = typeof chunk === \"string\" ? chunk : chunk.toString(\"utf8\")\n for (const line of text.split(/\\r?\\n/)) {\n if (line.length > 0) appendLine(rt, line, stream)\n }\n }\n // Only called from spawn() which always sets rt.child — narrow\n // here so the stream listeners don't trip the optional-chain.\n if (!rt.child) return\n rt.child.stdout?.on(\"data\", onChunk(\"stdout\"))\n rt.child.stderr?.on(\"data\", onChunk(\"stderr\"))\n }\n\n return {\n spawn(input) {\n const id = input.id ?? `sess_${randomUUID().slice(0, 8)}`\n if (sessions.has(id)) {\n throw new Error(`sessions.spawn: id \"${id}\" already in use`)\n }\n const env = { ...process.env, ...(input.env ?? {}) }\n // Filter out Node bookkeeping that confuses subprocesses.\n delete env.NODE_OPTIONS\n const [bin, ...args] = input.argv\n if (!bin) throw new Error(\"sessions.spawn: argv must include a binary\")\n // Close stdin by default — most agent CLIs spawn-and-prompt\n // (claude/codex/aider/etc.) read argv for the prompt and will\n // otherwise sit waiting for piped input. Caller opts in to a\n // writeable stdin via `keepStdin: true` (terminal/PTY kinds).\n const stdinMode = input.keepStdin ? \"pipe\" : \"ignore\"\n const child = spawn(bin, args, {\n cwd: input.cwd,\n env: env as NodeJS.ProcessEnv,\n stdio: [stdinMode, \"pipe\", \"pipe\"],\n })\n const desc: SessionDescriptor = {\n id,\n kind: input.kind,\n workspaceSlug: input.workspaceSlug,\n command: [bin, ...args].map(quoteArg).join(\" \"),\n pid: child.pid ?? null,\n status: \"starting\",\n startedAt: new Date().toISOString(),\n argv: input.argv,\n cwd: input.cwd,\n ...(input.label ? { label: input.label } : {}),\n }\n const rt: SessionRuntime = {\n desc,\n child,\n recentLines: [],\n recentBytes: [],\n recentBytesSize: 0,\n emitter: new EventEmitter(),\n busy: false,\n textBuf: \"\",\n thoughtBuf: \"\",\n }\n // Don't crash the daemon when no listener is attached — the\n // emitter's \"error\" event would otherwise propagate.\n rt.emitter.setMaxListeners(50)\n\n sessions.set(id, rt)\n wireOutputStreams(rt)\n\n child.once(\"spawn\", () => {\n desc.status = \"running\"\n rt.emitter.emit(\"status\", desc.status)\n schedulePersist()\n })\n child.once(\"error\", err => {\n desc.status = \"error\"\n desc.endedAt = new Date().toISOString()\n appendLine(rt, `[spawn error] ${err.message}`, \"stderr\")\n rt.emitter.emit(\"status\", desc.status)\n schedulePersist()\n })\n child.once(\"exit\", (code, signal) => {\n if (signal && desc.status !== \"killed\") desc.status = \"killed\"\n else if (desc.status === \"running\" || desc.status === \"starting\") {\n desc.status = \"exited\"\n }\n desc.endedAt = new Date().toISOString()\n if (typeof code === \"number\") desc.exitCode = code\n rt.emitter.emit(\"status\", desc.status)\n schedulePersist()\n })\n schedulePersist()\n return desc\n },\n register(input) {\n if (sessions.has(input.id)) {\n // Already adopted (re-tracking is a noop). Return the\n // existing descriptor so callers don't have to special-case.\n const existing = sessions.get(input.id)\n if (existing) return existing.desc\n }\n const desc: SessionDescriptor = {\n id: input.id,\n kind: input.kind ?? \"command\",\n workspaceSlug: input.workspaceSlug,\n command: input.command,\n pid: input.child.pid ?? null,\n status: input.child.killed ? \"killed\" : \"running\",\n startedAt: new Date().toISOString(),\n ...(input.label ? { label: input.label } : {}),\n }\n const rt: SessionRuntime = {\n desc,\n child: input.child,\n recentLines: [],\n recentBytes: [],\n recentBytesSize: 0,\n emitter: new EventEmitter(),\n busy: false,\n textBuf: \"\",\n thoughtBuf: \"\",\n }\n rt.emitter.setMaxListeners(50)\n sessions.set(input.id, rt)\n wireOutputStreams(rt)\n // Wire exit so the descriptor flips when the adopted child\n // dies — same handlers as spawn() but registered post-hoc\n // because the child is already alive.\n input.child.once(\"exit\", (code, signal) => {\n if (signal && desc.status !== \"killed\") desc.status = \"killed\"\n else if (desc.status === \"running\") desc.status = \"exited\"\n desc.endedAt = new Date().toISOString()\n if (typeof code === \"number\") desc.exitCode = code\n rt.emitter.emit(\"status\", desc.status)\n schedulePersist()\n })\n input.child.once(\"error\", err => {\n desc.status = \"error\"\n desc.endedAt = new Date().toISOString()\n appendLine(rt, `[child error] ${err.message}`, \"stderr\")\n rt.emitter.emit(\"status\", desc.status)\n schedulePersist()\n })\n schedulePersist()\n return desc\n },\n spawnAgent(input) {\n const id = `sess_${randomUUID().slice(0, 8)}`\n const desc: SessionDescriptor = {\n id,\n kind: \"agent-cli\",\n workspaceSlug: input.workspaceSlug,\n command: input.commandPreview ?? `${input.adapterSlug} (agent)`,\n pid: null,\n status: \"running\", // driver already started the session\n startedAt: new Date().toISOString(),\n cwd: input.cwd,\n adapterSlug: input.adapterSlug,\n // ACP-level session id — sticks across daemon restart so\n // `agentproto sessions restart <id>` can pass it as\n // `resumeSessionId` and the adapter reattaches to the prior\n // conversation rather than starting blank.\n adapterSessionId: input.agentSession.sessionId,\n ...(input.label ? { label: input.label } : {}),\n }\n const rt: SessionRuntime = {\n desc,\n agentSession: input.agentSession,\n adapterSlug: input.adapterSlug,\n recentLines: [],\n recentBytes: [],\n recentBytesSize: 0,\n emitter: new EventEmitter(),\n busy: false,\n textBuf: \"\",\n thoughtBuf: \"\",\n }\n rt.emitter.setMaxListeners(50)\n sessions.set(id, rt)\n appendLine(\n rt,\n `── ${input.adapterSlug} agent session ${input.agentSession.sessionId} (cwd ${input.cwd}) ──`,\n \"stdout\"\n )\n schedulePersist()\n // Fire-and-forget the initial prompt (if any). Errors land in\n // the ring buffer + bump status to \"error\" but don't reject\n // the spawn — the descriptor was already returned.\n if (input.initialPrompt) {\n void runAgentTurn(rt, input.initialPrompt).catch(err => {\n appendLine(\n rt,\n `[turn error] ${err instanceof Error ? err.message : String(err)}`,\n \"stderr\"\n )\n })\n }\n return desc\n },\n spawnPty(input) {\n if (!ptyFactory) {\n throw new Error(\n \"sessions.spawnPty: no PTY factory configured (node-pty optional dep missing in the daemon)\"\n )\n }\n const id = `sess_${randomUUID().slice(0, 8)}`\n // Reject the name only when the prior holder is still alive —\n // killed/exited/error sessions keep their descriptor in the\n // registry for history, but their name is free to reuse so\n // `stop X && terminal --name X` round-trips cleanly.\n if (input.name) {\n for (const rt of sessions.values()) {\n if (rt.desc.name !== input.name) continue\n const status = rt.desc.status\n if (status === \"running\" || status === \"starting\") {\n throw new Error(\n `sessions.spawnPty: name \"${input.name}\" already in use by ${rt.desc.id} (status=${status})`,\n )\n }\n // Free the name on the dead session so id-or-name lookup\n // resolves to the NEW one. The old descriptor stays in the\n // registry (you can still find it by id in the list).\n rt.desc.name = undefined\n }\n }\n const [bin, ...args] = input.argv\n if (!bin) {\n throw new Error(\"sessions.spawnPty: argv must include a binary\")\n }\n // node-pty forces its own minimal env unless we forward — pass\n // process.env merged with caller overrides. The factory layer\n // also forces TERM=xterm-256color so alt-screen apps render.\n const env = { ...(process.env as Record<string, string>), ...(input.env ?? {}) }\n delete env.NODE_OPTIONS\n const pty: PtyProcess = ptyFactory({\n command: bin,\n args,\n cwd: input.cwd,\n env,\n cols: input.cols,\n rows: input.rows,\n })\n const desc: SessionDescriptor = {\n id,\n kind: \"terminal\",\n workspaceSlug: input.workspaceSlug,\n command: [bin, ...args].map(quoteArg).join(\" \"),\n pid: pty.pid,\n status: \"running\",\n startedAt: new Date().toISOString(),\n pty: true,\n argv: input.argv,\n cwd: input.cwd,\n ...(input.name ? { name: input.name } : {}),\n ...(input.label ? { label: input.label } : {}),\n }\n const rt: SessionRuntime = {\n desc,\n pty,\n ptySubscribers: new Map(),\n recentLines: [],\n recentBytes: [],\n recentBytesSize: 0,\n emitter: new EventEmitter(),\n busy: false,\n textBuf: \"\",\n thoughtBuf: \"\",\n }\n rt.emitter.setMaxListeners(50)\n sessions.set(id, rt)\n pty.onData((chunk: string) => {\n // node-pty emits utf-8 strings. Convert once at the boundary\n // so the ring buffer + emitter consumers all see Buffer.\n appendBytes(rt, Buffer.from(chunk, \"utf8\"))\n })\n pty.onExit(evt => {\n if (rt.desc.status !== \"killed\") {\n rt.desc.status = \"exited\"\n }\n rt.desc.endedAt = new Date().toISOString()\n if (typeof evt.exitCode === \"number\") rt.desc.exitCode = evt.exitCode\n rt.emitter.emit(\"exit\", evt)\n rt.emitter.emit(\"status\", rt.desc.status)\n schedulePersist()\n })\n schedulePersist()\n return desc\n },\n async sendPrompt(id, message) {\n const rtPre = sessions.get(id)\n if (rtPre) await maybeResumeAgent(rtPre)\n const rt = validateAgentTurn(id, \"sendPrompt\")\n await runAgentTurn(rt, message)\n },\n enqueuePrompt(id, message) {\n // For sync `enqueuePrompt`, we need to surface an immediate\n // error when the session is missing OR when it's a non-agent\n // kind that can't be resumed at all. But when the session IS\n // an agent-cli with resume metadata, defer validation until\n // after the resume attempt so a dead-but-resumable row Just\n // Works for the caller (no \"not an agent session\" error after\n // a daemon restart).\n const rtPre = sessions.get(id)\n if (!rtPre) {\n throw new Error(`enqueuePrompt: no session \"${id}\"`)\n }\n if (rtPre.desc.kind !== \"agent-cli\") {\n throw new Error(\n `enqueuePrompt: session \"${id}\" is not an agent session (kind=${rtPre.desc.kind})`\n )\n }\n if (rtPre.busy) {\n throw new Error(\n `enqueuePrompt: session \"${id}\" is mid-turn — wait for it to finish or cancel`\n )\n }\n // Fire-and-forget: resume (if needed) then dispatch. Errors\n // during either step land in the ring buffer as `[error]`\n // lines so the SSE consumer sees them.\n void (async () => {\n try {\n await maybeResumeAgent(rtPre)\n const rt = validateAgentTurn(id, \"enqueuePrompt\")\n await runAgentTurn(rt, message)\n } catch (err) {\n appendLine(\n rtPre,\n `[error] ${err instanceof Error ? err.message : String(err)}`,\n \"stderr\"\n )\n }\n })()\n },\n list() {\n return Array.from(sessions.values())\n .map(s => s.desc)\n .sort((a, b) => b.startedAt.localeCompare(a.startedAt))\n },\n get(id) {\n return sessions.get(id)?.desc\n },\n attach(id, onLine) {\n const rt = sessions.get(id)\n if (!rt) return null\n // Backfill: synchronously replay the ring buffer so attaches\n // see the recent context, then subscribe for new lines.\n for (const line of rt.recentLines) onLine(line, \"stdout\")\n const handler = (evt: {\n line: string\n stream: \"stdout\" | \"stderr\"\n }): void => onLine(evt.line, evt.stream)\n rt.emitter.on(\"line\", handler)\n return () => rt.emitter.off(\"line\", handler)\n },\n attachPty(id, initial, onData, onExit) {\n const rt = sessions.get(id)\n if (!rt || !rt.pty || !rt.ptySubscribers) return null\n // Backfill: flush the byte ring buffer so a fresh attach lands\n // on the recent screenful. Alt-screen apps repaint on next\n // input but a snapshot is still better than blank.\n for (const chunk of rt.recentBytes) onData(chunk)\n // Subscriber registration: a monotonically-growing key so the\n // size map can hold the per-subscriber dims and detach is O(1).\n const subId = nextSubId++\n rt.ptySubscribers.set(subId, { cols: initial.cols, rows: initial.rows })\n reconcilePtySize(rt)\n const dataHandler = (chunk: Buffer): void => onData(chunk)\n const exitHandler = (evt: {\n exitCode: number\n signal?: number\n }): void => onExit(evt)\n rt.emitter.on(\"data\", dataHandler)\n rt.emitter.once(\"exit\", exitHandler)\n return {\n write(data: string): void {\n if (!rt.pty) return\n try {\n rt.pty.write(data)\n } catch {\n // PTY already exited — drop the input silently.\n }\n },\n resize(cols: number, rows: number): void {\n if (!rt.ptySubscribers) return\n rt.ptySubscribers.set(subId, { cols, rows })\n reconcilePtySize(rt)\n },\n detach(): void {\n rt.emitter.off(\"data\", dataHandler)\n rt.emitter.off(\"exit\", exitHandler)\n rt.ptySubscribers?.delete(subId)\n reconcilePtySize(rt)\n },\n }\n },\n findByIdOrName(query) {\n const direct = sessions.get(query)\n if (direct) return direct.desc\n for (const rt of sessions.values()) {\n if (rt.desc.name === query) return rt.desc\n }\n return undefined\n },\n writeTerminalInput(id, data) {\n const rt = sessions.get(id)\n if (!rt || !rt.pty) return false\n try {\n rt.pty.write(data)\n return true\n } catch {\n return false\n }\n },\n readTerminalOutput(id, lastBytes) {\n const rt = sessions.get(id)\n if (!rt || !rt.pty) return null\n const joined = Buffer.concat(rt.recentBytes, rt.recentBytesSize)\n if (typeof lastBytes === \"number\" && lastBytes > 0 && joined.byteLength > lastBytes) {\n return joined.subarray(joined.byteLength - lastBytes)\n }\n return joined\n },\n kill(id, signal = \"SIGTERM\") {\n const rt = sessions.get(id)\n if (!rt) return false\n if (\n rt.desc.status === \"exited\" ||\n rt.desc.status === \"killed\" ||\n rt.desc.status === \"error\"\n ) {\n return false\n }\n rt.desc.status = \"killed\"\n rt.desc.endedAt = new Date().toISOString()\n // Close agent session first (graceful protocol shutdown), then\n // SIGTERM the underlying child/pty if any. Either branch is a\n // best-effort — the descriptor flip is what the UI surfaces.\n if (rt.agentSession) {\n void rt.agentSession.close().catch(() => undefined)\n }\n if (rt.pty) {\n try {\n rt.pty.kill(signal)\n } catch {\n // pty already gone — fall through\n }\n }\n rt.child?.kill(signal)\n schedulePersist()\n return true\n },\n forget(id) {\n const rt = sessions.get(id)\n if (!rt) return false\n // Don't leak: tear down the emitter so backfill listeners stop.\n rt.emitter.removeAllListeners()\n sessions.delete(id)\n schedulePersist()\n return true\n },\n shutdown() {\n shutdownImpl()\n },\n }\n\n /**\n * The actual shutdown logic, hoisted so both the explicit\n * `shutdown()` method AND the `process.on(\"exit\")` safety net\n * can call it. Sync (no awaits) so it works in the `exit` event\n * handler.\n *\n * Idempotent — `serve --interactive` calls gateway.stop() twice in\n * some Ctrl-C race paths (parent SIGINT handler + the child-exit\n * promise both fire), and `process.on(\"exit\")` ALSO fires at the\n * end of every termination path. Without the guard, the second\n * call clears the already-empty sessions Map and writes an empty\n * snapshot back to sessions.json, wiping history.\n */\n function shutdownImpl(): void {\n if (shutdownDone) return\n shutdownDone = true\n if (persistTimer) clearTimeout(persistTimer)\n if (persist) {\n try {\n process.off(\"exit\", onProcessExit)\n } catch {\n // ignore — handler may not be installed\n }\n }\n // Mark any still-alive sessions as killed BEFORE the final\n // flush so the snapshot accurately reflects what happened. On\n // the next boot, load reads these and we won't have to guess\n // (\"was running last time → assume killed\" is then a no-op).\n const nowIso = new Date().toISOString()\n for (const rt of sessions.values()) {\n rt.emitter.removeAllListeners()\n if (\n rt.desc.status === \"running\" ||\n rt.desc.status === \"starting\"\n ) {\n rt.desc.status = \"killed\"\n rt.desc.endedAt = nowIso\n if (rt.agentSession) {\n void rt.agentSession.close().catch(() => undefined)\n }\n if (rt.pty) {\n try {\n rt.pty.kill(\"SIGTERM\")\n } catch {\n // already exited\n }\n }\n rt.child?.kill(\"SIGTERM\")\n }\n }\n // Sync flush so quick sessions (spawned + ended in less than\n // PERSIST_DEBOUNCE_MS) aren't lost. The debounced async write\n // may have been cancelled by clearTimeout above, but a 200-byte\n // sync write at shutdown is cheap and the data needs to land.\n if (persist) {\n try {\n const snapshot = {\n savedAt: nowIso,\n sessions: Array.from(sessions.values()).map(s => s.desc),\n }\n mkdirSync(dirname(persistPath), { recursive: true })\n writeFileSync(persistPath, JSON.stringify(snapshot, null, 2) + \"\\n\")\n } catch {\n // best-effort — same policy as the async path\n }\n }\n sessions.clear()\n }\n}\n\n/**\n * Read the persisted snapshot at boot and reinflate session\n * descriptors as historical \"ghost\" entries. Sync-read because this\n * runs once at construction, the file is small (~200 entries), and\n * keeping it sync avoids making createSessionsRegistry async (would\n * cascade through createGateway + every embedding host).\n *\n * Anything that was \"running\"/\"starting\" when the daemon last died\n * gets re-classified as \"killed\" with endedAt=now — we can't tell\n * if the orphan PID survived the daemon's exit, and pretending it's\n * still alive would make attach/kill calls fail mysteriously. The\n * descriptor stays in the registry for history; the dashboard sees\n * it under SESSIONS, the user can `d` to forget.\n *\n * Ghosts carry NO live child / agentSession / pty — calls that\n * would interact with the underlying process degrade to no-ops.\n * Output ring buffers (lines + bytes) are empty: we don't persist\n * those, only the descriptor metadata.\n */\nfunction loadHistorySnapshot(\n persistPath: string,\n sessions: Map<string, SessionRuntime>,\n): void {\n let raw: string\n try {\n raw = readFileSync(persistPath, \"utf8\")\n } catch {\n return // ENOENT etc. — first boot, no history.\n }\n let parsed: { sessions?: SessionDescriptor[] }\n try {\n parsed = JSON.parse(raw)\n } catch {\n console.warn(\n `[sessions] history file ${persistPath} is malformed — ignoring`,\n )\n return\n }\n if (!Array.isArray(parsed.sessions)) return\n // Newest first so the FIFO cap drops oldest.\n const sorted = parsed.sessions\n .filter((s): s is SessionDescriptor => !!s && typeof s.id === \"string\")\n .sort((a, b) => b.startedAt.localeCompare(a.startedAt))\n .slice(0, HISTORY_CAP)\n const now = new Date().toISOString()\n for (const desc of sorted) {\n if (sessions.has(desc.id)) continue // collision with a live entry — keep live\n const wasAlive = desc.status === \"running\" || desc.status === \"starting\"\n const reclassified: SessionDescriptor = wasAlive\n ? {\n ...desc,\n status: \"killed\",\n endedAt: desc.endedAt ?? now,\n }\n : desc\n const rt: SessionRuntime = {\n desc: reclassified,\n recentLines: [],\n recentBytes: [],\n recentBytesSize: 0,\n emitter: new EventEmitter(),\n busy: false,\n textBuf: \"\",\n thoughtBuf: \"\",\n }\n rt.emitter.setMaxListeners(50)\n sessions.set(desc.id, rt)\n }\n}\n\n/** Minimal shell-quote — wraps args containing whitespace or quotes\n * so the rendered `command` field is copy-pasteable. */\nfunction quoteArg(arg: string): string {\n if (arg === \"\") return '\"\"'\n if (/^[a-zA-Z0-9._/=:@,+-]+$/.test(arg)) return arg\n return `\"${arg.replace(/([\"\\\\$`])/g, \"\\\\$1\")}\"`\n}\n","/**\n * mcp-proxy — connect the daemon as an MCP *client* to every server\n * the user imported via `~/.agentproto/imported-mcps.json`, and\n * surface their tools through dedicated MCP tools on the daemon's\n * own server. The chain looks like:\n *\n * operator (cloud Guilde) ──MCP──▶ agentproto-daemon (this proxy)\n * │\n * ├──stdio──▶ chrome-devtools-mcp\n * └──http───▶ goose-bridge\n *\n * v1 design choice: instead of re-registering each upstream tool\n * under a namespaced name (which requires JSON-Schema↔Zod conversion\n * for every exotic shape — recursive refs, oneOf, etc.), the proxy\n * exposes two indirection tools:\n * - `mcp_list_imported_tools(alias?)` lets the operator discover\n * what's available\n * - `mcp_call_imported(alias, toolName, args)` invokes a specific\n * tool, forwarding the JSON args verbatim\n *\n * Trade-off: agents do a 2-step (list → call) instead of seeing the\n * imports directly in their tool palette. We keep tool inputs\n * unconstrained at the MCP layer; validation is the upstream\n * server's job. v2 can re-expose namespaced tools once we ship a\n * solid JSON-Schema → Zod converter.\n *\n * Lifecycle: clients are connected lazily on the first call that\n * touches them and held open until daemon shutdown. The registry\n * notices new/removed imports by stat'ing the imports file's mtime\n * before each call — cheap, avoids forcing the HTTP routes to push.\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\"\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\"\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\"\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\"\nimport {\n loadImportedMcps,\n IMPORTED_MCPS_PATH,\n type ImportedMcpEntry,\n} from \"./mcp-imports.js\"\nimport type { DiscoveredMcp } from \"./mcp-discovery.js\"\n\ninterface ProxyClient {\n entry: ImportedMcpEntry\n /** Live MCP client. Null while a connect is in-flight or after a\n * connection error — the next call retries. */\n client: Client | null\n /** Tools list cached after the first successful fetch. Cleared on\n * disconnect so stale tool names don't survive a reconnect. */\n tools: ProxyToolDescriptor[] | null\n /** Last connection error message, kept so listAliases can surface\n * diagnostics to the operator without re-throwing on every list. */\n lastError: string | null\n}\n\nexport interface ProxyToolDescriptor {\n name: string\n description?: string\n /** JSON Schema as published by the upstream server. Forwarded to\n * the operator verbatim — they read it to figure out args. */\n inputSchema?: unknown\n}\n\nexport interface ProxyAliasSummary {\n alias: string\n importId: string\n source: DiscoveredMcp[\"source\"]\n type: DiscoveredMcp[\"type\"]\n /** \"connected\" | \"error\" | \"pending\" — pending = never tried yet. */\n status: \"connected\" | \"error\" | \"pending\"\n toolCount: number\n lastError?: string\n}\n\nexport interface CallResult {\n ok: true\n result: unknown\n}\nexport interface CallError {\n ok: false\n error: string\n}\nexport type ProxyCallOutcome = CallResult | CallError\n\nexport class McpProxyRegistry {\n private clients = new Map<string, ProxyClient>()\n private lastMtimeMs = 0\n /** Sentinel so we know whether the file has *ever* been read.\n * Distinguishes \"file missing on first call\" (legit empty state)\n * from \"we've read it before and it's gone\" (treat as empty too,\n * but only after closing live clients). */\n private hasReadOnce = false\n\n /**\n * Reload the imports file when its mtime has advanced. Avoids\n * repeated parsing when nothing changed — most calls are no-ops.\n * Disconnects clients whose import was removed; connects the new\n * set lazily (the first call that touches them).\n */\n async ensureCurrent(): Promise<void> {\n let mtimeMs = 0\n try {\n const st = await fs.stat(IMPORTED_MCPS_PATH())\n mtimeMs = st.mtimeMs\n } catch {\n // ENOENT — empty imports state. If we'd previously loaded\n // some, close them.\n mtimeMs = 0\n }\n if (this.hasReadOnce && mtimeMs === this.lastMtimeMs) return\n\n const config = await loadImportedMcps().catch(() => ({\n version: 1 as const,\n imports: [] as ImportedMcpEntry[],\n }))\n const wantedIds = new Set(config.imports.map(e => e.id))\n\n // Drop clients for imports the user removed.\n for (const [id, c] of this.clients.entries()) {\n if (!wantedIds.has(id)) {\n await safeClose(c.client)\n this.clients.delete(id)\n }\n }\n // Add placeholders for new imports — connect lazily.\n for (const entry of config.imports) {\n const existing = this.clients.get(entry.id)\n if (existing) {\n // Snapshot may have changed (user re-imported same id with\n // different command). Detect by comparing serialised\n // snapshots; on mismatch, force reconnect.\n if (\n JSON.stringify(existing.entry.snapshot) !==\n JSON.stringify(entry.snapshot)\n ) {\n await safeClose(existing.client)\n this.clients.set(entry.id, freshPlaceholder(entry))\n } else {\n existing.entry = entry\n }\n } else {\n this.clients.set(entry.id, freshPlaceholder(entry))\n }\n }\n this.lastMtimeMs = mtimeMs\n this.hasReadOnce = true\n }\n\n /**\n * Lazy connect: the first call to `connectIfNeeded(alias)`\n * actually opens the transport + handshakes. Subsequent calls\n * reuse the live client.\n */\n private async connectIfNeeded(alias: string): Promise<ProxyClient | null> {\n await this.ensureCurrent()\n const handle = this.findByAlias(alias)\n if (!handle) return null\n if (handle.client) return handle\n try {\n const client = await openClient(handle.entry)\n handle.client = client\n handle.lastError = null\n // Eagerly fetch tools so listTools doesn't pay the round-trip\n // on next call. Cheap (single tools/list request).\n const t = await client.listTools()\n handle.tools = t.tools.map(toDescriptor)\n return handle\n } catch (err) {\n handle.client = null\n handle.tools = null\n handle.lastError = err instanceof Error ? err.message : String(err)\n return handle\n }\n }\n\n /** Find a client handle by alias *or* import id (defensive — agents\n * sometimes pass the id from `list_imported_mcps`). */\n private findByAlias(aliasOrId: string): ProxyClient | undefined {\n for (const c of this.clients.values()) {\n if (c.entry.alias === aliasOrId) return c\n if (c.entry.id === aliasOrId) return c\n }\n return undefined\n }\n\n async listAliases(): Promise<ProxyAliasSummary[]> {\n await this.ensureCurrent()\n return Array.from(this.clients.values()).map(c => ({\n alias: c.entry.alias,\n importId: c.entry.id,\n source: c.entry.snapshot.source,\n type: c.entry.snapshot.type,\n status: c.client\n ? \"connected\"\n : c.lastError\n ? \"error\"\n : \"pending\",\n toolCount: c.tools?.length ?? 0,\n ...(c.lastError ? { lastError: c.lastError } : {}),\n }))\n }\n\n async listTools(\n alias: string\n ): Promise<{ ok: true; tools: ProxyToolDescriptor[] } | { ok: false; error: string }> {\n const handle = await this.connectIfNeeded(alias)\n if (!handle) return { ok: false, error: `unknown alias \"${alias}\"` }\n if (!handle.client || !handle.tools) {\n return {\n ok: false,\n error: handle.lastError ?? \"client not connected\",\n }\n }\n return { ok: true, tools: handle.tools }\n }\n\n async callTool(\n alias: string,\n toolName: string,\n args: unknown\n ): Promise<ProxyCallOutcome> {\n const handle = await this.connectIfNeeded(alias)\n if (!handle) return { ok: false, error: `unknown alias \"${alias}\"` }\n if (!handle.client) {\n return {\n ok: false,\n error: handle.lastError ?? \"client not connected\",\n }\n }\n try {\n const result = await handle.client.callTool({\n name: toolName,\n arguments:\n args && typeof args === \"object\"\n ? (args as Record<string, unknown>)\n : {},\n })\n return { ok: true, result }\n } catch (err) {\n // Mark the client as dirty — the connection may have died\n // mid-call (process crash, http server restart). The next call\n // re-opens via connectIfNeeded.\n const msg = err instanceof Error ? err.message : String(err)\n if (/closed|disconnect|EPIPE|ECONNRESET/i.test(msg)) {\n await safeClose(handle.client)\n handle.client = null\n handle.tools = null\n handle.lastError = msg\n }\n return { ok: false, error: msg }\n }\n }\n\n async closeAll(): Promise<void> {\n await Promise.all(\n Array.from(this.clients.values()).map(c => safeClose(c.client))\n )\n this.clients.clear()\n }\n}\n\nfunction freshPlaceholder(entry: ImportedMcpEntry): ProxyClient {\n return { entry, client: null, tools: null, lastError: null }\n}\n\nfunction toDescriptor(tool: {\n name: string\n description?: string\n inputSchema?: unknown\n}): ProxyToolDescriptor {\n return {\n name: tool.name,\n ...(tool.description ? { description: tool.description } : {}),\n ...(tool.inputSchema ? { inputSchema: tool.inputSchema } : {}),\n }\n}\n\n/**\n * Replace `${VAR}` and `${VAR:-default}` placeholders in env values\n * with the corresponding `process.env` entry (or default), the same\n * way claude-code / cursor expand mcp-server env. When the variable\n * is unset and no default is given, the placeholder is dropped — the\n * upstream then sees the env var as absent rather than as the\n * literal `${MISSING_VAR}`, which it usually treats as \"use default\n * config\" rather than \"explicit empty token\".\n */\nfunction expandEnvPlaceholders(\n raw: Record<string, string>\n): Record<string, string> {\n const out: Record<string, string> = {}\n for (const [k, v] of Object.entries(raw)) {\n const expanded = v.replace(\n /\\$\\{([A-Z_][A-Z0-9_]*)(?::-([^}]*))?\\}/gi,\n (_match, name: string, fallback: string | undefined) => {\n const fromEnv = process.env[name]\n if (fromEnv !== undefined) return fromEnv\n if (fallback !== undefined) return fallback\n return \"\"\n }\n )\n // Drop the var entirely if it expanded to empty — keeps the\n // upstream from receiving an empty-string token + treating it as\n // a real (but invalid) credential.\n if (expanded.length === 0) continue\n out[k] = expanded\n }\n return out\n}\n\nasync function safeClose(client: Client | null): Promise<void> {\n if (!client) return\n try {\n await client.close()\n } catch {\n // best-effort\n }\n}\n\n/**\n * Open a transport for a discovered MCP. stdio spawns the command;\n * http/sse open over the network. Returns a connected `Client` on\n * success; throws with a useful message on failure.\n */\nasync function openClient(entry: ImportedMcpEntry): Promise<Client> {\n const snap = entry.snapshot\n const client = new Client(\n { name: \"agentproto-daemon-proxy\", version: \"0.1.0\" },\n { capabilities: {} }\n )\n if (snap.type === \"stdio\") {\n if (!snap.command) {\n throw new Error(\n `import \"${entry.alias}\" is stdio but has no command field`\n )\n }\n // claude-code / cursor / vscode all support `${VAR}` placeholders\n // in the env map (and the more permissive `${VAR:-default}`\n // form). Our scanner stores the snapshot verbatim — expand at\n // spawn time so live env changes work without a re-import, and\n // tokens like REPLICATE_API_TOKEN don't end up forwarded as the\n // literal string `${REPLICATE_API_TOKEN}`.\n const expandedEnv = expandEnvPlaceholders(snap.env ?? {})\n const transport = new StdioClientTransport({\n command: snap.command,\n args: snap.args ?? [],\n env: { ...process.env, ...expandedEnv } as Record<string, string>,\n // Pipe stderr so we can include it in the error message instead of\n // surfacing the opaque \"Connection closed\" MCP error code.\n stderr: \"pipe\",\n })\n const stderrBuf: string[] = []\n transport.stderr?.on(\"data\", (chunk: Buffer | string) => {\n stderrBuf.push(typeof chunk === \"string\" ? chunk : chunk.toString(\"utf8\"))\n if (stderrBuf.length > 40) stderrBuf.shift()\n })\n try {\n await client.connect(transport)\n } catch (err) {\n const stderrText = stderrBuf.join(\"\").trim()\n const msg = err instanceof Error ? err.message : String(err)\n throw new Error(stderrText ? `${msg}\\nstderr: ${stderrText.slice(-600)}` : msg)\n }\n return client\n }\n if (snap.type === \"http\") {\n if (!snap.url) throw new Error(`import \"${entry.alias}\" has no url`)\n const transport = new StreamableHTTPClientTransport(new URL(snap.url), {\n requestInit: {\n headers: snap.headers ?? {},\n },\n })\n await client.connect(transport)\n return client\n }\n if (snap.type === \"sse\") {\n if (!snap.url) throw new Error(`import \"${entry.alias}\" has no url`)\n const transport = new SSEClientTransport(new URL(snap.url), {\n requestInit: {\n headers: snap.headers ?? {},\n },\n })\n await client.connect(transport)\n return client\n }\n throw new Error(\n `import \"${entry.alias}\" has unsupported transport type \"${snap.type}\"`\n )\n}\n","/**\n * Quick Cloudflare Tunnel provider — zero-credential variant.\n *\n * Spawns `cloudflared tunnel --config <ours>` against an isolated\n * config file we write per-tunnel into the workspace, parses the\n * assigned `*.trycloudflare.com` URL out of cloudflared's stderr.\n * No CF account, no API token, no DNS records. Trade-off: URL is\n * ephemeral (different each run) and there's no Cloudflare Access\n * gating — auth happens at the upstream (gateway bearer token, or\n * whatever the tunneled service does for itself).\n *\n * ## Why we don't use `--url`\n *\n * `cloudflared --url http://...` synthesises an inline ingress block\n * but ALSO merges anything from `~/.cloudflared/config.yml`. If a user\n * has prior named-tunnel config there, hostname-specific rules can\n * shadow the inline rule and every request falls through to the\n * built-in `http_status:404` catch-all (the symptom: cloudflared logs\n * `ingressRule=2 originService=http_status:404` for every request,\n * origin never sees traffic). Writing our own config and passing it\n * via `--config` is hermetic — `~/.cloudflared/config.yml` is ignored\n * entirely, so the URL-forward rule always wins.\n *\n * Use this for: ad-hoc demos, \"let me try this from another machine\n * for 10 minutes\", iterating on the remote-MCP UX before committing\n * to a domain.\n *\n * For: persistent URLs / SSO gating, use the named-CF provider (TBD).\n *\n * ## cloudflared discovery\n *\n * Detected on PATH at start time. Missing → throw with a pointer to\n * the install instructions. We deliberately don't bundle binaries —\n * keeps the OSS package free of platform-specific blobs and defers the\n * \"which version\" maintenance tax.\n */\n\nimport { spawn, type ChildProcess } from \"node:child_process\"\nimport { promisify } from \"node:util\"\nimport { execFile } from \"node:child_process\"\nimport { mkdir, writeFile, rm } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport { randomBytes } from \"node:crypto\"\n\nimport type {\n ProviderStartOptions,\n ProviderStartResult,\n RemoteProvider,\n} from \"../remote-controller.js\"\n\nconst execFileAsync = promisify(execFile)\n\nconst URL_REGEX = /https:\\/\\/[a-z0-9-]+\\.trycloudflare\\.com/i\n\nconst STARTUP_TIMEOUT_MS = 30_000\n\nexport function quickTunnelProvider(): RemoteProvider {\n let child: ChildProcess | null = null\n let configPath: string | null = null\n\n return {\n id: \"quick\",\n async start(opts: ProviderStartOptions): Promise<ProviderStartResult> {\n await assertCloudflaredOnPath()\n const targetUrl = `http://${opts.target.host}:${opts.target.port}`\n\n // Per-tunnel sentinel config — the only reason it exists is to\n // override `~/.cloudflared/config.yml` so its ingress rules can't\n // shadow our inline `--url` rule. We deliberately do NOT include\n // an `ingress:` block here: quick-tunnel mode treats `--url` as\n // the routing source of truth, and a stray top-level `ingress:`\n // would fight it. Random suffix avoids collisions when dev\n // restarts overlap.\n const id = randomBytes(4).toString(\"hex\")\n const dir = join(opts.workspace, \".agentproto\")\n await mkdir(dir, { recursive: true })\n configPath = join(dir, `cloudflared-${id}.yml`)\n const configBody = [\n `# generated by agentproto-runtime — sentinel only`,\n `# overrides ~/.cloudflared/config.yml so its ingress rules`,\n `# don't shadow the inline --url rule. Safe to delete when the`,\n `# tunnel is down.`,\n `no-autoupdate: true`,\n `loglevel: debug`,\n ``,\n ].join(\"\\n\")\n await writeFile(configPath, configBody, \"utf8\")\n const proc = spawn(\n \"cloudflared\",\n [\"tunnel\", \"--config\", configPath, \"--url\", targetUrl],\n { stdio: [\"ignore\", \"pipe\", \"pipe\"], shell: false },\n )\n child = proc\n\n const url = await new Promise<string>((resolve, reject) => {\n let settled = false\n const timer = setTimeout(() => {\n if (settled) return\n settled = true\n try {\n proc.kill(\"SIGTERM\")\n } catch {\n /* noop */\n }\n reject(\n new Error(\n `cloudflared did not emit a public URL within ${STARTUP_TIMEOUT_MS / 1000}s`,\n ),\n )\n }, STARTUP_TIMEOUT_MS)\n\n const onData = (chunk: Buffer) => {\n const text = chunk.toString(\"utf8\")\n for (const line of text.split(/\\r?\\n/)) {\n if (line.length > 0) opts.onLog?.(`[cloudflared] ${line}`)\n }\n if (settled) return\n const match = text.match(URL_REGEX)\n if (match) {\n settled = true\n clearTimeout(timer)\n resolve(match[0])\n }\n }\n // cloudflared writes the URL to stderr (it reserves stdout for\n // proxied traffic / structured output in some modes). Watch\n // both for safety.\n proc.stderr?.on(\"data\", onData)\n proc.stdout?.on(\"data\", onData)\n\n proc.once(\"error\", err => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n reject(err)\n })\n proc.once(\"exit\", (code, signal) => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n reject(\n new Error(\n `cloudflared exited before emitting a URL (code=${code}, signal=${signal})`,\n ),\n )\n })\n })\n\n // Detach the resolver listener (we already captured the URL); leave\n // the log-forwarder attached so the gateway's RuntimeEvents stream\n // sees ongoing tunnel chatter.\n proc.once(\"exit\", (code, signal) => {\n opts.onLog?.(\n `[cloudflared] exited (code=${code ?? \"?\"} signal=${signal ?? \"-\"})`,\n )\n })\n\n return { publicUrl: url, pid: proc.pid ?? null }\n },\n\n async stop(): Promise<void> {\n const proc = child\n const cfg = configPath\n child = null\n configPath = null\n // Best-effort cleanup of the sentinel config — losing it means a\n // stale `.agentproto/cloudflared-<id>.yml` file, no functional\n // impact. We do this even if the proc never started.\n if (cfg) {\n try {\n await rm(cfg, { force: true })\n } catch {\n /* noop */\n }\n }\n if (!proc || proc.exitCode !== null) return\n proc.kill(\"SIGTERM\")\n // Hard-kill backstop after 3s if cloudflared ignores SIGTERM.\n const timer = setTimeout(() => {\n try {\n proc.kill(\"SIGKILL\")\n } catch {\n /* noop */\n }\n }, 3_000)\n timer.unref()\n await new Promise<void>(resolve => {\n if (proc.exitCode !== null) {\n clearTimeout(timer)\n resolve()\n return\n }\n proc.once(\"exit\", () => {\n clearTimeout(timer)\n resolve()\n })\n })\n },\n }\n}\n\nasync function assertCloudflaredOnPath(): Promise<void> {\n try {\n await execFileAsync(\"cloudflared\", [\"--version\"], { timeout: 3_000 })\n } catch {\n throw new Error(\n \"cloudflared not found on PATH. Install it first:\\n\" +\n \" macOS: brew install cloudflared\\n\" +\n \" Linux: https://pkg.cloudflare.com/index.html\\n\" +\n \" Windows: winget install --id Cloudflare.cloudflared\\n\" +\n \"Or download a prebuilt binary from https://github.com/cloudflare/cloudflared/releases.\",\n )\n }\n}\n","/**\n * RemoteController — owns the gateway's \"publish to the internet\" state.\n *\n * One singleton per gateway. Holds:\n * - the current tunnel provider's child process (cloudflared, …)\n * - the bearer token gating /mcp once the tunnel is up\n * - persisted state in `<workspace>/.agentproto/remote.json`\n *\n * The controller is the *only* component that mutates auth at runtime.\n * The HTTP server reads auth via a getter (see `AuthSource` in\n * http-server.ts), so flipping `enable() / disable()` here takes effect\n * on the next request — no restart, no race.\n *\n * ## Provider model\n *\n * Each provider implements `RemoteProvider` (start / stop / status).\n * v1 ships only `quick` (Cloudflare Quick Tunnel — no API key, no DNS,\n * ephemeral `*.trycloudflare.com` URL). Named CF Tunnel and Tailscale\n * land as additional implementations.\n *\n * ## Token model\n *\n * On enable we generate a 32-byte random bearer token, return it once\n * to the caller, and persist only its sha256 hash to disk. Same model\n * as a Stripe API key — losing the plaintext means rotating, not\n * recovering. This keeps `.agentproto/remote.json` safe to commit by\n * accident (it leaks the URL, not the credential).\n *\n * ## Security note\n *\n * The CF API token (when used by named-tunnel provider) is *never*\n * accepted as MCP tool input. The controller reads it from\n * `~/.config/agentproto/cloudflare.json` or `$CLOUDFLARE_API_TOKEN`.\n * Otherwise a remote agent could exfiltrate it through `remote_enable`.\n */\n\nimport { randomBytes, createHash } from \"node:crypto\"\nimport { mkdir, writeFile, readFile, chmod, rm } from \"node:fs/promises\"\nimport { existsSync } from \"node:fs\"\nimport { join } from \"node:path\"\n\nimport type { AuthOptions } from \"./http-server.js\"\nimport { quickTunnelProvider } from \"./remote-providers/quick.js\"\n\nexport interface RemoteState {\n provider: \"quick\"\n publicUrl: string\n bearerTokenHash: string\n createdAt: string\n /** PID of the supervised tunnel child process, if any. */\n pid: number | null\n /** Local target the tunnel forwards to (host + port). */\n target: { host: string; port: number }\n /**\n * Whether the tunnel exposes the gateway itself (true) or some other\n * local service (false). Bearer auth + loopback bypass only matter\n * for the gateway path; arbitrary-target tunnels are pure passthrough\n * and the daemon does not gate them.\n */\n exposesGateway: boolean\n}\n\nexport interface EnableInput {\n provider?: \"quick\"\n /**\n * Local port to expose. Defaults to the gateway's own port — i.e.\n * \"publish this MCP server.\" Pass any other port to expose a\n * different local service (Supabase 54371, a Vite dev server, …)\n * without spinning up a separate tunnel manager.\n */\n targetPort?: number\n /**\n * Host the tunnel forwards to. Defaults to `127.0.0.1`. Setting it\n * to `localhost` resolves through DNS (IPv6 first on most systems);\n * keep `127.0.0.1` unless the target is explicitly IPv6-bound.\n */\n targetHost?: string\n}\n\nexport interface EnableResult {\n publicUrl: string\n /**\n * Bearer token issued by this gateway. Only meaningful when the\n * tunnel exposes the gateway itself (default). For arbitrary-target\n * tunnels (`targetPort != gateway.port`) the daemon does not gate\n * the proxied service, and this is omitted.\n */\n bearerToken?: string\n /**\n * `<publicUrl>/mcp`. Only emitted when exposing the gateway.\n */\n mcpEndpoint?: string\n /**\n * Paste-ready `.mcp.json` snippet. Only emitted when exposing the\n * gateway.\n */\n mcpConfigSnippet?: string\n provider: \"quick\"\n target: { host: string; port: number }\n exposesGateway: boolean\n}\n\nexport interface RemoteStatus {\n enabled: boolean\n provider?: \"quick\"\n publicUrl?: string\n pid?: number | null\n createdAt?: string\n target?: { host: string; port: number }\n exposesGateway?: boolean\n /** Last error from the provider, if any (since last enable). */\n lastError?: string\n}\n\n/**\n * A pluggable tunnel provider.\n *\n * `start` returns the public URL once the upstream tunnel is ready\n * (e.g. for cloudflared, after parsing the trycloudflare.com URL out of\n * its stderr). `stop` is idempotent — calling it twice or on an\n * already-dead child must not throw.\n */\nexport interface RemoteProvider {\n readonly id: \"quick\"\n start(opts: ProviderStartOptions): Promise<ProviderStartResult>\n stop(): Promise<void>\n}\n\nexport interface ProviderStartOptions {\n /** Local target the tunnel forwards to. */\n target: { host: string; port: number }\n /** Workspace path — for log / state files. */\n workspace: string\n /** Called whenever the provider has a status update worth logging. */\n onLog?: (line: string) => void\n}\n\nexport interface ProviderStartResult {\n publicUrl: string\n pid: number | null\n}\n\nexport interface RemoteControllerOptions {\n workspace: string\n port: number\n /** Hook for surfacing provider logs through RuntimeEvents. */\n onLog?: (line: string) => void\n}\n\nconst STATE_FILE_REL = \".agentproto/remote.json\"\n\nexport class RemoteController {\n private state: RemoteState | null = null\n private bearerToken: string | null = null\n private provider: RemoteProvider | null = null\n private lastError: string | undefined\n private readonly opts: RemoteControllerOptions\n\n constructor(opts: RemoteControllerOptions) {\n this.opts = opts\n }\n\n /**\n * Auth getter handed to startHttpServer. The HTTP server calls this\n * on every request so flipping enable/disable is effective without\n * a restart.\n */\n readonly readAuth = (): AuthOptions => {\n if (this.bearerToken === null) return { mode: \"none\" }\n return { mode: \"bearer\", token: this.bearerToken }\n }\n\n status(): RemoteStatus {\n if (!this.state) {\n return { enabled: false, lastError: this.lastError }\n }\n return {\n enabled: true,\n provider: this.state.provider,\n publicUrl: this.state.publicUrl,\n pid: this.state.pid,\n createdAt: this.state.createdAt,\n target: this.state.target,\n exposesGateway: this.state.exposesGateway,\n lastError: this.lastError,\n }\n }\n\n async enable(input: EnableInput): Promise<EnableResult> {\n if (this.state) {\n // Idempotent: returning the existing config would leak the\n // bearer token (we only have the hash). Force teardown first so\n // re-enable always rotates the token. Surface this in the docs.\n throw new Error(\n \"remote tunnel already active — call remote_disable first to rotate\",\n )\n }\n const providerId = input.provider ?? \"quick\"\n const provider = pickProvider(providerId)\n this.lastError = undefined\n\n const target = {\n host: input.targetHost ?? \"127.0.0.1\",\n port: input.targetPort ?? this.opts.port,\n }\n const exposesGateway =\n target.host === \"127.0.0.1\" && target.port === this.opts.port\n\n let started: ProviderStartResult\n try {\n started = await provider.start({\n target,\n workspace: this.opts.workspace,\n onLog: line => {\n this.opts.onLog?.(line)\n },\n })\n } catch (err) {\n this.lastError = errToMessage(err)\n throw err\n }\n\n // Bearer auth + token issuance only matter when the tunnel exposes\n // *this* gateway. For arbitrary-target tunnels (e.g. Supabase on\n // 54371) the daemon is just provisioning a public passthrough; the\n // proxied service does its own authn.\n let bearerToken: string | null = null\n let bearerTokenHash = \"\"\n if (exposesGateway) {\n bearerToken = randomBytes(32).toString(\"base64url\")\n bearerTokenHash = sha256(bearerToken)\n }\n\n const state: RemoteState = {\n provider: providerId,\n publicUrl: started.publicUrl,\n bearerTokenHash,\n createdAt: new Date().toISOString(),\n pid: started.pid,\n target,\n exposesGateway,\n }\n\n this.state = state\n this.bearerToken = bearerToken\n this.provider = provider\n\n await persistState(this.opts.workspace, state)\n\n const result: EnableResult = {\n provider: providerId,\n publicUrl: started.publicUrl,\n target,\n exposesGateway,\n }\n if (exposesGateway && bearerToken) {\n const mcpEndpoint = `${started.publicUrl}/mcp`\n result.bearerToken = bearerToken\n result.mcpEndpoint = mcpEndpoint\n result.mcpConfigSnippet = buildMcpConfigSnippet(mcpEndpoint, bearerToken)\n }\n return result\n }\n\n async disable(): Promise<{ disabled: boolean }> {\n if (!this.state) return { disabled: false }\n const provider = this.provider\n this.state = null\n this.bearerToken = null\n this.provider = null\n if (provider) {\n try {\n await provider.stop()\n } catch (err) {\n this.lastError = errToMessage(err)\n }\n }\n await clearState(this.opts.workspace)\n return { disabled: true }\n }\n\n /**\n * Stop the provider on gateway shutdown. Does NOT clear persisted\n * state — that survives across restarts so the user can `remote_status`\n * after rebooting and see \"stale state, run remote_enable to refresh\".\n * (Stale-recovery semantics land in v2; today we just leave the file.)\n */\n async shutdown(): Promise<void> {\n if (this.provider) {\n try {\n await this.provider.stop()\n } catch {\n /* swallow — gateway is shutting down anyway */\n }\n }\n }\n}\n\n// ── helpers ────────────────────────────────────────────────────────────\n\nfunction pickProvider(id: \"quick\"): RemoteProvider {\n if (id === \"quick\") return quickTunnelProvider()\n // Exhaustive guard — adding \"named-cf\" / \"tailscale\" later forces this\n // switch to be updated, otherwise TS will yell.\n const _exhaustive: never = id\n throw new Error(`unknown remote provider: ${String(_exhaustive)}`)\n}\n\nfunction sha256(input: string): string {\n return createHash(\"sha256\").update(input).digest(\"hex\")\n}\n\nfunction errToMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err)\n}\n\nasync function persistState(workspace: string, state: RemoteState): Promise<void> {\n const dir = join(workspace, \".agentproto\")\n await mkdir(dir, { recursive: true })\n const file = join(dir, \"remote.json\")\n await writeFile(file, JSON.stringify(state, null, 2) + \"\\n\", \"utf8\")\n // mode 0600 — even though we only persist the hash, the URL itself\n // is sensitive (knowing it lets an attacker brute-force the token).\n try {\n await chmod(file, 0o600)\n } catch {\n /* best-effort on platforms where chmod is a noop */\n }\n}\n\nasync function clearState(workspace: string): Promise<void> {\n const file = join(workspace, \".agentproto/remote.json\")\n if (!existsSync(file)) return\n await rm(file, { force: true })\n}\n\n/**\n * Best-effort load of persisted state on boot. We don't restore the\n * bearer token from this — the hash is one-way — so a rebooted gateway\n * that finds a stale `remote.json` will surface it via `remote_status`\n * and require a fresh `remote_enable` to mint a new token.\n *\n * Exposed mostly for diagnostics; not used by the controller today.\n */\nexport async function loadPersistedState(\n workspace: string,\n): Promise<RemoteState | null> {\n const file = join(workspace, STATE_FILE_REL)\n if (!existsSync(file)) return null\n try {\n const raw = await readFile(file, \"utf8\")\n return JSON.parse(raw) as RemoteState\n } catch {\n return null\n }\n}\n\nfunction buildMcpConfigSnippet(endpoint: string, token: string): string {\n return JSON.stringify(\n {\n mcpServers: {\n \"agentproto-remote\": {\n transport: \"http\",\n url: endpoint,\n headers: { Authorization: `Bearer ${token}` },\n },\n },\n },\n null,\n 2,\n )\n}\n","/**\n * MCP tools that drive RemoteController — the gateway's \"publish to\n * the internet\" surface.\n *\n * Three tools, mirroring the controller's lifecycle:\n *\n * remote_enable — bring up a tunnel, mint bearer token, return the\n * public /mcp URL + a paste-ready .mcp.json snippet\n * remote_disable — tear down tunnel, revoke token, drop bearer auth\n * remote_status — read-only — provider, URL, pid, lastError\n *\n * Why this lives on the MCP surface (not a separate CLI):\n * - The user already has an MCP client connected (that's how they\n * started talking to the gateway in the first place). One tool call\n * replaces an entire CLI install + auth dance.\n * - The bearer token comes back as part of the MCP response, so it\n * doesn't have to land on the user's clipboard.\n */\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { z } from \"zod\"\n\nimport type { RemoteController } from \"./remote-controller.js\"\n\nexport interface RegisterRemoteToolsOptions {\n controller: RemoteController\n}\n\nfunction text(value: string | object): {\n content: Array<{ type: \"text\"; text: string }>\n} {\n return {\n content: [\n {\n type: \"text\",\n text: typeof value === \"string\" ? value : JSON.stringify(value, null, 2),\n },\n ],\n }\n}\n\nexport function registerRemoteTools(\n server: McpServer,\n opts: RegisterRemoteToolsOptions,\n): void {\n const { controller } = opts\n\n server.tool(\n \"remote_enable\",\n \"Publish a local port to the internet via Cloudflare. By default exposes \" +\n \"this gateway and gates it with a bearer token (returned ONCE in the \" +\n \"response — store it; only its hash is persisted). Pass `targetPort` to \" +\n \"tunnel a different local service (Supabase, dev server, …); in that mode \" +\n \"the daemon does not gate the proxied traffic — the upstream service \" +\n \"handles its own auth. Returns the public URL plus a paste-ready \" +\n \"`.mcp.json` snippet (gateway mode only). Re-running while a tunnel is \" +\n \"already up errors; call `remote_disable` first to rotate.\",\n {\n provider: z\n .enum([\"quick\"])\n .optional()\n .describe(\n \"Tunnel backend. `quick` = Cloudflare Quick Tunnel (no API key, ephemeral *.trycloudflare.com URL). Defaults to `quick`. Named-CF / Tailscale providers TBD.\",\n ),\n targetPort: z\n .number()\n .int()\n .min(1)\n .max(65535)\n .optional()\n .describe(\n \"Local port to expose. Defaults to this gateway's own port (= publish the MCP server). Pass another port to tunnel a different local service (e.g. 54371 for Supabase) — in that mode bearer auth is OFF since the upstream handles its own gating.\",\n ),\n targetHost: z\n .string()\n .optional()\n .describe(\n \"Host the tunnel forwards to. Defaults to `127.0.0.1`. Use `localhost` only if the target is explicitly IPv6-bound; cloudflared resolves DNS and IPv6-first lookups can break IPv4-only origins.\",\n ),\n },\n async ({ provider, targetPort, targetHost }) => {\n const result = await controller.enable({ provider, targetPort, targetHost })\n return text(result)\n },\n )\n\n server.tool(\n \"remote_disable\",\n \"Tear down the active remote tunnel and drop bearer auth back to \" +\n \"loopback-only. Idempotent — calling when no tunnel is active is a no-op.\",\n {},\n async () => {\n const result = await controller.disable()\n return text(result)\n },\n )\n\n server.tool(\n \"remote_status\",\n \"Report whether a remote tunnel is active. When active: provider, \" +\n \"public URL, supervised PID, createdAt. The bearer token itself is \" +\n \"never returned by status — it was shown once at enable.\",\n {},\n async () => {\n return text(controller.status())\n },\n )\n}\n","/**\n * `WorkspaceFs` — minimal `readFile` / `writeFile` adapter over a\n * workspace directory. Mirrors the `McpWorkspace.filesystem` shape\n * used by `@guilde/mcp` so the daemon can be plugged in as the\n * workspace backend for a Guilde MCP server (via its\n * `loadGuildWorkspace` injection point) without re-shimming.\n *\n * All paths are workspace-relative. Absolute paths are rejected to\n * keep the surface predictable when the daemon binds to a public\n * port.\n */\n\nimport { existsSync } from \"node:fs\"\nimport { mkdir, readFile as fsReadFile, writeFile as fsWriteFile } from \"node:fs/promises\"\nimport { dirname, isAbsolute, join, normalize, relative, resolve } from \"node:path\"\n\nexport interface WorkspaceFs {\n readFile(path: string): Promise<string>\n writeFile(path: string, content: string | Uint8Array): Promise<void>\n exists(path: string): Promise<boolean>\n}\n\nexport interface CreateWorkspaceFsOptions {\n /** Absolute path to the workspace root. */\n workspace: string\n}\n\nexport class WorkspacePathError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"WorkspacePathError\"\n }\n}\n\nexport function createWorkspaceFs(opts: CreateWorkspaceFsOptions): WorkspaceFs {\n const root = resolve(opts.workspace)\n\n function resolvePath(path: string): string {\n if (typeof path !== \"string\" || path.length === 0) {\n throw new WorkspacePathError(\"path must be a non-empty string\")\n }\n if (isAbsolute(path)) {\n throw new WorkspacePathError(\n \"absolute paths are not allowed; use a workspace-relative path\",\n )\n }\n const joined = normalize(join(root, path))\n const rel = relative(root, joined)\n if (rel.startsWith(\"..\") || isAbsolute(rel)) {\n throw new WorkspacePathError(\n `path escapes the workspace: '${path}'`,\n )\n }\n return joined\n }\n\n return {\n async readFile(path) {\n const abs = resolvePath(path)\n const buf = await fsReadFile(abs)\n return buf.toString(\"utf8\")\n },\n async writeFile(path, content) {\n const abs = resolvePath(path)\n await mkdir(dirname(abs), { recursive: true })\n await fsWriteFile(abs, content)\n },\n async exists(path) {\n try {\n const abs = resolvePath(path)\n return existsSync(abs)\n } catch {\n return false\n }\n },\n }\n}\n","/**\n * @agentproto/runtime — long-running gateway around an agentproto\n * workspace dir.\n *\n * Composes:\n * - `@agentproto/mcp-server` (CRUD verbs over registered specs)\n * - HTTP transport (Streamable HTTP) on a configurable port\n * - HEARTBEAT.md autonomy loop\n * - Append-only conversation persistence (`conversations/<id>.md`)\n * - Workspace filesystem adapter (compatible with the\n * `McpWorkspace.filesystem` shape used by `@guilde/mcp`)\n *\n * Single entry point: `createGateway(opts)`. Returns a handle with\n * `url` and `stop()` — the rest of the surface lives on the HTTP\n * server.\n */\n\nimport { randomUUID } from \"node:crypto\"\nimport { existsSync } from \"node:fs\"\nimport { readFile } from \"node:fs/promises\"\nimport { join, resolve } from \"node:path\"\nimport { createMcpServer } from \"@agentproto/mcp-server\"\nimport type { DoctypeSpec } from \"@agentproto/manifest\"\n\nimport { writeRuntimeMeta } from \"./agentproto-dir.js\"\nimport { registerCommandTools } from \"./command-tools.js\"\nimport { fileConversationStore } from \"./conversations.js\"\nimport { createRuntimeEvents } from \"./events.js\"\nimport { registerFsTools } from \"./fs-tools.js\"\nimport { registerSessionTools } from \"./session-tools.js\"\nimport { startHeartbeat, type BuildHeartbeatAgent } from \"./heartbeat.js\"\nimport {\n startHttpServer,\n type AuthOptions,\n type AgentAdapterResolver,\n type AgentAdapterLister,\n} from \"./http-server.js\"\nimport {\n createSessionsRegistry,\n type SessionsRegistry,\n type PtyFactory,\n} from \"./sessions.js\"\nimport { McpProxyRegistry } from \"./mcp-proxy.js\"\n\nexport type {\n AgentAdapterResolver,\n AgentAdapterLister,\n AdapterListEntry,\n} from \"./http-server.js\"\nexport type {\n AgentSessionLike,\n AgentStreamEvent,\n SessionDescriptor,\n SessionKind,\n SessionStatus,\n SpawnSessionInput,\n SpawnAgentInput,\n SessionsRegistry,\n} from \"./sessions.js\"\nimport { RemoteController } from \"./remote-controller.js\"\nimport { registerRemoteTools } from \"./remote-tools.js\"\nimport { createWorkspaceFs, type WorkspaceFs } from \"./workspace-fs.js\"\n\nexport type { ConversationStore, ConversationMeta, ConversationTurn } from \"./conversations.js\"\nexport type { HeartbeatRunner, BuildHeartbeatAgent, HeartbeatAgent } from \"./heartbeat.js\"\nexport type { RuntimeEvent, RuntimeEvents } from \"./events.js\"\nexport type { WorkspaceFs } from \"./workspace-fs.js\"\nexport { parseDuration } from \"./heartbeat.js\"\nexport { createWorkspaceFs } from \"./workspace-fs.js\"\nexport {\n sweepStaleRuntimeMetas,\n unlinkRuntimeMeta,\n readRuntimeMeta,\n type RuntimeMeta,\n} from \"./agentproto-dir.js\"\nexport { fileConversationStore } from \"./conversations.js\"\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnySpec = DoctypeSpec<any, any>\n\nexport interface CreateGatewayOptions {\n /** Absolute path to the workspace dir. */\n workspace: string\n /** AIP doctype specs to expose as MCP CRUD verbs. */\n specs: readonly AnySpec[]\n /** Port to bind. Default 18790. */\n port?: number\n /** Bind host. Default `127.0.0.1` (loopback). Set `0.0.0.0` for LAN. */\n bind?: string\n /** Auth mode. Default `none` (safe only on loopback). */\n auth?: AuthOptions\n /**\n * Resolves a heartbeat-runnable agent from its workspace id.\n * Required for HEARTBEAT.md to do anything; without it ticks emit\n * `heartbeat-error` events instead of generating.\n */\n buildAgent?: BuildHeartbeatAgent\n /** Server name advertised over MCP. */\n name?: string\n /** Server version advertised over MCP. */\n version?: string\n /**\n * Run BOOT.md once at startup. Pass `false` to disable. Defaults to\n * `true`. The boot file is plain markdown — frontmatter-free; the\n * agent named in `defaultBootAgent` (or skipped if unset) gets the\n * body as a single prompt and the reply is appended to a `boot-<iso>`\n * conversation.\n */\n boot?: boolean\n /** Agent id used for BOOT.md if no per-file frontmatter. */\n defaultBootAgent?: string\n /** Optional adapter resolver — when provided, enables\n * `POST /sessions/agent` (long-running agent CLIs like\n * claude-code / hermes via the @agentproto/cli adapter system).\n * Without this, /sessions still works for raw `argv` spawns. */\n resolveAgentAdapter?: AgentAdapterResolver\n /** Optional adapter lister — when provided, enables\n * `GET /adapters` HTTP route + `list_adapters` MCP tool so UIs\n * can discover what's installed on the host. */\n listAgentAdapters?: AgentAdapterLister\n /** Optional PTY factory (node-pty wrapper, typically from the cli\n * layer's `loadNodePtyFactory()`). When provided, enables\n * `POST /sessions/terminal`, the `start_terminal_session` MCP\n * tool family, and the `/sessions/:id/pty` WebSocket. Without it,\n * those routes return 501 / the MCP tools aren't registered. */\n spawnPty?: PtyFactory\n /** Override the per-boot bearer token. Default: `randomUUID()`.\n * Tests can pin a known value; production should always let\n * the gateway generate fresh. The token is written into\n * `<workspace>/.agentproto/runtime.json` (mode 0600) and required\n * on mutating `/sessions/*` routes + the PTY WS upgrade. */\n token?: string\n /** Trusted browser origins allowed to drive mutating routes\n * without a bearer token. See `RuntimeHttpServerOptions.allowedOrigins`\n * for match semantics. Default: localhost on any port. */\n allowedOrigins?: readonly string[]\n /** When true, drop the localhost-wildcard defaults — only the\n * explicit `allowedOrigins` list is honoured. */\n strictOrigins?: boolean\n}\n\nexport interface GatewayHandle {\n url: string\n workspace: string\n workspaceFs: WorkspaceFs\n registered: readonly string[]\n /** Sessions registry — exposed so MCP tools / external spawners\n * inside the same process can register their child processes for\n * visibility through /sessions and the CLI TUI. */\n sessions: SessionsRegistry\n /** Per-boot bearer token required on mutating /sessions/* routes\n * + WS PTY upgrades. Exposed so an embedding host (e.g. the CLI\n * shell that hosts the gateway in-process) can pass it to child\n * tools without re-reading the runtime.json file. */\n token: string\n stop(): Promise<void>\n}\n\n/**\n * Spin up the gateway. Order:\n * 1. Build MCP server + load AIP-40 extensions\n * 2. Build conversation store + workspace fs adapter\n * 3. (optional) Run BOOT.md once\n * 4. Start HTTP server\n * 5. Start heartbeat ticker\n *\n * `stop()` reverses 4–5 (heartbeat first, then HTTP). The MCP server\n * is owned by the HTTP server's per-session transports and is closed\n * implicitly when those close.\n */\nexport async function createGateway(\n opts: CreateGatewayOptions,\n): Promise<GatewayHandle> {\n const workspace = resolve(opts.workspace)\n if (!existsSync(workspace)) {\n throw new Error(`runtime: workspace dir does not exist: ${workspace}`)\n }\n const port = opts.port ?? 18790\n\n const events = createRuntimeEvents()\n const conversations = fileConversationStore({ workspace })\n const workspaceFs = createWorkspaceFs({ workspace })\n\n // Singleton controller for \"publish to the internet\" state. Created\n // disabled — auth stays `mode: \"none\"` until `remote_enable` is\n // called. Tunnel logs flow through the events stream so `/events`\n // subscribers see cloudflared chatter.\n const remote = new RemoteController({\n workspace,\n port,\n onLog: line =>\n events.emit({\n type: \"remote-log\",\n at: new Date().toISOString(),\n line,\n }),\n })\n\n // Build a server once eagerly so we can capture `registered` for\n // `/health`. The server is NOT used for serving — every `/mcp`\n // request gets its own freshly-constructed pair, mirroring the\n // SDK's official stateless pattern. See the comment on\n // `RuntimeHttpServerOptions.mcpServerFactory` for why.\n const { registered } = await createMcpServer({\n specs: opts.specs,\n workspace,\n name: opts.name ?? \"agentproto-runtime\",\n version: opts.version ?? \"0.1.0-alpha\",\n })\n\n // Sessions registry — single instance per gateway, captured by\n // the per-request mcpServerFactory closure below + handed to\n // startHttpServer for the /sessions HTTP routes. Declared here\n // (above the factory) so its identifier is visible at closure-\n // build time, even though the factory only invokes later.\n const sessions = createSessionsRegistry({\n ...(opts.spawnPty ? { spawnPty: opts.spawnPty } : {}),\n // Resume hook: when a prompt arrives for a dead agent-cli row\n // (typical after daemon restart), the registry calls back into\n // the adapter resolver to re-create the AgentSession with\n // `resumeSessionId = adapterSessionId`. ACP semantics: the\n // upstream provider reattaches to the prior conversation.\n // Unwired (no resolveAgentAdapter) → legacy \"not an agent\n // session\" error, user must spawn fresh.\n ...(opts.resolveAgentAdapter\n ? {\n resumeAgent: async ({ adapterSlug, cwd, resumeSessionId }) => {\n const adapter = await opts.resolveAgentAdapter!(adapterSlug)\n if (!adapter) return null\n try {\n return await adapter.startSession({ cwd, resumeSessionId })\n } catch (err) {\n console.warn(\n `[agentproto] resumeAgent('${adapterSlug}', ${resumeSessionId}) failed: ${\n err instanceof Error ? err.message : String(err)\n }`\n )\n return null\n }\n },\n }\n : {}),\n })\n\n // Per-boot bearer token. Required on mutating /sessions/* routes\n // and on the WS upgrade for /sessions/:id/pty. Persisted to\n // runtime.json (mode 0600) so the same-user CLI can read it; a\n // browser-loaded localhost page can't.\n const token = opts.token ?? randomUUID()\n\n // MCP proxy — single registry that holds open Client connections\n // to every imported MCP server. The per-request mcpServerFactory\n // captures it so each /mcp request reuses the same upstream\n // sessions instead of re-spawning stdio children.\n const mcpProxy = new McpProxyRegistry()\n\n const mcpServerFactory = async () => {\n const { server } = await createMcpServer({\n specs: opts.specs,\n workspace,\n name: opts.name ?? \"agentproto-runtime\",\n version: opts.version ?? \"0.1.0-alpha\",\n })\n // Canonical filesystem tools so remote MCP clients (cloud\n // workspace-providers, IDEs, ad-hoc tooling) can read/write the\n // workspace without each implementing AIP-aware glue. Names match\n // `@modelcontextprotocol/server-filesystem` for drop-in compat.\n registerFsTools(server, { workspace })\n // Subprocess execution — the runtime's superpower for cloud\n // agents. Any allowlisted CLI on the user's machine (claude, gh,\n // pnpm, …) is reachable via `execute_command`. Allowlist lives at\n // `.agentproto/allowed-commands.json`; default-deny.\n registerCommandTools(server, { workspace })\n // Remote-tunnel lifecycle. The controller is a singleton on the\n // gateway, so registering its tools per-request is just rebinding\n // the same closures — the underlying state lives in `remote`.\n registerRemoteTools(server, { controller: remote })\n // Agent-session orchestration — operators (Mastra agents in\n // cloud Guilde, Claude Code as a sub-agent, …) drive long-running\n // claude/hermes/aider sessions on the user's machine through\n // these MCP tools. The registry + adapter resolver are\n // singletons on the gateway, same closure-rebind pattern.\n registerSessionTools(server, {\n registry: sessions,\n mcpProxy,\n ptyEnabled: opts.spawnPty != null,\n ...(opts.resolveAgentAdapter\n ? { resolveAgentAdapter: opts.resolveAgentAdapter }\n : {}),\n ...(opts.listAgentAdapters\n ? { listAgentAdapters: opts.listAgentAdapters }\n : {}),\n })\n return server\n }\n\n // ── boot ─────────────────────────────────────────────────────────\n if (opts.boot !== false) {\n await runBoot(workspace, opts, conversations, events).catch((err) => {\n events.emit({\n type: \"heartbeat-error\",\n at: new Date().toISOString(),\n agent: opts.defaultBootAgent,\n error: `BOOT.md failed: ${err instanceof Error ? err.message : String(err)}`,\n })\n })\n }\n\n const heartbeat = startHeartbeat({\n workspace,\n conversations,\n events,\n buildAgent: opts.buildAgent ?? noopBuildAgent,\n })\n\n const http = await startHttpServer({\n port,\n bind: opts.bind,\n // Auth is read on every request via this getter. `opts.auth`\n // (when provided) is the startup default and represents the\n // operator's intent — bearer-only deployments stay bearer-only\n // even when no remote tunnel is up. The controller's auth wins\n // once a tunnel is enabled (it issues a fresh token); on disable\n // we fall back to `opts.auth` if set, otherwise `mode: \"none\"`.\n auth: () => {\n const remoteAuth = remote.readAuth()\n if (remoteAuth.mode === \"bearer\") return remoteAuth\n return opts.auth ?? { mode: \"none\" }\n },\n mcpServerFactory,\n conversations,\n events,\n heartbeat,\n sessions,\n mcpProxy,\n token,\n ptyEnabled: opts.spawnPty != null,\n ...(opts.allowedOrigins ? { allowedOrigins: opts.allowedOrigins } : {}),\n ...(opts.strictOrigins ? { strictOrigins: true } : {}),\n ...(opts.resolveAgentAdapter\n ? { resolveAgentAdapter: opts.resolveAgentAdapter }\n : {}),\n ...(opts.listAgentAdapters\n ? { listAgentAdapters: opts.listAgentAdapters }\n : {}),\n meta: { workspace, registered },\n })\n\n heartbeat.start()\n events.emit({\n type: \"boot\",\n at: new Date().toISOString(),\n workspace,\n registered,\n })\n\n // Record a snapshot of the running config so external tooling /\n // shell users can introspect a live gateway via\n // `cat <workspace>/.agentproto/runtime.json`. Best-effort — failure\n // here doesn't gate the gateway being functional.\n void writeRuntimeMeta(workspace, {\n workspace,\n port,\n bind: opts.bind ?? \"127.0.0.1\",\n pid: process.pid,\n startedAt: new Date().toISOString(),\n name: opts.name ?? \"agentproto-runtime\",\n registered,\n token,\n })\n\n return {\n url: http.url,\n workspace,\n workspaceFs,\n registered,\n sessions,\n token,\n async stop() {\n heartbeat.stop()\n // Kill all live sessions before tearing down HTTP — otherwise\n // long-running children inherit the daemon's listening socket\n // and stay around as zombies after the parent exits.\n sessions.shutdown()\n // Close upstream MCP clients (their stdio children would\n // otherwise leak the same way).\n await mcpProxy.closeAll()\n // Tear the tunnel before the HTTP listener — otherwise cloudflared\n // briefly proxies to a dead port and surfaces 502s to any in-flight\n // remote client.\n await remote.shutdown()\n await http.stop()\n },\n }\n}\n\n// ── helpers ──────────────────────────────────────────────────────────\n\nconst noopBuildAgent: BuildHeartbeatAgent = async () => null\n\nasync function runBoot(\n workspace: string,\n opts: CreateGatewayOptions,\n conversations: import(\"./conversations.js\").ConversationStore,\n events: import(\"./events.js\").RuntimeEvents,\n): Promise<void> {\n const path = join(workspace, \"BOOT.md\")\n if (!existsSync(path)) return\n const body = (await readFile(path, \"utf8\")).trim()\n if (!body) return\n if (!opts.buildAgent || !opts.defaultBootAgent) return\n\n const agent = await opts.buildAgent(opts.defaultBootAgent)\n if (!agent) return\n\n const conversationId = `boot-${new Date().toISOString().slice(0, 19).replace(/[:.]/g, \"-\")}`\n await conversations.open(conversationId, { agent: opts.defaultBootAgent })\n await conversations.appendTurn(conversationId, \"user\", body, {\n attribution: \"boot\",\n })\n const reply = await agent.generate(body)\n await conversations.appendTurn(conversationId, \"assistant\", reply.text, {\n attribution: opts.defaultBootAgent,\n })\n events.emit({\n type: \"heartbeat-fired\",\n at: new Date().toISOString(),\n agent: opts.defaultBootAgent,\n conversationId,\n prompt: body,\n reply: reply.text,\n durationMs: 0,\n })\n}\n","/**\n * `agentproto serve [--workspace <dir>] [--port <n>] [--connect <wss>]`\n *\n * The single canonical agentproto daemon. Boots a local gateway\n * (HTTP + MCP server + sessions registry + workspace fs +\n * heartbeat) on `--port` (default 18790), and OPTIONALLY opens an\n * outbound WebSocket tunnel to a host (Guilde-shaped API) when\n * `--connect <url>` is set. With or without the tunnel:\n *\n * - HTTP /sessions, /sessions/agent, /sessions/:id/* routes work\n * - MCP tools (start_agent_session, prompt_agent_session, …) are\n * reachable via the daemon's /mcp transport\n * - the LocalDaemonSessionsCard in guilde-web sees every spawn\n *\n * When the tunnel is up, every tunnel-driven spawn is also adopted\n * into the gateway's sessions registry via the\n * `createTunnelServer.onChildSpawned` hook, so an operator\n * dispatching from the cloud lands in the same /sessions list as a\n * user spawning locally — single source of truth for what's running\n * on the user's machine.\n *\n * Replaces the old `playground/scripts/gateway.ts` for production\n * use (the playground keeps its own script for the MCP CRUD\n * doctype demo). v1 reuses createGateway with empty specs + a\n * noop heartbeat; the playground variant adds toolSpec/agentSpec/\n * etc. for its specific spec-authoring use case.\n *\n * Reconnect-with-backoff is built in for the tunnel. The local\n * gateway stays up across reconnects — only the tunnel cycles.\n *\n * Authorization: v0 trusts every spawn frame the host sends — there\n * is no policy file. Future work will gate spawn requests on a\n * `~/.agentproto/policy.toml` allowlist (see project_agentproto_repos\n * memory). The token is the only access control today.\n */\n\nimport { parseArgs } from \"node:util\"\nimport { hostname, userInfo } from \"node:os\"\nimport { resolve as resolvePath } from \"node:path\"\nimport { promises as fs } from \"node:fs\"\nimport { randomUUID } from \"node:crypto\"\nimport * as childProc from \"node:child_process\"\nimport {\n readHost,\n isExpired,\n formatExpiry,\n} from \"../util/credentials.js\"\nimport { loadNodePtyFactory, type PtyFactory } from \"../util/pty-factory.js\"\nimport { loadConfig } from \"@agentproto/runtime/config\"\nimport { loadWorkspacesConfig } from \"@agentproto/runtime/workspaces-config\"\nimport {\n createTunnelServer,\n wrapWebSocket,\n type FrameSink,\n} from \"@agentproto/acp/tunnel\"\nimport {\n createGateway,\n sweepStaleRuntimeMetas,\n unlinkRuntimeMeta,\n type AgentAdapterResolver,\n type GatewayHandle,\n} from \"@agentproto/runtime\"\nimport { createAgentCliRuntime } from \"@agentproto/driver-agent-cli\"\nimport {\n resolveAdapter,\n listInstalledAdapters,\n} from \"../registry/resolve.js\"\nimport WebSocket from \"ws\"\n\ninterface ServeOpts {\n /** Workspace dir. Defaults to cwd. */\n workspace: string\n /** Local HTTP port. Default 18790. */\n port: number\n /** Bind addr. Default 127.0.0.1. */\n bind: string\n /** Optional cloud WS URL. When unset, daemon runs local-only. */\n connect?: string\n token?: string\n label: string\n /** Initial reconnect delay in ms; doubled on each failure up to 30s. */\n reconnectMinMs?: number\n reconnectMaxMs?: number\n /** Extra Origin patterns trusted to drive mutating /sessions/* routes\n * + the PTY WS without a Bearer token. Localhost is always trusted\n * by default; add production origins via repeatable `--allow-origin`. */\n allowedOrigins?: readonly string[]\n /** When true, drop the localhost-wildcard default. Only `allowedOrigins`\n * is honoured. Useful for hardened / shared-host setups. */\n strictOrigins?: boolean\n}\n\nexport async function runServe(args: readonly string[]): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n allowPositionals: false,\n strict: true,\n options: {\n connect: { type: \"string\", short: \"c\" },\n token: { type: \"string\", short: \"t\" },\n label: { type: \"string\", short: \"l\" },\n workspace: { type: \"string\", short: \"w\" },\n port: { type: \"string\", short: \"p\" },\n bind: { type: \"string\", short: \"b\" },\n \"allow-origin\": { type: \"string\", multiple: true },\n interactive: { type: \"boolean\", short: \"i\" },\n profile: { type: \"string\" },\n },\n })\n\n // Load ~/.agentproto/config.json once and fall back through it for\n // every knob below. Order: CLI flag → env var → config.json →\n // hardcoded default. Errors during read are non-fatal — the file\n // is optional. Resolves to an empty object when missing.\n const cfg = await loadConfig()\n\n // ── Profile resolution ─────────────────────────────────────────\n // `--profile <name>` (or `activeProfile` in config.json) picks a\n // named bundle from `profiles[name]` and shallow-merges it OVER the\n // top-level daemon/tunnel. A profile only needs to declare the\n // fields that differ from the top-level (typically tunnel.host +\n // tunnel.token); everything else falls through.\n //\n // Explicit `--profile <name>` is fatal if the profile doesn't\n // exist (better than silently using top-level defaults — that\n // path led to \"why is it connecting to prod?\" head-scratching).\n // An `activeProfile` pointing at a missing profile only warns,\n // since the user may have just deleted it.\n const profileName = values.profile ?? cfg.activeProfile\n const profile = profileName ? cfg.profiles?.[profileName] : undefined\n if (values.profile && !profile) {\n process.stderr.write(\n `agentproto serve: profile \"${values.profile}\" not found in ` +\n `~/.agentproto/config.json. Available: ${\n cfg.profiles ? Object.keys(cfg.profiles).join(\", \") || \"(none)\" : \"(no profiles block)\"\n }\\n`\n )\n return 2\n }\n if (cfg.activeProfile && !values.profile && !profile) {\n process.stderr.write(\n `agentproto serve: ⚠ activeProfile=\"${cfg.activeProfile}\" but no matching ` +\n `entry in profiles[]; falling back to top-level config.\\n`\n )\n }\n if (profile && process.stdout.isTTY) {\n process.stdout.write(\n `agentproto serve: using profile \"${profileName}\"\\n`\n )\n }\n\n const cfgDaemon = { ...(cfg.daemon ?? {}), ...(profile?.daemon ?? {}) }\n const cfgTunnel = { ...(cfg.tunnel ?? {}), ...(profile?.tunnel ?? {}) }\n\n // Workspace defaults: --workspace > config.json > cwd. Validated\n // below — must exist + be a directory.\n const workspace = resolvePath(\n values.workspace ?? cfgDaemon.workspace ?? process.cwd(),\n )\n try {\n const stat = await fs.stat(workspace)\n if (!stat.isDirectory()) {\n process.stderr.write(\n `agentproto serve: --workspace \"${workspace}\" is not a directory.\\n`\n )\n return 2\n }\n } catch {\n process.stderr.write(\n `agentproto serve: --workspace \"${workspace}\" does not exist.\\n` +\n ` Create it first: mkdir -p \"${workspace}\"\\n`\n )\n return 2\n }\n\n const port = values.port\n ? Number.parseInt(values.port, 10)\n : typeof cfgDaemon.port === \"number\"\n ? cfgDaemon.port\n : 18790\n if (!Number.isFinite(port) || port <= 0 || port > 65535) {\n process.stderr.write(`agentproto serve: invalid --port \"${values.port}\".\\n`)\n return 2\n }\n\n // Default label is informative — the host's UI shows it next to\n // every spawn so users know which laptop is executing what.\n const label = values.label ?? cfgDaemon.label ?? `${userInfo().username}@${hostname()}`\n\n // tunnel.host + tunnel.autoconnect from config feed --connect when\n // the user hasn't passed one. autoconnect=false leaves it CLI-only.\n const connectFlag =\n values.connect ??\n (cfgTunnel.autoconnect && cfgTunnel.host ? cfgTunnel.host : undefined)\n\n // Token resolution precedence:\n // 1. --token <jwt> — explicit override\n // 2. $AGENTPROTO_TOKEN — env, useful for CI / docker\n // 3. config.json `tunnel.token` (or profile.tunnel.token) — set\n // via `agentproto config set tunnel.token` or hand-edited.\n // Profiles use this so a per-environment token lives next to\n // its host without the credentials.json host-key footgun.\n // 4. ~/.agentproto/credentials.json[host] — `agentproto auth login`\n //\n // Step 4 only applies when --connect is set (we have a host to look\n // up) and the credential isn't expired. Expiry is non-fatal: we log\n // a warning and let the host reject the connect; that surfaces a\n // clearer error than a silent 401 mid-tunnel.\n let token: string | undefined =\n values.token ?? process.env.AGENTPROTO_TOKEN ?? cfgTunnel.token\n if (!token && connectFlag) {\n const cred = await readHost(connectFlag)\n if (cred) {\n if (isExpired(cred)) {\n process.stderr.write(\n `agentproto serve: ⚠ credentials for ${connectFlag} are expired (${formatExpiry(cred)}). ` +\n `Re-run \\`agentproto auth login --host ${connectFlag}\\`.\\n`\n )\n }\n token = cred.token\n process.stdout.write(\n `agentproto serve: using token from credentials.json (${formatExpiry(cred)})\\n`\n )\n }\n }\n\n // `--allow-origin <url>` is repeatable. parseArgs gives us a string[]\n // when `multiple: true` is set. Origins are merged with config's\n // daemon.allowedOrigins so CLI flags ADD to (not replace) the config.\n const allowOriginRaw = values[\"allow-origin\"]\n const cliOrigins = Array.isArray(allowOriginRaw) ? allowOriginRaw : []\n const cfgOrigins = Array.isArray(cfgDaemon.allowedOrigins)\n ? cfgDaemon.allowedOrigins\n : []\n const merged = [...new Set([...cfgOrigins, ...cliOrigins])]\n const allowedOrigins = merged.length > 0 ? merged : undefined\n\n const opts: ServeOpts = {\n workspace,\n port,\n bind: values.bind ?? cfgDaemon.bind ?? \"127.0.0.1\",\n ...(connectFlag ? { connect: connectFlag } : {}),\n ...(token ? { token } : {}),\n label,\n ...(allowedOrigins ? { allowedOrigins } : {}),\n ...(cfgDaemon.strictOrigins === true ? { strictOrigins: true } : {}),\n }\n\n // ── adapter resolver (powers MCP start_agent_session) ──\n // Wires the cli's adapter registry into the gateway's\n // /sessions/agent route + the start_agent_session MCP tool.\n // When unwired, those routes return 501 with a clear message.\n const resolveAgentAdapter: AgentAdapterResolver = async slug => {\n try {\n const adapter = await resolveAdapter(slug)\n const runtime = createAgentCliRuntime(adapter.handle)\n return {\n async startSession({ cwd, resumeSessionId }) {\n return runtime.start({\n cwd,\n ...(resumeSessionId ? { resumeSessionId } : {}),\n })\n },\n commandPreview:\n `${adapter.handle.bin} ${(adapter.handle.bin_args ?? []).join(\" \")}`.trim(),\n }\n } catch (err) {\n console.warn(\n `[agentproto serve] resolveAgentAdapter('${slug}') failed: ${\n err instanceof Error ? err.message : String(err)\n }`\n )\n return null\n }\n }\n\n // ── pty factory ──\n // Resolved once at boot and shared between the local gateway (powers\n // POST /sessions/terminal + the four start_terminal_session MCP\n // tools + the WS /sessions/:id/pty bridge) AND the tunnel server\n // below (cloud-driven spawns with pty:true on the spawn frame).\n // When node-pty is missing, the factory is null and both paths\n // gracefully degrade — PTY routes return 501 / the tunnel rejects\n // pty:true spawns.\n const spawnPty = await loadNodePtyFactory()\n\n // ── boot the gateway ──\n // Empty specs + noop buildAgent. The playground gateway script\n // still has its own setup for spec authoring + Mastra heartbeat.\n let gateway: GatewayHandle\n try {\n gateway = await createGateway({\n workspace: opts.workspace,\n port: opts.port,\n bind: opts.bind,\n specs: [],\n name: \"agentproto-serve\",\n // BOOT.md is silly for a tunnel daemon — skip it.\n boot: false,\n resolveAgentAdapter,\n // Discovery for UIs / operators — `GET /adapters` + `list_adapters`\n // MCP tool. Walks node_modules @agentproto/adapter-* on each call;\n // cheap enough that we don't bother caching here.\n listAgentAdapters: listInstalledAdapters,\n ...(spawnPty ? { spawnPty } : {}),\n ...(opts.allowedOrigins\n ? { allowedOrigins: opts.allowedOrigins }\n : {}),\n ...(opts.strictOrigins ? { strictOrigins: true } : {}),\n })\n } catch (err) {\n process.stderr.write(\n `agentproto serve: gateway boot failed — ${\n err instanceof Error ? err.message : String(err)\n }\\n`\n )\n return 1\n }\n\n printBootBanner({\n url: gateway.url,\n workspace: gateway.workspace,\n ptyEnabled: spawnPty != null,\n allowedOrigins: opts.allowedOrigins,\n strictOrigins: opts.strictOrigins === true,\n connect: opts.connect,\n })\n\n // ── stale runtime.json sweep ──\n // Other workspaces may carry leftover runtime.json files from\n // previous daemon processes that didn't shut down gracefully\n // (kill -9, crash, reboot). Their tokens are stale; the CLI's\n // discovery layer would otherwise pick them up and send wrong\n // tokens to THIS daemon, producing a confusing 401. Clean them\n // here at boot so the user doesn't have to.\n try {\n const wsConfig = await loadWorkspacesConfig()\n const paths = wsConfig.workspaces.map(w => w.path)\n const cleaned = await sweepStaleRuntimeMetas(paths, opts.workspace)\n if (cleaned.length > 0) {\n process.stderr.write(\n `${color.dim}cleaned ${cleaned.length} stale runtime.json file(s) (dead PID)${color.reset}\\n`,\n )\n }\n } catch {\n // workspaces.json may not exist yet — no cleanup needed.\n }\n\n // ── shutdown wiring (covers both local-only and tunnel modes) ──\n const aborter = new AbortController()\n let shuttingDown = false\n const shutdown = async (signal: NodeJS.Signals): Promise<void> => {\n if (shuttingDown) return\n shuttingDown = true\n process.stderr.write(\n `\\n${color.dim}── shutting down (${signal}) ──${color.reset}\\n`,\n )\n aborter.abort()\n await gateway.stop().catch(() => undefined)\n // Delete our own runtime.json so the next CLI invocation doesn't\n // discover it as a \"live daemon\". Best-effort — the next boot\n // would clean it up anyway via the sweep above.\n await unlinkRuntimeMeta(opts.workspace).catch(() => undefined)\n process.exit(0)\n }\n process.once(\"SIGINT\", () => void shutdown(\"SIGINT\"))\n process.once(\"SIGTERM\", () => void shutdown(\"SIGTERM\"))\n // Terminal-window close / SSH-disconnect / logout → SIGHUP. Without\n // a handler, Node default-terminates the process which bypasses our\n // gateway.stop() — sessions.json then never gets the final flush.\n // Registry's `process.on(\"exit\")` belt-and-suspenders catches it\n // too, but firing the same logical path here gives a clean shutdown\n // banner + tunnel teardown.\n process.once(\"SIGHUP\", () => void shutdown(\"SIGHUP\"))\n\n // ── interactive mode: chain into the watch TUI as a child ─────\n // Spawn `agentproto sessions --watch` in the same terminal,\n // inheriting stdio. When the child exits (q / Ctrl-C in the TUI),\n // we treat it as a shutdown request for the daemon too — running\n // the TUI WITHOUT a daemon underneath would just show \"no\n // sessions\" forever, which isn't what `serve --interactive`\n // promised. The user can still detach with Ctrl-] then q\n // (PTY-attach detach chord) to leave the TUI but keep the daemon\n // running — but a Ctrl-C / q in the watch view tears the lot.\n if (values.interactive) {\n process.stderr.write(\n `${color.dim}entering interactive monitor — q in the TUI to quit (daemon + TUI both).${color.reset}\\n`,\n )\n // Use process.argv[0] (this node) + process.argv[1] (this script)\n // for the child so we don't depend on $PATH finding the right\n // shim. argv carries `sessions --watch` plus an env override so\n // the child discovers THIS daemon's URL + token directly without\n // re-walking workspaces.json.\n const childArgv = [process.argv[1] ?? \"\", \"sessions\", \"--watch\"]\n const child = childProc.spawn(process.execPath, childArgv, {\n stdio: \"inherit\",\n env: {\n ...process.env,\n AGENTPROTO_DAEMON_URL: gateway.url,\n // `gateway.token` is the per-boot daemon bearer (different\n // from `token`, which was the tunnel JWT). Without this, the\n // child's restart/kill calls would 401 against its own\n // parent — exactly the bug that closed --interactive after\n // any failed action.\n AGENTPROTO_DAEMON_TOKEN: gateway.token,\n },\n })\n await new Promise<void>(resolve => {\n child.once(\"exit\", () => resolve())\n aborter.signal.addEventListener(\"abort\", () => {\n try {\n child.kill(\"SIGTERM\")\n } catch {\n /* ignore */\n }\n })\n })\n // TUI quit → tear daemon down. If the SIGINT handler already\n // started a shutdown (parent + child both saw Ctrl-C from the\n // same process group), skip — the handler will finish on its\n // own. Otherwise drive the shutdown ourselves. The\n // `shuttingDown` flag in the outer scope is the source of truth.\n if (!shuttingDown) {\n aborter.abort()\n await gateway.stop().catch(() => undefined)\n await unlinkRuntimeMeta(opts.workspace).catch(() => undefined)\n }\n return 0\n }\n\n // ── local-only mode: nothing else to do ──\n if (!opts.connect) {\n // Banner already covered the \"local-only\" state. Just park.\n process.stderr.write(\n `${color.dim}Press Ctrl-C to stop.${color.reset}\\n`,\n )\n await new Promise<void>(resolve => {\n aborter.signal.addEventListener(\"abort\", () => resolve())\n })\n return 0\n }\n\n process.stderr.write(\n `${color.dim}tunnel · connecting to ${opts.connect} as '${opts.label}'…${color.reset}\\n`,\n )\n\n let backoffMs = opts.reconnectMinMs ?? 1_000\n const backoffMax = opts.reconnectMaxMs ?? 30_000\n // Shared flag — flipped by the `reconnect_soon` handler inside\n // runOneTunnel to skip the 2s post-clean-close pause. Lets a host\n // doing a graceful preStop drain finish its rollover in ~2s instead\n // of the daemon's normal ~30s backoff (or even the 2s settle).\n const reconnectState = { immediate: false }\n while (!aborter.signal.aborted) {\n try {\n await runOneTunnel(opts, gateway, spawnPty, aborter.signal, reconnectState)\n backoffMs = opts.reconnectMinMs ?? 1_000 // success resets backoff\n if (reconnectState.immediate) {\n reconnectState.immediate = false\n // Host signaled graceful drain — skip the settle pause and\n // reconnect right away (the new replica is already listening).\n continue\n }\n // Brief pause before reconnecting even on a clean close. This prevents\n // an infinite reconnect fight when two daemon processes are running with\n // the same token — each close-then-reconnect gets a minimum delay rather\n // than spinning at CPU speed.\n await sleep(2_000, aborter.signal)\n } catch (err) {\n if (aborter.signal.aborted) break\n const msg = err instanceof Error ? err.message : String(err)\n process.stderr.write(\n `agentproto serve: tunnel error: ${msg}\\n reconnecting in ${backoffMs}ms…\\n`\n )\n await sleep(backoffMs, aborter.signal)\n backoffMs = Math.min(backoffMs * 2, backoffMax)\n }\n }\n\n return 0\n}\n\n/**\n * One end-to-end tunnel attempt. Resolves when the socket closes\n * cleanly (host hung up); rejects on connection error or unexpected\n * close. The reconnect loop catches both and retries.\n */\nasync function runOneTunnel(\n opts: ServeOpts,\n gateway: GatewayHandle,\n spawnPty: PtyFactory | null,\n signal: AbortSignal,\n reconnectState: { immediate: boolean }\n): Promise<void> {\n if (!opts.connect) throw new Error(\"runOneTunnel: --connect not set\")\n const headers: Record<string, string> = {\n \"user-agent\": \"agentproto/0.1.0-alpha\",\n }\n if (opts.token) headers.authorization = `Bearer ${opts.token}`\n\n const ws = new WebSocket(opts.connect, { headers })\n\n // Wait for OPEN (or fail).\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n ws.off(\"error\", onError)\n resolve()\n }\n const onError = (err: Error) => {\n ws.off(\"open\", onOpen)\n reject(err)\n }\n ws.once(\"open\", onOpen)\n ws.once(\"error\", onError)\n if (signal.aborted) {\n ws.close()\n reject(new Error(\"Aborted before WS opened.\"))\n }\n signal.addEventListener(\"abort\", () => {\n ws.close()\n reject(new Error(\"Aborted while WS connecting.\"))\n })\n })\n\n process.stderr.write(`agentproto serve: tunnel up.\\n`)\n\n const sink: FrameSink = wrapWebSocket(ws as unknown as Parameters<typeof wrapWebSocket>[0])\n\n // Keep-alive: Cloud Run (and most reverse-proxies) close idle WebSocket\n // connections after ~5 minutes. Send a ping every 30s so the connection\n // stays alive between infrequent agent calls.\n const keepaliveInterval = setInterval(() => {\n try {\n sink.send({ t: \"ping\", nonce: randomUUID() })\n } catch {\n // sink already closing — the onClose handler below will clear us\n }\n }, 30_000)\n\n const server = createTunnelServer({\n sink,\n label: opts.label,\n pty: spawnPty !== null,\n ...(spawnPty ? { spawnPty } : {}),\n // Generic HTTP-relay upstream for tunnel `http_request` frames.\n // Cloud-side callers (e.g. the API's local-daemon filesystem\n // provider) can now route MCP JSON-RPC + any other HTTP through\n // the daemon without needing a public URL. We point at the local\n // gateway since that's where `/mcp`, `/sessions`, `/events` live.\n httpUpstream: gateway.url,\n // WS forwarding upstream — daemon dials the local gateway's WS\n // endpoints (/sessions/:id/pty, etc) and pipes frames to the host.\n // Used by the cloud tunnel pod so browsers on mobile can attach to\n // interactive PTY sessions even though the daemon is only reachable\n // through the host (not directly).\n dialUpstreamWs: async ({ url, protocols, headers }) => {\n // Dial with the same `ws` lib already used for the host tunnel.\n // Resolve once we receive `open`; reject on `error` / `unexpected-response`.\n //\n // Origin gotcha: the daemon's own HTTP gateway requires Origin in\n // its allowlist for mutating + WS routes. When we self-dial here\n // (no browser in the path), `ws` doesn't set Origin and the\n // request gets 401'd by the daemon's own auth. Inject a loopback\n // Origin matching the URL — `http://127.0.0.1:*` is always in the\n // default allowlist.\n const upstreamHeaders: Record<string, string> = {\n ...(headers as Record<string, string> | undefined),\n }\n if (!upstreamHeaders[\"origin\"] && !upstreamHeaders[\"Origin\"]) {\n try {\n const u = new URL(url)\n const httpScheme = u.protocol === \"wss:\" ? \"https:\" : \"http:\"\n upstreamHeaders[\"Origin\"] = `${httpScheme}//${u.host}`\n } catch {\n /* malformed url — daemon will reject with a clear error */\n }\n }\n return await new Promise((resolve, reject) => {\n const sock = new WebSocket(url, protocols ? [...protocols] : undefined, {\n headers: upstreamHeaders,\n })\n const onceOpen = () => {\n sock.off(\"error\", onceError)\n sock.off(\"unexpected-response\", onceUnexpected)\n resolve({\n protocol: sock.protocol ?? \"\",\n send: (data, sendOpts) => {\n sock.send(data, { binary: sendOpts.binary })\n },\n close: (code, reason) => {\n try {\n sock.close(code, reason)\n } catch {\n /* defensive — socket may already be closed */\n }\n },\n onMessage: handler => {\n sock.on(\"message\", (raw: Buffer, isBinary: boolean) => {\n handler(raw, isBinary)\n })\n },\n onClose: handler => {\n sock.on(\"close\", (code: number, reason: Buffer) => {\n handler(code, reason.toString(\"utf8\"))\n })\n },\n onError: handler => {\n sock.on(\"error\", (err: Error) => handler(err))\n },\n })\n }\n const onceError = (err: Error) => {\n sock.off(\"open\", onceOpen)\n reject(err)\n }\n const onceUnexpected = (\n _req: unknown,\n res: { statusCode?: number }\n ) => {\n sock.off(\"open\", onceOpen)\n reject(new Error(`Unexpected server response: ${res.statusCode ?? 0}`))\n }\n sock.once(\"open\", onceOpen)\n sock.once(\"error\", onceError)\n sock.once(\"unexpected-response\", onceUnexpected)\n })\n },\n // v0 authorize hook: trust the bearer-authenticated host completely.\n // Token possession proves the host was provisioned for this daemon.\n // Per-spawn policy filtering will land alongside the policy.toml.\n authorize: req => req,\n // ── AIP-46 bridge: tunnel spawns land in the gateway registry ──\n // Every cloud-driven spawn shows up in `gateway.url/sessions`\n // and the LocalDaemonSessionsCard, alongside spawns originated\n // through MCP tools or POST /sessions/agent. The execId is the\n // host's stable id — keep it so cloud cli_sessions rows can\n // cross-ref the daemon-side descriptor.\n onChildSpawned: ({ execId, child, request }) => {\n gateway.sessions.register({\n id: execId,\n child,\n workspaceSlug: opts.label,\n command: [request.command, ...request.args].join(\" \"),\n kind: \"agent-cli\",\n label: `tunnel: ${request.command.split(\"/\").pop() ?? request.command}`,\n })\n },\n // Graceful drain hook — flip the outer loop's \"reconnect immediately\"\n // flag and close the WS so the supervisor reconnects without backoff.\n // Host will follow up with close(1012) ~2s later as a hard backstop.\n onReconnectSoon: ({ reasonMs }) => {\n process.stderr.write(\n `agentproto serve: host signaled drain (reasonMs=${reasonMs ?? \"?\"}) — reconnecting immediately\\n`\n )\n reconnectState.immediate = true\n try {\n ws.close(1000, \"host_drain\")\n } catch {\n /* socket already closing */\n }\n },\n })\n\n // Block until the sink closes (peer disconnect or our shutdown).\n await new Promise<void>(resolve => {\n const offClose = sink.onClose(() => {\n clearInterval(keepaliveInterval)\n offClose()\n resolve()\n })\n if (signal.aborted) {\n clearInterval(keepaliveInterval)\n server.close().finally(() => resolve())\n }\n signal.addEventListener(\"abort\", () => {\n clearInterval(keepaliveInterval)\n server.close().finally(() => resolve())\n })\n })\n\n process.stderr.write(`agentproto serve: tunnel closed.\\n`)\n}\n\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise(resolve => {\n if (signal.aborted) return resolve()\n const timer = setTimeout(resolve, ms)\n signal.addEventListener(\"abort\", () => {\n clearTimeout(timer)\n resolve()\n })\n })\n}\n\n/**\n * Boot banner. Single block so the user sees the whole \"gateway up\"\n * picture in one place, with subtle color when stdout is a TTY. The\n * old format was:\n *\n * agentproto serve: gateway up on http://...\n * workspace: /abs/path\n * mcp: http://.../mcp\n * …\n *\n * What this prints instead:\n *\n * ─ agentproto · gateway up · http://127.0.0.1:18790 ─\n * workspace /abs/path\n * pty enabled (node-pty)\n * origins localhost:* (default)\n * endpoints /mcp · /sessions · /events · /sessions/:id/pty (WS)\n * mode local-only\n */\nfunction printBootBanner(opts: {\n url: string\n workspace: string\n ptyEnabled: boolean\n allowedOrigins?: readonly string[]\n strictOrigins?: boolean\n connect?: string\n}): void {\n const c = color\n const home = process.env.HOME ?? \"\"\n const workspace =\n home && opts.workspace.startsWith(home)\n ? \"~\" + opts.workspace.slice(home.length)\n : opts.workspace\n const ptyState = opts.ptyEnabled\n ? `${c.green}enabled${c.reset} ${c.dim}(node-pty)${c.reset}`\n : `${c.amber}disabled${c.reset} ${c.dim}(install node-pty to enable)${c.reset}`\n let origins: string\n if (opts.strictOrigins) {\n origins =\n opts.allowedOrigins && opts.allowedOrigins.length > 0\n ? `${c.amber}STRICT${c.reset} ${opts.allowedOrigins.join(\" · \")} ${c.dim}(localhost defaults disabled)${c.reset}`\n : `${c.red}STRICT · empty allowlist${c.reset} ${c.dim}(every Origin will 401 — only Bearer-token works)${c.reset}`\n } else {\n origins =\n opts.allowedOrigins && opts.allowedOrigins.length > 0\n ? opts.allowedOrigins.join(\" · \") +\n ` ${c.dim}+ localhost (default)${c.reset}`\n : `${c.dim}localhost:* only (default)${c.reset}`\n }\n const mode = opts.connect\n ? `${c.cyan}tunnel${c.reset} ${c.dim}→ ${opts.connect}${c.reset}`\n : `${c.dim}local-only${c.reset}`\n const line = `${c.dim}─${c.reset}`\n process.stderr.write(\n `\\n${line} ${c.bold}agentproto${c.reset} ${c.dim}·${c.reset} gateway up ${c.dim}·${c.reset} ${c.cyan}${opts.url}${c.reset} ${line}\\n` +\n ` ${c.dim}workspace${c.reset} ${workspace}\\n` +\n ` ${c.dim}pty${c.reset} ${ptyState}\\n` +\n ` ${c.dim}origins${c.reset} ${origins}\\n` +\n ` ${c.dim}endpoints${c.reset} /mcp · /sessions · /events · /sessions/:id/pty ${c.dim}(WS)${c.reset}\\n` +\n ` ${c.dim}mode${c.reset} ${mode}\\n` +\n `\\n`,\n )\n}\n\n/**\n * Tiny ANSI palette gated on stdout being a TTY. Writing colors into\n * a logfile (launchd `StandardOutPath`) would litter the file with\n * `\\x1b[…m` noise; this strips when piped.\n */\nconst _isTty = !!(process.stderr as NodeJS.WriteStream).isTTY\nconst color = _isTty\n ? {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n green: \"\\x1b[32m\",\n amber: \"\\x1b[33m\",\n cyan: \"\\x1b[36m\",\n red: \"\\x1b[31m\",\n }\n : {\n reset: \"\",\n bold: \"\",\n dim: \"\",\n green: \"\",\n amber: \"\",\n cyan: \"\",\n red: \"\",\n }\n"]}
1
+ {"version":3,"sources":["../src/registry/resolve.ts","../src/commands/setup.ts","../src/commands/install-profile.ts","../src/commands/install.ts","../src/util/stdin.ts","../src/commands/run.ts","../src/util/credentials.ts","../src/util/pty-factory.ts","../../runtime/src/config.ts","../../runtime/src/workspaces-config.ts","../../runtime/src/mcp-imports.ts","../../define-doctype/src/index.ts","../../manifest/src/index.ts","../../extension/src/schema.ts","../../extension/src/define-extension.ts","../../extension/src/manifest/index.ts","../../extension/src/spec-from-extension.ts","../../agent/src/schema.ts","../../agent/src/define-agent.ts","../../agent/src/manifest/index.ts","../../agent/src/spec.ts","../../tool/src/define-tool.ts","../../tool/src/manifest/index.ts","../../tool/src/spec.ts","../../routine/src/schema.ts","../../routine/src/define-routine.ts","../../routine/src/manifest/index.ts","../../routine/src/spec.ts","../../mcp-server/src/self-inspect-tool.ts","../../mcp-server/src/index.ts","../../runtime/src/agentproto-dir.ts","../../runtime/src/command-tools.ts","../../runtime/src/conversations.ts","../../runtime/src/events.ts","../../runtime/src/fs-tools.ts","../../runtime/src/mcp-discovery.ts","../../runtime/src/session-tools.ts","../../runtime/src/heartbeat.ts","../../runtime/src/http-server.ts","../../runtime/src/resume-strategies.ts","../../runtime/src/sessions.ts","../../runtime/src/mcp-proxy.ts","../../runtime/src/remote-providers/quick.ts","../../runtime/src/remote-controller.ts","../../runtime/src/remote-tools.ts","../../runtime/src/workspace-fs.ts","../../runtime/src/index.ts","../src/registry/catalog.ts","../src/commands/serve.ts"],"names":["fs","resolvePath","resolve","input","output","join","homedir","dirname","parseArgs","ledgerPathFor","loadLedger","readFile","chmod","saveLedger","writeFile","mkdir","createHash","spawn","text","isAbsolute","rm","matter","z","errors","failed","contentText","readdir","unlink","stat","existsSync","normalize","relative","WORKSPACES_CONFIG_VERSION","DEFAULT_CONFIG_DIR","DEFAULT_CONFIG_PATH","sanitizeSlug","loadWorkspacesConfig","normalizeConfig","IMPORTED_MCPS_PATH","IMPORTED_MCPS_VERSION","EMPTY","loadImportedMcps","server","id","EventEmitter","rt","randomBytes","sha256","fsReadFile","fsWriteFile","randomUUID","createAgentCliRuntime","headers","signal"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Resolve a slug like \"claude-code\" to a runnable `AgentCliHandle`.\n *\n * Resolution order:\n * 1. `@agentproto/adapter-<slug>` from npm (must default-export or\n * named-export an `AgentCliHandle` — convention is the camelCased\n * slug, e.g. `claudeCode`).\n * 2. (TODO) `~/.agentproto/adapters/<slug>/AGENT-CLI.md` on disk.\n * 3. (TODO) bundled fallbacks for the canonical adapters.\n *\n * Step 1 covers 100% of v0 usage. The on-disk path is only there for\n * users authoring their own adapters; we'll add it once `defineAgentCli`\n * supports MD-source authoring end to end.\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { fileURLToPath } from \"node:url\"\nimport { dirname, join, resolve as resolvePath } from \"node:path\"\nimport { homedir } from \"node:os\"\nimport type { AgentCliHandle } from \"@agentproto/driver-agent-cli\"\n\n/** Slash-command declared in an adapter manifest (AIP-45 `commands[]`). */\nexport interface AgentCliCommand {\n name: string\n description?: string\n}\n\nexport interface ResolvedAdapter {\n readonly slug: string\n readonly handle: AgentCliHandle\n readonly source: \"npm\" | \"file\" | \"bundled\"\n readonly packageName?: string\n}\n\n/**\n * Compact metadata about an installed adapter — the shape returned\n * by `listInstalledAdapters()` and exposed via the daemon's\n * `GET /adapters` route + `list_adapters` MCP tool. Only fields\n * safe to surface in a UI list (no install scripts, no env keys).\n * For full handle access call `resolveAdapter(slug)`.\n */\nexport interface AdapterInfo {\n slug: string\n /** Display name from the manifest. */\n name: string\n /** Adapter package version (matches npm package.json `version`). */\n version: string\n /** One-line user-facing description. */\n description: string\n /** Wire protocol — informs prompt/multi-turn semantics. */\n protocol: string\n /** True when the adapter advertises a streaming session contract. */\n streaming: boolean\n /** npm package name (for install hints / \"open in npmjs.com\" links). */\n packageName: string\n /** Slash-commands the agent CLI accepts as ordinary text turns.\n * Empty when the adapter doesn't declare any. */\n commands: AgentCliCommand[]\n /** Known-valid model identifiers for this adapter, drawn from the\n * adapter manifest's `models.allowed` field. Empty when the adapter\n * doesn't declare a model list (accepts whatever the underlying\n * binary accepts). Pass one of these as `model` in `start_agent_session`\n * to avoid trial-and-error validation errors. */\n models: string[]\n}\n\nconst slugToCamel = (slug: string): string =>\n slug.replace(/-([a-z0-9])/g, (_, c: string) => c.toUpperCase())\n\nexport async function resolveAdapter(slug: string): Promise<ResolvedAdapter> {\n if (!/^[a-z][a-z0-9-]*$/.test(slug)) {\n throw new Error(\n `agentproto: invalid adapter slug '${slug}'. Slugs are lower-kebab.`\n )\n }\n\n const packageName = `@agentproto/adapter-${slug}`\n const camel = slugToCamel(slug)\n let mod: Record<string, unknown>\n let resolvedPackageName = packageName\n try {\n mod = (await import(packageName)) as Record<string, unknown>\n } catch (primaryErr) {\n // Fallback: strip the last hyphen-segment and try the parent package,\n // looking for the full camelCase export there.\n // e.g. \"claude-code-print\" → \"@agentproto/adapter-claude-code\" + export \"claudeCodePrint\"\n const hyphen = slug.lastIndexOf(\"-\")\n if (hyphen > 0) {\n const parentPkg = `@agentproto/adapter-${slug.slice(0, hyphen)}`\n try {\n const parentMod = (await import(parentPkg)) as Record<string, unknown>\n const parentCandidate = parentMod[camel] as AgentCliHandle | undefined\n if (\n parentCandidate &&\n typeof parentCandidate === \"object\" &&\n \"name\" in parentCandidate\n ) {\n return { slug, handle: parentCandidate, source: \"npm\", packageName: parentPkg }\n }\n } catch {\n /* parent also missing — fall through to original error */\n }\n }\n\n const cause = primaryErr instanceof Error ? primaryErr.message : String(primaryErr)\n throw new Error(\n `agentproto: could not load adapter '${slug}'. ` +\n `Tried '${packageName}'. Install it with: npm i -g ${packageName}\\n cause: ${cause}`\n )\n }\n\n const candidate =\n (mod[camel] as AgentCliHandle | undefined) ??\n (mod.default as AgentCliHandle | undefined) ??\n (mod.handle as AgentCliHandle | undefined)\n\n if (!candidate || typeof candidate !== \"object\" || !(\"name\" in candidate)) {\n throw new Error(\n `agentproto: adapter '${resolvedPackageName}' does not export an AgentCliHandle ` +\n `(looked for export '${camel}', 'default', or 'handle').`\n )\n }\n\n return { slug, handle: candidate, source: \"npm\", packageName: resolvedPackageName }\n}\n\n/**\n * Enumerate every `@agentproto/adapter-*` package reachable from the\n * current node module-resolution path. Used by the daemon's\n * `GET /adapters` route and `list_adapters` MCP tool so UIs (web\n * spawn dialog) and operators can pick from the installed set\n * without trial-and-error against `resolveAdapter(slug)`.\n *\n * Implementation: walk `node_modules/@agentproto` looking for\n * `adapter-*` directories; for each, dynamic-import the package +\n * extract the AgentCliHandle's display fields. Failures (broken\n * exports, missing dist) are collected as warnings rather than\n * thrown — partial discovery beats failing the whole listing on\n * one bad adapter.\n *\n * Discovery is async + reads disk on every call; cache at the\n * caller layer if you list often. v0 does no caching here because\n * adapter sets typically change rarely (npm i / rm) and a fresh\n * scan stays fast (~10 packages worth of dynamic imports).\n */\nexport async function listInstalledAdapters(opts?: {\n /** Override the search root. Defaults to walking up from the cli\n * package's own location until we hit a `node_modules/@agentproto`. */\n searchRoot?: string\n}): Promise<AdapterInfo[]> {\n const roots = await collectAgentprotoNamespaceRoots(opts?.searchRoot)\n const seen = new Set<string>()\n const out: AdapterInfo[] = []\n // Two failure buckets so we can produce ONE summary line for the\n // expected case (adapter dir found by the walker but not importable\n // from the daemon's resolution path — i.e. workspace-hoisted, not\n // globally installed) and keep per-adapter warnings only for the\n // genuinely surprising ones (broken exports, missing dist, etc.).\n const notImportable: string[] = []\n\n for (const root of roots) {\n let entries: string[] = []\n try {\n entries = await fs.readdir(root)\n } catch {\n continue\n }\n for (const entry of entries) {\n if (!entry.startsWith(\"adapter-\")) continue\n const slug = entry.slice(\"adapter-\".length)\n if (seen.has(slug)) continue\n seen.add(slug)\n try {\n const resolved = await resolveAdapter(slug)\n const handle = resolved.handle as Record<string, unknown>\n const modelsField = (handle.models as { allowed?: unknown } | undefined)?.allowed\n const info: AdapterInfo = {\n slug,\n name: typeof handle.name === \"string\" ? handle.name : slug,\n version: typeof handle.version === \"string\" ? handle.version : \"?\",\n description:\n typeof handle.description === \"string\" ? handle.description : \"\",\n protocol:\n typeof handle.protocol === \"string\" ? handle.protocol : \"unknown\",\n streaming: !!(handle.capabilities as { streaming?: boolean })\n ?.streaming,\n packageName: resolved.packageName ?? `@agentproto/adapter-${slug}`,\n commands: Array.isArray(handle.commands) ? (handle.commands as AgentCliCommand[]) : [],\n models: Array.isArray(modelsField)\n ? (modelsField as unknown[]).filter((m): m is string => typeof m === \"string\")\n : [],\n }\n out.push(info)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n // ERR_MODULE_NOT_FOUND / \"Cannot find package\" is the expected\n // shape when the walker finds an adapter dir hoisted in a\n // workspace's node_modules but that dir isn't reachable from\n // the daemon binary's NODE_PATH. Collapse those into a single\n // summary line below; anything else (broken handle export,\n // syntax error in dist, etc.) still warns individually.\n if (\n /Cannot find package|ERR_MODULE_NOT_FOUND/i.test(msg) &&\n msg.includes(`@agentproto/adapter-${slug}`)\n ) {\n notImportable.push(slug)\n } else {\n console.warn(\n `[agentproto/cli] listInstalledAdapters: skipping broken adapter '${slug}': ${msg}`\n )\n }\n }\n }\n }\n\n // We deliberately do NOT log `notImportable` to console. The\n // discovery walker often finds adapter directories hoisted in a\n // workspace's node_modules that aren't reachable from the daemon's\n // own NODE_PATH — that's a normal state for a fresh checkout and\n // not actionable from a daemon log line. Callers who want the info\n // can inspect the `listInstalledAdapters` return value (importable\n // adapters only); a future `agentproto adapters doctor` verb is the\n // right home for surfacing the unimportable slugs interactively.\n void notImportable\n\n return out.sort((a, b) => a.slug.localeCompare(b.slug))\n}\n\n/**\n * Walk up from the cli package looking for `node_modules/@agentproto`\n * directories. Returns every match (pnpm + global + nvm hoisting can\n * produce more than one) so adapters installed in any reachable\n * scope are discoverable.\n */\nasync function collectAgentprotoNamespaceRoots(\n start?: string\n): Promise<string[]> {\n const seen = new Set<string>()\n const roots: string[] = []\n const candidatesAt = (dir: string): string[] => [\n resolvePath(dir, \"node_modules\", \"@agentproto\"),\n resolvePath(dir, \"node_modules\", \".pnpm\", \"node_modules\", \"@agentproto\"),\n ]\n\n async function walkUp(from: string): Promise<void> {\n let cur = from\n for (let depth = 0; depth < 20; depth++) {\n if (seen.has(cur)) break\n seen.add(cur)\n for (const candidate of candidatesAt(cur)) {\n try {\n const s = await fs.stat(candidate)\n if (s.isDirectory() && !roots.includes(candidate)) roots.push(candidate)\n } catch { /* not present */ }\n }\n const parent = resolvePath(cur, \"..\")\n if (parent === cur) break\n cur = parent\n }\n }\n\n // Walk from the caller-supplied root (or cwd) — covers the workspace root.\n await walkUp(start ?? process.cwd())\n // Also walk from this file's location so pnpm-linked adapters in\n // packages/cli/node_modules/@agentproto/ are found regardless of cwd.\n // Resolves correctly whether running from dist (node file.mjs) or ts-node.\n try {\n await walkUp(dirname(fileURLToPath(import.meta.url)))\n } catch { /* ESM not available in this context */ }\n\n return roots\n}\n\n// ── catalog-aware lister ─────────────────────────────────────────────────────\n\n/** Minimal catalog shape consumed by `listAdaptersWithCatalog`. */\nexport interface CatalogEntry {\n slug: string\n name: string\n description: string\n packageName: string\n hint?: string\n}\n\n/**\n * Enumerate adapters starting from a static catalog and enriching each entry\n * with its runtime availability status:\n *\n * \"supported\" — known to agentproto, package not importable (not installed)\n * \"available\" — package resolves; setup ledger absent or adapter has no setup\n * \"ready\" — package resolves + setup ledger present\n *\n * Also appends any adapters discovered by `listInstalledAdapters` that aren't\n * in the catalog, so locally-installed custom adapters still appear.\n *\n * This replaces `listInstalledAdapters` as the source for `list_adapters` so\n * the MCP tool always returns the supported set — not just what happens to be\n * discoverable from the daemon's node_modules at that moment.\n */\nexport async function listAdaptersWithCatalog(\n catalog: readonly CatalogEntry[]\n): Promise<(AdapterInfo & { status: \"supported\" | \"available\" | \"ready\"; hint?: string })[]> {\n const seenSlugs = new Set<string>()\n const out: (AdapterInfo & { status: \"supported\" | \"available\" | \"ready\"; hint?: string })[] = []\n\n const agentprotoHome = process.env[\"AGENTPROTO_HOME\"] ?? join(homedir(), \".agentproto\")\n\n async function hasSetupLedger(slug: string): Promise<boolean> {\n try {\n await fs.access(join(agentprotoHome, \"setup\", `${slug}.json`))\n return true\n } catch {\n return false\n }\n }\n\n // Process catalog entries first (preserves catalog order for known adapters).\n for (const entry of catalog) {\n seenSlugs.add(entry.slug)\n try {\n const resolved = await resolveAdapter(entry.slug)\n const handle = resolved.handle as Record<string, unknown>\n const setupSteps = Array.isArray((handle as { setup?: unknown[] }).setup)\n ? (handle as { setup: unknown[] }).setup\n : []\n const ledgerPresent = await hasSetupLedger(entry.slug)\n const status: \"available\" | \"ready\" =\n setupSteps.length === 0 || ledgerPresent ? \"ready\" : \"available\"\n const catalogModels = (handle.models as { allowed?: unknown } | undefined)?.allowed\n out.push({\n slug: entry.slug,\n name: typeof handle.name === \"string\" ? handle.name : entry.name,\n version: typeof handle.version === \"string\" ? handle.version : \"?\",\n description:\n typeof handle.description === \"string\" ? handle.description : entry.description,\n protocol: typeof handle.protocol === \"string\" ? handle.protocol : \"unknown\",\n streaming: !!(handle.capabilities as { streaming?: boolean })?.streaming,\n packageName: resolved.packageName ?? entry.packageName,\n commands: Array.isArray(handle.commands) ? (handle.commands as AgentCliCommand[]) : [],\n models: Array.isArray(catalogModels)\n ? (catalogModels as unknown[]).filter((m): m is string => typeof m === \"string\")\n : [],\n status,\n hint: entry.hint,\n })\n } catch {\n // Package not importable — show as \"supported\" (known but not installed).\n out.push({\n slug: entry.slug,\n name: entry.name,\n version: \"not installed\",\n description: entry.description,\n protocol: \"unknown\",\n streaming: false,\n packageName: entry.packageName,\n commands: [],\n models: [],\n status: \"supported\",\n hint: entry.hint,\n })\n }\n }\n\n // Append any installed adapters not in the catalog (custom / third-party).\n const installed = await listInstalledAdapters()\n for (const info of installed) {\n if (seenSlugs.has(info.slug)) continue\n seenSlugs.add(info.slug)\n const ledgerPresent = await hasSetupLedger(info.slug)\n out.push({ ...info, status: ledgerPresent ? \"ready\" : \"available\" })\n }\n\n return out\n}\n","/**\n * `agentproto setup <slug>` + `runSetup()` engine.\n *\n * Implements AIP-29 § Setup — the post-install configuration pipeline.\n * Steps run in declared order. Idempotency comes from three layers:\n *\n * 1. Manifest's `version_check` — already covered by `install`. If the\n * binary's version answers, install steps are skipped entirely\n * before setup ever runs.\n *\n * 2. Per-step `skip_if.cmd` — runs first; matching exit code skips\n * the step. Asks the live system, so it works on fresh machines\n * without any local state.\n *\n * 3. Setup ledger — `~/.agentproto/setup/<slug>.json`, records each\n * successful step with timestamp + (when applicable) which slot\n * received the value. Re-runs short-circuit ledger-known steps\n * unless --force is passed.\n *\n * The `runSetup()` export is what `agentproto install` calls after the\n * install array succeeds; `runSetupCommand()` is the standalone verb\n * (re-runs only setup, no install).\n *\n * Step `kind` matrix (current support):\n *\n * - cmd ✓ — shell command, optional skip_if + persist (stdout)\n * - prompt ✓ — text / boolean / select / secret; persist via env / secret_slug / cmd\n * - oauth ✗ — placeholder; needs a SECRETS.md driver wire-up\n * - external ⚠ — opens URL via xdg-open/open; callback polling not yet wired\n *\n * The unsupported kinds surface a clear \"not yet implemented\" message\n * so adapter authors can lean on cmd + prompt today and migrate later.\n */\n\nimport { spawn } from \"node:child_process\"\nimport { mkdir, readFile, writeFile, chmod } from \"node:fs/promises\"\nimport { homedir, platform } from \"node:os\"\nimport { join, dirname } from \"node:path\"\nimport { parseArgs } from \"node:util\"\nimport { createInterface } from \"node:readline/promises\"\nimport { stdin as input, stdout as output } from \"node:process\"\nimport type {\n AgentCliHandle,\n AgentCliSetupStep,\n AgentCliSetupSkipIf,\n AgentCliSetupPersist,\n} from \"@agentproto/driver-agent-cli\"\nimport { resolveAdapter } from \"../registry/resolve.js\"\n\ninterface LedgerEntry {\n /** Step id from the manifest. */\n stepId: string\n /** ISO-8601 timestamp the step succeeded (or was skipped via skip_if). */\n completedAt: string\n /** What kind of step this was — for forensic scrubbing. Persist values\n * are NEVER stored in the ledger; only the slot name where they\n * landed. */\n kind: AgentCliSetupStep[\"kind\"]\n /** Slot the captured value went into, when applicable. Format:\n * - `env:OPENCLAW_GATEWAY_URL`\n * - `secret:openclaw/gateway-token`\n * - `cmd` (the value was piped to a config command, not stored here)\n */\n persistedTo?: string\n /** True when the step short-circuited via skip_if instead of running. */\n skippedViaSkipIf?: boolean\n}\n\ninterface Ledger {\n /** Bundle id, matches the manifest's `id`. */\n slug: string\n /** When the ledger was last touched. */\n updatedAt: string\n /** One per step id. Most recent run wins. */\n steps: Record<string, LedgerEntry>\n /** Captured env-bound values — persist.env steps land here. The\n * installer + runner read from the secrets backend in production;\n * for the local CLI host we mirror them into the ledger so\n * `agentproto run` can lift them onto the spawn env without hitting\n * a remote vault. Restricted to 0600 perms by the writer. */\n envValues?: Record<string, string>\n}\n\nexport interface RunSetupOptions {\n slug: string\n handle: AgentCliHandle\n /** When true, ignore the ledger AND skip_if; re-runs every step. */\n force?: boolean\n /** When true, log what would happen but don't spawn / prompt. */\n dryRun?: boolean\n /** When set, only run the named step ids (in declared order). Useful\n * for re-running a single step after a manual fix. */\n only?: string[]\n}\n\nexport async function runSetup(opts: RunSetupOptions): Promise<number> {\n const steps = opts.handle.setup ?? []\n if (steps.length === 0) {\n process.stdout.write(`agentproto setup: no setup steps for '${opts.slug}'.\\n`)\n return 0\n }\n\n const ledgerPath = ledgerPathFor(opts.slug)\n const ledger = await loadLedger(ledgerPath, opts.slug)\n const onlySet = opts.only && opts.only.length > 0 ? new Set(opts.only) : null\n\n for (const [i, step] of steps.entries()) {\n if (onlySet && !onlySet.has(step.id)) continue\n\n const idx = `[${i + 1}/${steps.length}]`\n const head = `${idx} ${step.kind}/${step.id}`\n\n // Layer 3: ledger short-circuit (skipped on --force).\n const prev = ledger.steps[step.id]\n if (!opts.force && prev) {\n process.stdout.write(\n `${head} ✓ already completed (${prev.completedAt}${prev.skippedViaSkipIf ? \", via skip_if\" : \"\"}). Pass --force to re-run.\\n`\n )\n continue\n }\n\n // Layer 2: per-step skip_if.\n if (step.skip_if && !opts.force) {\n const ok = await checkSkipIf(step.skip_if)\n if (ok) {\n process.stdout.write(`${head} ✓ skip_if matched — skipping.\\n`)\n ledger.steps[step.id] = {\n stepId: step.id,\n kind: step.kind,\n completedAt: new Date().toISOString(),\n skippedViaSkipIf: true,\n }\n continue\n }\n }\n\n if (opts.dryRun) {\n process.stdout.write(`${head} (dry-run) — would execute.\\n`)\n continue\n }\n\n // Run the step.\n let entry: LedgerEntry | null = null\n try {\n switch (step.kind) {\n case \"cmd\":\n entry = await runCmdStep(step, ledger, head)\n break\n case \"prompt\":\n entry = await runPromptStep(step, ledger, head)\n break\n case \"external\":\n entry = await runExternalStep(step, ledger, head)\n break\n case \"oauth\":\n process.stderr.write(\n `${head} ✗ kind=oauth is not yet implemented in the local CLI host. ` +\n `Run the OAuth flow on the host that ships a SECRETS.md driver, then re-invoke.\\n`\n )\n return 1\n }\n } catch (err) {\n process.stderr.write(\n `${head} ✗ failed: ${err instanceof Error ? err.message : String(err)}\\n`\n )\n await saveLedger(ledgerPath, ledger)\n return 1\n }\n\n if (entry) {\n ledger.steps[step.id] = entry\n // Persist incrementally so a later step's failure doesn't lose\n // earlier successes (avoids re-prompting on next run).\n await saveLedger(ledgerPath, ledger)\n }\n }\n\n process.stdout.write(`agentproto: setup for '${opts.slug}' complete.\\n`)\n return 0\n}\n\n/**\n * `agentproto setup <slug>` — re-run the setup pipeline for an\n * already-installed bundle. Useful when adding new steps to an\n * adapter, fixing a broken step, or after a `--skip-setup` install.\n */\nexport async function runSetupCommand(args: readonly string[]): Promise<number> {\n const { values, positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {\n force: { type: \"boolean\", short: \"f\" },\n \"dry-run\": { type: \"boolean\" },\n only: { type: \"string\", multiple: true },\n },\n })\n const slug = positionals[0]\n if (!slug) {\n process.stderr.write(\n \"agentproto setup: missing adapter slug. Try: agentproto setup openclaw\\n\"\n )\n return 2\n }\n const adapter = await resolveAdapter(slug)\n return runSetup({\n slug,\n handle: adapter.handle,\n force: values.force ?? false,\n dryRun: values[\"dry-run\"] ?? false,\n ...(values.only ? { only: values.only } : {}),\n })\n}\n\n// ── Step runners ─────────────────────────────────────────────────────\n\nasync function runCmdStep(\n step: Extract<AgentCliSetupStep, { kind: \"cmd\" }>,\n ledger: Ledger,\n head: string\n): Promise<LedgerEntry> {\n if (step.description) process.stdout.write(`${head} ${step.description}\\n`)\n process.stdout.write(`${head} $ ${step.cmd}\\n`)\n const captured = await runShellCapturing(step.cmd, {\n timeoutMs: step.timeout_ms ?? 60_000,\n interactive: step.interactive ?? false,\n })\n if (captured.exitCode !== 0) {\n throw new Error(\n `cmd exited ${captured.exitCode}${captured.stderr ? \": \" + truncate(captured.stderr, 400) : \"\"}`\n )\n }\n // Persist the trimmed stdout when the step asks for it.\n let persistedTo: string | undefined\n if (step.persist) {\n const value = captured.stdout.trim()\n persistedTo = await applyPersist(step.persist, value, ledger)\n }\n return {\n stepId: step.id,\n kind: step.kind,\n completedAt: new Date().toISOString(),\n ...(persistedTo ? { persistedTo } : {}),\n }\n}\n\nasync function runPromptStep(\n step: Extract<AgentCliSetupStep, { kind: \"prompt\" }>,\n ledger: Ledger,\n head: string\n): Promise<LedgerEntry> {\n if (step.description) process.stdout.write(`${head} ${step.description}\\n`)\n const type = step.type ?? \"text\"\n\n let value: string\n switch (type) {\n case \"text\":\n case \"secret\":\n value = await promptString(step.prompt, {\n defaultValue: step.default,\n masked: type === \"secret\",\n })\n break\n case \"boolean\":\n value = (await promptBoolean(step.prompt, step.default === \"true\"))\n ? \"true\"\n : \"false\"\n break\n case \"select\": {\n const options = await resolveSelectOptions(step.options)\n if (options.length === 0) {\n throw new Error(\"select prompt has no options to choose from\")\n }\n value = await promptSelect(step.prompt, options, step.default)\n break\n }\n }\n\n let persistedTo: string | undefined\n if (step.persist) {\n persistedTo = await applyPersist(step.persist, value, ledger)\n }\n\n return {\n stepId: step.id,\n kind: step.kind,\n completedAt: new Date().toISOString(),\n ...(persistedTo ? { persistedTo } : {}),\n }\n}\n\nasync function runExternalStep(\n step: Extract<AgentCliSetupStep, { kind: \"external\" }>,\n ledger: Ledger,\n head: string\n): Promise<LedgerEntry> {\n if (step.description) process.stdout.write(`${head} ${step.description}\\n`)\n process.stdout.write(`${head} opening ${step.url}\\n`)\n const opener =\n platform() === \"darwin\"\n ? \"open\"\n : platform() === \"win32\"\n ? \"cmd\"\n : \"xdg-open\"\n const args = platform() === \"win32\" ? [\"/c\", \"start\", step.url] : [step.url]\n await new Promise<void>((resolve) => {\n const child = spawn(opener, args, { stdio: \"ignore\", detached: true })\n child.once(\"error\", () => resolve()) // best-effort\n child.once(\"spawn\", () => resolve())\n })\n\n // Callback polling (a host-allocated callback URL holding the result)\n // requires a local HTTP listener, which is reasonable in some hosts\n // but overkill for the agentproto CLI in v0.1. For now we fall back\n // to \"paste the result\" when the step declares a callback param;\n // the URL was opened above to start the flow.\n let value = \"\"\n if (step.callback?.param) {\n value = await promptString(\n `Paste the value of '${step.callback.param}' from the redirect`,\n { masked: false }\n )\n } else {\n process.stdout.write(`${head} done — press Enter when finished.\\n`)\n await promptString(\"(press Enter to continue)\", { masked: false })\n }\n\n let persistedTo: string | undefined\n if (step.persist && value) {\n persistedTo = await applyPersist(step.persist, value, ledger)\n }\n return {\n stepId: step.id,\n kind: step.kind,\n completedAt: new Date().toISOString(),\n ...(persistedTo ? { persistedTo } : {}),\n }\n}\n\n// ── skip_if check ────────────────────────────────────────────────────\n\nasync function checkSkipIf(skip: AgentCliSetupSkipIf): Promise<boolean> {\n const expectedCode = skip.exit_code ?? 0\n const captured = await runShellCapturing(skip.cmd, {\n timeoutMs: skip.timeout_ms ?? 5_000,\n interactive: false,\n })\n return captured.exitCode === expectedCode\n}\n\n// ── persist (env / secret_slug / cmd) ────────────────────────────────\n\nasync function applyPersist(\n persist: AgentCliSetupPersist,\n value: string,\n ledger: Ledger\n): Promise<string> {\n if (\"env\" in persist && persist.env) {\n if (!ledger.envValues) ledger.envValues = {}\n ledger.envValues[persist.env] = value\n return `env:${persist.env}`\n }\n if (\"secret_slug\" in persist && persist.secret_slug) {\n // The secrets backend is host-supplied. The local CLI host doesn't\n // ship one yet; we surface the slug so the operator can pipe the\n // value into their vault out-of-band. Recording the slug (NOT the\n // value) in the ledger is intentional — the ledger isn't a vault.\n process.stdout.write(\n `agentproto setup: store the prompted value in your secrets backend under slug '${persist.secret_slug}' ` +\n `(value not echoed; ledger records the slot only).\\n`\n )\n return `secret:${persist.secret_slug}`\n }\n if (\"cmd\" in persist && persist.cmd) {\n const cmd = persist.cmd.replace(/\\$\\{value\\}/g, shellEscape(value))\n const captured = await runShellCapturing(cmd, {\n timeoutMs: 60_000,\n interactive: false,\n })\n if (captured.exitCode !== 0) {\n throw new Error(`persist cmd exited ${captured.exitCode}`)\n }\n return \"cmd\"\n }\n throw new Error(\"persist block must declare exactly one of env / secret_slug / cmd\")\n}\n\n// ── prompt helpers ───────────────────────────────────────────────────\n\nasync function promptString(\n question: string,\n opts: { defaultValue?: string; masked?: boolean }\n): Promise<string> {\n // Node's readline doesn't natively mask; for `masked: true` we set\n // the terminal to no-echo for the duration of the prompt. Best-effort\n // — some non-TTY environments fall back to plain input with a warning.\n const isTty = process.stdin.isTTY ?? false\n const suffix = opts.defaultValue ? ` [${opts.defaultValue}]` : \"\"\n const prompt = `${question}${suffix}: `\n if (opts.masked && !isTty) {\n process.stdout.write(\n `agentproto: stdin is not a TTY — masked input falls back to plain. Avoid piping secrets in non-interactive mode.\\n`\n )\n }\n const rl = createInterface({ input, output, terminal: isTty })\n if (opts.masked && isTty) {\n // Toggle echo off via raw mode.\n process.stdin.setRawMode?.(true)\n let buf = \"\"\n process.stdout.write(prompt)\n return new Promise<string>((resolve) => {\n const onData = (chunk: Buffer) => {\n for (const code of chunk) {\n if (code === 0x0d /* CR */ || code === 0x0a /* LF */) {\n process.stdin.off(\"data\", onData)\n process.stdin.setRawMode?.(false)\n process.stdout.write(\"\\n\")\n rl.close()\n resolve(buf || opts.defaultValue || \"\")\n return\n }\n if (code === 0x03 /* Ctrl-C */) {\n process.stdin.off(\"data\", onData)\n process.stdin.setRawMode?.(false)\n rl.close()\n process.exit(130)\n }\n if (code === 0x7f /* DEL / backspace */ || code === 0x08) {\n buf = buf.slice(0, -1)\n continue\n }\n buf += String.fromCharCode(code)\n process.stdout.write(\"•\")\n }\n }\n process.stdin.on(\"data\", onData)\n })\n }\n try {\n const ans = (await rl.question(prompt)).trim()\n return ans || opts.defaultValue || \"\"\n } finally {\n rl.close()\n }\n}\n\nasync function promptBoolean(\n question: string,\n defaultYes: boolean\n): Promise<boolean> {\n const def = defaultYes ? \"Y/n\" : \"y/N\"\n const ans = await promptString(`${question} [${def}]`, { masked: false })\n if (!ans) return defaultYes\n return /^y(es)?$/i.test(ans)\n}\n\nasync function promptSelect(\n question: string,\n options: { value: string; label?: string }[],\n defaultValue: string | undefined\n): Promise<string> {\n process.stdout.write(`${question}\\n`)\n for (const [i, o] of options.entries()) {\n const star =\n defaultValue && o.value === defaultValue ? \"*\" : i === 0 ? \" \" : \" \"\n process.stdout.write(\n ` ${star} ${i + 1}) ${o.label ?? o.value}${o.label ? ` (${o.value})` : \"\"}\\n`\n )\n }\n const ans = await promptString(\n `Choose 1-${options.length}`,\n defaultValue ? { defaultValue } : { masked: false }\n )\n // Accept either the numeric index or a literal value.\n const asNum = Number.parseInt(ans, 10)\n if (Number.isFinite(asNum) && asNum >= 1 && asNum <= options.length) {\n return options[asNum - 1]!.value\n }\n const exact = options.find((o) => o.value === ans)\n if (exact) return exact.value\n if (defaultValue && options.some((o) => o.value === defaultValue)) {\n return defaultValue\n }\n throw new Error(\n `invalid selection '${ans}'; expected one of ${options.map((o) => o.value).join(\", \")}`\n )\n}\n\nasync function resolveSelectOptions(\n options: Extract<AgentCliSetupStep, { kind: \"prompt\" }>[\"options\"]\n): Promise<{ value: string; label?: string }[]> {\n if (!options) return []\n if (Array.isArray(options)) {\n return options.map((v) => ({ value: v }))\n }\n // Dynamic options: run the cmd, parse stdout (one option per line,\n // optional `value\\tlabel`).\n const captured = await runShellCapturing(options.cmd, {\n timeoutMs: options.timeout_ms ?? 30_000,\n interactive: false,\n })\n if (captured.exitCode !== 0) {\n throw new Error(\n `select options cmd exited ${captured.exitCode}: ${truncate(captured.stderr, 400)}`\n )\n }\n return captured.stdout\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter(Boolean)\n .map((line) => {\n const [value, label] = line.split(\"\\t\")\n const out: { value: string; label?: string } = { value: value! }\n if (label) out.label = label\n return out\n })\n}\n\n// ── shell helper ─────────────────────────────────────────────────────\n\nasync function runShellCapturing(\n cmd: string,\n opts: { timeoutMs: number; interactive: boolean }\n): Promise<{ exitCode: number; stdout: string; stderr: string }> {\n return new Promise((resolve) => {\n const child = spawn(\"bash\", [\"-lc\", cmd], {\n stdio: opts.interactive\n ? \"inherit\"\n : [\"ignore\", \"pipe\", \"pipe\"],\n })\n let stdout = \"\"\n let stderr = \"\"\n child.stdout?.on(\"data\", (c: Buffer) => {\n stdout += c.toString(\"utf8\")\n })\n child.stderr?.on(\"data\", (c: Buffer) => {\n stderr += c.toString(\"utf8\")\n })\n const timer = setTimeout(() => {\n child.kill(\"SIGTERM\")\n setTimeout(() => child.kill(\"SIGKILL\"), 1000)\n }, opts.timeoutMs)\n child.once(\"error\", () => {\n clearTimeout(timer)\n resolve({ exitCode: 127, stdout, stderr: stderr || \"spawn error\" })\n })\n child.once(\"exit\", (code) => {\n clearTimeout(timer)\n resolve({ exitCode: code ?? 0, stdout, stderr })\n })\n })\n}\n\nfunction shellEscape(s: string): string {\n // POSIX-style single-quote escape — wraps in single quotes and\n // closes/reopens around any literal single quote in the value.\n return `'${s.replace(/'/g, `'\"'\"'`)}'`\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length <= max ? s : s.slice(0, max - 3) + \"…\"\n}\n\n// ── ledger ───────────────────────────────────────────────────────────\n\nfunction ledgerPathFor(slug: string): string {\n const base =\n process.env[\"AGENTPROTO_HOME\"] ?? join(homedir(), \".agentproto\")\n return join(base, \"setup\", `${slug}.json`)\n}\n\nasync function loadLedger(path: string, slug: string): Promise<Ledger> {\n try {\n const raw = await readFile(path, \"utf8\")\n const parsed = JSON.parse(raw) as Ledger\n if (parsed.slug === slug && typeof parsed.steps === \"object\") return parsed\n } catch {\n // No ledger yet, or malformed — start fresh.\n }\n return {\n slug,\n updatedAt: new Date().toISOString(),\n steps: {},\n }\n}\n\nasync function saveLedger(path: string, ledger: Ledger): Promise<void> {\n ledger.updatedAt = new Date().toISOString()\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, JSON.stringify(ledger, null, 2))\n await chmod(path, 0o600).catch(() => {\n // chmod failures on Windows are non-fatal — the file lives in\n // %USERPROFILE% which is already user-private.\n })\n}\n","/**\n * `agentproto install runtime-profile/<name>` — copy a declared file\n * tree from `@agentproto/runtime-profile-<name>` into the user's repo.\n *\n * Source of truth: the profile package's `profile.json` manifest +\n * `files/` tree. The handler is dumb on purpose — it copies declared\n * files with per-entry merge strategies and records what landed in a\n * local ledger so re-runs can be idempotent and detect drift.\n */\n\nimport { readFile, writeFile, mkdir, stat, chmod } from \"node:fs/promises\"\nimport { dirname, resolve as resolvePath, join } from \"node:path\"\nimport { createHash } from \"node:crypto\"\nimport { homedir } from \"node:os\"\nimport { parseArgs } from \"node:util\"\n\ntype Strategy = \"overwrite\" | \"preserve\" | \"merge-json-deep\" | \"append\"\n\ntype ProfileFile = {\n src: string\n dest: string\n strategy: Strategy\n executable?: boolean\n}\n\ntype ProfileManifest = {\n schema: string\n slug: string\n version: string\n name: string\n description: string\n files: ProfileFile[]\n}\n\ntype LedgerEntry = {\n dest: string\n strategy: Strategy\n hashAfter: string\n appliedAt: string\n}\n\ntype Ledger = {\n slug: string\n version: string\n installedAt: string\n updatedAt: string\n files: LedgerEntry[]\n}\n\nexport async function runInstallProfile(\n slug: string,\n args: readonly string[]\n): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {\n force: { type: \"boolean\", short: \"f\" },\n \"dry-run\": { type: \"boolean\" },\n \"skip-setup\": { type: \"boolean\" },\n cwd: { type: \"string\" },\n package: { type: \"string\" },\n },\n })\n\n if (!slug.startsWith(\"runtime-profile/\")) {\n process.stderr.write(\n `agentproto install: expected slug starting with 'runtime-profile/', got '${slug}'.\\n`\n )\n return 2\n }\n const profileName = slug.slice(\"runtime-profile/\".length)\n if (!/^[a-z][a-z0-9-]*$/.test(profileName)) {\n process.stderr.write(\n `agentproto install: invalid profile name '${profileName}'. Lower-kebab only.\\n`\n )\n return 2\n }\n\n // Resolution order for the backing npm package:\n // 1. Explicit `--package <name>` override.\n // 2. `profileAliases[<slug>]` in `~/.agentproto/config.json`.\n // 3. Default convention: `@agentproto/runtime-profile-<slug>`.\n let packageName: string\n if (typeof values.package === \"string\" && values.package) {\n packageName = values.package\n } else {\n const aliased = await readProfileAlias(profileName)\n packageName = aliased ?? `@agentproto/runtime-profile-${profileName}`\n }\n let mod: Record<string, unknown>\n try {\n mod = (await import(packageName)) as Record<string, unknown>\n } catch (err) {\n const cause = err instanceof Error ? err.message : String(err)\n process.stderr.write(\n `agentproto install: could not load profile package '${packageName}'. Install it first with: npm i -g ${packageName}\\n cause: ${cause}\\n`\n )\n return 1\n }\n const filesDir =\n typeof mod.FILES_DIR === \"string\" ? (mod.FILES_DIR as string) : null\n const loadProfileManifest = mod.loadProfileManifest as\n | (() => Promise<ProfileManifest>)\n | undefined\n if (!filesDir || !loadProfileManifest) {\n process.stderr.write(\n `agentproto install: profile package '${packageName}' does not export FILES_DIR + loadProfileManifest.\\n`\n )\n return 1\n }\n\n const manifest = await loadProfileManifest()\n\n const cwd = values.cwd ? resolvePath(values.cwd) : process.cwd()\n const dryRun = values[\"dry-run\"] === true\n const force = values.force === true\n\n process.stdout.write(\n `agentproto install ${slug} v${manifest.version} → ${cwd}\\n` +\n ` ${manifest.description}\\n`\n )\n\n const ledgerPath = ledgerPathFor(profileName)\n const prevLedger = await loadLedger(ledgerPath)\n\n const newLedger: Ledger = {\n slug,\n version: manifest.version,\n installedAt: prevLedger?.installedAt ?? new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n files: [],\n }\n\n let applied = 0\n let skipped = 0\n let failed = 0\n\n for (const entry of manifest.files) {\n const src = resolvePath(filesDir, entry.src)\n const dest = resolvePath(cwd, entry.dest)\n const prev = prevLedger?.files.find((f) => f.dest === entry.dest) ?? null\n\n try {\n const srcBuf = await readFile(src)\n const result = await applyStrategy({\n strategy: entry.strategy,\n srcBuf,\n dest,\n prev,\n force,\n dryRun,\n })\n newLedger.files.push({\n dest: entry.dest,\n strategy: entry.strategy,\n hashAfter: result.hashAfter,\n appliedAt: result.wrote ? new Date().toISOString() : prev?.appliedAt ?? new Date().toISOString(),\n })\n if (result.wrote) {\n applied += 1\n process.stdout.write(` ${result.action.padEnd(10)} ${entry.dest}\\n`)\n if (entry.executable && !dryRun) {\n await chmod(dest, 0o755)\n }\n } else {\n skipped += 1\n process.stdout.write(` ${result.action.padEnd(10)} ${entry.dest}\\n`)\n }\n } catch (err) {\n failed += 1\n const msg = err instanceof Error ? err.message : String(err)\n process.stderr.write(` FAIL ${entry.dest} — ${msg}\\n`)\n }\n }\n\n if (!dryRun) {\n await saveLedger(ledgerPath, newLedger)\n }\n\n process.stdout.write(\n `agentproto install ${slug}: ${applied} applied, ${skipped} skipped, ${failed} failed${dryRun ? \" (dry-run)\" : \"\"}\\n`\n )\n\n return failed === 0 ? 0 : 1\n}\n\ntype ApplyResult = {\n wrote: boolean\n action: string\n hashAfter: string\n}\n\nasync function applyStrategy(opts: {\n strategy: Strategy\n srcBuf: Buffer\n dest: string\n prev: LedgerEntry | null\n force: boolean\n dryRun: boolean\n}): Promise<ApplyResult> {\n const { strategy, srcBuf, dest, prev, force, dryRun } = opts\n\n const destExists = await fileExists(dest)\n\n if (strategy === \"preserve\") {\n if (destExists) {\n const currentHash = await hashFile(dest)\n return { wrote: false, action: \"preserve\", hashAfter: currentHash }\n }\n if (!dryRun) {\n await ensureDir(dirname(dest))\n await writeFile(dest, srcBuf)\n }\n return { wrote: true, action: \"create\", hashAfter: sha256(srcBuf) }\n }\n\n if (strategy === \"overwrite\") {\n const srcHash = sha256(srcBuf)\n if (destExists && !force) {\n const destHash = await hashFile(dest)\n if (destHash === srcHash) {\n return { wrote: false, action: \"unchanged\", hashAfter: destHash }\n }\n if (prev && prev.hashAfter !== destHash) {\n // The user edited this file after our last install. Don't\n // clobber without --force.\n return {\n wrote: false,\n action: \"user-edit\",\n hashAfter: destHash,\n }\n }\n }\n if (!dryRun) {\n await ensureDir(dirname(dest))\n await writeFile(dest, srcBuf)\n }\n return {\n wrote: true,\n action: destExists ? \"update\" : \"create\",\n hashAfter: srcHash,\n }\n }\n\n if (strategy === \"merge-json-deep\") {\n const srcJson = parseJsonOrThrow(srcBuf.toString(\"utf8\"), \"src\")\n let merged: unknown = srcJson\n if (destExists) {\n const destRaw = await readFile(dest, \"utf8\")\n const destJson = parseJsonOrThrow(destRaw, \"dest\")\n merged = deepMerge(destJson, srcJson)\n }\n const out = `${JSON.stringify(merged, null, 2)}\\n`\n const outBuf = Buffer.from(out, \"utf8\")\n const outHash = sha256(outBuf)\n if (destExists) {\n const destHash = await hashFile(dest)\n if (destHash === outHash) {\n return { wrote: false, action: \"unchanged\", hashAfter: destHash }\n }\n }\n if (!dryRun) {\n await ensureDir(dirname(dest))\n await writeFile(dest, outBuf)\n }\n return {\n wrote: true,\n action: destExists ? \"merge\" : \"create\",\n hashAfter: outHash,\n }\n }\n\n if (strategy === \"append\") {\n const srcText = srcBuf.toString(\"utf8\")\n if (destExists) {\n const destText = await readFile(dest, \"utf8\")\n if (destText.includes(srcText)) {\n return {\n wrote: false,\n action: \"unchanged\",\n hashAfter: sha256(Buffer.from(destText, \"utf8\")),\n }\n }\n const out = `${destText.endsWith(\"\\n\") ? destText : `${destText}\\n`}${srcText}`\n const outBuf = Buffer.from(out, \"utf8\")\n if (!dryRun) {\n await ensureDir(dirname(dest))\n await writeFile(dest, outBuf)\n }\n return { wrote: true, action: \"append\", hashAfter: sha256(outBuf) }\n }\n if (!dryRun) {\n await ensureDir(dirname(dest))\n await writeFile(dest, srcBuf)\n }\n return { wrote: true, action: \"create\", hashAfter: sha256(srcBuf) }\n }\n\n throw new Error(`Unknown strategy: ${strategy}`)\n}\n\nfunction deepMerge(target: unknown, source: unknown): unknown {\n if (\n target &&\n source &&\n typeof target === \"object\" &&\n typeof source === \"object\" &&\n !Array.isArray(target) &&\n !Array.isArray(source)\n ) {\n const out: Record<string, unknown> = { ...(target as Record<string, unknown>) }\n for (const [k, v] of Object.entries(source as Record<string, unknown>)) {\n out[k] = deepMerge((target as Record<string, unknown>)[k], v)\n }\n return out\n }\n if (Array.isArray(target) && Array.isArray(source)) {\n // Concat + dedup-by-JSON. Cheap and safe for hook arrays and\n // permission lists (which are the realistic merge targets).\n const seen = new Set<string>()\n const out: unknown[] = []\n for (const item of [...target, ...source]) {\n const key = JSON.stringify(item)\n if (seen.has(key)) continue\n seen.add(key)\n out.push(item)\n }\n return out\n }\n return source ?? target\n}\n\nfunction parseJsonOrThrow(raw: string, side: \"src\" | \"dest\"): unknown {\n try {\n return JSON.parse(raw)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n throw new Error(`merge-json-deep ${side} not valid JSON: ${msg}`)\n }\n}\n\nfunction sha256(buf: Buffer): string {\n return createHash(\"sha256\").update(buf).digest(\"hex\")\n}\n\nasync function hashFile(path: string): Promise<string> {\n const buf = await readFile(path)\n return sha256(buf)\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await stat(path)\n return true\n } catch {\n return false\n }\n}\n\nasync function ensureDir(dir: string): Promise<void> {\n try {\n await stat(dir)\n } catch {\n await mkdir(dir, { recursive: true })\n }\n}\n\nfunction ledgerPathFor(profileName: string): string {\n return join(homedir(), \".agentproto\", \"profiles\", `${profileName}.json`)\n}\n\nasync function loadLedger(path: string): Promise<Ledger | null> {\n try {\n const raw = await readFile(path, \"utf8\")\n return JSON.parse(raw) as Ledger\n } catch {\n return null\n }\n}\n\nasync function saveLedger(path: string, ledger: Ledger): Promise<void> {\n await ensureDir(dirname(path))\n await writeFile(path, `${JSON.stringify(ledger, null, 2)}\\n`)\n}\n\n/**\n * Look up a profile-slug → npm-package alias in\n * `~/.agentproto/config.json` (or `$AGENTPROTO_HOME/config.json`).\n *\n * { \"profileAliases\": { \"guilde\": \"@guilde/runtime-profile-guilde\" } }\n *\n * Returns the resolved package name, or `null` if no alias is set.\n */\nasync function readProfileAlias(profileName: string): Promise<string | null> {\n const base =\n process.env[\"AGENTPROTO_HOME\"] ?? join(homedir(), \".agentproto\")\n const path = join(base, \"config.json\")\n try {\n const raw = await readFile(path, \"utf8\")\n const parsed = JSON.parse(raw) as {\n profileAliases?: Record<string, string>\n }\n const aliased = parsed.profileAliases?.[profileName]\n return typeof aliased === \"string\" ? aliased : null\n } catch {\n return null\n }\n}\n","/**\n * `agentproto install <slug>`\n *\n * Reads the adapter manifest's `install` block and shells out to the\n * declared package manager. Idempotent: if `version_check` passes, we\n * skip and report \"already installed\" (override with --force).\n *\n * The adapter package itself must already be in node_modules (we resolve\n * it before reading its manifest). Bootstrapping the adapter package is\n * a separate concern — `npm i -g @agentproto/adapter-<slug>` first.\n *\n * Method support matrix:\n * - `npm` ✓\n * - `brew` ✓ (macOS / Linux Homebrew)\n * - `curl` ✓ (with optional verify_sha256)\n * - `download` ✓ (tarball/zip + extract_bin + optional verify_sha256)\n * - `pip` ✓ (with optional `user: true`)\n * - `cargo` ✓\n * - `go` ✓\n * - `apt/dnf/pacman` ✗ (privilege escalation needs explicit sudo policy)\n * - `choco/scoop` ✗ (Windows-only; not yet platform-detected)\n * - `vendored` ✗ (workspace-relative; needs a workspace root)\n *\n * After install, runs the optional `setup[]` pipeline (AIP-29 § Setup).\n */\n\nimport { spawn } from \"node:child_process\"\nimport { createHash } from \"node:crypto\"\nimport { mkdir, mkdtemp, rm, writeFile, chmod } from \"node:fs/promises\"\nimport { tmpdir } from \"node:os\"\nimport { join } from \"node:path\"\nimport { parseArgs } from \"node:util\"\nimport type { AgentCliInstallMethod } from \"@agentproto/driver-agent-cli\"\nimport { resolveAdapter } from \"../registry/resolve.js\"\nimport { runSetup } from \"./setup.js\"\nimport { runInstallProfile } from \"./install-profile.js\"\n\nexport async function runInstall(args: readonly string[]): Promise<number> {\n // Peek at the slug before parseArgs — it influences which option set is\n // valid. Adapter slugs and runtime-profile/* slugs share the verb but\n // route through separate handlers with different flags.\n const slugPeek = args.find((a) => !a.startsWith(\"-\"))\n if (slugPeek?.startsWith(\"runtime-profile/\")) {\n return runInstallProfile(\n slugPeek,\n args.filter((a) => a !== slugPeek)\n )\n }\n\n const { values, positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {\n force: { type: \"boolean\", short: \"f\" },\n \"dry-run\": { type: \"boolean\" },\n \"skip-setup\": { type: \"boolean\" },\n },\n })\n\n const slug = positionals[0]\n if (!slug) {\n process.stderr.write(\n \"agentproto install: missing adapter slug. Try: agentproto install claude-code\\n\"\n )\n return 2\n }\n\n const adapter = await resolveAdapter(slug)\n const installSteps: AgentCliInstallMethod[] = adapter.handle.install ?? []\n if (installSteps.length === 0) {\n process.stderr.write(\n `agentproto install: adapter '${slug}' declares no install steps.\\n`\n )\n return 0\n }\n\n let alreadyInstalled = false\n if (!values.force) {\n const checked = await runVersionCheck(adapter.handle.version_check)\n if (checked.ok) {\n process.stdout.write(\n `agentproto: '${slug}' already installed (${checked.message}). Pass --force to reinstall.\\n`\n )\n alreadyInstalled = true\n }\n }\n\n if (!alreadyInstalled) {\n let lastFailure: { step: AgentCliInstallMethod; code: number } | null = null\n let succeeded = false\n for (const [i, step] of installSteps.entries()) {\n // Spec: hosts try install methods *in order until one succeeds*.\n // Pre-this-fix the runner aborted on the first failure, which made\n // the curl-fallback pattern in opencode/openclaw unreachable\n // whenever npm wasn't viable. Now we collect failures and only\n // surface the last one if every method falls through.\n if (step.experimental) {\n process.stdout.write(\n `agentproto install [${i + 1}/${installSteps.length}] ${describeStep(step)} (experimental — skipping)\\n`\n )\n continue\n }\n process.stdout.write(\n `agentproto install [${i + 1}/${installSteps.length}] ${describeStep(step)}\\n`\n )\n if (values[\"dry-run\"]) {\n succeeded = true\n continue\n }\n const code = await runStep(step)\n if (code === 0) {\n succeeded = true\n break\n }\n lastFailure = { step, code }\n process.stdout.write(\n `agentproto install: method '${step.method}' returned ${code}; trying next.\\n`\n )\n }\n if (!succeeded && lastFailure) {\n process.stderr.write(\n `agentproto install: all ${installSteps.length} install methods failed. Last failure: ${lastFailure.step.method} → exit ${lastFailure.code}.\\n`\n )\n return lastFailure.code\n }\n if (!succeeded && !lastFailure) {\n // Every method was experimental/skipped.\n process.stderr.write(\n `agentproto install: no usable install method found for '${slug}'.\\n`\n )\n return 1\n }\n process.stdout.write(`agentproto: '${slug}' installed.\\n`)\n }\n\n // Run the AIP-29 § Setup pipeline (post-install configuration). Skipped\n // when --skip-setup is passed or the manifest declares no setup. The\n // setup engine is idempotent — already-satisfied steps short-circuit\n // via skip_if; previously-completed steps short-circuit via the ledger.\n if (!values[\"skip-setup\"] && (adapter.handle.setup?.length ?? 0) > 0) {\n process.stdout.write(`agentproto: running setup for '${slug}'…\\n`)\n const setupCode = await runSetup({\n slug,\n handle: adapter.handle,\n force: values.force ?? false,\n dryRun: values[\"dry-run\"] ?? false,\n })\n if (setupCode !== 0) return setupCode\n }\n\n return 0\n}\n\nfunction describeStep(step: AgentCliInstallMethod): string {\n switch (step.method) {\n case \"npm\":\n return `npm install ${step.global ? \"-g \" : \"\"}${step.package ?? \"(?)\"}`\n case \"brew\":\n return `brew install ${step.package ?? \"(?)\"}`\n case \"pip\":\n return `pip install ${step.user ? \"--user \" : \"\"}${step.package ?? \"(?)\"}`\n case \"cargo\":\n return `cargo install ${step.package ?? \"(?)\"}`\n case \"go\":\n return `go install ${step.package ?? \"(?)\"}`\n case \"curl\":\n return `curl ${step.url ?? \"(?)\"} | bash`\n case \"download\":\n return `download ${step.url ?? \"(?)\"} → ${step.extract_bin ?? \"(?)\"}`\n default:\n return `${step.method} ${step.package ?? step.url ?? step.path ?? \"(?)\"}`\n }\n}\n\nasync function runStep(step: AgentCliInstallMethod): Promise<number> {\n switch (step.method) {\n case \"npm\": {\n if (!step.package) {\n process.stderr.write(\"agentproto install: npm step missing package.\\n\")\n return 2\n }\n const argv = [\"install\"]\n if (step.global) argv.push(\"-g\")\n argv.push(step.package)\n return spawnInherit(\"npm\", argv)\n }\n case \"brew\": {\n if (!step.package) {\n process.stderr.write(\"agentproto install: brew step missing package.\\n\")\n return 2\n }\n // Namespaced packages (e.g. `stripe/stripe-cli/stripe`) need an\n // implicit `brew tap`; `brew install` accepts the fully-qualified\n // form, so we pass it through verbatim. Bare names work too.\n return spawnInherit(\"brew\", [\"install\", step.package])\n }\n case \"pip\": {\n if (!step.package) {\n process.stderr.write(\"agentproto install: pip step missing package.\\n\")\n return 2\n }\n const argv = [\"install\"]\n if (step.user) argv.push(\"--user\")\n argv.push(step.package)\n // Prefer pip3 when it exists; fall back to pip. We just call `pip`\n // here because the user's PATH ordering is the right authority.\n return spawnInherit(\"pip\", argv)\n }\n case \"cargo\": {\n if (!step.package) {\n process.stderr.write(\n \"agentproto install: cargo step missing package.\\n\"\n )\n return 2\n }\n return spawnInherit(\"cargo\", [\"install\", step.package])\n }\n case \"go\": {\n if (!step.package) {\n process.stderr.write(\"agentproto install: go step missing package.\\n\")\n return 2\n }\n return spawnInherit(\"go\", [\"install\", step.package])\n }\n case \"curl\": {\n if (!step.url) {\n process.stderr.write(\"agentproto install: curl step missing url.\\n\")\n return 2\n }\n return runCurlInstaller(step.url, step.verify_sha256)\n }\n case \"download\": {\n if (!step.url || !step.extract_bin) {\n process.stderr.write(\n \"agentproto install: download step missing url or extract_bin.\\n\"\n )\n return 2\n }\n return runDownloadInstaller({\n url: step.url,\n extractBin: step.extract_bin,\n verifySha256: step.verify_sha256,\n })\n }\n default:\n process.stderr.write(\n `agentproto install: method '${step.method}' not yet implemented in this CLI version. ` +\n `Run it manually for now (see the adapter's docs).\\n`\n )\n return 1\n }\n}\n\n/**\n * `curl <url> | bash` with optional SHA-256 verification of the\n * installer script *before* executing it. Spec posture (AIP-29 §\n * Install methods → §curl): hosts SHOULD refuse curl-style installers\n * without a verify_sha256 in production. We surface a warning when\n * one is missing but still execute — the agentproto CLI runs in\n * developer / first-run contexts where the trade-off is acceptable.\n */\nasync function runCurlInstaller(\n url: string,\n verifySha256?: string\n): Promise<number> {\n if (!verifySha256) {\n process.stdout.write(\n `agentproto install: curl ${url} (⚠ no verify_sha256 declared — installer integrity not verified)\\n`\n )\n }\n const dir = await mkdtemp(join(tmpdir(), \"agentproto-curl-\"))\n const scriptPath = join(dir, \"install.sh\")\n try {\n const res = await fetch(url, { redirect: \"follow\" })\n if (!res.ok) {\n process.stderr.write(\n `agentproto install: curl fetch failed: ${res.status} ${res.statusText}\\n`\n )\n return res.status\n }\n const buf = Buffer.from(await res.arrayBuffer())\n if (verifySha256) {\n const got = createHash(\"sha256\").update(buf).digest(\"hex\")\n if (got !== verifySha256.toLowerCase()) {\n process.stderr.write(\n `agentproto install: SHA-256 mismatch for ${url}\\n expected: ${verifySha256}\\n got: ${got}\\n`\n )\n return 4\n }\n process.stdout.write(\n `agentproto install: SHA-256 verified (${got.slice(0, 16)}…)\\n`\n )\n }\n await writeFile(scriptPath, buf)\n await chmod(scriptPath, 0o755)\n return spawnInherit(\"bash\", [scriptPath])\n } catch (err) {\n process.stderr.write(\n `agentproto install: curl install failed: ${err instanceof Error ? err.message : String(err)}\\n`\n )\n return 1\n } finally {\n await rm(dir, { recursive: true, force: true }).catch(() => {})\n }\n}\n\n/**\n * Download an archive, optionally verify SHA-256, extract the binary\n * named in `extract_bin`, drop it into `~/.local/bin/<id>` (or the\n * AGENTPROTO_BIN_DIR override), and chmod +x. Supports tar.gz, tgz,\n * zip via the host's `tar` and `unzip`. The CLI doesn't decide the\n * binary's final name — `extract_bin`'s basename becomes the symlink\n * name on PATH.\n */\nasync function runDownloadInstaller(opts: {\n url: string\n extractBin: string\n verifySha256?: string\n}): Promise<number> {\n const dir = await mkdtemp(join(tmpdir(), \"agentproto-dl-\"))\n try {\n const filename = opts.url.split(\"/\").pop() || \"archive.bin\"\n const archivePath = join(dir, filename)\n const res = await fetch(opts.url, { redirect: \"follow\" })\n if (!res.ok) {\n process.stderr.write(\n `agentproto install: download fetch failed: ${res.status} ${res.statusText}\\n`\n )\n return res.status\n }\n const buf = Buffer.from(await res.arrayBuffer())\n if (opts.verifySha256) {\n const got = createHash(\"sha256\").update(buf).digest(\"hex\")\n if (got !== opts.verifySha256.toLowerCase()) {\n process.stderr.write(\n `agentproto install: SHA-256 mismatch\\n expected: ${opts.verifySha256}\\n got: ${got}\\n`\n )\n return 4\n }\n }\n await writeFile(archivePath, buf)\n\n const extractDir = join(dir, \"extract\")\n await mkdir(extractDir, { recursive: true })\n let extractCode: number\n if (\n filename.endsWith(\".tar.gz\") ||\n filename.endsWith(\".tgz\") ||\n filename.endsWith(\".tar\")\n ) {\n extractCode = await spawnInherit(\"tar\", [\n \"-xf\",\n archivePath,\n \"-C\",\n extractDir,\n ])\n } else if (filename.endsWith(\".zip\")) {\n extractCode = await spawnInherit(\"unzip\", [\n \"-q\",\n archivePath,\n \"-d\",\n extractDir,\n ])\n } else {\n process.stderr.write(\n `agentproto install: unsupported archive format for ${filename}. ` +\n `Supported: .tar, .tar.gz, .tgz, .zip.\\n`\n )\n return 5\n }\n if (extractCode !== 0) return extractCode\n\n const srcBin = join(extractDir, opts.extractBin)\n const binDir =\n process.env[\"AGENTPROTO_BIN_DIR\"] ?? join(homedir(), \".local\", \"bin\")\n await mkdir(binDir, { recursive: true })\n const destBin = join(binDir, opts.extractBin.split(\"/\").pop()!)\n // Use cp -p to preserve mode bits then chmod +x to be safe.\n const cpCode = await spawnInherit(\"cp\", [\"-p\", srcBin, destBin])\n if (cpCode !== 0) return cpCode\n await chmod(destBin, 0o755)\n process.stdout.write(`agentproto install: ${destBin}\\n`)\n if (!process.env[\"PATH\"]?.includes(binDir)) {\n process.stdout.write(\n `agentproto install: ⚠ ${binDir} is not on PATH — add it to your shell profile so the binary is reachable.\\n`\n )\n }\n return 0\n } catch (err) {\n process.stderr.write(\n `agentproto install: download failed: ${err instanceof Error ? err.message : String(err)}\\n`\n )\n return 1\n } finally {\n await rm(dir, { recursive: true, force: true }).catch(() => {})\n }\n}\n\nfunction homedir(): string {\n return process.env[\"HOME\"] ?? process.env[\"USERPROFILE\"] ?? \"/\"\n}\n\nfunction spawnInherit(cmd: string, argv: string[]): Promise<number> {\n return new Promise((resolve, reject) => {\n const child = spawn(cmd, argv, { stdio: \"inherit\" })\n child.once(\"error\", reject)\n child.once(\"exit\", (code) => resolve(code ?? 0))\n })\n}\n\nasync function runVersionCheck(\n check: Awaited<\n ReturnType<typeof resolveAdapter>\n >[\"handle\"][\"version_check\"]\n): Promise<{ ok: boolean; message: string }> {\n if (!check) return { ok: false, message: \"no version_check declared\" }\n return new Promise((resolve) => {\n const child = spawn(\"bash\", [\"-lc\", check.cmd], {\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n })\n let buf = \"\"\n child.stdout.on(\"data\", (c: Buffer) => {\n buf += c.toString(\"utf8\")\n })\n child.once(\"error\", () => resolve({ ok: false, message: \"check failed\" }))\n child.once(\"exit\", (code) => {\n if (code !== 0) {\n resolve({ ok: false, message: `check exited ${code}` })\n return\n }\n const re = new RegExp(check.parse)\n const m = buf.match(re)\n if (!m || !m[1]) {\n resolve({ ok: false, message: \"could not parse version\" })\n return\n }\n // semver-range matching is left to a future helper; we report\n // the captured version and trust it. --force remains the\n // escape hatch when range gating actually matters.\n resolve({ ok: true, message: `version ${m[1]}` })\n })\n })\n}\n","/**\n * Read piped stdin to a string. Returns null if stdin is a TTY (no pipe).\n * Used by `agentproto run` to accept prompts via:\n * echo \"summarise this repo\" | agentproto run claude-code\n */\n\nexport async function readStdinIfPiped(): Promise<string | null> {\n if (process.stdin.isTTY) return null\n const chunks: Buffer[] = []\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))\n }\n const text = Buffer.concat(chunks).toString(\"utf8\").trim()\n return text.length > 0 ? text : null\n}\n","/**\n * `agentproto run <slug> [--cwd <dir>] [--prompt <text>] [--resume <id>]`\n *\n * Boots the named adapter, dispatches a single user turn, streams events\n * to stdout, then exits. Designed for two use-cases:\n * - one-shot scripting (pipe a prompt in, get stream back)\n * - quick smoke-test from a fresh checkout (\"does claude even spawn?\")\n *\n * Long-lived multiplexing belongs to `agentproto serve`, not here.\n */\n\nimport { resolve as resolvePath } from \"node:path\"\nimport { parseArgs } from \"node:util\"\nimport {\n createAgentCliRuntime,\n type AgentCliRuntimeSession,\n type StreamEvent,\n} from \"@agentproto/driver-agent-cli\"\nimport { resolveAdapter } from \"../registry/resolve.js\"\nimport { readStdinIfPiped } from \"../util/stdin.js\"\n\nexport async function runRun(args: readonly string[]): Promise<number> {\n const { values, positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {\n cwd: { type: \"string\" },\n prompt: { type: \"string\", short: \"p\" },\n resume: { type: \"string\" },\n json: { type: \"boolean\" },\n },\n })\n\n const slug = positionals[0]\n if (!slug) {\n process.stderr.write(\n \"agentproto run: missing adapter slug. Try: agentproto run claude-code\\n\"\n )\n return 2\n }\n\n const cwd = values.cwd ? resolvePath(values.cwd) : process.cwd()\n const promptArg = values.prompt ?? (await readStdinIfPiped())\n if (!promptArg) {\n process.stderr.write(\n \"agentproto run: no prompt provided. Pass --prompt or pipe one over stdin.\\n\"\n )\n return 2\n }\n\n const adapter = await resolveAdapter(slug)\n const runtime = createAgentCliRuntime(adapter.handle)\n\n const controller = new AbortController()\n const onSignal = (sig: NodeJS.Signals) => {\n process.stderr.write(`\\nagentproto: received ${sig}, cancelling…\\n`)\n controller.abort()\n }\n process.once(\"SIGINT\", onSignal)\n process.once(\"SIGTERM\", onSignal)\n\n let session: AgentCliRuntimeSession | null = null\n try {\n session = await runtime.start({\n cwd,\n signal: controller.signal,\n resumeSessionId: values.resume,\n })\n\n const printer = values.json ? printJson : printPretty\n let exit = 0\n for await (const ev of session.send(promptArg)) {\n printer(ev)\n if (ev.kind === \"turn-end\" && ev.reason !== \"completed\") exit = 1\n if (ev.kind === \"error\") exit = 1\n }\n return exit\n } finally {\n process.off(\"SIGINT\", onSignal)\n process.off(\"SIGTERM\", onSignal)\n if (session) await session.close().catch(() => {})\n }\n}\n\nfunction printJson(ev: StreamEvent): void {\n process.stdout.write(`${JSON.stringify(ev)}\\n`)\n}\n\nfunction printPretty(ev: StreamEvent): void {\n switch (ev.kind) {\n case \"text-delta\":\n process.stdout.write(ev.text)\n break\n case \"thought\":\n process.stderr.write(`\\x1b[2m[thought] ${ev.text}\\x1b[0m\\n`)\n break\n case \"tool-call\":\n process.stderr.write(`\\x1b[36m[tool] ${ev.toolName}\\x1b[0m\\n`)\n break\n case \"tool-result\":\n if (ev.isError)\n process.stderr.write(`\\x1b[31m[tool-error]\\x1b[0m\\n`)\n break\n case \"agent-prompt\":\n process.stderr.write(`\\x1b[33m[agent-prompt: needs input]\\x1b[0m\\n`)\n break\n case \"turn-end\":\n process.stdout.write(`\\n\\x1b[2m[turn-end: ${ev.reason}]\\x1b[0m\\n`)\n break\n case \"error\": {\n const code =\n typeof ev.error.code === \"number\" ? ` (code ${ev.error.code})` : \"\"\n process.stderr.write(\n `\\x1b[31m[error]${code} ${ev.error.message}\\x1b[0m\\n`,\n )\n // Attached child stderr (added by define-agent-cli) — usually\n // the most useful line (\"not authenticated\", \"model gated\",\n // missing binary path). Print after the headline so the\n // headline still scans first.\n const data = ev.error.data\n if (data && typeof data === \"object\") {\n const stderr = (data as { stderr?: unknown }).stderr\n if (typeof stderr === \"string\" && stderr.trim()) {\n process.stderr.write(`\\x1b[2m── child stderr ──\\n${stderr}\\x1b[0m\\n`)\n }\n // Surface any non-stderr fields as JSON so callers don't\n // have to switch to --json to see what payload was rejected.\n const rest = { ...(data as Record<string, unknown>) }\n delete rest.stderr\n if (Object.keys(rest).length > 0) {\n process.stderr.write(\n `\\x1b[2m── error.data ──\\n${JSON.stringify(rest, null, 2)}\\x1b[0m\\n`,\n )\n }\n }\n break\n }\n }\n}\n","/**\n * Credential store for `agentproto auth login`.\n *\n * Format on disk (JSON, mode 0600):\n *\n * {\n * \"version\": 1,\n * \"hosts\": {\n * \"wss://guilde.work/api/v1/agentproto/tunnel\": {\n * \"token\": \"eyJ…\",\n * \"tokenType\": \"Bearer\",\n * \"expiresAt\": \"2026-08-08T12:34:56.000Z\",\n * \"refreshToken\": \"rt_…\", // optional\n * \"scope\": \"tunnel:connect\",\n * \"subject\": \"user_abc\",\n * \"obtainedAt\": \"2026-05-10T08:21:11.000Z\",\n * \"deviceLabel\": \"jeremy@laptop\"\n * }\n * }\n * }\n *\n * One file per *user*, multiple hosts under the same file. Hosts are\n * keyed by the URL the user passed to `agentproto auth login --host`,\n * stripped of trailing slash. `agentproto serve --connect <url>` looks\n * up the same key when no `--token` is passed.\n *\n * Storage location:\n * - `$AGENTPROTO_HOME/credentials.json`, falling back to\n * - `~/.agentproto/credentials.json`\n *\n * The file holds bearer tokens, so it's chmod'd 0600 on every write.\n * On Windows we rely on the per-user profile path being already\n * private and skip chmod. Never log the token contents.\n */\n\nimport { mkdir, readFile, writeFile, chmod, unlink } from \"node:fs/promises\"\nimport { homedir } from \"node:os\"\nimport { join, dirname } from \"node:path\"\n\nexport interface HostCredential {\n /** Bearer token. Bearer-form is the only one supported for v1. */\n token: string\n /** Always \"Bearer\" today; reserved for future schemes. */\n tokenType: \"Bearer\"\n /** ISO-8601. May be in the past — callers must check `isExpired`. */\n expiresAt: string\n /** OAuth 2.0 refresh token. Present when the host issues one. */\n refreshToken?: string\n /** Space-separated scopes the token was issued with. */\n scope?: string\n /** Human-readable subject — usually the user id, surfaced in `auth status`. */\n subject?: string\n /** ISO-8601 of when this credential was minted. */\n obtainedAt: string\n /** Friendly device label shown on the host's Machine-tokens page. */\n deviceLabel?: string\n /** Opaque revocation hint surfaced by the host (e.g. JTI). The CLI\n * passes it back on `auth logout` so the host can revoke the right\n * row server-side, not just delete the local copy. */\n revocationId?: string\n}\n\ninterface CredentialsFile {\n version: 1\n hosts: Record<string, HostCredential>\n}\n\nconst FILE_VERSION = 1 as const\n\nexport function credentialsPath(): string {\n const base = process.env[\"AGENTPROTO_HOME\"] ?? join(homedir(), \".agentproto\")\n return join(base, \"credentials.json\")\n}\n\nexport function normaliseHost(host: string): string {\n return host.replace(/\\/+$/, \"\")\n}\n\nexport async function loadCredentials(): Promise<CredentialsFile> {\n const path = credentialsPath()\n try {\n const raw = await readFile(path, \"utf8\")\n const parsed = JSON.parse(raw) as CredentialsFile\n if (parsed.version !== FILE_VERSION) {\n throw new Error(\n `credentials.json: unknown version ${parsed.version}; expected ${FILE_VERSION}. ` +\n `Delete the file and re-run \\`agentproto auth login\\`.`\n )\n }\n return parsed\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return { version: FILE_VERSION, hosts: {} }\n }\n throw err\n }\n}\n\nexport async function saveCredentials(file: CredentialsFile): Promise<void> {\n const path = credentialsPath()\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, JSON.stringify(file, null, 2))\n await chmod(path, 0o600).catch(() => {\n // Windows + some sandboxed FSes (e.g. WSL on a Windows mount) don't\n // honour chmod. The file lives under the user profile in those\n // cases, which is already user-private; not worth refusing.\n })\n}\n\nexport async function readHost(host: string): Promise<HostCredential | null> {\n const f = await loadCredentials()\n return f.hosts[normaliseHost(host)] ?? null\n}\n\nexport async function writeHost(\n host: string,\n cred: HostCredential\n): Promise<void> {\n const f = await loadCredentials()\n f.hosts[normaliseHost(host)] = cred\n await saveCredentials(f)\n}\n\nexport async function deleteHost(host: string): Promise<HostCredential | null> {\n const f = await loadCredentials()\n const key = normaliseHost(host)\n const prev = f.hosts[key] ?? null\n if (prev) {\n delete f.hosts[key]\n if (Object.keys(f.hosts).length === 0) {\n // Empty file is a valid state (`auth login` re-creates), but\n // unlinking is cleaner — `auth status` then prints \"no credentials\".\n await unlink(credentialsPath()).catch(() => {})\n } else {\n await saveCredentials(f)\n }\n }\n return prev\n}\n\nexport function isExpired(cred: HostCredential, gracePeriodMs = 30_000): boolean {\n const exp = Date.parse(cred.expiresAt)\n if (!Number.isFinite(exp)) return false // unparseable expiry → trust the host\n return exp - gracePeriodMs <= Date.now()\n}\n\nexport function formatExpiry(cred: HostCredential): string {\n const exp = new Date(cred.expiresAt)\n if (Number.isNaN(exp.getTime())) return \"unknown\"\n const ms = exp.getTime() - Date.now()\n if (ms < 0) return `expired ${formatRelative(-ms)} ago`\n return `expires in ${formatRelative(ms)}`\n}\n\nfunction formatRelative(ms: number): string {\n if (ms < 60_000) return `${Math.round(ms / 1000)}s`\n if (ms < 3_600_000) return `${Math.round(ms / 60_000)}m`\n if (ms < 86_400_000) return `${Math.round(ms / 3_600_000)}h`\n return `${Math.round(ms / 86_400_000)}d`\n}\n","/**\n * Shared PTY factory loader.\n *\n * `node-pty` is an optional native dep — when present, the factory\n * returns a function that spawns child processes under a real PTY\n * (so ANSI escapes, alt-screen apps, key bindings and resize all\n * work). When absent, returns null and callers degrade to\n * `child_process.spawn` (no PTY).\n *\n * Two consumers today:\n * - `createTunnelServer` (packages/acp/src/tunnel/server.ts) — cloud-\n * dispatched spawns over the tunnel use this factory when the\n * spawn frame requests `pty: true`.\n * - `createGateway` (packages/runtime/src/index.ts) — local\n * `POST /sessions/terminal` route + MCP `start_terminal_session`\n * tool use this factory to register PTY-backed sessions in the\n * daemon's registry.\n *\n * Both consumers agree on the same minimal `PtyProcess` shape\n * (defined in `@agentproto/acp/tunnel`); the function we return here\n * satisfies both their `spawnPty` option types structurally.\n */\n\nimport type { PtyProcess } from \"@agentproto/acp/tunnel\"\n\nexport interface PtyFactoryOptions {\n command: string\n args: string[]\n cwd?: string\n env?: Record<string, string>\n cols: number\n rows: number\n}\n\nexport type PtyFactory = (opts: PtyFactoryOptions) => PtyProcess\n\nexport async function loadNodePtyFactory(): Promise<PtyFactory | null> {\n try {\n const nodePtyMod = await import(\"node-pty\")\n // node-pty is CJS — `import()` wraps the module under `.default` in ESM.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const nodePty = (nodePtyMod as any).default ?? nodePtyMod\n if (typeof nodePty.spawn !== \"function\") return null\n return (opts) => {\n const pty = nodePty.spawn(opts.command, opts.args, {\n name: \"xterm-256color\",\n cols: opts.cols,\n rows: opts.rows,\n cwd: opts.cwd,\n env: {\n ...(process.env as Record<string, string>),\n ...(opts.env ?? {}),\n },\n })\n const proc: PtyProcess = {\n get pid() {\n return pty.pid\n },\n write(data: string) {\n pty.write(data)\n },\n resize(cols: number, rows: number) {\n pty.resize(cols, rows)\n },\n kill(signal?: string) {\n pty.kill(signal)\n },\n onData(handler: (data: string) => void) {\n pty.onData(handler)\n },\n onExit(handler: (event: { exitCode: number; signal?: number }) => void) {\n pty.onExit(handler)\n },\n }\n return proc\n }\n } catch {\n return null\n }\n}\n","/**\n * `~/.agentproto/config.json` — single hand-editable JSON for the\n * agentproto control plane's defaults. Sits alongside the existing\n * surface files (workspaces.json, credentials.json, sessions.json):\n *\n * workspaces.json which directories are workspaces + which is active\n * credentials.json tunnel host bearer tokens (mode 0600)\n * sessions.json last-known snapshot of the registry (informational)\n * config.json daemon defaults: port, bind, allowed origins,\n * tunnel host, feature toggles\n *\n * Resolution order for every daemon knob is:\n * 1. CLI flag (e.g. --port)\n * 2. Env var (where one exists, e.g. AGENTPROTO_TOKEN)\n * 3. config.json\n * 4. Hardcoded default\n *\n * This means a user can call `agentproto config set daemon.port 18791`\n * once and never re-pass `--port 18791` to `serve install` etc. CLI\n * flags still win for one-off overrides.\n *\n * Schema is intentionally narrow + extensible — unknown keys are\n * preserved on save (deep-merge), so a newer CLI writing a new\n * field won't drop one an older CLI doesn't know about. No secrets\n * here; credentials stay in credentials.json (mode 0600).\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { dirname, join } from \"node:path\"\n\nexport const CONFIG_VERSION = 1 as const\n\nexport interface DaemonConfig {\n /** Absolute path to the workspace the daemon binds to at boot. */\n workspace?: string\n /** HTTP port. Default 18790. */\n port?: number\n /** Bind addr. Default 127.0.0.1. */\n bind?: string\n /** Trusted browser origins for mutating /sessions/* routes (in\n * addition to the hardcoded localhost defaults). */\n allowedOrigins?: string[]\n /** When true, the daemon does NOT auto-trust localhost-on-any-port.\n * Only origins explicitly listed in `allowedOrigins` are allowed.\n * Pair with a curated list (e.g. `[\"http://localhost:3000\"]`) for\n * hardened setups. Default false. */\n strictOrigins?: boolean\n /** Server label sent in tunnel hello frames. */\n label?: string\n}\n\nexport interface TunnelConfig {\n /** Cloud WS URL. When set + autoconnect=true, `agentproto serve`\n * bootstraps with `--connect <host>`. */\n host?: string\n /** apt_ daemon token to present at the tunnel upgrade. When set,\n * `agentproto serve` uses this BEFORE falling back to\n * credentials.json — handy in profiles where the token-per-host\n * mapping in credentials.json doesn't fit (e.g. host = tunnel URL\n * but credentials were minted against the api URL). */\n token?: string\n /** Whether `agentproto daemon start` connects the tunnel by\n * default. v0 only — implementer can ignore until daemon needs it. */\n autoconnect?: boolean\n}\n\nexport interface FeaturesConfig {\n /** Hint that PTY is desired — informational; the daemon still\n * detects node-pty's presence at runtime. */\n pty?: boolean\n}\n\n/**\n * Per-environment connection bundle. A profile overrides specific\n * fields of the top-level `daemon` / `tunnel` / `features` blocks\n * when selected via `--profile <name>` (or the top-level\n * `activeProfile` setting). Missing fields fall through to the\n * top-level config, so a profile only needs to declare what's\n * different — typically just `tunnel.host` + `tunnel.token`.\n *\n * Example:\n * {\n * \"daemon\": { \"workspace\": \"/code\", \"port\": 18790 },\n * \"activeProfile\": \"local\",\n * \"profiles\": {\n * \"local\": { \"tunnel\": { \"host\": \"ws://localhost:3200/connect\",\n * \"token\": \"apt_local\", \"autoconnect\": true } },\n * \"prod\": { \"tunnel\": { \"host\": \"wss://tunnel.guilde.work/connect\",\n * \"token\": \"apt_prod\", \"autoconnect\": true },\n * \"daemon\": { \"port\": 18791 } }\n * }\n * }\n *\n * Sandbox daemons generate per-sandbox profile entries at provision\n * time so the daemon inside the sandbox boots with\n * `agentproto serve --profile sandbox-<id>` and no extra plumbing.\n */\nexport interface ProfileConfig {\n daemon?: DaemonConfig\n tunnel?: TunnelConfig\n features?: FeaturesConfig\n}\n\nexport interface AgentprotoConfig {\n version?: number\n daemon?: DaemonConfig\n tunnel?: TunnelConfig\n features?: FeaturesConfig\n /** Named connection profiles. See `ProfileConfig` for the merge\n * semantics — a profile's fields shallow-override the top-level\n * defaults for the selected run. */\n profiles?: Record<string, ProfileConfig>\n /** Profile name to use when `--profile` isn't passed. When unset,\n * the top-level `daemon` / `tunnel` blocks are used directly. */\n activeProfile?: string\n /** Unknown keys preserved across save round-trips. */\n [unknown: string]: unknown\n}\n\nexport const CONFIG_FILE_PATH = (): string =>\n join(homedir(), \".agentproto\", \"config.json\")\n\n/**\n * Load config.json. Returns an empty object (NOT null) when the file\n * is missing, malformed, or unreadable — callers can `cfg.daemon?.port`\n * safely without null-guards. Errors during a malformed-read are\n * logged once so the user notices the file is broken without the\n * daemon refusing to boot.\n */\nexport async function loadConfig(path?: string): Promise<AgentprotoConfig> {\n const target = path ?? CONFIG_FILE_PATH()\n try {\n const raw = await fs.readFile(target, \"utf8\")\n const parsed = JSON.parse(raw) as unknown\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as AgentprotoConfig\n }\n console.warn(\n `[runtime/config] ${target}: top-level value is not an object — ignoring`,\n )\n return {}\n } catch (err) {\n // ENOENT is the common case; only warn on other shapes.\n const code = (err as NodeJS.ErrnoException).code\n if (code && code !== \"ENOENT\") {\n console.warn(\n `[runtime/config] failed to read ${target}: ${\n err instanceof Error ? err.message : String(err)\n }`,\n )\n }\n return {}\n }\n}\n\n/**\n * Write config.json atomically (tmp + rename) so a concurrent\n * `agentproto config edit` can't half-truncate the file. Writes\n * `next` AS-IS — callers are expected to pass the full desired\n * state (loaded the existing config, mutated, passed it back).\n *\n * Earlier versions deep-merged with the on-disk file, but that made\n * deletions impossible: `setConfigKey(cfg, \"x\", undefined)` would\n * remove the key from memory, then the deep-merge would silently\n * re-add it from disk. The current design trusts the caller's\n * snapshot and uses atomic rename for crash safety.\n */\nexport async function saveConfig(\n next: AgentprotoConfig,\n path?: string,\n): Promise<void> {\n const target = path ?? CONFIG_FILE_PATH()\n const payload = { ...next, version: CONFIG_VERSION }\n const dir = dirname(target)\n await fs.mkdir(dir, { recursive: true })\n const tmp = `${target}.tmp`\n await fs.writeFile(tmp, JSON.stringify(payload, null, 2) + \"\\n\", \"utf8\")\n await fs.rename(tmp, target)\n}\n\n/**\n * Read a dot-notation key (`daemon.port`) out of a config. Returns\n * `undefined` when any segment is missing.\n */\nexport function getConfigKey(\n cfg: AgentprotoConfig,\n dotted: string,\n): unknown {\n let cur: unknown = cfg\n for (const part of dotted.split(\".\")) {\n if (cur == null || typeof cur !== \"object\") return undefined\n cur = (cur as Record<string, unknown>)[part]\n }\n return cur\n}\n\n/**\n * Set a dot-notation key in a config. Returns a new object — does\n * NOT mutate. Creates intermediate objects as needed. Setting\n * `value: undefined` is treated as a delete.\n */\nexport function setConfigKey(\n cfg: AgentprotoConfig,\n dotted: string,\n value: unknown,\n): AgentprotoConfig {\n const parts = dotted.split(\".\")\n const out: AgentprotoConfig = { ...cfg }\n let cur: Record<string, unknown> = out as Record<string, unknown>\n for (let i = 0; i < parts.length - 1; i++) {\n const k = parts[i]!\n const next = cur[k]\n if (next && typeof next === \"object\" && !Array.isArray(next)) {\n cur[k] = { ...(next as Record<string, unknown>) }\n } else {\n cur[k] = {}\n }\n cur = cur[k] as Record<string, unknown>\n }\n const leaf = parts[parts.length - 1]!\n if (value === undefined) {\n delete cur[leaf]\n } else {\n cur[leaf] = value\n }\n return out\n}\n\n/**\n * Deep merge — objects are recursively combined, everything else\n * (arrays, primitives) is replaced wholesale by `b`. Mirrors what\n * `Object.assign({}, a, b)` does for shallow keys.\n */\nfunction deepMerge<A extends Record<string, unknown>, B extends Record<string, unknown>>(\n a: A,\n b: B,\n): A & B {\n const out: Record<string, unknown> = { ...a }\n for (const [k, v] of Object.entries(b)) {\n const cur = out[k]\n if (\n v &&\n typeof v === \"object\" &&\n !Array.isArray(v) &&\n cur &&\n typeof cur === \"object\" &&\n !Array.isArray(cur)\n ) {\n out[k] = deepMerge(\n cur as Record<string, unknown>,\n v as Record<string, unknown>,\n )\n } else {\n out[k] = v\n }\n }\n return out as A & B\n}\n","/**\n * `~/.agentproto/workspaces.json` — single source of truth for the\n * local agentproto control plane. Tracks which directories the user\n * has opted into as agentproto workspaces, plus which one is \"active\"\n * (the daemon's default working set when no workspace is named in\n * a tool call).\n *\n * Why a config file instead of recreating an MCP entry per workspace:\n * - One daemon = one MCP entry in the user's IDE (clean to read in\n * `claude mcp list`, no `dapper_willow` / `noble_lantern` spam).\n * - The daemon walks `workspaces[]` at boot and exposes them all;\n * tools that need a target take an optional `workspace` arg and\n * fall back to `active` when omitted.\n * - The CLI (`agentproto workspace add/list/remove/use`), the daemon,\n * and the guilde-web onboarding dialog all read+write the same\n * file, so changes from one surface are immediately visible to\n * the others.\n *\n * File layout is intentionally boring (small, hand-editable JSON) —\n * future fields go on top, never break v1 readers.\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { dirname, isAbsolute, resolve } from \"node:path\"\n\nexport const WORKSPACES_CONFIG_VERSION = 1 as const\n\nexport interface WorkspaceEntry {\n /** Stable handle — what tools accept as `workspace`. Lowercase\n * ASCII, hyphen-only. The CLI sanitises arbitrary names down to\n * this shape so paste-from-finder Just Works. */\n slug: string\n /** Absolute filesystem path. Required absolute so the daemon can\n * serve the workspace regardless of its own cwd. */\n path: string\n /** ISO-8601 — first time the entry was added. Pure metadata, no\n * behavioural impact. */\n addedAt: string\n /** Last time the entry was touched (renamed, path edited, used as\n * active). Lets the CLI sort by recency without an N+1 stat. */\n updatedAt: string\n /** Free-text label the user can attach so workspaces with similar\n * slugs stay distinguishable in `agentproto workspace list`. */\n label?: string\n}\n\nexport interface WorkspacesConfig {\n version: typeof WORKSPACES_CONFIG_VERSION\n /** Active workspace slug — daemon defaults to this when no\n * `workspace` arg is passed. May be undefined when no workspaces\n * are registered yet. */\n active?: string\n workspaces: WorkspaceEntry[]\n}\n\nexport const DEFAULT_CONFIG_DIR = (): string =>\n resolve(homedir(), \".agentproto\")\nexport const DEFAULT_CONFIG_PATH = (): string =>\n resolve(DEFAULT_CONFIG_DIR(), \"workspaces.json\")\n\n/** Reduce arbitrary user input to a safe slug. Aligns with what most\n * tooling validates against (`/^[a-z0-9][a-z0-9-]{0,63}$/`) so the\n * daemon never has to encode it for URLs or filesystem paths. */\nexport function sanitizeSlug(input: string): string {\n const trimmed = input.trim().toLowerCase()\n const cleaned = trimmed\n .replace(/[^a-z0-9_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 64)\n // Edge case: input was entirely non-conforming — fall back to a\n // generic so we never return an empty string.\n return cleaned || \"workspace\"\n}\n\n/** Read the config from disk. Returns an empty config (no workspaces,\n * no active) when the file is missing — this is the legitimate\n * first-boot state, not an error. */\nexport async function loadWorkspacesConfig(\n path: string = DEFAULT_CONFIG_PATH()\n): Promise<WorkspacesConfig> {\n let raw: string\n try {\n raw = await fs.readFile(path, \"utf8\")\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return { version: WORKSPACES_CONFIG_VERSION, workspaces: [] }\n }\n throw err\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (err) {\n throw new Error(\n `agentproto: ${path} is not valid JSON (${\n err instanceof Error ? err.message : String(err)\n }). Delete the file or fix it manually.`\n )\n }\n return normalizeConfig(parsed)\n}\n\n/** Write the config back. Creates the parent directory if missing.\n * Atomic-ish: writes to a temp file first, then renames over the\n * target — avoids the partial-write window where a concurrent reader\n * sees half a JSON object. */\nexport async function saveWorkspacesConfig(\n config: WorkspacesConfig,\n path: string = DEFAULT_CONFIG_PATH()\n): Promise<void> {\n const normalized = normalizeConfig(config)\n await fs.mkdir(dirname(path), { recursive: true })\n const tmp = `${path}.tmp.${process.pid}`\n await fs.writeFile(tmp, JSON.stringify(normalized, null, 2) + \"\\n\", \"utf8\")\n await fs.rename(tmp, path)\n}\n\n/**\n * Pure helpers — caller manages persistence. Returns a NEW config\n * (never mutates) so callers can compose multiple updates before\n * a single save.\n */\nexport function addWorkspace(\n config: WorkspacesConfig,\n input: { slug: string; path: string; label?: string }\n): WorkspacesConfig {\n if (!isAbsolute(input.path)) {\n throw new Error(\n `addWorkspace: path must be absolute, got \"${input.path}\".`\n )\n }\n const slug = sanitizeSlug(input.slug)\n const now = new Date().toISOString()\n const existingIdx = config.workspaces.findIndex(w => w.slug === slug)\n const next: WorkspaceEntry = existingIdx >= 0\n ? {\n ...config.workspaces[existingIdx]!,\n path: input.path,\n ...(input.label !== undefined ? { label: input.label } : {}),\n updatedAt: now,\n }\n : {\n slug,\n path: input.path,\n ...(input.label ? { label: input.label } : {}),\n addedAt: now,\n updatedAt: now,\n }\n const workspaces = [...config.workspaces]\n if (existingIdx >= 0) workspaces[existingIdx] = next\n else workspaces.push(next)\n // First-add becomes active automatically — saves the user a\n // separate `workspace use` call right after a fresh `add`.\n const active = config.active ?? slug\n return { ...config, workspaces, active }\n}\n\nexport function removeWorkspace(\n config: WorkspacesConfig,\n slug: string\n): WorkspacesConfig {\n const sanitised = sanitizeSlug(slug)\n const workspaces = config.workspaces.filter(w => w.slug !== sanitised)\n // If the removed workspace was active, hand off to whatever's\n // first — predictable and avoids leaving the daemon in an\n // unreachable state when the user removes the only one.\n let active = config.active\n if (active === sanitised) {\n active = workspaces[0]?.slug\n }\n const next: WorkspacesConfig = { ...config, workspaces }\n if (active !== undefined) next.active = active\n else delete next.active\n return next\n}\n\nexport function setActiveWorkspace(\n config: WorkspacesConfig,\n slug: string\n): WorkspacesConfig {\n const sanitised = sanitizeSlug(slug)\n if (!config.workspaces.some(w => w.slug === sanitised)) {\n throw new Error(\n `setActiveWorkspace: no workspace registered with slug \"${sanitised}\". ` +\n `Run \\`agentproto workspace add <path> --slug ${sanitised}\\` first.`\n )\n }\n return { ...config, active: sanitised }\n}\n\nexport function findWorkspace(\n config: WorkspacesConfig,\n slug: string\n): WorkspaceEntry | undefined {\n return config.workspaces.find(w => w.slug === sanitizeSlug(slug))\n}\n\n/** The active workspace, or undefined when none is registered. Pure\n * convenience to avoid re-implementing the lookup at every caller. */\nexport function getActiveWorkspace(\n config: WorkspacesConfig\n): WorkspaceEntry | undefined {\n if (!config.active) return config.workspaces[0]\n return findWorkspace(config, config.active) ?? config.workspaces[0]\n}\n\n/**\n * Coerce arbitrary parsed JSON into a valid config. Skips entries\n * with missing required fields rather than throwing — partial recovery\n * is friendlier than \"your config file is corrupted, here's a stack\n * trace\". Logs nothing here; the CLI shells that consume this should\n * decide whether to surface a warning.\n */\nfunction normalizeConfig(parsed: unknown): WorkspacesConfig {\n if (!parsed || typeof parsed !== \"object\") {\n return { version: WORKSPACES_CONFIG_VERSION, workspaces: [] }\n }\n const obj = parsed as Record<string, unknown>\n const workspaces: WorkspaceEntry[] = []\n if (Array.isArray(obj.workspaces)) {\n for (const entry of obj.workspaces) {\n if (!entry || typeof entry !== \"object\") continue\n const e = entry as Record<string, unknown>\n const slug = typeof e.slug === \"string\" ? sanitizeSlug(e.slug) : \"\"\n const path = typeof e.path === \"string\" ? e.path : \"\"\n if (!slug || !path) continue\n const addedAt =\n typeof e.addedAt === \"string\" ? e.addedAt : new Date().toISOString()\n const updatedAt = typeof e.updatedAt === \"string\" ? e.updatedAt : addedAt\n const we: WorkspaceEntry = { slug, path, addedAt, updatedAt }\n if (typeof e.label === \"string\" && e.label.trim()) {\n we.label = e.label.trim()\n }\n workspaces.push(we)\n }\n }\n // De-dupe by slug (last wins) — the file is hand-editable so a\n // typo could have produced two entries with the same slug.\n const dedup = new Map<string, WorkspaceEntry>()\n for (const w of workspaces) dedup.set(w.slug, w)\n const finalList = Array.from(dedup.values())\n const active =\n typeof obj.active === \"string\" && finalList.some(w => w.slug === obj.active)\n ? (obj.active as string)\n : finalList[0]?.slug\n const out: WorkspacesConfig = {\n version: WORKSPACES_CONFIG_VERSION,\n workspaces: finalList,\n }\n if (active !== undefined) out.active = active\n return out\n}\n","/**\n * `~/.agentproto/imported-mcps.json` — the user's curated set of\n * discovered MCPs they want the daemon to know about. v1 is just\n * persistence + read-side; the actual MCP-proxy implementation\n * (where the daemon's /mcp endpoint aggregates the imported\n * servers' tools under namespace prefixes) is v2 work.\n *\n * Purpose: today, \"I see you have chrome-devtools in claude\" is\n * read-only. Once a user imports it, the operator agent can refer\n * to it (\"the user said it's enabled — call it\") and a future\n * proxy layer can actually expose it. We persist the choice now so\n * the data is in place when the proxy lands.\n *\n * File shape:\n * {\n * \"version\": 1,\n * \"imports\": [\n * {\n * \"id\": \"claude-code:project:/path:chrome-devtools\",\n * \"alias\": \"chrome-devtools\",\n * \"addedAt\": \"2026-05-10T...\",\n * \"snapshot\": { ...the DiscoveredMcp at import time }\n * }\n * ]\n * }\n *\n * Snapshotting at import time keeps the daemon resilient to the\n * source config getting deleted (user runs `claude mcp remove ...`).\n * The imported entry stays usable; only the next discovery pass\n * stops listing it as \"available to import.\"\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { dirname, resolve as resolvePath } from \"node:path\"\nimport type { DiscoveredMcp } from \"./mcp-discovery.js\"\n\nexport const IMPORTED_MCPS_PATH = (): string =>\n resolvePath(homedir(), \".agentproto\", \"imported-mcps.json\")\n\nexport const IMPORTED_MCPS_VERSION = 1 as const\n\nexport interface ImportedMcpEntry {\n id: string\n alias: string\n addedAt: string\n snapshot: DiscoveredMcp\n}\n\nexport interface ImportedMcpsConfig {\n version: typeof IMPORTED_MCPS_VERSION\n imports: ImportedMcpEntry[]\n}\n\nconst EMPTY: ImportedMcpsConfig = {\n version: IMPORTED_MCPS_VERSION,\n imports: [],\n}\n\nexport async function loadImportedMcps(\n path: string = IMPORTED_MCPS_PATH()\n): Promise<ImportedMcpsConfig> {\n let raw: string\n try {\n raw = await fs.readFile(path, \"utf8\")\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return EMPTY\n throw err\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (err) {\n throw new Error(\n `agentproto: ${path} is not valid JSON (${\n err instanceof Error ? err.message : String(err)\n }). Delete or fix manually.`\n )\n }\n return normalize(parsed)\n}\n\nexport async function saveImportedMcps(\n config: ImportedMcpsConfig,\n path: string = IMPORTED_MCPS_PATH()\n): Promise<void> {\n await fs.mkdir(dirname(path), { recursive: true })\n const tmp = `${path}.tmp.${process.pid}`\n await fs.writeFile(tmp, JSON.stringify(config, null, 2) + \"\\n\", \"utf8\")\n await fs.rename(tmp, path)\n}\n\n/**\n * Add (or replace) an import. Snapshots the discovered MCP at\n * import time so the entry stays usable when the source config\n * disappears.\n */\nexport function addImport(\n config: ImportedMcpsConfig,\n input: { snapshot: DiscoveredMcp; alias?: string }\n): ImportedMcpsConfig {\n const alias = (input.alias ?? input.snapshot.name).trim()\n if (!alias) {\n throw new Error(\"addImport: alias resolves to empty string\")\n }\n const addedAt = new Date().toISOString()\n const next: ImportedMcpEntry = {\n id: input.snapshot.id,\n alias,\n addedAt,\n snapshot: input.snapshot,\n }\n const others = config.imports.filter(e => e.id !== input.snapshot.id)\n return { ...config, imports: [...others, next] }\n}\n\nexport function removeImport(\n config: ImportedMcpsConfig,\n id: string\n): ImportedMcpsConfig {\n return { ...config, imports: config.imports.filter(e => e.id !== id) }\n}\n\nexport function findImport(\n config: ImportedMcpsConfig,\n id: string\n): ImportedMcpEntry | undefined {\n return config.imports.find(e => e.id === id)\n}\n\nfunction normalize(parsed: unknown): ImportedMcpsConfig {\n if (!parsed || typeof parsed !== \"object\") return EMPTY\n const obj = parsed as Record<string, unknown>\n const imports: ImportedMcpEntry[] = []\n if (Array.isArray(obj.imports)) {\n for (const entry of obj.imports) {\n if (!entry || typeof entry !== \"object\") continue\n const e = entry as Record<string, unknown>\n const id = typeof e.id === \"string\" ? e.id : \"\"\n const alias = typeof e.alias === \"string\" ? e.alias : id\n const addedAt =\n typeof e.addedAt === \"string\" ? e.addedAt : new Date().toISOString()\n const snapshot = e.snapshot as DiscoveredMcp | undefined\n if (!id || !snapshot) continue\n imports.push({ id, alias, addedAt, snapshot })\n }\n }\n return { version: IMPORTED_MCPS_VERSION, imports }\n}\n","/**\n * @agentproto/define-doctype — meta-factory for AIP `defineX` constructors.\n *\n * Every AIP that defines a markdown-with-frontmatter doctype ships a\n * `defineX(definition)` constructor (`defineTool` for AIP-14, `defineDriver`\n * for AIP-30, future `defineSkill` / `defineKnowledge` / …). Those\n * constructors share a small invariant prologue: validate the `id`\n * against a regex, validate `description` length, throw with a canonical\n * error prefix, freeze the returned handle.\n *\n * `createDoctype` lifts that prologue to one place. Each per-AIP\n * package supplies the spec-specific bits via `validate(def)` and\n * `build(def)`; the factory wires them together with the shared rules.\n *\n * Recommended scaffold for new AIPs (referenced from AIP-1).\n */\n\n/**\n * Default shape every AIP definition is assumed to satisfy when no\n * custom `readIdentity` / `readDescription` extractors are passed.\n *\n * Most AIPs (AIP-14 TOOL, AIP-30 DRIVER, AIP-3 SKILL, …) carry\n * `id` + `description`. AIPs that depart from this convention (e.g.\n * AIP-7 POLICY uses `slug` + `name`, with `description` optional)\n * supply their own extractors via `DoctypeOptions`.\n */\nexport interface DoctypeDefinitionBase {\n id: string\n description: string\n}\n\nexport interface DoctypeOptions<TDef, THandle> {\n /**\n * AIP number — surfaces in error messages so a thrown stack frame\n * inside a framework adapter still tells you which spec rejected\n * the definition.\n */\n aip: number\n /**\n * Doctype name (lower-case singular). Used to build the error\n * prefix: `name = \"tool\"` → \"defineTool: …\".\n */\n name: string\n /**\n * Extract the identity string (kebab-id, slug, …) to validate against\n * `idPattern`. Default: `(def) => (def as { id: string }).id` —\n * works for any AIP whose definition has an `id` field. AIPs whose\n * identity field has a different name (e.g. AIP-7 POLICY's `slug`)\n * supply their own reader.\n */\n readIdentity?: (def: TDef) => string\n /**\n * Override the default identity pattern. Default:\n * `/^[a-z0-9][a-z0-9._-]{1,79}$/` — kebab/snake/dot separated,\n * 2-80 chars, leading alphanumeric. AIPs with stricter rules\n * (AIP-7 POLICY uses `^[a-z0-9][a-z0-9-]*$`, no dots) override.\n */\n idPattern?: RegExp\n /**\n * Extract the LLM-facing prose used by the length check. Default:\n * `(def) => (def as { description: string }).description`. Pass\n * `false` to skip the length validation (e.g. AIPs where\n * description is optional, or where the human-readable string lives\n * in a different field).\n */\n readDescription?: ((def: TDef) => string | undefined) | false\n /**\n * Override the maximum prose length. Default 2000. AIPs whose\n * doctypes carry longer normative text on the doctype itself can\n * raise this; most should keep the default for prompt-injection\n * resistance.\n */\n maxDescriptionLen?: number\n /**\n * Spec-specific validations that run AFTER the default id and\n * description checks. Throw on failure. Stays out of `build()` so\n * the build path can assume a validated definition.\n */\n validate?: (def: TDef) => void\n /**\n * Build the immutable handle from a validated definition. Apply\n * defaults, freeze nested arrays/objects per the spec's freezing\n * rules, return the handle. The factory takes care of the\n * top-level `Object.freeze`.\n */\n build: (def: TDef) => THandle\n}\n\nconst DEFAULT_ID_PATTERN = /^[a-z0-9][a-z0-9._-]{1,79}$/\nconst MAX_DESCRIPTION_LEN = 2000\n\n/**\n * Build a `defineX(definition)` constructor that enforces the\n * cross-AIP invariants and delegates spec-specific behaviour to\n * `validate` / `build`.\n *\n * Usage (from `@agentproto/tool/src/define-tool.ts`):\n *\n * export const defineTool = createDoctype<ToolDefinition, ToolHandle>({\n * aip: 14,\n * name: \"tool\",\n * validate(def) { ...spec-14 checks... },\n * build(def) { ...defaulting + nested freezing... },\n * })\n */\nexport function createDoctype<TDef, THandle>(\n opts: DoctypeOptions<TDef, THandle>,\n): (def: TDef) => THandle {\n const idPattern = opts.idPattern ?? DEFAULT_ID_PATTERN\n const readIdentity =\n opts.readIdentity ?? ((def: TDef) => (def as { id: string }).id)\n const readDescription =\n opts.readDescription === false\n ? null\n : (opts.readDescription ??\n ((def: TDef) => (def as { description: string }).description))\n const maxLen = opts.maxDescriptionLen ?? MAX_DESCRIPTION_LEN\n const prefix = `define${capitalize(opts.name)}`\n const aipTag = `(AIP-${opts.aip})`\n\n return function constructDoctype(def: TDef): THandle {\n const identity = readIdentity(def)\n if (typeof identity !== \"string\" || !idPattern.test(identity)) {\n throw new Error(\n `${prefix} ${aipTag}: invalid id '${String(\n identity,\n )}' — must match ${idPattern}`,\n )\n }\n if (readDescription) {\n const description = readDescription(def)\n if (\n typeof description !== \"string\" ||\n description.length === 0 ||\n description.length > maxLen\n ) {\n throw new Error(\n `${prefix} ${aipTag}: id='${identity}' description must be 1–${maxLen} chars`,\n )\n }\n }\n opts.validate?.(def)\n return Object.freeze(opts.build(def)) as THandle\n }\n}\n\nfunction capitalize(s: string): string {\n return s.length === 0 ? s : s.charAt(0).toUpperCase() + s.slice(1)\n}\n\nexport const DOCTYPE_DEFAULT_ID_PATTERN = DEFAULT_ID_PATTERN\nexport const DOCTYPE_MAX_DESCRIPTION_LEN = MAX_DESCRIPTION_LEN\n\n/**\n * Filter a value to its YAML-serialisable subset:\n * - functions removed (e.g. driver `execute[id]: ExecuteFn`)\n * - zod schemas removed (e.g. tool `inputSchema`, `outputSchema`,\n * `contextSchema` — they live in TS, not in frontmatter)\n * - `undefined` values dropped from objects (so the YAML output\n * doesn't carry empty keys; `null` is preserved as a real value)\n *\n * Used by per-AIP `createX(params, opts)` to project a validated\n * definition into a manifest-shaped object before writing to disk.\n * Pure function; no I/O.\n */\nexport function filterSerializable(value: unknown): unknown {\n if (value === null || value === undefined) return value\n if (typeof value === \"function\") return undefined\n if (\n typeof value === \"object\" &&\n value !== null &&\n Object.prototype.hasOwnProperty.call(value, \"_def\") &&\n \"parse\" in value &&\n typeof (value as { parse?: unknown }).parse === \"function\"\n ) {\n return undefined\n }\n if (Array.isArray(value)) {\n return value.map(filterSerializable).filter((v) => v !== undefined)\n }\n if (typeof value === \"object\") {\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n const filtered = filterSerializable(v)\n if (filtered !== undefined) out[k] = filtered\n }\n return out\n }\n return value\n}\n","/**\n * @agentproto/manifest — generic verbs for AIP doctypes.\n *\n * Every per-AIP package (`@agentproto/tool`, `@agentproto/driver`, …)\n * supplies a `DoctypeSpec` describing the per-package knobs (name,\n * AIP number, schema literal, path convention, validator, parser).\n * `createVerbs(spec)` returns the full lifecycle:\n *\n * create(params, opts) params → .md on disk\n * load(path) .md on disk → handle\n * list(dir, filter?) walk → handle[]\n * update(path, mutator) load → patch → write back\n * resolve(block, ctx?) { inline | ref | file } → handle\n * delete(path) fs.unlink\n *\n * Adding a new verb is a single place; every package picks it up\n * automatically — same model as `createDoctype` for the validation\n * pipeline.\n */\n\nimport { filterSerializable } from \"@agentproto/define-doctype\"\nimport matter from \"gray-matter\"\nimport type { Dirent } from \"node:fs\"\nimport { access, copyFile, mkdir, readFile, readdir, rename, rm, writeFile } from \"node:fs/promises\"\nimport { dirname, isAbsolute, join } from \"node:path\"\nimport { randomBytes } from \"node:crypto\"\n\n/**\n * Per-package descriptor consumed by `createVerbs`.\n *\n * Generic over the params shape (input to `define`) and the handle\n * shape (output of `define`). For most AIPs `THandle` extends\n * `TParams` — handles are just frozen, defaulted definitions.\n */\nexport interface DoctypeSpec<\n TParams extends { id?: string; slug?: string; name?: string },\n THandle,\n> {\n /** Lower-case singular: \"tool\", \"driver\", \"operator\". Used in errors. */\n name: string\n /** AIP number — surfaces in error messages for provenance. */\n aip: number\n /** Frontmatter `schema:` literal (e.g. \"agentproto/tool/v1\"). */\n schemaLiteral: string\n /**\n * Filename of the doctype's manifest. By default `<DOCTYPE>.md`,\n * derived from `name.toUpperCase()`. Override only when the\n * doctype's filename diverges from convention.\n */\n filename?: string\n /**\n * Path-of-handle convention. Given a validated handle, return the\n * workspace-relative path the manifest lives at. Examples:\n * tool: `(h) => `${h.id}/TOOL.md``\n * policy: `(h) => `policies/${h.slug}/POLICY.md``\n * operator: `(h) => `${h.id}/OPERATOR.md``\n */\n pathOf(handle: THandle): string\n /** TS authoring path: validates params + applies defaults. */\n define(params: TParams): THandle\n /** MD authoring path: parses YAML+body. Throws on invalid frontmatter. */\n parse(source: string): { frontmatter: Record<string, unknown>; body: string }\n /**\n * Optional projection: handle → manifest-shaped frontmatter object.\n * Default: pass the params through `filterSerializable` (drops zod\n * schemas + functions). Override when the handle and frontmatter\n * shapes diverge non-trivially.\n */\n toFrontmatter?(params: TParams): Record<string, unknown>\n}\n\nexport interface CreateOptions {\n /** Workspace-relative or absolute base directory. */\n dir: string\n /** Body markdown after the frontmatter. Defaults to a one-line stub. */\n body?: string\n /** Render only — don't write. Returns the rendered string. */\n dryRun?: boolean\n}\n\nexport interface VerbResult<THandle> {\n path: string\n handle: THandle\n rendered: string\n}\n\nexport interface ListOptions {\n /** Filter the discovered handles. Receives the loaded handle. */\n filter?: <H>(handle: H) => boolean\n /** Skip subdirectories matching these names. Default: [\"node_modules\", \".git\", \"dist\", \".next\"]. */\n skipDirs?: readonly string[]\n}\n\nexport type RefBlock<TParams> =\n | { inline: TParams }\n | { ref: string }\n | { file: string }\n\nexport interface ResolveContext {\n /** Base dir for `file:` references. Required when resolving file blocks. */\n baseDir?: string\n /**\n * Registry resolver for `ref:` strings (e.g. `@agentik/runners/python-3.12`\n * → handle). Optional; throws when an unresolvable ref is encountered.\n */\n resolveRef?: (ref: string) => Promise<unknown> | unknown\n}\n\nexport interface Verbs<TParams, THandle> {\n /** TS-authored params → write `<dir>/<pathOf(handle)>` on disk. */\n create(params: TParams, opts: CreateOptions): Promise<VerbResult<THandle>>\n /** Read a manifest from disk → handle. */\n load(path: string): Promise<{ path: string; handle: THandle; body: string }>\n /** Walk `dir` for the doctype's `*.md` files; return loaded handles. */\n list(dir: string, opts?: ListOptions): Promise<THandle[]>\n /** Load → mutate → write back. Mutator receives the loaded params. */\n update(\n path: string,\n mutator: (params: TParams, ctx: { handle: THandle; body: string }) => TParams | Promise<TParams>,\n opts?: { body?: string; dryRun?: boolean },\n ): Promise<VerbResult<THandle>>\n /**\n * Resolve a `{ inline | ref | file }` block to a handle. Used by\n * doctypes that compose other doctypes (AIP-17/30/36 pattern).\n */\n resolve(\n block: RefBlock<TParams>,\n ctx?: ResolveContext,\n ): Promise<THandle>\n /** Remove the manifest file. Does NOT recurse into the containing dir. */\n delete(path: string): Promise<void>\n}\n\nconst DEFAULT_SKIP_DIRS: readonly string[] = [\n \"node_modules\",\n \".git\",\n \"dist\",\n \".next\",\n \".turbo\",\n]\n\nexport function createVerbs<\n TParams extends { id?: string; slug?: string; name?: string },\n THandle,\n>(spec: DoctypeSpec<TParams, THandle>): Verbs<TParams, THandle> {\n const filename = spec.filename ?? `${spec.name.toUpperCase()}.md`\n const toFrontmatter =\n spec.toFrontmatter ??\n ((params: TParams) =>\n filterSerializable({\n schema: spec.schemaLiteral,\n ...params,\n }) as Record<string, unknown>)\n\n async function create(\n params: TParams,\n opts: CreateOptions,\n ): Promise<VerbResult<THandle>> {\n const handle = spec.define(params)\n const relativePath = spec.pathOf(handle)\n const path = join(opts.dir, relativePath)\n const frontmatter = toFrontmatter(params)\n const rendered = matter.stringify(\n opts.body ?? defaultBody(spec, frontmatter),\n frontmatter,\n )\n if (!opts.dryRun) {\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, rendered, \"utf8\")\n }\n return { path, handle, rendered }\n }\n\n async function load(\n path: string,\n ): Promise<{ path: string; handle: THandle; body: string }> {\n const source = await readFile(path, \"utf8\")\n const { frontmatter, body } = spec.parse(source)\n // The frontmatter is already zod-validated by `parse` (each per-\n // package parser runs the schema). Cast through `define` so the\n // cross-AIP invariants run too — same path the TS authoring uses.\n const handle = spec.define(frontmatter as unknown as TParams)\n return { path, handle, body }\n }\n\n async function list(\n dir: string,\n opts: ListOptions = {},\n ): Promise<THandle[]> {\n const skip = new Set(opts.skipDirs ?? DEFAULT_SKIP_DIRS)\n const out: THandle[] = []\n\n async function walk(current: string): Promise<void> {\n // The Dirent overload returns `Dirent<NonSharedBuffer>[]` in\n // Node 22+'s @types/node when called with non-string buffer\n // input. Coerce by typing the entries as `Dirent[]` (string\n // names by default) since we always pass a string path.\n let entries: Dirent[]\n try {\n entries = (await readdir(current, { withFileTypes: true })) as Dirent[]\n } catch {\n return\n }\n for (const entry of entries) {\n const entryName = String(entry.name)\n if (entry.isDirectory()) {\n if (skip.has(entryName)) continue\n await walk(join(current, entryName))\n continue\n }\n if (!entry.isFile()) continue\n if (entryName !== filename) continue\n try {\n const { handle } = await load(join(current, entryName))\n if (!opts.filter || opts.filter(handle)) out.push(handle)\n } catch {\n // Malformed manifests skip the list — `load` will throw the\n // useful diagnostic when a caller wants to see it.\n }\n }\n }\n\n await walk(dir)\n return out\n }\n\n async function update(\n path: string,\n mutator: (\n params: TParams,\n ctx: { handle: THandle; body: string },\n ) => TParams | Promise<TParams>,\n opts: { body?: string; dryRun?: boolean } = {},\n ): Promise<VerbResult<THandle>> {\n const { handle, body } = await load(path)\n // Reconstruct params from the frontmatter — the load path already\n // validated, so this is just a reverse projection.\n const source = await readFile(path, \"utf8\")\n const { frontmatter } = spec.parse(source)\n const params = frontmatter as unknown as TParams\n const mutated = await mutator(params, { handle, body })\n const newHandle = spec.define(mutated)\n const newFrontmatter = toFrontmatter(mutated)\n const rendered = matter.stringify(\n opts.body ?? body,\n newFrontmatter,\n )\n if (!opts.dryRun) {\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, rendered, \"utf8\")\n }\n return { path, handle: newHandle, rendered }\n }\n\n async function resolve(\n block: RefBlock<TParams>,\n ctx: ResolveContext = {},\n ): Promise<THandle> {\n if (\"inline\" in block) {\n return spec.define(block.inline)\n }\n if (\"file\" in block) {\n const baseDir = ctx.baseDir ?? \".\"\n const path = isAbsolute(block.file) ? block.file : join(baseDir, block.file)\n const { handle } = await load(path)\n return handle\n }\n if (\"ref\" in block) {\n if (!ctx.resolveRef) {\n throw new Error(\n `${spec.name}.resolve (AIP-${spec.aip}): block has \\`ref: '${block.ref}'\\` but no resolveRef provided in context — registries must inject their own resolver`,\n )\n }\n const resolved = await ctx.resolveRef(block.ref)\n return spec.define(resolved as TParams)\n }\n throw new Error(\n `${spec.name}.resolve (AIP-${spec.aip}): block must have one of inline | ref | file`,\n )\n }\n\n async function deleteFn(path: string): Promise<void> {\n await rm(path, { force: true })\n }\n\n return { create, load, list, update, resolve, delete: deleteFn }\n}\n\n/**\n * A render-and-validate thunk for use with {@link updateManifestSet}.\n *\n * Wrap an existing verb call with `dryRun: true` so that validation and\n * rendering happen without touching disk. `updateManifestSet` calls the thunk\n * in its phase-1 pass; if it throws the entire operation is aborted before\n * any file is written.\n *\n * @example\n * ```ts\n * const ops: ManifestOp[] = [\n * () => toolVerbs.create(toolParams, { dir, dryRun: true }),\n * () => agentVerbs.update(agentPath, mutator, { dryRun: true }),\n * ]\n * await updateManifestSet(ops)\n * ```\n */\nexport type ManifestOp = () => Promise<{ path: string; rendered: string }>\n\nexport interface ManifestSetOptions {\n /**\n * If true, copy each existing target to `<path>.bak` before the commit\n * (rename) phase. The backup is created before any rename so the original\n * content survives a partial failure. Backup files are never removed on\n * error — the caller can inspect them for recovery.\n */\n backup?: boolean\n}\n\n/**\n * Write multiple manifests as a best-effort atomic set.\n *\n * ## Sequence\n * 1. **Render + validate** — call every `op()` thunk concurrently. Any\n * validation error aborts here; nothing is written.\n * 2. **Stage** — write each rendered string to a sibling temp file\n * `<path>.tmp-<hex>` in the same directory.\n * 3. **Backup** *(optional)* — if `opts.backup`, copy each existing target to\n * `<path>.bak`.\n * 4. **Commit** — `rename(tmp, target)` for each file sequentially.\n *\n * ## Atomicity guarantee (honest)\n * Each individual `rename()` is atomic on POSIX (same-device, same-dir swap).\n * The **sequence** of renames is NOT globally atomic. A process crash between\n * two renames leaves some targets at their new content and others unchanged —\n * there is no cross-file rollback. This is an inherent POSIX limitation;\n * true multi-file atomicity requires a WAL or journal outside this package.\n *\n * ## Error handling\n * On any error in the stage or commit phase all remaining `.tmp-*` temp files\n * are removed before rethrowing. Targets that were already committed in the\n * same run are **not** rolled back — they hold their new content. Targets not\n * yet reached remain unchanged.\n */\nexport async function updateManifestSet(\n ops: ManifestOp[],\n opts: ManifestSetOptions = {},\n): Promise<Array<{ path: string; rendered: string }>> {\n // Phase 1: Render + validate all ops. Fail early; nothing written yet.\n const results = await Promise.all(ops.map((op) => op()))\n\n const suffix = randomBytes(4).toString(\"hex\")\n // Mirrors `results` index-for-index. Empty string = not yet staged (skip cleanup).\n const tmps: string[] = new Array(results.length).fill(\"\")\n\n try {\n // Phase 2: Stage — write each to a sibling .tmp file.\n // entries() yields [index, element] with element fully typed (no undefined).\n for (const [i, { path, rendered }] of results.entries()) {\n const tmp = `${path}.tmp-${suffix}`\n await mkdir(dirname(path), { recursive: true })\n await writeFile(tmp, rendered, \"utf8\")\n tmps[i] = tmp\n }\n\n // Phase 3: Backup (optional) — copy existing targets before rename.\n if (opts.backup) {\n for (const { path } of results) {\n try {\n await access(path)\n await copyFile(path, `${path}.bak`)\n } catch {\n // File doesn't exist yet — no backup needed.\n }\n }\n }\n\n // Phase 4: Commit — atomic rename of each staged tmp → target.\n // Each rename() is individually atomic (POSIX same-device).\n // The loop is NOT globally atomic; see the doc-comment above.\n for (const [i, { path }] of results.entries()) {\n // tmps[i] is guaranteed non-null: same length as results, set in phase 2.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n await rename(tmps[i]!, path)\n tmps[i] = \"\" // Committed; exclude from cleanup if a later rename fails.\n }\n } catch (err) {\n // Remove staged .tmp files that were not yet committed.\n await Promise.allSettled(\n tmps.filter(Boolean).map((t) => rm(t, { force: true })),\n )\n throw err\n }\n\n return results\n}\n\nfunction defaultBody<P, H>(\n spec: DoctypeSpec<P extends { id?: string; slug?: string; name?: string } ? P : never, H>,\n frontmatter: Record<string, unknown>,\n): string {\n const id =\n typeof frontmatter.name === \"string\"\n ? frontmatter.name\n : typeof frontmatter.id === \"string\"\n ? frontmatter.id\n : typeof frontmatter.slug === \"string\"\n ? frontmatter.slug\n : spec.name\n return `# ${id}\\n`\n}\n\n","/**\n * AIP-40 EXTENSION.md frontmatter zod schema.\n *\n * Generated from `resources/aip-40/draft/EXTENSION.schema.json` via\n * json-schema-to-zod. Imported by both `define-extension.ts` (TS path\n * validation) and `manifest/index.ts` (.md path validation) so every\n * field-level constraint runs in both authoring paths from a single\n * source of truth — re-run scaffold-aip to refresh after spec changes.\n *\n * Cross-field rules (if/then/allOf in JSON Schema) don't translate\n * cleanly and live in `define-extension.ts`'s `validate(def)` instead.\n */\n\nimport { z } from \"zod\"\n\nexport const extensionFrontmatterSchema = z.object({ \"schema\": z.literal(\"agentproto/extension/v1\").describe(\"Pins the spec version this manifest conforms to.\"), \"slug\": z.string().regex(new RegExp(\"^[a-z][a-z0-9-]*:[a-z][a-z0-9-]*[a-z0-9]$\")).describe(\"Namespaced identifier — `<namespace>:<name>`. Lowercase, digits, dashes; single colon separator. Example: `acme:deal`.\"), \"title\": z.string().min(1).max(80).describe(\"Human-readable display name.\"), \"description\": z.string().min(1).max(2000).describe(\"One-paragraph statement of the extension's purpose.\"), \"version\": z.string().regex(new RegExp(\"^\\\\d+\\\\.\\\\d+\\\\.\\\\d+(?:[-+][a-zA-Z0-9.-]+)?$\")).describe(\"Extension's own semver. Bump on breaking change.\"), \"status\": z.literal(\"Local\").describe(\"Extensions are perpetually Local — they never enter the public registry's Draft/Review/Final lifecycle.\"), \"extends\": z.union([z.string().regex(new RegExp(\"^aip-\\\\d+$\")).describe(\"Inherit a public AIP's schema (e.g. `aip-14`).\"), z.literal(\"none\").describe(\"Brand-new doctype, no inheritance.\")]).describe(\"Parent AIP this extension inherits from, or `none` for a root doctype.\"), \"add_fields\": z.object({ \"properties\": z.record(z.string(), z.any()).describe(\"JSON Schema property definitions to merge into the parent's properties. Collisions are an error — use `tighten` to narrow an existing field.\").optional(), \"required\": z.array(z.string()).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), { message: \"All items must be unique!\" }).describe(\"Field names that become required in addition to parent's required[]. Unioned with parent's required, never replaces.\").default([] as never) }).strict().describe(\"Schema-level additions: new properties + new required entries.\").optional(), \"tighten\": z.record(z.string(), z.object({ \"pattern\": z.string().optional(), \"enum\": z.array(z.any()).optional(), \"minLength\": z.number().int().gte(0).optional(), \"maxLength\": z.number().int().gte(0).optional(), \"minimum\": z.number().optional(), \"maximum\": z.number().optional() }).strict()).describe(\"Per-field constraint overrides. Each entry MUST tighten (not loosen) the parent's constraints; runtimes verify monotonicity at registration.\").optional(), \"defaults\": z.record(z.string(), z.any()).describe(\"Default values applied when a field is omitted. Layered on top of parent's defaults; extension's value wins on the same key.\").optional(), \"path_convention\": z.string().min(1).describe(\"Filesystem convention template, e.g. `\\\"deals/<slug>/DEAL.md\\\"`. Tokens: `<slug>` (doctype identity), `<DOCTYPE>` (extension's slug name part). Falls back to parent's convention when omitted.\").optional(), \"requires\": z.array(z.number().int().gte(1)).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), { message: \"All items must be unique!\" }).describe(\"Public AIPs the extension depends on, in addition to its parent.\").default([] as never), \"metadata\": z.record(z.string(), z.any()).describe(\"Free-form vendor extensions under namespaced keys (`metadata.<vendor>.<field>`).\").default({} as never) }).strict().describe(\"Validates the YAML frontmatter portion of an AIP-40 EXTENSION.md manifest. An extension declares a workspace-local doctype that inherits a public AIP's schema and may add fields, tighten constraints, set defaults, and override the path convention.\")\n\nexport type ExtensionFrontmatter = z.infer<typeof extensionFrontmatterSchema>\n","import { createDoctype } from \"@agentproto/define-doctype\"\nimport { extensionFrontmatterSchema } from \"./schema.js\"\nimport type { ExtensionDefinition, ExtensionHandle } from \"./types.js\"\n\n/**\n * AIP-40 reference implementation of `defineExtension`.\n *\n * Built on `createDoctype` so the cross-AIP invariants (id pattern,\n * description length, top-level freeze, \"defineExtension (AIP-40): …\"\n * error prefix) run uniformly with every other AIP defineX.\n *\n * Field-level validation runs the schema-derived zod from\n * `./schema.ts` against the input. Same source of truth as the .md\n * path uses (`parseExtensionManifest`), so a malformed TS-authored\n * definition fails with the same diagnostic as a malformed manifest.\n * Cross-field rules go in `validate(def)` after the zod check.\n *\n * Identity / description extractors detected from the JSON Schema:\n * readIdentity: def.slug\n * readDescription: def.description.\n */\nexport const defineExtension = createDoctype<ExtensionDefinition, ExtensionHandle>({\n aip: 40,\n name: \"extension\",\n // Extension slugs are namespaced: `<namespace>:<name>` (e.g.\n // `acme:deal`). Override the default kebab-only pattern.\n idPattern: /^[a-z][a-z0-9-]*:[a-z][a-z0-9-]*[a-z0-9]$/,\n readIdentity: (def) => def.slug,\n validate(def) {\n const result = extensionFrontmatterSchema.safeParse(def)\n if (!result.success) {\n throw new Error(\n `defineExtension (AIP-40): ${result.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \")}`,\n )\n }\n // TODO: spec-40-specific cross-field rules (if/then/allOf in\n // the JSON Schema) — those don't translate to zod cleanly and\n // belong here. See @agentproto/operator's autonomy=gated rule.\n },\n build(def) {\n // Default build: spread the validated definition into a fresh object.\n // Hand-tune for nested freezing (Object.freeze on arrays/objects) and\n // for fields that need defaults applied — see @agentproto/operator\n // for a reference shape.\n return { ...def } as ExtensionHandle\n },\n})\n","/**\n * AIP-40 EXTENSION.md sidecar parser + manifest-to-handle constructor.\n *\n * Mirror of `@agentproto/tool/manifest` and `@agentproto/driver/manifest`:\n * the .md provides metadata; the TS module supplies any spec-specific\n * runtime bits (schemas, execute bodies, …) that can't live in\n * frontmatter. Both inputs end up in `defineExtension` so the cross-AIP\n * invariants run uniformly.\n *\n *\n * The frontmatter zod schema below was generated from\n * `resources/aip-40/draft/EXTENSION.schema.json` via json-schema-to-zod.\n * Re-run scaffold-aip to refresh after spec changes (or hand-tune\n * any constraint the converter doesn't capture cleanly).\n */\n\nimport matter from \"gray-matter\"\nimport { extensionFrontmatterSchema, type ExtensionFrontmatter } from \"../schema.js\"\nimport { defineExtension } from \"../define-extension.js\"\nimport type { ExtensionDefinition, ExtensionHandle } from \"../types.js\"\n\n// Re-export so consumers can import the schema + inferred type either\n// from \"@@agentproto/extension/manifest\" or directly from \"@@agentproto/extension/schema\".\nexport { extensionFrontmatterSchema, type ExtensionFrontmatter }\n\nexport interface ExtensionManifest {\n frontmatter: ExtensionFrontmatter\n body: string\n}\n\nexport function parseExtensionManifest(source: string): ExtensionManifest {\n const parsed = matter(source)\n if (Object.keys(parsed.data).length === 0) {\n throw new Error(\"parseExtensionManifest: missing or empty frontmatter\")\n }\n const result = extensionFrontmatterSchema.safeParse(parsed.data)\n if (!result.success) {\n throw new Error(\n `parseExtensionManifest: invalid frontmatter — ${result.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \")}`,\n )\n }\n return { frontmatter: result.data, body: parsed.content }\n}\n\nexport function extensionFromManifest(manifest: ExtensionManifest): ExtensionHandle {\n // The zod-validated frontmatter is structurally compatible with\n // ExtensionDefinition; the cast pins the typing once the manifest\n // schema and the TS interface diverge (e.g. handle has frozen fields\n // a literal config doesn't carry yet).\n return defineExtension(manifest.frontmatter as unknown as ExtensionDefinition)\n}\n","/**\n * `specFromExtension(handle, parent)` — turn a parsed EXTENSION.md\n * into a runtime `DoctypeSpec` consumable by\n * `@agentproto/manifest.createVerbs`.\n *\n * The parent argument is the public AIP's spec (e.g. `toolSpec` from\n * `@agentproto/tool`). The function composes:\n *\n * schema parent.schema ∪ ext.add_fields, then ext.tighten\n * path ext.path_convention ?? parent.pathOf\n * defaults parent defaults ⨁ ext.defaults\n * define wraps parent.define with default-application\n * parse parent.parse (frontmatter shape stays compatible)\n *\n * Tightening monotonicity is verified by-field: pattern subset\n * (cheap heuristic — full regex-language inclusion is undecidable),\n * enum subset (set membership), minLength/minimum ≥, maxLength/maximum ≤.\n *\n * For `extends: none`, `parent` is null/undefined and the extension\n * acts as a root doctype: the `add_fields` becomes its full schema,\n * `path_convention` is required (no parent fallback).\n */\n\nimport type { DoctypeSpec } from \"@agentproto/manifest\"\nimport type { ExtensionDefinition } from \"./types.js\"\n\nexport interface SpecFromExtensionOptions<\n TParams extends { id?: string; slug?: string; name?: string },\n THandle,\n> {\n /**\n * Parent doctype spec. Required when `extension.extends !== \"none\"`.\n * Pass e.g. `toolSpec` from `@agentproto/tool`.\n */\n parent?: DoctypeSpec<TParams, THandle>\n}\n\nexport function specFromExtension<\n TParams extends { id?: string; slug?: string; name?: string },\n THandle,\n>(\n extension: ExtensionDefinition,\n opts: SpecFromExtensionOptions<TParams, THandle> = {},\n): DoctypeSpec<TParams, THandle> {\n const { parent } = opts\n const isRoot = extension.extends === \"none\"\n\n if (!isRoot && !parent) {\n throw new Error(\n `specFromExtension (AIP-40): extension '${extension.slug}' extends '${extension.extends}' but no parent spec was provided in opts.parent`,\n )\n }\n if (isRoot && !extension.path_convention) {\n throw new Error(\n `specFromExtension (AIP-40): extension '${extension.slug}' is a root doctype (extends: none) and MUST declare path_convention`,\n )\n }\n\n // Tightening monotonicity check — see Specification §\"Composition rules\" #3.\n if (parent && extension.tighten) {\n verifyTightening(extension, parent)\n }\n\n const slugName = extension.slug.split(\":\")[1] ?? extension.slug\n const pathTemplate = extension.path_convention ?? null\n\n // Keys the extension is authoritative over — anything declared in\n // `add_fields.properties`. Computed once at spec-composition time so\n // the per-call `define` is a hot-path lookup, not a re-derivation.\n const extensionKeys = new Set(\n Object.keys(extension.add_fields?.properties ?? {}),\n )\n\n const define = (params: TParams) => {\n // Layered defaults: parent defaults are baked into parent.define;\n // extension defaults apply on top, only for keys the user omitted.\n const withDefaults = { ...params } as Record<string, unknown>\n if (extension.defaults) {\n for (const [key, value] of Object.entries(extension.defaults)) {\n if (withDefaults[key] === undefined && value !== undefined) {\n withDefaults[key] = value\n }\n }\n }\n if (isRoot) {\n // Root doctype — no parent.define to delegate to. Return the\n // params verbatim, frozen. (A more disciplined runtime would\n // compile the add_fields schema to zod and validate; deferred\n // because root doctypes are rare and the manifest layer's\n // schema-level zod catches malformed input.)\n return Object.freeze(withDefaults) as unknown as THandle\n }\n // Split params before delegating: parent specs typically validate\n // through `zod.strict()` (e.g. AIP-42 `agentFrontmatterSchema`),\n // which rejects extension-owned keys as \"Unrecognized\". Hand the\n // parent only what it owns, then re-attach extension fields onto\n // the resulting handle. Extension-side validation of these fields\n // is the manifest layer's responsibility (compiled from\n // `add_fields` JSON Schema at parse time); the runtime trusts\n // input it received via that path.\n const parentOnly: Record<string, unknown> = {}\n const extensionOnly: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(withDefaults)) {\n if (extensionKeys.has(key)) extensionOnly[key] = value\n else parentOnly[key] = value\n }\n const parentHandle = parent!.define(parentOnly as unknown as TParams)\n return Object.freeze({\n ...(parentHandle as object),\n ...extensionOnly,\n }) as unknown as THandle\n }\n\n const parse = isRoot ? rootParse(extension) : parent!.parse\n\n const pathOf = (handle: THandle) => {\n if (pathTemplate) {\n return resolvePathTemplate(\n pathTemplate,\n handle as unknown as Record<string, unknown>,\n slugName,\n )\n }\n return parent!.pathOf(handle)\n }\n\n return {\n name: extension.slug,\n aip: 40,\n schemaLiteral: parent?.schemaLiteral ?? `agentproto/extension/v1`,\n pathOf,\n define,\n parse,\n }\n}\n\nfunction verifyTightening<\n TParams extends { id?: string; slug?: string; name?: string },\n THandle,\n>(\n extension: ExtensionDefinition,\n parent: DoctypeSpec<TParams, THandle>,\n): void {\n // Best-effort: the manifest layer doesn't expose the parent's raw\n // JSON Schema, so we can only verify what the spec ships in\n // `extension.tighten` against itself for self-consistency. Full\n // parent-vs-extension monotonicity verification belongs to a future\n // version once parent specs expose `schema:` introspection.\n const t = extension.tighten ?? {}\n for (const [field, override] of Object.entries(t)) {\n if (\n typeof override.minLength === \"number\" &&\n typeof override.maxLength === \"number\" &&\n override.minLength > override.maxLength\n ) {\n throw new Error(\n `specFromExtension (AIP-40): extension '${extension.slug}' tighten.${field}: minLength (${override.minLength}) > maxLength (${override.maxLength})`,\n )\n }\n if (\n typeof override.minimum === \"number\" &&\n typeof override.maximum === \"number\" &&\n override.minimum > override.maximum\n ) {\n throw new Error(\n `specFromExtension (AIP-40): extension '${extension.slug}' tighten.${field}: minimum (${override.minimum}) > maximum (${override.maximum})`,\n )\n }\n if (override.enum !== undefined && !Array.isArray(override.enum)) {\n throw new Error(\n `specFromExtension (AIP-40): extension '${extension.slug}' tighten.${field}: enum must be an array`,\n )\n }\n }\n}\n\nfunction rootParse(extension: ExtensionDefinition) {\n return (source: string) => {\n // Root doctypes don't have a parent parser — fall back to bare\n // gray-matter. The manifest layer applies `define` afterwards.\n // We don't import gray-matter here to keep this module dependency-\n // light; the caller wires their own parse if they really want a\n // root doctype, or uses the standard parse from a sibling package.\n void source\n void extension\n throw new Error(\n `specFromExtension (AIP-40): extension '${extension.slug}' is a root doctype — supply your own parser or extend a public AIP for parser inheritance`,\n )\n }\n}\n\nfunction resolvePathTemplate(\n template: string,\n handle: Record<string, unknown>,\n doctypeSlug: string,\n): string {\n // Tokens supported in v1: <slug> (the doctype's identity field —\n // tries id, slug, name in that order) and <DOCTYPE> (uppercase\n // version of the extension's slug name part, e.g. \"DEAL\").\n const identity =\n (typeof handle.id === \"string\" && handle.id) ||\n (typeof handle.slug === \"string\" && handle.slug) ||\n (typeof handle.name === \"string\" && handle.name) ||\n \"unknown\"\n return template\n .replace(/<slug>/g, identity)\n .replace(/<DOCTYPE>/g, doctypeSlug.toUpperCase())\n}\n","/**\n * AIP-42 AGENT.md frontmatter zod schema.\n *\n * Generated from `resources/aip-42/draft/AGENT.schema.json` via\n * json-schema-to-zod. Imported by both `define-agent.ts` (TS path\n * validation) and `manifest/index.ts` (.md path validation) so every\n * field-level constraint runs in both authoring paths from a single\n * source of truth — re-run scaffold-aip to refresh after spec changes.\n *\n * Cross-field rules (if/then/allOf in JSON Schema) don't translate\n * cleanly and live in `define-agent.ts`'s `validate(def)` instead.\n */\n\nimport { z } from \"zod\"\n\nexport const agentFrontmatterSchema = z.object({ \"schema\": z.literal(\"agent/v1\"), \"id\": z.string().regex(new RegExp(\"^[a-z0-9@][a-z0-9.@/_-]*$\")).min(2).max(80).describe(\"Machine identifier. Optional @<owner>/ prefix. Unique within the registry that hosts the agent.\"), \"description\": z.string().min(1).max(2000).describe(\"One-paragraph purpose.\"), \"version\": z.string().regex(new RegExp(\"^\\\\d+\\\\.\\\\d+\\\\.\\\\d+(?:[-+][\\\\w.\\\\-]+)?$\")).describe(\"Spec version of THIS file.\").default(\"1.0.0\"), \"extends\": z.any().describe(\"Parent AGENT this extends. Inherits all fields; child overrides win.\").optional(), \"model\": z.any().describe(\"The brain — provider/model id string or structured ref.\"), \"identity\": z.any().describe(\"AIP-23 identity ref. Defaults to host policy.\").optional(), \"persona\": z.any().describe(\"AIP-25 persona ref.\").optional(), \"runner\": z.any().describe(\"AIP-17 runtime engine ref.\").optional(), \"tools\": z.array(z.any()).describe(\"AIP-14 tool refs.\").default([] as never), \"actions\": z.object({ \"granted\": z.array(z.any()).default([] as never) }).strict().describe(\"Explicit action allow-list. POLICY checks union of this + tools' implements.\").optional(), \"skills\": z.array(z.any()).describe(\"AIP-3 skill refs.\").default([] as never), \"workflows\": z.array(z.any()).describe(\"AIP-15 workflow refs.\").default([] as never), \"routines\": z.array(z.any()).describe(\"AIP-41 routine refs that auto-fire this agent.\").default([] as never), \"delegates_to\": z.array(z.any()).describe(\"Sub-agents this agent may dispatch to (council pattern, AIP-24).\").default([] as never), \"memory\": z.any().describe(\"Memory configuration.\").optional(), \"governance\": z.any().describe(\"AIP-7 governance binding.\").optional(), \"policy\": z.any().describe(\"AIP-38 POLICY binding.\").optional(), \"traits\": z.record(z.string(), z.number().gte(0).lte(10)).describe(\"Free-form numeric trait scores (0-10).\").default({} as never), \"autonomy\": z.number().int().gte(0).lte(10).describe(\"How much the agent acts vs asks. 0 = always asks, 10 = full autonomy.\").default(5), \"boundaries\": z.array(z.string().min(1)).describe(\"Hard rules the agent MUST decline / escalate. Surfaced into system prompt.\").default([] as never), \"on\": z.record(z.string(), z.any().superRefine((x, ctx) => {\n const schemas = [z.any(), z.array(z.any())];\n const { errors, failed } = schemas.reduce<{\n errors: z.core.$ZodIssue[];\n failed: number;\n }>(\n ({ errors, failed }, schema) =>\n ((result) =>\n result.error\n ? {\n errors: [...errors, ...result.error.issues],\n failed: failed + 1,\n }\n : { errors, failed })(\n schema.safeParse(x),\n ),\n { errors: [], failed: 0 },\n );\n const passed = schemas.length - failed;\n if (passed !== 1) {\n ctx.addIssue(errors.length ? {\n path: [],\n code: \"invalid_union\",\n errors: [errors],\n message: \"Invalid input: Should pass single schema. Passed \" + passed,\n } : {\n path: [],\n code: \"custom\",\n errors: [errors],\n message: \"Invalid input: Should pass single schema. Passed \" + passed,\n });\n }\n })).describe(\"Lifecycle hooks. AIP-37 event name -> action-ref(s) to invoke.\").default({} as never), \"publish\": z.object({ \"visibility\": z.enum([\"private\",\"unlisted\",\"public\"]).default(\"private\"), \"registry\": z.string().optional() }).strict().default({\"visibility\":\"private\"}), \"tags\": z.array(z.string()).default([] as never), \"metadata\": z.record(z.string(), z.any()).optional() }).strict().describe(\"Validates the YAML frontmatter portion of an AIP-42 AGENT.md manifest. Composes identity, persona, model, tools, actions, skills, workflows, runner, memory, governance, policy, routines into a single runnable definition.\")\n\nexport type AgentFrontmatter = z.infer<typeof agentFrontmatterSchema>\n","import { createDoctype } from \"@agentproto/define-doctype\"\nimport { agentFrontmatterSchema } from \"./schema.js\"\nimport type { AgentDefinition, AgentHandle } from \"./types.js\"\n\n/**\n * AIP-42 reference implementation of `defineAgent`.\n *\n * Built on `createDoctype` so the cross-AIP invariants (id pattern,\n * description length, top-level freeze, \"defineAgent (AIP-42): …\"\n * error prefix) run uniformly with every other AIP defineX.\n *\n * Field-level validation runs the schema-derived zod from\n * `./schema.ts` against the input. Same source of truth as the .md\n * path uses (`parseAgentManifest`), so a malformed TS-authored\n * definition fails with the same diagnostic as a malformed manifest.\n * Cross-field rules go in `validate(def)` after the zod check.\n */\nexport const defineAgent = createDoctype<AgentDefinition, AgentHandle>({\n aip: 42,\n name: \"agent\",\n // AIP-42 ids accept an optional `@<owner>/` prefix for namespacing\n // across registries (e.g. `@agentik/writer`). Bare ids stay valid.\n idPattern: /^(?:@[a-z0-9][a-z0-9._-]*\\/)?[a-z0-9][a-z0-9._-]{0,79}$/,\n validate(def) {\n const result = agentFrontmatterSchema.safeParse(def)\n if (!result.success) {\n throw new Error(\n `defineAgent (AIP-42): ${result.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \")}`,\n )\n }\n // Extends-chain depth (≤5) and cycle checks require loading parent\n // manifests and are therefore async. Call `validateExtendsChain`\n // (exported from this package) in any context with file/registry\n // access before running the agent. Other cross-field rules (e.g.\n // autonomy=gated patterns from @agentproto/operator) go here.\n },\n build(def) {\n // Default build: spread the validated definition into a fresh object.\n // Hand-tune for nested freezing (Object.freeze on arrays/objects) and\n // for fields that need defaults applied — see @agentproto/operator\n // for a reference shape.\n return { ...def } as AgentHandle\n },\n})\n","/**\n * AIP-42 AGENT.md sidecar parser + manifest-to-handle constructor.\n *\n * Mirror of `@agentproto/tool/manifest` and `@agentproto/driver/manifest`:\n * the .md provides metadata; the TS module supplies any spec-specific\n * runtime bits (schemas, execute bodies, …) that can't live in\n * frontmatter. Both inputs end up in `defineAgent` so the cross-AIP\n * invariants run uniformly.\n *\n *\n * The frontmatter zod schema below was generated from\n * `resources/aip-42/draft/AGENT.schema.json` via json-schema-to-zod.\n * Re-run scaffold-aip to refresh after spec changes (or hand-tune\n * any constraint the converter doesn't capture cleanly).\n */\n\nimport matter from \"gray-matter\"\nimport { agentFrontmatterSchema, type AgentFrontmatter } from \"../schema.js\"\nimport { defineAgent } from \"../define-agent.js\"\nimport type { AgentDefinition, AgentHandle } from \"../types.js\"\n\n// Re-export so consumers can import the schema + inferred type either\n// from \"@@agentproto/agent/manifest\" or directly from \"@@agentproto/agent/schema\".\nexport { agentFrontmatterSchema, type AgentFrontmatter }\n\nexport interface AgentManifest {\n frontmatter: AgentFrontmatter\n body: string\n}\n\nexport function parseAgentManifest(source: string): AgentManifest {\n const parsed = matter(source)\n if (Object.keys(parsed.data).length === 0) {\n throw new Error(\"parseAgentManifest: missing or empty frontmatter\")\n }\n const result = agentFrontmatterSchema.safeParse(parsed.data)\n if (!result.success) {\n throw new Error(\n `parseAgentManifest: invalid frontmatter — ${result.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \")}`,\n )\n }\n return { frontmatter: result.data, body: parsed.content }\n}\n\nexport function agentFromManifest(manifest: AgentManifest): AgentHandle {\n // The zod-validated frontmatter is structurally compatible with\n // AgentDefinition; the cast pins the typing once the manifest\n // schema and the TS interface diverge (e.g. handle has frozen fields\n // a literal config doesn't carry yet).\n return defineAgent(manifest.frontmatter as unknown as AgentDefinition)\n}\n","/**\n * AIP-42 doctype spec — fed to `@agentproto/manifest.createVerbs`\n * to derive create / load / list / update / resolve / delete in one\n * place. Plugs into `@agentproto/mcp-server` so an agent library\n * lives at `<workspace>/.agents/<id>/AGENT.md` (mirroring AIP-39's\n * `.actions/` convention).\n */\n\nimport { createVerbs, type DoctypeSpec } from \"@agentproto/manifest\"\nimport { defineAgent } from \"./define-agent.js\"\nimport { parseAgentManifest } from \"./manifest/index.js\"\nimport type { AgentDefinition, AgentHandle } from \"./types.js\"\n\nexport const agentSpec: DoctypeSpec<AgentDefinition, AgentHandle> = {\n name: \"agent\",\n aip: 42,\n schemaLiteral: \"agent/v1\",\n pathOf: (h) => `.agents/${h.id}/AGENT.md`,\n define: defineAgent,\n parse: (source) => {\n const m = parseAgentManifest(source)\n return {\n frontmatter: m.frontmatter as unknown as Record<string, unknown>,\n body: m.body,\n }\n },\n}\n\nexport const agentVerbs = createVerbs(agentSpec)\n","import { createDoctype } from \"@agentproto/define-doctype\"\nimport type { ZodType } from \"zod\"\nimport { ToolError } from \"./errors.js\"\nimport type {\n ApprovalClass,\n DriverConstraints,\n DriverKind,\n ToolCapabilities,\n ToolContext,\n ToolDefinition,\n ToolHandle,\n ValidationResult,\n} from \"./types.js\"\n\nconst PROVIDER_KINDS: readonly DriverKind[] = [\n \"cli\",\n \"http\",\n \"mcp\",\n \"sdk\",\n \"builtin\",\n]\n\n/**\n * AIP-14 reference implementation of `defineTool`.\n *\n * Returns a {@link ToolHandle} with defaults applied. The handle is a\n * pure contract — schemas, governance metadata, provider routing\n * hints. Bodies live on AIP-30 PROVIDER manifests; invocation goes\n * through provider-runtime's resolver.\n *\n * Built on `createDoctype` from `@agentproto/define-doctype`: the\n * id-pattern + description-length validation and the top-level\n * `Object.freeze` are shared with every other AIP defineX. The\n * spec-14-specific parts (migration guard for `execute`, defaulting\n * `approval` from `mutates`, freezing nested arrays/objects) live in\n * `validate` and `build` below.\n *\n * Conformance highlights ([§ Conformance rules](https://agentproto.sh/docs/aip-14)):\n * - No `execute` field on the contract — bodies are providers' job.\n * - `defineTool` MUST refuse a definition carrying `execute` (migration error).\n * - No I/O at module load — `defineTool(...)` is pure construction.\n */\nconst constructTool = createDoctype<\n ToolDefinition<unknown, unknown, ToolContext>,\n ToolHandle<unknown, unknown, ToolContext>\n>({\n aip: 14,\n name: \"tool\",\n validate(def) {\n // Migration guard: catch authors trying to ship a body on the contract.\n // The body lives on a PROVIDER (per AIP-30); reject at construction.\n if (\"execute\" in (def as unknown as Record<string, unknown>)) {\n throw new Error(\n `defineTool: id='${def.id}' carries an 'execute' property. ` +\n `Bodies live on AIP-30 PROVIDER manifests, not on the TOOL contract. ` +\n `See https://agentproto.sh/docs/aip-30 for migration.`,\n )\n }\n },\n build(def) {\n return {\n id: def.id,\n name: def.name ?? def.id,\n description: def.description,\n version: def.version,\n inputSchema: def.inputSchema,\n outputSchema: def.outputSchema,\n contextSchema: def.contextSchema,\n mutates: Object.freeze([...(def.mutates ?? [])]),\n requires: freezeCapabilities(def.requires),\n approval: defaultApproval(def.approval, def.mutates),\n riskLevel: def.riskLevel ?? 0,\n costClass: def.costClass ?? \"trivial\",\n timeoutMs: def.timeoutMs ?? 30_000,\n retry: def.retry,\n tags: Object.freeze([...(def.tags ?? [])]),\n metadata: Object.freeze({ ...(def.metadata ?? {}) }),\n idempotent: def.idempotent ?? false,\n defaultImplementation: def.defaultImplementation,\n driverConstraints: freezeProviderConstraints(def.driverConstraints),\n }\n },\n})\n\n/**\n * Public-facing `defineTool` — typed wrapper around `constructTool`\n * that preserves the per-call `<TInput, TOutput, TContext>` inference\n * so callers don't write any generics. The wrapper exists purely for\n * generic propagation; the runtime body is the meta-factory above.\n */\nexport function defineTool<\n TInput,\n TOutput,\n TContext extends ToolContext = ToolContext,\n>(\n definition: ToolDefinition<TInput, TOutput, TContext>,\n): ToolHandle<TInput, TOutput, TContext> {\n return constructTool(\n definition as ToolDefinition<unknown, unknown, ToolContext>,\n ) as unknown as ToolHandle<TInput, TOutput, TContext>\n}\n\n/**\n * Validate input against a tool's `inputSchema`. Returns a typed\n * {@link ValidationResult}; provider runtimes MUST call this BEFORE\n * dispatching to the provider's body.\n */\nexport function validateInput<TInput>(\n handle: Pick<ToolHandle<TInput>, \"id\" | \"inputSchema\">,\n input: unknown,\n): ValidationResult<TInput> {\n const result = handle.inputSchema.safeParse(input)\n if (!result.success) {\n return {\n ok: false,\n error: {\n code: \"input_invalid\",\n message: `id='${handle.id}': ${formatZodIssues(result.error.issues)}`,\n cause: result.error.issues,\n },\n }\n }\n return { ok: true, value: result.data as TInput }\n}\n\n/**\n * Validate context against a tool's `contextSchema` (when declared).\n * Returns a typed {@link ValidationResult}; provider runtimes MUST\n * call this BEFORE dispatching when the contract has a contextSchema.\n *\n * Tools without a contextSchema accept any context shape; this helper\n * returns the input verbatim in that case.\n */\nexport function validateContext<TContext extends ToolContext = ToolContext>(\n handle: Pick<ToolHandle<unknown, unknown, TContext>, \"id\" | \"contextSchema\">,\n context: unknown,\n): ValidationResult<TContext> {\n if (!handle.contextSchema) {\n return { ok: true, value: context as TContext }\n }\n const result = handle.contextSchema.safeParse(context)\n if (!result.success) {\n return {\n ok: false,\n error: {\n code: \"input_invalid\",\n message: `id='${handle.id}': context does not match contextSchema — ${formatZodIssues(result.error.issues)}`,\n field: \"context\",\n cause: result.error.issues,\n },\n }\n }\n return { ok: true, value: result.data as TContext }\n}\n\n/**\n * Validate output against a tool's `outputSchema`. Returns the typed\n * {@link ValidationResult}; provider runtimes MUST call this AFTER\n * the body returns and BEFORE handing the value to the caller.\n *\n * On failure, hosts SHOULD throw {@link ToolError} with code\n * `\"output_invalid\"` — the tool produced a contract violation.\n */\nexport function validateOutput<TOutput>(\n handle: Pick<ToolHandle<unknown, TOutput>, \"id\" | \"outputSchema\">,\n output: unknown,\n): TOutput {\n const result = handle.outputSchema.safeParse(output)\n if (!result.success) {\n throw new ToolError({\n code: \"output_invalid\",\n message: `id='${handle.id}': provider produced output that does not match outputSchema — ${formatZodIssues(result.error.issues)}`,\n cause: result.error.issues,\n })\n }\n return result.data as TOutput\n}\n\nfunction defaultApproval(\n declared: ApprovalClass | undefined,\n mutates: readonly string[] | undefined,\n): ApprovalClass {\n if (declared) return declared\n return mutates && mutates.length > 0 ? \"on-mutate\" : \"auto\"\n}\n\nfunction freezeCapabilities(\n caps: ToolCapabilities | undefined,\n): Readonly<ToolCapabilities> {\n return Object.freeze({\n network: Object.freeze([...(caps?.network ?? [])]),\n secrets: Object.freeze([...(caps?.secrets ?? [])]),\n tools: Object.freeze([...(caps?.tools ?? [])]),\n })\n}\n\nfunction freezeProviderConstraints(\n c: DriverConstraints | undefined,\n): Required<DriverConstraints> {\n const forbid = (c?.forbid ?? []).filter((k): k is DriverKind =>\n PROVIDER_KINDS.includes(k as DriverKind),\n )\n const requireKind = (c?.requireKind ?? []).filter((k): k is DriverKind =>\n PROVIDER_KINDS.includes(k as DriverKind),\n )\n return Object.freeze({\n forbid: Object.freeze(forbid) as readonly DriverKind[],\n requireKind: Object.freeze(requireKind) as readonly DriverKind[],\n })\n}\n\nfunction formatZodIssues(\n issues: ReadonlyArray<{ path: ReadonlyArray<PropertyKey>; message: string }>,\n): string {\n return issues\n .map((i) => `${i.path.length > 0 ? i.path.join(\".\") + \": \" : \"\"}${i.message}`)\n .join(\"; \")\n}\n\nexport type { ZodType }\n","import matter from \"gray-matter\"\nimport { z, type ZodType } from \"zod\"\nimport { defineTool } from \"../define-tool.js\"\nimport type { ApprovalClass, ToolContext, ToolHandle } from \"../types.js\"\n\n/**\n * AIP-14 TOOL.md sidecar parser.\n *\n * Reads frontmatter (host-relevant metadata) + body (long-form\n * description / examples / errors). The TS module's `defineTool(...)`\n * supplies the schemas and execute body; this manifest supplies the\n * runtime metadata that overrides or augments the in-code defaults.\n *\n * Field set covers AIP-14 §\"Frontmatter\" — required and optional fields\n * normalised to snake_case → camelCase.\n */\n\nexport const toolManifestFrontmatterSchema = z.object({\n schema: z.literal(\"agentproto/tool/v1\").optional(),\n name: z.string().min(1).max(80),\n id: z.string().regex(/^[a-z][a-z0-9._-]{1,63}$/),\n description: z.string().min(1).max(2000),\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+/),\n\n // Optional metadata\n mutates: z.array(z.string()).optional(),\n requires: z\n .object({\n network: z.array(z.string()).optional(),\n secrets: z.array(z.string()).optional(),\n tools: z.array(z.string()).optional(),\n })\n .optional(),\n // `ApprovalClass` is `\"auto\" | \"always\" | \"on-mutate\" | \\`policy:${string}\\``.\n // z.union widens the regex branch to plain `string` (zod can't express\n // template literal types), so we use `z.custom` to keep the inferred\n // type exact — matters because `defineTool` accepts `ApprovalClass`.\n approval: z\n .custom<ApprovalClass>(\n (v): v is ApprovalClass =>\n typeof v === \"string\" &&\n (v === \"auto\" ||\n v === \"always\" ||\n v === \"on-mutate\" ||\n /^policy:/.test(v)),\n { message: \"expected 'auto' | 'always' | 'on-mutate' | 'policy:<name>'\" },\n )\n .optional(),\n risk_level: z\n .union([z.literal(0), z.literal(1), z.literal(2), z.literal(3)])\n .optional(),\n cost_class: z.enum([\"trivial\", \"metered\", \"expensive\"]).optional(),\n timeout_ms: z.number().int().positive().optional(),\n idempotent: z.boolean().optional(),\n tags: z.array(z.string()).optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n\n // AIP-26 / AIP-17 / AIP-19 references — kept loose; validated by their\n // respective AIPs' adapters when consumed.\n code: z.unknown().optional(),\n run: z.unknown().optional(),\n runner: z.unknown().optional(),\n secrets: z.unknown().optional(),\n network: z.unknown().optional(),\n})\n\nexport type ToolManifestFrontmatter = z.infer<\n typeof toolManifestFrontmatterSchema\n>\n\nexport interface ToolManifest {\n frontmatter: ToolManifestFrontmatter\n body: string\n}\n\n/**\n * Parse a TOOL.md source string into structured frontmatter + body.\n * Throws on missing frontmatter or schema-invalid frontmatter.\n */\nexport function parseToolManifest(source: string): ToolManifest {\n const parsed = matter(source)\n if (Object.keys(parsed.data).length === 0) {\n throw new Error(\"parseToolManifest: missing or empty frontmatter\")\n }\n const result = toolManifestFrontmatterSchema.safeParse(parsed.data)\n if (!result.success) {\n throw new Error(\n `parseToolManifest: invalid frontmatter — ${result.error.issues\n .map(i => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \")}`\n )\n }\n return { frontmatter: result.data, body: parsed.content }\n}\n\n/**\n * Build a fully-typed {@link ToolHandle} from a parsed `TOOL.md` manifest\n * + caller-supplied schemas. The .md is the single source of truth for\n * metadata (id, name, description, version, mutates, approval, …); the\n * schemas live in the TS module that ships alongside the .md.\n *\n * Both inputs are revalidated by `defineTool`'s shared invariants\n * (id pattern, description length, top-level freeze) — `parseToolManifest`\n * already enforces a stricter id pattern + version semver, so a\n * well-formed manifest passes through cleanly. Mismatches between the\n * manifest's id-shape and `defineTool`'s pattern surface a\n * descriptive error from the same validation pipeline as the TS path.\n *\n * @example\n * const manifest = parseToolManifest(readFileSync(\"./echo/TOOL.md\", \"utf8\"))\n * const echo = toolFromManifest({\n * manifest,\n * inputSchema: z.object({ msg: z.string() }),\n * outputSchema: z.object({ msg: z.string() }),\n * })\n */\nexport function toolFromManifest<\n TInput,\n TOutput,\n TContext extends ToolContext = ToolContext,\n>(args: {\n manifest: ToolManifest\n inputSchema: ZodType<TInput>\n outputSchema: ZodType<TOutput>\n contextSchema?: ZodType<TContext>\n}): ToolHandle<TInput, TOutput, TContext> {\n const fm = args.manifest.frontmatter\n return defineTool<TInput, TOutput, TContext>({\n id: fm.id,\n name: fm.name,\n description: fm.description,\n version: fm.version,\n inputSchema: args.inputSchema,\n outputSchema: args.outputSchema,\n contextSchema: args.contextSchema,\n mutates: fm.mutates,\n requires: fm.requires,\n approval: fm.approval,\n riskLevel: fm.risk_level,\n costClass: fm.cost_class,\n timeoutMs: fm.timeout_ms,\n idempotent: fm.idempotent,\n tags: fm.tags,\n metadata: fm.metadata,\n })\n}\n","/**\n * AIP-14 doctype spec — fed to `@agentproto/manifest.createVerbs`\n * to derive create / load / list / update / resolve / delete in one\n * place. Keeping the spec separate from `define-tool.ts` lets the\n * manifest layer (and the future MCP server) iterate over a uniform\n * descriptor without each package re-implementing the wiring.\n */\n\nimport { createVerbs, type DoctypeSpec } from \"@agentproto/manifest\"\nimport { defineTool } from \"./define-tool.js\"\nimport { parseToolManifest } from \"./manifest/index.js\"\nimport type { ToolDefinition, ToolHandle } from \"./types.js\"\n\nexport const toolSpec: DoctypeSpec<\n ToolDefinition<unknown, unknown>,\n ToolHandle<unknown, unknown>\n> = {\n name: \"tool\",\n aip: 14,\n schemaLiteral: \"agentproto/tool/v1\",\n pathOf: (h) => `${h.id}/TOOL.md`,\n define: (params) =>\n defineTool(params) as ToolHandle<unknown, unknown>,\n parse: (source) => {\n const m = parseToolManifest(source)\n return {\n frontmatter: m.frontmatter as unknown as Record<string, unknown>,\n body: m.body,\n }\n },\n}\n\nexport const toolVerbs = createVerbs(toolSpec)\n","/**\n * AIP-41 ROUTINE.md frontmatter zod schema.\n *\n * Generated from `resources/aip-41/draft/ROUTINE.schema.json` via\n * json-schema-to-zod. Imported by both `define-routine.ts` (TS path\n * validation) and `manifest/index.ts` (.md path validation) so every\n * field-level constraint runs in both authoring paths from a single\n * source of truth — re-run scaffold-aip to refresh after spec changes.\n *\n * Cross-field rules (if/then/allOf in JSON Schema) don't translate\n * cleanly and live in `define-routine.ts`'s `validate(def)` instead.\n */\n\nimport { z } from \"zod\"\n\nexport const routineFrontmatterSchema = z.object({ \"schema\": z.literal(\"routine/v1\"), \"id\": z.string().regex(new RegExp(\"^[a-z0-9@][a-z0-9.@/_-]*$\")).min(2).max(80).describe(\"Machine identifier. Lowercase, digits, dashes, dots, optional @owner/ prefix. Unique within the registry that hosts the routine.\"), \"description\": z.string().min(1).max(2000).describe(\"One-paragraph purpose.\"), \"version\": z.string().regex(new RegExp(\"^\\\\d+\\\\.\\\\d+\\\\.\\\\d+(?:[-+][\\\\w.\\\\-]+)?$\")).describe(\"Spec version of THIS file.\").default(\"1.0.0\"), \"schedule\": z.any().describe(\"When the routine fires.\"), \"target\": z.any().describe(\"What the routine invokes when it fires.\"), \"identity\": z.any().describe(\"Identity that owns the routine fire (AIP-23). Defaults to host policy.\").optional(), \"retry\": z.any().describe(\"Retry behaviour on failure.\").optional(), \"on_failure\": z.any().describe(\"Where to route failures after retries exhaust.\").optional(), \"history\": z.any().describe(\"Run history retention.\").optional(), \"fires_events\": z.array(z.string().min(1)).describe(\"AIP-37 LIFECYCLE event names this routine fires.\").default([\"routine-triggered\",\"routine-completed\",\"routine-failed\"]), \"enabled\": z.boolean().describe(\"If false, routine registers but does not fire. Useful for staging.\").default(true), \"tags\": z.array(z.string()).describe(\"Free-form discovery tags.\").default([] as never), \"metadata\": z.record(z.string(), z.any()).describe(\"Free-form, namespaced.\").optional() }).strict().describe(\"Validates the YAML frontmatter portion of an AIP-41 ROUTINE.md manifest. Decouples 'when' (schedule) from 'what' (target action/workflow/tool).\")\n\nexport type RoutineFrontmatter = z.infer<typeof routineFrontmatterSchema>\n","import { createDoctype } from \"@agentproto/define-doctype\"\nimport { routineFrontmatterSchema } from \"./schema.js\"\nimport type { RoutineDefinition, RoutineHandle } from \"./types.js\"\n\n/**\n * AIP-41 reference implementation of `defineRoutine`.\n *\n * Built on `createDoctype` so the cross-AIP invariants (id pattern,\n * description length, top-level freeze, \"defineRoutine (AIP-41): …\"\n * error prefix) run uniformly with every other AIP defineX.\n *\n * Field-level validation runs the schema-derived zod from\n * `./schema.ts` against the input. Same source of truth as the .md\n * path uses (`parseRoutineManifest`), so a malformed TS-authored\n * definition fails with the same diagnostic as a malformed manifest.\n * Cross-field rules go in `validate(def)` after the zod check.\n */\nexport const defineRoutine = createDoctype<RoutineDefinition, RoutineHandle>({\n aip: 41,\n name: \"routine\",\n validate(def) {\n const result = routineFrontmatterSchema.safeParse(def)\n if (!result.success) {\n throw new Error(\n `defineRoutine (AIP-41): ${result.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \")}`,\n )\n }\n // TODO: spec-41-specific cross-field rules (if/then/allOf in\n // the JSON Schema) — those don't translate to zod cleanly and\n // belong here. See @agentproto/operator's autonomy=gated rule.\n },\n build(def) {\n // Default build: spread the validated definition into a fresh object.\n // Hand-tune for nested freezing (Object.freeze on arrays/objects) and\n // for fields that need defaults applied — see @agentproto/operator\n // for a reference shape.\n return { ...def } as RoutineHandle\n },\n})\n","/**\n * AIP-41 ROUTINE.md sidecar parser + manifest-to-handle constructor.\n *\n * Mirror of `@agentproto/tool/manifest` and `@agentproto/driver/manifest`:\n * the .md provides metadata; the TS module supplies any spec-specific\n * runtime bits (schemas, execute bodies, …) that can't live in\n * frontmatter. Both inputs end up in `defineRoutine` so the cross-AIP\n * invariants run uniformly.\n *\n *\n * The frontmatter zod schema below was generated from\n * `resources/aip-41/draft/ROUTINE.schema.json` via json-schema-to-zod.\n * Re-run scaffold-aip to refresh after spec changes (or hand-tune\n * any constraint the converter doesn't capture cleanly).\n */\n\nimport matter from \"gray-matter\"\nimport { routineFrontmatterSchema, type RoutineFrontmatter } from \"../schema.js\"\nimport { defineRoutine } from \"../define-routine.js\"\nimport type { RoutineDefinition, RoutineHandle } from \"../types.js\"\n\n// Re-export so consumers can import the schema + inferred type either\n// from \"@@agentproto/routine/manifest\" or directly from \"@@agentproto/routine/schema\".\nexport { routineFrontmatterSchema, type RoutineFrontmatter }\n\nexport interface RoutineManifest {\n frontmatter: RoutineFrontmatter\n body: string\n}\n\nexport function parseRoutineManifest(source: string): RoutineManifest {\n const parsed = matter(source)\n if (Object.keys(parsed.data).length === 0) {\n throw new Error(\"parseRoutineManifest: missing or empty frontmatter\")\n }\n const result = routineFrontmatterSchema.safeParse(parsed.data)\n if (!result.success) {\n throw new Error(\n `parseRoutineManifest: invalid frontmatter — ${result.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \")}`,\n )\n }\n return { frontmatter: result.data, body: parsed.content }\n}\n\nexport function routineFromManifest(manifest: RoutineManifest): RoutineHandle {\n // The zod-validated frontmatter is structurally compatible with\n // RoutineDefinition; the cast pins the typing once the manifest\n // schema and the TS interface diverge (e.g. handle has frozen fields\n // a literal config doesn't carry yet).\n return defineRoutine(manifest.frontmatter as unknown as RoutineDefinition)\n}\n","/**\n * AIP-41 doctype spec — fed to `@agentproto/manifest.createVerbs`\n * to derive create / load / list / update / resolve / delete in one\n * place. Plugs into `@agentproto/mcp-server` so a routine library\n * lives at `<workspace>/.routines/<id>/ROUTINE.md`.\n */\n\nimport { createVerbs, type DoctypeSpec } from \"@agentproto/manifest\"\nimport { defineRoutine } from \"./define-routine.js\"\nimport { parseRoutineManifest } from \"./manifest/index.js\"\nimport type { RoutineDefinition, RoutineHandle } from \"./types.js\"\n\nexport const routineSpec: DoctypeSpec<RoutineDefinition, RoutineHandle> = {\n name: \"routine\",\n aip: 41,\n schemaLiteral: \"routine/v1\",\n pathOf: (h) => `.routines/${h.id}/ROUTINE.md`,\n define: defineRoutine,\n parse: (source) => {\n const m = parseRoutineManifest(source)\n return {\n frontmatter: m.frontmatter as unknown as Record<string, unknown>,\n body: m.body,\n }\n },\n}\n\nexport const routineVerbs = createVerbs(routineSpec)\n","/**\n * self_inspect — MCP tool that lets an agent query its own AIP-42 manifest\n * without knowing its disk path.\n *\n * The agent supplies its logical `id`; the runtime resolves\n * `<workspace>/.agents/<id>/AGENT.md`, loads it via `agentVerbs`, resolves\n * each tool and routine ref to a `{ id, description }` summary, and returns\n * `{ agentPath, tools, routines }`.\n *\n * Injection mechanism: the workspace path is captured in the\n * `registerSelfInspectTool` closure at server-creation time (same pattern as\n * `registerFsTools`). The agent provides its logical id (known from its own\n * system-prompt frontmatter) — not an absolute path.\n */\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { z } from \"zod\"\nimport { join } from \"node:path\"\nimport { agentVerbs } from \"@agentproto/agent\"\nimport { toolVerbs } from \"@agentproto/tool\"\nimport { routineVerbs } from \"@agentproto/routine\"\n\nexport interface RefSummary {\n id: string\n description: string\n}\n\nexport interface SelfInspectResult {\n agentPath: string\n tools: RefSummary[]\n routines: RefSummary[]\n}\n\n/**\n * Reduce one AIP-27 ref block (from an agent's `tools[]`) to `{id, description}`.\n *\n * - `file:` → load the TOOL.md and extract `id` + `description` from the handle.\n * `baseDir` is the workspace root (tools live at `<workspace>/tools/<id>/TOOL.md`\n * by the AIP-14 `pathOf` convention, or wherever the file pointer says).\n * - `inline:` → use the inline params directly.\n * - `ref:` or `string` → surface the ref identifier as the id (registry resolution\n * requires an external resolver not available here at inspect time).\n */\nexport async function summarizeToolRef(\n raw: unknown,\n workspace: string,\n): Promise<RefSummary> {\n if (typeof raw === \"string\") {\n return { id: raw, description: \"(string ref — not locally resolved)\" }\n }\n if (typeof raw !== \"object\" || raw === null) {\n return { id: String(raw), description: \"(unknown ref shape)\" }\n }\n const block = raw as { ref?: string; file?: string; inline?: Record<string, unknown> }\n if (block.file) {\n try {\n const handle = await toolVerbs.resolve(\n { file: block.file },\n { baseDir: workspace },\n )\n return { id: handle.id, description: handle.description ?? \"\" }\n } catch {\n return { id: block.file, description: \"(file ref — could not load)\" }\n }\n }\n if (block.inline) {\n return {\n id: String(block.inline.id ?? \"\"),\n description: String(block.inline.description ?? \"\"),\n }\n }\n if (block.ref) {\n return { id: block.ref, description: \"(ref — not locally resolved)\" }\n }\n return { id: JSON.stringify(raw), description: \"(unknown ref shape)\" }\n}\n\n/**\n * Same logic for AIP-41 routine refs. Routines live at\n * `<workspace>/.routines/<id>/ROUTINE.md` by `routineSpec.pathOf` convention.\n */\nexport async function summarizeRoutineRef(\n raw: unknown,\n workspace: string,\n): Promise<RefSummary> {\n if (typeof raw === \"string\") {\n return { id: raw, description: \"(string ref — not locally resolved)\" }\n }\n if (typeof raw !== \"object\" || raw === null) {\n return { id: String(raw), description: \"(unknown ref shape)\" }\n }\n const block = raw as { ref?: string; file?: string; inline?: Record<string, unknown> }\n if (block.file) {\n try {\n const handle = await routineVerbs.resolve(\n { file: block.file },\n { baseDir: workspace },\n )\n return { id: handle.id, description: handle.description ?? \"\" }\n } catch {\n return { id: block.file, description: \"(file ref — could not load)\" }\n }\n }\n if (block.inline) {\n return {\n id: String(block.inline.id ?? \"\"),\n description: String(block.inline.description ?? \"\"),\n }\n }\n if (block.ref) {\n return { id: block.ref, description: \"(ref — not locally resolved)\" }\n }\n return { id: JSON.stringify(raw), description: \"(unknown ref shape)\" }\n}\n\n/**\n * Core logic, extracted for testability.\n * Throws with `{ error, message }` on `agent_not_found`.\n */\nexport async function selfInspect(\n agentId: string,\n workspace: string,\n): Promise<SelfInspectResult> {\n const agentPath = join(workspace, \".agents\", agentId, \"AGENT.md\")\n\n let handle: Awaited<ReturnType<typeof agentVerbs.load>>[\"handle\"]\n try {\n const result = await agentVerbs.load(agentPath)\n handle = result.handle\n } catch (err) {\n const e = new Error(\n `No AGENT.md found for agent '${agentId}' at '${agentPath}'. ` +\n `Ensure an AGENT.md exists at <workspace>/.agents/${agentId}/AGENT.md.`,\n )\n ;(e as NodeJS.ErrnoException).code = \"agent_not_found\"\n throw e\n }\n\n const rawTools = (handle.tools ?? []) as unknown[]\n const rawRoutines = (handle.routines ?? []) as unknown[]\n\n const [tools, routines] = await Promise.all([\n Promise.all(rawTools.map((r) => summarizeToolRef(r, workspace))),\n Promise.all(rawRoutines.map((r) => summarizeRoutineRef(r, workspace))),\n ])\n\n return { agentPath, tools, routines }\n}\n\n/**\n * Register the `self_inspect` MCP tool on `server`.\n *\n * The workspace path is injected at registration time; the agent only needs to\n * supply its logical `id` at call time — not a disk path. This is called from\n * `createMcpServer` whenever a workspace is provided.\n */\nexport function registerSelfInspectTool(\n server: McpServer,\n opts: { workspace: string },\n): void {\n server.tool(\n \"self_inspect\",\n \"Return this agent's AIP-42 manifest summary (tools + routines) without requiring knowledge of disk paths. \" +\n \"Pass the agent's logical `id` (the `id:` field in its AGENT.md frontmatter); the runtime resolves it to \" +\n \"`<workspace>/.agents/<agentId>/AGENT.md`. Returns `{ agentPath, tools, routines }` — each item has at \" +\n \"minimum `{ id, description }`. File refs are loaded; string/ref refs are surfaced as-is.\",\n {\n agentId: z\n .string()\n .min(1)\n .describe(\n \"The agent's logical id (e.g. 'writer'). Matches the `id:` field in the AGENT.md frontmatter. \" +\n \"The runtime resolves this to `<workspace>/.agents/<agentId>/AGENT.md` — \" +\n \"you do not need to know the absolute disk path.\",\n ),\n },\n async ({ agentId }) => {\n try {\n const result = await selfInspect(agentId, opts.workspace)\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify({ error: \"agent_not_found\", message }, null, 2),\n },\n ],\n isError: true,\n }\n }\n },\n )\n}\n","/**\n * @agentproto/mcp-server — exposes AIP doctype verbs as MCP tools.\n *\n * Hand a list of `DoctypeSpec` instances (one per registered AIP) and\n * optionally a workspace dir; the server registers\n * `create_<name> / load_<name> / list_<name> / update_<name> /\n * resolve_<name> / delete_<name>` for each spec, including AIP-40\n * extensions auto-loaded from `<workspace>/extensions/<slug>/EXTENSION.md`.\n *\n * Two ways to run it:\n * 1. **Embedded** — call `createMcpServer({ specs, workspace })` and\n * attach to your own transport (stdio, websocket, …).\n * 2. **Standalone** — `runStdioServer({ specs, workspace })` wires\n * stdio for you. Useful as a `mcp_servers.<id>` config entry on\n * Claude Desktop / Cursor / any MCP host.\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\"\nimport { z } from \"zod\"\nimport { existsSync } from \"node:fs\"\nimport { readFile } from \"node:fs/promises\"\nimport { isAbsolute, join, resolve } from \"node:path\"\nimport { createVerbs, type DoctypeSpec } from \"@agentproto/manifest\"\nimport {\n parseExtensionManifest,\n specFromExtension,\n} from \"@agentproto/extension\"\nimport { registerSelfInspectTool } from \"./self-inspect-tool.js\"\n\n// `RegisterableSpec<TParams, THandle>` is just `DoctypeSpec` plus the\n// constraint that callers passing different generics across the array\n// must type-erase via `as unknown as DoctypeSpec<...>` at the boundary.\n// We don't try to express the heterogeneous list in TS — same trick\n// `@agentproto/driver`'s `implementations[]` uses.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnySpec = DoctypeSpec<any, any>\n\nexport interface CreateMcpServerOptions {\n /** Doctype specs registered as MCP tools. One per AIP. */\n specs: readonly AnySpec[]\n /**\n * Optional workspace dir. If provided, the server scans\n * `<workspace>/extensions/` for `EXTENSION.md` files and registers\n * each as a local doctype. The parent of each extension is resolved\n * by matching the extension's `extends:` field (`aip-N`) against\n * `specs.find(s => s.aip === N)` — so the spec list MUST include the\n * parents the extensions reference, else loading throws.\n */\n workspace?: string\n /** Server name advertised over MCP. Default `agentproto-mcp-server`. */\n name?: string\n /** Server version advertised over MCP. Default `0.1.0-alpha`. */\n version?: string\n}\n\nexport interface CreateMcpServerResult {\n /** The wired McpServer; attach a transport to start serving. */\n server: McpServer\n /**\n * The list of doctype names the server registered tools for —\n * useful for tests + diagnostics. Includes any extensions loaded\n * from `workspace/extensions/`.\n */\n registered: readonly string[]\n}\n\nexport async function createMcpServer(\n opts: CreateMcpServerOptions,\n): Promise<CreateMcpServerResult> {\n const server = new McpServer({\n name: opts.name ?? \"agentproto-mcp-server\",\n version: opts.version ?? \"0.1.0-alpha\",\n })\n\n const allSpecs: AnySpec[] = [...opts.specs]\n\n // Load extensions when a workspace is given.\n if (opts.workspace) {\n const extensions = await loadExtensions(opts.workspace, opts.specs)\n allSpecs.push(...extensions)\n }\n\n // Path-anchoring: when a workspace is set, resolve all relative\n // dir/path arguments against it. Agents pass logical paths like\n // \"tools\" or \"tools/echo/TOOL.md\"; the server pins them to the\n // workspace so they don't leak into process.cwd() (which is\n // wherever the host happened to spawn the server).\n const anchor = (p: string): string =>\n isAbsolute(p) || !opts.workspace ? p : join(opts.workspace, p)\n\n for (const spec of allSpecs) {\n registerVerbs(server, spec, anchor)\n }\n\n // self_inspect: contextual tool injected when a workspace is provided so\n // agents can query their own AIP-42 manifest by logical id — no disk path\n // knowledge required.\n if (opts.workspace) {\n registerSelfInspectTool(server, { workspace: opts.workspace })\n }\n\n return {\n server,\n registered: allSpecs.map((s) => s.name),\n }\n}\n\n/**\n * Wire `createMcpServer` to stdio for use as an `mcp_servers.<id>`\n * entry on Claude Desktop / Cursor / etc. Resolves once the\n * transport closes.\n */\nexport async function runStdioServer(\n opts: CreateMcpServerOptions,\n): Promise<void> {\n const { server } = await createMcpServer(opts)\n const transport = new StdioServerTransport()\n await server.connect(transport)\n}\n\nexport {\n toMcpTool,\n buildMcpTool,\n type ToMcpToolOptions,\n type McpToolRegistration,\n} from \"./to-mcp-tool.js\"\nexport {\n registerSelfInspectTool,\n selfInspect,\n summarizeToolRef,\n summarizeRoutineRef,\n type RefSummary,\n type SelfInspectResult,\n} from \"./self-inspect-tool.js\"\n\n// ── verb registration ───────────────────────────────────────────────\n\nfunction registerVerbs(\n server: McpServer,\n spec: AnySpec,\n anchor: (p: string) => string,\n): void {\n const verbs = createVerbs(spec)\n // Tool name uses snake_case to match MCP convention; spec.name may\n // be kebab (driver-cli) or namespaced (acme:deal). Map all to snake.\n const verbName = (verb: string) =>\n `${verb}_${spec.name.replace(/[-:]/g, \"_\")}`\n const description = (verb: string, body: string) =>\n `${verb} the AIP-${spec.aip} ${spec.name} doctype. ${body}`\n\n // create\n server.tool(\n verbName(\"create\"),\n description(\n \"create\",\n \"Author a new manifest from params. Returns { path, rendered }.\",\n ),\n {\n params: z\n .record(z.string(), z.unknown())\n .describe(`The ${spec.name} definition fields.`),\n dir: z.string().describe(\"Workspace-relative or absolute target directory.\"),\n body: z\n .string()\n .optional()\n .describe(\"Markdown body after the frontmatter. Defaults to a stub.\"),\n dryRun: z\n .boolean()\n .optional()\n .describe(\"Render only — don't write to disk.\"),\n },\n async ({ params, dir, body, dryRun }) => {\n const result = await verbs.create(params, {\n dir: anchor(dir),\n body,\n dryRun,\n })\n return contentText({\n path: result.path,\n rendered: result.rendered,\n })\n },\n )\n\n // load\n server.tool(\n verbName(\"load\"),\n description(\"load\", \"Read a manifest from disk. Returns the parsed handle.\"),\n {\n path: z.string().describe(\"Absolute or workspace-relative path to the .md file.\"),\n },\n async ({ path }) => {\n const result = await verbs.load(anchor(path))\n return contentText({ path: result.path, handle: result.handle })\n },\n )\n\n // list\n server.tool(\n verbName(\"list\"),\n description(\n \"list\",\n \"Walk a directory tree and return all manifests of this doctype.\",\n ),\n {\n dir: z.string().describe(\"Directory to walk.\"),\n skipDirs: z\n .array(z.string())\n .optional()\n .describe(\"Subdir names to skip (default: node_modules, .git, dist).\"),\n },\n async ({ dir, skipDirs }) => {\n const handles = await verbs.list(anchor(dir), { skipDirs })\n return contentText({ count: handles.length, handles })\n },\n )\n\n // update\n server.tool(\n verbName(\"update\"),\n description(\n \"update\",\n \"Patch an existing manifest. The patch is shallow-merged into the existing params.\",\n ),\n {\n path: z.string().describe(\"Path to the manifest to update.\"),\n patch: z\n .record(z.string(), z.unknown())\n .describe(\"Partial fields to merge into the existing manifest.\"),\n body: z.string().optional().describe(\"New body markdown (default: keep existing).\"),\n },\n async ({ path, patch, body }) => {\n const result = await verbs.update(\n anchor(path),\n (existing: Record<string, unknown>) => ({ ...existing, ...patch }),\n { body },\n )\n return contentText({ path: result.path, rendered: result.rendered })\n },\n )\n\n // resolve\n server.tool(\n verbName(\"resolve\"),\n description(\n \"resolve\",\n \"Resolve an inline | ref | file block to a fully-typed handle.\",\n ),\n {\n block: z\n .union([\n z.object({ inline: z.record(z.string(), z.unknown()) }),\n z.object({ ref: z.string() }),\n z.object({ file: z.string() }),\n ])\n .describe(\n 'The composition block. Exactly one of: { \"inline\": {...params} } | { \"ref\": \"@scope/id\" } | { \"file\": \"relative/path.md\" }. Omitting the wrapping key causes invalid_union.',\n ),\n baseDir: z\n .string()\n .optional()\n .describe(\"Base dir for `file:` references.\"),\n },\n async ({ block, baseDir }) => {\n const handle = await verbs.resolve(block, {\n baseDir: baseDir ? anchor(baseDir) : undefined,\n })\n return contentText({ handle })\n },\n )\n\n // delete\n server.tool(\n verbName(\"delete\"),\n description(\"delete\", \"Remove a manifest file from disk.\"),\n {\n path: z.string().describe(\"Path to the manifest to delete.\"),\n },\n async ({ path }) => {\n const target = anchor(path)\n await verbs.delete(target)\n return contentText({ deleted: target })\n },\n )\n}\n\n// ── extension loader ────────────────────────────────────────────────\n\nasync function loadExtensions(\n workspace: string,\n specs: readonly AnySpec[],\n): Promise<AnySpec[]> {\n const extDir = resolve(workspace, \"extensions\")\n if (!existsSync(extDir)) return []\n\n const out: AnySpec[] = []\n const { readdir } = await import(\"node:fs/promises\")\n type SimpleDirent = { name: string; isDirectory(): boolean }\n\n let entries: SimpleDirent[]\n try {\n entries = (await readdir(extDir, {\n withFileTypes: true,\n })) as unknown as SimpleDirent[]\n } catch {\n return out\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue\n const manifestPath = join(extDir, String(entry.name), \"EXTENSION.md\")\n if (!existsSync(manifestPath)) continue\n\n const source = await readFile(manifestPath, \"utf8\")\n const parsed = parseExtensionManifest(source)\n const ext = parsed.frontmatter\n\n let parent: AnySpec | undefined\n if (ext.extends && ext.extends !== \"none\") {\n const aipMatch = ext.extends.match(/^aip-(\\d+)$/)\n if (!aipMatch) {\n throw new Error(\n `mcp-server: extension '${ext.slug}' has invalid extends '${ext.extends}'`,\n )\n }\n const parentAip = Number(aipMatch[1])\n parent = specs.find((s) => s.aip === parentAip)\n if (!parent) {\n throw new Error(\n `mcp-server: extension '${ext.slug}' extends aip-${parentAip}, but no spec for that AIP was registered. Pass the parent spec in opts.specs.`,\n )\n }\n }\n\n out.push(specFromExtension(ext, { parent }) as AnySpec)\n }\n\n return out\n}\n\n// ── tool result helpers ─────────────────────────────────────────────\n\nfunction contentText(payload: unknown): {\n content: Array<{ type: \"text\"; text: string }>\n} {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(payload, null, 2),\n },\n ],\n }\n}\n","/**\n * `.agentproto/` config dir — runtime-managed state at the root of\n * every workspace. Mirrors the `.git/` model: user-content stays at\n * the workspace root (HEARTBEAT.md, conversations/, .agents/) while\n * everything the runtime owns lives in `<workspace>/.agentproto/`.\n *\n * What goes here today:\n * - `runtime.json` — boot-time snapshot of the live config (PID,\n * port, resolved workspace, MCP server name, startedAt). Useful\n * for `cat .agentproto/runtime.json` diagnostics + future tooling\n * that wants to discover a running gateway from disk.\n *\n * What does NOT go here:\n * - HEARTBEAT.md — user-edited content\n * - conversations/ — user-readable chat history\n * - .agents/ — user-authored manifests\n *\n * The `.agentproto/` dir is safe to gitignore. The `runtime.json`\n * file contains a per-boot bearer token used to gate mutating HTTP\n * routes (POST /sessions/*, WS /sessions/:id/pty). The token lives\n * in RAM + on disk only — never logged. File mode 0600 below; only\n * processes running as the workspace user (and the daemon itself)\n * can read it. A browser-loaded localhost page CAN'T read this file,\n * which is what defends against the localhost-DNS-rebinding drive-by\n * spawn vector.\n */\n\nimport { mkdir, readFile, stat, unlink, writeFile } from \"node:fs/promises\"\nimport { join } from \"node:path\"\n\nexport interface RuntimeMeta {\n /** Absolute path to the workspace root the gateway is bound to. */\n workspace: string\n /** HTTP listener port. */\n port: number\n /** HTTP bind address (loopback or `0.0.0.0`). */\n bind: string\n /** Process id of the running gateway. */\n pid: number\n /** Wall-clock ISO timestamp at boot. */\n startedAt: string\n /** MCP server name advertised in the initialize handshake. */\n name: string\n /** AIP doctype names + extensions registered as MCP CRUD tools. */\n registered: readonly string[]\n /**\n * Per-boot bearer token. Required on mutating routes (POST\n * /sessions/*, POST /sessions/:id/kill, DELETE /sessions/:id, and\n * WS upgrade to /sessions/:id/pty). Random uuid generated at boot\n * by createGateway; regenerated each restart.\n */\n token: string\n}\n\n/**\n * Create `<workspace>/.agentproto/` (idempotent) and write the\n * `runtime.json` snapshot. Errors are logged but non-fatal — losing\n * the meta file shouldn't crash the gateway, the runtime is still\n * fully functional without it.\n */\nexport async function writeRuntimeMeta(\n workspace: string,\n meta: RuntimeMeta,\n): Promise<void> {\n const dir = join(workspace, \".agentproto\")\n try {\n await mkdir(dir, { recursive: true })\n // mode 0600 so other local users can't read the bearer token.\n await writeFile(\n join(dir, \"runtime.json\"),\n JSON.stringify(meta, null, 2) + \"\\n\",\n { encoding: \"utf8\", mode: 0o600 },\n )\n } catch (err) {\n console.error(\"[runtime] failed to write .agentproto/runtime.json:\", err)\n }\n}\n\n/**\n * Delete `<workspace>/.agentproto/runtime.json`. Best-effort — called\n * from the daemon's graceful shutdown path so a CLI looking for the\n * live daemon doesn't pick up a stale token after this process exits.\n * Missing file is a no-op (the daemon may never have written one).\n */\nexport async function unlinkRuntimeMeta(workspace: string): Promise<void> {\n try {\n await unlink(join(workspace, \".agentproto\", \"runtime.json\"))\n } catch {\n // ENOENT / permission — not worth surfacing on shutdown.\n }\n}\n\n/**\n * Read a runtime.json from `<workspace>/.agentproto/`. Returns the\n * parsed object (no validation) plus the on-disk mtime, or null when\n * the file is missing / unreadable / malformed.\n */\nexport async function readRuntimeMeta(workspace: string): Promise<{\n meta: Partial<RuntimeMeta> & Record<string, unknown>\n mtime: Date\n} | null> {\n const path = join(workspace, \".agentproto\", \"runtime.json\")\n try {\n const [raw, st] = await Promise.all([readFile(path, \"utf8\"), stat(path)])\n const meta = JSON.parse(raw) as Record<string, unknown>\n return { meta, mtime: st.mtime }\n } catch {\n return null\n }\n}\n\n/**\n * For each `workspace` path, check whether its runtime.json points\n * at a now-dead PID; if so, delete it. Returns the list of paths\n * that were cleaned. Called by `agentproto serve` at boot to keep\n * the discovery layer's view of \"live daemons\" honest — a stale\n * file with the same port as the new daemon is the classic source\n * of `sessions_unauthorized` 401s.\n *\n * Skips the running daemon's own workspace (passed in as\n * `currentWorkspace`) since that file is OURS to write.\n */\nexport async function sweepStaleRuntimeMetas(\n workspaces: readonly string[],\n currentWorkspace: string,\n): Promise<string[]> {\n const cleaned: string[] = []\n for (const ws of workspaces) {\n if (ws === currentWorkspace) continue\n const meta = await readRuntimeMeta(ws)\n if (!meta) continue\n const pid = meta.meta.pid\n if (typeof pid === \"number\" && !isPidAlive(pid)) {\n try {\n await unlink(join(ws, \".agentproto\", \"runtime.json\"))\n cleaned.push(join(ws, \".agentproto\", \"runtime.json\"))\n } catch {\n // ignore — best-effort\n }\n }\n }\n return cleaned\n}\n\nfunction isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0)\n return true\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code\n if (code === \"EPERM\") return true // exists, foreign user\n return false\n }\n}\n","/**\n * Shell-execution MCP tools for the runtime.\n *\n * The runtime is a remote shell as far as cloud agents are concerned —\n * the workspace lives on the user's machine, so the only place a\n * `claude -p`, `gh pr view`, `pnpm test` etc. can actually run *is*\n * the user's machine. This module exposes one MCP tool,\n * `execute_command`, that any MCP client (cloud Guilde Blake,\n * Claude Code as a sub-agent, …) can call to spawn a subprocess.\n *\n * ## Allowlist\n *\n * Default-deny. The runtime reads\n * `<workspace>/.agentproto/allowed-commands.json` on every call (cheap\n * stat; cached for 1s) for the list of allowed command basenames.\n * Missing / empty file ⇒ no commands run. The error message points the\n * user at the file path so they know exactly where to opt in.\n *\n * Allowlist file shape:\n * { \"version\": 1, \"commands\": [\"claude\", \"gh\", \"pnpm\", \"node\"] }\n *\n * Match is by command BASENAME (`/usr/local/bin/claude` → `claude`)\n * to keep the allowlist short and not break when users have multiple\n * binaries on their PATH.\n *\n * ## Safety notes\n *\n * - We use `spawn()` with `shell: false` so arguments are passed\n * verbatim — no shell interpolation surprises.\n * - `cwd` is anchored to the workspace root via the same path-escape\n * guard used by `fs-tools.ts`. Callers can't run a subprocess in\n * `/etc` unless they also bind-mounted it inside the workspace.\n * - Every spawn has a `timeoutMs` cap (default 60s, max 600s). Hung\n * subprocesses can't pin the runtime forever.\n */\n\nimport { spawn } from \"node:child_process\"\nimport { existsSync } from \"node:fs\"\nimport { readFile, stat } from \"node:fs/promises\"\nimport {\n basename,\n isAbsolute,\n join,\n normalize,\n relative,\n resolve,\n} from \"node:path\"\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { z } from \"zod\"\n\nconst DEFAULT_TIMEOUT_MS = 60_000\nconst MAX_TIMEOUT_MS = 600_000\nconst ALLOWLIST_REL = \".agentproto/allowed-commands.json\"\n\nexport interface RegisterCommandToolsOptions {\n workspace: string\n}\n\ninterface AllowlistFile {\n version?: number\n commands?: string[]\n}\n\ninterface AllowlistCacheEntry {\n mtimeMs: number\n commands: Set<string>\n}\n\nlet allowlistCache: { path: string; entry: AllowlistCacheEntry } | null = null\n\nasync function loadAllowlist(workspace: string): Promise<Set<string>> {\n const path = resolve(workspace, ALLOWLIST_REL)\n if (!existsSync(path)) {\n allowlistCache = null\n return new Set()\n }\n try {\n const s = await stat(path)\n if (\n allowlistCache &&\n allowlistCache.path === path &&\n allowlistCache.entry.mtimeMs === s.mtimeMs\n ) {\n return allowlistCache.entry.commands\n }\n const raw = await readFile(path, \"utf8\")\n const parsed = JSON.parse(raw) as AllowlistFile\n const list = Array.isArray(parsed.commands) ? parsed.commands : []\n const commands = new Set(\n list\n .filter((x): x is string => typeof x === \"string\" && x.length > 0)\n .map(x => x.trim()),\n )\n allowlistCache = { path, entry: { mtimeMs: s.mtimeMs, commands } }\n return commands\n } catch (err) {\n // Bad JSON / unreadable file ⇒ deny all and surface in the error\n // the next caller gets. Don't poison the cache.\n console.error(\n `[runtime] failed to load ${ALLOWLIST_REL} (will deny all):`,\n err,\n )\n allowlistCache = null\n return new Set()\n }\n}\n\nfunction makeCwdAnchor(workspace: string): (input: string | undefined) => string {\n const root = resolve(workspace)\n return (input?: string) => {\n if (!input || input.length === 0) return root\n const candidate = isAbsolute(input)\n ? normalize(input)\n : normalize(join(root, input))\n const rel = relative(root, candidate)\n if (rel.startsWith(\"..\") || isAbsolute(rel)) {\n throw new Error(\n `cwd escapes the workspace: '${input}' (workspace=${root})`,\n )\n }\n return candidate\n }\n}\n\nexport interface ExecuteResult {\n exitCode: number\n signal: string | null\n stdout: string\n stderr: string\n truncated?: boolean\n durationMs: number\n}\n\n/**\n * Register `execute_command` on the given MCP server. The tool returns\n * a JSON-encoded `ExecuteResult` as a single text content item — that\n * matches the response shape `@modelcontextprotocol/server-filesystem`\n * uses for `read_file` and friends, so the existing\n * `parseReadFileResponse`-style parsers in workspace-providers can\n * decode it without bespoke logic.\n */\nexport function registerCommandTools(\n server: McpServer,\n opts: RegisterCommandToolsOptions,\n): void {\n const anchorCwd = makeCwdAnchor(opts.workspace)\n\n server.tool(\n \"execute_command\",\n \"Run a shell command on the host running the runtime. The command basename must be in `<workspace>/.agentproto/allowed-commands.json`; default-deny otherwise. Captures stdout / stderr / exit code and returns them as JSON. Use this to drive local CLIs (Claude Code, gh, pnpm, …) from a remote agent.\",\n {\n command: z\n .string()\n .min(1)\n .describe(\n \"Executable name or absolute path. Must be allowlisted by basename in the workspace's allowed-commands.json.\",\n ),\n args: z\n .array(z.string())\n .optional()\n .describe(\n \"Argv array. Passed verbatim — no shell expansion (we spawn with shell:false so quoting doesn't bite).\",\n ),\n cwd: z\n .string()\n .optional()\n .describe(\n \"Working directory, workspace-relative or an absolute path inside the workspace. Defaults to the workspace root.\",\n ),\n stdin: z\n .string()\n .optional()\n .describe(\"Optional input piped to the process's stdin.\"),\n timeoutMs: z\n .number()\n .int()\n .positive()\n .max(MAX_TIMEOUT_MS)\n .optional()\n .describe(\n `Hard kill after this many ms. Defaults to ${DEFAULT_TIMEOUT_MS}; capped at ${MAX_TIMEOUT_MS}.`,\n ),\n },\n async ({ command, args, cwd, stdin, timeoutMs }) => {\n const allowlist = await loadAllowlist(opts.workspace)\n const baseName = basename(command)\n if (!allowlist.has(baseName)) {\n const allowed = [...allowlist].sort().join(\", \") || \"(empty)\"\n throw new Error(\n `command '${baseName}' is not in the allowlist. ` +\n `Add it to ${join(opts.workspace, ALLOWLIST_REL)} ` +\n `under \"commands\": [...]. Currently allowed: ${allowed}.`,\n )\n }\n const resolvedCwd = anchorCwd(cwd)\n const limit = Math.min(timeoutMs ?? DEFAULT_TIMEOUT_MS, MAX_TIMEOUT_MS)\n const result = await runCommand({\n command,\n args: args ?? [],\n cwd: resolvedCwd,\n stdin,\n timeoutMs: limit,\n })\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(result) }],\n }\n },\n )\n}\n\ninterface RunCommandInput {\n command: string\n args: string[]\n cwd: string\n stdin?: string\n timeoutMs: number\n}\n\nconst STREAM_BUFFER_CAP = 1_048_576 // 1 MiB per stream\n\nasync function runCommand(input: RunCommandInput): Promise<ExecuteResult> {\n return new Promise<ExecuteResult>(resolvePromise => {\n const startedAt = Date.now()\n const child = spawn(input.command, input.args, {\n cwd: input.cwd,\n shell: false,\n // Inherit user env so PATH lookups for `claude`, `gh`, etc. work.\n env: process.env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n })\n\n let stdout = \"\"\n let stderr = \"\"\n let truncated = false\n let timedOut = false\n\n function appendCapped(buf: string, chunk: Buffer): string {\n if (buf.length >= STREAM_BUFFER_CAP) {\n truncated = true\n return buf\n }\n const room = STREAM_BUFFER_CAP - buf.length\n const text = chunk.toString(\"utf8\")\n if (text.length > room) {\n truncated = true\n return buf + text.slice(0, room)\n }\n return buf + text\n }\n child.stdout?.on(\"data\", d => {\n stdout = appendCapped(stdout, d)\n })\n child.stderr?.on(\"data\", d => {\n stderr = appendCapped(stderr, d)\n })\n\n if (input.stdin) {\n child.stdin?.write(input.stdin)\n }\n child.stdin?.end()\n\n const timer = setTimeout(() => {\n timedOut = true\n // SIGTERM first; the close handler resolves either way. Ignore\n // EPERM if the child is already gone.\n try {\n child.kill(\"SIGTERM\")\n } catch {\n /* noop */\n }\n // Hard kill 2s later if it hasn't exited.\n setTimeout(() => {\n try {\n child.kill(\"SIGKILL\")\n } catch {\n /* noop */\n }\n }, 2_000).unref()\n }, input.timeoutMs)\n timer.unref()\n\n child.on(\"error\", err => {\n clearTimeout(timer)\n // spawn errors (ENOENT, EACCES) become exitCode -1 with the\n // message in stderr — the JSON shape stays consistent.\n resolvePromise({\n exitCode: -1,\n signal: null,\n stdout,\n stderr: stderr + (stderr ? \"\\n\" : \"\") + (err as Error).message,\n truncated,\n durationMs: Date.now() - startedAt,\n })\n })\n child.on(\"close\", (code, signal) => {\n clearTimeout(timer)\n resolvePromise({\n exitCode: typeof code === \"number\" ? code : -1,\n signal: signal ?? (timedOut ? \"SIGTERM-timeout\" : null),\n stdout,\n stderr,\n truncated,\n durationMs: Date.now() - startedAt,\n })\n })\n })\n}\n","/**\n * Append-only conversation persistence as plain markdown.\n *\n * Each conversation is a file at `<workspace>/conversations/<id>.md`\n * with a frontmatter header (`schema: conversation/v1`, `id`, `agent`,\n * `started`, `status`) and a body composed of `## <role> — <iso>`\n * blocks. Append-only: turns are concatenated to the body, never\n * rewritten in place. Readers tolerant to clock skew use the timestamp\n * in each block, not file mtime.\n *\n * The format is intentionally trivial — git-diffable, human-editable,\n * survives `cat`. Designed to converge with the AIP runtime/v1 spec\n * (TBD) once it lands.\n */\n\nimport { existsSync } from \"node:fs\"\nimport { mkdir, readFile, readdir, writeFile } from \"node:fs/promises\"\nimport { join } from \"node:path\"\n\nconst FRONTMATTER_RE = /^---\\n([\\s\\S]*?)\\n---\\n/\n\nexport type ConvRole = \"user\" | \"assistant\" | \"system\"\n\nexport interface ConversationMeta {\n id: string\n agent: string\n started: string\n status: \"open\" | \"closed\"\n}\n\nexport interface ConversationTurn {\n role: ConvRole\n at: string\n /** Optional sub-attribution after the role (e.g. agent id). */\n attribution?: string\n content: string\n}\n\nexport interface ConversationStore {\n /**\n * Open a conversation. If the file doesn't exist, it's created with\n * a frontmatter header. If it exists, no-op (idempotent).\n */\n open(id: string, meta: { agent: string }): Promise<void>\n appendTurn(\n id: string,\n role: ConvRole,\n content: string,\n opts?: { attribution?: string; at?: string },\n ): Promise<void>\n read(\n id: string,\n ): Promise<{ meta: ConversationMeta; turns: ConversationTurn[] }>\n list(): Promise<Array<{ id: string; meta: ConversationMeta }>>\n /** Workspace-relative path to the conv file, for tooling. */\n pathFor(id: string): string\n}\n\nexport interface FileConversationStoreOptions {\n /** Absolute workspace root. */\n workspace: string\n /** Override `<workspace>/conversations`. */\n dir?: string\n}\n\nexport function fileConversationStore(\n opts: FileConversationStoreOptions,\n): ConversationStore {\n const dir = opts.dir ?? join(opts.workspace, \"conversations\")\n\n const filePath = (id: string) => join(dir, `${id}.md`)\n\n return {\n pathFor: filePath,\n\n async open(id, meta) {\n await mkdir(dir, { recursive: true })\n const path = filePath(id)\n if (existsSync(path)) return\n const header = renderHeader({\n id,\n agent: meta.agent,\n started: new Date().toISOString(),\n status: \"open\",\n })\n await writeFile(path, header, \"utf8\")\n },\n\n async appendTurn(id, role, content, options) {\n const path = filePath(id)\n // Lazy-open: if a caller appends without opening, create the\n // file so the operation never silently drops a turn.\n if (!existsSync(path)) {\n await this.open(id, { agent: options?.attribution ?? \"unknown\" })\n }\n const block = renderTurn({\n role,\n at: options?.at ?? new Date().toISOString(),\n attribution: options?.attribution,\n content,\n })\n // Append a leading blank line so the new block is always\n // separated from whatever's above (header or prev turn).\n await writeFile(path, block, { encoding: \"utf8\", flag: \"a\" })\n },\n\n async read(id) {\n const path = filePath(id)\n const source = await readFile(path, \"utf8\")\n return parseConversation(source, id)\n },\n\n async list() {\n if (!existsSync(dir)) return []\n const entries = await readdir(dir, { withFileTypes: true })\n const out: Array<{ id: string; meta: ConversationMeta }> = []\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith(\".md\")) continue\n const id = entry.name.slice(0, -3)\n try {\n const source = await readFile(join(dir, entry.name), \"utf8\")\n const { meta } = parseConversation(source, id)\n out.push({ id, meta })\n } catch {\n // Skip malformed conv files rather than crash list().\n }\n }\n return out\n },\n }\n}\n\n// ── render ───────────────────────────────────────────────────────────\n\nfunction renderHeader(meta: ConversationMeta): string {\n return [\n \"---\",\n `schema: conversation/v1`,\n `id: ${meta.id}`,\n `agent: ${meta.agent}`,\n `started: ${meta.started}`,\n `status: ${meta.status}`,\n \"---\",\n \"\",\n \"\",\n ].join(\"\\n\")\n}\n\nfunction renderTurn(turn: ConversationTurn): string {\n const heading = turn.attribution\n ? `## ${turn.role} — ${turn.at} (${turn.attribution})`\n : `## ${turn.role} — ${turn.at}`\n return `${heading}\\n\\n${turn.content.trimEnd()}\\n\\n`\n}\n\n// ── parse ────────────────────────────────────────────────────────────\n\ninterface ParsedConversation {\n meta: ConversationMeta\n turns: ConversationTurn[]\n}\n\nfunction parseConversation(source: string, fallbackId: string): ParsedConversation {\n const match = source.match(FRONTMATTER_RE)\n let meta: ConversationMeta = {\n id: fallbackId,\n agent: \"unknown\",\n started: \"\",\n status: \"open\",\n }\n let body = source\n if (match) {\n meta = parseFrontmatter(match[1] ?? \"\", fallbackId)\n body = source.slice(match[0].length)\n }\n\n const turns: ConversationTurn[] = []\n // Split on `## <role> — <iso>` headings. Conservative — anything\n // that doesn't match is treated as continuation of the prior turn.\n const lines = body.split(\"\\n\")\n let current: ConversationTurn | null = null\n let buffer: string[] = []\n\n const flush = () => {\n if (!current) return\n current.content = buffer.join(\"\\n\").trim()\n turns.push(current)\n current = null\n buffer = []\n }\n\n const headingRe =\n /^##\\s+(user|assistant|system)\\s+—\\s+(\\S+)(?:\\s+\\(([^)]+)\\))?\\s*$/\n\n for (const line of lines) {\n const m = line.match(headingRe)\n if (m) {\n flush()\n current = {\n role: m[1] as ConvRole,\n at: m[2] ?? \"\",\n attribution: m[3],\n content: \"\",\n }\n continue\n }\n if (current) buffer.push(line)\n }\n flush()\n\n return { meta, turns }\n}\n\nfunction parseFrontmatter(\n raw: string,\n fallbackId: string,\n): ConversationMeta {\n const out: Record<string, string> = {}\n for (const line of raw.split(\"\\n\")) {\n const colon = line.indexOf(\":\")\n if (colon < 1) continue\n const key = line.slice(0, colon).trim()\n const value = line.slice(colon + 1).trim()\n out[key] = value\n }\n return {\n id: out.id ?? fallbackId,\n agent: out.agent ?? \"unknown\",\n started: out.started ?? \"\",\n status: (out.status === \"closed\" ? \"closed\" : \"open\"),\n }\n}\n","/**\n * In-process event bus for the runtime gateway. Anything the daemon\n * does that an external observer might want to watch (heartbeat fired,\n * conversation turn appended, boot completed, …) flows through here.\n *\n * The HTTP server's `/events` SSE stream subscribes to it and forwards\n * each event as a `data: <json>\\n\\n` frame. Tests and embedded usage\n * subscribe directly via `events.on()`.\n */\n\nimport { EventEmitter } from \"node:events\"\n\nexport interface BootEvent {\n type: \"boot\"\n at: string\n workspace: string\n registered: readonly string[]\n}\n\nexport interface HeartbeatFiredEvent {\n type: \"heartbeat-fired\"\n at: string\n agent: string\n conversationId: string\n prompt: string\n reply: string\n durationMs: number\n}\n\nexport interface HeartbeatErrorEvent {\n type: \"heartbeat-error\"\n at: string\n agent?: string\n error: string\n}\n\nexport interface ConvTurnEvent {\n type: \"conv-turn-appended\"\n at: string\n conversationId: string\n role: \"user\" | \"assistant\"\n contentPreview: string\n}\n\n/**\n * One log line from a supervised tunnel provider (cloudflared today).\n * Surfaced verbatim so users can debug \"why didn't my remote URL come\n * up\" by tailing /events.\n */\nexport interface RemoteLogEvent {\n type: \"remote-log\"\n at: string\n line: string\n}\n\nexport type RuntimeEvent =\n | BootEvent\n | HeartbeatFiredEvent\n | HeartbeatErrorEvent\n | ConvTurnEvent\n | RemoteLogEvent\n\nexport interface RuntimeEvents {\n on<E extends RuntimeEvent[\"type\"]>(\n type: E,\n handler: (ev: Extract<RuntimeEvent, { type: E }>) => void,\n ): () => void\n onAny(handler: (ev: RuntimeEvent) => void): () => void\n emit(ev: RuntimeEvent): void\n}\n\nexport function createRuntimeEvents(): RuntimeEvents {\n const ee = new EventEmitter()\n ee.setMaxListeners(50)\n\n return {\n on(type, handler) {\n const wrapped = (ev: RuntimeEvent) => {\n if (ev.type === type) handler(ev as Extract<RuntimeEvent, { type: typeof type }>)\n }\n ee.on(\"event\", wrapped)\n return () => ee.off(\"event\", wrapped)\n },\n onAny(handler) {\n ee.on(\"event\", handler)\n return () => ee.off(\"event\", handler)\n },\n emit(ev) {\n ee.emit(\"event\", ev)\n },\n }\n}\n","/**\n * Filesystem MCP tools registered on the runtime's MCP server.\n *\n * The runtime already exposes AIP CRUD verbs (create_tool, load_agent, …)\n * via @agentproto/mcp-server. To make the workspace genuinely reachable\n * to remote MCP clients (Guilde cloud agents through a tunnel, IDEs,\n * etc.), we also register canonical filesystem tools that match the\n * shape used by `@modelcontextprotocol/server-filesystem` so existing\n * MCP-fs proxy clients can target the runtime without bespoke logic:\n *\n * read_file ({ path }) → string\n * write_file ({ path, content }) → \"ok\"\n * list_directory ({ path? }) → \"[FILE] x\\n[DIR] y\" lines\n * get_file_info ({ path }) → { name, type, size, modified }\n * create_directory ({ path }) → \"ok\"\n * delete_file ({ path }) → \"ok\"\n *\n * All paths are resolved relative to the workspace root via the same\n * escape guard used by `WorkspaceFs`. Absolute paths inside the root\n * are accepted (so callers that prefix `basePath` with the absolute\n * workspace path keep working).\n */\n\nimport {\n mkdir,\n readFile,\n readdir,\n rm,\n stat,\n writeFile,\n} from \"node:fs/promises\"\nimport { dirname, isAbsolute, join, normalize, relative, resolve } from \"node:path\"\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { z } from \"zod\"\n\nexport interface RegisterFsToolsOptions {\n workspace: string\n}\n\nclass FsPathError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"FsPathError\"\n }\n}\n\nfunction makeAnchor(workspace: string): (input: string) => string {\n const root = resolve(workspace)\n return (input: string) => {\n if (typeof input !== \"string\" || input.length === 0) {\n throw new FsPathError(\"path must be a non-empty string\")\n }\n const candidate = isAbsolute(input)\n ? normalize(input)\n : normalize(join(root, input))\n const rel = relative(root, candidate)\n if (rel.startsWith(\"..\") || isAbsolute(rel)) {\n throw new FsPathError(`path escapes the workspace: '${input}'`)\n }\n return candidate\n }\n}\n\nfunction text(value: string | object): {\n content: Array<{ type: \"text\"; text: string }>\n} {\n return {\n content: [\n {\n type: \"text\",\n text: typeof value === \"string\" ? value : JSON.stringify(value),\n },\n ],\n }\n}\n\nexport function registerFsTools(\n server: McpServer,\n opts: RegisterFsToolsOptions,\n): void {\n const anchor = makeAnchor(opts.workspace)\n\n server.tool(\n \"read_file\",\n \"Read a UTF-8 file from the workspace.\",\n { path: z.string().describe(\"Workspace-relative path to the file.\") },\n async ({ path }) => {\n const abs = anchor(path)\n const buf = await readFile(abs)\n return text(buf.toString(\"utf8\"))\n },\n )\n\n server.tool(\n \"write_file\",\n \"Write a file to the workspace. Parent directories are created on demand.\",\n {\n path: z.string().describe(\"Workspace-relative path to the file.\"),\n content: z.string().describe(\"File body (UTF-8).\"),\n },\n async ({ path, content }) => {\n const abs = anchor(path)\n await mkdir(dirname(abs), { recursive: true })\n await writeFile(abs, content, \"utf8\")\n return text(\"ok\")\n },\n )\n\n server.tool(\n \"list_directory\",\n \"List entries of a directory in the workspace. Returns one '[FILE]' or '[DIR]' line per entry, mirroring `@modelcontextprotocol/server-filesystem`.\",\n {\n path: z\n .string()\n .optional()\n .describe(\"Workspace-relative directory (defaults to workspace root).\"),\n },\n async ({ path }) => {\n const abs = anchor(path && path.length > 0 ? path : \".\")\n const entries = await readdir(abs, { withFileTypes: true })\n const lines = entries.map(e =>\n e.isDirectory() ? `[DIR] ${e.name}` : `[FILE] ${e.name}`,\n )\n return text(lines.join(\"\\n\"))\n },\n )\n\n server.tool(\n \"get_file_info\",\n \"Stat a file or directory in the workspace.\",\n { path: z.string().describe(\"Workspace-relative path.\") },\n async ({ path }) => {\n const abs = anchor(path)\n const info = await stat(abs)\n return text({\n name: abs.split(\"/\").pop() ?? path,\n path,\n type: info.isDirectory() ? \"directory\" : \"file\",\n size: info.size,\n modified: info.mtime.toISOString(),\n created: info.birthtime.toISOString(),\n })\n },\n )\n\n server.tool(\n \"create_directory\",\n \"Create a directory (recursive) in the workspace.\",\n { path: z.string().describe(\"Workspace-relative directory path.\") },\n async ({ path }) => {\n const abs = anchor(path)\n await mkdir(abs, { recursive: true })\n return text(\"ok\")\n },\n )\n\n server.tool(\n \"delete_file\",\n \"Delete a file or empty directory in the workspace.\",\n { path: z.string().describe(\"Workspace-relative path.\") },\n async ({ path }) => {\n const abs = anchor(path)\n await rm(abs, { recursive: true, force: true })\n return text(\"ok\")\n },\n )\n}\n","/**\n * Discover MCP servers already configured in the user's local agent\n * tooling — claude-code, cursor, goose, etc. — so the daemon can\n * surface them in the UI without making the user re-enter the same\n * credentials and URLs they already painstakingly configured for\n * one host.\n *\n * v1 is read-only discovery: we report what's there with source\n * attribution. Future v1.1 ships an \"import to daemon\" verb that\n * proxies the discovered server through the daemon's own /mcp\n * endpoint so every operator (cloud Guilde, local agents) sees a\n * unified set without per-host config drift.\n *\n * Sources scanned (in priority order):\n * - ~/.claude.json (claude-code) — `mcpServers` top-level + nested\n * under `projects[<path>].mcpServers`. Most users land here.\n * - ~/.cursor/mcp.json (cursor) — flat `mcpServers` map.\n * - ~/.config/goose/config.yaml (goose) — TOML/YAML hybrid; we\n * only handle the YAML form for now.\n * - any `.mcp.json` under the user's home that follows the\n * standard mcpServers shape.\n *\n * Each source contributes 0..N entries. Errors are caught + logged\n * (broken JSON, missing files, permission denied) — partial\n * discovery beats failing the whole listing on one bad file.\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { resolve as resolvePath } from \"node:path\"\nimport {\n loadWorkspacesConfig,\n type WorkspaceEntry,\n} from \"./workspaces-config.js\"\n\nexport interface DiscoveredMcp {\n /** Stable id within (source, scope, name) — for de-dupe and\n * cross-call identity (UI treat as React key). */\n id: string\n /** Where we found it. Lets the UI render a source badge. */\n source: \"claude-code\" | \"cursor\" | \"goose\" | \"workspace\"\n /** \"global\" when the entry sits at the top level of the host's\n * config; \"project:<path>\" when it's scoped to a single\n * workspace. claude-code in particular nests per-project. */\n scope: string\n /** The host's name for the entry (key in the mcpServers map). */\n name: string\n /** Wire transport — `stdio` (command + args) or `http` / `sse` (url). */\n type: \"stdio\" | \"http\" | \"sse\" | \"unknown\"\n /** stdio entries: argv to spawn. */\n command?: string\n args?: string[]\n /** stdio entries: env injected into the child. */\n env?: Record<string, string>\n /** http/sse entries: target URL. */\n url?: string\n /** http/sse entries: extra headers (Authorization, etc.). */\n headers?: Record<string, string>\n /** Free-form tags from the source config — claude-code's project\n * scope is the most common. */\n tags?: string[]\n /** Reason field when `type === \"unknown\"` — surfaces why the\n * parser couldn't classify the entry (e.g. neither command nor\n * url present). */\n parseNote?: string\n}\n\nexport interface DiscoverMcpsOptions {\n /** Override the home dir — handy for tests that pin a tmpdir. */\n home?: string\n}\n\nexport async function discoverMcps(\n opts: DiscoverMcpsOptions = {}\n): Promise<DiscoveredMcp[]> {\n const home = opts.home ?? homedir()\n const out: DiscoveredMcp[] = []\n const errors: string[] = []\n await Promise.all([\n scanClaudeCode(home, out, errors),\n scanCursor(home, out, errors),\n scanGoose(home, out, errors),\n scanRegisteredWorkspaces(out, errors),\n ])\n // De-dupe identical entries that show up in multiple scopes\n // (e.g. user copied a project entry to global) — keep the first\n // occurrence so the source attribution stays meaningful.\n const seen = new Set<string>()\n const dedup: DiscoveredMcp[] = []\n for (const m of out) {\n const key = `${m.source}:${m.scope}:${m.name}`\n if (seen.has(key)) continue\n seen.add(key)\n dedup.push(m)\n }\n if (errors.length > 0) {\n // One log line per error — operators can trace which file\n // failed without us bubbling the whole stack into the response.\n for (const e of errors) console.warn(`[mcp-discovery] ${e}`)\n }\n return dedup.sort((a, b) => {\n if (a.source !== b.source) return a.source.localeCompare(b.source)\n if (a.scope !== b.scope) return a.scope.localeCompare(b.scope)\n return a.name.localeCompare(b.name)\n })\n}\n\ninterface RawMcpEntry {\n type?: string\n command?: string\n args?: string[]\n env?: Record<string, string>\n url?: string\n headers?: Record<string, string>\n}\n\n/** claude-code stores entries either at top-level `mcpServers` OR\n * per-project under `projects[<absolute-path>].mcpServers`. We\n * surface both with `scope` set so the UI can group by project. */\nasync function scanClaudeCode(\n home: string,\n out: DiscoveredMcp[],\n errors: string[]\n): Promise<void> {\n const path = resolvePath(home, \".claude.json\")\n let raw: string\n try {\n raw = await fs.readFile(path, \"utf8\")\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return\n errors.push(`claude-code: read ${path} — ${(err as Error).message}`)\n return\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (err) {\n errors.push(`claude-code: JSON parse ${path} — ${(err as Error).message}`)\n return\n }\n if (!parsed || typeof parsed !== \"object\") return\n const root = parsed as Record<string, unknown>\n const top = root.mcpServers\n if (top && typeof top === \"object\") {\n pushMcpMap({\n out,\n source: \"claude-code\",\n scope: \"global\",\n map: top as Record<string, unknown>,\n })\n }\n const projects = root.projects\n if (projects && typeof projects === \"object\") {\n for (const [projPath, proj] of Object.entries(\n projects as Record<string, unknown>\n )) {\n if (!proj || typeof proj !== \"object\") continue\n const projMcps = (proj as Record<string, unknown>).mcpServers\n if (!projMcps || typeof projMcps !== \"object\") continue\n pushMcpMap({\n out,\n source: \"claude-code\",\n scope: `project:${projPath}`,\n map: projMcps as Record<string, unknown>,\n })\n }\n }\n}\n\n/** cursor uses ~/.cursor/mcp.json (standard mcpServers shape).\n * Also supports per-workspace `.cursor/mcp.json` but those need\n * the user's project paths — out of scope for v1. */\nasync function scanCursor(\n home: string,\n out: DiscoveredMcp[],\n errors: string[]\n): Promise<void> {\n const path = resolvePath(home, \".cursor\", \"mcp.json\")\n let raw: string\n try {\n raw = await fs.readFile(path, \"utf8\")\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return\n errors.push(`cursor: read ${path} — ${(err as Error).message}`)\n return\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (err) {\n errors.push(`cursor: JSON parse ${path} — ${(err as Error).message}`)\n return\n }\n if (!parsed || typeof parsed !== \"object\") return\n const root = parsed as Record<string, unknown>\n const map = root.mcpServers\n if (map && typeof map === \"object\") {\n pushMcpMap({\n out,\n source: \"cursor\",\n scope: \"global\",\n map: map as Record<string, unknown>,\n })\n }\n}\n\n/** goose stores config in ~/.config/goose/config.yaml. The full\n * parser is non-trivial (yaml + extension manifests); v1 looks for\n * the simple `extensions:` block with `mcp_servers` declarations\n * and emits a parseNote so the user knows we found goose but\n * punted on the details. */\nasync function scanGoose(\n home: string,\n out: DiscoveredMcp[],\n errors: string[]\n): Promise<void> {\n // ~/.config on macOS / Linux; goose hasn't shipped Windows-native yet.\n const path = resolvePath(home, \".config\", \"goose\", \"config.yaml\")\n try {\n await fs.access(path)\n } catch {\n return\n }\n // We don't ship a yaml parser as a runtime dep — record presence\n // but punt on parsing. The user sees \"goose detected — open\n // ~/.config/goose/config.yaml to inspect entries\" which is enough\n // signal to drive a v2 enhancement.\n out.push({\n id: \"goose:global:_detected\",\n source: \"goose\",\n scope: \"global\",\n name: \"(goose config detected)\",\n type: \"unknown\",\n parseNote:\n \"Goose config found but YAML parsing is not yet implemented. \" +\n \"Open ~/.config/goose/config.yaml to inspect MCP entries.\",\n })\n}\n\n/**\n * Per-workspace scan — for each registered workspace, look at the\n * common per-project MCP locations (.mcp.json, .cursor/mcp.json,\n * .vscode/mcp.json). Lets the UI surface \"this workspace ships\n * its own chrome-devtools MCP\" instead of only\n * showing what the user configured globally in claude/cursor.\n */\nasync function scanRegisteredWorkspaces(\n out: DiscoveredMcp[],\n errors: string[]\n): Promise<void> {\n let workspaces: WorkspaceEntry[] = []\n try {\n const cfg = await loadWorkspacesConfig()\n workspaces = cfg.workspaces\n } catch (err) {\n errors.push(`workspaces: load failed — ${(err as Error).message}`)\n return\n }\n // Walk each workspace + each candidate path. We don't recurse —\n // these are conventional top-level files. Errors per-file are\n // collected; one bad file doesn't fail the rest.\n await Promise.all(\n workspaces.map(async ws => {\n const candidates = [\n resolvePath(ws.path, \".mcp.json\"),\n resolvePath(ws.path, \".cursor\", \"mcp.json\"),\n resolvePath(ws.path, \".vscode\", \"mcp.json\"),\n ]\n for (const path of candidates) {\n let raw: string\n try {\n raw = await fs.readFile(path, \"utf8\")\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") continue\n errors.push(\n `workspace ${ws.slug}: read ${path} — ${(err as Error).message}`\n )\n continue\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (err) {\n errors.push(\n `workspace ${ws.slug}: JSON parse ${path} — ${(err as Error).message}`\n )\n continue\n }\n if (!parsed || typeof parsed !== \"object\") continue\n const map = (parsed as Record<string, unknown>).mcpServers\n if (!map || typeof map !== \"object\") continue\n pushMcpMap({\n out,\n source: \"workspace\",\n scope: `workspace:${ws.slug}`,\n map: map as Record<string, unknown>,\n })\n }\n })\n )\n}\n\nfunction pushMcpMap(args: {\n out: DiscoveredMcp[]\n source: DiscoveredMcp[\"source\"]\n scope: string\n map: Record<string, unknown>\n}): void {\n for (const [name, raw] of Object.entries(args.map)) {\n if (!raw || typeof raw !== \"object\") continue\n const entry = raw as RawMcpEntry\n const id = `${args.source}:${args.scope}:${name}`\n const declared = typeof entry.type === \"string\" ? entry.type : null\n const url = typeof entry.url === \"string\" ? entry.url : undefined\n const command = typeof entry.command === \"string\" ? entry.command : undefined\n let type: DiscoveredMcp[\"type\"]\n if (declared === \"http\" || declared === \"sse\" || declared === \"stdio\") {\n type = declared\n } else if (url) {\n type = \"http\"\n } else if (command) {\n type = \"stdio\"\n } else {\n type = \"unknown\"\n }\n const m: DiscoveredMcp = {\n id,\n source: args.source,\n scope: args.scope,\n name,\n type,\n }\n if (command !== undefined) m.command = command\n if (Array.isArray(entry.args)) {\n m.args = entry.args.filter((a): a is string => typeof a === \"string\")\n }\n if (entry.env && typeof entry.env === \"object\") {\n m.env = stringifyValues(entry.env)\n }\n if (url !== undefined) m.url = url\n if (entry.headers && typeof entry.headers === \"object\") {\n m.headers = stringifyValues(entry.headers)\n }\n if (type === \"unknown\") {\n m.parseNote =\n \"Entry has neither `command` nor `url` — couldn't classify transport.\"\n }\n args.out.push(m)\n }\n}\n\nfunction stringifyValues(\n raw: Record<string, unknown>\n): Record<string, string> {\n const out: Record<string, string> = {}\n for (const [k, v] of Object.entries(raw)) {\n if (typeof v === \"string\") out[k] = v\n else if (v != null) out[k] = String(v)\n }\n return out\n}\n","/**\n * MCP tools that expose the sessions registry to agents connected to\n * the daemon. Lets a remote operator (Mastra agent in cloud Guilde,\n * Claude Code as a sub-agent, …) spawn + drive agent CLIs on the\n * user's machine through the same MCP connection they already use\n * for fs/exec.\n *\n * Five tools:\n * start_agent_session spawn a long-running agent (claude / hermes / …)\n * prompt_agent_session send a follow-up turn to a live session\n * list_agent_sessions browse alive + recent sessions\n * get_agent_session_output tail the ring buffer\n * kill_agent_session SIGTERM the session\n *\n * Auth: same as every other daemon tool — gated by the gateway's\n * auth source (loopback bypass when no tunnel is up).\n */\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { z } from \"zod\"\nimport type { SessionsRegistry } from \"./sessions.js\"\nimport type {\n AgentAdapterResolver,\n AgentAdapterLister,\n} from \"./http-server.js\"\nimport {\n loadWorkspacesConfig,\n findWorkspace,\n getActiveWorkspace,\n} from \"./workspaces-config.js\"\nimport { discoverMcps } from \"./mcp-discovery.js\"\nimport {\n loadImportedMcps,\n saveImportedMcps,\n addImport,\n removeImport,\n} from \"./mcp-imports.js\"\nimport type { McpProxyRegistry } from \"./mcp-proxy.js\"\n\ninterface RegisterSessionToolsOptions {\n registry: SessionsRegistry\n /** Optional adapter resolver — required for `start_agent_session`\n * (the others work with raw spawn sessions too). When unset the\n * start tool returns a clear error pointing at the host wiring. */\n resolveAgentAdapter?: AgentAdapterResolver\n /** Optional adapter lister — when wired, exposes `list_adapters`\n * MCP tool. Without it the tool returns a clear \"not configured\"\n * error pointing at the host wiring. */\n listAgentAdapters?: AgentAdapterLister\n /** Optional MCP proxy registry — when wired, exposes 3 tools that\n * let the operator drive imported MCPs (chrome-devtools, goose-bridge,\n * …) through the daemon as a single MCP entry point. */\n mcpProxy?: McpProxyRegistry\n /** Whether the registry was constructed with a PTY factory — when\n * true, expose the four terminal session tools. When false, the\n * tools return a clear \"not configured\" error. */\n ptyEnabled?: boolean\n}\n\nexport function registerSessionTools(\n server: McpServer,\n opts: RegisterSessionToolsOptions\n): void {\n const { registry, resolveAgentAdapter, listAgentAdapters, mcpProxy } = opts\n const ptyEnabled = opts.ptyEnabled === true\n\n // ── start_agent_session ────────────────────────────────────────\n server.tool(\n \"start_agent_session\",\n \"Spawn a long-running agent CLI (claude-code, hermes, …) on the host. \" +\n \"The session stays alive across multiple turns — call `prompt_agent_session` \" +\n \"to continue the conversation. Returns the session id + initial descriptor. \" +\n \"When `workspaceSlug` is set, resolves the cwd via \" +\n \"`~/.agentproto/workspaces.json`; otherwise pass `cwd` explicitly or \" +\n \"fall back to the active workspace.\",\n {\n adapter: z\n .string()\n .min(1)\n .describe(\n \"Adapter slug — one of the installed `@agentproto/adapter-*` packages \" +\n \"(e.g. 'claude-code', 'hermes', 'aider').\"\n ),\n workspaceSlug: z\n .string()\n .optional()\n .describe(\n \"Workspace slug from `agentproto workspace list`. The daemon resolves it \" +\n \"to an absolute path. Omit to use the `cwd` field or the active workspace.\"\n ),\n cwd: z\n .string()\n .optional()\n .describe(\n \"Absolute path to spawn the agent in. Wins over `workspaceSlug` when both are set.\"\n ),\n prompt: z\n .string()\n .optional()\n .describe(\n \"Optional initial prompt. The session is spawned and the prompt dispatched \" +\n \"in one shot — equivalent to `start` then `prompt` back-to-back. Skip to spawn idle.\"\n ),\n label: z\n .string()\n .optional()\n .describe(\n \"Free-text label that surfaces in `list_agent_sessions` and the UI — useful \" +\n \"for tagging sessions with a conversation id or operator name.\"\n ),\n },\n async input => {\n if (!resolveAgentAdapter) {\n return {\n content: [\n {\n type: \"text\",\n text:\n \"start_agent_session is not enabled — the daemon was started without \" +\n \"an adapter resolver. Re-run the daemon with the `@agentproto/cli` \" +\n \"shim wired (see playground/scripts/gateway.ts).\",\n },\n ],\n isError: true,\n }\n }\n // cwd resolution mirrors the HTTP route: explicit cwd wins,\n // then workspaceSlug lookup, then active workspace, then a\n // hard error (the operator probably forgot a step).\n let cwd = input.cwd\n let resolvedSlug = input.workspaceSlug ?? \"default\"\n if (!cwd) {\n try {\n const config = await loadWorkspacesConfig()\n const ws = input.workspaceSlug\n ? findWorkspace(config, input.workspaceSlug)\n : getActiveWorkspace(config)\n if (ws) {\n cwd = ws.path\n resolvedSlug = ws.slug\n }\n } catch {\n // fall through to error below\n }\n }\n if (!cwd) {\n return {\n content: [\n {\n type: \"text\",\n text:\n \"start_agent_session: no cwd resolvable. Pass `cwd` explicitly, \" +\n \"or pass `workspaceSlug` matching `agentproto workspace list`, \" +\n \"or set an active workspace via `agentproto workspace use <slug>`.\",\n },\n ],\n isError: true,\n }\n }\n const resolved = await resolveAgentAdapter(input.adapter)\n if (!resolved) {\n return {\n content: [\n {\n type: \"text\",\n text: `start_agent_session: adapter \"${input.adapter}\" not found. Try \\`agentproto install <slug>\\` first.`,\n },\n ],\n isError: true,\n }\n }\n try {\n const agentSession = await resolved.startSession({ cwd })\n const desc = registry.spawnAgent({\n workspaceSlug: resolvedSlug,\n cwd,\n agentSession,\n adapterSlug: input.adapter,\n ...(input.prompt ? { initialPrompt: input.prompt } : {}),\n ...(input.label ? { label: input.label } : {}),\n ...(resolved.commandPreview\n ? { commandPreview: resolved.commandPreview }\n : {}),\n })\n return {\n content: [{ type: \"text\", text: JSON.stringify(desc, null, 2) }],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `start_agent_session: spawn failed — ${\n err instanceof Error ? err.message : String(err)\n }`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── prompt_agent_session ───────────────────────────────────────\n server.tool(\n \"prompt_agent_session\",\n \"Send a follow-up prompt to a live agent session — multi-turn continuity \" +\n \"without re-spawning. The session id comes from `start_agent_session` \" +\n \"(or `list_agent_sessions`). Returns immediately; tail output via \" +\n \"`get_agent_session_output` or the SSE /sessions/:id/stream endpoint.\",\n {\n sessionId: z.string().describe(\"Session id returned by start_agent_session.\"),\n prompt: z.string().min(1).describe(\"The next user turn (plain text).\"),\n },\n async input => {\n try {\n // Note: sendPrompt awaits the full turn (drains the event\n // stream into the ring buffer). For long turns the operator\n // would prefer fire-and-forget — kick the promise without\n // awaiting and report \"queued\". The caller polls\n // get_agent_session_output for completion.\n void registry.sendPrompt(input.sessionId, input.prompt).catch(() => {\n // Errors land in the ring buffer; nothing to do here.\n })\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n { ok: true, sessionId: input.sessionId, queued: true },\n null,\n 2\n ),\n },\n ],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `prompt_agent_session: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── list_sessions (canonical lister) ──────────────────────────\n server.tool(\n \"list_sessions\",\n \"List sessions tracked by the daemon — agent-CLI sessions (claude-code, \" +\n \"hermes, …), terminal/PTY sessions (claude TUI, bash, …), and raw \" +\n \"commands. Each entry includes `kind`, `pty` (true for real PTYs), \" +\n \"`name` (when set at spawn), `status`, `command`, age + exit code. Use \" +\n \"this when you need to know what's already running before spawning \" +\n \"anything new, or to discover a session id by name.\",\n {\n kind: z\n .enum([\"terminal\", \"agent-cli\", \"command\", \"all\"])\n .optional()\n .describe(\n \"Filter by session kind. `all` (default) returns every kind. \" +\n \"Use `terminal` to list only PTY sessions, `agent-cli` for \" +\n \"structured ACP agents.\",\n ),\n onlyAlive: z\n .boolean()\n .optional()\n .describe(\"When true, only running/starting sessions. Default false.\"),\n status: z\n .enum([\"starting\", \"running\", \"exited\", \"killed\", \"error\"])\n .optional()\n .describe(\"Filter by exact status (overrides onlyAlive).\"),\n },\n async input => {\n let rows = registry.list()\n if (input.kind && input.kind !== \"all\") {\n rows = rows.filter(s => s.kind === input.kind)\n }\n if (input.status) {\n rows = rows.filter(s => s.status === input.status)\n } else if (input.onlyAlive) {\n rows = rows.filter(\n s => s.status === \"running\" || s.status === \"starting\",\n )\n }\n return {\n content: [\n { type: \"text\", text: JSON.stringify({ sessions: rows }, null, 2) },\n ],\n }\n },\n )\n\n // ── list_agent_sessions (kept for backwards compatibility) ─────\n server.tool(\n \"list_agent_sessions\",\n \"DEPRECATED — prefer `list_sessions` which returns ALL kinds + filters. \" +\n \"Despite the name this tool already returns every kind, not just \" +\n \"agent-cli sessions; the new tool's name reflects the actual surface.\",\n {\n onlyAlive: z\n .boolean()\n .optional()\n .describe(\"Filter to status running/starting only. Default false.\"),\n },\n async input => {\n const all = registry.list()\n const filtered = input.onlyAlive\n ? all.filter(s => s.status === \"running\" || s.status === \"starting\")\n : all\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ sessions: filtered }, null, 2),\n },\n ],\n }\n }\n )\n\n // ── get_agent_session_output ───────────────────────────────────\n server.tool(\n \"get_agent_session_output\",\n \"Tail the recent output of a session. Returns the last N lines of the \" +\n \"ring buffer (stdout + stderr inter-leaved, newest last). Use this to read \" +\n \"an agent's reply after `prompt_agent_session`.\",\n {\n sessionId: z.string().describe(\"Session id.\"),\n lastN: z\n .number()\n .int()\n .min(1)\n .max(500)\n .optional()\n .describe(\"Max lines to return. Default 80, max 500.\"),\n },\n async input => {\n const desc = registry.get(input.sessionId)\n if (!desc) {\n return {\n content: [\n { type: \"text\", text: `get_agent_session_output: no session \"${input.sessionId}\"` },\n ],\n isError: true,\n }\n }\n // Best-effort tail — re-attach with a temp listener, capture\n // backfill (which is the recent ring buffer), unsubscribe.\n const limit = input.lastN ?? 80\n const lines: string[] = []\n const unsub = registry.attach(input.sessionId, (line, _stream) => {\n lines.push(line)\n })\n if (unsub) unsub()\n const tail = lines.slice(-limit)\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n {\n sessionId: input.sessionId,\n status: desc.status,\n lastOutputAt: desc.lastOutputAt,\n lines: tail,\n },\n null,\n 2\n ),\n },\n ],\n }\n }\n )\n\n // ── list_adapters ──────────────────────────────────────────────\n server.tool(\n \"list_adapters\",\n \"Enumerate every agent CLI adapter installed on the host (claude-code, \" +\n \"hermes, aider, …). Returns slug + display name + version + protocol so \" +\n \"callers can let users pick from the installed set instead of guessing. \" +\n \"Use before `start_agent_session` when the model doesn't already know \" +\n \"what's available.\",\n {},\n async () => {\n if (!listAgentAdapters) {\n return {\n content: [\n {\n type: \"text\",\n text:\n \"list_adapters is not enabled — the daemon was started without \" +\n \"an adapter lister. Wire `@agentproto/cli`'s \" +\n \"`listInstalledAdapters` via `createGateway({ listAgentAdapters })`.\",\n },\n ],\n isError: true,\n }\n }\n try {\n const adapters = await listAgentAdapters()\n return {\n content: [{ type: \"text\", text: JSON.stringify({ adapters }, null, 2) }],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `list_adapters failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── list_discovered_mcps ───────────────────────────────────────\n server.tool(\n \"list_discovered_mcps\",\n \"Discover MCP servers already configured in the user's other agent \" +\n \"tooling (claude-code, cursor, goose). Returns the union with source \" +\n \"attribution so the operator can suggest 'I see you have a chrome-devtools \" +\n \"MCP set up in claude — want me to use it?' instead of asking the user \" +\n \"to re-configure. Read-only — does not modify any host's config.\",\n {},\n async () => {\n try {\n const mcps = await discoverMcps()\n return {\n content: [{ type: \"text\", text: JSON.stringify({ mcps }, null, 2) }],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `list_discovered_mcps failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── list_imported_mcps ─────────────────────────────────────────\n server.tool(\n \"list_imported_mcps\",\n \"Return the user's curated set of MCP servers — the ones they've \" +\n \"imported from claude / cursor / workspace configs into the daemon. \" +\n \"Use to know which MCPs the operator may freely call vs. ones still \" +\n \"showing up in `list_discovered_mcps` waiting on the user's blessing.\",\n {},\n async () => {\n try {\n const config = await loadImportedMcps()\n return {\n content: [\n { type: \"text\", text: JSON.stringify(config, null, 2) },\n ],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `list_imported_mcps failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── import_mcp ─────────────────────────────────────────────────\n server.tool(\n \"import_mcp\",\n \"Import a discovered MCP into the daemon's curated set. The agent \" +\n \"calls `list_discovered_mcps` first, asks the user, then commits the \" +\n \"choice via this tool. The snapshot is captured at import time so \" +\n \"the entry stays usable if the source config (claude/cursor) is \" +\n \"later removed.\",\n {\n sourceMcpId: z\n .string()\n .min(1)\n .describe(\n \"The discovered MCP id from `list_discovered_mcps` \" +\n \"(e.g. 'claude-code:project:/path:chrome-devtools').\"\n ),\n alias: z\n .string()\n .optional()\n .describe(\n \"Optional friendly name to display. Defaults to the source MCP's name.\"\n ),\n },\n async input => {\n try {\n const discovered = await discoverMcps()\n const snapshot = discovered.find(d => d.id === input.sourceMcpId)\n if (!snapshot) {\n return {\n content: [\n {\n type: \"text\",\n text: `import_mcp: discovered MCP \"${input.sourceMcpId}\" not found. Re-run list_discovered_mcps to get current ids.`,\n },\n ],\n isError: true,\n }\n }\n const cfg = await loadImportedMcps()\n const next = addImport(cfg, {\n snapshot,\n ...(input.alias ? { alias: input.alias } : {}),\n })\n await saveImportedMcps(next)\n const entry = next.imports.find(e => e.id === snapshot.id)\n return {\n content: [{ type: \"text\", text: JSON.stringify(entry, null, 2) }],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `import_mcp failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── remove_imported_mcp ────────────────────────────────────────\n server.tool(\n \"remove_imported_mcp\",\n \"Remove a previously-imported MCP from the daemon's curated set. \" +\n \"Use when the user no longer wants the operator referencing it.\",\n {\n id: z\n .string()\n .min(1)\n .describe(\n \"The imported MCP id (matches the discovered MCP id at import time).\"\n ),\n },\n async input => {\n try {\n const cfg = await loadImportedMcps()\n if (!cfg.imports.some(e => e.id === input.id)) {\n return {\n content: [\n {\n type: \"text\",\n text: `remove_imported_mcp: id \"${input.id}\" not in imports. Use list_imported_mcps to see current entries.`,\n },\n ],\n isError: true,\n }\n }\n await saveImportedMcps(removeImport(cfg, input.id))\n return {\n content: [\n { type: \"text\", text: JSON.stringify({ ok: true, id: input.id }, null, 2) },\n ],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `remove_imported_mcp failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── mcp_imported_status ────────────────────────────────────────\n // The 3 proxy tools share the same wiring guard — register them\n // only when the host injected a proxy registry, otherwise emit a\n // clear \"not enabled\" error so the agent doesn't think the daemon\n // silently dropped the call.\n server.tool(\n \"mcp_imported_status\",\n \"Snapshot every imported MCP server with its connection status, \" +\n \"transport type, and tool count. Use this first when an operator \" +\n \"wonders 'what MCPs do I actually have access to right now?' — the \" +\n \"answer covers both 'imported but not yet connected' and 'connected \" +\n \"with N tools'. Errors during connect surface in `lastError`.\",\n {},\n async () => {\n if (!mcpProxy) {\n return {\n content: [\n {\n type: \"text\",\n text:\n \"mcp_imported_status is not enabled — daemon was started without \" +\n \"an MCP proxy. The host must wire `mcpProxy` in createGateway.\",\n },\n ],\n isError: true,\n }\n }\n try {\n const aliases = await mcpProxy.listAliases()\n return {\n content: [\n { type: \"text\", text: JSON.stringify({ imports: aliases }, null, 2) },\n ],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `mcp_imported_status failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── mcp_imported_list_tools ────────────────────────────────────\n server.tool(\n \"mcp_imported_list_tools\",\n \"List the tools exposed by one imported MCP server. The proxy \" +\n \"lazily connects on first call — first-use latency includes the \" +\n \"transport handshake (stdio: ~1-2s for npx-spawned servers; \" +\n \"http/sse: <100ms). Returns the upstream `inputSchema` (JSON \" +\n \"Schema) verbatim so the operator can build a valid `arguments` \" +\n \"object for the follow-up `mcp_imported_call` invocation.\",\n {\n alias: z\n .string()\n .min(1)\n .describe(\n \"Alias from `list_imported_mcps` / `mcp_imported_status` \" +\n \"(typically the original MCP name, e.g. 'chrome-devtools').\"\n ),\n },\n async input => {\n if (!mcpProxy) {\n return {\n content: [\n {\n type: \"text\",\n text: \"mcp_imported_list_tools is not enabled — see mcp_imported_status.\",\n },\n ],\n isError: true,\n }\n }\n const out = await mcpProxy.listTools(input.alias)\n if (!out.ok) {\n return {\n content: [\n {\n type: \"text\",\n text: `mcp_imported_list_tools \"${input.alias}\": ${out.error}`,\n },\n ],\n isError: true,\n }\n }\n return {\n content: [\n { type: \"text\", text: JSON.stringify({ alias: input.alias, tools: out.tools }, null, 2) },\n ],\n }\n }\n )\n\n // ── mcp_imported_call ──────────────────────────────────────────\n server.tool(\n \"mcp_imported_call\",\n \"Invoke a tool on an imported MCP server. The daemon proxies the \" +\n \"call through the live client connection — the upstream server \" +\n \"validates `arguments` against its own input schema (which you \" +\n \"can fetch via `mcp_imported_list_tools`). The full upstream \" +\n \"result is returned verbatim, including `isError` flags so the \" +\n \"operator sees the original failure shape.\",\n {\n alias: z.string().min(1).describe(\"Imported MCP alias.\"),\n toolName: z\n .string()\n .min(1)\n .describe(\n \"Tool name as it appears in `mcp_imported_list_tools` \" +\n \"(NOT a namespaced version — pass the upstream's own name).\"\n ),\n args: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\n \"Tool arguments as a JSON object. Schema is the upstream's \" +\n \"— the proxy doesn't validate, only forwards. Default: empty object.\"\n ),\n },\n async input => {\n if (!mcpProxy) {\n return {\n content: [\n {\n type: \"text\",\n text: \"mcp_imported_call is not enabled — see mcp_imported_status.\",\n },\n ],\n isError: true,\n }\n }\n const out = await mcpProxy.callTool(\n input.alias,\n input.toolName,\n input.args ?? {}\n )\n if (!out.ok) {\n return {\n content: [\n {\n type: \"text\",\n text: `mcp_imported_call \"${input.alias}\".${input.toolName}: ${out.error}`,\n },\n ],\n isError: true,\n }\n }\n // Forward the upstream result. The MCP SDK's CallToolResult is\n // already in the {content, isError?} shape we return — pass it\n // through with a note that it came from the proxy.\n return out.result as {\n content: Array<{ type: \"text\"; text: string }>\n isError?: boolean\n }\n }\n )\n\n // ── kill_agent_session ─────────────────────────────────────────\n server.tool(\n \"kill_agent_session\",\n \"Stop a session — SIGTERM the underlying child + close the agent protocol \" +\n \"session. Use to free resources after the operator is done, or when a \" +\n \"session is wedged.\",\n {\n sessionId: z.string().describe(\"Session id.\"),\n },\n async input => {\n const ok = registry.kill(input.sessionId)\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ ok, sessionId: input.sessionId }, null, 2),\n },\n ],\n }\n }\n )\n\n // ── Terminal session tools ─────────────────────────────────────\n // Four tools that mirror the agent-session set but operate on raw\n // PTY sessions (real terminal, ANSI bytes, multi-subscriber). Use\n // these to drive interactive CLIs like `claude` in TUI mode, or\n // for one agent to orchestrate other shells. Read/write/exit\n // happen over the byte ring buffer; the WS at /sessions/:id/pty\n // is the streaming alternative.\n\n const ptyNotConfigured = (toolName: string): {\n content: Array<{ type: \"text\"; text: string }>\n isError: true\n } => ({\n content: [\n {\n type: \"text\",\n text:\n `${toolName}: PTY support not enabled — the daemon was started without ` +\n \"a node-pty factory. Re-run `agentproto serve` from a build that ships \" +\n \"node-pty (the optional dep ships with @agentproto/cli).\",\n },\n ],\n isError: true,\n })\n\n server.tool(\n \"start_terminal_session\",\n \"Spawn a process under a real PTY (node-pty) on the host. Bytes (including \" +\n \"ANSI escapes, alt-screen sequences) flow through the daemon's byte ring \" +\n \"buffer; subscribers attach via the WS at /sessions/:id/pty. Use for \" +\n \"interactive TUIs (claude, vim, htop) or to orchestrate shells from another \" +\n \"agent. Returns the session descriptor.\",\n {\n argv: z\n .array(z.string())\n .min(1)\n .describe(\n \"Argv array. First element is the binary, rest are arguments. \" +\n \"e.g. ['claude'] or ['bash', '-l'].\"\n ),\n workspaceSlug: z\n .string()\n .optional()\n .describe(\n \"Workspace slug from `agentproto workspace list`. Resolves cwd. Omit \" +\n \"to use `cwd` explicitly or the active workspace.\"\n ),\n cwd: z\n .string()\n .optional()\n .describe(\"Absolute cwd. Wins over workspaceSlug when both set.\"),\n cols: z.number().int().min(1).max(500).optional().describe(\"Initial cols. Default 80.\"),\n rows: z.number().int().min(1).max(200).optional().describe(\"Initial rows. Default 24.\"),\n name: z\n .string()\n .optional()\n .describe(\n \"User-friendly slug. Becomes an alias for the session id in \" +\n \"subsequent tool calls (read/write/kill accept either).\"\n ),\n label: z\n .string()\n .optional()\n .describe(\n \"Free-text label surfaced in list_agent_sessions and the UI.\"\n ),\n },\n async input => {\n if (!ptyEnabled) return ptyNotConfigured(\"start_terminal_session\")\n let cwd = input.cwd\n let resolvedSlug = input.workspaceSlug ?? \"default\"\n if (!cwd) {\n try {\n const config = await loadWorkspacesConfig()\n const ws = input.workspaceSlug\n ? findWorkspace(config, input.workspaceSlug)\n : getActiveWorkspace(config)\n if (ws) {\n cwd = ws.path\n resolvedSlug = ws.slug\n }\n } catch {\n // fall through to error\n }\n }\n if (!cwd) {\n return {\n content: [\n {\n type: \"text\",\n text:\n \"start_terminal_session: no cwd resolvable. Pass `cwd` explicitly \" +\n \"or `workspaceSlug` matching `agentproto workspace list`.\",\n },\n ],\n isError: true,\n }\n }\n try {\n const desc = registry.spawnPty({\n argv: input.argv,\n cwd,\n workspaceSlug: resolvedSlug,\n cols: input.cols ?? 80,\n rows: input.rows ?? 24,\n ...(input.name ? { name: input.name } : {}),\n ...(input.label ? { label: input.label } : {}),\n })\n return {\n content: [{ type: \"text\", text: JSON.stringify(desc, null, 2) }],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `start_terminal_session: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n server.tool(\n \"write_terminal_input\",\n \"Send keystrokes to a PTY session's stdin. The text is forwarded verbatim — \" +\n \"include trailing newlines if the target needs them (e.g. shell commands). \" +\n \"Use after `start_terminal_session` to drive an interactive CLI.\",\n {\n sessionId: z\n .string()\n .describe(\"Session id OR name from start_terminal_session.\"),\n text: z.string().describe(\"Text to write. Sent as-is to the PTY's stdin.\"),\n },\n async input => {\n if (!ptyEnabled) return ptyNotConfigured(\"write_terminal_input\")\n const desc = registry.findByIdOrName(input.sessionId)\n if (!desc) {\n return {\n content: [\n {\n type: \"text\",\n text: `write_terminal_input: no session \"${input.sessionId}\"`,\n },\n ],\n isError: true,\n }\n }\n const ok = registry.writeTerminalInput(desc.id, input.text)\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ ok, sessionId: desc.id }, null, 2),\n },\n ],\n ...(ok ? {} : { isError: true as const }),\n }\n }\n )\n\n server.tool(\n \"read_terminal_output\",\n \"Snapshot the recent byte buffer of a PTY session. Returns base64-encoded \" +\n \"bytes (the buffer is RAW including ANSI escapes — strip with a regex if \" +\n \"you want plain text). `lastBytes` caps the read from the tail.\",\n {\n sessionId: z\n .string()\n .describe(\"Session id OR name from start_terminal_session.\"),\n lastBytes: z\n .number()\n .int()\n .min(1)\n .max(64 * 1024)\n .optional()\n .describe(\"Max bytes from the tail. Default: full ring buffer (~64 KiB).\"),\n },\n async input => {\n if (!ptyEnabled) return ptyNotConfigured(\"read_terminal_output\")\n const desc = registry.findByIdOrName(input.sessionId)\n if (!desc) {\n return {\n content: [\n {\n type: \"text\",\n text: `read_terminal_output: no session \"${input.sessionId}\"`,\n },\n ],\n isError: true,\n }\n }\n const buf = registry.readTerminalOutput(\n desc.id,\n input.lastBytes,\n )\n if (!buf) {\n return {\n content: [\n {\n type: \"text\",\n text: `read_terminal_output: session \"${desc.id}\" is not a PTY`,\n },\n ],\n isError: true,\n }\n }\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n {\n sessionId: desc.id,\n status: desc.status,\n bytes: buf.byteLength,\n b64: buf.toString(\"base64\"),\n },\n null,\n 2,\n ),\n },\n ],\n }\n }\n )\n\n server.tool(\n \"kill_terminal_session\",\n \"SIGTERM a PTY session and drop it from the alive set. Same effect as \" +\n \"`kill_agent_session` for the PTY family — separate name so it's obvious \" +\n \"what's being stopped.\",\n {\n sessionId: z\n .string()\n .describe(\"Session id OR name from start_terminal_session.\"),\n },\n async input => {\n if (!ptyEnabled) return ptyNotConfigured(\"kill_terminal_session\")\n const desc = registry.findByIdOrName(input.sessionId)\n if (!desc) {\n return {\n content: [\n {\n type: \"text\",\n text: `kill_terminal_session: no session \"${input.sessionId}\"`,\n },\n ],\n isError: true,\n }\n }\n const ok = registry.kill(desc.id)\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ ok, sessionId: desc.id }, null, 2),\n },\n ],\n }\n }\n )\n}\n","/**\n * HEARTBEAT.md autonomy loop.\n *\n * A workspace can ship a `HEARTBEAT.md` at its root. Frontmatter:\n *\n * schema: heartbeat/v1\n * agent: <id> (matches `<workspace>/.agents/<id>/AGENT.md`)\n * every: \"60s\" (Ns | Nm | Nh | Nd; cron support TODO)\n * enabled: true (default true; set false to register-but-skip)\n * conversation: heartbeat-{date} (templated id; defaults to per-day)\n *\n * Body = the prompt body the agent receives each tick. Reread fresh\n * on every tick so editing HEARTBEAT.md takes effect without restart.\n *\n * Ticks resolve the agent via the injected `buildAgent` callback,\n * call `agent.generate(prompt)`, and append the prompt + reply to a\n * conversation (default: daily-rolling `heartbeat-YYYY-MM-DD`).\n *\n * When the file is missing, frontmatter is invalid, `enabled: false`,\n * or the resolved agent has no usable model — the runner skips the\n * tick silently and emits a `heartbeat-error` event. The daemon\n * stays up.\n */\n\nimport matter from \"gray-matter\"\nimport { existsSync } from \"node:fs\"\nimport { readFile } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport type { ConversationStore } from \"./conversations.js\"\nimport type { RuntimeEvents } from \"./events.js\"\n\nexport interface HeartbeatAgent {\n generate(prompt: string): Promise<{ text: string }>\n}\n\nexport interface BuildHeartbeatAgent {\n (id: string): Promise<HeartbeatAgent | null>\n}\n\nexport interface HeartbeatRunnerOptions {\n workspace: string\n conversations: ConversationStore\n events: RuntimeEvents\n /** Resolves a heartbeat-runnable agent from its workspace id. */\n buildAgent: BuildHeartbeatAgent\n /** Filename inside the workspace root. Default `HEARTBEAT.md`. */\n filename?: string\n /** Skip ticks while this returns false. Default: always true. */\n shouldFire?: () => boolean\n /** Override clock for tests. */\n now?: () => Date\n}\n\nexport interface HeartbeatRunner {\n /** Start the timer loop. Idempotent. */\n start(): void\n /** Stop the timer loop. Pending ticks finish out. */\n stop(): void\n /** Force-fire one tick now (used by `POST /heartbeat/tick`). */\n fireNow(): Promise<void>\n}\n\ninterface ParsedHeartbeat {\n agent: string\n everyMs: number\n enabled: boolean\n conversationTemplate: string\n body: string\n}\n\nexport function startHeartbeat(opts: HeartbeatRunnerOptions): HeartbeatRunner {\n const filename = opts.filename ?? \"HEARTBEAT.md\"\n const path = join(opts.workspace, filename)\n const now = opts.now ?? (() => new Date())\n\n let timer: NodeJS.Timeout | null = null\n let currentEveryMs: number | null = null\n let firing = false\n\n async function load(): Promise<ParsedHeartbeat | null> {\n if (!existsSync(path)) return null\n let source: string\n try {\n source = await readFile(path, \"utf8\")\n } catch {\n return null\n }\n const parsed = matter(source)\n const fm = parsed.data as Record<string, unknown>\n const agent = typeof fm.agent === \"string\" ? fm.agent : null\n if (!agent) return null\n const enabled = fm.enabled === undefined ? true : Boolean(fm.enabled)\n const everyRaw = typeof fm.every === \"string\" ? fm.every : \"60s\"\n const everyMs = parseDuration(everyRaw)\n if (!everyMs) return null\n const conversationTemplate =\n typeof fm.conversation === \"string\"\n ? fm.conversation\n : \"heartbeat-{date}\"\n return {\n agent,\n everyMs,\n enabled,\n conversationTemplate,\n body: parsed.content.trim(),\n }\n }\n\n async function tick(): Promise<void> {\n if (firing) return\n if (opts.shouldFire && !opts.shouldFire()) return\n firing = true\n let agentId: string | undefined\n try {\n const hb = await load()\n if (!hb || !hb.enabled) return\n agentId = hb.agent\n const agent = await opts.buildAgent(hb.agent)\n if (!agent) {\n opts.events.emit({\n type: \"heartbeat-error\",\n at: now().toISOString(),\n agent: hb.agent,\n error: `buildAgent('${hb.agent}') returned null`,\n })\n return\n }\n if (!hb.body) {\n opts.events.emit({\n type: \"heartbeat-error\",\n at: now().toISOString(),\n agent: hb.agent,\n error: \"HEARTBEAT.md body is empty\",\n })\n return\n }\n\n const conversationId = expandTemplate(hb.conversationTemplate, now())\n await opts.conversations.open(conversationId, { agent: hb.agent })\n\n const startedAt = now()\n await opts.conversations.appendTurn(\n conversationId,\n \"user\",\n hb.body,\n { at: startedAt.toISOString(), attribution: \"heartbeat\" },\n )\n opts.events.emit({\n type: \"conv-turn-appended\",\n at: startedAt.toISOString(),\n conversationId,\n role: \"user\",\n contentPreview: preview(hb.body),\n })\n\n const t0 = Date.now()\n const reply = await agent.generate(hb.body)\n const durationMs = Date.now() - t0\n\n const finishedAt = now()\n await opts.conversations.appendTurn(\n conversationId,\n \"assistant\",\n reply.text,\n { at: finishedAt.toISOString(), attribution: hb.agent },\n )\n opts.events.emit({\n type: \"conv-turn-appended\",\n at: finishedAt.toISOString(),\n conversationId,\n role: \"assistant\",\n contentPreview: preview(reply.text),\n })\n opts.events.emit({\n type: \"heartbeat-fired\",\n at: finishedAt.toISOString(),\n agent: hb.agent,\n conversationId,\n prompt: hb.body,\n reply: reply.text,\n durationMs,\n })\n\n // Adapt the timer if `every` changed since we started.\n if (currentEveryMs !== null && currentEveryMs !== hb.everyMs) {\n reschedule(hb.everyMs)\n }\n } catch (err) {\n opts.events.emit({\n type: \"heartbeat-error\",\n at: now().toISOString(),\n agent: agentId,\n error: err instanceof Error ? err.message : String(err),\n })\n } finally {\n firing = false\n }\n }\n\n function reschedule(everyMs: number): void {\n if (timer) clearInterval(timer)\n currentEveryMs = everyMs\n timer = setInterval(() => {\n void tick()\n }, everyMs)\n }\n\n return {\n start() {\n if (timer) return\n // Bootstrap interval from the file (or fall back to 60s if\n // unreadable — first real tick will refresh from disk).\n void load().then((hb) => {\n const everyMs = hb?.everyMs ?? 60_000\n reschedule(everyMs)\n })\n },\n stop() {\n if (timer) {\n clearInterval(timer)\n timer = null\n currentEveryMs = null\n }\n },\n async fireNow() {\n await tick()\n },\n }\n}\n\n// ── helpers ──────────────────────────────────────────────────────────\n\nconst DURATION_RE = /^(\\d+)\\s*(s|m|h|d)$/\n\n/**\n * Parse `Ns | Nm | Nh | Nd` into milliseconds. Returns `null` if the\n * string doesn't match. (AIP-41 supports more units, but the daemon's\n * heartbeat sticks to coarse durations to keep ticks observable.)\n */\nexport function parseDuration(input: string): number | null {\n const trimmed = input.trim()\n const match = trimmed.match(DURATION_RE)\n if (!match) return null\n const n = Number(match[1])\n if (!Number.isFinite(n) || n <= 0) return null\n switch (match[2]) {\n case \"s\":\n return n * 1_000\n case \"m\":\n return n * 60_000\n case \"h\":\n return n * 3_600_000\n case \"d\":\n return n * 86_400_000\n default:\n return null\n }\n}\n\n/**\n * Replace `{date}` with `YYYY-MM-DD` (UTC) in conversation templates.\n * Other tokens pass through unchanged — extend later if needed.\n */\nfunction expandTemplate(template: string, when: Date): string {\n const date = when.toISOString().slice(0, 10)\n return template.replace(/\\{date\\}/g, date)\n}\n\nfunction preview(text: string, max = 120): string {\n const flat = text.replace(/\\s+/g, \" \").trim()\n return flat.length > max ? `${flat.slice(0, max - 1)}…` : flat\n}\n","/**\n * Tiny node:http server that fronts the runtime gateway.\n *\n * Routes:\n * GET /health — { status, workspace, registered, uptime }\n * GET /events — SSE stream of RuntimeEvent\n * POST /mcp — MCP Streamable HTTP transport (POST)\n * GET /mcp — MCP SSE response stream (GET)\n * DELETE /mcp — close MCP session\n * GET /conversations — JSON list of conversation summaries\n * GET /conversations/<id> — markdown body of one conversation\n * POST /heartbeat/tick — force-fire one heartbeat tick\n *\n * No auth in `mode: \"none\"` (loopback default). `mode: \"bearer\"`\n * checks `Authorization: Bearer <token>` against the configured\n * token. Health is always public so external monitors can probe.\n *\n * MCP transport: stateless mode for v1 — each request is independent.\n * Stateful session pinning can come later when long-running streaming\n * tool calls become a real use case.\n */\n\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\"\nimport type { Duplex } from \"node:stream\"\nimport { mkdir, stat, writeFile } from \"node:fs/promises\"\nimport { isAbsolute, join, resolve as resolvePath } from \"node:path\"\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\"\nimport { WebSocketServer, type WebSocket } from \"ws\"\nimport type { ConversationStore } from \"./conversations.js\"\nimport type { HeartbeatRunner } from \"./heartbeat.js\"\nimport type { RuntimeEvents, RuntimeEvent } from \"./events.js\"\nimport type { SessionsRegistry, AgentSessionLike } from \"./sessions.js\"\nimport {\n loadWorkspacesConfig,\n findWorkspace,\n getActiveWorkspace,\n} from \"./workspaces-config.js\"\nimport { discoverMcps } from \"./mcp-discovery.js\"\nimport type { McpProxyRegistry } from \"./mcp-proxy.js\"\nimport {\n loadImportedMcps,\n saveImportedMcps,\n addImport,\n removeImport,\n} from \"./mcp-imports.js\"\n\n/**\n * Default Origin allowlist used when `RuntimeHttpServerOptions.allowedOrigins`\n * is undefined. Localhost on any port covers the user's own dev environments\n * (Guilde web dev server, playground demos, embedded panels). Production\n * origins (https://guilde.work, …) are NOT included by default — those are\n * opt-in via `agentproto serve --allow-origin <url>`.\n */\nconst DEFAULT_ALLOWED_ORIGINS: readonly string[] = [\n \"http://localhost:*\",\n \"http://127.0.0.1:*\",\n \"https://localhost:*\",\n]\n\n/**\n * Pluggable adapter resolver — keeps the runtime package free of any\n * @agentproto/cli dep. The host (cli `serve`, playground, embedding\n * apps) builds the resolver and hands it in. Returning null means\n * \"adapter not found\" → 404.\n */\nexport type AgentAdapterResolver = (slug: string) => Promise<{\n /** Build a fresh AgentSessionLike for the given cwd. The driver\n * spawns the adapter binary, opens the protocol, and the\n * registry holds the result.\n *\n * When `resumeSessionId` is set, the driver reattaches to that\n * pre-existing adapter session (claude-code's conversation id,\n * hermes' chat handle, …) rather than starting blank. Same\n * mechanism as `agentproto run --resume <id>` — exposed over\n * HTTP so `agentproto sessions restart` works on agent-cli\n * sessions, not just PTY ones. */\n startSession(opts: {\n cwd: string\n resumeSessionId?: string\n /** Model identifier forwarded from `start_agent_session`. Adapters\n * that support model selection (e.g. via a `--model` CLI flag) may\n * honour this; others silently ignore it. */\n model?: string\n }): Promise<AgentSessionLike>\n /** Display label for the descriptor's `command` field. */\n commandPreview?: string\n} | null>\n\n/**\n * Compact adapter metadata for the discovery endpoints. Independent\n * of the resolver function above — hosts that can list installed\n * adapters wire this; hosts that can only resolve by-slug skip it\n * (the routes 501).\n */\nexport interface AdapterListEntry {\n slug: string\n name: string\n version: string\n description: string\n protocol: string\n streaming: boolean\n packageName: string\n}\n\nexport type AgentAdapterLister = () => Promise<AdapterListEntry[]>\n\nexport interface AuthOptions {\n mode: \"none\" | \"bearer\"\n token?: string\n}\n\n/**\n * Auth can be a fixed value (set at startup) or a getter (re-read on\n * every request). The getter form lets `remote_enable` flip bearer on\n * at runtime without restarting the gateway.\n */\nexport type AuthSource = AuthOptions | (() => AuthOptions)\n\nexport interface RuntimeHttpServerOptions {\n port: number\n bind?: string\n auth?: AuthSource\n /**\n * Per-request McpServer factory.\n *\n * The SDK's `StreamableHTTPServerTransport` is single-use — once a\n * transport has handled one request, the underlying `Protocol`\n * cannot be reattached, so subsequent requests on a shared transport\n * 500. The official stateless pattern (see SDK\n * `examples/server/simpleStatelessStreamableHttp.js`) builds a\n * fresh `McpServer` and `StreamableHTTPServerTransport` per request,\n * connects them, and tears both down on `res.close`. We follow that.\n *\n * The factory is invoked once per `/mcp` POST. It must register\n * tools / resources / prompts on the returned server before\n * resolving — by the time the transport's `handleRequest` fires,\n * the server is locked in.\n */\n mcpServerFactory: () => Promise<McpServer>\n conversations: ConversationStore\n events: RuntimeEvents\n heartbeat: HeartbeatRunner\n /** Optional — when wired, exposes /sessions routes for the CLI\n * TUI and the guilde-web Active tab to navigate live child\n * processes. Daemons that don't spawn anything (pure MCP servers)\n * can omit this and the routes 404. */\n sessions?: SessionsRegistry\n /** Optional — when wired alongside `sessions`, enables\n * `POST /sessions/agent` and `POST /sessions/:id/prompt` routes.\n * Hosts that ship adapters (`agentproto serve`, playground)\n * pass the cli's `resolveAdapter` via a thin shim. */\n resolveAgentAdapter?: AgentAdapterResolver\n /** Optional — when wired, enables `GET /adapters` route + the\n * MCP `list_adapters` tool so UIs can discover what's installed\n * without trial-and-error against the resolver. Hosts ship the\n * cli's `listInstalledAdapters` via a thin shim. */\n listAgentAdapters?: AgentAdapterLister\n /** Optional — MCP proxy registry. When wired, exposes\n * `/mcps/proxy/*` routes that let the browser drive imported MCPs\n * without going through the MCP wire protocol (useful for the\n * /providers/mcp page's \"Local\" tab). */\n mcpProxy?: McpProxyRegistry\n /** Per-boot bearer token. When set, mutating /sessions/* routes\n * + the /sessions/:id/pty WebSocket upgrade require either\n * `Authorization: Bearer <token>` or an `Origin` header that\n * matches `allowedOrigins`. Read-only routes (GET, SSE stream)\n * stay open since the CORS surface already restricts origins\n * enough for them. */\n token?: string\n /** Trusted browser origins. When a mutating request carries an\n * `Origin: <url>` header (browser-set, JS can't forge), and that\n * url is in this list, the request is allowed without a Bearer\n * token. Browsers can't read the daemon's runtime.json (mode 0600)\n * so they can't send the token — Origin-based auth lets a trusted\n * page (Guilde web UI, local dev) drive the daemon. Non-browser\n * callers (curl, the CLI) still use the token.\n *\n * Match policy: exact origin (`https://guilde.work`) OR prefix\n * with `:*` for any-port match (`http://localhost:*` matches\n * `http://localhost:3000`).\n *\n * Default (when undefined): localhost on any port is allowed via\n * `DEFAULT_ALLOWED_ORIGINS`. Production origins are opt-in via\n * `agentproto serve --allow-origin <url>`. Pair with `strictOrigins`\n * to remove the localhost defaults entirely. */\n allowedOrigins?: readonly string[]\n /** When true, skip the localhost-wildcard defaults — only the\n * explicit `allowedOrigins` list is honoured. Useful for daemons\n * on shared hosts or when the user wants to lock dev to a\n * specific port. Default false (current behaviour — any browser\n * on `localhost` is trusted). */\n strictOrigins?: boolean\n /** Whether `POST /sessions/terminal` + WS upgrade are advertised.\n * Reflects whether the host injected a PTY factory into the\n * SessionsRegistry. When false, the terminal HTTP route returns\n * 501 and the WS upgrade rejects. */\n ptyEnabled?: boolean\n /** Static fields surfaced via `/health`. */\n meta: {\n workspace: string\n registered: readonly string[]\n }\n}\n\nexport interface RuntimeHttpServerHandle {\n url: string\n stop(): Promise<void>\n}\n\nexport async function startHttpServer(\n opts: RuntimeHttpServerOptions,\n): Promise<RuntimeHttpServerHandle> {\n const startedAt = Date.now()\n const authSource: AuthSource = opts.auth ?? { mode: \"none\" }\n const readAuth = (): AuthOptions =>\n typeof authSource === \"function\" ? authSource() : authSource\n\n /**\n * Loopback bypass — requests originating from 127.0.0.1 / ::1 with\n * no `X-Forwarded-For` header skip the bearer check even when one is\n * configured. Rationale:\n *\n * 1. The bearer is meant to gate the *public tunnel*, not the\n * loopback socket. Without this, calling `remote_enable` from a\n * local MCP client immediately 401s that same local client —\n * the user locks themselves out and the only recovery is a\n * gateway restart. Hit this in real use; not a theoretical edge.\n *\n * 2. Cloudflared (and any reasonable tunnel) sets X-Forwarded-For\n * when forwarding a public request to the loopback origin. So\n * \"loopback AND no XFF\" is a tight characterisation of \"this\n * request never left the machine.\"\n *\n * 3. Local FS access already trumps bearer (the user can read\n * runtime.json, kill -9 the daemon, etc.). Adding another check\n * here doesn't raise the bar for someone with shell on the box.\n *\n * If your threat model is \"untrusted users on the same loopback\n * interface\" (unusual — usually a multi-tenant container scenario),\n * pass `auth: { mode: \"bearer\", … }` at startup instead of relying\n * on the controller's runtime flip; the auth getter will return the\n * stricter of the two and the bypass still applies (intentional —\n * the operator opted in to bearer with full knowledge of the trade).\n */\n function isLoopback(req: IncomingMessage): boolean {\n const addr = req.socket.remoteAddress ?? \"\"\n const isLocalAddr =\n addr === \"127.0.0.1\" || addr === \"::1\" || addr === \"::ffff:127.0.0.1\"\n if (!isLocalAddr) return false\n // X-Forwarded-For present ⇒ a tunnel is in front of us; the\n // request crossed the public internet to reach this socket.\n if (req.headers[\"x-forwarded-for\"]) return false\n return true\n }\n\n function authorize(req: IncomingMessage, res: ServerResponse): boolean {\n const auth = readAuth()\n if (auth.mode === \"none\") return true\n if (isLoopback(req)) return true\n const header = req.headers.authorization\n const expected = `Bearer ${auth.token}`\n if (header !== expected) {\n res.writeHead(401, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"unauthorized\" }))\n return false\n }\n return true\n }\n\n /**\n * Per-boot auth gate for mutating /sessions/* routes and the WS\n * upgrade for /sessions/:id/pty. Accepts EITHER:\n *\n * 1. `Authorization: Bearer <token>` matching the per-boot token\n * (the CLI path — reads runtime.json mode 0600).\n * 2. A WS-upgrade query-string `?token=<token>` (browser\n * WebSocket can't set headers; some non-browser clients use\n * this too).\n * 3. An `Origin: <url>` header matching `allowedOrigins` — the\n * browser path. Origin is browser-set, JS can't forge.\n *\n * UNLIKE `authorize()`, this does NOT have a loopback bypass: the\n * threat we're defending against (browser drive-by spawning shells\n * via fetch to 127.0.0.1) IS loopback. Browsers can't read\n * runtime.json (mode 0600); a same-origin trusted page can rely on\n * its Origin instead.\n *\n * When `opts.token` is unset (older host integrations), this is a\n * no-op so existing call sites keep working.\n */\n function checkSessionsToken(req: IncomingMessage): \"ok\" | \"missing\" | \"bad\" {\n if (!opts.token) return \"ok\"\n\n // 1. Header bearer token.\n const header = req.headers.authorization\n const expected = `Bearer ${opts.token}`\n if (header === expected) return \"ok\"\n\n // 2. ?token=<token> in the URL (WS upgrade convenience).\n const urlStr = req.url ?? \"\"\n if (urlStr.includes(\"?\")) {\n const qs = new URLSearchParams(urlStr.slice(urlStr.indexOf(\"?\") + 1))\n const qsToken = qs.get(\"token\")\n if (qsToken && qsToken === opts.token) return \"ok\"\n }\n\n // 3. Origin allowlist (browser path).\n const origin = req.headers.origin\n if (typeof origin === \"string\" && originAllowed(origin)) return \"ok\"\n\n return header ? \"bad\" : \"missing\"\n }\n\n function originAllowed(origin: string): boolean {\n // Defaults are normally in effect — `opts.allowedOrigins` extends\n // them rather than replacing. Otherwise setting one production\n // origin via config silently locks out `http://localhost:*`,\n // breaking local dev. Users who genuinely want a curated list\n // (shared host, paranoid local-only ports) set `strictOrigins:true`\n // which drops the defaults entirely.\n const list = opts.strictOrigins\n ? (opts.allowedOrigins ?? [])\n : [...DEFAULT_ALLOWED_ORIGINS, ...(opts.allowedOrigins ?? [])]\n for (const pattern of list) {\n if (pattern === origin) return true\n // `http://localhost:*` style: match the host prefix, any port.\n if (pattern.endsWith(\":*\")) {\n const prefix = pattern.slice(0, -2) // drop \":*\"\n if (origin === prefix || origin.startsWith(prefix + \":\")) return true\n }\n }\n return false\n }\n\n function rejectUnauthorizedSession(\n req: IncomingMessage,\n res: ServerResponse,\n kind: \"missing\" | \"bad\",\n ): void {\n const origin = req.headers.origin ?? null\n const allowList = opts.strictOrigins\n ? (opts.allowedOrigins ?? [])\n : [...DEFAULT_ALLOWED_ORIGINS, ...(opts.allowedOrigins ?? [])]\n res.writeHead(401, { \"content-type\": \"application/json\" })\n const message =\n kind === \"missing\"\n ? origin\n ? `Origin \"${origin}\" not in the daemon's allowlist, and no Bearer token sent. ` +\n `Either add it (\\`agentproto config set daemon.allowedOrigins ${origin}\\` then restart the daemon), ` +\n `or send Authorization: Bearer <token> read from <workspace>/.agentproto/runtime.json.`\n : `Authorization: Bearer <token> required on mutating /sessions/* routes. ` +\n `Read the token from <workspace>/.agentproto/runtime.json. ` +\n `(Browser callers can use an Origin in the allowlist instead.)`\n : `Invalid bearer token. The daemon regenerated its token on its last boot — ` +\n `re-read <workspace>/.agentproto/runtime.json.`\n res.end(\n JSON.stringify({\n error: \"sessions_unauthorized\",\n message,\n // Debug data so a UI / network-tab inspection points the user\n // straight at the fix without needing the daemon's stderr.\n rejectedOrigin: origin,\n allowedOrigins: allowList,\n // We never echo the token; only the absence-or-presence flag.\n receivedAuthHeader: typeof req.headers.authorization === \"string\",\n }),\n )\n }\n\n /**\n * Returns true when this `path` + `method` is a mutating /sessions/*\n * route that should require the per-boot token. Kept narrow: GETs\n * (list, get, SSE stream) stay open for read-only telemetry from\n * existing tools that haven't learned about the token yet.\n */\n function isMutatingSessionsRoute(method: string, path: string): boolean {\n if (!path.startsWith(\"/sessions\")) return false\n if (method === \"POST\" || method === \"DELETE\" || method === \"PUT\" || method === \"PATCH\") {\n return true\n }\n return false\n }\n\n async function handleMcp(req: IncomingMessage, res: ServerResponse): Promise<void> {\n if (!authorize(req, res)) return\n // Per-request server + transport, per the SDK's stateless pattern.\n // Sharing either across requests breaks after the first one because\n // `Protocol.connect` rejects re-attachment.\n const server = await opts.mcpServerFactory()\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n })\n // `onerror` is an unofficial SDK hook — guard before assigning so\n // a future SDK rename doesn't silently drop transport error logs.\n const transportInternal = transport as unknown as Record<string, unknown>\n if (\"onerror\" in (transport as object)) {\n transportInternal[\"onerror\"] = (err: unknown) => {\n console.error(\"[mcp transport.onerror]\", err)\n }\n }\n\n res.on(\"close\", () => {\n void transport.close()\n void server.close()\n })\n\n try {\n await server.connect(transport)\n await transport.handleRequest(req, res)\n } catch (err) {\n console.error(\"[mcp] handleRequest threw:\", err)\n if (!res.headersSent) {\n res.writeHead(500, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"mcp_transport_failed\",\n message: err instanceof Error ? err.message : String(err),\n }),\n )\n }\n }\n }\n\n function handleHealth(_req: IncomingMessage, res: ServerResponse): void {\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n status: \"ok\",\n workspace: opts.meta.workspace,\n registered: opts.meta.registered,\n uptimeMs: Date.now() - startedAt,\n }),\n )\n }\n\n function handleEvents(req: IncomingMessage, res: ServerResponse): void {\n if (!authorize(req, res)) return\n res.writeHead(200, {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache, no-transform\",\n connection: \"keep-alive\",\n })\n res.write(`: connected\\n\\n`)\n const off = opts.events.onAny((ev: RuntimeEvent) => {\n res.write(`data: ${JSON.stringify(ev)}\\n\\n`)\n })\n req.on(\"close\", off)\n }\n\n async function handleListConversations(\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n if (!authorize(req, res)) return\n const list = await opts.conversations.list()\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(list))\n }\n\n async function handleGetConversation(\n req: IncomingMessage,\n res: ServerResponse,\n id: string,\n ): Promise<void> {\n if (!authorize(req, res)) return\n try {\n const data = await opts.conversations.read(id)\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(data))\n } catch (err) {\n res.writeHead(404, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"not_found\",\n message: err instanceof Error ? err.message : String(err),\n }),\n )\n }\n }\n\n async function handleHeartbeatTick(\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n if (!authorize(req, res)) return\n await opts.heartbeat.fireNow()\n res.writeHead(202, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ status: \"fired\" }))\n }\n\n /**\n * POST /files/upload?cwd=<abs-dir>&name=<filename>\n *\n * Writes the raw request body bytes to\n * `{cwd}/.agentproto-attachments/{safe-name}`, creating the\n * subdirectory on demand, and returns `{path}` with the absolute\n * path the agent CLI can read. Used by the host UI's terminal\n * drag-drop: the browser can't read the dragged file's source path\n * (security), so we copy the bytes to a known location and tell the\n * UI to paste THAT path into the terminal — claude-code (and any\n * CLI with a Read tool) picks it up natively.\n *\n * Gated by `checkSessionsToken` so a drive-by HTTP request can't\n * write arbitrary files: only sessions-authorized callers (CLI or\n * an allow-listed browser origin) can hit it.\n *\n * Hardening:\n * - `cwd` must be absolute and exist as a directory.\n * - `name` is basename-sanitized (no `/`, `..`, NULs).\n * - The resolved write target must stay within\n * `{cwd}/.agentproto-attachments/` (defense-in-depth in case the\n * name sanitizer ever drifts).\n * - Body capped at 32 MiB. Larger uploads error 413 instead of\n * filling the daemon's disk.\n */\n async function handleFileUpload(\n req: IncomingMessage,\n res: ServerResponse,\n url: string,\n ): Promise<void> {\n const reply = (status: number, body: unknown): void => {\n res.writeHead(status, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(body))\n }\n const qs = new URLSearchParams(url.includes(\"?\") ? url.slice(url.indexOf(\"?\") + 1) : \"\")\n const cwd = qs.get(\"cwd\")\n const rawName = qs.get(\"name\")\n if (!cwd || !rawName) {\n reply(400, { error: \"missing_cwd_or_name\" })\n return\n }\n if (!isAbsolute(cwd)) {\n reply(400, { error: \"cwd_not_absolute\" })\n return\n }\n // basename-style sanitize: strip path separators + parent refs +\n // NUL bytes; collapse leading dots so the file is visible. The\n // resolvePath check below catches anything this misses.\n const safeName = rawName\n .replace(/[\u0000/\\\\]/g, \"_\")\n .replace(/\\.\\.+/g, \".\")\n .replace(/^\\.+/, \"\")\n .slice(0, 200)\n if (safeName.length === 0) {\n reply(400, { error: \"invalid_name\" })\n return\n }\n try {\n const st = await stat(cwd)\n if (!st.isDirectory()) {\n reply(400, { error: \"cwd_not_a_directory\" })\n return\n }\n } catch {\n reply(400, { error: \"cwd_not_found\" })\n return\n }\n const dir = join(cwd, \".agentproto-attachments\")\n const target = resolvePath(dir, safeName)\n // Defense-in-depth: the sanitized name should never escape `dir`,\n // but if the sanitizer ever drifts, this catches the escape.\n if (!target.startsWith(resolvePath(dir) + (dir.endsWith(\"/\") ? \"\" : \"/\"))) {\n reply(400, { error: \"path_traversal_blocked\" })\n return\n }\n const MAX_BYTES = 32 * 1024 * 1024 // 32 MiB\n const chunks: Buffer[] = []\n let total = 0\n let aborted = false\n await new Promise<void>((resolveBody, rejectBody) => {\n req.on(\"data\", chunk => {\n if (aborted) return\n const buf = chunk as Buffer\n total += buf.length\n if (total > MAX_BYTES) {\n aborted = true\n reply(413, { error: \"file_too_large\", maxBytes: MAX_BYTES })\n rejectBody(new Error(\"too_large\"))\n return\n }\n chunks.push(buf)\n })\n req.on(\"end\", () => {\n if (!aborted) resolveBody()\n })\n req.on(\"error\", err => rejectBody(err))\n }).catch(() => undefined)\n if (aborted) return\n try {\n await mkdir(dir, { recursive: true })\n await writeFile(target, Buffer.concat(chunks))\n reply(200, { path: target, bytes: total })\n } catch (err) {\n reply(500, {\n error: \"write_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n }\n }\n\n // Permissive CORS for the loopback gateway. The Guilde web app\n // (localhost:3041) probes /health from the browser; without these\n // headers the browser blocks the response and the panel says\n // \"not reachable\" even though curl works. Auth still gates the\n // sensitive routes — this just lifts the cross-origin block.\n //\n // Private Network Access (Chrome 105+): when an HTTPS page like\n // https://guilde.work fetches a loopback URL, Chrome sends a\n // preflight with `Access-Control-Request-Private-Network: true`.\n // Without `Access-Control-Allow-Private-Network: true` in the\n // response, the browser blocks the actual GET. Mirror the flag\n // when the request asked for it.\n function applyCors(req: IncomingMessage, res: ServerResponse): void {\n const origin = (req.headers.origin as string | undefined) ?? \"*\"\n res.setHeader(\"Access-Control-Allow-Origin\", origin)\n res.setHeader(\"Vary\", \"Origin\")\n res.setHeader(\"Access-Control-Allow-Credentials\", \"true\")\n res.setHeader(\n \"Access-Control-Allow-Headers\",\n req.headers[\"access-control-request-headers\"] ??\n \"authorization,content-type,mcp-session-id\",\n )\n res.setHeader(\n \"Access-Control-Allow-Methods\",\n \"GET,POST,PUT,PATCH,DELETE,OPTIONS\",\n )\n if (req.headers[\"access-control-request-private-network\"] === \"true\") {\n res.setHeader(\"Access-Control-Allow-Private-Network\", \"true\")\n }\n }\n\n const server: Server = createServer((req, res) => {\n void (async () => {\n try {\n const url = req.url ?? \"/\"\n const path = url.split(\"?\")[0] ?? \"/\"\n // Diagnostic: emit forwarded requests (those carrying XFF) onto\n // the events stream so /events tailers can see what cloudflared\n // actually sends. Loopback-only traffic stays quiet to avoid\n // flooding subscribers during normal local use.\n if (req.headers[\"x-forwarded-for\"]) {\n opts.events.emit({\n type: \"remote-log\",\n at: new Date().toISOString(),\n line: `[http-in] ${req.method} ${url} host=${req.headers.host ?? \"?\"} xff=${String(req.headers[\"x-forwarded-for\"])}`,\n })\n }\n\n applyCors(req, res)\n if (req.method === \"OPTIONS\") {\n res.writeHead(204)\n res.end()\n return\n }\n\n if (path === \"/health\" && req.method === \"GET\") {\n handleHealth(req, res)\n return\n }\n if (path === \"/events\" && req.method === \"GET\") {\n handleEvents(req, res)\n return\n }\n if (path === \"/mcp\") {\n await handleMcp(req, res)\n return\n }\n if (path === \"/conversations\" && req.method === \"GET\") {\n await handleListConversations(req, res)\n return\n }\n if (path.startsWith(\"/conversations/\") && req.method === \"GET\") {\n const id = path.slice(\"/conversations/\".length)\n await handleGetConversation(req, res, id)\n return\n }\n if (path === \"/heartbeat/tick\" && req.method === \"POST\") {\n await handleHeartbeatTick(req, res)\n return\n }\n\n if (path === \"/files/upload\" && req.method === \"POST\") {\n // Same auth gate as the mutating /sessions/* routes — drive-by\n // HTTP shouldn't be able to write arbitrary files to disk.\n const gate = checkSessionsToken(req)\n if (gate !== \"ok\") {\n rejectUnauthorizedSession(req, res, gate)\n return\n }\n await handleFileUpload(req, res, url)\n return\n }\n\n // Sessions routes — only registered when the gateway was\n // built with a SessionsRegistry. /sessions, /sessions/:id,\n // /sessions/:id/stream (SSE), POST /sessions/:id/kill,\n // DELETE /sessions/:id (forget after exit).\n if (opts.sessions && path.startsWith(\"/sessions\")) {\n if (isMutatingSessionsRoute(req.method ?? \"GET\", path)) {\n const gate = checkSessionsToken(req)\n if (gate !== \"ok\") {\n rejectUnauthorizedSession(req, res, gate)\n return\n }\n }\n const handled = await handleSessions(\n req,\n res,\n path,\n opts.sessions,\n opts.resolveAgentAdapter,\n opts.ptyEnabled === true,\n )\n if (handled) return\n }\n\n if (path === \"/workspaces\" && req.method === \"GET\") {\n // Surface ~/.agentproto/workspaces.json for UIs that\n // want a workspace dropdown (spawn dialog, MCP discovery\n // grouping, etc.). Read-only; mutate via the CLI's\n // `agentproto workspace add/remove/use` verbs.\n try {\n const config = await loadWorkspacesConfig()\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(config))\n } catch (err) {\n res.writeHead(500, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"workspaces_load_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n )\n }\n return\n }\n\n if (path === \"/mcps/imports\" && req.method === \"GET\") {\n const config = await loadImportedMcps()\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(config))\n return\n }\n if (path === \"/mcps/imports\" && req.method === \"POST\") {\n const body = (await readJsonBody(req)) as {\n sourceMcpId?: string\n alias?: string\n } | null\n if (!body || typeof body.sourceMcpId !== \"string\") {\n res.writeHead(400, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"missing_sourceMcpId\" }))\n return\n }\n const discovered = await discoverMcps()\n const snapshot = discovered.find(d => d.id === body.sourceMcpId)\n if (!snapshot) {\n res.writeHead(404, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"discovered_mcp_not_found\",\n sourceMcpId: body.sourceMcpId,\n })\n )\n return\n }\n const cfg = await loadImportedMcps()\n const next = addImport(cfg, {\n snapshot,\n ...(body.alias ? { alias: body.alias } : {}),\n })\n await saveImportedMcps(next)\n res.writeHead(201, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(next.imports.find(e => e.id === snapshot.id)))\n return\n }\n const importMatch = path.match(/^\\/mcps\\/imports\\/(.+)$/)\n if (importMatch && req.method === \"DELETE\") {\n // The id is URL-encoded since it contains colons + slashes\n // (e.g. claude-code:project:/path:name).\n const id = decodeURIComponent(importMatch[1] ?? \"\")\n const cfg = await loadImportedMcps()\n if (!cfg.imports.some(e => e.id === id)) {\n res.writeHead(404, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"import_not_found\", id }))\n return\n }\n await saveImportedMcps(removeImport(cfg, id))\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ ok: true, id }))\n return\n }\n\n if (path === \"/mcps/discovered\" && req.method === \"GET\") {\n // No host wiring needed — the scanner reads\n // ~/.claude.json + ~/.cursor/mcp.json + goose config\n // directly. Always available; cheap (~5ms typical).\n try {\n const mcps = await discoverMcps()\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ mcps }))\n } catch (err) {\n res.writeHead(500, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"discovery_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n )\n }\n return\n }\n\n // Browser-friendly proxy surface — same operations the MCP\n // tools expose (mcp_imported_status / list_tools / call) but\n // over plain HTTP so the /providers/mcp page can render them\n // without embedding an MCP client.\n if (path === \"/mcps/proxy/status\" && req.method === \"GET\") {\n if (!opts.mcpProxy) {\n res.writeHead(501, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"mcp_proxy_not_configured\" }))\n return\n }\n try {\n const imports = await opts.mcpProxy.listAliases()\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ imports }))\n } catch (err) {\n res.writeHead(500, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"proxy_status_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n )\n }\n return\n }\n const proxyToolsMatch = path.match(/^\\/mcps\\/proxy\\/tools\\/(.+)$/)\n if (proxyToolsMatch && req.method === \"GET\") {\n if (!opts.mcpProxy) {\n res.writeHead(501, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"mcp_proxy_not_configured\" }))\n return\n }\n const alias = decodeURIComponent(proxyToolsMatch[1] ?? \"\")\n const out = await opts.mcpProxy.listTools(alias)\n res.writeHead(out.ok ? 200 : 502, {\n \"content-type\": \"application/json\",\n })\n res.end(JSON.stringify(out))\n return\n }\n if (path === \"/mcps/proxy/call\" && req.method === \"POST\") {\n if (!opts.mcpProxy) {\n res.writeHead(501, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"mcp_proxy_not_configured\" }))\n return\n }\n const body = (await readJsonBody(req)) as {\n alias?: unknown\n toolName?: unknown\n args?: unknown\n } | null\n if (\n !body ||\n typeof body.alias !== \"string\" ||\n typeof body.toolName !== \"string\"\n ) {\n res.writeHead(400, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"invalid_body\",\n message: \"expected { alias, toolName, args? }\",\n })\n )\n return\n }\n const result = await opts.mcpProxy.callTool(\n body.alias,\n body.toolName,\n body.args ?? {}\n )\n res.writeHead(result.ok ? 200 : 502, {\n \"content-type\": \"application/json\",\n })\n res.end(JSON.stringify(result))\n return\n }\n\n if (path === \"/adapters\" && req.method === \"GET\") {\n if (!opts.listAgentAdapters) {\n res.writeHead(501, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"lister_not_configured\",\n message:\n \"Daemon was started without `listAgentAdapters` — see \" +\n \"@agentproto/cli's `listInstalledAdapters` for the canonical impl.\",\n })\n )\n return\n }\n try {\n const adapters = await opts.listAgentAdapters()\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ adapters }))\n } catch (err) {\n res.writeHead(500, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"list_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n )\n }\n return\n }\n\n res.writeHead(404, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"not_found\", path }))\n } catch (err) {\n if (!res.headersSent) {\n res.writeHead(500, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"internal_error\",\n message: err instanceof Error ? err.message : String(err),\n }),\n )\n }\n }\n })()\n })\n\n // ── WebSocket upgrade: /sessions/:id/pty ──\n // Single WSS bound to the HTTP server's `upgrade` event. Connections\n // are accepted only when the SessionsRegistry is wired AND PTY\n // support is advertised. Frames are JSON-encoded over text WS\n // messages (binary mode is a future optimization — JSON keeps\n // wireshark/devtools debuggable):\n // server → client: {kind:\"data\", b64:\"...\"}\n // server → client: {kind:\"exit\", exitCode:0, signal?:1}\n // client → server: {kind:\"input\", b64:\"...\"} (or {kind:\"input\", text:\"...\"})\n // client → server: {kind:\"resize\", cols:80, rows:24}\n // client → server: {kind:\"ping\"} (no-op keepalive)\n const wss = new WebSocketServer({ noServer: true })\n server.on(\"upgrade\", (req, socket, head) => {\n const url = req.url ?? \"/\"\n const path = url.split(\"?\")[0] ?? \"/\"\n const ptyMatch = path.match(/^\\/sessions\\/([^/]+)\\/pty$/)\n if (!ptyMatch) {\n socket.destroy()\n return\n }\n if (!opts.sessions || opts.ptyEnabled !== true) {\n rejectUpgrade(socket, 501, \"pty_not_configured\")\n return\n }\n // Per-boot token gate, no loopback bypass — see comment on\n // checkSessionsToken for why.\n const gate = checkSessionsToken(req)\n if (gate !== \"ok\") {\n rejectUpgrade(socket, 401, gate === \"missing\" ? \"missing_token\" : \"bad_token\")\n return\n }\n const id = ptyMatch[1]\n if (!id) {\n rejectUpgrade(socket, 400, \"missing_id\")\n return\n }\n // Resolve id-or-name BEFORE upgrading so a typo returns a clean\n // 404 instead of a successful WS that immediately closes.\n const desc = opts.sessions.findByIdOrName(id)\n if (!desc) {\n rejectUpgrade(socket, 404, \"session_not_found\")\n return\n }\n if (desc.pty !== true) {\n rejectUpgrade(socket, 400, \"session_not_pty\")\n return\n }\n // A descriptor for an exited/killed/error session lives on as\n // history — its PTY child is gone. Reject the upgrade with a\n // clear reason so the CLI/web client can suggest `restart`\n // instead of letting the user see a generic 1011 mid-attach.\n if (\n desc.status === \"exited\" ||\n desc.status === \"killed\" ||\n desc.status === \"error\"\n ) {\n rejectUpgrade(\n socket,\n 410,\n `session_${desc.status}`,\n `Session ${desc.id}${desc.name ? ` (${desc.name})` : \"\"} has ${desc.status}. ` +\n `Spawn a fresh one with: agentproto sessions restart ${desc.name ?? desc.id}`,\n )\n return\n }\n wss.handleUpgrade(req, socket, head, ws => {\n handlePtyWebSocket(ws, req, desc.id, opts.sessions!)\n })\n })\n\n const bind = opts.bind ?? \"127.0.0.1\"\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject)\n server.listen(opts.port, bind, () => resolve())\n })\n\n return {\n url: `http://${bind}:${opts.port}`,\n async stop() {\n // Per-request transports/servers are torn down on `res.close`,\n // so we only need to stop the HTTP listener here. The WSS is\n // bound `noServer:true` so closing the HTTP server also tears\n // down its underlying TCP socket; live WS connections receive\n // a close frame from the kernel.\n wss.close()\n await new Promise<void>((resolve) => server.close(() => resolve()))\n },\n }\n}\n\n/**\n * Reject an HTTP upgrade attempt with a structured plaintext body.\n * `ws.handleUpgrade` is meant to be the success path — if we can't\n * accept the upgrade we write a minimal HTTP response and destroy\n * the socket, matching ws's own internal error path.\n */\nfunction rejectUpgrade(\n socket: Duplex,\n status: number,\n reason: string,\n message?: string,\n): void {\n const reasonText = `${status} ${reason}`\n const body: { error: string; message?: string } = { error: reason }\n if (message) body.message = message\n try {\n socket.write(\n `HTTP/1.1 ${reasonText}\\r\\n` +\n `Content-Type: application/json\\r\\n` +\n `Connection: close\\r\\n\\r\\n` +\n JSON.stringify(body) +\n `\\n`,\n )\n } catch {\n // socket already gone — fall through\n }\n socket.destroy()\n}\n\n/**\n * Per-connection WS handler for /sessions/:id/pty. Attaches as a\n * subscriber to the SessionsRegistry; bridges JSON frames in both\n * directions. Per-subscriber backpressure: if the WS's `bufferedAmount`\n * exceeds a threshold, the next chunk is dropped (slow client must\n * not stall the daemon's fan-out to other subscribers).\n */\nfunction handlePtyWebSocket(\n ws: WebSocket,\n req: IncomingMessage,\n sessionId: string,\n registry: SessionsRegistry,\n): void {\n // Parse cols/rows from the query string for the initial dimension\n // hint. Real clients will send a {kind:\"resize\"} immediately after\n // connecting; this seeds the registry's min-size calculation so the\n // first replay frames render at a sensible width if no resize comes.\n const query = new URLSearchParams(\n (req.url ?? \"\").includes(\"?\") ? (req.url ?? \"\").split(\"?\")[1] : \"\",\n )\n const cols = clampPositiveInt(query.get(\"cols\"), 80)\n const rows = clampPositiveInt(query.get(\"rows\"), 24)\n\n // Backpressure threshold — when the socket has more than 256 KiB\n // queued, drop the next data frame for THIS subscriber rather than\n // letting the registry block on send. Other subscribers stay live.\n const BACKPRESSURE_BYTES = 256 * 1024\n\n const handle = registry.attachPty(\n sessionId,\n { cols, rows },\n chunk => {\n if (ws.readyState !== ws.OPEN) return\n if (ws.bufferedAmount > BACKPRESSURE_BYTES) return // drop\n ws.send(\n JSON.stringify({ kind: \"data\", b64: chunk.toString(\"base64\") }),\n )\n },\n evt => {\n if (ws.readyState !== ws.OPEN) return\n ws.send(\n JSON.stringify({\n kind: \"exit\",\n exitCode: evt.exitCode,\n ...(evt.signal != null ? { signal: evt.signal } : {}),\n }),\n )\n // Close ourselves once we've emitted exit — the session can be\n // reattached for a buffer replay but this socket is done.\n try {\n ws.close(1000, \"session exited\")\n } catch {\n // ignore\n }\n },\n )\n\n if (!handle) {\n // Race: the session may have vanished between the upgrade and\n // attach. Close politely.\n try {\n ws.close(1011, \"session not attachable\")\n } catch {\n // ignore\n }\n return\n }\n\n ws.on(\"message\", (raw, isBinary) => {\n if (isBinary) {\n // Binary frames not supported yet — wire format is JSON-only.\n return\n }\n let frame: unknown\n try {\n frame = JSON.parse(raw.toString(\"utf8\"))\n } catch {\n return // malformed\n }\n if (!frame || typeof frame !== \"object\") return\n const f = frame as Record<string, unknown>\n switch (f.kind) {\n case \"input\": {\n // Accept either {text} (UTF-8) or {b64} (arbitrary bytes,\n // useful for clients sending raw key sequences).\n if (typeof f.text === \"string\") {\n handle.write(f.text)\n } else if (typeof f.b64 === \"string\") {\n try {\n handle.write(Buffer.from(f.b64, \"base64\").toString(\"utf8\"))\n } catch {\n // ignore malformed base64\n }\n }\n break\n }\n case \"resize\": {\n const c =\n typeof f.cols === \"number\" && f.cols > 0 ? Math.floor(f.cols) : null\n const r =\n typeof f.rows === \"number\" && f.rows > 0 ? Math.floor(f.rows) : null\n if (c && r) handle.resize(c, r)\n break\n }\n case \"ping\":\n // Reply with pong so client keepalive logic works. Optional.\n try {\n ws.send(JSON.stringify({ kind: \"pong\" }))\n } catch {\n // ignore\n }\n break\n // Unknown kinds silently dropped; reserved for forward compat.\n }\n })\n\n ws.on(\"close\", () => {\n handle.detach()\n })\n ws.on(\"error\", () => {\n handle.detach()\n })\n}\n\nfunction clampPositiveInt(raw: string | null, fallback: number): number {\n if (!raw) return fallback\n const n = Number.parseInt(raw, 10)\n return Number.isFinite(n) && n > 0 ? n : fallback\n}\n\nfunction clampInt(\n raw: string | null,\n fallback: number,\n min: number,\n max: number,\n): number {\n if (!raw) return fallback\n const n = Number.parseInt(raw, 10)\n if (!Number.isFinite(n)) return fallback\n if (n < min) return min\n if (n > max) return max\n return n\n}\n\n/**\n * /sessions routes — split out of the main switch so the surface\n * stays scannable. Returns `true` when it handled the request, so\n * the dispatcher knows to skip the 404 path.\n *\n * GET /sessions → list of SessionDescriptor[]\n * GET /sessions/:id → one SessionDescriptor\n * GET /sessions/:id/stream → SSE stream {line,stream} events\n * POST /sessions/:id/kill → SIGTERM, returns {ok}\n * DELETE /sessions/:id → forget (drop from registry; only\n * valid for exited/killed/error)\n */\nasync function handleSessions(\n req: IncomingMessage,\n res: ServerResponse,\n path: string,\n registry: SessionsRegistry,\n resolveAgentAdapter?: AgentAdapterResolver,\n ptyEnabled = false,\n): Promise<boolean> {\n const json = (status: number, body: unknown): void => {\n res.writeHead(status, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(body))\n }\n\n if (path === \"/sessions\" && req.method === \"GET\") {\n json(200, { sessions: registry.list() })\n return true\n }\n\n // Long-running agent session — spawn via the cli's adapter\n // resolver, hold across multiple turns. Body shape:\n // {adapter: \"claude-code\"|\"hermes\"|...,\n // workspaceSlug, cwd, prompt?, label?}\n if (path === \"/sessions/agent\" && req.method === \"POST\") {\n if (!resolveAgentAdapter) {\n json(501, {\n error: \"agent_resolver_not_configured\",\n message:\n \"POST /sessions/agent needs the host to inject `resolveAgentAdapter` \" +\n \"(e.g. via @agentproto/cli's resolveAdapter shim).\",\n })\n return true\n }\n const body = await readJsonBody(req)\n if (!body || typeof body !== \"object\") {\n json(400, { error: \"invalid_body\" })\n return true\n }\n const b = body as Record<string, unknown>\n const adapter = typeof b.adapter === \"string\" ? b.adapter : \"\"\n if (!adapter) {\n json(400, { error: \"missing_adapter\" })\n return true\n }\n // cwd resolution priority:\n // 1. explicit `cwd` in the body\n // 2. lookup `workspaceSlug` in ~/.agentproto/workspaces.json\n // 3. active workspace from the same config\n // 4. process.cwd() (last resort, almost certainly not what\n // the user wants — log it so the operator notices)\n let cwd: string | null =\n typeof b.cwd === \"string\" && b.cwd.length > 0 ? b.cwd : null\n let workspaceSlug =\n typeof b.workspaceSlug === \"string\" ? b.workspaceSlug : \"\"\n if (!cwd) {\n try {\n const config = await loadWorkspacesConfig()\n const ws = workspaceSlug\n ? findWorkspace(config, workspaceSlug)\n : getActiveWorkspace(config)\n if (ws) {\n cwd = ws.path\n workspaceSlug = ws.slug\n }\n } catch {\n // Config missing / unreadable — fall through to process.cwd()\n }\n }\n if (!cwd) {\n cwd = process.cwd()\n console.warn(\n `[/sessions/agent] no cwd resolvable for adapter=${adapter} ` +\n `(no body.cwd, no workspaceSlug match in ~/.agentproto/workspaces.json, ` +\n `no active workspace) — falling back to daemon's cwd ${cwd}`\n )\n }\n if (!workspaceSlug) workspaceSlug = \"default\"\n const resolved = await resolveAgentAdapter(adapter)\n if (!resolved) {\n json(404, { error: \"adapter_not_found\", adapter })\n return true\n }\n try {\n const resumeSessionId =\n typeof b.resumeSessionId === \"string\" && b.resumeSessionId.length > 0\n ? b.resumeSessionId\n : undefined\n const agentSession = await resolved.startSession({\n cwd,\n ...(resumeSessionId ? { resumeSessionId } : {}),\n })\n const desc = registry.spawnAgent({\n workspaceSlug,\n cwd,\n agentSession,\n adapterSlug: adapter,\n ...(typeof b.prompt === \"string\" ? { initialPrompt: b.prompt } : {}),\n ...(typeof b.label === \"string\" ? { label: b.label } : {}),\n ...(resolved.commandPreview\n ? { commandPreview: resolved.commandPreview }\n : {}),\n })\n json(201, desc)\n } catch (err) {\n json(500, {\n error: \"agent_spawn_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n }\n return true\n }\n\n // Long-running PTY session — spawn argv under node-pty. Bytes flow\n // through the registry's byte ring buffer; attach via the WebSocket\n // upgrade at /sessions/:id/pty. Body shape:\n // {argv: string[], cwd?, workspaceSlug?, cols, rows, env?, name?, label?}\n if (path === \"/sessions/terminal\" && req.method === \"POST\") {\n if (!ptyEnabled) {\n json(501, {\n error: \"pty_not_configured\",\n message:\n \"POST /sessions/terminal needs the host to inject `spawnPty` into createGateway \" +\n \"(node-pty optional dep — install in @agentproto/cli).\",\n })\n return true\n }\n const body = await readJsonBody(req)\n if (!body || typeof body !== \"object\") {\n json(400, { error: \"invalid_body\" })\n return true\n }\n const b = body as Record<string, unknown>\n const argv = Array.isArray(b.argv)\n ? (b.argv as unknown[]).filter((v): v is string => typeof v === \"string\")\n : []\n if (argv.length === 0) {\n json(400, { error: \"missing_argv\" })\n return true\n }\n const cols = typeof b.cols === \"number\" && b.cols > 0 ? Math.floor(b.cols) : 80\n const rows = typeof b.rows === \"number\" && b.rows > 0 ? Math.floor(b.rows) : 24\n // cwd resolution mirrors /sessions/agent exactly.\n let cwd: string | null =\n typeof b.cwd === \"string\" && b.cwd.length > 0 ? b.cwd : null\n let workspaceSlug =\n typeof b.workspaceSlug === \"string\" ? b.workspaceSlug : \"\"\n if (!cwd) {\n try {\n const config = await loadWorkspacesConfig()\n const ws = workspaceSlug\n ? findWorkspace(config, workspaceSlug)\n : getActiveWorkspace(config)\n if (ws) {\n cwd = ws.path\n workspaceSlug = ws.slug\n }\n } catch {\n // fall through to process.cwd()\n }\n }\n if (!cwd) {\n cwd = process.cwd()\n console.warn(\n `[/sessions/terminal] no cwd resolvable for argv=${argv.join(\" \")} ` +\n `— falling back to daemon's cwd ${cwd}`\n )\n }\n if (!workspaceSlug) workspaceSlug = \"default\"\n try {\n const desc = registry.spawnPty({\n argv,\n cwd,\n workspaceSlug,\n cols,\n rows,\n ...(b.env && typeof b.env === \"object\"\n ? { env: b.env as Record<string, string> }\n : {}),\n ...(typeof b.name === \"string\" ? { name: b.name } : {}),\n ...(typeof b.label === \"string\" ? { label: b.label } : {}),\n })\n json(201, desc)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n const status = msg.includes(\"already in use\")\n ? 409\n : msg.includes(\"no PTY factory\")\n ? 501\n : 500\n json(status, { error: \"pty_spawn_failed\", message: msg })\n }\n return true\n }\n\n // Send a follow-up turn to a live agent session.\n // Body: { prompt: string | ContentBlock | ContentBlock[] }\n // - string → auto-wrapped to a single text block by\n // the registry (legacy / convenience).\n // - ContentBlock → e.g. `{type:\"image\", source:{...}}`\n // - ContentBlock[] → text + image mix for multimodal turns.\n // Forwarded as-is to `agentSession.send`\n // so the adapter (claude-agent-acp, …)\n // negotiates its own content shape.\n //\n // Validation is intentionally loose — we accept anything object-\n // shaped + non-empty arrays + non-empty strings. The adapter will\n // reject ill-formed blocks with a clear error projected into the\n // session's ring buffer; throwing here would just duplicate that.\n //\n // Query: ?wait=false → fire-and-forget (return 202 after sync\n // validation; output streams via /sessions/:id/stream). Default\n // wait=true keeps the call blocking until the turn drains, which\n // is what curl scripts + the MCP bridge expect.\n const promptMatch = path.match(/^\\/sessions\\/([^/]+)\\/prompt$/)\n if (promptMatch && req.method === \"POST\") {\n const id = promptMatch[1]\n if (!id) return false\n const body = await readJsonBody(req)\n const prompt = (body as { prompt?: unknown } | null)?.prompt\n const validPrompt =\n (typeof prompt === \"string\" && prompt.length > 0) ||\n (Array.isArray(prompt) &&\n prompt.length > 0 &&\n prompt.every(b => b !== null && typeof b === \"object\")) ||\n (prompt !== null && typeof prompt === \"object\" && !Array.isArray(prompt))\n if (!validPrompt) {\n json(400, {\n error: \"missing_prompt\",\n message:\n \"Body `prompt` must be a non-empty string, a content block object, or an array of content blocks.\",\n })\n return true\n }\n const reqUrl = req.url ?? \"\"\n const queryString = reqUrl.includes(\"?\")\n ? reqUrl.slice(reqUrl.indexOf(\"?\") + 1)\n : \"\"\n const wait = new URLSearchParams(queryString).get(\"wait\")\n const fireAndForget = wait === \"false\" || wait === \"0\"\n try {\n if (fireAndForget) {\n registry.enqueuePrompt(id, prompt)\n json(202, { ok: true, id, queued: true })\n } else {\n await registry.sendPrompt(id, prompt)\n json(200, { ok: true, id })\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n // Differentiate \"not found\" / \"wrong kind\" / \"busy\" — they\n // surface as readable thrown messages from the registry.\n const status = msg.includes(\"no session\")\n ? 404\n : msg.includes(\"not an agent\")\n ? 400\n : msg.includes(\"mid-turn\")\n ? 409\n : 500\n json(status, { error: \"send_prompt_failed\", message: msg })\n }\n return true\n }\n\n if (path === \"/sessions\" && req.method === \"POST\") {\n const body = await readJsonBody(req)\n if (!body || typeof body !== \"object\") {\n json(400, { error: \"invalid_body\" })\n return true\n }\n const b = body as Record<string, unknown>\n const argv = Array.isArray(b.argv)\n ? (b.argv as unknown[]).filter((v): v is string => typeof v === \"string\")\n : []\n if (argv.length === 0) {\n json(400, { error: \"missing_argv\" })\n return true\n }\n try {\n const desc = registry.spawn({\n kind:\n b.kind === \"terminal\" || b.kind === \"agent-cli\" || b.kind === \"command\"\n ? b.kind\n : \"command\",\n workspaceSlug:\n typeof b.workspaceSlug === \"string\" ? b.workspaceSlug : \"default\",\n cwd: typeof b.cwd === \"string\" ? b.cwd : process.cwd(),\n argv,\n env:\n b.env && typeof b.env === \"object\"\n ? (b.env as Record<string, string>)\n : undefined,\n label: typeof b.label === \"string\" ? b.label : undefined,\n })\n json(201, desc)\n } catch (err) {\n json(500, {\n error: \"spawn_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n }\n return true\n }\n\n // Per-id routes. The `:id` slot also accepts a session's `name`\n // when one was set at spawn time — `findByIdOrName` resolves both\n // and the rest of the handler operates on the canonical id.\n const idMatch = path.match(\n /^\\/sessions\\/([^/]+)(\\/stream|\\/kill|\\/preview)?$/,\n )\n if (!idMatch) return false\n const [, rawIdOrName, suffix] = idMatch\n if (!rawIdOrName) return false\n const resolvedDesc = registry.findByIdOrName(rawIdOrName)\n const id = resolvedDesc?.id ?? rawIdOrName\n\n if (suffix === \"/preview\" && req.method === \"GET\") {\n // Read-only snapshot of the recent ring buffer — used by the\n // dashboard's detail pane so the user sees what the session was\n // doing without committing to an attach. Returns BOTH lines\n // (for agent-cli/command sessions) and recent-bytes (for PTY).\n // Caller picks whichever is populated.\n if (!resolvedDesc) {\n json(404, { error: \"session_not_found\", id: rawIdOrName })\n return true\n }\n const reqUrl = req.url ?? \"\"\n const qs = new URLSearchParams(\n reqUrl.includes(\"?\") ? reqUrl.slice(reqUrl.indexOf(\"?\") + 1) : \"\",\n )\n const lineCap = clampInt(qs.get(\"lines\"), 10, 1, 200)\n const byteCap = clampInt(qs.get(\"bytes\"), 16 * 1024, 256, 64 * 1024)\n // No registry method exists for \"give me the recent buffer\n // snapshot\" — readTerminalOutput is the closest. For non-PTY\n // sessions, attach with a no-op subscriber, read backfill,\n // detach. Cheap; the backfill is synchronous on attach.\n const lines: string[] = []\n if (resolvedDesc.pty !== true) {\n const unsub = registry.attach(id, line => {\n lines.push(line)\n })\n if (unsub) unsub()\n }\n const bufBytes = registry.readTerminalOutput(id, byteCap)\n json(200, {\n id: resolvedDesc.id,\n lines: lines.slice(-lineCap),\n bytes: bufBytes ? bufBytes.toString(\"base64\") : null,\n })\n return true\n }\n\n if (suffix === \"/stream\" && req.method === \"GET\") {\n if (!resolvedDesc) {\n json(404, { error: \"session_not_found\", id: rawIdOrName })\n return true\n }\n res.writeHead(200, {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n })\n // Keep-alive ping every 25s — proxies / browsers eventually\n // close idle SSE connections; the comment line keeps the pipe\n // warm without confusing the EventSource parser (it ignores\n // anything starting with `:`).\n const ping = setInterval(() => {\n try {\n res.write(`: keep-alive\\n\\n`)\n } catch {\n clearInterval(ping)\n }\n }, 25_000)\n const unsub = registry.attach(id, (line, stream) => {\n try {\n res.write(\n `data: ${JSON.stringify({ line, stream })}\\n\\n`\n )\n } catch {\n // Client gone — cleanup happens on `close`.\n }\n })\n if (!unsub) {\n clearInterval(ping)\n res.end()\n return true\n }\n req.once(\"close\", () => {\n unsub()\n clearInterval(ping)\n })\n return true\n }\n\n if (suffix === \"/kill\" && req.method === \"POST\") {\n const ok = registry.kill(id)\n json(ok ? 200 : 404, { ok, id })\n return true\n }\n\n if (!suffix && req.method === \"GET\") {\n if (!resolvedDesc) {\n json(404, { error: \"session_not_found\", id: rawIdOrName })\n return true\n }\n json(200, resolvedDesc)\n return true\n }\n\n if (!suffix && req.method === \"DELETE\") {\n const ok = registry.forget(id)\n json(ok ? 200 : 404, { ok, id })\n return true\n }\n\n return false\n}\n\nasync function readJsonBody(req: IncomingMessage): Promise<unknown> {\n const chunks: Buffer[] = []\n for await (const chunk of req) {\n chunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk)\n }\n if (chunks.length === 0) return null\n try {\n return JSON.parse(Buffer.concat(chunks).toString(\"utf8\"))\n } catch {\n return null\n }\n}\n","/**\n * Per-adapter resume strategies — the daemon's view of \"how do I\n * continue a previous session for THIS adapter?\".\n *\n * The driver already has an `AgentCliContinuation` declaration in\n * the adapter manifest (AIP-45). That covers strategy NAMES\n * (`native-resume`, `pinned-session`, `transcript`, `none`) but is\n * silent on the mechanics that live OUTSIDE the runtime — like\n * \"where on disk does this adapter store its conversations?\" or\n * \"what argv do I pass to resume into PTY mode?\".\n *\n * This table is that practical bridge. Each entry declares three\n * optional hooks:\n *\n * outputHint regex matched against each output line; group 1 is\n * the resume id. Stored as `desc.resumeMetadata[storeAs]`.\n * fsProbe async function that probes a per-adapter directory\n * for a stored session id, scoped to a workspace cwd.\n * Used when `outputHint` never matched.\n * spawnArgs given a captured id, returns the argv to spawn a\n * PTY that resumes the session. agentproto then\n * bypasses ACP/agent-cli and runs the provider\n * directly — the most reliable resume path because\n * it leans on the provider's native UX.\n *\n * Adapters that don't declare anything here fall back to:\n * 1. ACP-level resume via `resumeSessionId` on POST /sessions/agent\n * 2. Fresh spawn (same shape, no continuity)\n *\n * Eventually each adapter should ship its own strategy on\n * `AgentCliHandle.resumeStrategy` (driver-side). This central table\n * is the bootstrap: it lets a new adapter become resume-capable\n * without bumping its npm package; once that lands, entries\n * graduate into the adapter packages.\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { join, resolve } from \"node:path\"\n\n/** Where on disk the resume id ends up on the session descriptor. */\nexport type ResumeMetadataKey =\n | \"claudeResumeId\"\n | \"hermesResumeId\"\n | \"codexResumeId\"\n | \"openClawResumeId\"\n | \"openCodeResumeId\"\n\nexport interface ResumeStrategy {\n /** When set, run on every output line for this adapter. Group 1\n * captures the resume id. The match is saved on the descriptor\n * as `resumeMetadata[storeAs]`. */\n outputHint?: RegExp\n /** Where the matched id is recorded on the descriptor. */\n storeAs: ResumeMetadataKey\n /** Probe the adapter's on-disk session store for the most-recently\n * modified session in the given workspace. Returns the resume id\n * or null when nothing eligible. Files older than `prevStartedAt`\n * are ignored (avoids resuming an unrelated prior conversation).\n *\n * Skip when the adapter doesn't persist sessions externally. */\n fsProbe?(cwd: string, prevStartedAt: string): Promise<string | null>\n /** Return the argv to spawn a PTY that resumes into the given id.\n * When omitted, the daemon falls back to ACP-level resume via\n * the agent-cli protocol instead of the provider's native CLI. */\n spawnArgs?(id: string): string[]\n}\n\nexport const RESUME_STRATEGIES: Record<string, ResumeStrategy> = {\n \"claude-code\": {\n // Printed by claude on graceful exit when session persistence\n // is on (default). Example: `claude --resume 0e483f81-1a44-4bec-9667-b37158450296`\n outputHint: /claude\\s+--resume\\s+([0-9a-f-]{8,})/i,\n storeAs: \"claudeResumeId\",\n fsProbe: probeMtimeLatestJsonl(\".claude/projects\"),\n spawnArgs: id => [\"claude\", \"--resume\", id],\n },\n\n // Stubs for other shipped adapters — fill in as we learn each\n // provider's resume mechanism. Today they fall back to ACP-level\n // resume (whatever the agent-cli runtime supports) or fresh spawn.\n //\n // hermes: { storeAs: \"hermesResumeId\", ... }\n // codex: { storeAs: \"codexResumeId\", ... }\n // openclaw: { storeAs: \"openClawResumeId\", ... }\n // opencode: { storeAs: \"openCodeResumeId\", ... }\n}\n\n/**\n * Build an `fsProbe` for adapters that store one `.jsonl` per session\n * inside `~/<storeRel>/<cwd-encoded>/`. The encoded cwd is the\n * absolute path with `/` → `-` (claude's convention; others tend to\n * use the same scheme). Returns the UUID of the most-recently\n * modified `.jsonl`, filtered to files at-or-after `prevStartedAt`.\n */\nfunction probeMtimeLatestJsonl(\n storeRel: string,\n): (cwd: string, prevStartedAt: string) => Promise<string | null> {\n return async (cwd, prevStartedAt) => {\n const encoded = cwd.replace(/\\//g, \"-\")\n const dir = resolve(homedir(), storeRel, encoded)\n let entries: string[]\n try {\n entries = await fs.readdir(dir)\n } catch {\n return null\n }\n const jsonl = entries.filter(e => e.endsWith(\".jsonl\"))\n if (jsonl.length === 0) return null\n const startedAtMs = Date.parse(prevStartedAt)\n const candidates: { name: string; mtime: number }[] = []\n for (const f of jsonl) {\n try {\n const st = await fs.stat(join(dir, f))\n if (!Number.isFinite(startedAtMs) || st.mtimeMs >= startedAtMs - 1000) {\n candidates.push({ name: f, mtime: st.mtimeMs })\n }\n } catch {\n // ignore unreadable entry\n }\n }\n if (candidates.length === 0) return null\n candidates.sort((a, b) => b.mtime - a.mtime)\n return candidates[0]!.name.replace(/\\.jsonl$/, \"\")\n }\n}\n\n/**\n * Helper: which adapters declare any resume capability? Used by\n * `agentproto sessions restart` to print a helpful \"this adapter\n * doesn't support resume; falling back to fresh spawn\" hint when\n * applicable.\n */\nexport function hasResumeStrategy(adapterSlug: string | undefined): boolean {\n if (!adapterSlug) return false\n const s = RESUME_STRATEGIES[adapterSlug]\n return !!(s && (s.outputHint || s.fsProbe || s.spawnArgs))\n}\n","/**\n * Sessions registry — tracks long-lived child processes spawned by\n * the agentproto daemon (terminals, agent CLIs, custom commands).\n *\n * The registry lives in-memory for the daemon's lifetime; a recent\n * snapshot also persists to `~/.agentproto/sessions.json` so a fresh\n * daemon restart can show \"you had these running before\" instead of\n * losing all visibility on a crash.\n *\n * Each session owns:\n * - identity: id, kind, workspace slug, command + args, started time\n * - lifecycle: status (starting/running/exited/killed/error)\n * - output: last N lines (ring buffer) for instant attach + a\n * Node EventEmitter for live streaming consumers\n *\n * Consumers:\n * - HTTP routes (GET /sessions, /sessions/:id, /sessions/:id/stream,\n * POST /sessions/:id/kill)\n * - CLI `agentproto sessions` (TUI navigation + attach)\n * - guilde-web Active tab (session cards + terminal viewer)\n */\n\nimport { spawn, type ChildProcess } from \"node:child_process\"\nimport { EventEmitter } from \"node:events\"\nimport { mkdirSync, writeFileSync, promises as fs, readFileSync } from \"node:fs\"\nimport { RESUME_STRATEGIES } from \"./resume-strategies.js\"\nimport { dirname, resolve } from \"node:path\"\nimport { homedir } from \"node:os\"\nimport { randomUUID } from \"node:crypto\"\n\n/**\n * Minimal shape we need from a driver-agent-cli session — kept as a\n * structural type so the runtime package doesn't take a hard\n * dependency on @agentproto/driver-agent-cli (the http-server route\n * imports it and passes the constructed session in).\n */\nexport interface AgentSessionLike {\n sessionId: string\n send(message: unknown): AsyncIterable<AgentStreamEvent>\n cancel(): Promise<void>\n close(): Promise<void>\n}\n\n/**\n * Minimal PTY surface — structurally compatible with\n * @agentproto/acp/tunnel's PtyProcess (node-pty's IPty wrapper). The\n * runtime declares its own so this package stays native-free; the\n * cli's pty-factory util constructs values that satisfy both.\n */\nexport interface PtyProcess {\n readonly pid: number\n write(data: string): void\n resize(cols: number, rows: number): void\n kill(signal?: string): void\n onData(handler: (data: string) => void): void\n onExit(handler: (event: { exitCode: number; signal?: number }) => void): void\n}\n\nexport interface PtyFactoryOptions {\n command: string\n args: string[]\n cwd?: string\n env?: Record<string, string>\n cols: number\n rows: number\n}\n\nexport type PtyFactory = (opts: PtyFactoryOptions) => PtyProcess\n\nexport interface AgentStreamEvent {\n kind: string\n text?: string\n toolName?: string\n isError?: boolean\n reason?: string\n error?: { message: string; code?: number; data?: unknown }\n}\n\nexport const SESSIONS_FILE_PATH = (): string =>\n resolve(homedir(), \".agentproto\", \"sessions.json\")\n\nexport type SessionKind = \"terminal\" | \"agent-cli\" | \"command\"\nexport type SessionStatus =\n | \"starting\"\n | \"running\"\n | \"exited\"\n | \"killed\"\n | \"error\"\n\nexport interface SessionDescriptor {\n id: string\n kind: SessionKind\n workspaceSlug: string\n /** What was actually run — quoted joined for display purposes\n * (`bash -lc \"claude --resume xyz\"`). */\n command: string\n pid: number | null\n status: SessionStatus\n startedAt: string\n endedAt?: string\n exitCode?: number\n /** Last time anything was written to stdout/stderr. Lets the UI\n * spot stuck sessions (\"running for 2h, last output 12min ago\"). */\n lastOutputAt?: string\n /** Free-text label the spawner can attach (e.g. conversation id,\n * operator name) so the UI can group/filter. */\n label?: string\n /** True when the session was spawned under a real PTY (node-pty)\n * instead of `child_process.spawn`. PTY sessions carry raw ANSI\n * bytes (alt-screen, key bindings, colors); attach goes through\n * WS /sessions/:id/pty rather than SSE /sessions/:id/stream. */\n pty?: boolean\n /** User-friendly slug supplied at spawn time. Optional; when set,\n * attach/stop/kill commands accept it as an alias for the id. */\n name?: string\n /** Argv that was spawned. Persisted so `agentproto sessions restart`\n * can clone the original shape without re-tokenizing the display\n * `command` string. Empty for agent-cli sessions (we record\n * `adapterSlug` separately). */\n argv?: readonly string[]\n /** Working directory the session was spawned in. Cloned by restart. */\n cwd?: string\n /** Adapter slug for agent-cli sessions — restart uses this with\n * `/sessions/agent` to spin up a fresh ACP runtime. Undefined for\n * pty/command kinds. */\n adapterSlug?: string\n /** ACP-level session id (the adapter's own handle — claude-code's\n * conversation id, hermes' chat id, …). Set at spawnAgent time\n * from `agentSession.sessionId`. Survives across daemon restarts\n * via sessions.json so `restart` can pass it as `resumeSessionId`\n * and reattach to the prior conversation history. */\n adapterSessionId?: string\n /** Provider-specific resume hints sniffed from the session's\n * output. claude-code prints `claude --resume <uuid>` on exit;\n * we capture that uuid as `claudeResumeId`. On `restart`, when a\n * hint is present, agentproto prefers a PTY spawn with the\n * provider's native resume command (`claude --resume <id>`) over\n * the ACP-level resume — works wherever the provider persisted\n * the session, not just when the ACP wrapper did.\n *\n * Keys are adapter-specific so future adapters can add their own\n * (\"hermesResumeId\", etc.) without changing this type. */\n resumeMetadata?: Record<string, string>\n}\n\ninterface SessionRuntime {\n desc: SessionDescriptor\n /** Set when the session is a raw spawn (`kind: \"command\"|\"terminal\"`).\n * Agent sessions don't expose the underlying process — the\n * driver-agent-cli runtime owns it. */\n child?: ChildProcess\n /** Set when the session is an agent-cli (multi-turn). The registry\n * keeps it alive across turns; sendPrompt(id, prompt) re-uses it. */\n agentSession?: AgentSessionLike\n /** Adapter slug — only set for agent sessions, helps the UI render\n * \"claude-code\" / \"hermes\" badges. */\n adapterSlug?: string\n /** Set when the session is a PTY (spawnPty). Bytes flow through\n * pty.onData → recentBytes ring + emitter \"data\" event. */\n pty?: PtyProcess\n /** Per-subscriber size requests for the PTY. Min cols/rows\n * across the live set is what we actually call pty.resize with\n * (mirrors tmux's \"smallest attached client wins\" rule). */\n ptySubscribers?: Map<number, { cols: number; rows: number }>\n /** Ring buffer of recent stdout+stderr lines. Capped so a runaway\n * child can't blow the daemon's heap. */\n recentLines: string[]\n /** Ring buffer of recent PTY bytes for replay-on-attach. Total\n * size capped at RECENT_BYTES_CAP — oldest chunks dropped first. */\n recentBytes: Buffer[]\n recentBytesSize: number\n emitter: EventEmitter\n /** True while a turn is in flight. POST /sessions/:id/prompt rejects\n * with 409 when busy — the agent can only handle one turn at a\n * time per session. */\n busy: boolean\n /** Buffer for partial text-delta fragments — agent text events\n * arrive as chunks, we coalesce them across deltas and split on\n * newlines so each line lands as a discrete ring-buffer entry. */\n textBuf: string\n /** Same as textBuf but for `thought` events. Some agents (hermes)\n * stream chain-of-thought as one delta per token, which made the\n * ring buffer unreadable when each token got its own\n * `[thought]` line — coalesce the same way text-delta does. */\n thoughtBuf: string\n /** In-flight resume promise. Deduplicates concurrent prompt\n * attempts on a dead agent session — only one resume call hits\n * the adapter, the rest await this promise. Cleared once\n * resolved (success or failure). */\n resumePromise?: Promise<void>\n}\n\nconst RECENT_LINES_CAP = 500\nconst RECENT_BYTES_CAP = 64 * 1024\nconst PERSIST_DEBOUNCE_MS = 1_500\n/** Cap on the number of historical descriptors loaded from\n * sessions.json at boot. Older entries (by startedAt) are dropped\n * on overflow — newest history wins. Adjust upward if the file\n * starts feeling sparse; downward if the dashboard takes too long\n * to render. */\nconst HISTORY_CAP = 200\n\n/** Strip CSI / SGR ANSI sequences so resume-pattern matching works\n * on dim/coloured output. Liberal regex covering most cases — we\n * don't need byte-perfect parsing here. */\nfunction stripAnsiCodes(s: string): string {\n return s.replace(/\\x1b\\[[0-9;?]*[A-Za-z]/g, \"\")\n}\n\nexport interface SessionsRegistry {\n spawn(input: SpawnSessionInput): SessionDescriptor\n /** Adopt a ChildProcess that was spawned outside the registry —\n * e.g. by the tunnel server when the host dispatches a spawn\n * frame. The registry attaches its stdout/stderr listeners and\n * tracks the descriptor so the child shows up in /sessions and\n * the LocalDaemonSessionsCard. The caller keeps lifecycle\n * ownership (kill / wait); this is purely for observability.\n * Returns the descriptor for the registered session. */\n register(input: RegisterSessionInput): SessionDescriptor\n /** Register an already-built agent session (caller resolves the\n * adapter + builds the runtime). Sets kind=\"agent-cli\", consumes\n * the optional initial prompt synchronously, returns the\n * descriptor. The agent stays alive — call `sendPrompt(id, ...)`\n * for follow-up turns until `kill(id)` closes it. */\n spawnAgent(input: SpawnAgentInput): SessionDescriptor\n /** Spawn a process under a real PTY (node-pty). Bytes flow through\n * the registry's byte ring buffer + emitter; attach with\n * `attachPty(id, ...)`. Throws when the registry was constructed\n * without a `spawnPty` factory (node-pty optional dep missing). */\n spawnPty(input: SpawnPtyInput): SessionDescriptor\n /** Send a follow-up turn to a live agent session. Throws when the\n * session is missing, not an agent-cli kind, or busy. The events\n * stream into the existing ring buffer + line emitter so /stream\n * consumers see them as they arrive. */\n sendPrompt(id: string, message: unknown): Promise<void>\n /** Fire-and-forget variant of `sendPrompt`. Validates the same\n * preconditions synchronously — throws on missing session / wrong\n * kind / busy — but returns immediately after the turn is started,\n * letting the caller stream output via the SSE endpoint instead of\n * blocking on the full turn. Async errors during the turn are\n * pushed into the ring buffer as `[error]` lines so `/stream`\n * subscribers see them. Used by the web UI's chat input where a\n * long turn would otherwise freeze the textbox. */\n enqueuePrompt(id: string, message: unknown): void\n list(): SessionDescriptor[]\n get(id: string): SessionDescriptor | undefined\n /** Subscribe to a session's output. Returns an unsubscribe fn.\n * Initial backfill: synchronously invokes `onLine` once for each\n * line currently in the ring buffer so attaches show context. */\n attach(\n id: string,\n onLine: (line: string, stream: \"stdout\" | \"stderr\") => void\n ): (() => void) | null\n /** Subscribe to a PTY session's byte stream. Returns a control\n * handle (write/resize/detach) and null when the session is\n * missing or not a PTY kind. Replays the ring buffer\n * synchronously before live frames start. Initial `cols`/`rows`\n * are required so the registry can compute min-size across\n * subscribers; recompute on every `resize` call. */\n attachPty(\n id: string,\n initial: { cols: number; rows: number },\n onData: (chunk: Buffer) => void,\n onExit: (event: { exitCode: number; signal?: number }) => void\n ): {\n write(data: string): void\n resize(cols: number, rows: number): void\n detach(): void\n } | null\n /** Find a session by exact id OR exact name match. Returns the\n * descriptor or undefined. Used by HTTP/MCP routes so callers\n * can refer to \"claude-main\" instead of \"sess_a3f8c1b2\". */\n findByIdOrName(query: string): SessionDescriptor | undefined\n /** Write a chunk of text to a PTY session's stdin. Returns true\n * on success, false when the session is missing or not a PTY.\n * Single-shot variant of attachPty().write — useful for MCP\n * tools that drive a session through tool calls. */\n writeTerminalInput(id: string, data: string): boolean\n /** Snapshot the recent PTY byte buffer as one Buffer. Newest\n * bytes at the end; `lastBytes` caps the returned size from the\n * tail. Returns null when the session is missing or not a PTY. */\n readTerminalOutput(id: string, lastBytes?: number): Buffer | null\n kill(id: string, signal?: NodeJS.Signals): boolean\n /** Stop tracking a session (after it exited and the user clicked\n * \"clear\"). Doesn't kill — use `kill` first. */\n forget(id: string): boolean\n /** Stop persisting + close all sessions. Killed children are not\n * awaited — the daemon shutdown loop handles process tree teardown. */\n shutdown(): void\n}\n\nexport interface RegisterSessionInput {\n /** Pre-existing child process to adopt (e.g. from a tunnel spawn). */\n child: ChildProcess\n /** Stable id — typically the tunnel's execId so callers cross-ref. */\n id: string\n workspaceSlug: string\n /** Display label for the descriptor's `command` field. */\n command: string\n kind?: SessionKind\n label?: string\n}\n\nexport interface SpawnAgentInput {\n workspaceSlug: string\n cwd: string\n /** Driver-built session ready to receive turns. Caller resolves\n * the adapter, calls createAgentCliRuntime(handle).start({cwd}),\n * and hands the result here. */\n agentSession: AgentSessionLike\n /** Adapter slug for the descriptor (display only). */\n adapterSlug: string\n /** Optional initial prompt to dispatch immediately. The promise\n * the registry returns resolves AFTER the spawn — the prompt\n * runs in the background, projecting events into the ring\n * buffer. Skip to spawn idle. */\n initialPrompt?: string\n label?: string\n /** Pretty command for the descriptor (display only). */\n commandPreview?: string\n}\n\nexport interface SpawnSessionInput {\n kind: SessionKind\n workspaceSlug: string\n /** Path of the workspace root (for the child's cwd). The registry\n * doesn't validate it against the workspaces config — caller has\n * already resolved this. */\n cwd: string\n /** Argv. First element is the binary; rest are passed verbatim. */\n argv: string[]\n /** Extra env on top of the daemon's process.env. */\n env?: Record<string, string>\n /** Optional pre-set id (lets the spawner reference the session\n * before the spawn returns — useful for telemetry). */\n id?: string\n label?: string\n /** Keep the child's stdin open (default: closed). Most spawned\n * agents are non-interactive and emit a warning when stdin is a\n * pipe with no writer (claude-code prints \"no stdin data\n * received in 3s, proceeding without it\"). Closing stdin lets\n * them skip the wait. PTY/terminal kinds that genuinely need\n * bidirectional IO should opt in via `keepStdin: true` and the\n * caller is then responsible for writing to `child.stdin`. */\n keepStdin?: boolean\n}\n\nexport interface SpawnPtyInput {\n workspaceSlug: string\n cwd: string\n argv: string[]\n /** Initial PTY dimensions. The registry uses min(cols, rows) across\n * active subscribers thereafter — these are the seed values used\n * before anyone attaches. */\n cols: number\n rows: number\n /** Extra env on top of process.env. TERM/LANG/PATH are forced by\n * the factory layer (node-pty.spawn options); don't try to clear\n * them here. */\n env?: Record<string, string>\n /** User-friendly slug. Used by `findByIdOrName(query)`. Must not\n * collide with an existing session's name. */\n name?: string\n label?: string\n}\n\n/**\n * Hook the registry uses to rebuild a dead agent session on demand.\n * Invoked when a prompt arrives for an agent-cli session whose\n * `agentSession` was lost (typically daemon restart). Returns a fresh\n * `AgentSessionLike` bound to the same upstream conversation via\n * `resumeSessionId`, OR null if resume isn't possible (adapter gone,\n * upstream rejected). When null, the prompt path surfaces the same\n * \"not an agent session\" error as before — caller knows the row is a\n * ghost.\n *\n * The CLI wires this into the registry by passing in a closure that\n * calls `resolveAgentAdapter(slug)?.startSession({cwd, resumeSessionId})`,\n * which is the same path the gateway's POST /sessions/agent uses.\n */\nexport type AgentSessionResumer = (input: {\n adapterSlug: string\n cwd: string\n resumeSessionId: string\n}) => Promise<AgentSessionLike | null>\n\nexport function createSessionsRegistry(opts?: {\n /** Override the persistence path — tests pin a tmpdir. */\n persistPath?: string\n /** Disable persistence entirely. */\n persist?: boolean\n /** PTY factory (node-pty wrapper). When omitted, `spawnPty()`\n * throws — the daemon advertises PTY support only when the cli\n * layer resolved node-pty successfully. */\n spawnPty?: PtyFactory\n /** Hook called when a prompt arrives for an agent-cli session whose\n * agentSession binding is gone (daemon restart). When provided,\n * the registry transparently resumes the session via the adapter's\n * resumeSessionId before dispatching the turn. When omitted,\n * killed agent-cli sessions surface the legacy \"not an agent\n * session\" error and the user must spawn fresh. */\n resumeAgent?: AgentSessionResumer\n}): SessionsRegistry {\n const persistPath = opts?.persistPath ?? SESSIONS_FILE_PATH()\n const persist = opts?.persist ?? true\n const ptyFactory = opts?.spawnPty\n const resumeAgent = opts?.resumeAgent\n const sessions = new Map<string, SessionRuntime>()\n let persistTimer: ReturnType<typeof setTimeout> | null = null\n // Monotonically-growing PTY-subscriber id. Detach is O(1) on\n // Map.delete(subId), so we never reuse — overflow at Number.MAX_-\n // SAFE_INTEGER would take ~285 years at 1M attaches/sec.\n let nextSubId = 1\n // Guards `shutdown()` from running twice — double-stop happens in\n // serve --interactive's Ctrl-C race; without this, the second\n // call writes an empty snapshot over the real one.\n let shutdownDone = false\n\n // ── boot-time history load ──\n // Read sessions.json synchronously at construction so the dashboard\n // shows historical sessions immediately on daemon restart. Anything\n // that was \"running\" or \"starting\" when the daemon last died gets\n // marked \"killed\" — we have no way to know if the orphan child\n // survived the daemon's exit, and pretending it's still alive would\n // make attach calls fail mysteriously.\n //\n // Historical entries are GHOSTS: descriptor only, no child / no\n // agentSession / no pty. Calls like kill(id) / attach(id) work on\n // them but degrade to no-ops (the underlying process is gone). The\n // session's `endedAt` is set to now when we infer a kill, so the\n // dashboard ages them from this boot rather than the daemon's last\n // life.\n if (persist) {\n loadHistorySnapshot(persistPath, sessions)\n }\n\n // Belt-and-suspenders: `process.on(\"exit\")` runs even on uncaught\n // throws, terminal-close (SIGHUP), and any termination path that\n // bypassed the regular SIGINT/SIGTERM cleanup. The handler must be\n // sync (Node won't await async there); we already use sync IO in\n // `shutdown()` so this is safe. Idempotency guard inside shutdown\n // prevents a double-write when both this handler and the explicit\n // SIGINT path fire.\n const onProcessExit = (): void => {\n shutdownImpl()\n }\n if (persist) {\n process.on(\"exit\", onProcessExit)\n }\n\n const schedulePersist = (): void => {\n if (!persist) return\n if (persistTimer) clearTimeout(persistTimer)\n persistTimer = setTimeout(() => {\n void persistSnapshot()\n }, PERSIST_DEBOUNCE_MS)\n }\n\n const persistSnapshot = async (): Promise<void> => {\n try {\n const snapshot = {\n savedAt: new Date().toISOString(),\n sessions: Array.from(sessions.values()).map(s => s.desc),\n }\n await fs.mkdir(dirname(persistPath), { recursive: true })\n await fs.writeFile(persistPath, JSON.stringify(snapshot, null, 2) + \"\\n\")\n } catch (err) {\n // Persistence is best-effort — log only, never throw.\n console.warn(\n `[sessions] persist failed: ${\n err instanceof Error ? err.message : String(err)\n }`\n )\n }\n }\n\n const appendLine = (\n rt: SessionRuntime,\n line: string,\n stream: \"stdout\" | \"stderr\"\n ): void => {\n rt.recentLines.push(line)\n if (rt.recentLines.length > RECENT_LINES_CAP) {\n rt.recentLines.splice(0, rt.recentLines.length - RECENT_LINES_CAP)\n }\n rt.desc.lastOutputAt = new Date().toISOString()\n sniffResumeHints(rt, line)\n rt.emitter.emit(\"line\", { line, stream })\n }\n\n /**\n * Provider-specific resume-hint sniffer. Looks up the adapter's\n * strategy in `RESUME_STRATEGIES` and runs its `outputHint` regex\n * against each agent-cli line. The captured id is recorded on the\n * descriptor so `agentproto sessions restart` can use it.\n *\n * ANSI-stripped before matching so dim/color codes don't break the\n * pattern. Adapters without a strategy entry (or without an\n * outputHint) are skipped — they fall back to ACP-level resume.\n */\n const sniffResumeHints = (rt: SessionRuntime, line: string): void => {\n if (rt.desc.kind !== \"agent-cli\") return\n const strategy = rt.desc.adapterSlug\n ? RESUME_STRATEGIES[rt.desc.adapterSlug]\n : undefined\n if (!strategy?.outputHint) return\n const plain = stripAnsiCodes(line)\n const m = plain.match(strategy.outputHint)\n if (m && m[1]) {\n rt.desc.resumeMetadata = {\n ...(rt.desc.resumeMetadata ?? {}),\n [strategy.storeAs]: m[1],\n }\n schedulePersist()\n }\n }\n\n /**\n * PTY byte ring buffer. Keeps the last ~64 KiB of raw bytes so a\n * fresh attacher sees the current screenful (alt-screen apps like\n * Claude TUI / vim repaint on next interaction but a snapshot is\n * still better than blank). Drops oldest chunks when over cap;\n * never splits within a chunk — Buffer arithmetic on UTF-8 mid-\n * sequence would corrupt multi-byte glyphs.\n */\n const appendBytes = (rt: SessionRuntime, chunk: Buffer): void => {\n rt.recentBytes.push(chunk)\n rt.recentBytesSize += chunk.byteLength\n while (\n rt.recentBytesSize > RECENT_BYTES_CAP &&\n rt.recentBytes.length > 1\n ) {\n const dropped = rt.recentBytes.shift()\n if (dropped) rt.recentBytesSize -= dropped.byteLength\n }\n rt.desc.lastOutputAt = new Date().toISOString()\n rt.emitter.emit(\"data\", chunk)\n }\n\n /**\n * Recompute the smallest cols/rows across the active subscriber\n * set and resize the PTY accordingly (tmux's \"smallest attached\n * client wins\" rule). No-op when the subscriber map is empty.\n */\n const reconcilePtySize = (rt: SessionRuntime): void => {\n if (!rt.pty || !rt.ptySubscribers || rt.ptySubscribers.size === 0) return\n let cols = Infinity\n let rows = Infinity\n for (const dim of rt.ptySubscribers.values()) {\n if (dim.cols < cols) cols = dim.cols\n if (dim.rows < rows) rows = dim.rows\n }\n if (!Number.isFinite(cols) || !Number.isFinite(rows)) return\n try {\n rt.pty.resize(cols, rows)\n } catch {\n // pty may have exited between the emit and the resize — swallow.\n }\n }\n\n /**\n * Project ACP-style stream events into ring-buffer lines. Keeps\n * the line shape simple so the existing /stream SSE consumer\n * (and the xterm panel) just renders them as-is.\n */\n const projectEvent = (rt: SessionRuntime, evt: AgentStreamEvent): void => {\n switch (evt.kind) {\n case \"text-delta\":\n if (evt.text) {\n // text-delta is a stream of chunks — split on newlines so\n // each line lands in the ring buffer separately. Coalesce\n // a trailing fragment via rt.textBuf.\n const combined = rt.textBuf + evt.text\n const lines = combined.split(/\\r?\\n/)\n rt.textBuf = lines.pop() ?? \"\"\n for (const line of lines) appendLine(rt, line, \"stdout\")\n }\n break\n case \"thought\":\n if (evt.text) {\n // Same coalescing as text-delta — some adapters stream\n // chain-of-thought one token at a time, which would\n // otherwise produce ~100 [thought] lines per turn.\n const combined = rt.thoughtBuf + evt.text\n const lines = combined.split(/\\r?\\n/)\n rt.thoughtBuf = lines.pop() ?? \"\"\n for (const line of lines) {\n if (line.trim()) {\n appendLine(rt, `\\x1b[2m[thought] ${line}\\x1b[0m`, \"stdout\")\n }\n }\n }\n break\n case \"tool-call\":\n appendLine(\n rt,\n `\\x1b[36m[tool] ${evt.toolName ?? \"?\"}\\x1b[0m`,\n \"stdout\"\n )\n break\n case \"tool-result\":\n if (evt.isError)\n appendLine(rt, `\\x1b[31m[tool-error]\\x1b[0m`, \"stderr\")\n break\n case \"agent-prompt\":\n appendLine(rt, `\\x1b[33m[awaiting input]\\x1b[0m`, \"stdout\")\n break\n case \"turn-end\": {\n // Flush any buffered text/thought fragments as final lines.\n if (rt.thoughtBuf.trim()) {\n appendLine(\n rt,\n `\\x1b[2m[thought] ${rt.thoughtBuf}\\x1b[0m`,\n \"stdout\"\n )\n }\n rt.thoughtBuf = \"\"\n if (rt.textBuf) {\n appendLine(rt, rt.textBuf, \"stdout\")\n rt.textBuf = \"\"\n }\n appendLine(\n rt,\n `\\x1b[2m── turn-end (${evt.reason ?? \"completed\"}) ──\\x1b[0m`,\n \"stdout\"\n )\n break\n }\n case \"error\": {\n const code =\n typeof evt.error?.code === \"number\" ? ` (code ${evt.error.code})` : \"\"\n appendLine(\n rt,\n `\\x1b[31m[error]${code} ${evt.error?.message ?? \"unknown\"}\\x1b[0m`,\n \"stderr\"\n )\n // Project the child's stderr tail when define-agent-cli\n // attached it — otherwise the user sees only \"Invalid\n // params\" and has to dig into the daemon log for context.\n const data = evt.error?.data as\n | { stderr?: unknown }\n | null\n | undefined\n if (data && typeof data === \"object\" && typeof data.stderr === \"string\") {\n for (const line of data.stderr.split(/\\r?\\n/)) {\n if (line) appendLine(rt, `\\x1b[2m ${line}\\x1b[0m`, \"stderr\")\n }\n }\n break\n }\n }\n }\n\n /**\n * Drive one agent turn. Sets busy=true, drains the event stream\n * into the ring buffer, clears busy on completion. Bumps the\n * descriptor status to \"error\" if the iteration throws (network\n * drop, child died mid-turn).\n */\n /**\n * Shared sync validation for sendPrompt + enqueuePrompt. Throws on\n * missing session / wrong kind / busy so both code paths surface\n * the exact same error messages — the only difference is whether\n * the caller awaits the turn.\n */\n const validateAgentTurn = (id: string, caller: string): SessionRuntime => {\n const rt = sessions.get(id)\n if (!rt) throw new Error(`${caller}: no session \"${id}\"`)\n if (!rt.agentSession) {\n throw new Error(\n `${caller}: session \"${id}\" is not an agent session (kind=${rt.desc.kind})`\n )\n }\n if (rt.busy) {\n throw new Error(\n `${caller}: session \"${id}\" is mid-turn — wait for it to finish or cancel`\n )\n }\n return rt\n }\n\n /**\n * Attempt to resume a dead agent-cli session by re-spawning the\n * adapter with the persisted `adapterSessionId`. The conversation\n * continues from where it left off — ACP's `resumeSessionId`\n * contract guarantees the adapter rehydrates state from the\n * upstream provider (Anthropic / OpenAI / etc.) when supported.\n *\n * Returns silently when:\n * - resumeAgent hook wasn't provided (older daemon embedding)\n * - session is already alive (binding present)\n * - session is a non-agent kind (terminal/command can't resume)\n * - descriptor lacks adapterSessionId or adapterSlug (legacy row\n * persisted before resume metadata was tracked)\n *\n * Concurrent prompt arrivals share one resume attempt via\n * `rt.resumePromise`.\n */\n const maybeResumeAgent = async (rt: SessionRuntime): Promise<void> => {\n if (rt.agentSession) return\n if (!resumeAgent) return\n if (rt.desc.kind !== \"agent-cli\") return\n const adapterSlug = rt.desc.adapterSlug ?? rt.adapterSlug\n const adapterSessionId = rt.desc.adapterSessionId\n const cwd = rt.desc.cwd\n if (!adapterSlug || !adapterSessionId || !cwd) return\n if (rt.resumePromise) {\n await rt.resumePromise\n return\n }\n rt.resumePromise = (async () => {\n appendLine(\n rt,\n `── resuming ${adapterSlug} session ${adapterSessionId} ──`,\n \"stdout\"\n )\n try {\n const fresh = await resumeAgent({\n adapterSlug,\n cwd,\n resumeSessionId: adapterSessionId,\n })\n if (!fresh) {\n appendLine(\n rt,\n `[error] resume failed: adapter '${adapterSlug}' returned null`,\n \"stderr\"\n )\n return\n }\n rt.agentSession = fresh\n rt.adapterSlug = adapterSlug\n rt.desc.adapterSessionId = fresh.sessionId\n if (rt.desc.status !== \"running\") {\n rt.desc.status = \"running\"\n delete rt.desc.endedAt\n delete rt.desc.exitCode\n rt.emitter.emit(\"status\", rt.desc.status)\n }\n schedulePersist()\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n appendLine(rt, `[error] resume failed: ${msg}`, \"stderr\")\n }\n })()\n try {\n await rt.resumePromise\n } finally {\n rt.resumePromise = undefined\n }\n }\n\n const runAgentTurn = async (\n rt: SessionRuntime,\n message: unknown\n ): Promise<void> => {\n if (!rt.agentSession) {\n throw new Error(\"runAgentTurn: session has no agentSession\")\n }\n rt.busy = true\n try {\n appendLine(\n rt,\n `\\x1b[2m── ▶ ${typeof message === \"string\" ? message : JSON.stringify(message)} ──\\x1b[0m`,\n \"stdout\"\n )\n // ACP's `prompt` field expects ContentBlock[] (or a single\n // block). Hosts that send a raw string get auto-wrapped into\n // `{type: \"text\", text: \"...\"}` so callers can hand us\n // human-friendly prompts without shaping the wire format.\n const wrapped =\n typeof message === \"string\" ? { type: \"text\", text: message } : message\n for await (const evt of rt.agentSession.send(wrapped)) {\n projectEvent(rt, evt)\n }\n } catch (err) {\n rt.desc.status = \"error\"\n rt.desc.endedAt = new Date().toISOString()\n appendLine(\n rt,\n `[turn error] ${err instanceof Error ? err.message : String(err)}`,\n \"stderr\"\n )\n schedulePersist()\n } finally {\n rt.busy = false\n }\n }\n\n const wireOutputStreams = (rt: SessionRuntime): void => {\n const onChunk =\n (stream: \"stdout\" | \"stderr\") =>\n (chunk: Buffer | string): void => {\n const text = typeof chunk === \"string\" ? chunk : chunk.toString(\"utf8\")\n for (const line of text.split(/\\r?\\n/)) {\n if (line.length > 0) appendLine(rt, line, stream)\n }\n }\n // Only called from spawn() which always sets rt.child — narrow\n // here so the stream listeners don't trip the optional-chain.\n if (!rt.child) return\n rt.child.stdout?.on(\"data\", onChunk(\"stdout\"))\n rt.child.stderr?.on(\"data\", onChunk(\"stderr\"))\n }\n\n return {\n spawn(input) {\n const id = input.id ?? `sess_${randomUUID().slice(0, 8)}`\n if (sessions.has(id)) {\n throw new Error(`sessions.spawn: id \"${id}\" already in use`)\n }\n const env = { ...process.env, ...(input.env ?? {}) }\n // Filter out Node bookkeeping that confuses subprocesses.\n delete env.NODE_OPTIONS\n const [bin, ...args] = input.argv\n if (!bin) throw new Error(\"sessions.spawn: argv must include a binary\")\n // Close stdin by default — most agent CLIs spawn-and-prompt\n // (claude/codex/aider/etc.) read argv for the prompt and will\n // otherwise sit waiting for piped input. Caller opts in to a\n // writeable stdin via `keepStdin: true` (terminal/PTY kinds).\n const stdinMode = input.keepStdin ? \"pipe\" : \"ignore\"\n const child = spawn(bin, args, {\n cwd: input.cwd,\n env: env as NodeJS.ProcessEnv,\n stdio: [stdinMode, \"pipe\", \"pipe\"],\n })\n const desc: SessionDescriptor = {\n id,\n kind: input.kind,\n workspaceSlug: input.workspaceSlug,\n command: [bin, ...args].map(quoteArg).join(\" \"),\n pid: child.pid ?? null,\n status: \"starting\",\n startedAt: new Date().toISOString(),\n argv: input.argv,\n cwd: input.cwd,\n ...(input.label ? { label: input.label } : {}),\n }\n const rt: SessionRuntime = {\n desc,\n child,\n recentLines: [],\n recentBytes: [],\n recentBytesSize: 0,\n emitter: new EventEmitter(),\n busy: false,\n textBuf: \"\",\n thoughtBuf: \"\",\n }\n // Don't crash the daemon when no listener is attached — the\n // emitter's \"error\" event would otherwise propagate.\n rt.emitter.setMaxListeners(50)\n\n sessions.set(id, rt)\n wireOutputStreams(rt)\n\n child.once(\"spawn\", () => {\n desc.status = \"running\"\n rt.emitter.emit(\"status\", desc.status)\n schedulePersist()\n })\n child.once(\"error\", err => {\n desc.status = \"error\"\n desc.endedAt = new Date().toISOString()\n appendLine(rt, `[spawn error] ${err.message}`, \"stderr\")\n rt.emitter.emit(\"status\", desc.status)\n schedulePersist()\n })\n child.once(\"exit\", (code, signal) => {\n if (signal && desc.status !== \"killed\") desc.status = \"killed\"\n else if (desc.status === \"running\" || desc.status === \"starting\") {\n desc.status = \"exited\"\n }\n desc.endedAt = new Date().toISOString()\n if (typeof code === \"number\") desc.exitCode = code\n rt.emitter.emit(\"status\", desc.status)\n schedulePersist()\n })\n schedulePersist()\n return desc\n },\n register(input) {\n if (sessions.has(input.id)) {\n // Already adopted (re-tracking is a noop). Return the\n // existing descriptor so callers don't have to special-case.\n const existing = sessions.get(input.id)\n if (existing) return existing.desc\n }\n const desc: SessionDescriptor = {\n id: input.id,\n kind: input.kind ?? \"command\",\n workspaceSlug: input.workspaceSlug,\n command: input.command,\n pid: input.child.pid ?? null,\n status: input.child.killed ? \"killed\" : \"running\",\n startedAt: new Date().toISOString(),\n ...(input.label ? { label: input.label } : {}),\n }\n const rt: SessionRuntime = {\n desc,\n child: input.child,\n recentLines: [],\n recentBytes: [],\n recentBytesSize: 0,\n emitter: new EventEmitter(),\n busy: false,\n textBuf: \"\",\n thoughtBuf: \"\",\n }\n rt.emitter.setMaxListeners(50)\n sessions.set(input.id, rt)\n wireOutputStreams(rt)\n // Wire exit so the descriptor flips when the adopted child\n // dies — same handlers as spawn() but registered post-hoc\n // because the child is already alive.\n input.child.once(\"exit\", (code, signal) => {\n if (signal && desc.status !== \"killed\") desc.status = \"killed\"\n else if (desc.status === \"running\") desc.status = \"exited\"\n desc.endedAt = new Date().toISOString()\n if (typeof code === \"number\") desc.exitCode = code\n rt.emitter.emit(\"status\", desc.status)\n schedulePersist()\n })\n input.child.once(\"error\", err => {\n desc.status = \"error\"\n desc.endedAt = new Date().toISOString()\n appendLine(rt, `[child error] ${err.message}`, \"stderr\")\n rt.emitter.emit(\"status\", desc.status)\n schedulePersist()\n })\n schedulePersist()\n return desc\n },\n spawnAgent(input) {\n const id = `sess_${randomUUID().slice(0, 8)}`\n const desc: SessionDescriptor = {\n id,\n kind: \"agent-cli\",\n workspaceSlug: input.workspaceSlug,\n command: input.commandPreview ?? `${input.adapterSlug} (agent)`,\n pid: null,\n status: \"running\", // driver already started the session\n startedAt: new Date().toISOString(),\n cwd: input.cwd,\n adapterSlug: input.adapterSlug,\n // ACP-level session id — sticks across daemon restart so\n // `agentproto sessions restart <id>` can pass it as\n // `resumeSessionId` and the adapter reattaches to the prior\n // conversation rather than starting blank.\n adapterSessionId: input.agentSession.sessionId,\n ...(input.label ? { label: input.label } : {}),\n }\n const rt: SessionRuntime = {\n desc,\n agentSession: input.agentSession,\n adapterSlug: input.adapterSlug,\n recentLines: [],\n recentBytes: [],\n recentBytesSize: 0,\n emitter: new EventEmitter(),\n busy: false,\n textBuf: \"\",\n thoughtBuf: \"\",\n }\n rt.emitter.setMaxListeners(50)\n sessions.set(id, rt)\n appendLine(\n rt,\n `── ${input.adapterSlug} agent session ${input.agentSession.sessionId} (cwd ${input.cwd}) ──`,\n \"stdout\"\n )\n schedulePersist()\n // Fire-and-forget the initial prompt (if any). Errors land in\n // the ring buffer + bump status to \"error\" but don't reject\n // the spawn — the descriptor was already returned.\n if (input.initialPrompt) {\n void runAgentTurn(rt, input.initialPrompt).catch(err => {\n appendLine(\n rt,\n `[turn error] ${err instanceof Error ? err.message : String(err)}`,\n \"stderr\"\n )\n })\n }\n return desc\n },\n spawnPty(input) {\n if (!ptyFactory) {\n throw new Error(\n \"sessions.spawnPty: no PTY factory configured (node-pty optional dep missing in the daemon)\"\n )\n }\n const id = `sess_${randomUUID().slice(0, 8)}`\n // Reject the name only when the prior holder is still alive —\n // killed/exited/error sessions keep their descriptor in the\n // registry for history, but their name is free to reuse so\n // `stop X && terminal --name X` round-trips cleanly.\n if (input.name) {\n for (const rt of sessions.values()) {\n if (rt.desc.name !== input.name) continue\n const status = rt.desc.status\n if (status === \"running\" || status === \"starting\") {\n throw new Error(\n `sessions.spawnPty: name \"${input.name}\" already in use by ${rt.desc.id} (status=${status})`,\n )\n }\n // Free the name on the dead session so id-or-name lookup\n // resolves to the NEW one. The old descriptor stays in the\n // registry (you can still find it by id in the list).\n rt.desc.name = undefined\n }\n }\n const [bin, ...args] = input.argv\n if (!bin) {\n throw new Error(\"sessions.spawnPty: argv must include a binary\")\n }\n // node-pty forces its own minimal env unless we forward — pass\n // process.env merged with caller overrides. The factory layer\n // also forces TERM=xterm-256color so alt-screen apps render.\n const env = { ...(process.env as Record<string, string>), ...(input.env ?? {}) }\n delete env.NODE_OPTIONS\n const pty: PtyProcess = ptyFactory({\n command: bin,\n args,\n cwd: input.cwd,\n env,\n cols: input.cols,\n rows: input.rows,\n })\n const desc: SessionDescriptor = {\n id,\n kind: \"terminal\",\n workspaceSlug: input.workspaceSlug,\n command: [bin, ...args].map(quoteArg).join(\" \"),\n pid: pty.pid,\n status: \"running\",\n startedAt: new Date().toISOString(),\n pty: true,\n argv: input.argv,\n cwd: input.cwd,\n ...(input.name ? { name: input.name } : {}),\n ...(input.label ? { label: input.label } : {}),\n }\n const rt: SessionRuntime = {\n desc,\n pty,\n ptySubscribers: new Map(),\n recentLines: [],\n recentBytes: [],\n recentBytesSize: 0,\n emitter: new EventEmitter(),\n busy: false,\n textBuf: \"\",\n thoughtBuf: \"\",\n }\n rt.emitter.setMaxListeners(50)\n sessions.set(id, rt)\n pty.onData((chunk: string) => {\n // node-pty emits utf-8 strings. Convert once at the boundary\n // so the ring buffer + emitter consumers all see Buffer.\n appendBytes(rt, Buffer.from(chunk, \"utf8\"))\n })\n pty.onExit(evt => {\n if (rt.desc.status !== \"killed\") {\n rt.desc.status = \"exited\"\n }\n rt.desc.endedAt = new Date().toISOString()\n if (typeof evt.exitCode === \"number\") rt.desc.exitCode = evt.exitCode\n rt.emitter.emit(\"exit\", evt)\n rt.emitter.emit(\"status\", rt.desc.status)\n schedulePersist()\n })\n schedulePersist()\n return desc\n },\n async sendPrompt(id, message) {\n const rtPre = sessions.get(id)\n if (rtPre) await maybeResumeAgent(rtPre)\n const rt = validateAgentTurn(id, \"sendPrompt\")\n await runAgentTurn(rt, message)\n },\n enqueuePrompt(id, message) {\n // For sync `enqueuePrompt`, we need to surface an immediate\n // error when the session is missing OR when it's a non-agent\n // kind that can't be resumed at all. But when the session IS\n // an agent-cli with resume metadata, defer validation until\n // after the resume attempt so a dead-but-resumable row Just\n // Works for the caller (no \"not an agent session\" error after\n // a daemon restart).\n const rtPre = sessions.get(id)\n if (!rtPre) {\n throw new Error(`enqueuePrompt: no session \"${id}\"`)\n }\n if (rtPre.desc.kind !== \"agent-cli\") {\n throw new Error(\n `enqueuePrompt: session \"${id}\" is not an agent session (kind=${rtPre.desc.kind})`\n )\n }\n if (rtPre.busy) {\n throw new Error(\n `enqueuePrompt: session \"${id}\" is mid-turn — wait for it to finish or cancel`\n )\n }\n // Fire-and-forget: resume (if needed) then dispatch. Errors\n // during either step land in the ring buffer as `[error]`\n // lines so the SSE consumer sees them.\n void (async () => {\n try {\n await maybeResumeAgent(rtPre)\n const rt = validateAgentTurn(id, \"enqueuePrompt\")\n await runAgentTurn(rt, message)\n } catch (err) {\n appendLine(\n rtPre,\n `[error] ${err instanceof Error ? err.message : String(err)}`,\n \"stderr\"\n )\n }\n })()\n },\n list() {\n return Array.from(sessions.values())\n .map(s => s.desc)\n .sort((a, b) => b.startedAt.localeCompare(a.startedAt))\n },\n get(id) {\n return sessions.get(id)?.desc\n },\n attach(id, onLine) {\n const rt = sessions.get(id)\n if (!rt) return null\n // Backfill: synchronously replay the ring buffer so attaches\n // see the recent context, then subscribe for new lines.\n for (const line of rt.recentLines) onLine(line, \"stdout\")\n const handler = (evt: {\n line: string\n stream: \"stdout\" | \"stderr\"\n }): void => onLine(evt.line, evt.stream)\n rt.emitter.on(\"line\", handler)\n return () => rt.emitter.off(\"line\", handler)\n },\n attachPty(id, initial, onData, onExit) {\n const rt = sessions.get(id)\n if (!rt || !rt.pty || !rt.ptySubscribers) return null\n // Backfill: flush the byte ring buffer so a fresh attach lands\n // on the recent screenful. Alt-screen apps repaint on next\n // input but a snapshot is still better than blank.\n for (const chunk of rt.recentBytes) onData(chunk)\n // Subscriber registration: a monotonically-growing key so the\n // size map can hold the per-subscriber dims and detach is O(1).\n const subId = nextSubId++\n rt.ptySubscribers.set(subId, { cols: initial.cols, rows: initial.rows })\n reconcilePtySize(rt)\n const dataHandler = (chunk: Buffer): void => onData(chunk)\n const exitHandler = (evt: {\n exitCode: number\n signal?: number\n }): void => onExit(evt)\n rt.emitter.on(\"data\", dataHandler)\n rt.emitter.once(\"exit\", exitHandler)\n return {\n write(data: string): void {\n if (!rt.pty) return\n try {\n rt.pty.write(data)\n } catch {\n // PTY already exited — drop the input silently.\n }\n },\n resize(cols: number, rows: number): void {\n if (!rt.ptySubscribers) return\n rt.ptySubscribers.set(subId, { cols, rows })\n reconcilePtySize(rt)\n },\n detach(): void {\n rt.emitter.off(\"data\", dataHandler)\n rt.emitter.off(\"exit\", exitHandler)\n rt.ptySubscribers?.delete(subId)\n reconcilePtySize(rt)\n },\n }\n },\n findByIdOrName(query) {\n const direct = sessions.get(query)\n if (direct) return direct.desc\n for (const rt of sessions.values()) {\n if (rt.desc.name === query) return rt.desc\n }\n return undefined\n },\n writeTerminalInput(id, data) {\n const rt = sessions.get(id)\n if (!rt || !rt.pty) return false\n try {\n rt.pty.write(data)\n return true\n } catch {\n return false\n }\n },\n readTerminalOutput(id, lastBytes) {\n const rt = sessions.get(id)\n if (!rt || !rt.pty) return null\n const joined = Buffer.concat(rt.recentBytes, rt.recentBytesSize)\n if (typeof lastBytes === \"number\" && lastBytes > 0 && joined.byteLength > lastBytes) {\n return joined.subarray(joined.byteLength - lastBytes)\n }\n return joined\n },\n kill(id, signal = \"SIGTERM\") {\n const rt = sessions.get(id)\n if (!rt) return false\n if (\n rt.desc.status === \"exited\" ||\n rt.desc.status === \"killed\" ||\n rt.desc.status === \"error\"\n ) {\n return false\n }\n rt.desc.status = \"killed\"\n rt.desc.endedAt = new Date().toISOString()\n // Close agent session first (graceful protocol shutdown), then\n // SIGTERM the underlying child/pty if any. Either branch is a\n // best-effort — the descriptor flip is what the UI surfaces.\n if (rt.agentSession) {\n void rt.agentSession.close().catch(() => undefined)\n }\n if (rt.pty) {\n try {\n rt.pty.kill(signal)\n } catch {\n // pty already gone — fall through\n }\n }\n rt.child?.kill(signal)\n schedulePersist()\n return true\n },\n forget(id) {\n const rt = sessions.get(id)\n if (!rt) return false\n // Don't leak: tear down the emitter so backfill listeners stop.\n rt.emitter.removeAllListeners()\n sessions.delete(id)\n schedulePersist()\n return true\n },\n shutdown() {\n shutdownImpl()\n },\n }\n\n /**\n * The actual shutdown logic, hoisted so both the explicit\n * `shutdown()` method AND the `process.on(\"exit\")` safety net\n * can call it. Sync (no awaits) so it works in the `exit` event\n * handler.\n *\n * Idempotent — `serve --interactive` calls gateway.stop() twice in\n * some Ctrl-C race paths (parent SIGINT handler + the child-exit\n * promise both fire), and `process.on(\"exit\")` ALSO fires at the\n * end of every termination path. Without the guard, the second\n * call clears the already-empty sessions Map and writes an empty\n * snapshot back to sessions.json, wiping history.\n */\n function shutdownImpl(): void {\n if (shutdownDone) return\n shutdownDone = true\n if (persistTimer) clearTimeout(persistTimer)\n if (persist) {\n try {\n process.off(\"exit\", onProcessExit)\n } catch {\n // ignore — handler may not be installed\n }\n }\n // Mark any still-alive sessions as killed BEFORE the final\n // flush so the snapshot accurately reflects what happened. On\n // the next boot, load reads these and we won't have to guess\n // (\"was running last time → assume killed\" is then a no-op).\n const nowIso = new Date().toISOString()\n for (const rt of sessions.values()) {\n rt.emitter.removeAllListeners()\n if (\n rt.desc.status === \"running\" ||\n rt.desc.status === \"starting\"\n ) {\n rt.desc.status = \"killed\"\n rt.desc.endedAt = nowIso\n if (rt.agentSession) {\n void rt.agentSession.close().catch(() => undefined)\n }\n if (rt.pty) {\n try {\n rt.pty.kill(\"SIGTERM\")\n } catch {\n // already exited\n }\n }\n rt.child?.kill(\"SIGTERM\")\n }\n }\n // Sync flush so quick sessions (spawned + ended in less than\n // PERSIST_DEBOUNCE_MS) aren't lost. The debounced async write\n // may have been cancelled by clearTimeout above, but a 200-byte\n // sync write at shutdown is cheap and the data needs to land.\n if (persist) {\n try {\n const snapshot = {\n savedAt: nowIso,\n sessions: Array.from(sessions.values()).map(s => s.desc),\n }\n mkdirSync(dirname(persistPath), { recursive: true })\n writeFileSync(persistPath, JSON.stringify(snapshot, null, 2) + \"\\n\")\n } catch {\n // best-effort — same policy as the async path\n }\n }\n sessions.clear()\n }\n}\n\n/**\n * Read the persisted snapshot at boot and reinflate session\n * descriptors as historical \"ghost\" entries. Sync-read because this\n * runs once at construction, the file is small (~200 entries), and\n * keeping it sync avoids making createSessionsRegistry async (would\n * cascade through createGateway + every embedding host).\n *\n * Anything that was \"running\"/\"starting\" when the daemon last died\n * gets re-classified as \"killed\" with endedAt=now — we can't tell\n * if the orphan PID survived the daemon's exit, and pretending it's\n * still alive would make attach/kill calls fail mysteriously. The\n * descriptor stays in the registry for history; the dashboard sees\n * it under SESSIONS, the user can `d` to forget.\n *\n * Ghosts carry NO live child / agentSession / pty — calls that\n * would interact with the underlying process degrade to no-ops.\n * Output ring buffers (lines + bytes) are empty: we don't persist\n * those, only the descriptor metadata.\n */\nfunction loadHistorySnapshot(\n persistPath: string,\n sessions: Map<string, SessionRuntime>,\n): void {\n let raw: string\n try {\n raw = readFileSync(persistPath, \"utf8\")\n } catch {\n return // ENOENT etc. — first boot, no history.\n }\n let parsed: { sessions?: SessionDescriptor[] }\n try {\n parsed = JSON.parse(raw)\n } catch {\n console.warn(\n `[sessions] history file ${persistPath} is malformed — ignoring`,\n )\n return\n }\n if (!Array.isArray(parsed.sessions)) return\n // Newest first so the FIFO cap drops oldest.\n const sorted = parsed.sessions\n .filter((s): s is SessionDescriptor => !!s && typeof s.id === \"string\")\n .sort((a, b) => b.startedAt.localeCompare(a.startedAt))\n .slice(0, HISTORY_CAP)\n const now = new Date().toISOString()\n for (const desc of sorted) {\n if (sessions.has(desc.id)) continue // collision with a live entry — keep live\n const wasAlive = desc.status === \"running\" || desc.status === \"starting\"\n const reclassified: SessionDescriptor = wasAlive\n ? {\n ...desc,\n status: \"killed\",\n endedAt: desc.endedAt ?? now,\n }\n : desc\n const rt: SessionRuntime = {\n desc: reclassified,\n recentLines: [],\n recentBytes: [],\n recentBytesSize: 0,\n emitter: new EventEmitter(),\n busy: false,\n textBuf: \"\",\n thoughtBuf: \"\",\n }\n rt.emitter.setMaxListeners(50)\n sessions.set(desc.id, rt)\n }\n}\n\n/** Minimal shell-quote — wraps args containing whitespace or quotes\n * so the rendered `command` field is copy-pasteable. */\nfunction quoteArg(arg: string): string {\n if (arg === \"\") return '\"\"'\n if (/^[a-zA-Z0-9._/=:@,+-]+$/.test(arg)) return arg\n return `\"${arg.replace(/([\"\\\\$`])/g, \"\\\\$1\")}\"`\n}\n","/**\n * mcp-proxy — connect the daemon as an MCP *client* to every server\n * the user imported via `~/.agentproto/imported-mcps.json`, and\n * surface their tools through dedicated MCP tools on the daemon's\n * own server. The chain looks like:\n *\n * operator (cloud Guilde) ──MCP──▶ agentproto-daemon (this proxy)\n * │\n * ├──stdio──▶ chrome-devtools-mcp\n * └──http───▶ goose-bridge\n *\n * v1 design choice: instead of re-registering each upstream tool\n * under a namespaced name (which requires JSON-Schema↔Zod conversion\n * for every exotic shape — recursive refs, oneOf, etc.), the proxy\n * exposes two indirection tools:\n * - `mcp_list_imported_tools(alias?)` lets the operator discover\n * what's available\n * - `mcp_call_imported(alias, toolName, args)` invokes a specific\n * tool, forwarding the JSON args verbatim\n *\n * Trade-off: agents do a 2-step (list → call) instead of seeing the\n * imports directly in their tool palette. We keep tool inputs\n * unconstrained at the MCP layer; validation is the upstream\n * server's job. v2 can re-expose namespaced tools once we ship a\n * solid JSON-Schema → Zod converter.\n *\n * Lifecycle: clients are connected lazily on the first call that\n * touches them and held open until daemon shutdown. The registry\n * notices new/removed imports by stat'ing the imports file's mtime\n * before each call — cheap, avoids forcing the HTTP routes to push.\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\"\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\"\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\"\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\"\nimport {\n loadImportedMcps,\n IMPORTED_MCPS_PATH,\n type ImportedMcpEntry,\n} from \"./mcp-imports.js\"\nimport type { DiscoveredMcp } from \"./mcp-discovery.js\"\n\ninterface ProxyClient {\n entry: ImportedMcpEntry\n /** Live MCP client. Null while a connect is in-flight or after a\n * connection error — the next call retries. */\n client: Client | null\n /** Tools list cached after the first successful fetch. Cleared on\n * disconnect so stale tool names don't survive a reconnect. */\n tools: ProxyToolDescriptor[] | null\n /** Last connection error message, kept so listAliases can surface\n * diagnostics to the operator without re-throwing on every list. */\n lastError: string | null\n}\n\nexport interface ProxyToolDescriptor {\n name: string\n description?: string\n /** JSON Schema as published by the upstream server. Forwarded to\n * the operator verbatim — they read it to figure out args. */\n inputSchema?: unknown\n}\n\nexport interface ProxyAliasSummary {\n alias: string\n importId: string\n source: DiscoveredMcp[\"source\"]\n type: DiscoveredMcp[\"type\"]\n /** \"connected\" | \"error\" | \"pending\" — pending = never tried yet. */\n status: \"connected\" | \"error\" | \"pending\"\n toolCount: number\n lastError?: string\n}\n\nexport interface CallResult {\n ok: true\n result: unknown\n}\nexport interface CallError {\n ok: false\n error: string\n}\nexport type ProxyCallOutcome = CallResult | CallError\n\nexport class McpProxyRegistry {\n private clients = new Map<string, ProxyClient>()\n private lastMtimeMs = 0\n /** Sentinel so we know whether the file has *ever* been read.\n * Distinguishes \"file missing on first call\" (legit empty state)\n * from \"we've read it before and it's gone\" (treat as empty too,\n * but only after closing live clients). */\n private hasReadOnce = false\n\n /**\n * Reload the imports file when its mtime has advanced. Avoids\n * repeated parsing when nothing changed — most calls are no-ops.\n * Disconnects clients whose import was removed; connects the new\n * set lazily (the first call that touches them).\n */\n async ensureCurrent(): Promise<void> {\n let mtimeMs = 0\n try {\n const st = await fs.stat(IMPORTED_MCPS_PATH())\n mtimeMs = st.mtimeMs\n } catch {\n // ENOENT — empty imports state. If we'd previously loaded\n // some, close them.\n mtimeMs = 0\n }\n if (this.hasReadOnce && mtimeMs === this.lastMtimeMs) return\n\n const config = await loadImportedMcps().catch(() => ({\n version: 1 as const,\n imports: [] as ImportedMcpEntry[],\n }))\n const wantedIds = new Set(config.imports.map(e => e.id))\n\n // Drop clients for imports the user removed.\n for (const [id, c] of this.clients.entries()) {\n if (!wantedIds.has(id)) {\n await safeClose(c.client)\n this.clients.delete(id)\n }\n }\n // Add placeholders for new imports — connect lazily.\n for (const entry of config.imports) {\n const existing = this.clients.get(entry.id)\n if (existing) {\n // Snapshot may have changed (user re-imported same id with\n // different command). Detect by comparing serialised\n // snapshots; on mismatch, force reconnect.\n if (\n JSON.stringify(existing.entry.snapshot) !==\n JSON.stringify(entry.snapshot)\n ) {\n await safeClose(existing.client)\n this.clients.set(entry.id, freshPlaceholder(entry))\n } else {\n existing.entry = entry\n }\n } else {\n this.clients.set(entry.id, freshPlaceholder(entry))\n }\n }\n this.lastMtimeMs = mtimeMs\n this.hasReadOnce = true\n }\n\n /**\n * Lazy connect: the first call to `connectIfNeeded(alias)`\n * actually opens the transport + handshakes. Subsequent calls\n * reuse the live client.\n */\n private async connectIfNeeded(alias: string): Promise<ProxyClient | null> {\n await this.ensureCurrent()\n const handle = this.findByAlias(alias)\n if (!handle) return null\n if (handle.client) return handle\n try {\n const client = await openClient(handle.entry)\n handle.client = client\n handle.lastError = null\n // Eagerly fetch tools so listTools doesn't pay the round-trip\n // on next call. Cheap (single tools/list request).\n const t = await client.listTools()\n handle.tools = t.tools.map(toDescriptor)\n return handle\n } catch (err) {\n handle.client = null\n handle.tools = null\n handle.lastError = err instanceof Error ? err.message : String(err)\n return handle\n }\n }\n\n /** Find a client handle by alias *or* import id (defensive — agents\n * sometimes pass the id from `list_imported_mcps`). */\n private findByAlias(aliasOrId: string): ProxyClient | undefined {\n for (const c of this.clients.values()) {\n if (c.entry.alias === aliasOrId) return c\n if (c.entry.id === aliasOrId) return c\n }\n return undefined\n }\n\n async listAliases(): Promise<ProxyAliasSummary[]> {\n await this.ensureCurrent()\n return Array.from(this.clients.values()).map(c => ({\n alias: c.entry.alias,\n importId: c.entry.id,\n source: c.entry.snapshot.source,\n type: c.entry.snapshot.type,\n status: c.client\n ? \"connected\"\n : c.lastError\n ? \"error\"\n : \"pending\",\n toolCount: c.tools?.length ?? 0,\n ...(c.lastError ? { lastError: c.lastError } : {}),\n }))\n }\n\n async listTools(\n alias: string\n ): Promise<{ ok: true; tools: ProxyToolDescriptor[] } | { ok: false; error: string }> {\n const handle = await this.connectIfNeeded(alias)\n if (!handle) return { ok: false, error: `unknown alias \"${alias}\"` }\n if (!handle.client || !handle.tools) {\n return {\n ok: false,\n error: handle.lastError ?? \"client not connected\",\n }\n }\n return { ok: true, tools: handle.tools }\n }\n\n async callTool(\n alias: string,\n toolName: string,\n args: unknown\n ): Promise<ProxyCallOutcome> {\n const handle = await this.connectIfNeeded(alias)\n if (!handle) return { ok: false, error: `unknown alias \"${alias}\"` }\n if (!handle.client) {\n return {\n ok: false,\n error: handle.lastError ?? \"client not connected\",\n }\n }\n try {\n const result = await handle.client.callTool({\n name: toolName,\n arguments:\n args && typeof args === \"object\"\n ? (args as Record<string, unknown>)\n : {},\n })\n return { ok: true, result }\n } catch (err) {\n // Mark the client as dirty — the connection may have died\n // mid-call (process crash, http server restart). The next call\n // re-opens via connectIfNeeded.\n const msg = err instanceof Error ? err.message : String(err)\n if (/closed|disconnect|EPIPE|ECONNRESET/i.test(msg)) {\n await safeClose(handle.client)\n handle.client = null\n handle.tools = null\n handle.lastError = msg\n }\n return { ok: false, error: msg }\n }\n }\n\n async closeAll(): Promise<void> {\n await Promise.all(\n Array.from(this.clients.values()).map(c => safeClose(c.client))\n )\n this.clients.clear()\n }\n}\n\nfunction freshPlaceholder(entry: ImportedMcpEntry): ProxyClient {\n return { entry, client: null, tools: null, lastError: null }\n}\n\nfunction toDescriptor(tool: {\n name: string\n description?: string\n inputSchema?: unknown\n}): ProxyToolDescriptor {\n return {\n name: tool.name,\n ...(tool.description ? { description: tool.description } : {}),\n ...(tool.inputSchema ? { inputSchema: tool.inputSchema } : {}),\n }\n}\n\n/**\n * Replace `${VAR}` and `${VAR:-default}` placeholders in env values\n * with the corresponding `process.env` entry (or default), the same\n * way claude-code / cursor expand mcp-server env. When the variable\n * is unset and no default is given, the placeholder is dropped — the\n * upstream then sees the env var as absent rather than as the\n * literal `${MISSING_VAR}`, which it usually treats as \"use default\n * config\" rather than \"explicit empty token\".\n */\nfunction expandEnvPlaceholders(\n raw: Record<string, string>\n): Record<string, string> {\n const out: Record<string, string> = {}\n for (const [k, v] of Object.entries(raw)) {\n const expanded = v.replace(\n /\\$\\{([A-Z_][A-Z0-9_]*)(?::-([^}]*))?\\}/gi,\n (_match, name: string, fallback: string | undefined) => {\n const fromEnv = process.env[name]\n if (fromEnv !== undefined) return fromEnv\n if (fallback !== undefined) return fallback\n return \"\"\n }\n )\n // Drop the var entirely if it expanded to empty — keeps the\n // upstream from receiving an empty-string token + treating it as\n // a real (but invalid) credential.\n if (expanded.length === 0) continue\n out[k] = expanded\n }\n return out\n}\n\nasync function safeClose(client: Client | null): Promise<void> {\n if (!client) return\n try {\n await client.close()\n } catch {\n // best-effort\n }\n}\n\n/**\n * Open a transport for a discovered MCP. stdio spawns the command;\n * http/sse open over the network. Returns a connected `Client` on\n * success; throws with a useful message on failure.\n */\nasync function openClient(entry: ImportedMcpEntry): Promise<Client> {\n const snap = entry.snapshot\n const client = new Client(\n { name: \"agentproto-daemon-proxy\", version: \"0.1.0\" },\n { capabilities: {} }\n )\n if (snap.type === \"stdio\") {\n if (!snap.command) {\n throw new Error(\n `import \"${entry.alias}\" is stdio but has no command field`\n )\n }\n // claude-code / cursor / vscode all support `${VAR}` placeholders\n // in the env map (and the more permissive `${VAR:-default}`\n // form). Our scanner stores the snapshot verbatim — expand at\n // spawn time so live env changes work without a re-import, and\n // tokens like REPLICATE_API_TOKEN don't end up forwarded as the\n // literal string `${REPLICATE_API_TOKEN}`.\n const expandedEnv = expandEnvPlaceholders(snap.env ?? {})\n const transport = new StdioClientTransport({\n command: snap.command,\n args: snap.args ?? [],\n env: { ...process.env, ...expandedEnv } as Record<string, string>,\n // Pipe stderr so we can include it in the error message instead of\n // surfacing the opaque \"Connection closed\" MCP error code.\n stderr: \"pipe\",\n })\n const stderrBuf: string[] = []\n transport.stderr?.on(\"data\", (chunk: Buffer | string) => {\n stderrBuf.push(typeof chunk === \"string\" ? chunk : chunk.toString(\"utf8\"))\n if (stderrBuf.length > 40) stderrBuf.shift()\n })\n try {\n await client.connect(transport)\n } catch (err) {\n const stderrText = stderrBuf.join(\"\").trim()\n const msg = err instanceof Error ? err.message : String(err)\n throw new Error(stderrText ? `${msg}\\nstderr: ${stderrText.slice(-600)}` : msg)\n }\n return client\n }\n if (snap.type === \"http\") {\n if (!snap.url) throw new Error(`import \"${entry.alias}\" has no url`)\n const transport = new StreamableHTTPClientTransport(new URL(snap.url), {\n requestInit: {\n headers: snap.headers ?? {},\n },\n })\n await client.connect(transport)\n return client\n }\n if (snap.type === \"sse\") {\n if (!snap.url) throw new Error(`import \"${entry.alias}\" has no url`)\n const transport = new SSEClientTransport(new URL(snap.url), {\n requestInit: {\n headers: snap.headers ?? {},\n },\n })\n await client.connect(transport)\n return client\n }\n throw new Error(\n `import \"${entry.alias}\" has unsupported transport type \"${snap.type}\"`\n )\n}\n","/**\n * Quick Cloudflare Tunnel provider — zero-credential variant.\n *\n * Spawns `cloudflared tunnel --config <ours>` against an isolated\n * config file we write per-tunnel into the workspace, parses the\n * assigned `*.trycloudflare.com` URL out of cloudflared's stderr.\n * No CF account, no API token, no DNS records. Trade-off: URL is\n * ephemeral (different each run) and there's no Cloudflare Access\n * gating — auth happens at the upstream (gateway bearer token, or\n * whatever the tunneled service does for itself).\n *\n * ## Why we don't use `--url`\n *\n * `cloudflared --url http://...` synthesises an inline ingress block\n * but ALSO merges anything from `~/.cloudflared/config.yml`. If a user\n * has prior named-tunnel config there, hostname-specific rules can\n * shadow the inline rule and every request falls through to the\n * built-in `http_status:404` catch-all (the symptom: cloudflared logs\n * `ingressRule=2 originService=http_status:404` for every request,\n * origin never sees traffic). Writing our own config and passing it\n * via `--config` is hermetic — `~/.cloudflared/config.yml` is ignored\n * entirely, so the URL-forward rule always wins.\n *\n * Use this for: ad-hoc demos, \"let me try this from another machine\n * for 10 minutes\", iterating on the remote-MCP UX before committing\n * to a domain.\n *\n * For: persistent URLs / SSO gating, use the named-CF provider (TBD).\n *\n * ## cloudflared discovery\n *\n * Detected on PATH at start time. Missing → throw with a pointer to\n * the install instructions. We deliberately don't bundle binaries —\n * keeps the OSS package free of platform-specific blobs and defers the\n * \"which version\" maintenance tax.\n */\n\nimport { spawn, type ChildProcess } from \"node:child_process\"\nimport { promisify } from \"node:util\"\nimport { execFile } from \"node:child_process\"\nimport { mkdir, writeFile, rm } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport { randomBytes } from \"node:crypto\"\n\nimport type {\n ProviderStartOptions,\n ProviderStartResult,\n RemoteProvider,\n} from \"../remote-controller.js\"\n\nconst execFileAsync = promisify(execFile)\n\nconst URL_REGEX = /https:\\/\\/[a-z0-9-]+\\.trycloudflare\\.com/i\n\nconst STARTUP_TIMEOUT_MS = 30_000\n\nexport function quickTunnelProvider(): RemoteProvider {\n let child: ChildProcess | null = null\n let configPath: string | null = null\n\n return {\n id: \"quick\",\n async start(opts: ProviderStartOptions): Promise<ProviderStartResult> {\n await assertCloudflaredOnPath()\n const targetUrl = `http://${opts.target.host}:${opts.target.port}`\n\n // Per-tunnel sentinel config — the only reason it exists is to\n // override `~/.cloudflared/config.yml` so its ingress rules can't\n // shadow our inline `--url` rule. We deliberately do NOT include\n // an `ingress:` block here: quick-tunnel mode treats `--url` as\n // the routing source of truth, and a stray top-level `ingress:`\n // would fight it. Random suffix avoids collisions when dev\n // restarts overlap.\n const id = randomBytes(4).toString(\"hex\")\n const dir = join(opts.workspace, \".agentproto\")\n await mkdir(dir, { recursive: true })\n configPath = join(dir, `cloudflared-${id}.yml`)\n const configBody = [\n `# generated by agentproto-runtime — sentinel only`,\n `# overrides ~/.cloudflared/config.yml so its ingress rules`,\n `# don't shadow the inline --url rule. Safe to delete when the`,\n `# tunnel is down.`,\n `no-autoupdate: true`,\n `loglevel: debug`,\n ``,\n ].join(\"\\n\")\n await writeFile(configPath, configBody, \"utf8\")\n const proc = spawn(\n \"cloudflared\",\n [\"tunnel\", \"--config\", configPath, \"--url\", targetUrl],\n { stdio: [\"ignore\", \"pipe\", \"pipe\"], shell: false },\n )\n child = proc\n\n const url = await new Promise<string>((resolve, reject) => {\n let settled = false\n const timer = setTimeout(() => {\n if (settled) return\n settled = true\n try {\n proc.kill(\"SIGTERM\")\n } catch {\n /* noop */\n }\n reject(\n new Error(\n `cloudflared did not emit a public URL within ${STARTUP_TIMEOUT_MS / 1000}s`,\n ),\n )\n }, STARTUP_TIMEOUT_MS)\n\n const onData = (chunk: Buffer) => {\n const text = chunk.toString(\"utf8\")\n for (const line of text.split(/\\r?\\n/)) {\n if (line.length > 0) opts.onLog?.(`[cloudflared] ${line}`)\n }\n if (settled) return\n const match = text.match(URL_REGEX)\n if (match) {\n settled = true\n clearTimeout(timer)\n resolve(match[0])\n }\n }\n // cloudflared writes the URL to stderr (it reserves stdout for\n // proxied traffic / structured output in some modes). Watch\n // both for safety.\n proc.stderr?.on(\"data\", onData)\n proc.stdout?.on(\"data\", onData)\n\n proc.once(\"error\", err => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n reject(err)\n })\n proc.once(\"exit\", (code, signal) => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n reject(\n new Error(\n `cloudflared exited before emitting a URL (code=${code}, signal=${signal})`,\n ),\n )\n })\n })\n\n // Detach the resolver listener (we already captured the URL); leave\n // the log-forwarder attached so the gateway's RuntimeEvents stream\n // sees ongoing tunnel chatter.\n proc.once(\"exit\", (code, signal) => {\n opts.onLog?.(\n `[cloudflared] exited (code=${code ?? \"?\"} signal=${signal ?? \"-\"})`,\n )\n })\n\n return { publicUrl: url, pid: proc.pid ?? null }\n },\n\n async stop(): Promise<void> {\n const proc = child\n const cfg = configPath\n child = null\n configPath = null\n // Best-effort cleanup of the sentinel config — losing it means a\n // stale `.agentproto/cloudflared-<id>.yml` file, no functional\n // impact. We do this even if the proc never started.\n if (cfg) {\n try {\n await rm(cfg, { force: true })\n } catch {\n /* noop */\n }\n }\n if (!proc || proc.exitCode !== null) return\n proc.kill(\"SIGTERM\")\n // Hard-kill backstop after 3s if cloudflared ignores SIGTERM.\n const timer = setTimeout(() => {\n try {\n proc.kill(\"SIGKILL\")\n } catch {\n /* noop */\n }\n }, 3_000)\n timer.unref()\n await new Promise<void>(resolve => {\n if (proc.exitCode !== null) {\n clearTimeout(timer)\n resolve()\n return\n }\n proc.once(\"exit\", () => {\n clearTimeout(timer)\n resolve()\n })\n })\n },\n }\n}\n\nasync function assertCloudflaredOnPath(): Promise<void> {\n try {\n await execFileAsync(\"cloudflared\", [\"--version\"], { timeout: 3_000 })\n } catch {\n throw new Error(\n \"cloudflared not found on PATH. Install it first:\\n\" +\n \" macOS: brew install cloudflared\\n\" +\n \" Linux: https://pkg.cloudflare.com/index.html\\n\" +\n \" Windows: winget install --id Cloudflare.cloudflared\\n\" +\n \"Or download a prebuilt binary from https://github.com/cloudflare/cloudflared/releases.\",\n )\n }\n}\n","/**\n * RemoteController — owns the gateway's \"publish to the internet\" state.\n *\n * One singleton per gateway. Holds:\n * - the current tunnel provider's child process (cloudflared, …)\n * - the bearer token gating /mcp once the tunnel is up\n * - persisted state in `<workspace>/.agentproto/remote.json`\n *\n * The controller is the *only* component that mutates auth at runtime.\n * The HTTP server reads auth via a getter (see `AuthSource` in\n * http-server.ts), so flipping `enable() / disable()` here takes effect\n * on the next request — no restart, no race.\n *\n * ## Provider model\n *\n * Each provider implements `RemoteProvider` (start / stop / status).\n * v1 ships only `quick` (Cloudflare Quick Tunnel — no API key, no DNS,\n * ephemeral `*.trycloudflare.com` URL). Named CF Tunnel and Tailscale\n * land as additional implementations.\n *\n * ## Token model\n *\n * On enable we generate a 32-byte random bearer token, return it once\n * to the caller, and persist only its sha256 hash to disk. Same model\n * as a Stripe API key — losing the plaintext means rotating, not\n * recovering. This keeps `.agentproto/remote.json` safe to commit by\n * accident (it leaks the URL, not the credential).\n *\n * ## Security note\n *\n * The CF API token (when used by named-tunnel provider) is *never*\n * accepted as MCP tool input. The controller reads it from\n * `~/.config/agentproto/cloudflare.json` or `$CLOUDFLARE_API_TOKEN`.\n * Otherwise a remote agent could exfiltrate it through `remote_enable`.\n */\n\nimport { randomBytes, createHash } from \"node:crypto\"\nimport { mkdir, writeFile, readFile, chmod, rm } from \"node:fs/promises\"\nimport { existsSync } from \"node:fs\"\nimport { join } from \"node:path\"\n\nimport type { AuthOptions } from \"./http-server.js\"\nimport { quickTunnelProvider } from \"./remote-providers/quick.js\"\n\nexport interface RemoteState {\n provider: \"quick\"\n publicUrl: string\n bearerTokenHash: string\n createdAt: string\n /** PID of the supervised tunnel child process, if any. */\n pid: number | null\n /** Local target the tunnel forwards to (host + port). */\n target: { host: string; port: number }\n /**\n * Whether the tunnel exposes the gateway itself (true) or some other\n * local service (false). Bearer auth + loopback bypass only matter\n * for the gateway path; arbitrary-target tunnels are pure passthrough\n * and the daemon does not gate them.\n */\n exposesGateway: boolean\n}\n\nexport interface EnableInput {\n provider?: \"quick\"\n /**\n * Local port to expose. Defaults to the gateway's own port — i.e.\n * \"publish this MCP server.\" Pass any other port to expose a\n * different local service (Supabase 54371, a Vite dev server, …)\n * without spinning up a separate tunnel manager.\n */\n targetPort?: number\n /**\n * Host the tunnel forwards to. Defaults to `127.0.0.1`. Setting it\n * to `localhost` resolves through DNS (IPv6 first on most systems);\n * keep `127.0.0.1` unless the target is explicitly IPv6-bound.\n */\n targetHost?: string\n}\n\nexport interface EnableResult {\n publicUrl: string\n /**\n * Bearer token issued by this gateway. Only meaningful when the\n * tunnel exposes the gateway itself (default). For arbitrary-target\n * tunnels (`targetPort != gateway.port`) the daemon does not gate\n * the proxied service, and this is omitted.\n */\n bearerToken?: string\n /**\n * `<publicUrl>/mcp`. Only emitted when exposing the gateway.\n */\n mcpEndpoint?: string\n /**\n * Paste-ready `.mcp.json` snippet. Only emitted when exposing the\n * gateway.\n */\n mcpConfigSnippet?: string\n provider: \"quick\"\n target: { host: string; port: number }\n exposesGateway: boolean\n}\n\nexport interface RemoteStatus {\n enabled: boolean\n provider?: \"quick\"\n publicUrl?: string\n pid?: number | null\n createdAt?: string\n target?: { host: string; port: number }\n exposesGateway?: boolean\n /** Last error from the provider, if any (since last enable). */\n lastError?: string\n}\n\n/**\n * A pluggable tunnel provider.\n *\n * `start` returns the public URL once the upstream tunnel is ready\n * (e.g. for cloudflared, after parsing the trycloudflare.com URL out of\n * its stderr). `stop` is idempotent — calling it twice or on an\n * already-dead child must not throw.\n */\nexport interface RemoteProvider {\n readonly id: \"quick\"\n start(opts: ProviderStartOptions): Promise<ProviderStartResult>\n stop(): Promise<void>\n}\n\nexport interface ProviderStartOptions {\n /** Local target the tunnel forwards to. */\n target: { host: string; port: number }\n /** Workspace path — for log / state files. */\n workspace: string\n /** Called whenever the provider has a status update worth logging. */\n onLog?: (line: string) => void\n}\n\nexport interface ProviderStartResult {\n publicUrl: string\n pid: number | null\n}\n\nexport interface RemoteControllerOptions {\n workspace: string\n port: number\n /** Hook for surfacing provider logs through RuntimeEvents. */\n onLog?: (line: string) => void\n}\n\nconst STATE_FILE_REL = \".agentproto/remote.json\"\n\nexport class RemoteController {\n private state: RemoteState | null = null\n private bearerToken: string | null = null\n private provider: RemoteProvider | null = null\n private lastError: string | undefined\n private readonly opts: RemoteControllerOptions\n\n constructor(opts: RemoteControllerOptions) {\n this.opts = opts\n }\n\n /**\n * Auth getter handed to startHttpServer. The HTTP server calls this\n * on every request so flipping enable/disable is effective without\n * a restart.\n */\n readonly readAuth = (): AuthOptions => {\n if (this.bearerToken === null) return { mode: \"none\" }\n return { mode: \"bearer\", token: this.bearerToken }\n }\n\n status(): RemoteStatus {\n if (!this.state) {\n return { enabled: false, lastError: this.lastError }\n }\n return {\n enabled: true,\n provider: this.state.provider,\n publicUrl: this.state.publicUrl,\n pid: this.state.pid,\n createdAt: this.state.createdAt,\n target: this.state.target,\n exposesGateway: this.state.exposesGateway,\n lastError: this.lastError,\n }\n }\n\n async enable(input: EnableInput): Promise<EnableResult> {\n if (this.state) {\n // Idempotent: returning the existing config would leak the\n // bearer token (we only have the hash). Force teardown first so\n // re-enable always rotates the token. Surface this in the docs.\n throw new Error(\n \"remote tunnel already active — call remote_disable first to rotate\",\n )\n }\n const providerId = input.provider ?? \"quick\"\n const provider = pickProvider(providerId)\n this.lastError = undefined\n\n const target = {\n host: input.targetHost ?? \"127.0.0.1\",\n port: input.targetPort ?? this.opts.port,\n }\n const exposesGateway =\n target.host === \"127.0.0.1\" && target.port === this.opts.port\n\n let started: ProviderStartResult\n try {\n started = await provider.start({\n target,\n workspace: this.opts.workspace,\n onLog: line => {\n this.opts.onLog?.(line)\n },\n })\n } catch (err) {\n this.lastError = errToMessage(err)\n throw err\n }\n\n // Bearer auth + token issuance only matter when the tunnel exposes\n // *this* gateway. For arbitrary-target tunnels (e.g. Supabase on\n // 54371) the daemon is just provisioning a public passthrough; the\n // proxied service does its own authn.\n let bearerToken: string | null = null\n let bearerTokenHash = \"\"\n if (exposesGateway) {\n bearerToken = randomBytes(32).toString(\"base64url\")\n bearerTokenHash = sha256(bearerToken)\n }\n\n const state: RemoteState = {\n provider: providerId,\n publicUrl: started.publicUrl,\n bearerTokenHash,\n createdAt: new Date().toISOString(),\n pid: started.pid,\n target,\n exposesGateway,\n }\n\n this.state = state\n this.bearerToken = bearerToken\n this.provider = provider\n\n await persistState(this.opts.workspace, state)\n\n const result: EnableResult = {\n provider: providerId,\n publicUrl: started.publicUrl,\n target,\n exposesGateway,\n }\n if (exposesGateway && bearerToken) {\n const mcpEndpoint = `${started.publicUrl}/mcp`\n result.bearerToken = bearerToken\n result.mcpEndpoint = mcpEndpoint\n result.mcpConfigSnippet = buildMcpConfigSnippet(mcpEndpoint, bearerToken)\n }\n return result\n }\n\n async disable(): Promise<{ disabled: boolean }> {\n if (!this.state) return { disabled: false }\n const provider = this.provider\n this.state = null\n this.bearerToken = null\n this.provider = null\n if (provider) {\n try {\n await provider.stop()\n } catch (err) {\n this.lastError = errToMessage(err)\n }\n }\n await clearState(this.opts.workspace)\n return { disabled: true }\n }\n\n /**\n * Stop the provider on gateway shutdown. Does NOT clear persisted\n * state — that survives across restarts so the user can `remote_status`\n * after rebooting and see \"stale state, run remote_enable to refresh\".\n * (Stale-recovery semantics land in v2; today we just leave the file.)\n */\n async shutdown(): Promise<void> {\n if (this.provider) {\n try {\n await this.provider.stop()\n } catch {\n /* swallow — gateway is shutting down anyway */\n }\n }\n }\n}\n\n// ── helpers ────────────────────────────────────────────────────────────\n\nfunction pickProvider(id: \"quick\"): RemoteProvider {\n if (id === \"quick\") return quickTunnelProvider()\n // Exhaustive guard — adding \"named-cf\" / \"tailscale\" later forces this\n // switch to be updated, otherwise TS will yell.\n const _exhaustive: never = id\n throw new Error(`unknown remote provider: ${String(_exhaustive)}`)\n}\n\nfunction sha256(input: string): string {\n return createHash(\"sha256\").update(input).digest(\"hex\")\n}\n\nfunction errToMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err)\n}\n\nasync function persistState(workspace: string, state: RemoteState): Promise<void> {\n const dir = join(workspace, \".agentproto\")\n await mkdir(dir, { recursive: true })\n const file = join(dir, \"remote.json\")\n await writeFile(file, JSON.stringify(state, null, 2) + \"\\n\", \"utf8\")\n // mode 0600 — even though we only persist the hash, the URL itself\n // is sensitive (knowing it lets an attacker brute-force the token).\n try {\n await chmod(file, 0o600)\n } catch {\n /* best-effort on platforms where chmod is a noop */\n }\n}\n\nasync function clearState(workspace: string): Promise<void> {\n const file = join(workspace, \".agentproto/remote.json\")\n if (!existsSync(file)) return\n await rm(file, { force: true })\n}\n\n/**\n * Best-effort load of persisted state on boot. We don't restore the\n * bearer token from this — the hash is one-way — so a rebooted gateway\n * that finds a stale `remote.json` will surface it via `remote_status`\n * and require a fresh `remote_enable` to mint a new token.\n *\n * Exposed mostly for diagnostics; not used by the controller today.\n */\nexport async function loadPersistedState(\n workspace: string,\n): Promise<RemoteState | null> {\n const file = join(workspace, STATE_FILE_REL)\n if (!existsSync(file)) return null\n try {\n const raw = await readFile(file, \"utf8\")\n return JSON.parse(raw) as RemoteState\n } catch {\n return null\n }\n}\n\nfunction buildMcpConfigSnippet(endpoint: string, token: string): string {\n return JSON.stringify(\n {\n mcpServers: {\n \"agentproto-remote\": {\n transport: \"http\",\n url: endpoint,\n headers: { Authorization: `Bearer ${token}` },\n },\n },\n },\n null,\n 2,\n )\n}\n","/**\n * MCP tools that drive RemoteController — the gateway's \"publish to\n * the internet\" surface.\n *\n * Three tools, mirroring the controller's lifecycle:\n *\n * remote_enable — bring up a tunnel, mint bearer token, return the\n * public /mcp URL + a paste-ready .mcp.json snippet\n * remote_disable — tear down tunnel, revoke token, drop bearer auth\n * remote_status — read-only — provider, URL, pid, lastError\n *\n * Why this lives on the MCP surface (not a separate CLI):\n * - The user already has an MCP client connected (that's how they\n * started talking to the gateway in the first place). One tool call\n * replaces an entire CLI install + auth dance.\n * - The bearer token comes back as part of the MCP response, so it\n * doesn't have to land on the user's clipboard.\n */\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { z } from \"zod\"\n\nimport type { RemoteController } from \"./remote-controller.js\"\n\nexport interface RegisterRemoteToolsOptions {\n controller: RemoteController\n}\n\nfunction text(value: string | object): {\n content: Array<{ type: \"text\"; text: string }>\n} {\n return {\n content: [\n {\n type: \"text\",\n text: typeof value === \"string\" ? value : JSON.stringify(value, null, 2),\n },\n ],\n }\n}\n\nexport function registerRemoteTools(\n server: McpServer,\n opts: RegisterRemoteToolsOptions,\n): void {\n const { controller } = opts\n\n server.tool(\n \"remote_enable\",\n \"Publish a local port to the internet via Cloudflare. By default exposes \" +\n \"this gateway and gates it with a bearer token (returned ONCE in the \" +\n \"response — store it; only its hash is persisted). Pass `targetPort` to \" +\n \"tunnel a different local service (Supabase, dev server, …); in that mode \" +\n \"the daemon does not gate the proxied traffic — the upstream service \" +\n \"handles its own auth. Returns the public URL plus a paste-ready \" +\n \"`.mcp.json` snippet (gateway mode only). Re-running while a tunnel is \" +\n \"already up errors; call `remote_disable` first to rotate.\",\n {\n provider: z\n .enum([\"quick\"])\n .optional()\n .describe(\n \"Tunnel backend. `quick` = Cloudflare Quick Tunnel (no API key, ephemeral *.trycloudflare.com URL). Defaults to `quick`. Named-CF / Tailscale providers TBD.\",\n ),\n targetPort: z\n .number()\n .int()\n .min(1)\n .max(65535)\n .optional()\n .describe(\n \"Local port to expose. Defaults to this gateway's own port (= publish the MCP server). Pass another port to tunnel a different local service (e.g. 54371 for Supabase) — in that mode bearer auth is OFF since the upstream handles its own gating.\",\n ),\n targetHost: z\n .string()\n .optional()\n .describe(\n \"Host the tunnel forwards to. Defaults to `127.0.0.1`. Use `localhost` only if the target is explicitly IPv6-bound; cloudflared resolves DNS and IPv6-first lookups can break IPv4-only origins.\",\n ),\n },\n async ({ provider, targetPort, targetHost }) => {\n const result = await controller.enable({ provider, targetPort, targetHost })\n return text(result)\n },\n )\n\n server.tool(\n \"remote_disable\",\n \"Tear down the active remote tunnel and drop bearer auth back to \" +\n \"loopback-only. Idempotent — calling when no tunnel is active is a no-op.\",\n {},\n async () => {\n const result = await controller.disable()\n return text(result)\n },\n )\n\n server.tool(\n \"remote_status\",\n \"Report whether a remote tunnel is active. When active: provider, \" +\n \"public URL, supervised PID, createdAt. The bearer token itself is \" +\n \"never returned by status — it was shown once at enable.\",\n {},\n async () => {\n return text(controller.status())\n },\n )\n}\n","/**\n * `WorkspaceFs` — minimal `readFile` / `writeFile` adapter over a\n * workspace directory. Mirrors the `McpWorkspace.filesystem` shape\n * used by `@guilde/mcp` so the daemon can be plugged in as the\n * workspace backend for a Guilde MCP server (via its\n * `loadGuildWorkspace` injection point) without re-shimming.\n *\n * All paths are workspace-relative. Absolute paths are rejected to\n * keep the surface predictable when the daemon binds to a public\n * port.\n */\n\nimport { existsSync } from \"node:fs\"\nimport { mkdir, readFile as fsReadFile, writeFile as fsWriteFile } from \"node:fs/promises\"\nimport { dirname, isAbsolute, join, normalize, relative, resolve } from \"node:path\"\n\nexport interface WorkspaceFs {\n readFile(path: string): Promise<string>\n writeFile(path: string, content: string | Uint8Array): Promise<void>\n exists(path: string): Promise<boolean>\n}\n\nexport interface CreateWorkspaceFsOptions {\n /** Absolute path to the workspace root. */\n workspace: string\n}\n\nexport class WorkspacePathError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"WorkspacePathError\"\n }\n}\n\nexport function createWorkspaceFs(opts: CreateWorkspaceFsOptions): WorkspaceFs {\n const root = resolve(opts.workspace)\n\n function resolvePath(path: string): string {\n if (typeof path !== \"string\" || path.length === 0) {\n throw new WorkspacePathError(\"path must be a non-empty string\")\n }\n if (isAbsolute(path)) {\n throw new WorkspacePathError(\n \"absolute paths are not allowed; use a workspace-relative path\",\n )\n }\n const joined = normalize(join(root, path))\n const rel = relative(root, joined)\n if (rel.startsWith(\"..\") || isAbsolute(rel)) {\n throw new WorkspacePathError(\n `path escapes the workspace: '${path}'`,\n )\n }\n return joined\n }\n\n return {\n async readFile(path) {\n const abs = resolvePath(path)\n const buf = await fsReadFile(abs)\n return buf.toString(\"utf8\")\n },\n async writeFile(path, content) {\n const abs = resolvePath(path)\n await mkdir(dirname(abs), { recursive: true })\n await fsWriteFile(abs, content)\n },\n async exists(path) {\n try {\n const abs = resolvePath(path)\n return existsSync(abs)\n } catch {\n return false\n }\n },\n }\n}\n","/**\n * @agentproto/runtime — long-running gateway around an agentproto\n * workspace dir.\n *\n * Composes:\n * - `@agentproto/mcp-server` (CRUD verbs over registered specs)\n * - HTTP transport (Streamable HTTP) on a configurable port\n * - HEARTBEAT.md autonomy loop\n * - Append-only conversation persistence (`conversations/<id>.md`)\n * - Workspace filesystem adapter (compatible with the\n * `McpWorkspace.filesystem` shape used by `@guilde/mcp`)\n *\n * Single entry point: `createGateway(opts)`. Returns a handle with\n * `url` and `stop()` — the rest of the surface lives on the HTTP\n * server.\n */\n\nimport { randomUUID } from \"node:crypto\"\nimport { existsSync } from \"node:fs\"\nimport { readFile } from \"node:fs/promises\"\nimport { join, resolve } from \"node:path\"\nimport { createMcpServer } from \"@agentproto/mcp-server\"\nimport type { DoctypeSpec } from \"@agentproto/manifest\"\n\nimport { writeRuntimeMeta } from \"./agentproto-dir.js\"\nimport { registerCommandTools } from \"./command-tools.js\"\nimport { fileConversationStore } from \"./conversations.js\"\nimport { createRuntimeEvents } from \"./events.js\"\nimport { registerFsTools } from \"./fs-tools.js\"\nimport { registerSessionTools } from \"./session-tools.js\"\nimport { startHeartbeat, type BuildHeartbeatAgent } from \"./heartbeat.js\"\nimport {\n startHttpServer,\n type AuthOptions,\n type AgentAdapterResolver,\n type AgentAdapterLister,\n} from \"./http-server.js\"\nimport {\n createSessionsRegistry,\n type SessionsRegistry,\n type PtyFactory,\n} from \"./sessions.js\"\nimport { McpProxyRegistry } from \"./mcp-proxy.js\"\n\nexport type {\n AgentAdapterResolver,\n AgentAdapterLister,\n AdapterListEntry,\n} from \"./http-server.js\"\nexport type {\n AgentSessionLike,\n AgentStreamEvent,\n SessionDescriptor,\n SessionKind,\n SessionStatus,\n SpawnSessionInput,\n SpawnAgentInput,\n SessionsRegistry,\n} from \"./sessions.js\"\nimport { RemoteController } from \"./remote-controller.js\"\nimport { registerRemoteTools } from \"./remote-tools.js\"\nimport { createWorkspaceFs, type WorkspaceFs } from \"./workspace-fs.js\"\n\nexport type { ConversationStore, ConversationMeta, ConversationTurn } from \"./conversations.js\"\nexport type { HeartbeatRunner, BuildHeartbeatAgent, HeartbeatAgent } from \"./heartbeat.js\"\nexport type { RuntimeEvent, RuntimeEvents } from \"./events.js\"\nexport type { WorkspaceFs } from \"./workspace-fs.js\"\nexport { parseDuration } from \"./heartbeat.js\"\nexport { createWorkspaceFs } from \"./workspace-fs.js\"\nexport {\n sweepStaleRuntimeMetas,\n unlinkRuntimeMeta,\n readRuntimeMeta,\n type RuntimeMeta,\n} from \"./agentproto-dir.js\"\nexport { fileConversationStore } from \"./conversations.js\"\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnySpec = DoctypeSpec<any, any>\n\nexport interface CreateGatewayOptions {\n /** Absolute path to the workspace dir. */\n workspace: string\n /** AIP doctype specs to expose as MCP CRUD verbs. */\n specs: readonly AnySpec[]\n /** Port to bind. Default 18790. */\n port?: number\n /** Bind host. Default `127.0.0.1` (loopback). Set `0.0.0.0` for LAN. */\n bind?: string\n /** Auth mode. Default `none` (safe only on loopback). */\n auth?: AuthOptions\n /**\n * Resolves a heartbeat-runnable agent from its workspace id.\n * Required for HEARTBEAT.md to do anything; without it ticks emit\n * `heartbeat-error` events instead of generating.\n */\n buildAgent?: BuildHeartbeatAgent\n /** Server name advertised over MCP. */\n name?: string\n /** Server version advertised over MCP. */\n version?: string\n /**\n * Run BOOT.md once at startup. Pass `false` to disable. Defaults to\n * `true`. The boot file is plain markdown — frontmatter-free; the\n * agent named in `defaultBootAgent` (or skipped if unset) gets the\n * body as a single prompt and the reply is appended to a `boot-<iso>`\n * conversation.\n */\n boot?: boolean\n /** Agent id used for BOOT.md if no per-file frontmatter. */\n defaultBootAgent?: string\n /** Optional adapter resolver — when provided, enables\n * `POST /sessions/agent` (long-running agent CLIs like\n * claude-code / hermes via the @agentproto/cli adapter system).\n * Without this, /sessions still works for raw `argv` spawns. */\n resolveAgentAdapter?: AgentAdapterResolver\n /** Optional adapter lister — when provided, enables\n * `GET /adapters` HTTP route + `list_adapters` MCP tool so UIs\n * can discover what's installed on the host. */\n listAgentAdapters?: AgentAdapterLister\n /** Optional PTY factory (node-pty wrapper, typically from the cli\n * layer's `loadNodePtyFactory()`). When provided, enables\n * `POST /sessions/terminal`, the `start_terminal_session` MCP\n * tool family, and the `/sessions/:id/pty` WebSocket. Without it,\n * those routes return 501 / the MCP tools aren't registered. */\n spawnPty?: PtyFactory\n /** Override the per-boot bearer token. Default: `randomUUID()`.\n * Tests can pin a known value; production should always let\n * the gateway generate fresh. The token is written into\n * `<workspace>/.agentproto/runtime.json` (mode 0600) and required\n * on mutating `/sessions/*` routes + the PTY WS upgrade. */\n token?: string\n /** Trusted browser origins allowed to drive mutating routes\n * without a bearer token. See `RuntimeHttpServerOptions.allowedOrigins`\n * for match semantics. Default: localhost on any port. */\n allowedOrigins?: readonly string[]\n /** When true, drop the localhost-wildcard defaults — only the\n * explicit `allowedOrigins` list is honoured. */\n strictOrigins?: boolean\n}\n\nexport interface GatewayHandle {\n url: string\n workspace: string\n workspaceFs: WorkspaceFs\n registered: readonly string[]\n /** Sessions registry — exposed so MCP tools / external spawners\n * inside the same process can register their child processes for\n * visibility through /sessions and the CLI TUI. */\n sessions: SessionsRegistry\n /** Per-boot bearer token required on mutating /sessions/* routes\n * + WS PTY upgrades. Exposed so an embedding host (e.g. the CLI\n * shell that hosts the gateway in-process) can pass it to child\n * tools without re-reading the runtime.json file. */\n token: string\n stop(): Promise<void>\n}\n\n/**\n * Spin up the gateway. Order:\n * 1. Build MCP server + load AIP-40 extensions\n * 2. Build conversation store + workspace fs adapter\n * 3. (optional) Run BOOT.md once\n * 4. Start HTTP server\n * 5. Start heartbeat ticker\n *\n * `stop()` reverses 4–5 (heartbeat first, then HTTP). The MCP server\n * is owned by the HTTP server's per-session transports and is closed\n * implicitly when those close.\n */\nexport async function createGateway(\n opts: CreateGatewayOptions,\n): Promise<GatewayHandle> {\n const workspace = resolve(opts.workspace)\n if (!existsSync(workspace)) {\n throw new Error(`runtime: workspace dir does not exist: ${workspace}`)\n }\n const port = opts.port ?? 18790\n\n const events = createRuntimeEvents()\n const conversations = fileConversationStore({ workspace })\n const workspaceFs = createWorkspaceFs({ workspace })\n\n // Singleton controller for \"publish to the internet\" state. Created\n // disabled — auth stays `mode: \"none\"` until `remote_enable` is\n // called. Tunnel logs flow through the events stream so `/events`\n // subscribers see cloudflared chatter.\n const remote = new RemoteController({\n workspace,\n port,\n onLog: line =>\n events.emit({\n type: \"remote-log\",\n at: new Date().toISOString(),\n line,\n }),\n })\n\n // Build a server once eagerly so we can capture `registered` for\n // `/health`. The server is NOT used for serving — every `/mcp`\n // request gets its own freshly-constructed pair, mirroring the\n // SDK's official stateless pattern. See the comment on\n // `RuntimeHttpServerOptions.mcpServerFactory` for why.\n const { registered } = await createMcpServer({\n specs: opts.specs,\n workspace,\n name: opts.name ?? \"agentproto-runtime\",\n version: opts.version ?? \"0.1.0-alpha\",\n })\n\n // Sessions registry — single instance per gateway, captured by\n // the per-request mcpServerFactory closure below + handed to\n // startHttpServer for the /sessions HTTP routes. Declared here\n // (above the factory) so its identifier is visible at closure-\n // build time, even though the factory only invokes later.\n const sessions = createSessionsRegistry({\n ...(opts.spawnPty ? { spawnPty: opts.spawnPty } : {}),\n // Resume hook: when a prompt arrives for a dead agent-cli row\n // (typical after daemon restart), the registry calls back into\n // the adapter resolver to re-create the AgentSession with\n // `resumeSessionId = adapterSessionId`. ACP semantics: the\n // upstream provider reattaches to the prior conversation.\n // Unwired (no resolveAgentAdapter) → legacy \"not an agent\n // session\" error, user must spawn fresh.\n ...(opts.resolveAgentAdapter\n ? {\n resumeAgent: async ({ adapterSlug, cwd, resumeSessionId }) => {\n const adapter = await opts.resolveAgentAdapter!(adapterSlug)\n if (!adapter) return null\n try {\n return await adapter.startSession({ cwd, resumeSessionId })\n } catch (err) {\n console.warn(\n `[agentproto] resumeAgent('${adapterSlug}', ${resumeSessionId}) failed: ${\n err instanceof Error ? err.message : String(err)\n }`\n )\n return null\n }\n },\n }\n : {}),\n })\n\n // Per-boot bearer token. Required on mutating /sessions/* routes\n // and on the WS upgrade for /sessions/:id/pty. Persisted to\n // runtime.json (mode 0600) so the same-user CLI can read it; a\n // browser-loaded localhost page can't.\n const token = opts.token ?? randomUUID()\n\n // MCP proxy — single registry that holds open Client connections\n // to every imported MCP server. The per-request mcpServerFactory\n // captures it so each /mcp request reuses the same upstream\n // sessions instead of re-spawning stdio children.\n const mcpProxy = new McpProxyRegistry()\n\n const mcpServerFactory = async () => {\n const { server } = await createMcpServer({\n specs: opts.specs,\n workspace,\n name: opts.name ?? \"agentproto-runtime\",\n version: opts.version ?? \"0.1.0-alpha\",\n })\n // Canonical filesystem tools so remote MCP clients (cloud\n // workspace-providers, IDEs, ad-hoc tooling) can read/write the\n // workspace without each implementing AIP-aware glue. Names match\n // `@modelcontextprotocol/server-filesystem` for drop-in compat.\n registerFsTools(server, { workspace })\n // Subprocess execution — the runtime's superpower for cloud\n // agents. Any allowlisted CLI on the user's machine (claude, gh,\n // pnpm, …) is reachable via `execute_command`. Allowlist lives at\n // `.agentproto/allowed-commands.json`; default-deny.\n registerCommandTools(server, { workspace })\n // Remote-tunnel lifecycle. The controller is a singleton on the\n // gateway, so registering its tools per-request is just rebinding\n // the same closures — the underlying state lives in `remote`.\n registerRemoteTools(server, { controller: remote })\n // Agent-session orchestration — operators (Mastra agents in\n // cloud Guilde, Claude Code as a sub-agent, …) drive long-running\n // claude/hermes/aider sessions on the user's machine through\n // these MCP tools. The registry + adapter resolver are\n // singletons on the gateway, same closure-rebind pattern.\n registerSessionTools(server, {\n registry: sessions,\n mcpProxy,\n ptyEnabled: opts.spawnPty != null,\n ...(opts.resolveAgentAdapter\n ? { resolveAgentAdapter: opts.resolveAgentAdapter }\n : {}),\n ...(opts.listAgentAdapters\n ? { listAgentAdapters: opts.listAgentAdapters }\n : {}),\n })\n return server\n }\n\n // ── boot ─────────────────────────────────────────────────────────\n if (opts.boot !== false) {\n await runBoot(workspace, opts, conversations, events).catch((err) => {\n events.emit({\n type: \"heartbeat-error\",\n at: new Date().toISOString(),\n agent: opts.defaultBootAgent,\n error: `BOOT.md failed: ${err instanceof Error ? err.message : String(err)}`,\n })\n })\n }\n\n const heartbeat = startHeartbeat({\n workspace,\n conversations,\n events,\n buildAgent: opts.buildAgent ?? noopBuildAgent,\n })\n\n const http = await startHttpServer({\n port,\n bind: opts.bind,\n // Auth is read on every request via this getter. `opts.auth`\n // (when provided) is the startup default and represents the\n // operator's intent — bearer-only deployments stay bearer-only\n // even when no remote tunnel is up. The controller's auth wins\n // once a tunnel is enabled (it issues a fresh token); on disable\n // we fall back to `opts.auth` if set, otherwise `mode: \"none\"`.\n auth: () => {\n const remoteAuth = remote.readAuth()\n if (remoteAuth.mode === \"bearer\") return remoteAuth\n return opts.auth ?? { mode: \"none\" }\n },\n mcpServerFactory,\n conversations,\n events,\n heartbeat,\n sessions,\n mcpProxy,\n token,\n ptyEnabled: opts.spawnPty != null,\n ...(opts.allowedOrigins ? { allowedOrigins: opts.allowedOrigins } : {}),\n ...(opts.strictOrigins ? { strictOrigins: true } : {}),\n ...(opts.resolveAgentAdapter\n ? { resolveAgentAdapter: opts.resolveAgentAdapter }\n : {}),\n ...(opts.listAgentAdapters\n ? { listAgentAdapters: opts.listAgentAdapters }\n : {}),\n meta: { workspace, registered },\n })\n\n heartbeat.start()\n events.emit({\n type: \"boot\",\n at: new Date().toISOString(),\n workspace,\n registered,\n })\n\n // Record a snapshot of the running config so external tooling /\n // shell users can introspect a live gateway via\n // `cat <workspace>/.agentproto/runtime.json`. Best-effort — failure\n // here doesn't gate the gateway being functional.\n void writeRuntimeMeta(workspace, {\n workspace,\n port,\n bind: opts.bind ?? \"127.0.0.1\",\n pid: process.pid,\n startedAt: new Date().toISOString(),\n name: opts.name ?? \"agentproto-runtime\",\n registered,\n token,\n })\n\n return {\n url: http.url,\n workspace,\n workspaceFs,\n registered,\n sessions,\n token,\n async stop() {\n heartbeat.stop()\n // Kill all live sessions before tearing down HTTP — otherwise\n // long-running children inherit the daemon's listening socket\n // and stay around as zombies after the parent exits.\n sessions.shutdown()\n // Close upstream MCP clients (their stdio children would\n // otherwise leak the same way).\n await mcpProxy.closeAll()\n // Tear the tunnel before the HTTP listener — otherwise cloudflared\n // briefly proxies to a dead port and surfaces 502s to any in-flight\n // remote client.\n await remote.shutdown()\n await http.stop()\n },\n }\n}\n\n// ── helpers ──────────────────────────────────────────────────────────\n\nconst noopBuildAgent: BuildHeartbeatAgent = async () => null\n\nasync function runBoot(\n workspace: string,\n opts: CreateGatewayOptions,\n conversations: import(\"./conversations.js\").ConversationStore,\n events: import(\"./events.js\").RuntimeEvents,\n): Promise<void> {\n const path = join(workspace, \"BOOT.md\")\n if (!existsSync(path)) return\n const body = (await readFile(path, \"utf8\")).trim()\n if (!body) return\n if (!opts.buildAgent || !opts.defaultBootAgent) return\n\n const agent = await opts.buildAgent(opts.defaultBootAgent)\n if (!agent) return\n\n const conversationId = `boot-${new Date().toISOString().slice(0, 19).replace(/[:.]/g, \"-\")}`\n await conversations.open(conversationId, { agent: opts.defaultBootAgent })\n await conversations.appendTurn(conversationId, \"user\", body, {\n attribution: \"boot\",\n })\n const reply = await agent.generate(body)\n await conversations.appendTurn(conversationId, \"assistant\", reply.text, {\n attribution: opts.defaultBootAgent,\n })\n events.emit({\n type: \"heartbeat-fired\",\n at: new Date().toISOString(),\n agent: opts.defaultBootAgent,\n conversationId,\n prompt: body,\n reply: reply.text,\n durationMs: 0,\n })\n}\n","/**\n * Bundled catalog of known installable items.\n *\n * Used by `agentproto install` (no-arg interactive mode) to populate the\n * type → slug picker without any network calls or adapter resolution.\n *\n * The catalog is intentionally static: it's the \"known good\" list shipped\n * with this CLI version. Adapters discovered in node_modules at runtime\n * (via `listInstalledAdapters`) may exceed this list — the catalog is a\n * first-run UX affordance, not a complete registry.\n */\n\nexport type CatalogEntryType = \"agent-cli\" | \"pack\" | \"mcp\"\n\nexport interface CatalogEntry {\n type: CatalogEntryType\n /** Adapter slug — matches `@agentproto/adapter-<slug>`. */\n slug: string\n /** Display name shown in the picker. */\n name: string\n /** One-line description (fits in a select hint). */\n description: string\n /** npm package that provides the adapter. */\n packageName: string\n /** Short hint shown inline in the picker (protocol, provider, key capability). */\n hint?: string\n}\n\nexport const CATALOG: readonly CatalogEntry[] = [\n // ── Agent CLIs ────────────────────────────────────────────────────────\n {\n type: \"agent-cli\",\n slug: \"claude-code\",\n name: \"Claude Code\",\n description:\n \"Anthropic's Claude Code via @agentclientprotocol/claude-agent-acp ACP wrapper.\",\n packageName: \"@agentproto/adapter-claude-code\",\n hint: \"anthropic · ACP · resumable\",\n },\n {\n type: \"agent-cli\",\n slug: \"opencode\",\n name: \"OpenCode\",\n description:\n \"sst/opencode with first-party ACP mode. Multi-provider: Anthropic, OpenAI, OpenRouter, Groq.\",\n packageName: \"@agentproto/adapter-opencode\",\n hint: \"multi-provider · ACP · resumable\",\n },\n {\n type: \"agent-cli\",\n slug: \"codex\",\n name: \"Codex\",\n description:\n \"OpenAI Codex coding agent via Zed's @zed-industries/codex-acp ACP wrapper.\",\n packageName: \"@agentproto/adapter-codex\",\n hint: \"openai · ACP · resumable\",\n },\n {\n type: \"agent-cli\",\n slug: \"hermes\",\n name: \"Hermes\",\n description:\n \"Nous Research Hermes agent with skills, sandboxes, and memory plugin surface.\",\n packageName: \"@agentproto/adapter-hermes\",\n hint: \"nous · ACP · sub-agents\",\n },\n {\n type: \"agent-cli\",\n slug: \"openclaw\",\n name: \"OpenClaw\",\n description:\n \"OpenClaw coding-agent platform with native ACP bridge and plugin surface.\",\n packageName: \"@agentproto/adapter-openclaw\",\n hint: \"gateway · ACP · plugins\",\n },\n] as const\n\n/** Filter the catalog by entry type. */\nexport function catalogByType(type: CatalogEntryType): CatalogEntry[] {\n return CATALOG.filter((e) => e.type === type) as CatalogEntry[]\n}\n","/**\n * `agentproto serve [--workspace <dir>] [--port <n>] [--connect <wss>]`\n *\n * The single canonical agentproto daemon. Boots a local gateway\n * (HTTP + MCP server + sessions registry + workspace fs +\n * heartbeat) on `--port` (default 18790), and OPTIONALLY opens an\n * outbound WebSocket tunnel to a host (Guilde-shaped API) when\n * `--connect <url>` is set. With or without the tunnel:\n *\n * - HTTP /sessions, /sessions/agent, /sessions/:id/* routes work\n * - MCP tools (start_agent_session, prompt_agent_session, …) are\n * reachable via the daemon's /mcp transport\n * - the LocalDaemonSessionsCard in guilde-web sees every spawn\n *\n * When the tunnel is up, every tunnel-driven spawn is also adopted\n * into the gateway's sessions registry via the\n * `createTunnelServer.onChildSpawned` hook, so an operator\n * dispatching from the cloud lands in the same /sessions list as a\n * user spawning locally — single source of truth for what's running\n * on the user's machine.\n *\n * Replaces the old `playground/scripts/gateway.ts` for production\n * use (the playground keeps its own script for the MCP CRUD\n * doctype demo). v1 reuses createGateway with empty specs + a\n * noop heartbeat; the playground variant adds toolSpec/agentSpec/\n * etc. for its specific spec-authoring use case.\n *\n * Reconnect-with-backoff is built in for the tunnel. The local\n * gateway stays up across reconnects — only the tunnel cycles.\n *\n * Authorization: v0 trusts every spawn frame the host sends — there\n * is no policy file. Future work will gate spawn requests on a\n * `~/.agentproto/policy.toml` allowlist (see project_agentproto_repos\n * memory). The token is the only access control today.\n */\n\nimport { parseArgs } from \"node:util\"\nimport { hostname, userInfo } from \"node:os\"\nimport { resolve as resolvePath } from \"node:path\"\nimport { promises as fs } from \"node:fs\"\nimport { randomUUID } from \"node:crypto\"\nimport * as childProc from \"node:child_process\"\nimport {\n readHost,\n isExpired,\n formatExpiry,\n} from \"../util/credentials.js\"\nimport { loadNodePtyFactory, type PtyFactory } from \"../util/pty-factory.js\"\nimport { loadConfig } from \"@agentproto/runtime/config\"\nimport { loadWorkspacesConfig } from \"@agentproto/runtime/workspaces-config\"\nimport { loadImportedMcps } from \"@agentproto/runtime/mcp-imports\"\nimport {\n createTunnelServer,\n wrapWebSocket,\n DEFAULT_WS_DIAL_TIMEOUT_MS,\n DEFAULT_HTTP_FORWARD_TIMEOUT_MS,\n type FrameSink,\n} from \"@agentproto/acp/tunnel\"\nimport {\n createGateway,\n sweepStaleRuntimeMetas,\n unlinkRuntimeMeta,\n type AgentAdapterResolver,\n type GatewayHandle,\n} from \"@agentproto/runtime\"\nimport { createAgentCliRuntime } from \"@agentproto/driver-agent-cli\"\nimport { driverSpec } from \"@agentproto/driver\"\nimport {\n resolveAdapter,\n listAdaptersWithCatalog,\n} from \"../registry/resolve.js\"\nimport { CATALOG } from \"../registry/catalog.js\"\nimport WebSocket from \"ws\"\n\ninterface ServeOpts {\n /** Workspace dir. Defaults to cwd. */\n workspace: string\n /** Local HTTP port. Default 18790. */\n port: number\n /** Bind addr. Default 127.0.0.1. */\n bind: string\n /** Optional cloud WS URL. When unset, daemon runs local-only. */\n connect?: string\n token?: string\n label: string\n /** Initial reconnect delay in ms; doubled on each failure up to 30s. */\n reconnectMinMs?: number\n reconnectMaxMs?: number\n /** Extra Origin patterns trusted to drive mutating /sessions/* routes\n * + the PTY WS without a Bearer token. Localhost is always trusted\n * by default; add production origins via repeatable `--allow-origin`. */\n allowedOrigins?: readonly string[]\n /** When true, drop the localhost-wildcard default. Only `allowedOrigins`\n * is honoured. Useful for hardened / shared-host setups. */\n strictOrigins?: boolean\n}\n\nexport async function runServe(args: readonly string[]): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n allowPositionals: false,\n strict: true,\n options: {\n connect: { type: \"string\", short: \"c\" },\n token: { type: \"string\", short: \"t\" },\n label: { type: \"string\", short: \"l\" },\n workspace: { type: \"string\", short: \"w\" },\n port: { type: \"string\", short: \"p\" },\n bind: { type: \"string\", short: \"b\" },\n \"allow-origin\": { type: \"string\", multiple: true },\n interactive: { type: \"boolean\", short: \"i\" },\n profile: { type: \"string\" },\n },\n })\n\n // Load ~/.agentproto/config.json once and fall back through it for\n // every knob below. Order: CLI flag → env var → config.json →\n // hardcoded default. Errors during read are non-fatal — the file\n // is optional. Resolves to an empty object when missing.\n const cfg = await loadConfig()\n\n // ── Profile resolution ─────────────────────────────────────────\n // `--profile <name>` (or `activeProfile` in config.json) picks a\n // named bundle from `profiles[name]` and shallow-merges it OVER the\n // top-level daemon/tunnel. A profile only needs to declare the\n // fields that differ from the top-level (typically tunnel.host +\n // tunnel.token); everything else falls through.\n //\n // Explicit `--profile <name>` is fatal if the profile doesn't\n // exist (better than silently using top-level defaults — that\n // path led to \"why is it connecting to prod?\" head-scratching).\n // An `activeProfile` pointing at a missing profile only warns,\n // since the user may have just deleted it.\n const profileName = values.profile ?? cfg.activeProfile\n const profile = profileName ? cfg.profiles?.[profileName] : undefined\n if (values.profile && !profile) {\n process.stderr.write(\n `agentproto serve: profile \"${values.profile}\" not found in ` +\n `~/.agentproto/config.json. Available: ${\n cfg.profiles ? Object.keys(cfg.profiles).join(\", \") || \"(none)\" : \"(no profiles block)\"\n }\\n`\n )\n return 2\n }\n if (cfg.activeProfile && !values.profile && !profile) {\n process.stderr.write(\n `agentproto serve: ⚠ activeProfile=\"${cfg.activeProfile}\" but no matching ` +\n `entry in profiles[]; falling back to top-level config.\\n`\n )\n }\n if (profile && process.stdout.isTTY) {\n process.stdout.write(\n `agentproto serve: using profile \"${profileName}\"\\n`\n )\n }\n\n const cfgDaemon = { ...(cfg.daemon ?? {}), ...(profile?.daemon ?? {}) }\n const cfgTunnel = { ...(cfg.tunnel ?? {}), ...(profile?.tunnel ?? {}) }\n\n // Workspace defaults: --workspace > config.json > cwd. Validated\n // below — must exist + be a directory.\n const workspace = resolvePath(\n values.workspace ?? cfgDaemon.workspace ?? process.cwd(),\n )\n try {\n const stat = await fs.stat(workspace)\n if (!stat.isDirectory()) {\n process.stderr.write(\n `agentproto serve: --workspace \"${workspace}\" is not a directory.\\n`\n )\n return 2\n }\n } catch {\n process.stderr.write(\n `agentproto serve: --workspace \"${workspace}\" does not exist.\\n` +\n ` Create it first: mkdir -p \"${workspace}\"\\n`\n )\n return 2\n }\n\n const port = values.port\n ? Number.parseInt(values.port, 10)\n : typeof cfgDaemon.port === \"number\"\n ? cfgDaemon.port\n : 18790\n if (!Number.isFinite(port) || port <= 0 || port > 65535) {\n process.stderr.write(`agentproto serve: invalid --port \"${values.port}\".\\n`)\n return 2\n }\n\n // Default label is informative — the host's UI shows it next to\n // every spawn so users know which laptop is executing what.\n const label = values.label ?? cfgDaemon.label ?? `${userInfo().username}@${hostname()}`\n\n // tunnel.host + tunnel.autoconnect from config feed --connect when\n // the user hasn't passed one. autoconnect=false leaves it CLI-only.\n const connectFlag =\n values.connect ??\n (cfgTunnel.autoconnect && cfgTunnel.host ? cfgTunnel.host : undefined)\n\n // Token resolution precedence:\n // 1. --token <jwt> — explicit override\n // 2. $AGENTPROTO_TOKEN — env, useful for CI / docker\n // 3. config.json `tunnel.token` (or profile.tunnel.token) — set\n // via `agentproto config set tunnel.token` or hand-edited.\n // Profiles use this so a per-environment token lives next to\n // its host without the credentials.json host-key footgun.\n // 4. ~/.agentproto/credentials.json[host] — `agentproto auth login`\n //\n // Step 4 only applies when --connect is set (we have a host to look\n // up) and the credential isn't expired. Expiry is non-fatal: we log\n // a warning and let the host reject the connect; that surfaces a\n // clearer error than a silent 401 mid-tunnel.\n let token: string | undefined =\n values.token ?? process.env.AGENTPROTO_TOKEN ?? cfgTunnel.token\n if (!token && connectFlag) {\n const cred = await readHost(connectFlag)\n if (cred) {\n if (isExpired(cred)) {\n process.stderr.write(\n `agentproto serve: ⚠ credentials for ${connectFlag} are expired (${formatExpiry(cred)}). ` +\n `Re-run \\`agentproto auth login --host ${connectFlag}\\`.\\n`\n )\n }\n token = cred.token\n process.stdout.write(\n `agentproto serve: using token from credentials.json (${formatExpiry(cred)})\\n`\n )\n }\n }\n\n // `--allow-origin <url>` is repeatable. parseArgs gives us a string[]\n // when `multiple: true` is set. Origins are merged with config's\n // daemon.allowedOrigins so CLI flags ADD to (not replace) the config.\n const allowOriginRaw = values[\"allow-origin\"]\n const cliOrigins = Array.isArray(allowOriginRaw) ? allowOriginRaw : []\n const cfgOrigins = Array.isArray(cfgDaemon.allowedOrigins)\n ? cfgDaemon.allowedOrigins\n : []\n const merged = [...new Set([...cfgOrigins, ...cliOrigins])]\n const allowedOrigins = merged.length > 0 ? merged : undefined\n\n const opts: ServeOpts = {\n workspace,\n port,\n bind: values.bind ?? cfgDaemon.bind ?? \"127.0.0.1\",\n ...(connectFlag ? { connect: connectFlag } : {}),\n ...(token ? { token } : {}),\n label,\n ...(allowedOrigins ? { allowedOrigins } : {}),\n ...(cfgDaemon.strictOrigins === true ? { strictOrigins: true } : {}),\n }\n\n // ── adapter resolver (powers MCP start_agent_session) ──\n // Wires the cli's adapter registry into the gateway's\n // /sessions/agent route + the start_agent_session MCP tool.\n // When unwired, those routes return 501 with a clear message.\n const resolveAgentAdapter: AgentAdapterResolver = async slug => {\n try {\n const adapter = await resolveAdapter(slug)\n const runtime = createAgentCliRuntime(adapter.handle)\n return {\n async startSession({ cwd, resumeSessionId, model }) {\n return runtime.start({\n cwd,\n ...(resumeSessionId ? { resumeSessionId } : {}),\n ...(model ? { config: { options: { model } } } : {}),\n })\n },\n commandPreview:\n `${adapter.handle.bin} ${(adapter.handle.bin_args ?? []).join(\" \")}`.trim(),\n }\n } catch (err) {\n console.warn(\n `[agentproto serve] resolveAgentAdapter('${slug}') failed: ${\n err instanceof Error ? err.message : String(err)\n }`\n )\n return null\n }\n }\n\n // ── pty factory ──\n // Resolved once at boot and shared between the local gateway (powers\n // POST /sessions/terminal + the four start_terminal_session MCP\n // tools + the WS /sessions/:id/pty bridge) AND the tunnel server\n // below (cloud-driven spawns with pty:true on the spawn frame).\n // When node-pty is missing, the factory is null and both paths\n // gracefully degrade — PTY routes return 501 / the tunnel rejects\n // pty:true spawns.\n const spawnPty = await loadNodePtyFactory()\n\n // ── boot the gateway ──\n // Empty specs + noop buildAgent. The playground gateway script\n // still has its own setup for spec authoring + Mastra heartbeat.\n let gateway: GatewayHandle\n try {\n gateway = await createGateway({\n workspace: opts.workspace,\n port: opts.port,\n bind: opts.bind,\n specs: [driverSpec],\n name: \"agentproto-serve\",\n // BOOT.md is silly for a tunnel daemon — skip it.\n boot: false,\n resolveAgentAdapter,\n // Discovery for UIs / operators — `GET /adapters` + `list_adapters`\n // MCP tool. Starts from the bundled catalog so known adapters always\n // appear (with status \"supported\") even when not yet installed.\n listAgentAdapters: () => listAdaptersWithCatalog(CATALOG),\n ...(spawnPty ? { spawnPty } : {}),\n ...(opts.allowedOrigins\n ? { allowedOrigins: opts.allowedOrigins }\n : {}),\n ...(opts.strictOrigins ? { strictOrigins: true } : {}),\n })\n } catch (err) {\n process.stderr.write(\n `agentproto serve: gateway boot failed — ${\n err instanceof Error ? err.message : String(err)\n }\\n`\n )\n return 1\n }\n\n // The capability set this daemon announces in its tunnel hello: the MCP\n // doctypes it serves PLUS the agent adapters installed on this machine.\n // The adapters are what differentiate one daemon from another (every daemon\n // registers the same base doctypes), so a multi-daemon host routes on them.\n // Computed once at boot — the adapter walk is cheap but not worth per-reconnect.\n const installedAdapterSlugs = await listAdaptersWithCatalog(CATALOG)\n .then(list => list.filter(a => a.status !== \"supported\").map(a => a.slug))\n .catch(() => [] as string[])\n const announcedTools = [\n ...new Set([...gateway.registered, ...installedAdapterSlugs]),\n ]\n\n printBootBanner({\n url: gateway.url,\n workspace: gateway.workspace,\n ptyEnabled: spawnPty != null,\n allowedOrigins: opts.allowedOrigins,\n strictOrigins: opts.strictOrigins === true,\n connect: opts.connect,\n })\n\n // ── stale runtime.json sweep ──\n // Other workspaces may carry leftover runtime.json files from\n // previous daemon processes that didn't shut down gracefully\n // (kill -9, crash, reboot). Their tokens are stale; the CLI's\n // discovery layer would otherwise pick them up and send wrong\n // tokens to THIS daemon, producing a confusing 401. Clean them\n // here at boot so the user doesn't have to.\n try {\n const wsConfig = await loadWorkspacesConfig()\n const paths = wsConfig.workspaces.map(w => w.path)\n const cleaned = await sweepStaleRuntimeMetas(paths, opts.workspace)\n if (cleaned.length > 0) {\n process.stderr.write(\n `${color.dim}cleaned ${cleaned.length} stale runtime.json file(s) (dead PID)${color.reset}\\n`,\n )\n }\n } catch {\n // workspaces.json may not exist yet — no cleanup needed.\n }\n\n // ── shutdown wiring (covers both local-only and tunnel modes) ──\n const aborter = new AbortController()\n let shuttingDown = false\n const shutdown = async (signal: NodeJS.Signals): Promise<void> => {\n if (shuttingDown) return\n shuttingDown = true\n process.stderr.write(\n `\\n${color.dim}── shutting down (${signal}) ──${color.reset}\\n`,\n )\n aborter.abort()\n await gateway.stop().catch(() => undefined)\n // Delete our own runtime.json so the next CLI invocation doesn't\n // discover it as a \"live daemon\". Best-effort — the next boot\n // would clean it up anyway via the sweep above.\n await unlinkRuntimeMeta(opts.workspace).catch(() => undefined)\n process.exit(0)\n }\n process.once(\"SIGINT\", () => void shutdown(\"SIGINT\"))\n process.once(\"SIGTERM\", () => void shutdown(\"SIGTERM\"))\n // Terminal-window close / SSH-disconnect / logout → SIGHUP. Without\n // a handler, Node default-terminates the process which bypasses our\n // gateway.stop() — sessions.json then never gets the final flush.\n // Registry's `process.on(\"exit\")` belt-and-suspenders catches it\n // too, but firing the same logical path here gives a clean shutdown\n // banner + tunnel teardown.\n process.once(\"SIGHUP\", () => void shutdown(\"SIGHUP\"))\n\n // ── interactive mode: chain into the watch TUI as a child ─────\n // Spawn `agentproto sessions --watch` in the same terminal,\n // inheriting stdio. When the child exits (q / Ctrl-C in the TUI),\n // we treat it as a shutdown request for the daemon too — running\n // the TUI WITHOUT a daemon underneath would just show \"no\n // sessions\" forever, which isn't what `serve --interactive`\n // promised. The user can still detach with Ctrl-] then q\n // (PTY-attach detach chord) to leave the TUI but keep the daemon\n // running — but a Ctrl-C / q in the watch view tears the lot.\n if (values.interactive) {\n process.stderr.write(\n `${color.dim}entering interactive monitor — q in the TUI to quit (daemon + TUI both).${color.reset}\\n`,\n )\n // Use process.argv[0] (this node) + process.argv[1] (this script)\n // for the child so we don't depend on $PATH finding the right\n // shim. argv carries `sessions --watch` plus an env override so\n // the child discovers THIS daemon's URL + token directly without\n // re-walking workspaces.json.\n const childArgv = [process.argv[1] ?? \"\", \"sessions\", \"--watch\"]\n const child = childProc.spawn(process.execPath, childArgv, {\n stdio: \"inherit\",\n env: {\n ...process.env,\n AGENTPROTO_DAEMON_URL: gateway.url,\n // `gateway.token` is the per-boot daemon bearer (different\n // from `token`, which was the tunnel JWT). Without this, the\n // child's restart/kill calls would 401 against its own\n // parent — exactly the bug that closed --interactive after\n // any failed action.\n AGENTPROTO_DAEMON_TOKEN: gateway.token,\n },\n })\n await new Promise<void>(resolve => {\n child.once(\"exit\", () => resolve())\n aborter.signal.addEventListener(\"abort\", () => {\n try {\n child.kill(\"SIGTERM\")\n } catch {\n /* ignore */\n }\n })\n })\n // TUI quit → tear daemon down. If the SIGINT handler already\n // started a shutdown (parent + child both saw Ctrl-C from the\n // same process group), skip — the handler will finish on its\n // own. Otherwise drive the shutdown ourselves. The\n // `shuttingDown` flag in the outer scope is the source of truth.\n if (!shuttingDown) {\n aborter.abort()\n await gateway.stop().catch(() => undefined)\n await unlinkRuntimeMeta(opts.workspace).catch(() => undefined)\n }\n return 0\n }\n\n // ── local-only mode: nothing else to do ──\n if (!opts.connect) {\n // Banner already covered the \"local-only\" state. Just park.\n process.stderr.write(\n `${color.dim}Press Ctrl-C to stop.${color.reset}\\n`,\n )\n await new Promise<void>(resolve => {\n aborter.signal.addEventListener(\"abort\", () => resolve())\n })\n return 0\n }\n\n process.stderr.write(\n `${color.dim}tunnel · connecting to ${opts.connect} as '${opts.label}'…${color.reset}\\n`,\n )\n\n let backoffMs = opts.reconnectMinMs ?? 1_000\n const backoffMax = opts.reconnectMaxMs ?? 30_000\n // Shared flag — flipped by the `reconnect_soon` handler inside\n // runOneTunnel to skip the 2s post-clean-close pause. Lets a host\n // doing a graceful preStop drain finish its rollover in ~2s instead\n // of the daemon's normal ~30s backoff (or even the 2s settle).\n const reconnectState = { immediate: false }\n while (!aborter.signal.aborted) {\n try {\n await runOneTunnel(\n opts,\n gateway,\n announcedTools,\n spawnPty,\n aborter.signal,\n reconnectState\n )\n backoffMs = opts.reconnectMinMs ?? 1_000 // success resets backoff\n if (reconnectState.immediate) {\n reconnectState.immediate = false\n // Host signaled graceful drain — skip the settle pause and\n // reconnect right away (the new replica is already listening).\n continue\n }\n // Brief pause before reconnecting even on a clean close. This prevents\n // an infinite reconnect fight when two daemon processes are running with\n // the same token — each close-then-reconnect gets a minimum delay rather\n // than spinning at CPU speed.\n await sleep(2_000, aborter.signal)\n } catch (err) {\n if (aborter.signal.aborted) break\n const msg = err instanceof Error ? err.message : String(err)\n process.stderr.write(\n `agentproto serve: tunnel error: ${msg}\\n reconnecting in ${backoffMs}ms…\\n`\n )\n await sleep(backoffMs, aborter.signal)\n backoffMs = Math.min(backoffMs * 2, backoffMax)\n }\n }\n\n return 0\n}\n\n/**\n * One end-to-end tunnel attempt. Resolves when the socket closes\n * cleanly (host hung up); rejects on connection error or unexpected\n * close. The reconnect loop catches both and retries.\n */\nasync function runOneTunnel(\n opts: ServeOpts,\n gateway: GatewayHandle,\n announcedTools: readonly string[],\n spawnPty: PtyFactory | null,\n signal: AbortSignal,\n reconnectState: { immediate: boolean }\n): Promise<void> {\n if (!opts.connect) throw new Error(\"runOneTunnel: --connect not set\")\n const headers: Record<string, string> = {\n \"user-agent\": `agentproto/${__CLI_VERSION__}`,\n }\n if (opts.token) headers.authorization = `Bearer ${opts.token}`\n\n const ws = new WebSocket(opts.connect, { headers })\n\n // Wait for OPEN (or fail).\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n ws.off(\"error\", onError)\n resolve()\n }\n const onError = (err: Error) => {\n ws.off(\"open\", onOpen)\n reject(err)\n }\n ws.once(\"open\", onOpen)\n ws.once(\"error\", onError)\n if (signal.aborted) {\n ws.close()\n reject(new Error(\"Aborted before WS opened.\"))\n }\n signal.addEventListener(\"abort\", () => {\n ws.close()\n reject(new Error(\"Aborted while WS connecting.\"))\n })\n })\n\n process.stderr.write(`agentproto serve: tunnel up.\\n`)\n\n const sink: FrameSink = wrapWebSocket(ws as unknown as Parameters<typeof wrapWebSocket>[0])\n\n // Keep-alive: Cloud Run (and most reverse-proxies) close idle WebSocket\n // connections after ~5 minutes. Send a ping every 30s so the connection\n // stays alive between infrequent agent calls.\n const keepaliveInterval = setInterval(() => {\n try {\n sink.send({ t: \"ping\", nonce: randomUUID() })\n } catch {\n // sink already closing — the onClose handler below will clear us\n }\n }, 30_000)\n\n const server = createTunnelServer({\n sink,\n label: opts.label,\n pty: spawnPty !== null,\n ...(spawnPty ? { spawnPty } : {}),\n // Announce what this daemon serves (doctypes + installed agent adapters)\n // so a multi-daemon host can enumerate + route by capability.\n ...(announcedTools.length ? { tools: announcedTools } : {}),\n // Generic HTTP-relay upstream for tunnel `http_request` frames.\n // Cloud-side callers (e.g. the API's local-daemon filesystem\n // provider) can now route MCP JSON-RPC + any other HTTP through\n // the daemon without needing a public URL. We point at the local\n // gateway since that's where `/mcp`, `/sessions`, `/events` live.\n httpUpstream: gateway.url,\n // Forward bounds, stated explicitly so they're visible and tunable here\n // (the local gateway is fast, so the package defaults fit; bump these if\n // this daemon ever fronts a slower upstream):\n // - connect + buffered-body / connect + stream-headers ceiling\n httpForwardTimeoutMs: DEFAULT_HTTP_FORWARD_TIMEOUT_MS,\n // - WS upgrade dial ceiling\n wsDialTimeoutMs: DEFAULT_WS_DIAL_TIMEOUT_MS,\n // Bound a streaming forward against a silent upstream: if an SSE/ndjson\n // stream sends headers then stalls with no bytes for 2 min, end it instead\n // of holding the reqId open forever. The window resets per chunk, so a\n // well-behaved stream (events or heartbeat comments) is never cut — only a\n // genuinely dead upstream trips it.\n httpStreamIdleTimeoutMs: 120_000,\n // WS forwarding upstream — daemon dials the local gateway's WS\n // endpoints (/sessions/:id/pty, etc) and pipes frames to the host.\n // Used by the cloud tunnel pod so browsers on mobile can attach to\n // interactive PTY sessions even though the daemon is only reachable\n // through the host (not directly).\n dialUpstreamWs: async ({ url, protocols, headers, signal }) => {\n // Dial with the same `ws` lib already used for the host tunnel.\n // Resolve once we receive `open`; reject on `error` / `unexpected-response`.\n //\n // Origin gotcha: the daemon's own HTTP gateway requires Origin in\n // its allowlist for mutating + WS routes. When we self-dial here\n // (no browser in the path), `ws` doesn't set Origin and the\n // request gets 401'd by the daemon's own auth. Inject a loopback\n // Origin matching the URL — `http://127.0.0.1:*` is always in the\n // default allowlist.\n const upstreamHeaders: Record<string, string> = {\n ...(headers as Record<string, string> | undefined),\n }\n if (!upstreamHeaders[\"origin\"] && !upstreamHeaders[\"Origin\"]) {\n try {\n const u = new URL(url)\n const httpScheme = u.protocol === \"wss:\" ? \"https:\" : \"http:\"\n upstreamHeaders[\"Origin\"] = `${httpScheme}//${u.host}`\n } catch {\n /* malformed url — daemon will reject with a clear error */\n }\n }\n return await new Promise((resolve, reject) => {\n const sock = new WebSocket(url, protocols ? [...protocols] : undefined, {\n headers: upstreamHeaders,\n })\n // The server bounds the dial and aborts via `signal` on timeout/teardown.\n // Honour it: tear down the half-open socket and reject promptly so we\n // don't leak a connecting socket.\n const onAbort = () => {\n sock.off(\"open\", onceOpen)\n sock.off(\"error\", onceError)\n sock.off(\"unexpected-response\", onceUnexpected)\n try {\n sock.terminate()\n } catch {\n /* defensive — socket may already be closing */\n }\n reject(\n signal?.reason instanceof Error\n ? signal.reason\n : new Error(\"ws dial aborted\"),\n )\n }\n const detachAbort = () => signal?.removeEventListener(\"abort\", onAbort)\n const onceOpen = () => {\n detachAbort()\n sock.off(\"error\", onceError)\n sock.off(\"unexpected-response\", onceUnexpected)\n resolve({\n protocol: sock.protocol ?? \"\",\n send: (data, sendOpts) => {\n sock.send(data, { binary: sendOpts.binary })\n },\n close: (code, reason) => {\n try {\n sock.close(code, reason)\n } catch {\n /* defensive — socket may already be closed */\n }\n },\n onMessage: handler => {\n sock.on(\"message\", (raw: Buffer, isBinary: boolean) => {\n handler(raw, isBinary)\n })\n },\n onClose: handler => {\n sock.on(\"close\", (code: number, reason: Buffer) => {\n handler(code, reason.toString(\"utf8\"))\n })\n },\n onError: handler => {\n sock.on(\"error\", (err: Error) => handler(err))\n },\n })\n }\n const onceError = (err: Error) => {\n detachAbort()\n sock.off(\"open\", onceOpen)\n reject(err)\n }\n const onceUnexpected = (\n _req: unknown,\n res: { statusCode?: number }\n ) => {\n detachAbort()\n sock.off(\"open\", onceOpen)\n reject(new Error(`Unexpected server response: ${res.statusCode ?? 0}`))\n }\n if (signal) {\n if (signal.aborted) {\n onAbort()\n return\n }\n signal.addEventListener(\"abort\", onAbort, { once: true })\n }\n sock.once(\"open\", onceOpen)\n sock.once(\"error\", onceError)\n sock.once(\"unexpected-response\", onceUnexpected)\n })\n },\n // Resolve a named WS upstream to a registered import's origin. A host\n // can watch a tab on an imported capability server (e.g. a browser\n // daemon) by aliasing the import instead of the default gateway — the\n // path rides the import's own origin (`http://127.0.0.1:<port>`), the\n // daemon never accepts a raw origin from the host.\n resolveWsUpstream: async alias => {\n const cfg = await loadImportedMcps()\n const entry = cfg.imports.find(e => e.alias === alias)\n const url = entry?.snapshot.url\n if (!url) return undefined\n try {\n return new URL(url).origin\n } catch {\n return undefined\n }\n },\n // v0 authorize hook: trust the bearer-authenticated host completely.\n // Token possession proves the host was provisioned for this daemon.\n // Per-spawn policy filtering will land alongside the policy.toml.\n authorize: req => req,\n // ── AIP-46 bridge: tunnel spawns land in the gateway registry ──\n // Every cloud-driven spawn shows up in `gateway.url/sessions`\n // and the LocalDaemonSessionsCard, alongside spawns originated\n // through MCP tools or POST /sessions/agent. The execId is the\n // host's stable id — keep it so cloud cli_sessions rows can\n // cross-ref the daemon-side descriptor.\n onChildSpawned: ({ execId, child, request }) => {\n gateway.sessions.register({\n id: execId,\n child,\n workspaceSlug: opts.label,\n command: [request.command, ...request.args].join(\" \"),\n kind: \"agent-cli\",\n label: `tunnel: ${request.command.split(\"/\").pop() ?? request.command}`,\n })\n },\n // Graceful drain hook — flip the outer loop's \"reconnect immediately\"\n // flag and close the WS so the supervisor reconnects without backoff.\n // Host will follow up with close(1012) ~2s later as a hard backstop.\n onReconnectSoon: ({ reasonMs }) => {\n process.stderr.write(\n `agentproto serve: host signaled drain (reasonMs=${reasonMs ?? \"?\"}) — reconnecting immediately\\n`\n )\n reconnectState.immediate = true\n try {\n ws.close(1000, \"host_drain\")\n } catch {\n /* socket already closing */\n }\n },\n })\n\n // Block until the sink closes (peer disconnect or our shutdown).\n await new Promise<void>(resolve => {\n const offClose = sink.onClose(() => {\n clearInterval(keepaliveInterval)\n offClose()\n resolve()\n })\n if (signal.aborted) {\n clearInterval(keepaliveInterval)\n server.close().finally(() => resolve())\n }\n signal.addEventListener(\"abort\", () => {\n clearInterval(keepaliveInterval)\n server.close().finally(() => resolve())\n })\n })\n\n process.stderr.write(`agentproto serve: tunnel closed.\\n`)\n}\n\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise(resolve => {\n if (signal.aborted) return resolve()\n const timer = setTimeout(resolve, ms)\n signal.addEventListener(\"abort\", () => {\n clearTimeout(timer)\n resolve()\n })\n })\n}\n\n/**\n * Boot banner. Single block so the user sees the whole \"gateway up\"\n * picture in one place, with subtle color when stdout is a TTY. The\n * old format was:\n *\n * agentproto serve: gateway up on http://...\n * workspace: /abs/path\n * mcp: http://.../mcp\n * …\n *\n * What this prints instead:\n *\n * ─ agentproto · gateway up · http://127.0.0.1:18790 ─\n * workspace /abs/path\n * pty enabled (node-pty)\n * origins localhost:* (default)\n * endpoints /mcp · /sessions · /events · /sessions/:id/pty (WS)\n * mode local-only\n */\nfunction printBootBanner(opts: {\n url: string\n workspace: string\n ptyEnabled: boolean\n allowedOrigins?: readonly string[]\n strictOrigins?: boolean\n connect?: string\n}): void {\n const c = color\n const home = process.env.HOME ?? \"\"\n const workspace =\n home && opts.workspace.startsWith(home)\n ? \"~\" + opts.workspace.slice(home.length)\n : opts.workspace\n const ptyState = opts.ptyEnabled\n ? `${c.green}enabled${c.reset} ${c.dim}(node-pty)${c.reset}`\n : `${c.amber}disabled${c.reset} ${c.dim}(install node-pty to enable)${c.reset}`\n let origins: string\n if (opts.strictOrigins) {\n origins =\n opts.allowedOrigins && opts.allowedOrigins.length > 0\n ? `${c.amber}STRICT${c.reset} ${opts.allowedOrigins.join(\" · \")} ${c.dim}(localhost defaults disabled)${c.reset}`\n : `${c.red}STRICT · empty allowlist${c.reset} ${c.dim}(every Origin will 401 — only Bearer-token works)${c.reset}`\n } else {\n origins =\n opts.allowedOrigins && opts.allowedOrigins.length > 0\n ? opts.allowedOrigins.join(\" · \") +\n ` ${c.dim}+ localhost (default)${c.reset}`\n : `${c.dim}localhost:* only (default)${c.reset}`\n }\n const mode = opts.connect\n ? `${c.cyan}tunnel${c.reset} ${c.dim}→ ${opts.connect}${c.reset}`\n : `${c.dim}local-only${c.reset}`\n const line = `${c.dim}─${c.reset}`\n process.stderr.write(\n `\\n${line} ${c.bold}agentproto${c.reset} ${c.dim}·${c.reset} gateway up ${c.dim}·${c.reset} ${c.cyan}${opts.url}${c.reset} ${line}\\n` +\n ` ${c.dim}workspace${c.reset} ${workspace}\\n` +\n ` ${c.dim}pty${c.reset} ${ptyState}\\n` +\n ` ${c.dim}origins${c.reset} ${origins}\\n` +\n ` ${c.dim}endpoints${c.reset} /mcp · /sessions · /events · /sessions/:id/pty ${c.dim}(WS)${c.reset}\\n` +\n ` ${c.dim}mode${c.reset} ${mode}\\n` +\n `\\n`,\n )\n}\n\n/**\n * Tiny ANSI palette gated on stdout being a TTY. Writing colors into\n * a logfile (launchd `StandardOutPath`) would litter the file with\n * `\\x1b[…m` noise; this strips when piped.\n */\nconst _isTty = !!(process.stderr as NodeJS.WriteStream).isTTY\nconst color = _isTty\n ? {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n green: \"\\x1b[32m\",\n amber: \"\\x1b[33m\",\n cyan: \"\\x1b[36m\",\n red: \"\\x1b[31m\",\n }\n : {\n reset: \"\",\n bold: \"\",\n dim: \"\",\n green: \"\",\n amber: \"\",\n cyan: \"\",\n red: \"\",\n }\n"]}