noumen 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/README.md +95 -16
  2. package/dist/a2a/index.d.ts +5 -5
  3. package/dist/a2a/index.js +3 -3
  4. package/dist/a2a/index.js.map +1 -1
  5. package/dist/acp/index.d.ts +5 -5
  6. package/dist/acp/index.js +4 -4
  7. package/dist/acp/index.js.map +1 -1
  8. package/dist/{agent-BrkbZyOT.d.ts → agent-1nFVUP9E.d.ts} +319 -15
  9. package/dist/{cache-DVqaCX8v.d.ts → cache-DsRqxx6v.d.ts} +1 -1
  10. package/dist/{chunk-BGG2E6JD.js → chunk-3HEYCV26.js} +1 -1
  11. package/dist/chunk-3SK5GCI6.js +75 -0
  12. package/dist/chunk-3SK5GCI6.js.map +1 -0
  13. package/dist/{chunk-NBDFQYUZ.js → chunk-4HW6LN6D.js} +4784 -2411
  14. package/dist/chunk-4HW6LN6D.js.map +1 -0
  15. package/dist/{chunk-7ZMN7XJE.js → chunk-5JN4SPI7.js} +6 -6
  16. package/dist/chunk-5JN4SPI7.js.map +1 -0
  17. package/dist/{chunk-CPFHEPW4.js → chunk-CS6WNDCF.js} +73 -41
  18. package/dist/chunk-CS6WNDCF.js.map +1 -0
  19. package/dist/chunk-EKOGVTBT.js +472 -0
  20. package/dist/chunk-EKOGVTBT.js.map +1 -0
  21. package/dist/{chunk-KY6ZPWHO.js → chunk-HEQQQGK5.js} +47 -28
  22. package/dist/chunk-HEQQQGK5.js.map +1 -0
  23. package/dist/{chunk-QTJ7VTJY.js → chunk-HL6JCRZJ.js} +1599 -481
  24. package/dist/chunk-HL6JCRZJ.js.map +1 -0
  25. package/dist/chunk-L3L3FG5T.js +16 -0
  26. package/dist/chunk-L3L3FG5T.js.map +1 -0
  27. package/dist/cli/index.js +36 -30
  28. package/dist/cli/index.js.map +1 -1
  29. package/dist/client/index.d.ts +2 -2
  30. package/dist/{headless-Q7XHHZIW.js → headless-FFU2DESQ.js} +3 -4
  31. package/dist/headless-FFU2DESQ.js.map +1 -0
  32. package/dist/index.d.ts +218 -68
  33. package/dist/index.js +37 -23
  34. package/dist/lsp/index.d.ts +4 -4
  35. package/dist/mcp/index.d.ts +5 -5
  36. package/dist/mcp/index.js +2 -1
  37. package/dist/mcp/index.js.map +1 -1
  38. package/dist/{provider-factory-34MSWJZ3.js → provider-factory-KCLIF34X.js} +2 -2
  39. package/dist/providers/anthropic.d.ts +2 -2
  40. package/dist/providers/anthropic.js +5 -3
  41. package/dist/providers/anthropic.js.map +1 -1
  42. package/dist/providers/bedrock.d.ts +2 -2
  43. package/dist/providers/bedrock.js +5 -3
  44. package/dist/providers/bedrock.js.map +1 -1
  45. package/dist/providers/gemini.d.ts +2 -1
  46. package/dist/providers/gemini.js +133 -95
  47. package/dist/providers/gemini.js.map +1 -1
  48. package/dist/providers/ollama.d.ts +13 -0
  49. package/dist/{ollama-YNXAYP3R.js → providers/ollama.js} +6 -4
  50. package/dist/providers/ollama.js.map +1 -0
  51. package/dist/providers/openai.d.ts +4 -1
  52. package/dist/providers/openai.js +2 -1
  53. package/dist/providers/openrouter.d.ts +1 -1
  54. package/dist/providers/openrouter.js +2 -1
  55. package/dist/providers/openrouter.js.map +1 -1
  56. package/dist/providers/vertex.d.ts +4 -2
  57. package/dist/providers/vertex.js +6 -3
  58. package/dist/providers/vertex.js.map +1 -1
  59. package/dist/{resolve-XM52G7YE.js → resolve-4JA2BBDA.js} +2 -2
  60. package/dist/server/index.d.ts +35 -20
  61. package/dist/server/index.js +276 -207
  62. package/dist/server/index.js.map +1 -1
  63. package/dist/{server-Cg1yWGaV.d.ts → server-CHMxuWKq.d.ts} +1 -1
  64. package/dist/{types-DwdzmXfs.d.ts → types-CD0rUKKT.d.ts} +2 -0
  65. package/dist/{types-3c88cRKH.d.ts → types-LrU4LRmX.d.ts} +28 -0
  66. package/dist/{types-CwKKucOF.d.ts → types-RPKUTu1k.d.ts} +27 -2
  67. package/dist/uuid-RVN2T26F.js +8 -0
  68. package/dist/uuid-RVN2T26F.js.map +1 -0
  69. package/dist/zod-7YXKWYMC.js +12 -0
  70. package/dist/zod-7YXKWYMC.js.map +1 -0
  71. package/package.json +22 -13
  72. package/dist/chunk-2ZTGQLYK.js +0 -356
  73. package/dist/chunk-2ZTGQLYK.js.map +0 -1
  74. package/dist/chunk-7ZMN7XJE.js.map +0 -1
  75. package/dist/chunk-CPFHEPW4.js.map +0 -1
  76. package/dist/chunk-KY6ZPWHO.js.map +0 -1
  77. package/dist/chunk-NBDFQYUZ.js.map +0 -1
  78. package/dist/chunk-QTJ7VTJY.js.map +0 -1
  79. package/dist/headless-Q7XHHZIW.js.map +0 -1
  80. package/dist/ollama-YNXAYP3R.js.map +0 -1
  81. /package/dist/{chunk-BGG2E6JD.js.map → chunk-3HEYCV26.js.map} +0 -0
  82. /package/dist/{provider-factory-34MSWJZ3.js.map → provider-factory-KCLIF34X.js.map} +0 -0
  83. /package/dist/{resolve-XM52G7YE.js.map → resolve-4JA2BBDA.js.map} +0 -0
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # noumen 🐍
2
2
 
3
- The coding agent you `npm install`.
3
+ The agent runtime you `npm install`.
4
4
 
5
- `noumen` gives you the full agentic coding loop — tool execution, file editing, shell commands, context compaction, and session management — with sandboxed virtual infrastructure that isolates your agent from the host machine.
5
+ `noumen` gives you the full agentic loop — tool execution, file editing, shell commands, context compaction, and session management — with sandboxed virtual infrastructure that isolates your agent from the host machine. Built for coding agents. Ready for any agent that uses a computer.
6
6
 
7
7
  Any provider. Any sandbox. One package.
8
8
 
@@ -35,7 +35,7 @@ for await (const event of agent.run("Add a health-check endpoint to server.ts"))
35
35
  }
36
36
  ```
37
37
 
38
- Three lines to a working coding agent. The string provider auto-detects your `ANTHROPIC_API_KEY` from the environment, and `cwd` defaults to a local sandbox.
38
+ Three lines to a working agent. The string provider auto-detects your `ANTHROPIC_API_KEY` from the environment, and `cwd` defaults to a local sandbox.
39
39
 
40
40
  ### Execute (run to completion)
41
41
 
@@ -412,11 +412,19 @@ const sandbox = UnsandboxedLocal({ cwd: "/my/project" });
412
412
 
413
413
  ### sprites.dev — full sandbox
414
414
 
415
- Run inside a remote [sprites.dev](https://docs.sprites.dev) container. The agent has no access to the host machine:
415
+ Run inside a remote [sprites.dev](https://docs.sprites.dev) container. The agent has no access to the host machine.
416
+
417
+ **Auto-create** — omit `spriteName` and the sprite is provisioned on first use. The sandbox ID is persisted so sessions can reconnect on resume. `Agent.close()` tears the sprite down automatically:
416
418
 
417
419
  ```typescript
418
420
  import { SpritesSandbox } from "noumen";
419
421
 
