noumen 0.6.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/README.md +237 -93
  2. package/dist/a2a/index.d.ts +5 -7
  3. package/dist/a2a/index.js +3 -4
  4. package/dist/a2a/index.js.map +1 -1
  5. package/dist/acp/index.d.ts +5 -7
  6. package/dist/acp/index.js +0 -1
  7. package/dist/acp/index.js.map +1 -1
  8. package/dist/{agent-DWE4_P5X.d.ts → agent-zlDCYHJx.d.ts} +89 -34
  9. package/dist/{chunk-6MMYCGJQ.js → chunk-3XBCLWJY.js} +1805 -2583
  10. package/dist/chunk-3XBCLWJY.js.map +1 -0
  11. package/dist/chunk-BC5BLWBC.js +21 -0
  12. package/dist/chunk-BC5BLWBC.js.map +1 -0
  13. package/dist/{chunk-XZN4QZLK.js → chunk-CX4BL6PC.js} +25 -15
  14. package/dist/chunk-CX4BL6PC.js.map +1 -0
  15. package/dist/chunk-G4POJ6LL.js +660 -0
  16. package/dist/chunk-G4POJ6LL.js.map +1 -0
  17. package/dist/{chunk-5GEX6ZSB.js → chunk-HQISH4D7.js} +60 -1
  18. package/dist/chunk-HQISH4D7.js.map +1 -0
  19. package/dist/{chunk-Y45R3PQL.js → chunk-NUCJXOUV.js} +32 -18
  20. package/dist/{chunk-Y45R3PQL.js.map → chunk-NUCJXOUV.js.map} +1 -1
  21. package/dist/chunk-OPFFLQZL.js +40 -0
  22. package/dist/chunk-OPFFLQZL.js.map +1 -0
  23. package/dist/chunk-PKHLGGEC.js +115 -0
  24. package/dist/chunk-PKHLGGEC.js.map +1 -0
  25. package/dist/chunk-XQTNXRE7.js +176 -0
  26. package/dist/chunk-XQTNXRE7.js.map +1 -0
  27. package/dist/chunk-XZPAA5TO.js +817 -0
  28. package/dist/chunk-XZPAA5TO.js.map +1 -0
  29. package/dist/cli/index.js +77 -42
  30. package/dist/cli/index.js.map +1 -1
  31. package/dist/client/index.d.ts +1 -2
  32. package/dist/client/index.js +0 -2
  33. package/dist/client/index.js.map +1 -1
  34. package/dist/client-JJFLE6RT.js +9 -0
  35. package/dist/{computer-BPdxSo6X.d.ts → computer-DzMR92tK.d.ts} +1 -1
  36. package/dist/docker.d.ts +2 -2
  37. package/dist/docker.js +0 -1
  38. package/dist/docker.js.map +1 -1
  39. package/dist/e2b.d.ts +2 -2
  40. package/dist/e2b.js +0 -1
  41. package/dist/e2b.js.map +1 -1
  42. package/dist/freestyle.d.ts +2 -2
  43. package/dist/freestyle.js +0 -1
  44. package/dist/freestyle.js.map +1 -1
  45. package/dist/{headless-FFU2DESQ.js → headless-25DU4MJQ.js} +1 -3
  46. package/dist/{headless-FFU2DESQ.js.map → headless-25DU4MJQ.js.map} +1 -1
  47. package/dist/{history-snip-64GYP4ZL.js → history-snip-HAWNAYKY.js} +1 -2
  48. package/dist/index.d.ts +351 -72
  49. package/dist/index.js +54 -55
  50. package/dist/jsonrpc/index.js +0 -1
  51. package/dist/local.d.ts +168 -0
  52. package/dist/local.js +40 -0
  53. package/dist/local.js.map +1 -0
  54. package/dist/lsp/index.d.ts +4 -5
  55. package/dist/lsp/index.js +0 -1
  56. package/dist/{lsp-PS3BWIHC.js → lsp-3APWNKB2.js} +1 -2
  57. package/dist/{manager-DLXK63XC.js → manager-Z5EQ7YYV.js} +1 -2
  58. package/dist/mcp/index.d.ts +16 -8
  59. package/dist/mcp/index.js +5 -6
  60. package/dist/mcp/index.js.map +1 -1
  61. package/dist/{mcp-auth-AEI2R4ZC.js → mcp-auth-NOIQPF7W.js} +1 -2
  62. package/dist/{provider-factory-TUHU3DIG.js → provider-factory-KNBSHXJ6.js} +3 -3
  63. package/dist/{render-GRN4ZSSW.js → render-4VEODRK7.js} +1 -2
  64. package/dist/{resolve-6KUZNEYW.js → resolve-AGQZFMKD.js} +3 -3
  65. package/dist/sandbox-DAqQo0Tj.d.ts +49 -0
  66. package/dist/sandbox-index-ODNREIFA.js +32 -0
  67. package/dist/sandbox-index-ODNREIFA.js.map +1 -0
  68. package/dist/server/index.d.ts +18 -7
  69. package/dist/server/index.js +9 -5
  70. package/dist/server/index.js.map +1 -1
  71. package/dist/{server-BzNGKTP6.d.ts → server-BO0C1LfY.d.ts} +1 -1
  72. package/dist/{spinner-OJNR6NFO.js → spinner-72JEISPK.js} +1 -2
  73. package/dist/sprites.d.ts +2 -2
  74. package/dist/sprites.js +0 -1
  75. package/dist/sprites.js.map +1 -1
  76. package/dist/ssh.d.ts +2 -2
  77. package/dist/ssh.js +0 -1
  78. package/dist/ssh.js.map +1 -1
  79. package/dist/{types-DhXwOQwD.d.ts → types-BRo-F0M-.d.ts} +89 -6
  80. package/dist/{types-kiGBF35b.d.ts → types-DLZNyF5t.d.ts} +125 -1
  81. package/dist/unsandboxed.d.ts +59 -0
  82. package/dist/unsandboxed.js +32 -0
  83. package/dist/unsandboxed.js.map +1 -0
  84. package/dist/{uuid-RVN2T26F.js → uuid-CVTNAPEB.js} +1 -2
  85. package/dist/{zod-7YXKWYMC.js → zod-VKURGPRT.js} +1 -2
  86. package/package.json +35 -50
  87. package/dist/cache-BlBwXXPS.d.ts +0 -38
  88. package/dist/chunk-5GEX6ZSB.js.map +0 -1
  89. package/dist/chunk-6MMYCGJQ.js.map +0 -1
  90. package/dist/chunk-7IQCQI2G.js +0 -94
  91. package/dist/chunk-7IQCQI2G.js.map +0 -1
  92. package/dist/chunk-CCM2AXZG.js +0 -16
  93. package/dist/chunk-CCM2AXZG.js.map +0 -1
  94. package/dist/chunk-DGUM43GV.js +0 -11
  95. package/dist/chunk-HEQQQGK5.js +0 -131
  96. package/dist/chunk-HEQQQGK5.js.map +0 -1
  97. package/dist/chunk-I3JTUFPK.js +0 -171
  98. package/dist/chunk-I3JTUFPK.js.map +0 -1
  99. package/dist/chunk-XZN4QZLK.js.map +0 -1
  100. package/dist/chunk-ZXSDKBYB.js +0 -474
  101. package/dist/chunk-ZXSDKBYB.js.map +0 -1
  102. package/dist/client-CRRO2376.js +0 -10
  103. package/dist/providers/anthropic.d.ts +0 -19
  104. package/dist/providers/anthropic.js +0 -36
  105. package/dist/providers/anthropic.js.map +0 -1
  106. package/dist/providers/bedrock.d.ts +0 -39
  107. package/dist/providers/bedrock.js +0 -56
  108. package/dist/providers/bedrock.js.map +0 -1
  109. package/dist/providers/gemini.d.ts +0 -17
  110. package/dist/providers/gemini.js +0 -262
  111. package/dist/providers/gemini.js.map +0 -1
  112. package/dist/providers/ollama.d.ts +0 -13
  113. package/dist/providers/ollama.js +0 -20
  114. package/dist/providers/ollama.js.map +0 -1
  115. package/dist/providers/openai.d.ts +0 -21
  116. package/dist/providers/openai.js +0 -9
  117. package/dist/providers/openrouter.d.ts +0 -16
  118. package/dist/providers/openrouter.js +0 -24
  119. package/dist/providers/openrouter.js.map +0 -1
  120. package/dist/providers/vertex.d.ts +0 -42
  121. package/dist/providers/vertex.js +0 -68
  122. package/dist/providers/vertex.js.map +0 -1
  123. package/dist/sandbox-9qeMTNrD.d.ts +0 -126
  124. package/dist/types-CD0rUKKT.d.ts +0 -109
  125. package/dist/uuid-RVN2T26F.js.map +0 -1
  126. package/dist/zod-7YXKWYMC.js.map +0 -1
  127. /package/dist/{chunk-DGUM43GV.js.map → client-JJFLE6RT.js.map} +0 -0
  128. /package/dist/{client-CRRO2376.js.map → history-snip-HAWNAYKY.js.map} +0 -0
  129. /package/dist/{history-snip-64GYP4ZL.js.map → lsp-3APWNKB2.js.map} +0 -0
  130. /package/dist/{lsp-PS3BWIHC.js.map → manager-Z5EQ7YYV.js.map} +0 -0
  131. /package/dist/{manager-DLXK63XC.js.map → mcp-auth-NOIQPF7W.js.map} +0 -0
  132. /package/dist/{mcp-auth-AEI2R4ZC.js.map → provider-factory-KNBSHXJ6.js.map} +0 -0
  133. /package/dist/{provider-factory-TUHU3DIG.js.map → render-4VEODRK7.js.map} +0 -0
  134. /package/dist/{providers/openai.js.map → resolve-AGQZFMKD.js.map} +0 -0
  135. /package/dist/{render-GRN4ZSSW.js.map → spinner-72JEISPK.js.map} +0 -0
  136. /package/dist/{resolve-6KUZNEYW.js.map → uuid-CVTNAPEB.js.map} +0 -0
  137. /package/dist/{spinner-OJNR6NFO.js.map → zod-VKURGPRT.js.map} +0 -0
