@agentproto/cli 0.1.0-alpha.1 → 0.1.0-alpha.3

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.
package/dist/cli.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/registry/resolve.ts","../src/commands/install.ts","../src/util/stdin.ts","../src/commands/run.ts","../src/commands/serve.ts","../src/cli.ts"],"names":["parseArgs","resolvePath"],"mappings":"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","file":"cli.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 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\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 * `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 * v0 implements `npm` only. Other methods (brew/pip/cargo/go/curl/\n * download) report a clear \"not yet implemented\" message — they're a\n * shellout exercise but each needs its own checksum / chmod handling.\n */\n\nimport { spawn } from \"node:child_process\"\nimport { parseArgs } from \"node:util\"\nimport type { AgentCliInstallMethod } from \"@agentproto/driver-agent-cli\"\nimport { resolveAdapter } from \"../registry/resolve.js\"\n\nexport async function runInstall(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 },\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 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 return 0\n }\n }\n\n for (const [i, step] of installSteps.entries()) {\n process.stdout.write(\n `agentproto install [${i + 1}/${installSteps.length}] ${describeStep(step)}\\n`\n )\n if (values[\"dry-run\"]) continue\n const code = await runStep(step)\n if (code !== 0) {\n process.stderr.write(\n `agentproto install: step ${i + 1} failed with exit ${code}.\\n`\n )\n return code\n }\n }\n\n process.stdout.write(`agentproto: '${slug}' installed.\\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.package ?? \"(?)\"}`\n case \"cargo\":\n return `cargo install ${step.package ?? \"(?)\"}`\n case \"go\":\n return `go install ${step.package ?? \"(?)\"}`\n case \"curl\":\n case \"download\":\n return `${step.method} ${step.url ?? \"(?)\"} → ${step.path ?? \"(default)\"}`\n default:\n return `${step.method} ${step.package ?? step.url ?? \"(?)\"}`\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 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 INSTALL.md).\\n`\n )\n return 1\n }\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 process.stderr.write(`\\x1b[31m[error] ${ev.error.message}\\x1b[0m\\n`)\n break\n }\n}\n","/**\n * `agentproto serve --connect <url>`\n *\n * Long-running daemon. Opens a WebSocket to a host (Guilde-shaped API),\n * authenticates with a bearer token, then accepts tunnel frames over\n * that channel — multiplexing many child processes through one socket\n * via `@agentproto/acp/tunnel`. The daemon owns local resources (PTYs,\n * child processes, JSONL session stores) so a host running in the\n * cloud can drive a CLI living on the user's laptop.\n *\n * Reconnect-with-backoff is built in: when the WS drops, every live\n * child gets a SIGHUP-shaped exit and we wait an increasing interval\n * before retrying. Hosts that want continuity should re-spawn after\n * they observe the new tunnel come up.\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 {\n createTunnelServer,\n wrapWebSocket,\n type FrameSink,\n} from \"@agentproto/acp/tunnel\"\nimport WebSocket from \"ws\"\n\ninterface ServeOpts {\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}\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 },\n })\n\n if (!values.connect) {\n process.stderr.write(\n \"agentproto serve: --connect <url> is required.\\n\" +\n \" example: agentproto serve --connect wss://guilde.work/api/v1/agentproto/tunnel --token $TOKEN\\n\"\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 ?? `${userInfo().username}@${hostname()}`\n const opts: ServeOpts = {\n connect: values.connect,\n token: values.token ?? process.env.AGENTPROTO_TOKEN,\n label,\n }\n\n process.stderr.write(\n `agentproto serve: connecting to ${opts.connect} as '${opts.label}'…\\n`\n )\n\n // Connect-loop runs forever until the process gets SIGINT/SIGTERM.\n // Each iteration owns one tunnel; reconnects happen sequentially.\n const aborter = new AbortController()\n const onSignal = (sig: NodeJS.Signals) => {\n process.stderr.write(`\\nagentproto serve: received ${sig}, shutting down.\\n`)\n aborter.abort()\n }\n process.once(\"SIGINT\", onSignal)\n process.once(\"SIGTERM\", onSignal)\n\n let backoffMs = opts.reconnectMinMs ?? 1_000\n const backoffMax = opts.reconnectMaxMs ?? 30_000\n\n while (!aborter.signal.aborted) {\n try {\n await runOneTunnel(opts, aborter.signal)\n backoffMs = opts.reconnectMinMs ?? 1_000 // success resets backoff\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 process.off(\"SIGINT\", onSignal)\n process.off(\"SIGTERM\", onSignal)\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 signal: AbortSignal\n): Promise<void> {\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 const server = createTunnelServer({\n sink,\n label: opts.label,\n pty: false,\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 })\n\n // Block until the sink closes (peer disconnect or our shutdown).\n await new Promise<void>((resolve) => {\n const offClose = sink.onClose(() => {\n offClose()\n resolve()\n })\n if (signal.aborted) {\n server.close().finally(() => resolve())\n }\n signal.addEventListener(\"abort\", () => {\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","#!/usr/bin/env node\n/**\n * `agentproto` — the binary entry. Three verbs:\n *\n * agentproto install <slug> install an adapter's underlying CLI\n * agentproto run <slug> [--cwd <dir>] spawn the adapter and stream a turn\n * agentproto serve --connect <url> daemon — relay spawns over WS\n *\n * Adapter slugs resolve through the registry (see ./registry/resolve.ts).\n * Out of the box we ship `claude-code`, `hermes` etc. via npm-installed\n * `@agentproto/adapter-<slug>` packages.\n *\n * argv handling: we identify the verb manually (first non-flag token)\n * and hand the rest verbatim to the verb's parser. Going through one\n * top-level parseArgs would either need to know every flag of every\n * verb up front (lossy) or use `strict: false` (which then eats verb\n * flags as positionals — see commit history for the bug this caused).\n */\n\nimport { runInstall } from \"./commands/install.js\"\nimport { runRun } from \"./commands/run.js\"\nimport { runServe } from \"./commands/serve.js\"\n\nconst USAGE = `agentproto — AIP-45 agent CLI host\n\nUsage:\n agentproto install <slug> [--registry <path>]\n agentproto run <slug> [--cwd <dir>] [--prompt <text>] [--resume <session-id>]\n agentproto serve --connect <url> [--token <jwt>] [--label <name>]\n agentproto --help\n agentproto --version\n\nExamples:\n agentproto install claude-code\n agentproto run claude-code --cwd . --prompt \"summarise this repo\"\n agentproto serve --connect wss://guilde.work/api/v1/agentproto/tunnel --token \\$AGENTPROTO_TOKEN\n`\n\nconst VERBS = new Set([\"install\", \"run\", \"serve\"])\n\nasync function main(argv: readonly string[]): Promise<number> {\n // Find the verb — first token that matches a known verb. Anything\n // before it is a top-level flag (--help/--version); anything after\n // is forwarded to the verb's own parser.\n const verbIdx = argv.findIndex((a) => VERBS.has(a))\n\n if (verbIdx === -1) {\n if (argv.includes(\"--version\") || argv.includes(\"-v\")) {\n process.stdout.write(\"agentproto 0.1.0-alpha\\n\")\n return 0\n }\n if (argv.includes(\"--help\") || argv.includes(\"-h\") || argv.length === 0) {\n process.stdout.write(USAGE)\n return 0\n }\n process.stderr.write(\n `agentproto: unrecognised argument(s): ${argv.join(\" \")}\\n\\n${USAGE}`\n )\n return 2\n }\n\n const verb = argv[verbIdx]\n const rest = argv.slice(verbIdx + 1)\n\n switch (verb) {\n case \"install\":\n return runInstall(rest)\n case \"run\":\n return runRun(rest)\n case \"serve\":\n return runServe(rest)\n default:\n // Unreachable — VERBS membership checked above.\n process.stderr.write(`agentproto: unknown verb '${verb}'\\n\\n${USAGE}`)\n return 2\n }\n}\n\nmain(process.argv.slice(2)).then(\n (code) => {\n process.exitCode = code\n },\n (err: unknown) => {\n const msg = err instanceof Error ? err.stack ?? err.message : String(err)\n process.stderr.write(`agentproto: ${msg}\\n`)\n process.exitCode = 1\n }\n)\n"]}
1
+ {"version":3,"sources":["../src/util/credentials.ts","../src/commands/auth.ts","../src/registry/resolve.ts","../src/commands/setup.ts","../src/commands/install.ts","../src/util/stdin.ts","../src/commands/run.ts","../src/commands/serve.ts","../src/commands/workspace.ts","../src/commands/sessions.ts","../src/cli.ts"],"names":["resolve","fs","resolvePath","parseArgs","platform","spawn","input","output","join","homedir","readFile","mkdir","dirname","writeFile","chmod","userInfo","hostname","createAgentCliRuntime","sleep","USAGE","list","loadWorkspacesConfig","truncate"],"mappings":"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","file":"cli.mjs","sourcesContent":["/**\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 * `agentproto auth <login | status | logout>`\n *\n * Implements the **host-binding** flow — the JWT that authenticates\n * `agentproto serve --connect <host>` to its tunnel host (Guilde,\n * a self-hosted gateway, …). Different from per-adapter setup tokens,\n * which are per-CLI and live in adapter `setup[]` blocks.\n *\n * Mechanism: OAuth 2.0 Device Authorization Grant (RFC 8628), the\n * same flow Claude Code, gh, gcloud, and stripe-cli use. Three steps:\n *\n * 1. Discovery — fetch `<host>/.well-known/agentproto-host.json`\n * to learn the device + token endpoints.\n * 2. Authorize — POST device endpoint → user_code + verification_uri.\n * 3. Poll — POST token endpoint with grant_type=device_code\n * until the user approves in the browser, then\n * persist {access_token, refresh_token, expires_in}\n * to `~/.agentproto/credentials.json`.\n *\n * Everything else in `agentproto` (serve, install, run) treats this\n * file as the source of truth when no `--token` is supplied.\n */\n\nimport { spawn } from \"node:child_process\"\nimport { hostname, platform, userInfo } from \"node:os\"\nimport { parseArgs } from \"node:util\"\nimport {\n credentialsPath,\n deleteHost,\n formatExpiry,\n isExpired,\n loadCredentials,\n normaliseHost,\n readHost,\n writeHost,\n type HostCredential,\n} from \"../util/credentials.js\"\n\nexport async function runAuth(args: readonly string[]): Promise<number> {\n const sub = args[0]\n const rest = args.slice(1)\n switch (sub) {\n case \"login\":\n return runAuthLogin(rest)\n case \"status\":\n return runAuthStatus(rest)\n case \"logout\":\n return runAuthLogout(rest)\n case undefined:\n case \"--help\":\n case \"-h\":\n process.stdout.write(USAGE)\n return 0\n default:\n process.stderr.write(\n `agentproto auth: unknown subcommand '${sub}'.\\n\\n${USAGE}`\n )\n return 2\n }\n}\n\nconst USAGE = `agentproto auth — host-binding tokens (RFC 8628 device flow)\n\nUsage:\n agentproto auth login [--host <url>] [--label <name>] [--no-browser]\n agentproto auth status [--host <url>] [--json]\n agentproto auth logout [--host <url>]\n\nThe default host is the one most recently logged into; on first use,\n\\`--host\\` is required. Examples:\n\n agentproto auth login --host wss://guilde.work\n agentproto auth status\n agentproto auth logout --host wss://guilde.work\n`\n\n// ── login ────────────────────────────────────────────────────────────\n\ninterface HostDiscovery {\n /** RFC 8414 issuer string, surfaced for \"logged in to X\" UI. */\n issuer: string\n /** RFC 8628 device authorization endpoint. */\n device_authorization_endpoint: string\n /** RFC 6749 token endpoint. */\n token_endpoint: string\n /** Optional revocation endpoint (RFC 7009). */\n revocation_endpoint?: string\n /** OAuth client_id the agentproto CLI presents. Hosts that don't\n * enforce per-client metadata MAY return the constant\n * `agentproto-cli`; hosts that do MUST register the CLI as a\n * public client and put the registered id here. */\n client_id: string\n /** Optional scopes the CLI may request. Subset of host's offer. */\n scopes_supported?: string[]\n}\n\ninterface DeviceAuthResponse {\n device_code: string\n user_code: string\n verification_uri: string\n /** Optional pre-filled URL with the user_code embedded. RFC 8628 §3.3.1. */\n verification_uri_complete?: string\n expires_in: number\n /** Polling interval in seconds. RFC 8628 default 5. */\n interval?: number\n}\n\ninterface TokenSuccessResponse {\n access_token: string\n token_type: \"Bearer\" | \"bearer\"\n expires_in: number\n refresh_token?: string\n scope?: string\n /** Custom (not in RFC 6749): host's revocation hint, e.g. JTI or\n * internal token row id. We pass it back on logout. */\n revocation_id?: string\n /** Custom: subject id surfaced in `auth status`. */\n subject?: string\n}\n\ninterface TokenErrorResponse {\n error:\n | \"authorization_pending\"\n | \"slow_down\"\n | \"access_denied\"\n | \"expired_token\"\n | \"invalid_client\"\n | \"invalid_grant\"\n | \"unsupported_grant_type\"\n | string\n error_description?: string\n}\n\nasync function runAuthLogin(args: readonly string[]): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n strict: true,\n options: {\n host: { type: \"string\" },\n label: { type: \"string\" },\n \"no-browser\": { type: \"boolean\" },\n scope: { type: \"string\" },\n },\n })\n const host = values.host ?? (await pickDefaultHost())\n if (!host) {\n process.stderr.write(\n \"agentproto auth login: pass --host <url> on first login (e.g. --host wss://guilde.work).\\n\"\n )\n return 2\n }\n const label = values.label ?? `${userInfo().username}@${hostname()}`\n const requestedScope = values.scope ?? \"tunnel:connect agent-cli:dispatch\"\n\n const httpHost = toHttp(host)\n const discoveryUrl = `${httpHost}/.well-known/agentproto-host.json`\n process.stdout.write(`agentproto auth: discovering ${discoveryUrl}\\n`)\n let discovery: HostDiscovery\n try {\n discovery = await fetchJson<HostDiscovery>(discoveryUrl)\n } catch (err) {\n process.stderr.write(\n `agentproto auth: failed to fetch host metadata: ${err instanceof Error ? err.message : String(err)}\\n` +\n ` Hosts SHOULD expose /.well-known/agentproto-host.json with device_authorization_endpoint + token_endpoint.\\n`\n )\n return 1\n }\n\n // Step 1 — request a device code.\n let deviceRes: DeviceAuthResponse\n try {\n deviceRes = await postForm<DeviceAuthResponse>(\n discovery.device_authorization_endpoint,\n {\n client_id: discovery.client_id,\n scope: requestedScope,\n // Custom field; hosts that ignore it stay compliant. The\n // approval UI uses it to render \"approve <label>\" so the user\n // recognises the device they're authorising.\n device_label: label,\n }\n )\n } catch (err) {\n process.stderr.write(\n `agentproto auth: device authorization request failed: ${err instanceof Error ? err.message : String(err)}\\n`\n )\n return 1\n }\n\n // Step 2 — show the code, open the browser.\n const verifyUrl =\n deviceRes.verification_uri_complete ?? deviceRes.verification_uri\n process.stdout.write(\n `\\nagentproto auth: open\\n ${verifyUrl}\\nand enter code ${deviceRes.user_code}\\n\\n`\n )\n if (!values[\"no-browser\"]) {\n void openBrowser(verifyUrl)\n }\n process.stdout.write(\n `agentproto auth: waiting for approval (expires in ${formatDuration(deviceRes.expires_in * 1000)})…\\n`\n )\n\n // Step 3 — poll the token endpoint.\n const interval = Math.max(1, deviceRes.interval ?? 5)\n const deadline = Date.now() + deviceRes.expires_in * 1000\n let pollIntervalMs = interval * 1000\n let token: TokenSuccessResponse | null = null\n while (Date.now() < deadline) {\n await sleep(pollIntervalMs)\n let res: TokenSuccessResponse | TokenErrorResponse\n try {\n res = await postForm<TokenSuccessResponse | TokenErrorResponse>(\n discovery.token_endpoint,\n {\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n device_code: deviceRes.device_code,\n client_id: discovery.client_id,\n }\n )\n } catch (err) {\n process.stderr.write(\n `agentproto auth: token poll failed: ${err instanceof Error ? err.message : String(err)}\\n`\n )\n return 1\n }\n if (\"access_token\" in res) {\n token = res\n break\n }\n if (res.error === \"authorization_pending\") continue\n if (res.error === \"slow_down\") {\n // Back off as RFC 8628 §3.5 recommends; poll cadence stays slower\n // for the rest of the flow.\n pollIntervalMs += 5_000\n continue\n }\n if (res.error === \"access_denied\") {\n process.stderr.write(`agentproto auth: approval denied. Aborting.\\n`)\n return 1\n }\n if (res.error === \"expired_token\") {\n process.stderr.write(\n `agentproto auth: device code expired before approval. Re-run \\`agentproto auth login\\`.\\n`\n )\n return 1\n }\n process.stderr.write(\n `agentproto auth: token endpoint returned '${res.error}'${\n res.error_description ? `: ${res.error_description}` : \"\"\n }\\n`\n )\n return 1\n }\n if (!token) {\n process.stderr.write(\n `agentproto auth: timed out waiting for approval. Re-run \\`agentproto auth login\\`.\\n`\n )\n return 1\n }\n\n // Persist.\n const cred: HostCredential = {\n token: token.access_token,\n tokenType: \"Bearer\",\n expiresAt: new Date(Date.now() + token.expires_in * 1000).toISOString(),\n obtainedAt: new Date().toISOString(),\n ...(token.refresh_token ? { refreshToken: token.refresh_token } : {}),\n ...(token.scope ? { scope: token.scope } : {}),\n ...(token.subject ? { subject: token.subject } : {}),\n ...(token.revocation_id ? { revocationId: token.revocation_id } : {}),\n deviceLabel: label,\n }\n await writeHost(host, cred)\n process.stdout.write(\n `agentproto auth: ✓ logged in to ${normaliseHost(host)}\\n` +\n ` saved to ${credentialsPath()} (mode 0600)\\n` +\n ` ${formatExpiry(cred)}${cred.subject ? `, subject ${cred.subject}` : \"\"}\\n`\n )\n return 0\n}\n\n// ── status ───────────────────────────────────────────────────────────\n\nasync function runAuthStatus(args: readonly string[]): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n strict: true,\n options: {\n host: { type: \"string\" },\n json: { type: \"boolean\" },\n },\n })\n const file = await loadCredentials()\n const entries = Object.entries(file.hosts)\n if (entries.length === 0) {\n if (values.json) {\n process.stdout.write(`{\"hosts\": []}\\n`)\n } else {\n process.stdout.write(\n `agentproto auth: no credentials. Try: agentproto auth login --host wss://guilde.work\\n`\n )\n }\n return 0\n }\n const filtered = values.host\n ? entries.filter(([h]) => h === normaliseHost(values.host!))\n : entries\n if (values.json) {\n process.stdout.write(\n JSON.stringify(\n {\n hosts: filtered.map(([host, c]) => ({\n host,\n subject: c.subject ?? null,\n scope: c.scope ?? null,\n obtainedAt: c.obtainedAt,\n expiresAt: c.expiresAt,\n expired: isExpired(c),\n deviceLabel: c.deviceLabel ?? null,\n })),\n },\n null,\n 2\n ) + \"\\n\"\n )\n return 0\n }\n for (const [host, c] of filtered) {\n const status = isExpired(c) ? \"✗ EXPIRED\" : \"✓ active\"\n process.stdout.write(\n `${status} ${host}\\n` +\n ` subject: ${c.subject ?? \"(none)\"}\\n` +\n ` scope: ${c.scope ?? \"(none)\"}\\n` +\n ` label: ${c.deviceLabel ?? \"(none)\"}\\n` +\n ` ${formatExpiry(c)} (obtained ${c.obtainedAt})\\n`\n )\n }\n return 0\n}\n\n// ── logout ───────────────────────────────────────────────────────────\n\nasync function runAuthLogout(args: readonly string[]): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n strict: true,\n options: { host: { type: \"string\" } },\n })\n const host = values.host ?? (await pickDefaultHost())\n if (!host) {\n process.stderr.write(\n `agentproto auth logout: no credentials to revoke. Pass --host <url> if you stored one.\\n`\n )\n return 0\n }\n const prev = await readHost(host)\n if (!prev) {\n process.stderr.write(\n `agentproto auth logout: no credential found for ${host}.\\n`\n )\n return 0\n }\n\n // Best-effort server-side revocation. RFC 7009 token revocation is\n // optional in the host metadata; when missing, we just delete the\n // local copy. When present, we call it but don't fail logout if it\n // errors — the local delete still happens so the user is logged out\n // on this machine even if the host is unreachable.\n let serverRevoked: \"ok\" | \"skipped\" | \"failed\" = \"skipped\"\n try {\n const httpHost = toHttp(host)\n const discovery = await fetchJson<HostDiscovery>(\n `${httpHost}/.well-known/agentproto-host.json`\n )\n if (discovery.revocation_endpoint) {\n const params: Record<string, string> = {\n client_id: discovery.client_id,\n token: prev.token,\n }\n if (prev.revocationId) params[\"revocation_id\"] = prev.revocationId\n await postForm(discovery.revocation_endpoint, params)\n serverRevoked = \"ok\"\n }\n } catch {\n serverRevoked = \"failed\"\n }\n\n await deleteHost(host)\n const note =\n serverRevoked === \"ok\"\n ? \" (server revoked)\"\n : serverRevoked === \"failed\"\n ? \" (server revocation failed; local copy still removed)\"\n : \" (no revocation endpoint advertised; local copy removed)\"\n process.stdout.write(`agentproto auth: ✓ logged out of ${host}${note}\\n`)\n return 0\n}\n\n// ── helpers ──────────────────────────────────────────────────────────\n\nasync function pickDefaultHost(): Promise<string | null> {\n const f = await loadCredentials()\n const keys = Object.keys(f.hosts)\n if (keys.length === 0) return null\n // Most-recently-issued wins. Status command surfaces the full list\n // so the heuristic is just for omitted --host on a single-host setup.\n let best: { host: string; obtainedAt: number } | null = null\n for (const [host, cred] of Object.entries(f.hosts)) {\n const t = Date.parse(cred.obtainedAt)\n if (!Number.isFinite(t)) continue\n if (!best || t > best.obtainedAt) best = { host, obtainedAt: t }\n }\n return best?.host ?? keys[0] ?? null\n}\n\n/**\n * The host URL the user passes is typically a wss:// (tunnel) URL.\n * The OAuth metadata document lives at the http(s) origin of the same\n * host. This converter assumes wss → https, ws → http; everything\n * else passes through.\n */\nfunction toHttp(host: string): string {\n const trimmed = host.replace(/\\/+$/, \"\")\n if (trimmed.startsWith(\"wss://\")) return \"https://\" + trimmed.slice(6)\n if (trimmed.startsWith(\"ws://\")) return \"http://\" + trimmed.slice(5)\n return trimmed\n}\n\nasync function fetchJson<T>(url: string): Promise<T> {\n const res = await fetch(url, { headers: { Accept: \"application/json\" } })\n if (!res.ok) {\n throw new Error(`GET ${url} → ${res.status} ${res.statusText}`)\n }\n return (await res.json()) as T\n}\n\nasync function postForm<T>(\n url: string,\n body: Record<string, string>\n): Promise<T> {\n const params = new URLSearchParams(body)\n const res = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n Accept: \"application/json\",\n },\n body: params.toString(),\n })\n // OAuth error responses return 400 with a JSON `{error, ...}` body.\n // Hand them back to the caller verbatim; let it discriminate.\n if (!res.ok && res.status !== 400) {\n const text = await res.text().catch(() => \"\")\n throw new Error(\n `POST ${url} → ${res.status} ${res.statusText}${text ? \": \" + text.slice(0, 200) : \"\"}`\n )\n }\n return (await res.json()) as T\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nfunction formatDuration(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 return `${Math.round(ms / 3_600_000)}h`\n}\n\nfunction openBrowser(url: string): Promise<void> {\n // best-effort; failure is non-fatal — the URL is already on screen.\n const p = platform()\n const cmd = p === \"darwin\" ? \"open\" : p === \"win32\" ? \"cmd\" : \"xdg-open\"\n const args = p === \"win32\" ? [\"/c\", \"start\", url] : [url]\n return new Promise((resolve) => {\n try {\n const child = spawn(cmd, args, { stdio: \"ignore\", detached: true })\n child.once(\"error\", () => resolve())\n child.once(\"spawn\", () => {\n child.unref()\n resolve()\n })\n } catch {\n resolve()\n }\n })\n}\n","/**\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\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 // Broken adapter — log and skip rather than fail the listing.\n console.warn(\n `[agentproto/cli] listInstalledAdapters: skipping broken adapter '${slug}': ${\n err instanceof Error ? err.message : String(err)\n }`\n )\n }\n }\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 <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\"\n\nexport async function runInstall(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 \"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 * `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 {\n readHost,\n isExpired,\n formatExpiry,\n} from \"../util/credentials.js\"\nimport {\n createTunnelServer,\n wrapWebSocket,\n type FrameSink,\n} from \"@agentproto/acp/tunnel\"\nimport {\n createGateway,\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}\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 },\n })\n\n // Workspace defaults to cwd. Validated below — must exist + be a\n // directory (createGateway throws on missing, but a clearer\n // message at this layer beats the stack trace).\n const workspace = resolvePath(values.workspace ?? process.cwd())\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 ? Number.parseInt(values.port, 10) : 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 ?? `${userInfo().username}@${hostname()}`\n\n // Token resolution precedence:\n // 1. --token <jwt> — explicit override\n // 2. $AGENTPROTO_TOKEN — env, useful for CI / docker\n // 3. ~/.agentproto/credentials.json[host] — `agentproto auth login`\n //\n // Step 3 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 = values.token ?? process.env.AGENTPROTO_TOKEN\n if (!token && values.connect) {\n const cred = await readHost(values.connect)\n if (cred) {\n if (isExpired(cred)) {\n process.stderr.write(\n `agentproto serve: ⚠ credentials for ${values.connect} are expired (${formatExpiry(cred)}). ` +\n `Re-run \\`agentproto auth login --host ${values.connect}\\`.\\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 const opts: ServeOpts = {\n workspace,\n port,\n bind: values.bind ?? \"127.0.0.1\",\n ...(values.connect ? { connect: values.connect } : {}),\n ...(token ? { token } : {}),\n label,\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 }) {\n return runtime.start({ cwd })\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 // ── 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 })\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 process.stderr.write(\n `agentproto serve: gateway up on ${gateway.url}\\n` +\n ` workspace: ${gateway.workspace}\\n` +\n ` mcp: ${gateway.url}/mcp\\n` +\n ` sessions: ${gateway.url}/sessions\\n` +\n ` events: ${gateway.url}/events\\n`\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(`\\nagentproto serve: ${signal} — shutting down.\\n`)\n aborter.abort()\n await gateway.stop().catch(() => undefined)\n process.exit(0)\n }\n process.once(\"SIGINT\", () => void shutdown(\"SIGINT\"))\n process.once(\"SIGTERM\", () => void shutdown(\"SIGTERM\"))\n\n // ── local-only mode: nothing else to do ──\n if (!opts.connect) {\n process.stderr.write(\n `agentproto serve: running local-only (no --connect). Press Ctrl-C to stop.\\n`\n )\n // Park indefinitely until shutdown signal.\n await new Promise<void>(resolve => {\n aborter.signal.addEventListener(\"abort\", () => resolve())\n })\n return 0\n }\n\n // ── tunnel mode: connect-loop + onChildSpawned bridge ──\n process.stderr.write(\n `agentproto serve: tunnel — connecting to ${opts.connect} as '${opts.label}'…\\n`\n )\n\n let backoffMs = opts.reconnectMinMs ?? 1_000\n const backoffMax = opts.reconnectMaxMs ?? 30_000\n while (!aborter.signal.aborted) {\n try {\n await runOneTunnel(opts, gateway, aborter.signal)\n backoffMs = opts.reconnectMinMs ?? 1_000 // success resets backoff\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 signal: AbortSignal\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 const server = createTunnelServer({\n sink,\n label: opts.label,\n pty: false,\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 })\n\n // Block until the sink closes (peer disconnect or our shutdown).\n await new Promise<void>(resolve => {\n const offClose = sink.onClose(() => {\n offClose()\n resolve()\n })\n if (signal.aborted) {\n server.close().finally(() => resolve())\n }\n signal.addEventListener(\"abort\", () => {\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 * `agentproto workspace <subcommand>`\n *\n * Subcommands:\n * add <path> [--slug <slug>] [--label <text>] register a folder\n * list show registered + active\n * remove <slug> drop an entry\n * use <slug> set the active workspace\n *\n * Reads/writes `~/.agentproto/workspaces.json` via @agentproto/runtime.\n * Pure CLI shell — no daemon needed; the daemon picks up the file on\n * its next read (boot for now, hot reload TBD).\n */\nimport { parseArgs } from \"node:util\"\nimport { resolve, basename } from \"node:path\"\nimport { existsSync } from \"node:fs\"\nimport {\n loadWorkspacesConfig,\n saveWorkspacesConfig,\n addWorkspace,\n removeWorkspace,\n setActiveWorkspace,\n sanitizeSlug,\n DEFAULT_CONFIG_PATH,\n type WorkspaceEntry,\n} from \"@agentproto/runtime/workspaces-config\"\n\nconst USAGE = `agentproto workspace — manage local workspaces\n\nUsage:\n agentproto workspace add <path> [--slug <slug>] [--label <text>]\n agentproto workspace list [--json]\n agentproto workspace remove <slug>\n agentproto workspace use <slug>\n agentproto workspace --help\n\nConfig file: ${DEFAULT_CONFIG_PATH()}\n`\n\nexport async function runWorkspace(args: readonly string[]): Promise<number> {\n if (args.length === 0 || args.includes(\"--help\") || args.includes(\"-h\")) {\n process.stdout.write(USAGE)\n return 0\n }\n const sub = args[0]\n const rest = args.slice(1)\n switch (sub) {\n case \"add\":\n return runAdd(rest)\n case \"list\":\n case \"ls\":\n return runList(rest)\n case \"remove\":\n case \"rm\":\n return runRemove(rest)\n case \"use\":\n return runUse(rest)\n default:\n process.stderr.write(\n `agentproto workspace: unknown subcommand '${sub}'\\n\\n${USAGE}`\n )\n return 2\n }\n}\n\nasync function runAdd(args: readonly string[]): Promise<number> {\n const { values, positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {\n slug: { type: \"string\" },\n label: { type: \"string\" },\n },\n })\n const rawPath = positionals[0]\n if (!rawPath) {\n process.stderr.write(\n \"agentproto workspace add: missing <path>. Try: agentproto workspace add ~/code/my-project\\n\"\n )\n return 2\n }\n const absPath = resolve(rawPath.replace(/^~/, process.env.HOME ?? \"~\"))\n if (!existsSync(absPath)) {\n process.stderr.write(\n `agentproto workspace add: \"${absPath}\" doesn't exist. Create the directory first or pass an existing one.\\n`\n )\n return 2\n }\n const slug = sanitizeSlug(values.slug ?? basename(absPath))\n const config = await loadWorkspacesConfig()\n const next = addWorkspace(config, {\n slug,\n path: absPath,\n ...(values.label ? { label: values.label } : {}),\n })\n await saveWorkspacesConfig(next)\n const wasActive = config.active === slug\n const becameActive = next.active === slug && !wasActive\n process.stdout.write(\n `✓ ${slug} → ${absPath}` +\n (becameActive ? \" (set as active — first registered workspace)\" : \"\") +\n \"\\n\"\n )\n return 0\n}\n\nasync function runList(args: readonly string[]): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n allowPositionals: false,\n strict: true,\n options: { json: { type: \"boolean\" } },\n })\n const config = await loadWorkspacesConfig()\n if (values.json) {\n process.stdout.write(JSON.stringify(config, null, 2) + \"\\n\")\n return 0\n }\n if (config.workspaces.length === 0) {\n process.stdout.write(\n \"No workspaces registered.\\n\" +\n \"Add one with: agentproto workspace add <path>\\n\"\n )\n return 0\n }\n // Compact two-column layout — slug left, path right, with an\n // active marker. Sorted by updatedAt desc so the most recently\n // touched workspace is at the top.\n const sorted = [...config.workspaces].sort((a, b) =>\n b.updatedAt.localeCompare(a.updatedAt)\n )\n const slugCol = Math.max(...sorted.map(w => w.slug.length), 6)\n for (const w of sorted) {\n const marker = w.slug === config.active ? \"●\" : \" \"\n const slugCell = w.slug.padEnd(slugCol)\n const labelSuffix = w.label ? ` (${w.label})` : \"\"\n process.stdout.write(\n `${marker} ${slugCell} ${w.path}${labelSuffix}\\n`\n )\n }\n process.stdout.write(\n `\\n${sorted.length} workspace${sorted.length === 1 ? \"\" : \"s\"}` +\n (config.active ? `, active: ${config.active}` : \", no active\") +\n \"\\n\"\n )\n return 0\n}\n\nasync function runRemove(args: readonly string[]): Promise<number> {\n const { positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {},\n })\n const slug = positionals[0]\n if (!slug) {\n process.stderr.write(\n \"agentproto workspace remove: missing <slug>.\\n\"\n )\n return 2\n }\n const config = await loadWorkspacesConfig()\n const sanitised = sanitizeSlug(slug)\n const existed = config.workspaces.some(w => w.slug === sanitised)\n if (!existed) {\n process.stderr.write(\n `agentproto workspace remove: no workspace named \"${sanitised}\".\\n`\n )\n return 2\n }\n const next = removeWorkspace(config, sanitised)\n await saveWorkspacesConfig(next)\n process.stdout.write(`✗ removed ${sanitised}\\n`)\n if (next.active && next.active !== config.active) {\n process.stdout.write(` active reassigned to: ${next.active}\\n`)\n } else if (!next.active && config.active) {\n process.stdout.write(` no workspaces left — active cleared\\n`)\n }\n return 0\n}\n\nasync function runUse(args: readonly string[]): Promise<number> {\n const { positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {},\n })\n const slug = positionals[0]\n if (!slug) {\n process.stderr.write(\"agentproto workspace use: missing <slug>.\\n\")\n return 2\n }\n const config = await loadWorkspacesConfig()\n try {\n const next = setActiveWorkspace(config, slug)\n await saveWorkspacesConfig(next)\n const w = next.workspaces.find(x => x.slug === next.active) as\n | WorkspaceEntry\n | undefined\n process.stdout.write(`● active: ${next.active} (${w?.path ?? \"?\"})\\n`)\n return 0\n } catch (err) {\n process.stderr.write(\n `agentproto workspace use: ${\n err instanceof Error ? err.message : String(err)\n }\\n`\n )\n return 2\n }\n}\n","/**\n * `agentproto sessions [--watch] [--attach <id>] [--json]`\n *\n * Browse the daemon's live sessions (terminals, agent CLIs, custom\n * commands) without leaving the shell. Three usage modes:\n *\n * agentproto sessions one-shot table dump\n * agentproto sessions --watch re-render every 2s, q to quit\n * agentproto sessions --attach <id> SSE-stream a session's output\n *\n * The TUI is intentionally minimal — raw stdin keypresses, no inquirer\n * / blessed dep. Terminal emulator quirks (xterm vs iTerm, key\n * sequences for arrow keys) are limited to a couple lines below.\n *\n * Endpoint discovery: reads `~/.agentproto/runtime.json` written by\n * the daemon at startup. Falls back to the env var\n * `AGENTPROTO_DAEMON_URL` when the file is missing or stale.\n */\nimport { parseArgs } from \"node:util\"\nimport { promises as fs } from \"node:fs\"\nimport { resolve } from \"node:path\"\nimport http from \"node:http\"\nimport https from \"node:https\"\nimport {\n loadWorkspacesConfig,\n getActiveWorkspace,\n} from \"@agentproto/runtime/workspaces-config\"\n\nconst USAGE = `agentproto sessions — browse local daemon sessions\n\nUsage:\n agentproto sessions [--watch] [--json]\n agentproto sessions --attach <id> [--no-color]\n\nDiscovers the daemon via ~/.agentproto/runtime.json. Set\nAGENTPROTO_DAEMON_URL to override.\n`\n\ninterface SessionDescriptor {\n id: string\n kind: string\n workspaceSlug: string\n command: string\n pid: number | null\n status: string\n startedAt: string\n endedAt?: string\n exitCode?: number\n lastOutputAt?: string\n label?: string\n}\n\nexport async function runSessions(args: readonly string[]): Promise<number> {\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n process.stdout.write(USAGE)\n return 0\n }\n const { values } = parseArgs({\n args: [...args],\n allowPositionals: false,\n strict: true,\n options: {\n watch: { type: \"boolean\" },\n json: { type: \"boolean\" },\n attach: { type: \"string\" },\n \"no-color\": { type: \"boolean\" },\n },\n })\n\n const baseUrl = await resolveDaemonUrl()\n if (!baseUrl) {\n process.stderr.write(\n \"agentproto sessions: no daemon found.\\n\" +\n \" Start one with `agentproto serve` or set AGENTPROTO_DAEMON_URL.\\n\"\n )\n return 2\n }\n\n if (values.attach) {\n return runAttach({\n baseUrl,\n id: values.attach,\n colour: !values[\"no-color\"],\n })\n }\n\n if (values.json) {\n const list = await fetchSessions(baseUrl)\n process.stdout.write(JSON.stringify(list, null, 2) + \"\\n\")\n return 0\n }\n\n if (values.watch) {\n return runWatch(baseUrl)\n }\n\n // One-shot\n const list = await fetchSessions(baseUrl)\n printTable(list)\n return 0\n}\n\nasync function resolveDaemonUrl(): Promise<string | null> {\n if (process.env.AGENTPROTO_DAEMON_URL) {\n return process.env.AGENTPROTO_DAEMON_URL.replace(/\\/+$/, \"\")\n }\n // Daemon writes its runtime.json INSIDE the workspace dir (not in\n // ~/.agentproto). We use ~/.agentproto/workspaces.json to find the\n // active workspace, then read its runtime.json. Falls back to\n // probing each registered workspace if active doesn't have a live\n // runtime.json (the user can have multiple workspaces with daemons\n // in/out of running state).\n const config = await loadWorkspacesConfig().catch(() => null)\n if (!config) return null\n const candidates = [\n getActiveWorkspace(config),\n ...config.workspaces,\n ].filter(\n (w, i, arr): w is NonNullable<typeof w> =>\n !!w && arr.findIndex(x => x?.slug === w.slug) === i\n )\n for (const w of candidates) {\n const url = await readRuntimeJson(w.path)\n if (url) return url\n }\n return null\n}\n\nasync function readRuntimeJson(workspacePath: string): Promise<string | null> {\n const path = resolve(workspacePath, \".agentproto\", \"runtime.json\")\n try {\n const raw = await fs.readFile(path, \"utf8\")\n const parsed = JSON.parse(raw) as {\n port?: number\n bind?: string\n }\n if (typeof parsed.port !== \"number\") return null\n return `http://${parsed.bind ?? \"127.0.0.1\"}:${parsed.port}`\n } catch {\n return null\n }\n}\n\nasync function fetchSessions(baseUrl: string): Promise<SessionDescriptor[]> {\n const body = await httpGetJson(`${baseUrl}/sessions`)\n if (!body || !Array.isArray((body as { sessions?: unknown }).sessions)) {\n return []\n }\n return (body as { sessions: SessionDescriptor[] }).sessions\n}\n\nfunction printTable(rows: SessionDescriptor[]): void {\n if (rows.length === 0) {\n process.stdout.write(\"No sessions.\\n\")\n return\n }\n const widths = {\n id: Math.max(...rows.map(r => r.id.length), 4),\n kind: Math.max(...rows.map(r => r.kind.length), 4),\n workspace: Math.max(...rows.map(r => r.workspaceSlug.length), 9),\n status: Math.max(...rows.map(r => r.status.length), 8),\n age: 8,\n }\n const header =\n pad(\"ID\", widths.id) +\n \" \" +\n pad(\"KIND\", widths.kind) +\n \" \" +\n pad(\"WORKSPACE\", widths.workspace) +\n \" \" +\n pad(\"STATUS\", widths.status) +\n \" \" +\n pad(\"AGE\", widths.age) +\n \" COMMAND\"\n process.stdout.write(`\\x1b[2m${header}\\x1b[0m\\n`)\n const now = Date.now()\n for (const r of rows) {\n const age = humaniseDelta(now - new Date(r.startedAt).getTime())\n const tone = statusColour(r.status)\n process.stdout.write(\n pad(r.id, widths.id) +\n \" \" +\n pad(r.kind, widths.kind) +\n \" \" +\n pad(r.workspaceSlug, widths.workspace) +\n \" \" +\n `${tone}${pad(r.status, widths.status)}\\x1b[0m` +\n \" \" +\n pad(age, widths.age) +\n \" \" +\n truncate(r.command, 60) +\n \"\\n\"\n )\n }\n}\n\nfunction statusColour(status: string): string {\n switch (status) {\n case \"running\":\n return \"\\x1b[32m\" // green\n case \"starting\":\n case \"mounting\":\n return \"\\x1b[33m\" // yellow\n case \"exited\":\n return \"\\x1b[2m\" // dim\n case \"killed\":\n case \"error\":\n return \"\\x1b[31m\" // red\n default:\n return \"\"\n }\n}\n\nfunction pad(s: string, n: number): string {\n if (s.length >= n) return s\n return s + \" \".repeat(n - s.length)\n}\n\nfunction truncate(s: string, n: number): string {\n if (s.length <= n) return s\n return s.slice(0, n - 1) + \"…\"\n}\n\nfunction humaniseDelta(ms: number): string {\n if (ms < 60_000) return `${Math.floor(ms / 1000)}s`\n if (ms < 3_600_000) return `${Math.floor(ms / 60_000)}m`\n if (ms < 86_400_000) return `${Math.floor(ms / 3_600_000)}h`\n return `${Math.floor(ms / 86_400_000)}d`\n}\n\nasync function runWatch(baseUrl: string): Promise<number> {\n // Set raw stdin so a single keypress (q) exits without ENTER. Skip\n // raw mode if stdin isn't a TTY (piped); the loop still runs but\n // quitting is via SIGINT instead.\n const tty = process.stdin.isTTY === true\n if (tty) {\n process.stdin.setRawMode(true)\n process.stdin.resume()\n process.stdin.setEncoding(\"utf8\")\n }\n let stop = false\n const onKey = (key: string): void => {\n if (key === \"q\" || key === \"\u0003\" /* Ctrl-C */) stop = true\n }\n if (tty) process.stdin.on(\"data\", onKey)\n process.on(\"SIGINT\", () => {\n stop = true\n })\n try {\n while (!stop) {\n const list = await fetchSessions(baseUrl).catch(err => {\n process.stdout.write(`\\x1bc[fetch error] ${String(err)}\\n`)\n return null\n })\n // Clear screen + move cursor home — full repaint each tick.\n process.stdout.write(\"\\x1bc\")\n process.stdout.write(\n `\\x1b[2magentproto sessions • ${baseUrl} • ${tty ? \"press q to quit\" : \"Ctrl-C to quit\"}\\x1b[0m\\n\\n`\n )\n if (list) printTable(list)\n // Sleep 2s but stay responsive to keypresses\n await new Promise<void>(res => setTimeout(res, 2_000))\n }\n } finally {\n if (tty) {\n process.stdin.off(\"data\", onKey)\n process.stdin.setRawMode(false)\n process.stdin.pause()\n }\n process.stdout.write(\"\\n\")\n }\n return 0\n}\n\ninterface AttachOpts {\n baseUrl: string\n id: string\n colour: boolean\n}\n\nasync function runAttach({ baseUrl, id, colour }: AttachOpts): Promise<number> {\n return new Promise(resolve => {\n const url = new URL(`${baseUrl}/sessions/${id}/stream`)\n const lib = url.protocol === \"https:\" ? https : http\n const req = lib.get(\n url,\n { headers: { accept: \"text/event-stream\" } },\n res => {\n if (res.statusCode === 404) {\n process.stderr.write(\n `agentproto sessions --attach: no session \"${id}\".\\n`\n )\n resolve(2)\n return\n }\n if (res.statusCode !== 200) {\n process.stderr.write(\n `agentproto sessions --attach: HTTP ${res.statusCode}\\n`\n )\n resolve(1)\n return\n }\n let buf = \"\"\n res.setEncoding(\"utf8\")\n res.on(\"data\", chunk => {\n buf += chunk\n let idx = buf.indexOf(\"\\n\\n\")\n while (idx !== -1) {\n const event = buf.slice(0, idx)\n buf = buf.slice(idx + 2)\n for (const line of event.split(\"\\n\")) {\n if (line.startsWith(\"data:\")) {\n const payload = line.slice(5).trim()\n try {\n const json = JSON.parse(payload) as {\n line?: string\n stream?: \"stdout\" | \"stderr\"\n }\n if (typeof json.line !== \"string\") continue\n if (colour && json.stream === \"stderr\") {\n process.stdout.write(`\\x1b[31m${json.line}\\x1b[0m\\n`)\n } else {\n process.stdout.write(json.line + \"\\n\")\n }\n } catch {\n // Ignore ill-formed frames silently — daemon may have\n // sent a comment / heartbeat the parser doesn't model.\n }\n }\n }\n idx = buf.indexOf(\"\\n\\n\")\n }\n })\n res.on(\"end\", () => resolve(0))\n }\n )\n req.on(\"error\", err => {\n process.stderr.write(`agentproto sessions --attach: ${err.message}\\n`)\n resolve(1)\n })\n process.on(\"SIGINT\", () => {\n req.destroy()\n resolve(0)\n })\n })\n}\n\nfunction httpGetJson(url: string): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const u = new URL(url)\n const lib = u.protocol === \"https:\" ? https : http\n lib\n .get(u, res => {\n let body = \"\"\n res.setEncoding(\"utf8\")\n res.on(\"data\", c => (body += c))\n res.on(\"end\", () => {\n if ((res.statusCode ?? 0) < 200 || (res.statusCode ?? 0) >= 300) {\n reject(new Error(`HTTP ${res.statusCode}: ${body.slice(0, 200)}`))\n return\n }\n try {\n resolve(JSON.parse(body))\n } catch (err) {\n reject(err instanceof Error ? err : new Error(String(err)))\n }\n })\n })\n .on(\"error\", reject)\n })\n}\n","#!/usr/bin/env node\n/**\n * `agentproto` — the binary entry. Three verbs:\n *\n * agentproto install <slug> install an adapter's underlying CLI\n * agentproto run <slug> [--cwd <dir>] spawn the adapter and stream a turn\n * agentproto serve --connect <url> daemon — relay spawns over WS\n *\n * Adapter slugs resolve through the registry (see ./registry/resolve.ts).\n * Out of the box we ship `claude-code`, `hermes` etc. via npm-installed\n * `@agentproto/adapter-<slug>` packages.\n *\n * argv handling: we identify the verb manually (first non-flag token)\n * and hand the rest verbatim to the verb's parser. Going through one\n * top-level parseArgs would either need to know every flag of every\n * verb up front (lossy) or use `strict: false` (which then eats verb\n * flags as positionals — see commit history for the bug this caused).\n */\n\nimport { runAuth } from \"./commands/auth.js\"\nimport { runInstall } from \"./commands/install.js\"\nimport { runSetupCommand } from \"./commands/setup.js\"\nimport { runRun } from \"./commands/run.js\"\nimport { runServe } from \"./commands/serve.js\"\nimport { runWorkspace } from \"./commands/workspace.js\"\nimport { runSessions } from \"./commands/sessions.js\"\n\nconst USAGE = `agentproto — AIP-45 agent CLI host\n\nUsage:\n agentproto auth <login|status|logout> [--host <url>] [--label <name>]\n agentproto install <slug> [--force] [--dry-run] [--skip-setup]\n agentproto setup <slug> [--force] [--dry-run] [--only <stepId>...]\n agentproto run <slug> [--cwd <dir>] [--prompt <text>] [--resume <session-id>]\n agentproto serve [--workspace <dir>] [--port <n>] [--bind <ip>]\n [--connect <url> [--token <jwt>] [--label <name>]]\n agentproto workspace <add|list|remove|use> [args]\n agentproto sessions [--watch] [--attach <id>] [--json]\n agentproto --help\n agentproto --version\n\nExamples:\n agentproto auth login --host wss://guilde.work # device flow → ~/.agentproto/credentials.json\n agentproto install claude-code\n agentproto setup openclaw # re-run setup (idempotent via skip_if + ledger)\n agentproto run claude-code --cwd . --prompt \"summarise this repo\"\n agentproto workspace add ~/code/my-project --slug my-project\n agentproto workspace list\n agentproto serve --connect wss://guilde.work/api/v1/agentproto/tunnel\n`\n\nconst VERBS = new Set([\n \"auth\",\n \"install\",\n \"setup\",\n \"run\",\n \"serve\",\n \"workspace\",\n \"sessions\",\n])\n\nasync function main(argv: readonly string[]): Promise<number> {\n // Find the verb — first token that matches a known verb. Anything\n // before it is a top-level flag (--help/--version); anything after\n // is forwarded to the verb's own parser.\n const verbIdx = argv.findIndex((a) => VERBS.has(a))\n\n if (verbIdx === -1) {\n if (argv.includes(\"--version\") || argv.includes(\"-v\")) {\n process.stdout.write(\"agentproto 0.1.0-alpha\\n\")\n return 0\n }\n if (argv.includes(\"--help\") || argv.includes(\"-h\") || argv.length === 0) {\n process.stdout.write(USAGE)\n return 0\n }\n process.stderr.write(\n `agentproto: unrecognised argument(s): ${argv.join(\" \")}\\n\\n${USAGE}`\n )\n return 2\n }\n\n const verb = argv[verbIdx]\n const rest = argv.slice(verbIdx + 1)\n\n switch (verb) {\n case \"auth\":\n return runAuth(rest)\n case \"install\":\n return runInstall(rest)\n case \"setup\":\n return runSetupCommand(rest)\n case \"run\":\n return runRun(rest)\n case \"serve\":\n return runServe(rest)\n case \"workspace\":\n return runWorkspace(rest)\n case \"sessions\":\n return runSessions(rest)\n default:\n // Unreachable — VERBS membership checked above.\n process.stderr.write(`agentproto: unknown verb '${verb}'\\n\\n${USAGE}`)\n return 2\n }\n}\n\nmain(process.argv.slice(2)).then(\n (code) => {\n process.exitCode = code\n },\n (err: unknown) => {\n const msg = err instanceof Error ? err.stack ?? err.message : String(err)\n process.stderr.write(`agentproto: ${msg}\\n`)\n process.exitCode = 1\n }\n)\n"]}