@agentproto/cli 0.1.0-alpha.0 → 0.1.0-alpha.1
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 +122 -26
- package/dist/cli.mjs.map +1 -1
- package/dist/index.d.ts +14 -10
- package/dist/index.mjs +103 -5
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -4
package/dist/cli.mjs
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { parseArgs } from 'util';
|
|
3
2
|
import { spawn } from 'child_process';
|
|
3
|
+
import { parseArgs } from 'util';
|
|
4
4
|
import { resolve } from 'path';
|
|
5
5
|
import { createAgentCliRuntime } from '@agentproto/driver-agent-cli';
|
|
6
|
+
import { userInfo, hostname } from 'os';
|
|
7
|
+
import { wrapWebSocket, createTunnelServer } from '@agentproto/acp/tunnel';
|
|
8
|
+
import WebSocket from 'ws';
|
|
6
9
|
|
|
7
10
|
/**
|
|
8
11
|
* @agentproto/cli v0.1.0-alpha
|
|
@@ -294,14 +297,109 @@ async function runServe(args) {
|
|
|
294
297
|
);
|
|
295
298
|
return 2;
|
|
296
299
|
}
|
|
300
|
+
const label = values.label ?? `${userInfo().username}@${hostname()}`;
|
|
301
|
+
const opts = {
|
|
302
|
+
connect: values.connect,
|
|
303
|
+
token: values.token ?? process.env.AGENTPROTO_TOKEN,
|
|
304
|
+
label
|
|
305
|
+
};
|
|
297
306
|
process.stderr.write(
|
|
298
|
-
`agentproto serve:
|
|
299
|
-
Tracking: tunnel frame protocol is landing in @agentproto/acp next.
|
|
300
|
-
Wanted endpoint: ${values.connect}
|
|
301
|
-
Label: ${values.label ?? "(none)"}
|
|
307
|
+
`agentproto serve: connecting to ${opts.connect} as '${opts.label}'\u2026
|
|
302
308
|
`
|
|
303
309
|
);
|
|
304
|
-
|
|
310
|
+
const aborter = new AbortController();
|
|
311
|
+
const onSignal = (sig) => {
|
|
312
|
+
process.stderr.write(`
|
|
313
|
+
agentproto serve: received ${sig}, shutting down.
|
|
314
|
+
`);
|
|
315
|
+
aborter.abort();
|
|
316
|
+
};
|
|
317
|
+
process.once("SIGINT", onSignal);
|
|
318
|
+
process.once("SIGTERM", onSignal);
|
|
319
|
+
let backoffMs = opts.reconnectMinMs ?? 1e3;
|
|
320
|
+
const backoffMax = opts.reconnectMaxMs ?? 3e4;
|
|
321
|
+
while (!aborter.signal.aborted) {
|
|
322
|
+
try {
|
|
323
|
+
await runOneTunnel(opts, aborter.signal);
|
|
324
|
+
backoffMs = opts.reconnectMinMs ?? 1e3;
|
|
325
|
+
} catch (err) {
|
|
326
|
+
if (aborter.signal.aborted) break;
|
|
327
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
328
|
+
process.stderr.write(
|
|
329
|
+
`agentproto serve: tunnel error: ${msg}
|
|
330
|
+
reconnecting in ${backoffMs}ms\u2026
|
|
331
|
+
`
|
|
332
|
+
);
|
|
333
|
+
await sleep(backoffMs, aborter.signal);
|
|
334
|
+
backoffMs = Math.min(backoffMs * 2, backoffMax);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
process.off("SIGINT", onSignal);
|
|
338
|
+
process.off("SIGTERM", onSignal);
|
|
339
|
+
return 0;
|
|
340
|
+
}
|
|
341
|
+
async function runOneTunnel(opts, signal) {
|
|
342
|
+
const headers = {
|
|
343
|
+
"user-agent": "agentproto/0.1.0-alpha"
|
|
344
|
+
};
|
|
345
|
+
if (opts.token) headers.authorization = `Bearer ${opts.token}`;
|
|
346
|
+
const ws = new WebSocket(opts.connect, { headers });
|
|
347
|
+
await new Promise((resolve, reject) => {
|
|
348
|
+
const onOpen = () => {
|
|
349
|
+
ws.off("error", onError);
|
|
350
|
+
resolve();
|
|
351
|
+
};
|
|
352
|
+
const onError = (err) => {
|
|
353
|
+
ws.off("open", onOpen);
|
|
354
|
+
reject(err);
|
|
355
|
+
};
|
|
356
|
+
ws.once("open", onOpen);
|
|
357
|
+
ws.once("error", onError);
|
|
358
|
+
if (signal.aborted) {
|
|
359
|
+
ws.close();
|
|
360
|
+
reject(new Error("Aborted before WS opened."));
|
|
361
|
+
}
|
|
362
|
+
signal.addEventListener("abort", () => {
|
|
363
|
+
ws.close();
|
|
364
|
+
reject(new Error("Aborted while WS connecting."));
|
|
365
|
+
});
|
|
366
|
+
});
|
|
367
|
+
process.stderr.write(`agentproto serve: tunnel up.
|
|
368
|
+
`);
|
|
369
|
+
const sink = wrapWebSocket(ws);
|
|
370
|
+
const server = createTunnelServer({
|
|
371
|
+
sink,
|
|
372
|
+
label: opts.label,
|
|
373
|
+
pty: false,
|
|
374
|
+
// v0 authorize hook: trust the bearer-authenticated host completely.
|
|
375
|
+
// Token possession proves the host was provisioned for this daemon.
|
|
376
|
+
// Per-spawn policy filtering will land alongside the policy.toml.
|
|
377
|
+
authorize: (req) => req
|
|
378
|
+
});
|
|
379
|
+
await new Promise((resolve) => {
|
|
380
|
+
const offClose = sink.onClose(() => {
|
|
381
|
+
offClose();
|
|
382
|
+
resolve();
|
|
383
|
+
});
|
|
384
|
+
if (signal.aborted) {
|
|
385
|
+
server.close().finally(() => resolve());
|
|
386
|
+
}
|
|
387
|
+
signal.addEventListener("abort", () => {
|
|
388
|
+
server.close().finally(() => resolve());
|
|
389
|
+
});
|
|
390
|
+
});
|
|
391
|
+
process.stderr.write(`agentproto serve: tunnel closed.
|
|
392
|
+
`);
|
|
393
|
+
}
|
|
394
|
+
function sleep(ms, signal) {
|
|
395
|
+
return new Promise((resolve) => {
|
|
396
|
+
if (signal.aborted) return resolve();
|
|
397
|
+
const timer = setTimeout(resolve, ms);
|
|
398
|
+
signal.addEventListener("abort", () => {
|
|
399
|
+
clearTimeout(timer);
|
|
400
|
+
resolve();
|
|
401
|
+
});
|
|
402
|
+
});
|
|
305
403
|
}
|
|
306
404
|
|
|
307
405
|
// src/cli.ts
|
|
@@ -319,29 +417,27 @@ Examples:
|
|
|
319
417
|
agentproto run claude-code --cwd . --prompt "summarise this repo"
|
|
320
418
|
agentproto serve --connect wss://guilde.work/api/v1/agentproto/tunnel --token $AGENTPROTO_TOKEN
|
|
321
419
|
`;
|
|
420
|
+
var VERBS = /* @__PURE__ */ new Set(["install", "run", "serve"]);
|
|
322
421
|
async function main(argv) {
|
|
323
|
-
const
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
help: { type: "boolean", short: "h" },
|
|
329
|
-
version: { type: "boolean", short: "v" }
|
|
422
|
+
const verbIdx = argv.findIndex((a) => VERBS.has(a));
|
|
423
|
+
if (verbIdx === -1) {
|
|
424
|
+
if (argv.includes("--version") || argv.includes("-v")) {
|
|
425
|
+
process.stdout.write("agentproto 0.1.0-alpha\n");
|
|
426
|
+
return 0;
|
|
330
427
|
}
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
if (!verb) {
|
|
342
|
-
process.stdout.write(USAGE);
|
|
343
|
-
return 0;
|
|
428
|
+
if (argv.includes("--help") || argv.includes("-h") || argv.length === 0) {
|
|
429
|
+
process.stdout.write(USAGE);
|
|
430
|
+
return 0;
|
|
431
|
+
}
|
|
432
|
+
process.stderr.write(
|
|
433
|
+
`agentproto: unrecognised argument(s): ${argv.join(" ")}
|
|
434
|
+
|
|
435
|
+
${USAGE}`
|
|
436
|
+
);
|
|
437
|
+
return 2;
|
|
344
438
|
}
|
|
439
|
+
const verb = argv[verbIdx];
|
|
440
|
+
const rest = argv.slice(verbIdx + 1);
|
|
345
441
|
switch (verb) {
|
|
346
442
|
case "install":
|
|
347
443
|
return runInstall(rest);
|
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 token, then accepts spawn / stdin / stdout /\n * stderr / kill / exit frames over that channel — multiplexing many\n * ACP sessions through one process. The daemon owns local resources\n * (PTYs, child processes, JSONL session stores) so a host running in\n * the cloud can drive a CLI living on the user's laptop.\n *\n * v0.1 stub: argument parsing + connection scaffolding only. The wire\n * protocol is still being designed (tunnel frames need to land in\n * @agentproto/acp first); shipping a half-baked daemon would lock us\n * into the wrong shape. For now this verb prints a clear \"not yet\"\n * and exits non-zero so CI pipelines don't accidentally rely on it.\n */\n\nimport { parseArgs } from \"node:util\"\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 process.stderr.write(\n \"agentproto serve: tunnel daemon is not yet implemented in this release.\\n\" +\n \" Tracking: tunnel frame protocol is landing in @agentproto/acp next.\\n\" +\n ` Wanted endpoint: ${values.connect}\\n` +\n ` Label: ${values.label ?? \"(none)\"}\\n`\n )\n return 64\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\nimport { parseArgs } from \"node:util\"\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\nasync function main(argv: readonly string[]): Promise<number> {\n const { values, positionals } = parseArgs({\n args: [...argv],\n allowPositionals: true,\n strict: false,\n options: {\n help: { type: \"boolean\", short: \"h\" },\n version: { type: \"boolean\", short: \"v\" },\n },\n })\n\n if (values.help) {\n process.stdout.write(USAGE)\n return 0\n }\n if (values.version) {\n process.stdout.write(\"agentproto 0.1.0-alpha\\n\")\n return 0\n }\n\n const [verb, ...rest] = positionals\n if (!verb) {\n process.stdout.write(USAGE)\n return 0\n }\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 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/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"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -33,17 +33,21 @@ declare function runRun(args: readonly string[]): Promise<number>;
|
|
|
33
33
|
* `agentproto serve --connect <url>`
|
|
34
34
|
*
|
|
35
35
|
* Long-running daemon. Opens a WebSocket to a host (Guilde-shaped API),
|
|
36
|
-
* authenticates with a token, then accepts
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
36
|
+
* authenticates with a bearer token, then accepts tunnel frames over
|
|
37
|
+
* that channel — multiplexing many child processes through one socket
|
|
38
|
+
* via `@agentproto/acp/tunnel`. The daemon owns local resources (PTYs,
|
|
39
|
+
* child processes, JSONL session stores) so a host running in the
|
|
40
|
+
* cloud can drive a CLI living on the user's laptop.
|
|
41
41
|
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
42
|
+
* Reconnect-with-backoff is built in: when the WS drops, every live
|
|
43
|
+
* child gets a SIGHUP-shaped exit and we wait an increasing interval
|
|
44
|
+
* before retrying. Hosts that want continuity should re-spawn after
|
|
45
|
+
* they observe the new tunnel come up.
|
|
46
|
+
*
|
|
47
|
+
* Authorization: v0 trusts every spawn frame the host sends — there
|
|
48
|
+
* is no policy file. Future work will gate spawn requests on a
|
|
49
|
+
* `~/.agentproto/policy.toml` allowlist (see project_agentproto_repos
|
|
50
|
+
* memory). The token is the only access control today.
|
|
47
51
|
*/
|
|
48
52
|
declare function runServe(args: readonly string[]): Promise<number>;
|
|
49
53
|
|
package/dist/index.mjs
CHANGED
|
@@ -2,6 +2,9 @@ import { spawn } from 'child_process';
|
|
|
2
2
|
import { parseArgs } from 'util';
|
|
3
3
|
import { resolve } from 'path';
|
|
4
4
|
import { createAgentCliRuntime } from '@agentproto/driver-agent-cli';
|
|
5
|
+
import { userInfo, hostname } from 'os';
|
|
6
|
+
import { wrapWebSocket, createTunnelServer } from '@agentproto/acp/tunnel';
|
|
7
|
+
import WebSocket from 'ws';
|
|
5
8
|
|
|
6
9
|
/**
|
|
7
10
|
* @agentproto/cli v0.1.0-alpha
|
|
@@ -293,14 +296,109 @@ async function runServe(args) {
|
|
|
293
296
|
);
|
|
294
297
|
return 2;
|
|
295
298
|
}
|
|
299
|
+
const label = values.label ?? `${userInfo().username}@${hostname()}`;
|
|
300
|
+
const opts = {
|
|
301
|
+
connect: values.connect,
|
|
302
|
+
token: values.token ?? process.env.AGENTPROTO_TOKEN,
|
|
303
|
+
label
|
|
304
|
+
};
|
|
296
305
|
process.stderr.write(
|
|
297
|
-
`agentproto serve:
|
|
298
|
-
Tracking: tunnel frame protocol is landing in @agentproto/acp next.
|
|
299
|
-
Wanted endpoint: ${values.connect}
|
|
300
|
-
Label: ${values.label ?? "(none)"}
|
|
306
|
+
`agentproto serve: connecting to ${opts.connect} as '${opts.label}'\u2026
|
|
301
307
|
`
|
|
302
308
|
);
|
|
303
|
-
|
|
309
|
+
const aborter = new AbortController();
|
|
310
|
+
const onSignal = (sig) => {
|
|
311
|
+
process.stderr.write(`
|
|
312
|
+
agentproto serve: received ${sig}, shutting down.
|
|
313
|
+
`);
|
|
314
|
+
aborter.abort();
|
|
315
|
+
};
|
|
316
|
+
process.once("SIGINT", onSignal);
|
|
317
|
+
process.once("SIGTERM", onSignal);
|
|
318
|
+
let backoffMs = opts.reconnectMinMs ?? 1e3;
|
|
319
|
+
const backoffMax = opts.reconnectMaxMs ?? 3e4;
|
|
320
|
+
while (!aborter.signal.aborted) {
|
|
321
|
+
try {
|
|
322
|
+
await runOneTunnel(opts, aborter.signal);
|
|
323
|
+
backoffMs = opts.reconnectMinMs ?? 1e3;
|
|
324
|
+
} catch (err) {
|
|
325
|
+
if (aborter.signal.aborted) break;
|
|
326
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
327
|
+
process.stderr.write(
|
|
328
|
+
`agentproto serve: tunnel error: ${msg}
|
|
329
|
+
reconnecting in ${backoffMs}ms\u2026
|
|
330
|
+
`
|
|
331
|
+
);
|
|
332
|
+
await sleep(backoffMs, aborter.signal);
|
|
333
|
+
backoffMs = Math.min(backoffMs * 2, backoffMax);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
process.off("SIGINT", onSignal);
|
|
337
|
+
process.off("SIGTERM", onSignal);
|
|
338
|
+
return 0;
|
|
339
|
+
}
|
|
340
|
+
async function runOneTunnel(opts, signal) {
|
|
341
|
+
const headers = {
|
|
342
|
+
"user-agent": "agentproto/0.1.0-alpha"
|
|
343
|
+
};
|
|
344
|
+
if (opts.token) headers.authorization = `Bearer ${opts.token}`;
|
|
345
|
+
const ws = new WebSocket(opts.connect, { headers });
|
|
346
|
+
await new Promise((resolve, reject) => {
|
|
347
|
+
const onOpen = () => {
|
|
348
|
+
ws.off("error", onError);
|
|
349
|
+
resolve();
|
|
350
|
+
};
|
|
351
|
+
const onError = (err) => {
|
|
352
|
+
ws.off("open", onOpen);
|
|
353
|
+
reject(err);
|
|
354
|
+
};
|
|
355
|
+
ws.once("open", onOpen);
|
|
356
|
+
ws.once("error", onError);
|
|
357
|
+
if (signal.aborted) {
|
|
358
|
+
ws.close();
|
|
359
|
+
reject(new Error("Aborted before WS opened."));
|
|
360
|
+
}
|
|
361
|
+
signal.addEventListener("abort", () => {
|
|
362
|
+
ws.close();
|
|
363
|
+
reject(new Error("Aborted while WS connecting."));
|
|
364
|
+
});
|
|
365
|
+
});
|
|
366
|
+
process.stderr.write(`agentproto serve: tunnel up.
|
|
367
|
+
`);
|
|
368
|
+
const sink = wrapWebSocket(ws);
|
|
369
|
+
const server = createTunnelServer({
|
|
370
|
+
sink,
|
|
371
|
+
label: opts.label,
|
|
372
|
+
pty: false,
|
|
373
|
+
// v0 authorize hook: trust the bearer-authenticated host completely.
|
|
374
|
+
// Token possession proves the host was provisioned for this daemon.
|
|
375
|
+
// Per-spawn policy filtering will land alongside the policy.toml.
|
|
376
|
+
authorize: (req) => req
|
|
377
|
+
});
|
|
378
|
+
await new Promise((resolve) => {
|
|
379
|
+
const offClose = sink.onClose(() => {
|
|
380
|
+
offClose();
|
|
381
|
+
resolve();
|
|
382
|
+
});
|
|
383
|
+
if (signal.aborted) {
|
|
384
|
+
server.close().finally(() => resolve());
|
|
385
|
+
}
|
|
386
|
+
signal.addEventListener("abort", () => {
|
|
387
|
+
server.close().finally(() => resolve());
|
|
388
|
+
});
|
|
389
|
+
});
|
|
390
|
+
process.stderr.write(`agentproto serve: tunnel closed.
|
|
391
|
+
`);
|
|
392
|
+
}
|
|
393
|
+
function sleep(ms, signal) {
|
|
394
|
+
return new Promise((resolve) => {
|
|
395
|
+
if (signal.aborted) return resolve();
|
|
396
|
+
const timer = setTimeout(resolve, ms);
|
|
397
|
+
signal.addEventListener("abort", () => {
|
|
398
|
+
clearTimeout(timer);
|
|
399
|
+
resolve();
|
|
400
|
+
});
|
|
401
|
+
});
|
|
304
402
|
}
|
|
305
403
|
|
|
306
404
|
export { resolveAdapter, runInstall, runRun, runServe };
|
package/dist/index.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"],"names":["parseArgs","resolvePath"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Resolve a slug like \"claude-code\" to a runnable `AgentCliHandle`.\n *\n * Resolution order:\n * 1. `@agentproto/adapter-<slug>` from npm (must default-export or\n * named-export an `AgentCliHandle` — convention is the camelCased\n * slug, e.g. `claudeCode`).\n * 2. (TODO) `~/.agentproto/adapters/<slug>/AGENT-CLI.md` on disk.\n * 3. (TODO) bundled fallbacks for the canonical adapters.\n *\n * Step 1 covers 100% of v0 usage. The on-disk path is only there for\n * users authoring their own adapters; we'll add it once `defineAgentCli`\n * supports MD-source authoring end to end.\n */\n\nimport 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 token, then accepts spawn / stdin / stdout /\n * stderr / kill / exit frames over that channel — multiplexing many\n * ACP sessions through one process. The daemon owns local resources\n * (PTYs, child processes, JSONL session stores) so a host running in\n * the cloud can drive a CLI living on the user's laptop.\n *\n * v0.1 stub: argument parsing + connection scaffolding only. The wire\n * protocol is still being designed (tunnel frames need to land in\n * @agentproto/acp first); shipping a half-baked daemon would lock us\n * into the wrong shape. For now this verb prints a clear \"not yet\"\n * and exits non-zero so CI pipelines don't accidentally rely on it.\n */\n\nimport { parseArgs } from \"node:util\"\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 process.stderr.write(\n \"agentproto serve: tunnel daemon is not yet implemented in this release.\\n\" +\n \" Tracking: tunnel frame protocol is landing in @agentproto/acp next.\\n\" +\n ` Wanted endpoint: ${values.connect}\\n` +\n ` Label: ${values.label ?? \"(none)\"}\\n`\n )\n return 64\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/registry/resolve.ts","../src/commands/install.ts","../src/util/stdin.ts","../src/commands/run.ts","../src/commands/serve.ts"],"names":["parseArgs","resolvePath"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Resolve a slug like \"claude-code\" to a runnable `AgentCliHandle`.\n *\n * Resolution order:\n * 1. `@agentproto/adapter-<slug>` from npm (must default-export or\n * named-export an `AgentCliHandle` — convention is the camelCased\n * slug, e.g. `claudeCode`).\n * 2. (TODO) `~/.agentproto/adapters/<slug>/AGENT-CLI.md` on disk.\n * 3. (TODO) bundled fallbacks for the canonical adapters.\n *\n * Step 1 covers 100% of v0 usage. The on-disk path is only there for\n * users authoring their own adapters; we'll add it once `defineAgentCli`\n * supports MD-source authoring end to end.\n */\n\nimport 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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentproto/cli",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.1",
|
|
4
4
|
"description": "@agentproto/cli — the `agentproto` binary. Install AIP-45 agent CLI adapters, run them locally, or expose them over a tunnel as a long-running daemon. Reference host for hermes / claude-code / opencode / gemini-cli / goose, all driven through @agentproto/driver-agent-cli.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agentproto",
|
|
@@ -43,16 +43,19 @@
|
|
|
43
43
|
"README.md"
|
|
44
44
|
],
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"
|
|
46
|
+
"ws": "^8.18.0",
|
|
47
|
+
"@agentproto/driver-agent-cli": "0.1.0-alpha.1",
|
|
48
|
+
"@agentproto/acp": "0.1.0-alpha.1"
|
|
47
49
|
},
|
|
48
50
|
"devDependencies": {
|
|
49
51
|
"@types/node": "^25.1.0",
|
|
52
|
+
"@types/ws": "^8.5.13",
|
|
50
53
|
"tsup": "^8.5.1",
|
|
51
54
|
"typescript": "^5.9.3",
|
|
52
55
|
"vitest": "^3.2.4",
|
|
53
|
-
"@agentproto/adapter-hermes": "0.1.0-alpha.0",
|
|
54
56
|
"@agentproto/adapter-claude-code": "0.1.0-alpha.0",
|
|
55
|
-
"@agentproto/tooling": "0.1.0-alpha.0"
|
|
57
|
+
"@agentproto/tooling": "0.1.0-alpha.0",
|
|
58
|
+
"@agentproto/adapter-hermes": "0.1.0-alpha.0"
|
|
56
59
|
},
|
|
57
60
|
"engines": {
|
|
58
61
|
"node": ">=20.9.0"
|