@@ -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 = 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
+ {"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,12 +1,10 @@
1
- import { A as Agent } from '../agent-DWE4_P5X.js';
1
+ import { a as Agent } from '../agent-zlDCYHJx.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 { a as VirtualFs, R as ReadOptions, F as FileEntry, b as FileStat, V as VirtualComputer, E as ExecOptions, C as CommandResult } from '../computer-BPdxSo6X.js';
5
- import '../types-kiGBF35b.js';
6
- import '../sandbox-9qeMTNrD.js';
7
- import '../types-DhXwOQwD.js';
8
- import '../types-CD0rUKKT.js';
9
- import '../cache-BlBwXXPS.js';
4
+ import { V as VirtualFs, R as ReadOptions, F as FileEntry, b as FileStat, a as VirtualComputer, E as ExecOptions, C as CommandResult } from '../computer-DzMR92tK.js';
5
+ import '../types-DLZNyF5t.js';
6
+ import '../sandbox-DAqQo0Tj.js';
7
+ import '../types-BRo-F0M-.js';
10
8
  import '../types-2kTLUCnD.js';
11
9
  import '@modelcontextprotocol/sdk/client/index.js';
12
10
  import '@modelcontextprotocol/sdk/client/auth.js';
package/dist/acp/index.js CHANGED
@@ -10,7 +10,6 @@ import {
10
10
  import {
11
11
  contentToString
12
12
  } from "../chunk-JACGEMTF.js";
13
- import "../chunk-DGUM43GV.js";
14
13
 
15
14
  // src/acp/types.ts
16
15
  var ACP_METHODS = {
@@ -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 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":[]}
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":[]}
@@ -1,10 +1,21 @@
1
- import { A as AIProvider, b as ChatMessage, S as StreamEvent, E as Entry, U as UUID, d as FileCheckpointSnapshot, f as ContentReplacementRecord$1, g as SessionInfo, M as ModelPricing, h as UsageRecord, i as CostSummary, j as ModelUsageSummary, k as ChatCompletionUsage, l as ThinkingConfig, m as MemoryConfig, O as OutputFormat, e as ContentPart, R as RunOptions, c as CheckpointConfig, n as ToolResult } from './types-kiGBF35b.js';
2
- import { S as Sandbox } from './sandbox-9qeMTNrD.js';
3
- import { T as Tool, H as HookDefinition, S as SubagentConfig, i as SubagentRun, j as TaskStore, e as LspServerManager, F as FileCheckpointManager, k as FileStateCacheConfig, L as LspServerConfig } from './types-DhXwOQwD.js';
4
- import { C as CacheControlConfig } from './cache-BlBwXXPS.js';
1
+ import { A as AIProvider, e as ChatMessage, T as ToolDefinition, S as StreamEvent, E as Entry, U as UUID, a as FileCheckpointSnapshot, f as ContentReplacementRecord$1, g as SessionInfo, M as ModelPricing, h as UsageRecord, i as CostSummary, j as ModelUsageSummary, k as ChatCompletionUsage, l as PermissionHandler, m as PermissionConfig, n as ThinkingConfig, o as MemoryConfig, O as OutputFormat, d as ContentPart, R as RunOptions, C as CheckpointConfig, p as ToolResult } from './types-DLZNyF5t.js';
2
+ import { S as Sandbox } from './sandbox-DAqQo0Tj.js';
3
+ import { T as Tool, j as DotDirConfig, H as HookDefinition, S as SubagentConfig, k as SubagentRun, l as TaskStore, e as LspServerManager, F as FileCheckpointManager, m as FileStateCacheConfig, i as DotDirResolver, L as LspServerConfig } from './types-BRo-F0M-.js';
5
4
  import { M as McpServerConfig, T as TokenStorage } from './types-2kTLUCnD.js';
6
- import { c as PermissionHandler, d as PermissionConfig } from './types-CD0rUKKT.js';
7
- import { a as VirtualFs, V as VirtualComputer } from './computer-BPdxSo6X.js';
5
+ import { V as VirtualFs, a as VirtualComputer } from './computer-DzMR92tK.js';
6
+
7
+ /**
8
+ * CLI-facing provider resolver.
9
+ *
10
+ * Builds an `AiSdkProvider` wrapping any Vercel AI SDK `LanguageModelV3`.
11
+ * Each vendor SDK is dynamically imported so CLI users only need to install
12
+ * the packages for the providers they actually use.
13
+ *
14
+ * Programmatic callers should prefer constructing `AiSdkProvider` directly
15
+ * with their own language model — that path supports metering proxies,
16
+ * bespoke auth, and any other knob the AI SDK exposes. This resolver exists
17
+ * so `noumen <provider>` still works out of the box.
18
+ */
8
19
 
9
20
  type ProviderName = "openai" | "anthropic" | "gemini" | "openrouter" | "bedrock" | "vertex" | "ollama";
10
21
  declare const DEFAULT_MODELS: Record<string, string>;
@@ -16,10 +27,11 @@ interface ResolveProviderOptions {
16
27
  }
17
28
  /**
18
29
  * Resolve a provider from a name string or pass through an AIProvider instance.
30
+ *
19
31
  * API key resolution order:
20
- * 1. Explicit apiKey option
21
- * 2. Provider-specific env var (OPENAI_API_KEY, etc.)
22
- * 3. NOUMEN_API_KEY generic env var
32
+ * 1. Explicit `apiKey` option
33
+ * 2. Provider-specific env var (`OPENAI_API_KEY`, etc.)
34
+ * 3. `NOUMEN_API_KEY` generic env var
23
35
  */
24
36
  declare function resolveProvider(input: AIProvider | ProviderName, opts?: ResolveProviderOptions): Promise<AIProvider>;
25
37
  /**
@@ -100,11 +112,6 @@ declare function extractTitleSeedText(messages: ChatMessage[], maxChars?: number
100
112
  * correctly — the previous regex only handled `\"`.
101
113
  */
102
114
  declare function extractTitleFromResponse(raw: string): string | null;
103
- /**
104
- * Drive the provider once to produce a session title. Returns null on
105
- * empty seed text, empty model output, or provider errors (callers decide
106
- * whether to retry — this helper never throws).
107
- */
108
115
  declare function generateAutoTitle(messages: ChatMessage[], opts: GenerateAutoTitleOptions): Promise<string | null>;
109
116
  /**
110
117
  * Trim, collapse whitespace, strip wrapping quotes, clamp length.
@@ -128,6 +135,41 @@ interface SkillDefinition {
128
135
  argumentHint?: string;
129
136
  }
130
137
 
138
+ /**
139
+ * Provider-agnostic prompt caching utilities.
140
+ *
141
+ * Stable tool ordering prevents cache invalidation when the tool set is
142
+ * unchanged. The breakpoint index helper determines which message gets a
143
+ * single cache_control marker per request (matching claude-code's strategy).
144
+ */
145
+
146
+ type CacheScope = "global" | "org";
147
+ interface CacheControlConfig {
148
+ enabled: boolean;
149
+ /** TTL for cached content. When set, produces `ttl: '1h'` in cache_control. */
150
+ ttl?: "1h";
151
+ /** Scope for shared cache across sessions/orgs. */
152
+ scope?: CacheScope;
153
+ }
154
+ /**
155
+ * Sort tool definitions deterministically for prompt cache stability.
156
+ *
157
+ * Strategy (matching claude-code's assembleToolPool): built-in tools form a
158
+ * contiguous prefix sorted by name, followed by MCP/external tools sorted by
159
+ * name. Tools with `mcpInfo` on the original Tool object are treated as MCP;
160
+ * everything else is built-in. Since ToolDefinition doesn't carry mcpInfo,
161
+ * callers can pass an optional set of MCP tool names to partition correctly.
162
+ */
163
+ declare function sortToolDefinitionsForCache(tools: ToolDefinition[], mcpToolNames?: ReadonlySet<string>): ToolDefinition[];
164
+ /**
165
+ * Determine which message index should receive the cache_control breakpoint.
166
+ *
167
+ * Exactly one message per request is marked. Normally the last message;
168
+ * for forked agents with skipCacheWrite the second-to-last so the fork
169
+ * doesn't write its own tail into the cache.
170
+ */
171
+ declare function getMessageCacheBreakpointIndex(messages: ChatMessage[], skipCacheWrite?: boolean): number;
172
+
131
173
  interface WebSearchResult {
132
174
  title: string;
133
175
  url: string;
@@ -498,8 +540,16 @@ interface ProjectContextConfig {
498
540
  excludes?: string[];
499
541
  /** Maximum include depth for @ references. Default: 5. */
500
542
  maxIncludeDepth?: number;
501
- /** Whether to load .claude/ files in addition to .noumen/ files. Default: true. */
502
- loadClaudeMd?: boolean;
543
+ /**
544
+ * Dot-directory names to scan for `<NAME>.md`, `<NAME>.local.md`, and
545
+ * `<dotDir>/rules/**`. Defaults to `{ names: [".noumen", ".claude"] }`.
546
+ *
547
+ * Markdown filenames derive from the dot-dir name: `.noumen` →
548
+ * `NOUMEN.md` / `NOUMEN.local.md`, `.claude` → `CLAUDE.md` /
549
+ * `CLAUDE.local.md`. The dir name (minus the leading dot, uppercased)
550
+ * is the filename stem.
551
+ */
552
+ dotDirs?: DotDirConfig;
503
553
  /** Enable loading user-scope context from homeDir. Default: true. */
504
554
  loadUserContext?: boolean;
505
555
  /** Enable loading project-scope context from cwd ancestors. Default: true. */
@@ -624,6 +674,8 @@ interface ThreadConfig {
624
674
  mcpToolNames?: ReadonlySet<string>;
625
675
  /** Loaded project context files (NOUMEN.md / CLAUDE.md) for system prompt injection. */
626
676
  projectContext?: ContextFile[];
677
+ /** Dot-directory resolver — threaded to tools that write under dotdirs (e.g. worktrees). */
678
+ dotDirResolver?: DotDirResolver;
627
679
  /** Default structured output format for all runs on this thread. */
628
680
  outputFormat?: OutputFormat;
629
681
  /** Default structured output mode for all runs on this thread. */
@@ -728,20 +780,15 @@ interface AgentOptions {
728
780
  * `createThread()`, or `init()`.
729
781
  */
730
782
  provider: AIProvider | ProviderName;
731
- /**
732
- * Working directory. When set without an explicit `sandbox`, an
733
- * `UnsandboxedLocal({ cwd })` is created automatically.
734
- */
783
+ /** Working directory. Used for path resolution inside the agent. */
735
784
  cwd?: string;
736
785
  /**
737
786
  * Bundled sandbox providing both filesystem and shell execution.
787
+ * Required — the root barrel deliberately doesn't pull in a default
788
+ * implementation, so callers must pick a backend explicitly:
738
789
  *
739
- * Local backends live on the root barrel:
740
- * - `LocalSandbox()` — OS-level sandboxing (requires `@anthropic-ai/sandbox-runtime`).
741
- * - `UnsandboxedLocal()` — raw host access.
742
- *
743
- * Remote backends are subpath imports so their optional peer deps do
744
- * not enter the module graph unless opted into:
790
+ * - `import { UnsandboxedLocal } from "noumen/unsandboxed"` — raw host access.
791
+ * - `import { LocalSandbox } from "noumen/local"` — OS-level sandboxing.
745
792
  * - `import { DockerSandbox } from "noumen/docker"`
746
793
  * - `import { E2BSandbox } from "noumen/e2b"`
747
794
  * - `import { FreestyleSandbox } from "noumen/freestyle"`
@@ -749,13 +796,13 @@ interface AgentOptions {
749
796
  * - `import { SpritesSandbox } from "noumen/sprites"`
750
797
  *
751
798
  * You can also pass any `{ fs: VirtualFs; computer: VirtualComputer }`
752
- * for custom sandboxes.
753
- *
754
- * Defaults to `UnsandboxedLocal({ cwd })` when omitted — the library
755
- * default is non-sandboxed for backward compatibility. The CLI defaults
756
- * to `LocalSandbox()` when sandbox-runtime is available.
799
+ * for custom sandboxes. Keeping this required ensures that importing
800
+ * the root barrel (`codingAgent`, `Agent`, …) never transitively pulls
801
+ * in `node:fs/promises` or `node:child_process` from the unsandboxed
802
+ * local adapter which would bloat bundlers' dependency traces (NFT
803
+ * etc.) in apps that only use a remote sandbox.
757
804
  */
758
- sandbox?: Sandbox;
805
+ sandbox: Sandbox;
759
806
  options?: {
760
807
  sessionDir?: string;
761
808
  skills?: SkillDefinition[];
@@ -808,6 +855,14 @@ interface AgentOptions {
808
855
  historySnip?: SnipConfig;
809
856
  /** Project context loading (NOUMEN.md / CLAUDE.md). Pass true for defaults or a config object. */
810
857
  projectContext?: ProjectContextConfig | boolean;
858
+ /**
859
+ * Dot-directory configuration — controls which hidden directories are
860
+ * recognized for config, sessions, tasks, checkpoints, rules, skills,
861
+ * MCP tokens, and worktrees. Defaults to `{ names: [".noumen", ".claude"] }`
862
+ * with `.noumen` as the canonical write target. Applies to both project
863
+ * scope (cwd ancestors) and user scope (home directory).
864
+ */
865
+ dotDirs?: DotDirConfig;
811
866
  /** Default structured output format for all threads. */
812
867
  outputFormat?: OutputFormat;
813
868
  /** Default structured output mode for all threads. */
@@ -889,6 +944,7 @@ declare class Agent {
889
944
  private toolSearchEnabled;
890
945
  private projectContextConfig?;
891
946
  private resolvedProjectContext;
947
+ private dotDirResolver;
892
948
  private checkpointManager;
893
949
  private promptCachingConfig;
894
950
  private fileStateCacheConfig;
@@ -1004,7 +1060,6 @@ declare class Agent {
1004
1060
  * @param timeoutMs Per-check timeout in milliseconds (default 10 000).
1005
1061
  */
1006
1062
  diagnose(timeoutMs?: number): Promise<DiagnoseResult>;
1007
- private get sandboxIndexPath();
1008
1063
  private loadSandboxId;
1009
1064
  private storeSandboxId;
1010
1065
  /**
@@ -1013,4 +1068,4 @@ declare class Agent {
1013
1068
  close(): Promise<void>;
1014
1069
  }
1015
1070
 
1016
- export { type WebSearchResult as $, Agent as A, type BudgetState as B, type ContextFile as C, DEFAULT_AUTO_TITLE_MAX_INPUT_CHARS as D, type ReactiveCompactResult as E, type ResolveProviderOptions as F, type GenerateAutoTitleOptions as G, type RetryEvent as H, type RunCallbacks as I, type RunResult as J, SUPPORTED_PROVIDERS as K, type SnipConfig as L, type MicrocompactConfig as M, type SnipResult as N, Thread as O, type ProjectContextConfig as P, type ThreadOptions as Q, type RetryConfig as R, type SkillDefinition as S, type ThreadConfig as T, type ToolResultBudgetConfig as U, type ToolResultBudgetResult as V, type ContentReplacementRecord as W, type ToolResultSpillResult as X, type ToolResultStorageConfig as Y, type TracingConfig as Z, type WebSearchConfig as _, type AutoTitleConfig as a, applyPersistedReplacements as a0, applySnipRemovals as a1, canAutoCompact as a2, createAutoCompactConfig as a3, createAutoCompactTracking as a4, createBudgetState as a5, createContentReplacementState as a6, createWebSearchTool as a7, detectProvider as a8, enforceToolResultBudget as a9, enforceToolResultStorageBudget as aa, extractTitleFromResponse as ab, extractTitleSeedText as ac, generateAutoTitle as ad, microcompactMessages as ae, normalizeTitle as af, persistToolResult as ag, projectSnippedView as ah, reconstructContentReplacementState as ai, recordAutoCompactFailure as aj, recordAutoCompactSuccess as ak, resolveProvider as al, shouldAutoCompact as am, snipMessagesByUuids as an, tryReactiveCompact as ao, webSearchToolPlaceholder as ap, SessionStorage as b, type ContextScope as c, type RetryContext as d, type RetryEngineOptions as e, type Span as f, type SpanAttributeValue as g, SpanStatusCode as h, type Tracer as i, type SpanOptions as j, type StoredCostState as k, type AgentOptions as l, type AutoCompactConfig as m, type AutoCompactTrackingState as n, CLEARED_PLACEHOLDER as o, COMPACTABLE_TOOLS as p, type ContentReplacementState as q, CostTracker as r, DEFAULT_AUTO_TITLE_SYSTEM_PROMPT as s, DEFAULT_MODELS as t, DEFAULT_RETRY_CONFIG as u, type DiagnoseCheckResult as v, type DiagnoseResult as w, type MicrocompactResult as x, type ProviderName as y, type ReactiveCompactConfig as z };
1071
+ export { type TracingConfig as $, type AgentOptions as A, type BudgetState as B, type CacheControlConfig as C, DEFAULT_AUTO_TITLE_MAX_INPUT_CHARS as D, type ProviderName as E, type ReactiveCompactConfig as F, type GenerateAutoTitleOptions as G, type ReactiveCompactResult as H, type ResolveProviderOptions as I, type RetryEvent as J, type RunCallbacks as K, type RunResult as L, type MicrocompactConfig as M, SUPPORTED_PROVIDERS as N, type SnipConfig as O, type ProjectContextConfig as P, type SnipResult as Q, type RetryConfig as R, type SkillDefinition as S, type ThreadConfig as T, Thread as U, type ThreadOptions as V, type ToolResultBudgetConfig as W, type ToolResultBudgetResult as X, type ContentReplacementRecord as Y, type ToolResultSpillResult as Z, type ToolResultStorageConfig as _, Agent as a, type WebSearchConfig as a0, type WebSearchResult as a1, applyPersistedReplacements as a2, applySnipRemovals as a3, canAutoCompact as a4, createAutoCompactConfig as a5, createAutoCompactTracking as a6, createBudgetState as a7, createContentReplacementState as a8, createWebSearchTool as a9, detectProvider as aa, enforceToolResultBudget as ab, enforceToolResultStorageBudget as ac, extractTitleFromResponse as ad, extractTitleSeedText as ae, generateAutoTitle as af, getMessageCacheBreakpointIndex as ag, microcompactMessages as ah, normalizeTitle as ai, persistToolResult as aj, projectSnippedView as ak, reconstructContentReplacementState as al, recordAutoCompactFailure as am, recordAutoCompactSuccess as an, resolveProvider as ao, shouldAutoCompact as ap, snipMessagesByUuids as aq, sortToolDefinitionsForCache as ar, tryReactiveCompact as as, webSearchToolPlaceholder as at, type AutoTitleConfig as b, SessionStorage as c, type ContextFile as d, type ContextScope as e, type RetryContext as f, type RetryEngineOptions as g, type Span as h, type SpanAttributeValue as i, SpanStatusCode as j, type Tracer as k, type SpanOptions as l, type StoredCostState as m, type AutoCompactConfig as n, type AutoCompactTrackingState as o, CLEARED_PLACEHOLDER as p, COMPACTABLE_TOOLS as q, type CacheScope as r, type ContentReplacementState as s, CostTracker as t, DEFAULT_AUTO_TITLE_SYSTEM_PROMPT as u, DEFAULT_MODELS as v, DEFAULT_RETRY_CONFIG as w, type DiagnoseCheckResult as x, type DiagnoseResult as y, type MicrocompactResult as z };