422
+ const sandbox = SpritesSandbox({ token: process.env.SPRITE_TOKEN });
423
+ ```
424
+
425
+ **Explicit** — pass `spriteName` to attach to a pre-existing sprite. The caller owns the sprite's lifecycle:
426
+
427
+ ```typescript
420
428
  const sandbox = SpritesSandbox({
421
429
  token: process.env.SPRITE_TOKEN,
422
430
  spriteName: "my-sprite",
@@ -431,6 +439,20 @@ Run the agent inside a Docker container. Requires `dockerode` as an optional pee
431
439
  pnpm add dockerode
432
440
  ```
433
441
 
442
+ **Auto-create** — pass `image` instead of `container` and the container is created and started on first use. `Agent.close()` stops and removes it:
443
+
444
+ ```typescript
445
+ import { DockerSandbox } from "noumen";
446
+
447
+ const sandbox = DockerSandbox({ image: "node:22", cwd: "/workspace" });
448
+ const agent = new Agent({ provider, sandbox });
449
+
450
+ // Container auto-created on first thread. Cleaned up by:
451
+ await agent.close();
452
+ ```
453
+
454
+ **Explicit** — pass a pre-existing dockerode `Container`. The caller owns its lifecycle:
455
+
434
456
  ```typescript
435
457
  import Docker from "dockerode";
436
458
  import { DockerSandbox } from "noumen";
@@ -443,21 +465,13 @@ const container = await docker.createContainer({
443
465
  });
444
466
  await container.start();
445
467
 
446
- const sandbox = DockerSandbox({
447
- container,
448
- cwd: "/workspace",
449
- });
450
-
451
- // Use the sandbox normally — all commands/files run inside the container
468
+ const sandbox = DockerSandbox({ container, cwd: "/workspace" });
452
469
  const agent = new Agent({ provider, sandbox });
453
470
 
454
- // Clean up when done
455
471
  await container.stop();
456
472
  await container.remove();
457
473
  ```
458
474
 
459
- You are responsible for container lifecycle (create, start, stop, remove). The sandbox just wraps the running container.
460
-
461
475
  ### E2B — cloud sandbox
462
476
 
463
477
  Run the agent inside an [E2B](https://e2b.dev) cloud sandbox. Requires `e2b` as an optional peer dependency:
@@ -466,6 +480,19 @@ Run the agent inside an [E2B](https://e2b.dev) cloud sandbox. Requires `e2b` as
466
480
  pnpm add e2b
467
481
  ```
468
482
 
483
+ **Auto-create** — omit `sandbox` and the E2B sandbox is provisioned on first use via the `e2b` SDK. `Agent.close()` kills it:
484
+
485
+ ```typescript
486
+ import { E2BSandbox } from "noumen";
487
+
488
+ const sandbox = E2BSandbox({ template: "base" });
489
+ const agent = new Agent({ provider, sandbox });
490
+
491
+ await agent.close(); // kills the E2B sandbox
492
+ ```
493
+
494
+ **Explicit** — pass a pre-existing `Sandbox` instance. The caller owns its lifecycle:
495
+
469
496
  ```typescript
470
497
  import { Sandbox as E2BSandboxSDK } from "e2b";
471
498
  import { E2BSandbox } from "noumen";
@@ -479,11 +506,59 @@ const sandbox = E2BSandbox({
479
506
 
480
507
  const agent = new Agent({ provider, sandbox });
481
508
 
482
- // Clean up when done
483
509
  await e2b.close();
484
510
  ```
485
511
 
486
- You are responsible for sandbox lifecycle (create, close). The adapter maps `VirtualFs` and `VirtualComputer` to E2B's `files` and `commands` APIs.
512
+ ### Freestyle cloud VMs
513
+
514
+ Run the agent inside a [Freestyle](https://freestyle.sh) VM. Full Linux VMs with sub-second startup, instant pause/resume, and optional forking. Requires `freestyle-sandboxes` as an optional peer dependency:
515
+
516
+ ```bash
517
+ pnpm add freestyle-sandboxes
518
+ ```
519
+
520
+ **Auto-create** — omit `vm` and a Freestyle VM is provisioned on first use. `Agent.close()` **suspends** (not deletes) the VM so it can resume instantly later:
521
+
522
+ ```typescript
523
+ import { FreestyleSandbox } from "noumen";
524
+
525
+ const sandbox = FreestyleSandbox({ cwd: "/workspace" });
526
+ const agent = new Agent({ provider, sandbox });
527
+
528
+ await agent.close(); // suspends the VM (preserves full memory state)
529
+ ```
530
+
531
+ **From a snapshot** — start from a cached environment:
532
+
533
+ ```typescript
534
+ const sandbox = FreestyleSandbox({
535
+ snapshotId: "abc123",
536
+ cwd: "/workspace",
537
+ });
538
+ ```
539
+
540
+ **Explicit** — pass a pre-existing VM instance. The caller owns its lifecycle:
541
+
542
+ ```typescript
543
+ import { freestyle } from "freestyle-sandboxes";
544
+ import { FreestyleSandbox } from "noumen";
545
+
546
+ const { vm } = await freestyle.vms.create({ workdir: "/workspace" });
547
+
548
+ const sandbox = FreestyleSandbox({ vm, cwd: "/workspace" });
549
+ const agent = new Agent({ provider, sandbox });
550
+ ```
551
+
552
+ ### Sandbox auto-creation lifecycle
553
+
554
+ All four remote backends (Sprites, Docker, E2B, Freestyle) support on-demand provisioning. When you omit the container/instance and let the factory auto-create:
555
+
556
+ 1. **First `createThread()`** calls `sandbox.init()` which provisions the resource
557
+ 2. The sandbox ID is persisted locally (`.noumen/sessions/.sandbox-index.json`) so `resumeThread()` can reconnect to the same resource
558
+ 3. **`Agent.close()`** calls `sandbox.dispose()` which tears down auto-created resources
559
+ 4. Resources created by the user (explicit IDs) are never torn down by `dispose()`
560
+
561
+ `init()` is idempotent — multiple `createThread()` calls reuse the same provisioned resource.
487
562
 
488
563
  ### Custom sandboxes
489
564
 
@@ -495,10 +570,14 @@ import type { Sandbox } from "noumen";
495
570
  const sandbox: Sandbox = {
496
571
  fs: new MyCustomFs(),
497
572
  computer: new MyCustomComputer(),
573
+ // Optional lazy provisioning:
574
+ init: async (reconnectId) => { /* create or reconnect */ },
575
+ sandboxId: () => "my-resource-id",
576
+ dispose: async () => { /* tear down */ },
498
577
  };
499
578
  ```
500
579
 
501
- The interfaces are intentionally minimal (one method for shell, eight for filesystem) so adapters are straightforward to write.
580
+ The interfaces are intentionally minimal (one method for shell, eight for filesystem) so adapters are straightforward to write. The optional `init()`, `sandboxId()`, and `dispose()` methods enable auto-creation and session-aware lifecycle management.
502
581
 
503
582
  ## Options
504
583
 
@@ -1,10 +1,10 @@
1
- import { A as Agent } from '../agent-BrkbZyOT.js';
1
+ import { A as Agent } from '../agent-1nFVUP9E.js';
2
2
  import { A as AgentSkill, a as AgentCard, T as TaskSendParams, b as Task, c as TaskStreamEvent } from '../types-NIyVwQ4h.js';
3
3
  export { d as A2A_METHODS, e as Artifact, D as DataPart, F as FilePart, M as Message, P as Part, f as TaskState, g as TaskStatus, h as TextPart } from '../types-NIyVwQ4h.js';
4
- import '../types-3c88cRKH.js';
5
- import '../types-CwKKucOF.js';
6
- import '../types-DwdzmXfs.js';
7
- import '../cache-DVqaCX8v.js';
4
+ import '../types-LrU4LRmX.js';
5
+ import '../types-RPKUTu1k.js';
6
+ import '../types-CD0rUKKT.js';
7
+ import '../cache-DsRqxx6v.js';
8
8
  import '../types-2kTLUCnD.js';
9
9
  import '@modelcontextprotocol/sdk/client/index.js';
10
10
  import '@modelcontextprotocol/sdk/client/auth.js';
package/dist/a2a/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  generateUUID
3
- } from "../chunk-BGG2E6JD.js";
3
+ } from "../chunk-3HEYCV26.js";
4
4
  import {
5
5
  INTERNAL_ERROR,
6
6
  INVALID_PARAMS,
@@ -41,7 +41,7 @@ var TaskManager = class {
41
41
  */
42
42
  async sendTask(params) {
43
43
  const taskId = params.id ?? generateUUID();
44
- const thread = this.code.createThread({
44
+ const thread = await this.code.createThread({
45
45
  sessionId: params.sessionId
46
46
  });
47
47
  const task = {
@@ -62,7 +62,7 @@ var TaskManager = class {
62
62
  */
63
63
  async *sendTaskSubscribe(params) {
64
64
  const taskId = params.id ?? generateUUID();
65
- const thread = this.code.createThread({
65
+ const thread = await this.code.createThread({
66
66
  sessionId: params.sessionId
67
67
  });
68
68
  const task = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/a2a/server.ts","../../src/a2a/types.ts","../../src/a2a/task-manager.ts","../../src/a2a/agent-card.ts","../../src/a2a/client.ts","../../src/a2a/index.ts"],"sourcesContent":["/**\n * A2A HTTP server implementing the Agent2Agent protocol endpoints.\n *\n * Endpoints:\n * GET /.well-known/agent.json -> Agent Card\n * POST / -> JSON-RPC dispatch\n */\n\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport type { Agent } from \"../agent.js\";\nimport type { AgentCard } from \"./types.js\";\nimport { A2A_METHODS, type TaskSendParams, type TaskStreamEvent } from \"./types.js\";\nimport { TaskManager } from \"./task-manager.js\";\nimport { buildAgentCard, type AgentCardOptions } from \"./agent-card.js\";\nimport {\n formatResponse,\n formatError,\n parseMessage,\n isRequest,\n METHOD_NOT_FOUND,\n INVALID_PARAMS,\n INTERNAL_ERROR,\n PARSE_ERROR,\n type JsonRpcRequest,\n} from \"../jsonrpc/index.js\";\n\nexport interface A2AServerOptions extends AgentCardOptions {\n /** Port to listen on (default: 3000) */\n port?: number;\n /** CORS origin header (default: \"*\") */\n cors?: string | false;\n}\n\nexport class A2AServer {\n private httpServer: ReturnType<typeof createServer> | null = null;\n private taskManager: TaskManager;\n private agentCard: AgentCard;\n private options: A2AServerOptions;\n\n constructor(code: Agent, options: A2AServerOptions) {\n this.taskManager = new TaskManager(code);\n this.agentCard = buildAgentCard(options);\n this.options = options;\n }\n\n async start(): Promise<void> {\n const port = this.options.port ?? 3000;\n\n this.httpServer = createServer((req, res) => {\n this.handleRequest(req, res).catch((err) => {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: err.message }));\n });\n });\n\n return new Promise<void>((resolve) => {\n this.httpServer!.listen(port, () => resolve());\n });\n }\n\n async stop(): Promise<void> {\n return new Promise<void>((resolve) => {\n if (this.httpServer) {\n this.httpServer.close(() => resolve());\n } else {\n resolve();\n }\n });\n }\n\n private async handleRequest(\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n // CORS\n if (this.options.cors !== false) {\n res.setHeader(\"Access-Control-Allow-Origin\", this.options.cors ?? \"*\");\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET, POST, OPTIONS\");\n res.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type, Authorization\");\n }\n\n if (req.method === \"OPTIONS\") {\n res.writeHead(204);\n res.end();\n return;\n }\n\n const url = new URL(req.url ?? \"/\", `http://${req.headers.host ?? \"localhost\"}`);\n\n // Agent Card discovery\n if (url.pathname === \"/.well-known/agent.json\" && req.method === \"GET\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(this.agentCard));\n return;\n }\n\n // JSON-RPC endpoint\n if (url.pathname === \"/\" && req.method === \"POST\") {\n const body = await readBody(req);\n let msg;\n try {\n msg = parseMessage(body);\n } catch {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(formatError(null, PARSE_ERROR, \"Invalid JSON\")));\n return;\n }\n\n if (!isRequest(msg)) {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(formatError(null, PARSE_ERROR, \"Expected JSON-RPC request\")));\n return;\n }\n\n const request = msg as JsonRpcRequest;\n\n // Check if this is a streaming request\n if (request.method === A2A_METHODS.TASKS_SEND_SUBSCRIBE) {\n await this.handleStreamingRequest(request, res);\n return;\n }\n\n try {\n const result = await this.dispatch(request);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(formatResponse(request.id, result)));\n } catch (err) {\n const code = (err as { code?: number }).code ?? INTERNAL_ERROR;\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify(\n formatError(\n request.id,\n code,\n err instanceof Error ? err.message : String(err),\n ),\n ),\n );\n }\n return;\n }\n\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Not found\" }));\n }\n\n private async dispatch(request: JsonRpcRequest): Promise<unknown> {\n switch (request.method) {\n case A2A_METHODS.TASKS_SEND: {\n const params = request.params as TaskSendParams;\n if (!params?.message) {\n throw Object.assign(new Error(\"Missing message\"), {\n code: INVALID_PARAMS,\n });\n }\n return this.taskManager.sendTask(params);\n }\n\n case A2A_METHODS.TASKS_GET: {\n const params = request.params as { id: string };\n const task = this.taskManager.getTask(params.id);\n if (!task) {\n throw Object.assign(new Error(`Task not found: ${params.id}`), {\n code: INVALID_PARAMS,\n });\n }\n return task;\n }\n\n case A2A_METHODS.TASKS_CANCEL: {\n const params = request.params as { id: string };\n const canceled = this.taskManager.cancelTask(params.id);\n if (!canceled) {\n throw Object.assign(new Error(`Task not found: ${params.id}`), {\n code: INVALID_PARAMS,\n });\n }\n return { ok: true };\n }\n\n default:\n throw Object.assign(\n new Error(`Unknown method: ${request.method}`),\n { code: METHOD_NOT_FOUND },\n );\n }\n }\n\n private async handleStreamingRequest(\n request: JsonRpcRequest,\n res: ServerResponse,\n ): Promise<void> {\n const params = request.params as TaskSendParams;\n if (!params?.message) {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify(\n formatError(request.id, INVALID_PARAMS, \"Missing message\"),\n ),\n );\n return;\n }\n\n // SSE response\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n\n try {\n for await (const event of this.taskManager.sendTaskSubscribe(params)) {\n const data = JSON.stringify({\n jsonrpc: \"2.0\",\n id: request.id,\n result: event,\n });\n res.write(`data: ${data}\\n\\n`);\n }\n } catch (err) {\n const errorData = JSON.stringify(\n formatError(\n request.id,\n INTERNAL_ERROR,\n err instanceof Error ? err.message : String(err),\n ),\n );\n res.write(`data: ${errorData}\\n\\n`);\n }\n\n res.end();\n }\n}\n\nfunction readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf-8\")));\n req.on(\"error\", reject);\n });\n}\n","/**\n * Agent2Agent (A2A) protocol types per the Google A2A specification.\n * https://google.github.io/A2A/specification/\n */\n\n// ── Agent Card ──────────────────────────────────────────────────────────────\n\nexport interface AgentCard {\n name: string;\n description?: string;\n url: string;\n provider?: {\n organization: string;\n url?: string;\n };\n version: string;\n capabilities?: {\n streaming?: boolean;\n pushNotifications?: boolean;\n stateTransitionHistory?: boolean;\n };\n authentication?: {\n schemes: string[];\n credentials?: string;\n };\n defaultInputModes?: string[];\n defaultOutputModes?: string[];\n skills?: AgentSkill[];\n}\n\nexport interface AgentSkill {\n id: string;\n name: string;\n description?: string;\n tags?: string[];\n examples?: string[];\n inputModes?: string[];\n outputModes?: string[];\n}\n\n// ── Task lifecycle ──────────────────────────────────────────────────────────\n\nexport type TaskStatus =\n | \"submitted\"\n | \"working\"\n | \"input-required\"\n | \"completed\"\n | \"failed\"\n | \"canceled\";\n\nexport interface Task {\n id: string;\n sessionId?: string;\n status: TaskState;\n history?: Message[];\n artifacts?: Artifact[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface TaskState {\n state: TaskStatus;\n message?: Message;\n timestamp?: string;\n}\n\n// ── Messages and parts ──────────────────────────────────────────────────────\n\nexport interface Message {\n role: \"user\" | \"agent\";\n parts: Part[];\n metadata?: Record<string, unknown>;\n}\n\nexport type Part = TextPart | FilePart | DataPart;\n\nexport interface TextPart {\n type: \"text\";\n text: string;\n}\n\nexport interface FilePart {\n type: \"file\";\n file: {\n name?: string;\n mimeType?: string;\n bytes?: string; // base64\n uri?: string;\n };\n}\n\nexport interface DataPart {\n type: \"data\";\n data: Record<string, unknown>;\n}\n\nexport interface Artifact {\n name?: string;\n description?: string;\n parts: Part[];\n index?: number;\n append?: boolean;\n lastChunk?: boolean;\n metadata?: Record<string, unknown>;\n}\n\n// ── JSON-RPC method params ──────────────────────────────────────────────────\n\nexport interface TaskSendParams {\n id?: string;\n sessionId?: string;\n message: Message;\n metadata?: Record<string, unknown>;\n}\n\nexport interface TaskGetParams {\n id: string;\n}\n\nexport interface TaskCancelParams {\n id: string;\n}\n\n// ── SSE streaming ───────────────────────────────────────────────────────────\n\nexport interface TaskStatusUpdateEvent {\n type: \"status\";\n taskId: string;\n status: TaskState;\n final: boolean;\n}\n\nexport interface TaskArtifactUpdateEvent {\n type: \"artifact\";\n taskId: string;\n artifact: Artifact;\n}\n\nexport type TaskStreamEvent = TaskStatusUpdateEvent | TaskArtifactUpdateEvent;\n\n// ── A2A method constants ────────────────────────────────────────────────────\n\nexport const A2A_METHODS = {\n TASKS_SEND: \"tasks/send\",\n TASKS_SEND_SUBSCRIBE: \"tasks/sendSubscribe\",\n TASKS_GET: \"tasks/get\",\n TASKS_CANCEL: \"tasks/cancel\",\n TASKS_PUSH_NOTIFICATION: \"tasks/pushNotification\",\n TASKS_RESUBSCRIBE: \"tasks/resubscribe\",\n} as const;\n","/**\n * A2A Task Manager: maps A2A task lifecycle to noumen sessions/threads.\n */\n\nimport type { Agent } from \"../agent.js\";\nimport type { Thread } from \"../thread.js\";\nimport type { StreamEvent } from \"../session/types.js\";\nimport { contentToString } from \"../utils/content.js\";\nimport { generateUUID } from \"../utils/uuid.js\";\nimport type {\n Task,\n TaskState,\n TaskStatus,\n Message,\n Part,\n TextPart,\n Artifact,\n TaskStreamEvent,\n TaskSendParams,\n} from \"./types.js\";\n\ninterface ManagedTask {\n task: Task;\n thread: Thread;\n abortController: AbortController;\n}\n\nexport class TaskManager {\n private tasks = new Map<string, ManagedTask>();\n private code: Agent;\n\n constructor(code: Agent) {\n this.code = code;\n }\n\n /**\n * Create a task, start running it, and return the task immediately.\n * Use `getTask` to poll status or `streamTask` for SSE.\n */\n async sendTask(params: TaskSendParams): Promise<Task> {\n const taskId = params.id ?? generateUUID();\n\n const thread = this.code.createThread({\n sessionId: params.sessionId,\n });\n\n const task: Task = {\n id: taskId,\n sessionId: thread.sessionId,\n status: { state: \"submitted\", timestamp: new Date().toISOString() },\n history: [params.message],\n artifacts: [],\n };\n\n const abortController = new AbortController();\n this.tasks.set(taskId, { task, thread, abortController });\n\n const prompt = this.messageToPrompt(params.message);\n this.runTask(taskId, prompt);\n\n return task;\n }\n\n /**\n * Stream task events as an async generator (for SSE).\n */\n async *sendTaskSubscribe(\n params: TaskSendParams,\n ): AsyncGenerator<TaskStreamEvent> {\n const taskId = params.id ?? generateUUID();\n\n const thread = this.code.createThread({\n sessionId: params.sessionId,\n });\n\n const task: Task = {\n id: taskId,\n sessionId: thread.sessionId,\n status: { state: \"submitted\", timestamp: new Date().toISOString() },\n history: [params.message],\n artifacts: [],\n };\n\n const abortController = new AbortController();\n this.tasks.set(taskId, { task, thread, abortController });\n\n yield {\n type: \"status\",\n taskId,\n status: task.status,\n final: false,\n };\n\n task.status = { state: \"working\", timestamp: new Date().toISOString() };\n yield {\n type: \"status\",\n taskId,\n status: task.status,\n final: false,\n };\n\n const prompt = this.messageToPrompt(params.message);\n const textParts: string[] = [];\n\n try {\n for await (const event of thread.run(prompt, {\n signal: abortController.signal,\n })) {\n const streamEvent = this.mapStreamEvent(taskId, task, event, textParts);\n if (streamEvent) yield streamEvent;\n }\n\n // Finalize\n if (textParts.length > 0) {\n const artifact: Artifact = {\n name: \"response\",\n parts: [{ type: \"text\", text: textParts.join(\"\") }],\n lastChunk: true,\n };\n task.artifacts = [artifact];\n yield { type: \"artifact\", taskId, artifact };\n }\n\n task.status = { state: \"completed\", timestamp: new Date().toISOString() };\n yield { type: \"status\", taskId, status: task.status, final: true };\n } catch (err) {\n task.status = {\n state: \"failed\",\n timestamp: new Date().toISOString(),\n message: {\n role: \"agent\",\n parts: [\n {\n type: \"text\",\n text: err instanceof Error ? err.message : String(err),\n },\n ],\n },\n };\n yield { type: \"status\", taskId, status: task.status, final: true };\n }\n }\n\n getTask(taskId: string): Task | null {\n return this.tasks.get(taskId)?.task ?? null;\n }\n\n cancelTask(taskId: string): boolean {\n const managed = this.tasks.get(taskId);\n if (!managed) return false;\n\n managed.abortController.abort();\n managed.task.status = {\n state: \"canceled\",\n timestamp: new Date().toISOString(),\n };\n return true;\n }\n\n private async runTask(taskId: string, prompt: string): Promise<void> {\n const managed = this.tasks.get(taskId);\n if (!managed) return;\n\n managed.task.status = {\n state: \"working\",\n timestamp: new Date().toISOString(),\n };\n\n try {\n const textParts: string[] = [];\n for await (const event of managed.thread.run(prompt, {\n signal: managed.abortController.signal,\n })) {\n if (event.type === \"text_delta\") {\n textParts.push(event.text);\n }\n if (event.type === \"user_input_request\") {\n managed.task.status = {\n state: \"input-required\",\n timestamp: new Date().toISOString(),\n };\n }\n }\n\n if (textParts.length > 0) {\n managed.task.artifacts = [\n {\n name: \"response\",\n parts: [{ type: \"text\", text: textParts.join(\"\") }],\n lastChunk: true,\n },\n ];\n }\n\n managed.task.status = {\n state: \"completed\",\n timestamp: new Date().toISOString(),\n };\n } catch (err) {\n managed.task.status = {\n state: \"failed\",\n timestamp: new Date().toISOString(),\n message: {\n role: \"agent\",\n parts: [\n {\n type: \"text\",\n text: err instanceof Error ? err.message : String(err),\n },\n ],\n },\n };\n }\n }\n\n private mapStreamEvent(\n taskId: string,\n task: Task,\n event: StreamEvent,\n textParts: string[],\n ): TaskStreamEvent | null {\n switch (event.type) {\n case \"text_delta\":\n textParts.push(event.text);\n return null; // Text accumulates into artifact at end\n\n case \"user_input_request\":\n task.status = {\n state: \"input-required\",\n timestamp: new Date().toISOString(),\n };\n return {\n type: \"status\",\n taskId,\n status: task.status,\n final: false,\n };\n\n case \"error\":\n task.status = {\n state: \"failed\",\n timestamp: new Date().toISOString(),\n message: {\n role: \"agent\",\n parts: [{ type: \"text\", text: event.error.message }],\n },\n };\n return {\n type: \"status\",\n taskId,\n status: task.status,\n final: true,\n };\n\n default:\n return null;\n }\n }\n\n private messageToPrompt(message: Message): string {\n return message.parts\n .filter((p): p is TextPart => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\\n\");\n }\n}\n","/**\n * Build an A2A Agent Card from a noumen Code instance configuration.\n */\n\nimport type { AgentCard, AgentSkill } from \"./types.js\";\n\nexport interface AgentCardOptions {\n name: string;\n description?: string;\n url: string;\n version?: string;\n provider?: {\n organization: string;\n url?: string;\n };\n skills?: AgentSkill[];\n authentication?: {\n schemes: string[];\n credentials?: string;\n };\n streaming?: boolean;\n}\n\nexport function buildAgentCard(options: AgentCardOptions): AgentCard {\n return {\n name: options.name,\n description: options.description ?? \"A noumen-powered AI coding agent\",\n url: options.url,\n version: options.version ?? \"0.1.0\",\n provider: options.provider,\n capabilities: {\n streaming: options.streaming ?? true,\n pushNotifications: false,\n stateTransitionHistory: true,\n },\n authentication: options.authentication,\n defaultInputModes: [\"text\"],\n defaultOutputModes: [\"text\"],\n skills: options.skills ?? [\n {\n id: \"coding\",\n name: \"Code Generation & Editing\",\n description: \"Read, write, and edit code files with full tool access\",\n tags: [\"coding\", \"files\", \"shell\"],\n },\n ],\n };\n}\n","/**\n * A2A client for calling remote A2A agents.\n *\n * Enables noumen agents to discover and delegate work to other A2A agents.\n */\n\nimport type {\n AgentCard,\n Task,\n Message,\n TaskSendParams,\n TaskStreamEvent,\n} from \"./types.js\";\nimport { A2A_METHODS } from \"./types.js\";\nimport { formatRequest, type JsonRpcResponse } from \"../jsonrpc/index.js\";\n\nexport interface A2AClientOptions {\n /** Override headers for all requests. */\n headers?: Record<string, string>;\n /** Bearer token for authentication. */\n token?: string;\n}\n\nexport class A2AClient {\n private agentUrl: string;\n private headers: Record<string, string>;\n\n constructor(agentUrl: string, options?: A2AClientOptions) {\n this.agentUrl = agentUrl.replace(/\\/+$/, \"\");\n this.headers = {\n \"Content-Type\": \"application/json\",\n ...(options?.token ? { Authorization: `Bearer ${options.token}` } : {}),\n ...(options?.headers ?? {}),\n };\n }\n\n /**\n * Discover the remote agent's capabilities via its Agent Card.\n */\n async getAgentCard(): Promise<AgentCard> {\n const res = await fetch(\n `${this.agentUrl}/.well-known/agent.json`,\n { headers: this.headers },\n );\n if (!res.ok) {\n throw new Error(`Failed to fetch agent card: ${res.status}`);\n }\n return res.json() as Promise<AgentCard>;\n }\n\n /**\n * Send a task to the remote agent (non-streaming).\n */\n async sendTask(params: TaskSendParams): Promise<Task> {\n const rpc = formatRequest(1, A2A_METHODS.TASKS_SEND, params);\n const res = await fetch(this.agentUrl, {\n method: \"POST\",\n headers: this.headers,\n body: JSON.stringify(rpc),\n });\n const response = (await res.json()) as JsonRpcResponse;\n if (\"error\" in response) {\n throw new Error(response.error.message);\n }\n return response.result as Task;\n }\n\n /**\n * Send a task and subscribe to streaming updates via SSE.\n */\n async *sendTaskSubscribe(\n params: TaskSendParams,\n ): AsyncGenerator<TaskStreamEvent> {\n const rpc = formatRequest(1, A2A_METHODS.TASKS_SEND_SUBSCRIBE, params);\n const res = await fetch(this.agentUrl, {\n method: \"POST\",\n headers: this.headers,\n body: JSON.stringify(rpc),\n });\n\n if (!res.ok) {\n throw new Error(`A2A streaming request failed: ${res.status}`);\n }\n\n const reader = res.body?.getReader();\n if (!reader) throw new Error(\"No response body\");\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (!data) continue;\n try {\n const parsed = JSON.parse(data) as JsonRpcResponse;\n if (\"result\" in parsed) {\n yield parsed.result as TaskStreamEvent;\n }\n } catch {\n // Skip malformed SSE data\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Get the current state of a task.\n */\n async getTask(taskId: string): Promise<Task> {\n const rpc = formatRequest(1, A2A_METHODS.TASKS_GET, { id: taskId });\n const res = await fetch(this.agentUrl, {\n method: \"POST\",\n headers: this.headers,\n body: JSON.stringify(rpc),\n });\n const response = (await res.json()) as JsonRpcResponse;\n if (\"error\" in response) {\n throw new Error(response.error.message);\n }\n return response.result as Task;\n }\n\n /**\n * Cancel a running task.\n */\n async cancelTask(taskId: string): Promise<void> {\n const rpc = formatRequest(1, A2A_METHODS.TASKS_CANCEL, { id: taskId });\n const res = await fetch(this.agentUrl, {\n method: \"POST\",\n headers: this.headers,\n body: JSON.stringify(rpc),\n });\n const response = (await res.json()) as JsonRpcResponse;\n if (\"error\" in response) {\n throw new Error(response.error.message);\n }\n }\n\n /**\n * Helper: send a simple text message and return the task.\n */\n async ask(text: string, sessionId?: string): Promise<Task> {\n return this.sendTask({\n sessionId,\n message: {\n role: \"user\",\n parts: [{ type: \"text\", text }],\n },\n });\n }\n}\n","/**\n * A2A (Agent2Agent) protocol adapter for noumen.\n *\n * Server usage:\n * import { createA2AServer } from \"noumen/a2a\";\n * const server = createA2AServer(code, { name: \"MyAgent\", url: \"https://...\" });\n * await server.start();\n *\n * Client usage:\n * import { A2AClient } from \"noumen/a2a\";\n * const client = new A2AClient(\"https://remote-agent.example.com\");\n * const card = await client.getAgentCard();\n * const task = await client.ask(\"Fix the bug in auth.ts\");\n */\n\nexport { A2AServer, type A2AServerOptions } from \"./server.js\";\nexport { A2AClient, type A2AClientOptions } from \"./client.js\";\nexport { TaskManager } from \"./task-manager.js\";\nexport { buildAgentCard, type AgentCardOptions } from \"./agent-card.js\";\nexport {\n type AgentCard,\n type AgentSkill,\n type Task,\n type TaskState,\n type TaskStatus,\n type Message,\n type Part,\n type TextPart,\n type FilePart,\n type DataPart,\n type Artifact,\n type TaskSendParams,\n type TaskStreamEvent,\n A2A_METHODS,\n} from \"./types.js\";\n\nimport type { Agent } from \"../agent.js\";\nimport { A2AServer, type A2AServerOptions } from \"./server.js\";\n\n/**\n * Create an A2A server that exposes an Agent instance via the Agent2Agent protocol.\n */\nexport function createA2AServer(\n code: Agent,\n options: A2AServerOptions,\n): A2AServer {\n return new A2AServer(code, options);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAQA,SAAS,oBAA+D;;;ACqIjE,IAAM,cAAc;AAAA,EACzB,YAAY;AAAA,EACZ,sBAAsB;AAAA,EACtB,WAAW;AAAA,EACX,cAAc;AAAA,EACd,yBAAyB;AAAA,EACzB,mBAAmB;AACrB;;;ACzHO,IAAM,cAAN,MAAkB;AAAA,EACf,QAAQ,oBAAI,IAAyB;AAAA,EACrC;AAAA,EAER,YAAY,MAAa;AACvB,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAS,QAAuC;AACpD,UAAM,SAAS,OAAO,MAAM,aAAa;AAEzC,UAAM,SAAS,KAAK,KAAK,aAAa;AAAA,MACpC,WAAW,OAAO;AAAA,IACpB,CAAC;AAED,UAAM,OAAa;AAAA,MACjB,IAAI;AAAA,MACJ,WAAW,OAAO;AAAA,MAClB,QAAQ,EAAE,OAAO,aAAa,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE;AAAA,MAClE,SAAS,CAAC,OAAO,OAAO;AAAA,MACxB,WAAW,CAAC;AAAA,IACd;AAEA,UAAM,kBAAkB,IAAI,gBAAgB;AAC5C,SAAK,MAAM,IAAI,QAAQ,EAAE,MAAM,QAAQ,gBAAgB,CAAC;AAExD,UAAM,SAAS,KAAK,gBAAgB,OAAO,OAAO;AAClD,SAAK,QAAQ,QAAQ,MAAM;AAE3B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,kBACL,QACiC;AACjC,UAAM,SAAS,OAAO,MAAM,aAAa;AAEzC,UAAM,SAAS,KAAK,KAAK,aAAa;AAAA,MACpC,WAAW,OAAO;AAAA,IACpB,CAAC;AAED,UAAM,OAAa;AAAA,MACjB,IAAI;AAAA,MACJ,WAAW,OAAO;AAAA,MAClB,QAAQ,EAAE,OAAO,aAAa,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE;AAAA,MAClE,SAAS,CAAC,OAAO,OAAO;AAAA,MACxB,WAAW,CAAC;AAAA,IACd;AAEA,UAAM,kBAAkB,IAAI,gBAAgB;AAC5C,SAAK,MAAM,IAAI,QAAQ,EAAE,MAAM,QAAQ,gBAAgB,CAAC;AAExD,UAAM;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA,QAAQ,KAAK;AAAA,MACb,OAAO;AAAA,IACT;AAEA,SAAK,SAAS,EAAE,OAAO,WAAW,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE;AACtE,UAAM;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA,QAAQ,KAAK;AAAA,MACb,OAAO;AAAA,IACT;AAEA,UAAM,SAAS,KAAK,gBAAgB,OAAO,OAAO;AAClD,UAAM,YAAsB,CAAC;AAE7B,QAAI;AACF,uBAAiB,SAAS,OAAO,IAAI,QAAQ;AAAA,QAC3C,QAAQ,gBAAgB;AAAA,MAC1B,CAAC,GAAG;AACF,cAAM,cAAc,KAAK,eAAe,QAAQ,MAAM,OAAO,SAAS;AACtE,YAAI,YAAa,OAAM;AAAA,MACzB;AAGA,UAAI,UAAU,SAAS,GAAG;AACxB,cAAM,WAAqB;AAAA,UACzB,MAAM;AAAA,UACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAU,KAAK,EAAE,EAAE,CAAC;AAAA,UAClD,WAAW;AAAA,QACb;AACA,aAAK,YAAY,CAAC,QAAQ;AAC1B,cAAM,EAAE,MAAM,YAAY,QAAQ,SAAS;AAAA,MAC7C;AAEA,WAAK,SAAS,EAAE,OAAO,aAAa,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE;AACxE,YAAM,EAAE,MAAM,UAAU,QAAQ,QAAQ,KAAK,QAAQ,OAAO,KAAK;AAAA,IACnE,SAAS,KAAK;AACZ,WAAK,SAAS;AAAA,QACZ,OAAO;AAAA,QACP,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,SAAS;AAAA,UACP,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,cACE,MAAM;AAAA,cACN,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,YACvD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,YAAM,EAAE,MAAM,UAAU,QAAQ,QAAQ,KAAK,QAAQ,OAAO,KAAK;AAAA,IACnE;AAAA,EACF;AAAA,EAEA,QAAQ,QAA6B;AACnC,WAAO,KAAK,MAAM,IAAI,MAAM,GAAG,QAAQ;AAAA,EACzC;AAAA,EAEA,WAAW,QAAyB;AAClC,UAAM,UAAU,KAAK,MAAM,IAAI,MAAM;AACrC,QAAI,CAAC,QAAS,QAAO;AAErB,YAAQ,gBAAgB,MAAM;AAC9B,YAAQ,KAAK,SAAS;AAAA,MACpB,OAAO;AAAA,MACP,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,QAAQ,QAAgB,QAA+B;AACnE,UAAM,UAAU,KAAK,MAAM,IAAI,MAAM;AACrC,QAAI,CAAC,QAAS;AAEd,YAAQ,KAAK,SAAS;AAAA,MACpB,OAAO;AAAA,MACP,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AAEA,QAAI;AACF,YAAM,YAAsB,CAAC;AAC7B,uBAAiB,SAAS,QAAQ,OAAO,IAAI,QAAQ;AAAA,QACnD,QAAQ,QAAQ,gBAAgB;AAAA,MAClC,CAAC,GAAG;AACF,YAAI,MAAM,SAAS,cAAc;AAC/B,oBAAU,KAAK,MAAM,IAAI;AAAA,QAC3B;AACA,YAAI,MAAM,SAAS,sBAAsB;AACvC,kBAAQ,KAAK,SAAS;AAAA,YACpB,OAAO;AAAA,YACP,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpC;AAAA,QACF;AAAA,MACF;AAEA,UAAI,UAAU,SAAS,GAAG;AACxB,gBAAQ,KAAK,YAAY;AAAA,UACvB;AAAA,YACE,MAAM;AAAA,YACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAU,KAAK,EAAE,EAAE,CAAC;AAAA,YAClD,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAEA,cAAQ,KAAK,SAAS;AAAA,QACpB,OAAO;AAAA,QACP,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,KAAK,SAAS;AAAA,QACpB,OAAO;AAAA,QACP,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,SAAS;AAAA,UACP,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,cACE,MAAM;AAAA,cACN,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,YACvD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,eACN,QACA,MACA,OACA,WACwB;AACxB,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,kBAAU,KAAK,MAAM,IAAI;AACzB,eAAO;AAAA;AAAA,MAET,KAAK;AACH,aAAK,SAAS;AAAA,UACZ,OAAO;AAAA,UACP,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC;AACA,eAAO;AAAA,UACL,MAAM;AAAA,UACN;AAAA,UACA,QAAQ,KAAK;AAAA,UACb,OAAO;AAAA,QACT;AAAA,MAEF,KAAK;AACH,aAAK,SAAS;AAAA,UACZ,OAAO;AAAA,UACP,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UAClC,SAAS;AAAA,YACP,MAAM;AAAA,YACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,MAAM,MAAM,QAAQ,CAAC;AAAA,UACrD;AAAA,QACF;AACA,eAAO;AAAA,UACL,MAAM;AAAA,UACN;AAAA,UACA,QAAQ,KAAK;AAAA,UACb,OAAO;AAAA,QACT;AAAA,MAEF;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,gBAAgB,SAA0B;AAChD,WAAO,QAAQ,MACZ,OAAO,CAAC,MAAqB,EAAE,SAAS,MAAM,EAC9C,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,IAAI;AAAA,EACd;AACF;;;AClPO,SAAS,eAAe,SAAsC;AACnE,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd,aAAa,QAAQ,eAAe;AAAA,IACpC,KAAK,QAAQ;AAAA,IACb,SAAS,QAAQ,WAAW;AAAA,IAC5B,UAAU,QAAQ;AAAA,IAClB,cAAc;AAAA,MACZ,WAAW,QAAQ,aAAa;AAAA,MAChC,mBAAmB;AAAA,MACnB,wBAAwB;AAAA,IAC1B;AAAA,IACA,gBAAgB,QAAQ;AAAA,IACxB,mBAAmB,CAAC,MAAM;AAAA,IAC1B,oBAAoB,CAAC,MAAM;AAAA,IAC3B,QAAQ,QAAQ,UAAU;AAAA,MACxB;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM,CAAC,UAAU,SAAS,OAAO;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AACF;;;AHdO,IAAM,YAAN,MAAgB;AAAA,EACb,aAAqD;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,MAAa,SAA2B;AAClD,SAAK,cAAc,IAAI,YAAY,IAAI;AACvC,SAAK,YAAY,eAAe,OAAO;AACvC,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,OAAO,KAAK,QAAQ,QAAQ;AAElC,SAAK,aAAa,aAAa,CAAC,KAAK,QAAQ;AAC3C,WAAK,cAAc,KAAK,GAAG,EAAE,MAAM,CAAC,QAAQ;AAC1C,YAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,YAAI,IAAI,KAAK,UAAU,EAAE,OAAO,IAAI,QAAQ,CAAC,CAAC;AAAA,MAChD,CAAC;AAAA,IACH,CAAC;AAED,WAAO,IAAI,QAAc,CAAC,YAAY;AACpC,WAAK,WAAY,OAAO,MAAM,MAAM,QAAQ,CAAC;AAAA,IAC/C,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAsB;AAC1B,WAAO,IAAI,QAAc,CAAC,YAAY;AACpC,UAAI,KAAK,YAAY;AACnB,aAAK,WAAW,MAAM,MAAM,QAAQ,CAAC;AAAA,MACvC,OAAO;AACL,gBAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,cACZ,KACA,KACe;AAEf,QAAI,KAAK,QAAQ,SAAS,OAAO;AAC/B,UAAI,UAAU,+BAA+B,KAAK,QAAQ,QAAQ,GAAG;AACrE,UAAI,UAAU,gCAAgC,oBAAoB;AAClE,UAAI,UAAU,gCAAgC,6BAA6B;AAAA,IAC7E;AAEA,QAAI,IAAI,WAAW,WAAW;AAC5B,UAAI,UAAU,GAAG;AACjB,UAAI,IAAI;AACR;AAAA,IACF;AAEA,UAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,UAAU,IAAI,QAAQ,QAAQ,WAAW,EAAE;AAG/E,QAAI,IAAI,aAAa,6BAA6B,IAAI,WAAW,OAAO;AACtE,UAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,UAAI,IAAI,KAAK,UAAU,KAAK,SAAS,CAAC;AACtC;AAAA,IACF;AAGA,QAAI,IAAI,aAAa,OAAO,IAAI,WAAW,QAAQ;AACjD,YAAM,OAAO,MAAM,SAAS,GAAG;AAC/B,UAAI;AACJ,UAAI;AACF,cAAM,aAAa,IAAI;AAAA,MACzB,QAAQ;AACN,YAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,YAAI,IAAI,KAAK,UAAU,YAAY,MAAM,aAAa,cAAc,CAAC,CAAC;AACtE;AAAA,MACF;AAEA,UAAI,CAAC,UAAU,GAAG,GAAG;AACnB,YAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,YAAI,IAAI,KAAK,UAAU,YAAY,MAAM,aAAa,2BAA2B,CAAC,CAAC;AACnF;AAAA,MACF;AAEA,YAAM,UAAU;AAGhB,UAAI,QAAQ,WAAW,YAAY,sBAAsB;AACvD,cAAM,KAAK,uBAAuB,SAAS,GAAG;AAC9C;AAAA,MACF;AAEA,UAAI;AACF,cAAM,SAAS,MAAM,KAAK,SAAS,OAAO;AAC1C,YAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,YAAI,IAAI,KAAK,UAAU,eAAe,QAAQ,IAAI,MAAM,CAAC,CAAC;AAAA,MAC5D,SAAS,KAAK;AACZ,cAAM,OAAQ,IAA0B,QAAQ;AAChD,YAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,YAAI;AAAA,UACF,KAAK;AAAA,YACH;AAAA,cACE,QAAQ;AAAA,cACR;AAAA,cACA,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,YACjD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,QAAI,IAAI,KAAK,UAAU,EAAE,OAAO,YAAY,CAAC,CAAC;AAAA,EAChD;AAAA,EAEA,MAAc,SAAS,SAA2C;AAChE,YAAQ,QAAQ,QAAQ;AAAA,MACtB,KAAK,YAAY,YAAY;AAC3B,cAAM,SAAS,QAAQ;AACvB,YAAI,CAAC,QAAQ,SAAS;AACpB,gBAAM,OAAO,OAAO,IAAI,MAAM,iBAAiB,GAAG;AAAA,YAChD,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AACA,eAAO,KAAK,YAAY,SAAS,MAAM;AAAA,MACzC;AAAA,MAEA,KAAK,YAAY,WAAW;AAC1B,cAAM,SAAS,QAAQ;AACvB,cAAM,OAAO,KAAK,YAAY,QAAQ,OAAO,EAAE;AAC/C,YAAI,CAAC,MAAM;AACT,gBAAM,OAAO,OAAO,IAAI,MAAM,mBAAmB,OAAO,EAAE,EAAE,GAAG;AAAA,YAC7D,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AACA,eAAO;AAAA,MACT;AAAA,MAEA,KAAK,YAAY,cAAc;AAC7B,cAAM,SAAS,QAAQ;AACvB,cAAM,WAAW,KAAK,YAAY,WAAW,OAAO,EAAE;AACtD,YAAI,CAAC,UAAU;AACb,gBAAM,OAAO,OAAO,IAAI,MAAM,mBAAmB,OAAO,EAAE,EAAE,GAAG;AAAA,YAC7D,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AACA,eAAO,EAAE,IAAI,KAAK;AAAA,MACpB;AAAA,MAEA;AACE,cAAM,OAAO;AAAA,UACX,IAAI,MAAM,mBAAmB,QAAQ,MAAM,EAAE;AAAA,UAC7C,EAAE,MAAM,iBAAiB;AAAA,QAC3B;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,MAAc,uBACZ,SACA,KACe;AACf,UAAM,SAAS,QAAQ;AACvB,QAAI,CAAC,QAAQ,SAAS;AACpB,UAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,UAAI;AAAA,QACF,KAAK;AAAA,UACH,YAAY,QAAQ,IAAI,gBAAgB,iBAAiB;AAAA,QAC3D;AAAA,MACF;AACA;AAAA,IACF;AAGA,QAAI,UAAU,KAAK;AAAA,MACjB,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,YAAY;AAAA,IACd,CAAC;AAED,QAAI;AACF,uBAAiB,SAAS,KAAK,YAAY,kBAAkB,MAAM,GAAG;AACpE,cAAM,OAAO,KAAK,UAAU;AAAA,UAC1B,SAAS;AAAA,UACT,IAAI,QAAQ;AAAA,UACZ,QAAQ;AAAA,QACV,CAAC;AACD,YAAI,MAAM,SAAS,IAAI;AAAA;AAAA,CAAM;AAAA,MAC/B;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,YAAY,KAAK;AAAA,QACrB;AAAA,UACE,QAAQ;AAAA,UACR;AAAA,UACA,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACjD;AAAA,MACF;AACA,UAAI,MAAM,SAAS,SAAS;AAAA;AAAA,CAAM;AAAA,IACpC;AAEA,QAAI,IAAI;AAAA,EACV;AACF;AAEA,SAAS,SAAS,KAAuC;AACvD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,SAAmB,CAAC;AAC1B,QAAI,GAAG,QAAQ,CAAC,UAAkB,OAAO,KAAK,KAAK,CAAC;AACpD,QAAI,GAAG,OAAO,MAAM,QAAQ,OAAO,OAAO,MAAM,EAAE,SAAS,OAAO,CAAC,CAAC;AACpE,QAAI,GAAG,SAAS,MAAM;AAAA,EACxB,CAAC;AACH;;;AI1NO,IAAM,YAAN,MAAgB;AAAA,EACb;AAAA,EACA;AAAA,EAER,YAAY,UAAkB,SAA4B;AACxD,SAAK,WAAW,SAAS,QAAQ,QAAQ,EAAE;AAC3C,SAAK,UAAU;AAAA,MACb,gBAAgB;AAAA,MAChB,GAAI,SAAS,QAAQ,EAAE,eAAe,UAAU,QAAQ,KAAK,GAAG,IAAI,CAAC;AAAA,MACrE,GAAI,SAAS,WAAW,CAAC;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAmC;AACvC,UAAM,MAAM,MAAM;AAAA,MAChB,GAAG,KAAK,QAAQ;AAAA,MAChB,EAAE,SAAS,KAAK,QAAQ;AAAA,IAC1B;AACA,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI,MAAM,+BAA+B,IAAI,MAAM,EAAE;AAAA,IAC7D;AACA,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,QAAuC;AACpD,UAAM,MAAM,cAAc,GAAG,YAAY,YAAY,MAAM;AAC3D,UAAM,MAAM,MAAM,MAAM,KAAK,UAAU;AAAA,MACrC,QAAQ;AAAA,MACR,SAAS,KAAK;AAAA,MACd,MAAM,KAAK,UAAU,GAAG;AAAA,IAC1B,CAAC;AACD,UAAM,WAAY,MAAM,IAAI,KAAK;AACjC,QAAI,WAAW,UAAU;AACvB,YAAM,IAAI,MAAM,SAAS,MAAM,OAAO;AAAA,IACxC;AACA,WAAO,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,kBACL,QACiC;AACjC,UAAM,MAAM,cAAc,GAAG,YAAY,sBAAsB,MAAM;AACrE,UAAM,MAAM,MAAM,MAAM,KAAK,UAAU;AAAA,MACrC,QAAQ;AAAA,MACR,SAAS,KAAK;AAAA,MACd,MAAM,KAAK,UAAU,GAAG;AAAA,IAC1B,CAAC;AAED,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI,MAAM,iCAAiC,IAAI,MAAM,EAAE;AAAA,IAC/D;AAEA,UAAM,SAAS,IAAI,MAAM,UAAU;AACnC,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,kBAAkB;AAE/C,UAAM,UAAU,IAAI,YAAY;AAChC,QAAI,SAAS;AAEb,QAAI;AACF,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,YAAI,KAAM;AAEV,kBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,cAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,iBAAS,MAAM,IAAI,KAAK;AAExB,mBAAW,QAAQ,OAAO;AACxB,cAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,kBAAM,OAAO,KAAK,MAAM,CAAC,EAAE,KAAK;AAChC,gBAAI,CAAC,KAAM;AACX,gBAAI;AACF,oBAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,kBAAI,YAAY,QAAQ;AACtB,sBAAM,OAAO;AAAA,cACf;AAAA,YACF,QAAQ;AAAA,YAER;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,UAAE;AACA,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,QAA+B;AAC3C,UAAM,MAAM,cAAc,GAAG,YAAY,WAAW,EAAE,IAAI,OAAO,CAAC;AAClE,UAAM,MAAM,MAAM,MAAM,KAAK,UAAU;AAAA,MACrC,QAAQ;AAAA,MACR,SAAS,KAAK;AAAA,MACd,MAAM,KAAK,UAAU,GAAG;AAAA,IAC1B,CAAC;AACD,UAAM,WAAY,MAAM,IAAI,KAAK;AACjC,QAAI,WAAW,UAAU;AACvB,YAAM,IAAI,MAAM,SAAS,MAAM,OAAO;AAAA,IACxC;AACA,WAAO,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,QAA+B;AAC9C,UAAM,MAAM,cAAc,GAAG,YAAY,cAAc,EAAE,IAAI,OAAO,CAAC;AACrE,UAAM,MAAM,MAAM,MAAM,KAAK,UAAU;AAAA,MACrC,QAAQ;AAAA,MACR,SAAS,KAAK;AAAA,MACd,MAAM,KAAK,UAAU,GAAG;AAAA,IAC1B,CAAC;AACD,UAAM,WAAY,MAAM,IAAI,KAAK;AACjC,QAAI,WAAW,UAAU;AACvB,YAAM,IAAI,MAAM,SAAS,MAAM,OAAO;AAAA,IACxC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,MAAc,WAAmC;AACzD,WAAO,KAAK,SAAS;AAAA,MACnB;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,QACN,OAAO,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC;AAAA,MAChC;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AC1HO,SAAS,gBACd,MACA,SACW;AACX,SAAO,IAAI,UAAU,MAAM,OAAO;AACpC;","names":[]}
1
+ {"version":3,"sources":["../../src/a2a/server.ts","../../src/a2a/types.ts","../../src/a2a/task-manager.ts","../../src/a2a/agent-card.ts","../../src/a2a/client.ts","../../src/a2a/index.ts"],"sourcesContent":["/**\n * A2A HTTP server implementing the Agent2Agent protocol endpoints.\n *\n * Endpoints:\n * GET /.well-known/agent.json -> Agent Card\n * POST / -> JSON-RPC dispatch\n */\n\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport type { Agent } from \"../agent.js\";\nimport type { AgentCard } from \"./types.js\";\nimport { A2A_METHODS, type TaskSendParams, type TaskStreamEvent } from \"./types.js\";\nimport { TaskManager } from \"./task-manager.js\";\nimport { buildAgentCard, type AgentCardOptions } from \"./agent-card.js\";\nimport {\n formatResponse,\n formatError,\n parseMessage,\n isRequest,\n METHOD_NOT_FOUND,\n INVALID_PARAMS,\n INTERNAL_ERROR,\n PARSE_ERROR,\n type JsonRpcRequest,\n} from \"../jsonrpc/index.js\";\n\nexport interface A2AServerOptions extends AgentCardOptions {\n /** Port to listen on (default: 3000) */\n port?: number;\n /** CORS origin header (default: \"*\") */\n cors?: string | false;\n}\n\nexport class A2AServer {\n private httpServer: ReturnType<typeof createServer> | null = null;\n private taskManager: TaskManager;\n private agentCard: AgentCard;\n private options: A2AServerOptions;\n\n constructor(code: Agent, options: A2AServerOptions) {\n this.taskManager = new TaskManager(code);\n this.agentCard = buildAgentCard(options);\n this.options = options;\n }\n\n async start(): Promise<void> {\n const port = this.options.port ?? 3000;\n\n this.httpServer = createServer((req, res) => {\n this.handleRequest(req, res).catch((err) => {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: err.message }));\n });\n });\n\n return new Promise<void>((resolve) => {\n this.httpServer!.listen(port, () => resolve());\n });\n }\n\n async stop(): Promise<void> {\n return new Promise<void>((resolve) => {\n if (this.httpServer) {\n this.httpServer.close(() => resolve());\n } else {\n resolve();\n }\n });\n }\n\n private async handleRequest(\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n // CORS\n if (this.options.cors !== false) {\n res.setHeader(\"Access-Control-Allow-Origin\", this.options.cors ?? \"*\");\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET, POST, OPTIONS\");\n res.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type, Authorization\");\n }\n\n if (req.method === \"OPTIONS\") {\n res.writeHead(204);\n res.end();\n return;\n }\n\n const url = new URL(req.url ?? \"/\", `http://${req.headers.host ?? \"localhost\"}`);\n\n // Agent Card discovery\n if (url.pathname === \"/.well-known/agent.json\" && req.method === \"GET\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(this.agentCard));\n return;\n }\n\n // JSON-RPC endpoint\n if (url.pathname === \"/\" && req.method === \"POST\") {\n const body = await readBody(req);\n let msg;\n try {\n msg = parseMessage(body);\n } catch {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(formatError(null, PARSE_ERROR, \"Invalid JSON\")));\n return;\n }\n\n if (!isRequest(msg)) {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(formatError(null, PARSE_ERROR, \"Expected JSON-RPC request\")));\n return;\n }\n\n const request = msg as JsonRpcRequest;\n\n // Check if this is a streaming request\n if (request.method === A2A_METHODS.TASKS_SEND_SUBSCRIBE) {\n await this.handleStreamingRequest(request, res);\n return;\n }\n\n try {\n const result = await this.dispatch(request);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(formatResponse(request.id, result)));\n } catch (err) {\n const code = (err as { code?: number }).code ?? INTERNAL_ERROR;\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify(\n formatError(\n request.id,\n code,\n err instanceof Error ? err.message : String(err),\n ),\n ),\n );\n }\n return;\n }\n\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Not found\" }));\n }\n\n private async dispatch(request: JsonRpcRequest): Promise<unknown> {\n switch (request.method) {\n case A2A_METHODS.TASKS_SEND: {\n const params = request.params as TaskSendParams;\n if (!params?.message) {\n throw Object.assign(new Error(\"Missing message\"), {\n code: INVALID_PARAMS,\n });\n }\n return this.taskManager.sendTask(params);\n }\n\n case A2A_METHODS.TASKS_GET: {\n const params = request.params as { id: string };\n const task = this.taskManager.getTask(params.id);\n if (!task) {\n throw Object.assign(new Error(`Task not found: ${params.id}`), {\n code: INVALID_PARAMS,\n });\n }\n return task;\n }\n\n case A2A_METHODS.TASKS_CANCEL: {\n const params = request.params as { id: string };\n const canceled = this.taskManager.cancelTask(params.id);\n if (!canceled) {\n throw Object.assign(new Error(`Task not found: ${params.id}`), {\n code: INVALID_PARAMS,\n });\n }\n return { ok: true };\n }\n\n default:\n throw Object.assign(\n new Error(`Unknown method: ${request.method}`),\n { code: METHOD_NOT_FOUND },\n );\n }\n }\n\n private async handleStreamingRequest(\n request: JsonRpcRequest,\n res: ServerResponse,\n ): Promise<void> {\n const params = request.params as TaskSendParams;\n if (!params?.message) {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify(\n formatError(request.id, INVALID_PARAMS, \"Missing message\"),\n ),\n );\n return;\n }\n\n // SSE response\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n\n try {\n for await (const event of this.taskManager.sendTaskSubscribe(params)) {\n const data = JSON.stringify({\n jsonrpc: \"2.0\",\n id: request.id,\n result: event,\n });\n res.write(`data: ${data}\\n\\n`);\n }\n } catch (err) {\n const errorData = JSON.stringify(\n formatError(\n request.id,\n INTERNAL_ERROR,\n err instanceof Error ? err.message : String(err),\n ),\n );\n res.write(`data: ${errorData}\\n\\n`);\n }\n\n res.end();\n }\n}\n\nfunction readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf-8\")));\n req.on(\"error\", reject);\n });\n}\n","/**\n * Agent2Agent (A2A) protocol types per the Google A2A specification.\n * https://google.github.io/A2A/specification/\n */\n\n// ── Agent Card ──────────────────────────────────────────────────────────────\n\nexport interface AgentCard {\n name: string;\n description?: string;\n url: string;\n provider?: {\n organization: string;\n url?: string;\n };\n version: string;\n capabilities?: {\n streaming?: boolean;\n pushNotifications?: boolean;\n stateTransitionHistory?: boolean;\n };\n authentication?: {\n schemes: string[];\n credentials?: string;\n };\n defaultInputModes?: string[];\n defaultOutputModes?: string[];\n skills?: AgentSkill[];\n}\n\nexport interface AgentSkill {\n id: string;\n name: string;\n description?: string;\n tags?: string[];\n examples?: string[];\n inputModes?: string[];\n outputModes?: string[];\n}\n\n// ── Task lifecycle ──────────────────────────────────────────────────────────\n\nexport type TaskStatus =\n | \"submitted\"\n | \"working\"\n | \"input-required\"\n | \"completed\"\n | \"failed\"\n | \"canceled\";\n\nexport interface Task {\n id: string;\n sessionId?: string;\n status: TaskState;\n history?: Message[];\n artifacts?: Artifact[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface TaskState {\n state: TaskStatus;\n message?: Message;\n timestamp?: string;\n}\n\n// ── Messages and parts ──────────────────────────────────────────────────────\n\nexport interface Message {\n role: \"user\" | \"agent\";\n parts: Part[];\n metadata?: Record<string, unknown>;\n}\n\nexport type Part = TextPart | FilePart | DataPart;\n\nexport interface TextPart {\n type: \"text\";\n text: string;\n}\n\nexport interface FilePart {\n type: \"file\";\n file: {\n name?: string;\n mimeType?: string;\n bytes?: string; // base64\n uri?: string;\n };\n}\n\nexport interface DataPart {\n type: \"data\";\n data: Record<string, unknown>;\n}\n\nexport interface Artifact {\n name?: string;\n description?: string;\n parts: Part[];\n index?: number;\n append?: boolean;\n lastChunk?: boolean;\n metadata?: Record<string, unknown>;\n}\n\n// ── JSON-RPC method params ──────────────────────────────────────────────────\n\nexport interface TaskSendParams {\n id?: string;\n sessionId?: string;\n message: Message;\n metadata?: Record<string, unknown>;\n}\n\nexport interface TaskGetParams {\n id: string;\n}\n\nexport interface TaskCancelParams {\n id: string;\n}\n\n// ── SSE streaming ───────────────────────────────────────────────────────────\n\nexport interface TaskStatusUpdateEvent {\n type: \"status\";\n taskId: string;\n status: TaskState;\n final: boolean;\n}\n\nexport interface TaskArtifactUpdateEvent {\n type: \"artifact\";\n taskId: string;\n artifact: Artifact;\n}\n\nexport type TaskStreamEvent = TaskStatusUpdateEvent | TaskArtifactUpdateEvent;\n\n// ── A2A method constants ────────────────────────────────────────────────────\n\nexport const A2A_METHODS = {\n TASKS_SEND: \"tasks/send\",\n TASKS_SEND_SUBSCRIBE: \"tasks/sendSubscribe\",\n TASKS_GET: \"tasks/get\",\n TASKS_CANCEL: \"tasks/cancel\",\n TASKS_PUSH_NOTIFICATION: \"tasks/pushNotification\",\n TASKS_RESUBSCRIBE: \"tasks/resubscribe\",\n} as const;\n","/**\n * A2A Task Manager: maps A2A task lifecycle to noumen sessions/threads.\n */\n\nimport type { Agent } from \"../agent.js\";\nimport type { Thread } from \"../thread.js\";\nimport type { StreamEvent } from \"../session/types.js\";\nimport { contentToString } from \"../utils/content.js\";\nimport { generateUUID } from \"../utils/uuid.js\";\nimport type {\n Task,\n TaskState,\n TaskStatus,\n Message,\n Part,\n TextPart,\n Artifact,\n TaskStreamEvent,\n TaskSendParams,\n} from \"./types.js\";\n\ninterface ManagedTask {\n task: Task;\n thread: Thread;\n abortController: AbortController;\n}\n\nexport class TaskManager {\n private tasks = new Map<string, ManagedTask>();\n private code: Agent;\n\n constructor(code: Agent) {\n this.code = code;\n }\n\n /**\n * Create a task, start running it, and return the task immediately.\n * Use `getTask` to poll status or `streamTask` for SSE.\n */\n async sendTask(params: TaskSendParams): Promise<Task> {\n const taskId = params.id ?? generateUUID();\n\n const thread = await this.code.createThread({\n sessionId: params.sessionId,\n });\n\n const task: Task = {\n id: taskId,\n sessionId: thread.sessionId,\n status: { state: \"submitted\", timestamp: new Date().toISOString() },\n history: [params.message],\n artifacts: [],\n };\n\n const abortController = new AbortController();\n this.tasks.set(taskId, { task, thread, abortController });\n\n const prompt = this.messageToPrompt(params.message);\n this.runTask(taskId, prompt);\n\n return task;\n }\n\n /**\n * Stream task events as an async generator (for SSE).\n */\n async *sendTaskSubscribe(\n params: TaskSendParams,\n ): AsyncGenerator<TaskStreamEvent> {\n const taskId = params.id ?? generateUUID();\n\n const thread = await this.code.createThread({\n sessionId: params.sessionId,\n });\n\n const task: Task = {\n id: taskId,\n sessionId: thread.sessionId,\n status: { state: \"submitted\", timestamp: new Date().toISOString() },\n history: [params.message],\n artifacts: [],\n };\n\n const abortController = new AbortController();\n this.tasks.set(taskId, { task, thread, abortController });\n\n yield {\n type: \"status\",\n taskId,\n status: task.status,\n final: false,\n };\n\n task.status = { state: \"working\", timestamp: new Date().toISOString() };\n yield {\n type: \"status\",\n taskId,\n status: task.status,\n final: false,\n };\n\n const prompt = this.messageToPrompt(params.message);\n const textParts: string[] = [];\n\n try {\n for await (const event of thread.run(prompt, {\n signal: abortController.signal,\n })) {\n const streamEvent = this.mapStreamEvent(taskId, task, event, textParts);\n if (streamEvent) yield streamEvent;\n }\n\n // Finalize\n if (textParts.length > 0) {\n const artifact: Artifact = {\n name: \"response\",\n parts: [{ type: \"text\", text: textParts.join(\"\") }],\n lastChunk: true,\n };\n task.artifacts = [artifact];\n yield { type: \"artifact\", taskId, artifact };\n }\n\n task.status = { state: \"completed\", timestamp: new Date().toISOString() };\n yield { type: \"status\", taskId, status: task.status, final: true };\n } catch (err) {\n task.status = {\n state: \"failed\",\n timestamp: new Date().toISOString(),\n message: {\n role: \"agent\",\n parts: [\n {\n type: \"text\",\n text: err instanceof Error ? err.message : String(err),\n },\n ],\n },\n };\n yield { type: \"status\", taskId, status: task.status, final: true };\n }\n }\n\n getTask(taskId: string): Task | null {\n return this.tasks.get(taskId)?.task ?? null;\n }\n\n cancelTask(taskId: string): boolean {\n const managed = this.tasks.get(taskId);\n if (!managed) return false;\n\n managed.abortController.abort();\n managed.task.status = {\n state: \"canceled\",\n timestamp: new Date().toISOString(),\n };\n return true;\n }\n\n private async runTask(taskId: string, prompt: string): Promise<void> {\n const managed = this.tasks.get(taskId);\n if (!managed) return;\n\n managed.task.status = {\n state: \"working\",\n timestamp: new Date().toISOString(),\n };\n\n try {\n const textParts: string[] = [];\n for await (const event of managed.thread.run(prompt, {\n signal: managed.abortController.signal,\n })) {\n if (event.type === \"text_delta\") {\n textParts.push(event.text);\n }\n if (event.type === \"user_input_request\") {\n managed.task.status = {\n state: \"input-required\",\n timestamp: new Date().toISOString(),\n };\n }\n }\n\n if (textParts.length > 0) {\n managed.task.artifacts = [\n {\n name: \"response\",\n parts: [{ type: \"text\", text: textParts.join(\"\") }],\n lastChunk: true,\n },\n ];\n }\n\n managed.task.status = {\n state: \"completed\",\n timestamp: new Date().toISOString(),\n };\n } catch (err) {\n managed.task.status = {\n state: \"failed\",\n timestamp: new Date().toISOString(),\n message: {\n role: \"agent\",\n parts: [\n {\n type: \"text\",\n text: err instanceof Error ? err.message : String(err),\n },\n ],\n },\n };\n }\n }\n\n private mapStreamEvent(\n taskId: string,\n task: Task,\n event: StreamEvent,\n textParts: string[],\n ): TaskStreamEvent | null {\n switch (event.type) {\n case \"text_delta\":\n textParts.push(event.text);\n return null; // Text accumulates into artifact at end\n\n case \"user_input_request\":\n task.status = {\n state: \"input-required\",\n timestamp: new Date().toISOString(),\n };\n return {\n type: \"status\",\n taskId,\n status: task.status,\n final: false,\n };\n\n case \"error\":\n task.status = {\n state: \"failed\",\n timestamp: new Date().toISOString(),\n message: {\n role: \"agent\",\n parts: [{ type: \"text\", text: event.error.message }],\n },\n };\n return {\n type: \"status\",\n taskId,\n status: task.status,\n final: true,\n };\n\n default:\n return null;\n }\n }\n\n private messageToPrompt(message: Message): string {\n return message.parts\n .filter((p): p is TextPart => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\\n\");\n }\n}\n","/**\n * Build an A2A Agent Card from a noumen Code instance configuration.\n */\n\nimport type { AgentCard, AgentSkill } from \"./types.js\";\n\nexport interface AgentCardOptions {\n name: string;\n description?: string;\n url: string;\n version?: string;\n provider?: {\n organization: string;\n url?: string;\n };\n skills?: AgentSkill[];\n authentication?: {\n schemes: string[];\n credentials?: string;\n };\n streaming?: boolean;\n}\n\nexport function buildAgentCard(options: AgentCardOptions): AgentCard {\n return {\n name: options.name,\n description: options.description ?? \"A noumen-powered AI coding agent\",\n url: options.url,\n version: options.version ?? \"0.1.0\",\n provider: options.provider,\n capabilities: {\n streaming: options.streaming ?? true,\n pushNotifications: false,\n stateTransitionHistory: true,\n },\n authentication: options.authentication,\n defaultInputModes: [\"text\"],\n defaultOutputModes: [\"text\"],\n skills: options.skills ?? [\n {\n id: \"coding\",\n name: \"Code Generation & Editing\",\n description: \"Read, write, and edit code files with full tool access\",\n tags: [\"coding\", \"files\", \"shell\"],\n },\n ],\n };\n}\n","/**\n * A2A client for calling remote A2A agents.\n *\n * Enables noumen agents to discover and delegate work to other A2A agents.\n */\n\nimport type {\n AgentCard,\n Task,\n Message,\n TaskSendParams,\n TaskStreamEvent,\n} from \"./types.js\";\nimport { A2A_METHODS } from \"./types.js\";\nimport { formatRequest, type JsonRpcResponse } from \"../jsonrpc/index.js\";\n\nexport interface A2AClientOptions {\n /** Override headers for all requests. */\n headers?: Record<string, string>;\n /** Bearer token for authentication. */\n token?: string;\n}\n\nexport class A2AClient {\n private agentUrl: string;\n private headers: Record<string, string>;\n\n constructor(agentUrl: string, options?: A2AClientOptions) {\n this.agentUrl = agentUrl.replace(/\\/+$/, \"\");\n this.headers = {\n \"Content-Type\": \"application/json\",\n ...(options?.token ? { Authorization: `Bearer ${options.token}` } : {}),\n ...(options?.headers ?? {}),\n };\n }\n\n /**\n * Discover the remote agent's capabilities via its Agent Card.\n */\n async getAgentCard(): Promise<AgentCard> {\n const res = await fetch(\n `${this.agentUrl}/.well-known/agent.json`,\n { headers: this.headers },\n );\n if (!res.ok) {\n throw new Error(`Failed to fetch agent card: ${res.status}`);\n }\n return res.json() as Promise<AgentCard>;\n }\n\n /**\n * Send a task to the remote agent (non-streaming).\n */\n async sendTask(params: TaskSendParams): Promise<Task> {\n const rpc = formatRequest(1, A2A_METHODS.TASKS_SEND, params);\n const res = await fetch(this.agentUrl, {\n method: \"POST\",\n headers: this.headers,\n body: JSON.stringify(rpc),\n });\n const response = (await res.json()) as JsonRpcResponse;\n if (\"error\" in response) {\n throw new Error(response.error.message);\n }\n return response.result as Task;\n }\n\n /**\n * Send a task and subscribe to streaming updates via SSE.\n */\n async *sendTaskSubscribe(\n params: TaskSendParams,\n ): AsyncGenerator<TaskStreamEvent> {\n const rpc = formatRequest(1, A2A_METHODS.TASKS_SEND_SUBSCRIBE, params);\n const res = await fetch(this.agentUrl, {\n method: \"POST\",\n headers: this.headers,\n body: JSON.stringify(rpc),\n });\n\n if (!res.ok) {\n throw new Error(`A2A streaming request failed: ${res.status}`);\n }\n\n const reader = res.body?.getReader();\n if (!reader) throw new Error(\"No response body\");\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (!data) continue;\n try {\n const parsed = JSON.parse(data) as JsonRpcResponse;\n if (\"result\" in parsed) {\n yield parsed.result as TaskStreamEvent;\n }\n } catch {\n // Skip malformed SSE data\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Get the current state of a task.\n */\n async getTask(taskId: string): Promise<Task> {\n const rpc = formatRequest(1, A2A_METHODS.TASKS_GET, { id: taskId });\n const res = await fetch(this.agentUrl, {\n method: \"POST\",\n headers: this.headers,\n body: JSON.stringify(rpc),\n });\n const response = (await res.json()) as JsonRpcResponse;\n if (\"error\" in response) {\n throw new Error(response.error.message);\n }\n return response.result as Task;\n }\n\n /**\n * Cancel a running task.\n */\n async cancelTask(taskId: string): Promise<void> {\n const rpc = formatRequest(1, A2A_METHODS.TASKS_CANCEL, { id: taskId });\n const res = await fetch(this.agentUrl, {\n method: \"POST\",\n headers: this.headers,\n body: JSON.stringify(rpc),\n });\n const response = (await res.json()) as JsonRpcResponse;\n if (\"error\" in response) {\n throw new Error(response.error.message);\n }\n }\n\n /**\n * Helper: send a simple text message and return the task.\n */\n async ask(text: string, sessionId?: string): Promise<Task> {\n return this.sendTask({\n sessionId,\n message: {\n role: \"user\",\n parts: [{ type: \"text\", text }],\n },\n });\n }\n}\n","/**\n * A2A (Agent2Agent) protocol adapter for noumen.\n *\n * Server usage:\n * import { createA2AServer } from \"noumen/a2a\";\n * const server = createA2AServer(code, { name: \"MyAgent\", url: \"https://...\" });\n * await server.start();\n *\n * Client usage:\n * import { A2AClient } from \"noumen/a2a\";\n * const client = new A2AClient(\"https://remote-agent.example.com\");\n * const card = await client.getAgentCard();\n * const task = await client.ask(\"Fix the bug in auth.ts\");\n */\n\nexport { A2AServer, type A2AServerOptions } from \"./server.js\";\nexport { A2AClient, type A2AClientOptions } from \"./client.js\";\nexport { TaskManager } from \"./task-manager.js\";\nexport { buildAgentCard, type AgentCardOptions } from \"./agent-card.js\";\nexport {\n type AgentCard,\n type AgentSkill,\n type Task,\n type TaskState,\n type TaskStatus,\n type Message,\n type Part,\n type TextPart,\n type FilePart,\n type DataPart,\n type Artifact,\n type TaskSendParams,\n type TaskStreamEvent,\n A2A_METHODS,\n} from \"./types.js\";\n\nimport type { Agent } from \"../agent.js\";\nimport { A2AServer, type A2AServerOptions } from \"./server.js\";\n\n/**\n * Create an A2A server that exposes an Agent instance via the Agent2Agent protocol.\n */\nexport function createA2AServer(\n code: Agent,\n options: A2AServerOptions,\n): A2AServer {\n return new A2AServer(code, options);\n}\n"],"mappings":"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","names":[]}
@@ -1,14 +1,14 @@
1
- import { A as Agent } from '../agent-BrkbZyOT.js';
1
+ import { A as Agent } from '../agent-1nFVUP9E.js';
2
2
  import { A as AcpTransport } from '../types-QwfylltH.js';
3
3
  export { a as ACP_METHODS, b as AcpCapabilities, c as AcpInitializeParams, d as AcpInitializeResult, e as AcpSessionNewParams, f as AcpSessionPromptParams } from '../types-QwfylltH.js';
4
- import { V as VirtualFs, R as ReadOptions, F as FileEntry, i as FileStat, j as VirtualComputer, E as ExecOptions, C as CommandResult } from '../types-CwKKucOF.js';
5
- import '../types-3c88cRKH.js';
6
- import '../cache-DVqaCX8v.js';
4
+ import { V as VirtualFs, R as ReadOptions, F as FileEntry, i as FileStat, j as VirtualComputer, E as ExecOptions, C as CommandResult } from '../types-RPKUTu1k.js';
5
+ import '../types-LrU4LRmX.js';
6
+ import '../cache-DsRqxx6v.js';
7
7
  import '../types-2kTLUCnD.js';
8
8
  import '@modelcontextprotocol/sdk/client/index.js';
9
9
  import '@modelcontextprotocol/sdk/client/auth.js';
10
10
  import '@modelcontextprotocol/sdk/shared/auth.js';
11
- import '../types-DwdzmXfs.js';
11
+ import '../types-CD0rUKKT.js';
12
12
 
13
13
  /**
14
14
  * ACP protocol handler: maps ACP JSON-RPC methods to Agent/Thread APIs.
package/dist/acp/index.js CHANGED
@@ -170,8 +170,8 @@ var AcpHandler = class {
170
170
  }
171
171
  };
172
172
  }
173
- handleSessionNew(params) {
174
- const thread = this.code.createThread({
173
+ async handleSessionNew(params) {
174
+ const thread = await this.code.createThread({
175
175
  sessionId: params.sessionId,
176
176
  permissionHandler: (req) => this.bridgePermission(thread.sessionId, req),
177
177
  userInputHandler: (question) => this.bridgeUserInput(thread.sessionId, question)
@@ -214,8 +214,8 @@ var AcpHandler = class {
214
214
  session.abortController = null;
215
215
  }
216
216
  }
217
- handleSessionLoad(params) {
218
- const thread = this.code.resumeThread(params.sessionId, {
217
+ async handleSessionLoad(params) {
218
+ const thread = await this.code.resumeThread(params.sessionId, {
219
219
  permissionHandler: (req) => this.bridgePermission(params.sessionId, req),
220
220
  userInputHandler: (question) => this.bridgeUserInput(params.sessionId, question)
221
221
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/acp/types.ts","../../src/acp/handler.ts","../../src/acp/transport-stdio.ts","../../src/acp/client-sandbox.ts","../../src/acp/index.ts"],"sourcesContent":["/**\n * ACP (Agent Client Protocol) types.\n *\n * ACP is a JSON-RPC 2.0 protocol (like LSP) for communication between\n * clients (editors, UIs) and AI coding agents over stdio or HTTP.\n */\n\n// ── Capability negotiation ──────────────────────────────────────────────────\n\nexport interface AcpCapabilities {\n streaming?: boolean;\n permissions?: boolean;\n tools?: string[];\n sessions?: boolean;\n}\n\nexport interface AcpInitializeParams {\n clientName: string;\n clientVersion: string;\n capabilities?: {\n filesystem?: boolean;\n terminal?: boolean;\n };\n}\n\nexport interface AcpInitializeResult {\n agentName: string;\n agentVersion: string;\n protocolVersion: string;\n capabilities: AcpCapabilities;\n}\n\n// ── Session methods ─────────────────────────────────────────────────────────\n\nexport interface AcpSessionNewParams {\n sessionId?: string;\n}\n\nexport interface AcpSessionNewResult {\n sessionId: string;\n}\n\nexport interface AcpSessionPromptParams {\n sessionId: string;\n prompt: string;\n}\n\nexport interface AcpSessionLoadParams {\n sessionId: string;\n}\n\nexport interface AcpSessionLoadResult {\n sessionId: string;\n messageCount: number;\n}\n\n// ── Stream notifications (agent -> client) ──────────────────────────────────\n\nexport interface AcpStreamTextNotification {\n sessionId: string;\n text: string;\n}\n\nexport interface AcpStreamToolUseNotification {\n sessionId: string;\n toolName: string;\n toolUseId: string;\n input?: string;\n}\n\nexport interface AcpStreamCompleteNotification {\n sessionId: string;\n text: string | null;\n}\n\nexport interface AcpStreamErrorNotification {\n sessionId: string;\n error: string;\n}\n\n// ── Client-invoked methods (agent -> client, for fs/terminal) ───────────────\n\nexport interface AcpFsReadParams {\n path: string;\n}\n\nexport interface AcpFsReadResult {\n content: string;\n}\n\nexport interface AcpFsBytesReadParams {\n path: string;\n maxBytes?: number;\n}\n\nexport interface AcpFsBytesReadResult {\n /** Base64-encoded file content */\n data: string;\n}\n\nexport interface AcpFsWriteParams {\n path: string;\n content: string;\n}\n\nexport interface AcpFsStatParams {\n path: string;\n}\n\nexport interface AcpFsStatResult {\n size: number;\n isDirectory: boolean;\n isFile: boolean;\n modifiedAt?: string;\n}\n\nexport interface AcpTerminalExecParams {\n command: string;\n cwd?: string;\n timeout?: number;\n}\n\nexport interface AcpTerminalExecResult {\n exitCode: number;\n stdout: string;\n stderr: string;\n}\n\n// ── Permission bridge ───────────────────────────────────────────────────────\n\nexport interface AcpPermissionRequestNotification {\n sessionId: string;\n toolName: string;\n input: Record<string, unknown>;\n message: string;\n}\n\nexport interface AcpPermissionResponseParams {\n sessionId: string;\n allow: boolean;\n feedback?: string;\n}\n\n// ── Transport interface ─────────────────────────────────────────────────────\n\nexport interface AcpTransport {\n /** Send a JSON-RPC message to the peer. */\n send(message: unknown): void;\n /** Register a handler for incoming JSON-RPC messages. */\n onMessage(handler: (message: unknown) => void): void;\n /** Register a close handler. */\n onClose(handler: () => void): void;\n /** Close the transport. */\n close(): void;\n}\n\n// ── Method constants ────────────────────────────────────────────────────────\n\nexport const ACP_METHODS = {\n INITIALIZE: \"initialize\",\n SESSION_NEW: \"session/new\",\n SESSION_PROMPT: \"session/prompt\",\n SESSION_LOAD: \"session/load\",\n SESSION_ABORT: \"session/abort\",\n\n // Client-invoked\n FS_READ: \"fs/read_text_file\",\n FS_READ_BYTES: \"fs/read_bytes\",\n FS_WRITE: \"fs/write_text_file\",\n FS_STAT: \"fs/stat\",\n FS_EXISTS: \"fs/exists\",\n FS_READDIR: \"fs/readdir\",\n FS_MKDIR: \"fs/mkdir\",\n FS_DELETE: \"fs/delete\",\n TERMINAL_EXEC: \"terminal/exec\",\n\n // Notifications (agent -> client)\n STREAM_TEXT: \"stream/text\",\n STREAM_THINKING: \"stream/thinking\",\n STREAM_TOOL_USE: \"stream/toolUse\",\n STREAM_TOOL_RESULT: \"stream/toolResult\",\n STREAM_COMPLETE: \"stream/complete\",\n STREAM_ERROR: \"stream/error\",\n PERMISSION_REQUEST: \"permission/request\",\n PERMISSION_RESPONSE: \"permission/response\",\n USER_INPUT_REQUEST: \"userInput/request\",\n USER_INPUT_RESPONSE: \"userInput/response\",\n} as const;\n","/**\n * ACP protocol handler: maps ACP JSON-RPC methods to Agent/Thread APIs.\n */\n\nimport type { Agent } from \"../agent.js\";\nimport type { Thread } from \"../thread.js\";\nimport type { StreamEvent } from \"../session/types.js\";\nimport type { PermissionRequest, PermissionResponse } from \"../permissions/types.js\";\nimport type {\n AcpTransport,\n AcpInitializeParams,\n AcpInitializeResult,\n AcpSessionNewParams,\n AcpSessionPromptParams,\n AcpSessionLoadParams,\n} from \"./types.js\";\nimport { ACP_METHODS } from \"./types.js\";\nimport {\n formatResponse,\n formatError,\n formatNotification,\n isRequest,\n METHOD_NOT_FOUND,\n INVALID_PARAMS,\n INTERNAL_ERROR,\n type JsonRpcMessage,\n type JsonRpcRequest,\n} from \"../jsonrpc/index.js\";\nimport { contentToString } from \"../utils/content.js\";\n\nexport interface AcpHandlerOptions {\n agentName?: string;\n agentVersion?: string;\n}\n\ninterface SessionState {\n thread: Thread;\n running: boolean;\n abortController: AbortController | null;\n pendingPermission: {\n resolve: (response: PermissionResponse) => void;\n } | null;\n pendingInput: {\n resolve: (answer: string) => void;\n } | null;\n}\n\nexport class AcpHandler {\n private code: Agent;\n private transport: AcpTransport;\n private options: AcpHandlerOptions;\n private sessions = new Map<string, SessionState>();\n private initialized = false;\n private clientCapabilities: { filesystem?: boolean; terminal?: boolean } = {};\n private pendingRequests = new Map<\n string | number,\n { resolve: (value: unknown) => void; reject: (err: Error) => void }\n >();\n private nextRequestId = 1;\n\n constructor(\n code: Agent,\n transport: AcpTransport,\n options?: AcpHandlerOptions,\n ) {\n this.code = code;\n this.transport = transport;\n this.options = options ?? {};\n\n transport.onMessage((msg) => this.handleMessage(msg as JsonRpcMessage));\n transport.onClose(() => this.handleClose());\n }\n\n /**\n * Send a JSON-RPC request to the client and wait for the response.\n * Used by AcpClientSandbox to invoke client-side fs/terminal methods.\n */\n async sendClientRequest(method: string, params: unknown): Promise<unknown> {\n const id = this.nextRequestId++;\n return new Promise<unknown>((resolve, reject) => {\n this.pendingRequests.set(id, { resolve, reject });\n this.transport.send({\n jsonrpc: \"2.0\",\n id,\n method,\n params,\n });\n });\n }\n\n private async handleMessage(msg: JsonRpcMessage): Promise<void> {\n // Handle responses to our client requests\n if (\"result\" in msg || \"error\" in msg) {\n const response = msg as { id: string | number; result?: unknown; error?: { message: string } };\n const pending = this.pendingRequests.get(response.id);\n if (pending) {\n this.pendingRequests.delete(response.id);\n if (\"error\" in response && response.error) {\n pending.reject(new Error(response.error.message));\n } else {\n pending.resolve(response.result);\n }\n }\n return;\n }\n\n if (!isRequest(msg)) return;\n\n const request = msg as JsonRpcRequest;\n try {\n const result = await this.dispatch(request);\n if (result !== undefined) {\n this.transport.send(formatResponse(request.id, result));\n }\n } catch (err) {\n this.transport.send(\n formatError(\n request.id,\n INTERNAL_ERROR,\n err instanceof Error ? err.message : String(err),\n ),\n );\n }\n }\n\n private async dispatch(request: JsonRpcRequest): Promise<unknown> {\n switch (request.method) {\n case ACP_METHODS.INITIALIZE:\n return this.handleInitialize(request.params as AcpInitializeParams);\n\n case ACP_METHODS.SESSION_NEW:\n return this.handleSessionNew(request.params as AcpSessionNewParams);\n\n case ACP_METHODS.SESSION_PROMPT:\n this.handleSessionPrompt(\n request.id,\n request.params as AcpSessionPromptParams,\n );\n return undefined;\n\n case ACP_METHODS.SESSION_LOAD:\n return this.handleSessionLoad(request.params as AcpSessionLoadParams);\n\n case ACP_METHODS.SESSION_ABORT: {\n const p = request.params as { sessionId: string };\n const session = this.sessions.get(p.sessionId);\n if (session) {\n session.abortController?.abort();\n }\n return { ok: true };\n }\n\n case ACP_METHODS.PERMISSION_RESPONSE: {\n const p = request.params as { sessionId: string; allow: boolean; feedback?: string };\n const session = this.sessions.get(p.sessionId);\n if (session?.pendingPermission) {\n session.pendingPermission.resolve({\n allow: p.allow,\n feedback: p.feedback,\n });\n session.pendingPermission = null;\n }\n return { ok: true };\n }\n\n case ACP_METHODS.USER_INPUT_RESPONSE: {\n const p = request.params as { sessionId: string; answer: string };\n const session = this.sessions.get(p.sessionId);\n if (session?.pendingInput) {\n session.pendingInput.resolve(p.answer ?? \"\");\n session.pendingInput = null;\n }\n return { ok: true };\n }\n\n default:\n throw Object.assign(\n new Error(`Unknown method: ${request.method}`),\n { code: METHOD_NOT_FOUND },\n );\n }\n }\n\n private handleInitialize(\n params: AcpInitializeParams,\n ): AcpInitializeResult {\n this.initialized = true;\n this.clientCapabilities = params.capabilities ?? {};\n\n return {\n agentName: this.options.agentName ?? \"noumen\",\n agentVersion: this.options.agentVersion ?? \"0.1.0\",\n protocolVersion: \"0.1.0\",\n capabilities: {\n streaming: true,\n permissions: true,\n sessions: true,\n },\n };\n }\n\n private handleSessionNew(\n params: AcpSessionNewParams,\n ): { sessionId: string } {\n const thread = this.code.createThread({\n sessionId: params.sessionId,\n permissionHandler: (req: PermissionRequest) =>\n this.bridgePermission(thread.sessionId, req),\n userInputHandler: (question: string) =>\n this.bridgeUserInput(thread.sessionId, question),\n });\n\n this.sessions.set(thread.sessionId, {\n thread,\n running: false,\n abortController: null,\n pendingPermission: null,\n pendingInput: null,\n });\n\n return { sessionId: thread.sessionId };\n }\n\n private async handleSessionPrompt(\n requestId: string | number,\n params: AcpSessionPromptParams,\n ): Promise<void> {\n const session = this.sessions.get(params.sessionId);\n if (!session) {\n this.transport.send(\n formatError(requestId, INVALID_PARAMS, `Session not found: ${params.sessionId}`),\n );\n return;\n }\n\n session.running = true;\n session.abortController = new AbortController();\n\n // Acknowledge the prompt request immediately\n this.transport.send(formatResponse(requestId, { ok: true }));\n\n try {\n for await (const event of session.thread.run(params.prompt, {\n signal: session.abortController.signal,\n })) {\n this.emitStreamEvent(params.sessionId, event);\n }\n } catch (err) {\n this.transport.send(\n formatNotification(ACP_METHODS.STREAM_ERROR, {\n sessionId: params.sessionId,\n error: err instanceof Error ? err.message : String(err),\n }),\n );\n } finally {\n session.running = false;\n session.abortController = null;\n }\n }\n\n private handleSessionLoad(\n params: AcpSessionLoadParams,\n ): { sessionId: string } {\n const thread = this.code.resumeThread(params.sessionId, {\n permissionHandler: (req: PermissionRequest) =>\n this.bridgePermission(params.sessionId, req),\n userInputHandler: (question: string) =>\n this.bridgeUserInput(params.sessionId, question),\n });\n\n this.sessions.set(params.sessionId, {\n thread,\n running: false,\n abortController: null,\n pendingPermission: null,\n pendingInput: null,\n });\n\n return { sessionId: params.sessionId };\n }\n\n private emitStreamEvent(sessionId: string, event: StreamEvent): void {\n switch (event.type) {\n case \"text_delta\":\n this.transport.send(\n formatNotification(ACP_METHODS.STREAM_TEXT, {\n sessionId,\n text: event.text,\n }),\n );\n break;\n\n case \"thinking_delta\":\n this.transport.send(\n formatNotification(ACP_METHODS.STREAM_THINKING, {\n sessionId,\n text: event.text,\n }),\n );\n break;\n\n case \"tool_use_start\":\n this.transport.send(\n formatNotification(ACP_METHODS.STREAM_TOOL_USE, {\n sessionId,\n toolName: event.toolName,\n toolUseId: event.toolUseId,\n phase: \"start\",\n }),\n );\n break;\n\n case \"tool_result\":\n this.transport.send(\n formatNotification(ACP_METHODS.STREAM_TOOL_RESULT, {\n sessionId,\n toolName: event.toolName,\n toolUseId: event.toolUseId,\n result: contentToString(event.result.content),\n isError: event.result.isError,\n }),\n );\n break;\n\n case \"message_complete\":\n this.transport.send(\n formatNotification(ACP_METHODS.STREAM_COMPLETE, {\n sessionId,\n text: event.message.content,\n }),\n );\n break;\n\n case \"turn_complete\":\n this.transport.send(\n formatNotification(ACP_METHODS.STREAM_COMPLETE, {\n sessionId,\n done: true,\n usage: event.usage,\n }),\n );\n break;\n\n case \"error\":\n this.transport.send(\n formatNotification(ACP_METHODS.STREAM_ERROR, {\n sessionId,\n error: event.error.message,\n }),\n );\n break;\n\n case \"permission_request\":\n this.transport.send(\n formatNotification(ACP_METHODS.PERMISSION_REQUEST, {\n sessionId,\n toolName: event.toolName,\n input: event.input,\n message: event.message,\n }),\n );\n break;\n\n case \"user_input_request\":\n this.transport.send(\n formatNotification(ACP_METHODS.USER_INPUT_REQUEST, {\n sessionId,\n toolUseId: event.toolUseId,\n question: event.question,\n }),\n );\n break;\n }\n }\n\n private bridgePermission(\n sessionId: string,\n request: PermissionRequest,\n ): Promise<PermissionResponse> {\n return new Promise<PermissionResponse>((resolve) => {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.pendingPermission = { resolve };\n }\n });\n }\n\n private bridgeUserInput(\n sessionId: string,\n question: string,\n ): Promise<string> {\n return new Promise<string>((resolve) => {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.pendingInput = { resolve };\n }\n });\n }\n\n private handleClose(): void {\n for (const session of this.sessions.values()) {\n session.abortController?.abort();\n }\n this.sessions.clear();\n }\n}\n","/**\n * ACP stdio transport: newline-delimited JSON-RPC over stdin/stdout.\n */\n\nimport type { AcpTransport } from \"./types.js\";\n\nexport class StdioTransport implements AcpTransport {\n private messageHandler: ((message: unknown) => void) | null = null;\n private closeHandler: (() => void) | null = null;\n private buffer = \"\";\n private closed = false;\n\n constructor(\n private input: NodeJS.ReadableStream = process.stdin,\n private output: NodeJS.WritableStream = process.stdout,\n ) {\n this.input.setEncoding?.(\"utf-8\");\n this.input.on(\"data\", (chunk: string) => this.onData(chunk));\n this.input.on(\"end\", () => this.handleClose());\n this.input.on(\"error\", () => this.handleClose());\n }\n\n send(message: unknown): void {\n if (this.closed) return;\n const line = JSON.stringify(message) + \"\\n\";\n this.output.write(line);\n }\n\n onMessage(handler: (message: unknown) => void): void {\n this.messageHandler = handler;\n }\n\n onClose(handler: () => void): void {\n this.closeHandler = handler;\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.handleClose();\n }\n\n private onData(chunk: string): void {\n this.buffer += chunk;\n const lines = this.buffer.split(\"\\n\");\n this.buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const msg = JSON.parse(trimmed);\n this.messageHandler?.(msg);\n } catch {\n // Skip malformed lines (per ACP spec: agents may write to stderr for logs)\n }\n }\n }\n\n private handleClose(): void {\n this.closed = true;\n this.closeHandler?.();\n }\n}\n","/**\n * AcpClientSandbox: VirtualFs + VirtualComputer backed by the ACP client.\n *\n * In the ACP model, the **client** (editor/IDE) provides filesystem and\n * terminal access. This sandbox implementation sends JSON-RPC requests to\n * the client for every fs/shell operation. It's a natural fit for noumen's\n * pluggable sandbox architecture.\n */\n\nimport type { VirtualFs, FileEntry, FileStat, ReadOptions } from \"../virtual/fs.js\";\nimport type { VirtualComputer, ExecOptions, CommandResult } from \"../virtual/computer.js\";\nimport type { Sandbox } from \"../virtual/sandbox.js\";\nimport type { AcpTransport } from \"./types.js\";\nimport { ACP_METHODS } from \"./types.js\";\nimport {\n formatRequest,\n type JsonRpcResponse,\n} from \"../jsonrpc/index.js\";\n\nlet _nextId = 1;\n\nexport class AcpClientSandbox {\n readonly fs: AcpClientFs;\n readonly computer: AcpClientComputer;\n\n constructor(\n private transport: AcpTransport,\n private sendRequest: (method: string, params: unknown) => Promise<unknown>,\n ) {\n this.fs = new AcpClientFs(sendRequest);\n this.computer = new AcpClientComputer(sendRequest);\n }\n}\n\nclass AcpClientFs implements VirtualFs {\n constructor(\n private sendRequest: (method: string, params: unknown) => Promise<unknown>,\n ) {}\n\n async readFile(path: string, _opts?: ReadOptions): Promise<string> {\n const result = (await this.sendRequest(ACP_METHODS.FS_READ, { path })) as {\n content: string;\n };\n return result.content;\n }\n\n async readFileBytes(path: string, maxBytes?: number): Promise<Buffer> {\n const result = (await this.sendRequest(ACP_METHODS.FS_READ_BYTES, {\n path,\n maxBytes,\n })) as { data: string };\n return Buffer.from(result.data, \"base64\");\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n await this.sendRequest(ACP_METHODS.FS_WRITE, { path, content });\n }\n\n async appendFile(path: string, content: string): Promise<void> {\n let existing = \"\";\n try {\n existing = await this.readFile(path);\n } catch {\n // file may not exist\n }\n await this.writeFile(path, existing + content);\n }\n\n async deleteFile(\n path: string,\n opts?: { recursive?: boolean },\n ): Promise<void> {\n await this.sendRequest(ACP_METHODS.FS_DELETE, {\n path,\n recursive: opts?.recursive ?? false,\n });\n }\n\n async mkdir(path: string, opts?: { recursive?: boolean }): Promise<void> {\n await this.sendRequest(ACP_METHODS.FS_MKDIR, {\n path,\n recursive: opts?.recursive ?? false,\n });\n }\n\n async readdir(\n path: string,\n _opts?: { recursive?: boolean },\n ): Promise<FileEntry[]> {\n const result = (await this.sendRequest(ACP_METHODS.FS_READDIR, {\n path,\n })) as FileEntry[];\n return result;\n }\n\n async exists(path: string): Promise<boolean> {\n const result = (await this.sendRequest(ACP_METHODS.FS_EXISTS, {\n path,\n })) as boolean;\n return result;\n }\n\n async stat(path: string): Promise<FileStat> {\n const result = (await this.sendRequest(ACP_METHODS.FS_STAT, {\n path,\n })) as {\n size: number;\n isDirectory: boolean;\n isFile: boolean;\n modifiedAt?: string;\n };\n return {\n size: result.size,\n isDirectory: result.isDirectory,\n isFile: result.isFile,\n modifiedAt: result.modifiedAt ? new Date(result.modifiedAt) : undefined,\n };\n }\n}\n\nclass AcpClientComputer implements VirtualComputer {\n constructor(\n private sendRequest: (method: string, params: unknown) => Promise<unknown>,\n ) {}\n\n async executeCommand(\n command: string,\n opts?: ExecOptions,\n ): Promise<CommandResult> {\n const result = (await this.sendRequest(ACP_METHODS.TERMINAL_EXEC, {\n command,\n cwd: opts?.cwd,\n timeout: opts?.timeout,\n })) as { exitCode: number; stdout: string; stderr: string };\n return {\n exitCode: result.exitCode,\n stdout: result.stdout,\n stderr: result.stderr,\n };\n }\n}\n","/**\n * ACP (Agent Client Protocol) adapter for noumen.\n *\n * Usage:\n * import { createAcpServer, StdioTransport, AcpClientSandbox } from \"noumen/acp\";\n *\n * // Stdio mode (editor launches agent as subprocess)\n * const transport = new StdioTransport();\n * const handler = createAcpServer(code, transport);\n *\n * // Or use AcpClientSandbox to let the client provide fs/terminal\n * const sandbox = new AcpClientSandbox(transport, handler.sendClientRequest);\n * const agent = new Agent({ provider, sandbox });\n */\n\nexport { AcpHandler, type AcpHandlerOptions } from \"./handler.js\";\nexport { StdioTransport } from \"./transport-stdio.js\";\nexport { AcpClientSandbox } from \"./client-sandbox.js\";\nexport {\n type AcpTransport,\n type AcpCapabilities,\n type AcpInitializeParams,\n type AcpInitializeResult,\n type AcpSessionNewParams,\n type AcpSessionPromptParams,\n ACP_METHODS,\n} from \"./types.js\";\n\nimport type { Agent } from \"../agent.js\";\nimport type { AcpTransport } from \"./types.js\";\nimport { AcpHandler, type AcpHandlerOptions } from \"./handler.js\";\n\n/**\n * Create an ACP server that bridges an ACP transport to an Agent instance.\n */\nexport function createAcpServer(\n code: Agent,\n transport: AcpTransport,\n options?: AcpHandlerOptions,\n): AcpHandler {\n return new AcpHandler(code, transport, options);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/acp/types.ts","../../src/acp/handler.ts","../../src/acp/transport-stdio.ts","../../src/acp/client-sandbox.ts","../../src/acp/index.ts"],"sourcesContent":["/**\n * ACP (Agent Client Protocol) types.\n *\n * ACP is a JSON-RPC 2.0 protocol (like LSP) for communication between\n * clients (editors, UIs) and AI coding agents over stdio or HTTP.\n */\n\n// ── Capability negotiation ──────────────────────────────────────────────────\n\nexport interface AcpCapabilities {\n streaming?: boolean;\n permissions?: boolean;\n tools?: string[];\n sessions?: boolean;\n}\n\nexport interface AcpInitializeParams {\n clientName: string;\n clientVersion: string;\n capabilities?: {\n filesystem?: boolean;\n terminal?: boolean;\n };\n}\n\nexport interface AcpInitializeResult {\n agentName: string;\n agentVersion: string;\n protocolVersion: string;\n capabilities: AcpCapabilities;\n}\n\n// ── Session methods ─────────────────────────────────────────────────────────\n\nexport interface AcpSessionNewParams {\n sessionId?: string;\n}\n\nexport interface AcpSessionNewResult {\n sessionId: string;\n}\n\nexport interface AcpSessionPromptParams {\n sessionId: string;\n prompt: string;\n}\n\nexport interface AcpSessionLoadParams {\n sessionId: string;\n}\n\nexport interface AcpSessionLoadResult {\n sessionId: string;\n messageCount: number;\n}\n\n// ── Stream notifications (agent -> client) ──────────────────────────────────\n\nexport interface AcpStreamTextNotification {\n sessionId: string;\n text: string;\n}\n\nexport interface AcpStreamToolUseNotification {\n sessionId: string;\n toolName: string;\n toolUseId: string;\n input?: string;\n}\n\nexport interface AcpStreamCompleteNotification {\n sessionId: string;\n text: string | null;\n}\n\nexport interface AcpStreamErrorNotification {\n sessionId: string;\n error: string;\n}\n\n// ── Client-invoked methods (agent -> client, for fs/terminal) ───────────────\n\nexport interface AcpFsReadParams {\n path: string;\n}\n\nexport interface AcpFsReadResult {\n content: string;\n}\n\nexport interface AcpFsBytesReadParams {\n path: string;\n maxBytes?: number;\n}\n\nexport interface AcpFsBytesReadResult {\n /** Base64-encoded file content */\n data: string;\n}\n\nexport interface AcpFsWriteParams {\n path: string;\n content: string;\n}\n\nexport interface AcpFsStatParams {\n path: string;\n}\n\nexport interface AcpFsStatResult {\n size: number;\n isDirectory: boolean;\n isFile: boolean;\n modifiedAt?: string;\n}\n\nexport interface AcpTerminalExecParams {\n command: string;\n cwd?: string;\n timeout?: number;\n}\n\nexport interface AcpTerminalExecResult {\n exitCode: number;\n stdout: string;\n stderr: string;\n}\n\n// ── Permission bridge ───────────────────────────────────────────────────────\n\nexport interface AcpPermissionRequestNotification {\n sessionId: string;\n toolName: string;\n input: Record<string, unknown>;\n message: string;\n}\n\nexport interface AcpPermissionResponseParams {\n sessionId: string;\n allow: boolean;\n feedback?: string;\n}\n\n// ── Transport interface ─────────────────────────────────────────────────────\n\nexport interface AcpTransport {\n /** Send a JSON-RPC message to the peer. */\n send(message: unknown): void;\n /** Register a handler for incoming JSON-RPC messages. */\n onMessage(handler: (message: unknown) => void): void;\n /** Register a close handler. */\n onClose(handler: () => void): void;\n /** Close the transport. */\n close(): void;\n}\n\n// ── Method constants ────────────────────────────────────────────────────────\n\nexport const ACP_METHODS = {\n INITIALIZE: \"initialize\",\n SESSION_NEW: \"session/new\",\n SESSION_PROMPT: \"session/prompt\",\n SESSION_LOAD: \"session/load\",\n SESSION_ABORT: \"session/abort\",\n\n // Client-invoked\n FS_READ: \"fs/read_text_file\",\n FS_READ_BYTES: \"fs/read_bytes\",\n FS_WRITE: \"fs/write_text_file\",\n FS_STAT: \"fs/stat\",\n FS_EXISTS: \"fs/exists\",\n FS_READDIR: \"fs/readdir\",\n FS_MKDIR: \"fs/mkdir\",\n FS_DELETE: \"fs/delete\",\n TERMINAL_EXEC: \"terminal/exec\",\n\n // Notifications (agent -> client)\n STREAM_TEXT: \"stream/text\",\n STREAM_THINKING: \"stream/thinking\",\n STREAM_TOOL_USE: \"stream/toolUse\",\n STREAM_TOOL_RESULT: \"stream/toolResult\",\n STREAM_COMPLETE: \"stream/complete\",\n STREAM_ERROR: \"stream/error\",\n PERMISSION_REQUEST: \"permission/request\",\n PERMISSION_RESPONSE: \"permission/response\",\n USER_INPUT_REQUEST: \"userInput/request\",\n USER_INPUT_RESPONSE: \"userInput/response\",\n} as const;\n","/**\n * ACP protocol handler: maps ACP JSON-RPC methods to Agent/Thread APIs.\n */\n\nimport type { Agent } from \"../agent.js\";\nimport type { Thread } from \"../thread.js\";\nimport type { StreamEvent } from \"../session/types.js\";\nimport type { PermissionRequest, PermissionResponse } from \"../permissions/types.js\";\nimport type {\n AcpTransport,\n AcpInitializeParams,\n AcpInitializeResult,\n AcpSessionNewParams,\n AcpSessionPromptParams,\n AcpSessionLoadParams,\n} from \"./types.js\";\nimport { ACP_METHODS } from \"./types.js\";\nimport {\n formatResponse,\n formatError,\n formatNotification,\n isRequest,\n METHOD_NOT_FOUND,\n INVALID_PARAMS,\n INTERNAL_ERROR,\n type JsonRpcMessage,\n type JsonRpcRequest,\n} from \"../jsonrpc/index.js\";\nimport { contentToString } from \"../utils/content.js\";\n\nexport interface AcpHandlerOptions {\n agentName?: string;\n agentVersion?: string;\n}\n\ninterface SessionState {\n thread: Thread;\n running: boolean;\n abortController: AbortController | null;\n pendingPermission: {\n resolve: (response: PermissionResponse) => void;\n } | null;\n pendingInput: {\n resolve: (answer: string) => void;\n } | null;\n}\n\nexport class AcpHandler {\n private code: Agent;\n private transport: AcpTransport;\n private options: AcpHandlerOptions;\n private sessions = new Map<string, SessionState>();\n private initialized = false;\n private clientCapabilities: { filesystem?: boolean; terminal?: boolean } = {};\n private pendingRequests = new Map<\n string | number,\n { resolve: (value: unknown) => void; reject: (err: Error) => void }\n >();\n private nextRequestId = 1;\n\n constructor(\n code: Agent,\n transport: AcpTransport,\n options?: AcpHandlerOptions,\n ) {\n this.code = code;\n this.transport = transport;\n this.options = options ?? {};\n\n transport.onMessage((msg) => this.handleMessage(msg as JsonRpcMessage));\n transport.onClose(() => this.handleClose());\n }\n\n /**\n * Send a JSON-RPC request to the client and wait for the response.\n * Used by AcpClientSandbox to invoke client-side fs/terminal methods.\n */\n async sendClientRequest(method: string, params: unknown): Promise<unknown> {\n const id = this.nextRequestId++;\n return new Promise<unknown>((resolve, reject) => {\n this.pendingRequests.set(id, { resolve, reject });\n this.transport.send({\n jsonrpc: \"2.0\",\n id,\n method,\n params,\n });\n });\n }\n\n private async handleMessage(msg: JsonRpcMessage): Promise<void> {\n // Handle responses to our client requests\n if (\"result\" in msg || \"error\" in msg) {\n const response = msg as { id: string | number; result?: unknown; error?: { message: string } };\n const pending = this.pendingRequests.get(response.id);\n if (pending) {\n this.pendingRequests.delete(response.id);\n if (\"error\" in response && response.error) {\n pending.reject(new Error(response.error.message));\n } else {\n pending.resolve(response.result);\n }\n }\n return;\n }\n\n if (!isRequest(msg)) return;\n\n const request = msg as JsonRpcRequest;\n try {\n const result = await this.dispatch(request);\n if (result !== undefined) {\n this.transport.send(formatResponse(request.id, result));\n }\n } catch (err) {\n this.transport.send(\n formatError(\n request.id,\n INTERNAL_ERROR,\n err instanceof Error ? err.message : String(err),\n ),\n );\n }\n }\n\n private async dispatch(request: JsonRpcRequest): Promise<unknown> {\n switch (request.method) {\n case ACP_METHODS.INITIALIZE:\n return this.handleInitialize(request.params as AcpInitializeParams);\n\n case ACP_METHODS.SESSION_NEW:\n return this.handleSessionNew(request.params as AcpSessionNewParams);\n\n case ACP_METHODS.SESSION_PROMPT:\n this.handleSessionPrompt(\n request.id,\n request.params as AcpSessionPromptParams,\n );\n return undefined;\n\n case ACP_METHODS.SESSION_LOAD:\n return this.handleSessionLoad(request.params as AcpSessionLoadParams);\n\n case ACP_METHODS.SESSION_ABORT: {\n const p = request.params as { sessionId: string };\n const session = this.sessions.get(p.sessionId);\n if (session) {\n session.abortController?.abort();\n }\n return { ok: true };\n }\n\n case ACP_METHODS.PERMISSION_RESPONSE: {\n const p = request.params as { sessionId: string; allow: boolean; feedback?: string };\n const session = this.sessions.get(p.sessionId);\n if (session?.pendingPermission) {\n session.pendingPermission.resolve({\n allow: p.allow,\n feedback: p.feedback,\n });\n session.pendingPermission = null;\n }\n return { ok: true };\n }\n\n case ACP_METHODS.USER_INPUT_RESPONSE: {\n const p = request.params as { sessionId: string; answer: string };\n const session = this.sessions.get(p.sessionId);\n if (session?.pendingInput) {\n session.pendingInput.resolve(p.answer ?? \"\");\n session.pendingInput = null;\n }\n return { ok: true };\n }\n\n default:\n throw Object.assign(\n new Error(`Unknown method: ${request.method}`),\n { code: METHOD_NOT_FOUND },\n );\n }\n }\n\n private handleInitialize(\n params: AcpInitializeParams,\n ): AcpInitializeResult {\n this.initialized = true;\n this.clientCapabilities = params.capabilities ?? {};\n\n return {\n agentName: this.options.agentName ?? \"noumen\",\n agentVersion: this.options.agentVersion ?? \"0.1.0\",\n protocolVersion: \"0.1.0\",\n capabilities: {\n streaming: true,\n permissions: true,\n sessions: true,\n },\n };\n }\n\n private async handleSessionNew(\n params: AcpSessionNewParams,\n ): Promise<{ sessionId: string }> {\n const thread = await this.code.createThread({\n sessionId: params.sessionId,\n permissionHandler: (req: PermissionRequest) =>\n this.bridgePermission(thread.sessionId, req),\n userInputHandler: (question: string) =>\n this.bridgeUserInput(thread.sessionId, question),\n });\n\n this.sessions.set(thread.sessionId, {\n thread,\n running: false,\n abortController: null,\n pendingPermission: null,\n pendingInput: null,\n });\n\n return { sessionId: thread.sessionId };\n }\n\n private async handleSessionPrompt(\n requestId: string | number,\n params: AcpSessionPromptParams,\n ): Promise<void> {\n const session = this.sessions.get(params.sessionId);\n if (!session) {\n this.transport.send(\n formatError(requestId, INVALID_PARAMS, `Session not found: ${params.sessionId}`),\n );\n return;\n }\n\n session.running = true;\n session.abortController = new AbortController();\n\n // Acknowledge the prompt request immediately\n this.transport.send(formatResponse(requestId, { ok: true }));\n\n try {\n for await (const event of session.thread.run(params.prompt, {\n signal: session.abortController.signal,\n })) {\n this.emitStreamEvent(params.sessionId, event);\n }\n } catch (err) {\n this.transport.send(\n formatNotification(ACP_METHODS.STREAM_ERROR, {\n sessionId: params.sessionId,\n error: err instanceof Error ? err.message : String(err),\n }),\n );\n } finally {\n session.running = false;\n session.abortController = null;\n }\n }\n\n private async handleSessionLoad(\n params: AcpSessionLoadParams,\n ): Promise<{ sessionId: string }> {\n const thread = await this.code.resumeThread(params.sessionId, {\n permissionHandler: (req: PermissionRequest) =>\n this.bridgePermission(params.sessionId, req),\n userInputHandler: (question: string) =>\n this.bridgeUserInput(params.sessionId, question),\n });\n\n this.sessions.set(params.sessionId, {\n thread,\n running: false,\n abortController: null,\n pendingPermission: null,\n pendingInput: null,\n });\n\n return { sessionId: params.sessionId };\n }\n\n private emitStreamEvent(sessionId: string, event: StreamEvent): void {\n switch (event.type) {\n case \"text_delta\":\n this.transport.send(\n formatNotification(ACP_METHODS.STREAM_TEXT, {\n sessionId,\n text: event.text,\n }),\n );\n break;\n\n case \"thinking_delta\":\n this.transport.send(\n formatNotification(ACP_METHODS.STREAM_THINKING, {\n sessionId,\n text: event.text,\n }),\n );\n break;\n\n case \"tool_use_start\":\n this.transport.send(\n formatNotification(ACP_METHODS.STREAM_TOOL_USE, {\n sessionId,\n toolName: event.toolName,\n toolUseId: event.toolUseId,\n phase: \"start\",\n }),\n );\n break;\n\n case \"tool_result\":\n this.transport.send(\n formatNotification(ACP_METHODS.STREAM_TOOL_RESULT, {\n sessionId,\n toolName: event.toolName,\n toolUseId: event.toolUseId,\n result: contentToString(event.result.content),\n isError: event.result.isError,\n }),\n );\n break;\n\n case \"message_complete\":\n this.transport.send(\n formatNotification(ACP_METHODS.STREAM_COMPLETE, {\n sessionId,\n text: event.message.content,\n }),\n );\n break;\n\n case \"turn_complete\":\n this.transport.send(\n formatNotification(ACP_METHODS.STREAM_COMPLETE, {\n sessionId,\n done: true,\n usage: event.usage,\n }),\n );\n break;\n\n case \"error\":\n this.transport.send(\n formatNotification(ACP_METHODS.STREAM_ERROR, {\n sessionId,\n error: event.error.message,\n }),\n );\n break;\n\n case \"permission_request\":\n this.transport.send(\n formatNotification(ACP_METHODS.PERMISSION_REQUEST, {\n sessionId,\n toolName: event.toolName,\n input: event.input,\n message: event.message,\n }),\n );\n break;\n\n case \"user_input_request\":\n this.transport.send(\n formatNotification(ACP_METHODS.USER_INPUT_REQUEST, {\n sessionId,\n toolUseId: event.toolUseId,\n question: event.question,\n }),\n );\n break;\n }\n }\n\n private bridgePermission(\n sessionId: string,\n request: PermissionRequest,\n ): Promise<PermissionResponse> {\n return new Promise<PermissionResponse>((resolve) => {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.pendingPermission = { resolve };\n }\n });\n }\n\n private bridgeUserInput(\n sessionId: string,\n question: string,\n ): Promise<string> {\n return new Promise<string>((resolve) => {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.pendingInput = { resolve };\n }\n });\n }\n\n private handleClose(): void {\n for (const session of this.sessions.values()) {\n session.abortController?.abort();\n }\n this.sessions.clear();\n }\n}\n","/**\n * ACP stdio transport: newline-delimited JSON-RPC over stdin/stdout.\n */\n\nimport type { AcpTransport } from \"./types.js\";\n\nexport class StdioTransport implements AcpTransport {\n private messageHandler: ((message: unknown) => void) | null = null;\n private closeHandler: (() => void) | null = null;\n private buffer = \"\";\n private closed = false;\n\n constructor(\n private input: NodeJS.ReadableStream = process.stdin,\n private output: NodeJS.WritableStream = process.stdout,\n ) {\n this.input.setEncoding?.(\"utf-8\");\n this.input.on(\"data\", (chunk: string) => this.onData(chunk));\n this.input.on(\"end\", () => this.handleClose());\n this.input.on(\"error\", () => this.handleClose());\n }\n\n send(message: unknown): void {\n if (this.closed) return;\n const line = JSON.stringify(message) + \"\\n\";\n this.output.write(line);\n }\n\n onMessage(handler: (message: unknown) => void): void {\n this.messageHandler = handler;\n }\n\n onClose(handler: () => void): void {\n this.closeHandler = handler;\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.handleClose();\n }\n\n private onData(chunk: string): void {\n this.buffer += chunk;\n const lines = this.buffer.split(\"\\n\");\n this.buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const msg = JSON.parse(trimmed);\n this.messageHandler?.(msg);\n } catch {\n // Skip malformed lines (per ACP spec: agents may write to stderr for logs)\n }\n }\n }\n\n private handleClose(): void {\n this.closed = true;\n this.closeHandler?.();\n }\n}\n","/**\n * AcpClientSandbox: VirtualFs + VirtualComputer backed by the ACP client.\n *\n * In the ACP model, the **client** (editor/IDE) provides filesystem and\n * terminal access. This sandbox implementation sends JSON-RPC requests to\n * the client for every fs/shell operation. It's a natural fit for noumen's\n * pluggable sandbox architecture.\n */\n\nimport type { VirtualFs, FileEntry, FileStat, ReadOptions } from \"../virtual/fs.js\";\nimport type { VirtualComputer, ExecOptions, CommandResult } from \"../virtual/computer.js\";\nimport type { Sandbox } from \"../virtual/sandbox.js\";\nimport type { AcpTransport } from \"./types.js\";\nimport { ACP_METHODS } from \"./types.js\";\nimport {\n formatRequest,\n type JsonRpcResponse,\n} from \"../jsonrpc/index.js\";\n\nlet _nextId = 1;\n\nexport class AcpClientSandbox {\n readonly fs: AcpClientFs;\n readonly computer: AcpClientComputer;\n\n constructor(\n private transport: AcpTransport,\n private sendRequest: (method: string, params: unknown) => Promise<unknown>,\n ) {\n this.fs = new AcpClientFs(sendRequest);\n this.computer = new AcpClientComputer(sendRequest);\n }\n}\n\nclass AcpClientFs implements VirtualFs {\n constructor(\n private sendRequest: (method: string, params: unknown) => Promise<unknown>,\n ) {}\n\n async readFile(path: string, _opts?: ReadOptions): Promise<string> {\n const result = (await this.sendRequest(ACP_METHODS.FS_READ, { path })) as {\n content: string;\n };\n return result.content;\n }\n\n async readFileBytes(path: string, maxBytes?: number): Promise<Buffer> {\n const result = (await this.sendRequest(ACP_METHODS.FS_READ_BYTES, {\n path,\n maxBytes,\n })) as { data: string };\n return Buffer.from(result.data, \"base64\");\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n await this.sendRequest(ACP_METHODS.FS_WRITE, { path, content });\n }\n\n async appendFile(path: string, content: string): Promise<void> {\n let existing = \"\";\n try {\n existing = await this.readFile(path);\n } catch {\n // file may not exist\n }\n await this.writeFile(path, existing + content);\n }\n\n async deleteFile(\n path: string,\n opts?: { recursive?: boolean },\n ): Promise<void> {\n await this.sendRequest(ACP_METHODS.FS_DELETE, {\n path,\n recursive: opts?.recursive ?? false,\n });\n }\n\n async mkdir(path: string, opts?: { recursive?: boolean }): Promise<void> {\n await this.sendRequest(ACP_METHODS.FS_MKDIR, {\n path,\n recursive: opts?.recursive ?? false,\n });\n }\n\n async readdir(\n path: string,\n _opts?: { recursive?: boolean },\n ): Promise<FileEntry[]> {\n const result = (await this.sendRequest(ACP_METHODS.FS_READDIR, {\n path,\n })) as FileEntry[];\n return result;\n }\n\n async exists(path: string): Promise<boolean> {\n const result = (await this.sendRequest(ACP_METHODS.FS_EXISTS, {\n path,\n })) as boolean;\n return result;\n }\n\n async stat(path: string): Promise<FileStat> {\n const result = (await this.sendRequest(ACP_METHODS.FS_STAT, {\n path,\n })) as {\n size: number;\n isDirectory: boolean;\n isFile: boolean;\n modifiedAt?: string;\n };\n return {\n size: result.size,\n isDirectory: result.isDirectory,\n isFile: result.isFile,\n modifiedAt: result.modifiedAt ? new Date(result.modifiedAt) : undefined,\n };\n }\n}\n\nclass AcpClientComputer implements VirtualComputer {\n constructor(\n private sendRequest: (method: string, params: unknown) => Promise<unknown>,\n ) {}\n\n async executeCommand(\n command: string,\n opts?: ExecOptions,\n ): Promise<CommandResult> {\n const result = (await this.sendRequest(ACP_METHODS.TERMINAL_EXEC, {\n command,\n cwd: opts?.cwd,\n timeout: opts?.timeout,\n })) as { exitCode: number; stdout: string; stderr: string };\n return {\n exitCode: result.exitCode,\n stdout: result.stdout,\n stderr: result.stderr,\n };\n }\n}\n","/**\n * ACP (Agent Client Protocol) adapter for noumen.\n *\n * Usage:\n * import { createAcpServer, StdioTransport, AcpClientSandbox } from \"noumen/acp\";\n *\n * // Stdio mode (editor launches agent as subprocess)\n * const transport = new StdioTransport();\n * const handler = createAcpServer(code, transport);\n *\n * // Or use AcpClientSandbox to let the client provide fs/terminal\n * const sandbox = new AcpClientSandbox(transport, handler.sendClientRequest);\n * const agent = new Agent({ provider, sandbox });\n */\n\nexport { AcpHandler, type AcpHandlerOptions } from \"./handler.js\";\nexport { StdioTransport } from \"./transport-stdio.js\";\nexport { AcpClientSandbox } from \"./client-sandbox.js\";\nexport {\n type AcpTransport,\n type AcpCapabilities,\n type AcpInitializeParams,\n type AcpInitializeResult,\n type AcpSessionNewParams,\n type AcpSessionPromptParams,\n ACP_METHODS,\n} from \"./types.js\";\n\nimport type { Agent } from \"../agent.js\";\nimport type { AcpTransport } from \"./types.js\";\nimport { AcpHandler, type AcpHandlerOptions } from \"./handler.js\";\n\n/**\n * Create an ACP server that bridges an ACP transport to an Agent instance.\n */\nexport function createAcpServer(\n code: Agent,\n transport: AcpTransport,\n options?: AcpHandlerOptions,\n): AcpHandler {\n return new AcpHandler(code, transport, options);\n}\n"],"mappings":"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","names":[]}