noumen 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +767 -51
- package/dist/a2a/index.d.ts +148 -0
- package/dist/a2a/index.js +579 -0
- package/dist/a2a/index.js.map +1 -0
- package/dist/acp/index.d.ts +129 -0
- package/dist/acp/index.js +498 -0
- package/dist/acp/index.js.map +1 -0
- package/dist/agent-BrkbZyOT.d.ts +1028 -0
- package/dist/cache-DVqaCX8v.d.ts +38 -0
- package/dist/chunk-2ZTGQLYK.js +356 -0
- package/dist/chunk-2ZTGQLYK.js.map +1 -0
- package/dist/chunk-42PHHZUA.js +132 -0
- package/dist/chunk-42PHHZUA.js.map +1 -0
- package/dist/chunk-4SQA2UCV.js +26 -0
- package/dist/chunk-4SQA2UCV.js.map +1 -0
- package/dist/chunk-5GEX6ZSB.js +179 -0
- package/dist/chunk-5GEX6ZSB.js.map +1 -0
- package/dist/chunk-7ZMN7XJE.js +94 -0
- package/dist/chunk-7ZMN7XJE.js.map +1 -0
- package/dist/chunk-AMYIJSAZ.js +57 -0
- package/dist/chunk-AMYIJSAZ.js.map +1 -0
- package/dist/chunk-BGG2E6JD.js +10 -0
- package/dist/chunk-BGG2E6JD.js.map +1 -0
- package/dist/chunk-BZSFUEWM.js +43 -0
- package/dist/chunk-BZSFUEWM.js.map +1 -0
- package/dist/chunk-CPFHEPW4.js +139 -0
- package/dist/chunk-CPFHEPW4.js.map +1 -0
- package/dist/chunk-D43BWEZA.js +346 -0
- package/dist/chunk-D43BWEZA.js.map +1 -0
- package/dist/chunk-DGUM43GV.js +11 -0
- package/dist/chunk-DGUM43GV.js.map +1 -0
- package/dist/chunk-JACGEMTF.js +43 -0
- package/dist/chunk-JACGEMTF.js.map +1 -0
- package/dist/chunk-JX7CLUCV.js +21 -0
- package/dist/chunk-JX7CLUCV.js.map +1 -0
- package/dist/chunk-KXDB56YW.js +39 -0
- package/dist/chunk-KXDB56YW.js.map +1 -0
- package/dist/chunk-KY6ZPWHO.js +112 -0
- package/dist/chunk-KY6ZPWHO.js.map +1 -0
- package/dist/chunk-NBDFQYUZ.js +7992 -0
- package/dist/chunk-NBDFQYUZ.js.map +1 -0
- package/dist/chunk-OGXNFXFA.js +196 -0
- package/dist/chunk-OGXNFXFA.js.map +1 -0
- package/dist/chunk-QTJ7VTJY.js +1994 -0
- package/dist/chunk-QTJ7VTJY.js.map +1 -0
- package/dist/chunk-UVSSQBDY.js +192 -0
- package/dist/chunk-UVSSQBDY.js.map +1 -0
- package/dist/chunk-Y45R3PQL.js +684 -0
- package/dist/chunk-Y45R3PQL.js.map +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +868 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/client/index.d.ts +64 -0
- package/dist/client/index.js +409 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client-CRRO2376.js +10 -0
- package/dist/client-CRRO2376.js.map +1 -0
- package/dist/headless-Q7XHHZIW.js +143 -0
- package/dist/headless-Q7XHHZIW.js.map +1 -0
- package/dist/history-snip-64GYP4ZL.js +12 -0
- package/dist/history-snip-64GYP4ZL.js.map +1 -0
- package/dist/index.d.ts +1305 -418
- package/dist/index.js +384 -1757
- package/dist/index.js.map +1 -1
- package/dist/jsonrpc/index.d.ts +54 -0
- package/dist/jsonrpc/index.js +34 -0
- package/dist/jsonrpc/index.js.map +1 -0
- package/dist/lsp/index.d.ts +36 -0
- package/dist/lsp/index.js +16 -0
- package/dist/lsp/index.js.map +1 -0
- package/dist/lsp-PS3BWIHC.js +8 -0
- package/dist/lsp-PS3BWIHC.js.map +1 -0
- package/dist/manager-DLXK63XC.js +8 -0
- package/dist/manager-DLXK63XC.js.map +1 -0
- package/dist/mcp/index.d.ts +111 -0
- package/dist/mcp/index.js +104 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp-auth-AEI2R4ZC.js +9 -0
- package/dist/mcp-auth-AEI2R4ZC.js.map +1 -0
- package/dist/ollama-YNXAYP3R.js +18 -0
- package/dist/ollama-YNXAYP3R.js.map +1 -0
- package/dist/provider-factory-34MSWJZ3.js +20 -0
- package/dist/provider-factory-34MSWJZ3.js.map +1 -0
- package/dist/providers/anthropic.d.ts +19 -0
- package/dist/providers/anthropic.js +33 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/bedrock.d.ts +39 -0
- package/dist/providers/bedrock.js +54 -0
- package/dist/providers/bedrock.js.map +1 -0
- package/dist/providers/gemini.d.ts +16 -0
- package/dist/providers/gemini.js +224 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/openai.d.ts +18 -0
- package/dist/providers/openai.js +8 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/openrouter.d.ts +16 -0
- package/dist/providers/openrouter.js +23 -0
- package/dist/providers/openrouter.js.map +1 -0
- package/dist/providers/vertex.d.ts +40 -0
- package/dist/providers/vertex.js +64 -0
- package/dist/providers/vertex.js.map +1 -0
- package/dist/render-GRN4ZSSW.js +14 -0
- package/dist/render-GRN4ZSSW.js.map +1 -0
- package/dist/resolve-XM52G7YE.js +14 -0
- package/dist/resolve-XM52G7YE.js.map +1 -0
- package/dist/server/index.d.ts +128 -0
- package/dist/server/index.js +626 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server-Cg1yWGaV.d.ts +96 -0
- package/dist/spinner-OJNR6NFO.js +8 -0
- package/dist/spinner-OJNR6NFO.js.map +1 -0
- package/dist/types-2kTLUCnD.d.ts +107 -0
- package/dist/types-3c88cRKH.d.ts +547 -0
- package/dist/types-CwKKucOF.d.ts +620 -0
- package/dist/types-DwdzmXfs.d.ts +107 -0
- package/dist/types-NIyVwQ4h.d.ts +109 -0
- package/dist/types-QwfylltH.d.ts +71 -0
- package/package.json +134 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/acp/types.ts","../../src/acp/handler.ts","../../src/acp/transport-stdio.ts","../../src/acp/client-sandbox.ts","../../src/acp/index.ts"],"sourcesContent":["/**\n * ACP (Agent Client Protocol) types.\n *\n * ACP is a JSON-RPC 2.0 protocol (like LSP) for communication between\n * clients (editors, UIs) and AI coding agents over stdio or HTTP.\n */\n\n// ── Capability negotiation ──────────────────────────────────────────────────\n\nexport interface AcpCapabilities {\n streaming?: boolean;\n permissions?: boolean;\n tools?: string[];\n sessions?: boolean;\n}\n\nexport interface AcpInitializeParams {\n clientName: string;\n clientVersion: string;\n capabilities?: {\n filesystem?: boolean;\n terminal?: boolean;\n };\n}\n\nexport interface AcpInitializeResult {\n agentName: string;\n agentVersion: string;\n protocolVersion: string;\n capabilities: AcpCapabilities;\n}\n\n// ── Session methods ─────────────────────────────────────────────────────────\n\nexport interface AcpSessionNewParams {\n sessionId?: string;\n}\n\nexport interface AcpSessionNewResult {\n sessionId: string;\n}\n\nexport interface AcpSessionPromptParams {\n sessionId: string;\n prompt: string;\n}\n\nexport interface AcpSessionLoadParams {\n sessionId: string;\n}\n\nexport interface AcpSessionLoadResult {\n sessionId: string;\n messageCount: number;\n}\n\n// ── Stream notifications (agent -> client) ──────────────────────────────────\n\nexport interface AcpStreamTextNotification {\n sessionId: string;\n text: string;\n}\n\nexport interface AcpStreamToolUseNotification {\n sessionId: string;\n toolName: string;\n toolUseId: string;\n input?: string;\n}\n\nexport interface AcpStreamCompleteNotification {\n sessionId: string;\n text: string | null;\n}\n\nexport interface AcpStreamErrorNotification {\n sessionId: string;\n error: string;\n}\n\n// ── Client-invoked methods (agent -> client, for fs/terminal) ───────────────\n\nexport interface AcpFsReadParams {\n path: string;\n}\n\nexport interface AcpFsReadResult {\n content: string;\n}\n\nexport interface AcpFsBytesReadParams {\n path: string;\n maxBytes?: number;\n}\n\nexport interface AcpFsBytesReadResult {\n /** Base64-encoded file content */\n data: string;\n}\n\nexport interface AcpFsWriteParams {\n path: string;\n content: string;\n}\n\nexport interface AcpFsStatParams {\n path: string;\n}\n\nexport interface AcpFsStatResult {\n size: number;\n isDirectory: boolean;\n isFile: boolean;\n modifiedAt?: string;\n}\n\nexport interface AcpTerminalExecParams {\n command: string;\n cwd?: string;\n timeout?: number;\n}\n\nexport interface AcpTerminalExecResult {\n exitCode: number;\n stdout: string;\n stderr: string;\n}\n\n// ── Permission bridge ───────────────────────────────────────────────────────\n\nexport interface AcpPermissionRequestNotification {\n sessionId: string;\n toolName: string;\n input: Record<string, unknown>;\n message: string;\n}\n\nexport interface AcpPermissionResponseParams {\n sessionId: string;\n allow: boolean;\n feedback?: string;\n}\n\n// ── Transport interface ─────────────────────────────────────────────────────\n\nexport interface AcpTransport {\n /** Send a JSON-RPC message to the peer. */\n send(message: unknown): void;\n /** Register a handler for incoming JSON-RPC messages. */\n onMessage(handler: (message: unknown) => void): void;\n /** Register a close handler. */\n onClose(handler: () => void): void;\n /** Close the transport. */\n close(): void;\n}\n\n// ── Method constants ────────────────────────────────────────────────────────\n\nexport const ACP_METHODS = {\n INITIALIZE: \"initialize\",\n SESSION_NEW: \"session/new\",\n SESSION_PROMPT: \"session/prompt\",\n SESSION_LOAD: \"session/load\",\n SESSION_ABORT: \"session/abort\",\n\n // Client-invoked\n FS_READ: \"fs/read_text_file\",\n FS_READ_BYTES: \"fs/read_bytes\",\n FS_WRITE: \"fs/write_text_file\",\n FS_STAT: \"fs/stat\",\n FS_EXISTS: \"fs/exists\",\n FS_READDIR: \"fs/readdir\",\n FS_MKDIR: \"fs/mkdir\",\n FS_DELETE: \"fs/delete\",\n TERMINAL_EXEC: \"terminal/exec\",\n\n // Notifications (agent -> client)\n STREAM_TEXT: \"stream/text\",\n STREAM_THINKING: \"stream/thinking\",\n STREAM_TOOL_USE: \"stream/toolUse\",\n STREAM_TOOL_RESULT: \"stream/toolResult\",\n STREAM_COMPLETE: \"stream/complete\",\n STREAM_ERROR: \"stream/error\",\n PERMISSION_REQUEST: \"permission/request\",\n PERMISSION_RESPONSE: \"permission/response\",\n USER_INPUT_REQUEST: \"userInput/request\",\n USER_INPUT_RESPONSE: \"userInput/response\",\n} as const;\n","/**\n * ACP protocol handler: maps ACP JSON-RPC methods to Agent/Thread APIs.\n */\n\nimport type { Agent } from \"../agent.js\";\nimport type { Thread } from \"../thread.js\";\nimport type { StreamEvent } from \"../session/types.js\";\nimport type { PermissionRequest, PermissionResponse } from \"../permissions/types.js\";\nimport type {\n AcpTransport,\n AcpInitializeParams,\n AcpInitializeResult,\n AcpSessionNewParams,\n AcpSessionPromptParams,\n AcpSessionLoadParams,\n} from \"./types.js\";\nimport { ACP_METHODS } from \"./types.js\";\nimport {\n formatResponse,\n formatError,\n formatNotification,\n isRequest,\n METHOD_NOT_FOUND,\n INVALID_PARAMS,\n INTERNAL_ERROR,\n type JsonRpcMessage,\n type JsonRpcRequest,\n} from \"../jsonrpc/index.js\";\nimport { contentToString } from \"../utils/content.js\";\n\nexport interface AcpHandlerOptions {\n agentName?: string;\n agentVersion?: string;\n}\n\ninterface SessionState {\n thread: Thread;\n running: boolean;\n abortController: AbortController | null;\n pendingPermission: {\n resolve: (response: PermissionResponse) => void;\n } | null;\n pendingInput: {\n resolve: (answer: string) => void;\n } | null;\n}\n\nexport class AcpHandler {\n private code: Agent;\n private transport: AcpTransport;\n private options: AcpHandlerOptions;\n private sessions = new Map<string, SessionState>();\n private initialized = false;\n private clientCapabilities: { filesystem?: boolean; terminal?: boolean } = {};\n private pendingRequests = new Map<\n string | number,\n { resolve: (value: unknown) => void; reject: (err: Error) => void }\n >();\n private nextRequestId = 1;\n\n constructor(\n code: Agent,\n transport: AcpTransport,\n options?: AcpHandlerOptions,\n ) {\n this.code = code;\n this.transport = transport;\n this.options = options ?? {};\n\n transport.onMessage((msg) => this.handleMessage(msg as JsonRpcMessage));\n transport.onClose(() => this.handleClose());\n }\n\n /**\n * Send a JSON-RPC request to the client and wait for the response.\n * Used by AcpClientSandbox to invoke client-side fs/terminal methods.\n */\n async sendClientRequest(method: string, params: unknown): Promise<unknown> {\n const id = this.nextRequestId++;\n return new Promise<unknown>((resolve, reject) => {\n this.pendingRequests.set(id, { resolve, reject });\n this.transport.send({\n jsonrpc: \"2.0\",\n id,\n method,\n params,\n });\n });\n }\n\n private async handleMessage(msg: JsonRpcMessage): Promise<void> {\n // Handle responses to our client requests\n if (\"result\" in msg || \"error\" in msg) {\n const response = msg as { id: string | number; result?: unknown; error?: { message: string } };\n const pending = this.pendingRequests.get(response.id);\n if (pending) {\n this.pendingRequests.delete(response.id);\n if (\"error\" in response && response.error) {\n pending.reject(new Error(response.error.message));\n } else {\n pending.resolve(response.result);\n }\n }\n return;\n }\n\n if (!isRequest(msg)) return;\n\n const request = msg as JsonRpcRequest;\n try {\n const result = await this.dispatch(request);\n if (result !== undefined) {\n this.transport.send(formatResponse(request.id, result));\n }\n } catch (err) {\n this.transport.send(\n formatError(\n request.id,\n INTERNAL_ERROR,\n err instanceof Error ? err.message : String(err),\n ),\n );\n }\n }\n\n private async dispatch(request: JsonRpcRequest): Promise<unknown> {\n switch (request.method) {\n case ACP_METHODS.INITIALIZE:\n return this.handleInitialize(request.params as AcpInitializeParams);\n\n case ACP_METHODS.SESSION_NEW:\n return this.handleSessionNew(request.params as AcpSessionNewParams);\n\n case ACP_METHODS.SESSION_PROMPT:\n this.handleSessionPrompt(\n request.id,\n request.params as AcpSessionPromptParams,\n );\n return undefined;\n\n case ACP_METHODS.SESSION_LOAD:\n return this.handleSessionLoad(request.params as AcpSessionLoadParams);\n\n case ACP_METHODS.SESSION_ABORT: {\n const p = request.params as { sessionId: string };\n const session = this.sessions.get(p.sessionId);\n if (session) {\n session.abortController?.abort();\n }\n return { ok: true };\n }\n\n case ACP_METHODS.PERMISSION_RESPONSE: {\n const p = request.params as { sessionId: string; allow: boolean; feedback?: string };\n const session = this.sessions.get(p.sessionId);\n if (session?.pendingPermission) {\n session.pendingPermission.resolve({\n allow: p.allow,\n feedback: p.feedback,\n });\n session.pendingPermission = null;\n }\n return { ok: true };\n }\n\n case ACP_METHODS.USER_INPUT_RESPONSE: {\n const p = request.params as { sessionId: string; answer: string };\n const session = this.sessions.get(p.sessionId);\n if (session?.pendingInput) {\n session.pendingInput.resolve(p.answer ?? \"\");\n session.pendingInput = null;\n }\n return { ok: true };\n }\n\n default:\n throw Object.assign(\n new Error(`Unknown method: ${request.method}`),\n { code: METHOD_NOT_FOUND },\n );\n }\n }\n\n private handleInitialize(\n params: AcpInitializeParams,\n ): AcpInitializeResult {\n this.initialized = true;\n this.clientCapabilities = params.capabilities ?? {};\n\n return {\n agentName: this.options.agentName ?? \"noumen\",\n agentVersion: this.options.agentVersion ?? \"0.1.0\",\n protocolVersion: \"0.1.0\",\n capabilities: {\n streaming: true,\n permissions: true,\n sessions: true,\n },\n };\n }\n\n private handleSessionNew(\n params: AcpSessionNewParams,\n ): { sessionId: string } {\n const thread = this.code.createThread({\n sessionId: params.sessionId,\n permissionHandler: (req: PermissionRequest) =>\n this.bridgePermission(thread.sessionId, req),\n userInputHandler: (question: string) =>\n this.bridgeUserInput(thread.sessionId, question),\n });\n\n this.sessions.set(thread.sessionId, {\n thread,\n running: false,\n abortController: null,\n pendingPermission: null,\n pendingInput: null,\n });\n\n return { sessionId: thread.sessionId };\n }\n\n private async handleSessionPrompt(\n requestId: string | number,\n params: AcpSessionPromptParams,\n ): Promise<void> {\n const session = this.sessions.get(params.sessionId);\n if (!session) {\n this.transport.send(\n formatError(requestId, INVALID_PARAMS, `Session not found: ${params.sessionId}`),\n );\n return;\n }\n\n session.running = true;\n session.abortController = new AbortController();\n\n // Acknowledge the prompt request immediately\n this.transport.send(formatResponse(requestId, { ok: true }));\n\n try {\n for await (const event of session.thread.run(params.prompt, {\n signal: session.abortController.signal,\n })) {\n this.emitStreamEvent(params.sessionId, event);\n }\n } catch (err) {\n this.transport.send(\n formatNotification(ACP_METHODS.STREAM_ERROR, {\n sessionId: params.sessionId,\n error: err instanceof Error ? err.message : String(err),\n }),\n );\n } finally {\n session.running = false;\n session.abortController = null;\n }\n }\n\n private handleSessionLoad(\n params: AcpSessionLoadParams,\n ): { sessionId: string } {\n const thread = this.code.resumeThread(params.sessionId, {\n permissionHandler: (req: PermissionRequest) =>\n this.bridgePermission(params.sessionId, req),\n userInputHandler: (question: string) =>\n this.bridgeUserInput(params.sessionId, question),\n });\n\n this.sessions.set(params.sessionId, {\n thread,\n running: false,\n abortController: null,\n pendingPermission: null,\n pendingInput: null,\n });\n\n return { sessionId: params.sessionId };\n }\n\n private emitStreamEvent(sessionId: string, event: StreamEvent): void {\n switch (event.type) {\n case \"text_delta\":\n this.transport.send(\n formatNotification(ACP_METHODS.STREAM_TEXT, {\n sessionId,\n text: event.text,\n }),\n );\n break;\n\n case \"thinking_delta\":\n this.transport.send(\n formatNotification(ACP_METHODS.STREAM_THINKING, {\n sessionId,\n text: event.text,\n }),\n );\n break;\n\n case \"tool_use_start\":\n this.transport.send(\n formatNotification(ACP_METHODS.STREAM_TOOL_USE, {\n sessionId,\n toolName: event.toolName,\n toolUseId: event.toolUseId,\n phase: \"start\",\n }),\n );\n break;\n\n case \"tool_result\":\n this.transport.send(\n formatNotification(ACP_METHODS.STREAM_TOOL_RESULT, {\n sessionId,\n toolName: event.toolName,\n toolUseId: event.toolUseId,\n result: contentToString(event.result.content),\n isError: event.result.isError,\n }),\n );\n break;\n\n case \"message_complete\":\n this.transport.send(\n formatNotification(ACP_METHODS.STREAM_COMPLETE, {\n sessionId,\n text: event.message.content,\n }),\n );\n break;\n\n case \"turn_complete\":\n this.transport.send(\n formatNotification(ACP_METHODS.STREAM_COMPLETE, {\n sessionId,\n done: true,\n usage: event.usage,\n }),\n );\n break;\n\n case \"error\":\n this.transport.send(\n formatNotification(ACP_METHODS.STREAM_ERROR, {\n sessionId,\n error: event.error.message,\n }),\n );\n break;\n\n case \"permission_request\":\n this.transport.send(\n formatNotification(ACP_METHODS.PERMISSION_REQUEST, {\n sessionId,\n toolName: event.toolName,\n input: event.input,\n message: event.message,\n }),\n );\n break;\n\n case \"user_input_request\":\n this.transport.send(\n formatNotification(ACP_METHODS.USER_INPUT_REQUEST, {\n sessionId,\n toolUseId: event.toolUseId,\n question: event.question,\n }),\n );\n break;\n }\n }\n\n private bridgePermission(\n sessionId: string,\n request: PermissionRequest,\n ): Promise<PermissionResponse> {\n return new Promise<PermissionResponse>((resolve) => {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.pendingPermission = { resolve };\n }\n });\n }\n\n private bridgeUserInput(\n sessionId: string,\n question: string,\n ): Promise<string> {\n return new Promise<string>((resolve) => {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.pendingInput = { resolve };\n }\n });\n }\n\n private handleClose(): void {\n for (const session of this.sessions.values()) {\n session.abortController?.abort();\n }\n this.sessions.clear();\n }\n}\n","/**\n * ACP stdio transport: newline-delimited JSON-RPC over stdin/stdout.\n */\n\nimport type { AcpTransport } from \"./types.js\";\n\nexport class StdioTransport implements AcpTransport {\n private messageHandler: ((message: unknown) => void) | null = null;\n private closeHandler: (() => void) | null = null;\n private buffer = \"\";\n private closed = false;\n\n constructor(\n private input: NodeJS.ReadableStream = process.stdin,\n private output: NodeJS.WritableStream = process.stdout,\n ) {\n this.input.setEncoding?.(\"utf-8\");\n this.input.on(\"data\", (chunk: string) => this.onData(chunk));\n this.input.on(\"end\", () => this.handleClose());\n this.input.on(\"error\", () => this.handleClose());\n }\n\n send(message: unknown): void {\n if (this.closed) return;\n const line = JSON.stringify(message) + \"\\n\";\n this.output.write(line);\n }\n\n onMessage(handler: (message: unknown) => void): void {\n this.messageHandler = handler;\n }\n\n onClose(handler: () => void): void {\n this.closeHandler = handler;\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.handleClose();\n }\n\n private onData(chunk: string): void {\n this.buffer += chunk;\n const lines = this.buffer.split(\"\\n\");\n this.buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const msg = JSON.parse(trimmed);\n this.messageHandler?.(msg);\n } catch {\n // Skip malformed lines (per ACP spec: agents may write to stderr for logs)\n }\n }\n }\n\n private handleClose(): void {\n this.closed = true;\n this.closeHandler?.();\n }\n}\n","/**\n * AcpClientSandbox: VirtualFs + VirtualComputer backed by the ACP client.\n *\n * In the ACP model, the **client** (editor/IDE) provides filesystem and\n * terminal access. This sandbox implementation sends JSON-RPC requests to\n * the client for every fs/shell operation. It's a natural fit for noumen's\n * pluggable sandbox architecture.\n */\n\nimport type { VirtualFs, FileEntry, FileStat, ReadOptions } from \"../virtual/fs.js\";\nimport type { VirtualComputer, ExecOptions, CommandResult } from \"../virtual/computer.js\";\nimport type { Sandbox } from \"../virtual/sandbox.js\";\nimport type { AcpTransport } from \"./types.js\";\nimport { ACP_METHODS } from \"./types.js\";\nimport {\n formatRequest,\n type JsonRpcResponse,\n} from \"../jsonrpc/index.js\";\n\nlet _nextId = 1;\n\nexport class AcpClientSandbox {\n readonly fs: AcpClientFs;\n readonly computer: AcpClientComputer;\n\n constructor(\n private transport: AcpTransport,\n private sendRequest: (method: string, params: unknown) => Promise<unknown>,\n ) {\n this.fs = new AcpClientFs(sendRequest);\n this.computer = new AcpClientComputer(sendRequest);\n }\n}\n\nclass AcpClientFs implements VirtualFs {\n constructor(\n private sendRequest: (method: string, params: unknown) => Promise<unknown>,\n ) {}\n\n async readFile(path: string, _opts?: ReadOptions): Promise<string> {\n const result = (await this.sendRequest(ACP_METHODS.FS_READ, { path })) as {\n content: string;\n };\n return result.content;\n }\n\n async readFileBytes(path: string, maxBytes?: number): Promise<Buffer> {\n const result = (await this.sendRequest(ACP_METHODS.FS_READ_BYTES, {\n path,\n maxBytes,\n })) as { data: string };\n return Buffer.from(result.data, \"base64\");\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n await this.sendRequest(ACP_METHODS.FS_WRITE, { path, content });\n }\n\n async appendFile(path: string, content: string): Promise<void> {\n let existing = \"\";\n try {\n existing = await this.readFile(path);\n } catch {\n // file may not exist\n }\n await this.writeFile(path, existing + content);\n }\n\n async deleteFile(\n path: string,\n opts?: { recursive?: boolean },\n ): Promise<void> {\n await this.sendRequest(ACP_METHODS.FS_DELETE, {\n path,\n recursive: opts?.recursive ?? false,\n });\n }\n\n async mkdir(path: string, opts?: { recursive?: boolean }): Promise<void> {\n await this.sendRequest(ACP_METHODS.FS_MKDIR, {\n path,\n recursive: opts?.recursive ?? false,\n });\n }\n\n async readdir(\n path: string,\n _opts?: { recursive?: boolean },\n ): Promise<FileEntry[]> {\n const result = (await this.sendRequest(ACP_METHODS.FS_READDIR, {\n path,\n })) as FileEntry[];\n return result;\n }\n\n async exists(path: string): Promise<boolean> {\n const result = (await this.sendRequest(ACP_METHODS.FS_EXISTS, {\n path,\n })) as boolean;\n return result;\n }\n\n async stat(path: string): Promise<FileStat> {\n const result = (await this.sendRequest(ACP_METHODS.FS_STAT, {\n path,\n })) as {\n size: number;\n isDirectory: boolean;\n isFile: boolean;\n modifiedAt?: string;\n };\n return {\n size: result.size,\n isDirectory: result.isDirectory,\n isFile: result.isFile,\n modifiedAt: result.modifiedAt ? new Date(result.modifiedAt) : undefined,\n };\n }\n}\n\nclass AcpClientComputer implements VirtualComputer {\n constructor(\n private sendRequest: (method: string, params: unknown) => Promise<unknown>,\n ) {}\n\n async executeCommand(\n command: string,\n opts?: ExecOptions,\n ): Promise<CommandResult> {\n const result = (await this.sendRequest(ACP_METHODS.TERMINAL_EXEC, {\n command,\n cwd: opts?.cwd,\n timeout: opts?.timeout,\n })) as { exitCode: number; stdout: string; stderr: string };\n return {\n exitCode: result.exitCode,\n stdout: result.stdout,\n stderr: result.stderr,\n };\n }\n}\n","/**\n * ACP (Agent Client Protocol) adapter for noumen.\n *\n * Usage:\n * import { createAcpServer, StdioTransport, AcpClientSandbox } from \"noumen/acp\";\n *\n * // Stdio mode (editor launches agent as subprocess)\n * const transport = new StdioTransport();\n * const handler = createAcpServer(code, transport);\n *\n * // Or use AcpClientSandbox to let the client provide fs/terminal\n * const sandbox = new AcpClientSandbox(transport, handler.sendClientRequest);\n * const agent = new Agent({ provider, sandbox });\n */\n\nexport { AcpHandler, type AcpHandlerOptions } from \"./handler.js\";\nexport { StdioTransport } from \"./transport-stdio.js\";\nexport { AcpClientSandbox } from \"./client-sandbox.js\";\nexport {\n type AcpTransport,\n type AcpCapabilities,\n type AcpInitializeParams,\n type AcpInitializeResult,\n type AcpSessionNewParams,\n type AcpSessionPromptParams,\n ACP_METHODS,\n} from \"./types.js\";\n\nimport type { Agent } from \"../agent.js\";\nimport type { AcpTransport } from \"./types.js\";\nimport { AcpHandler, type AcpHandlerOptions } from \"./handler.js\";\n\n/**\n * Create an ACP server that bridges an ACP transport to an Agent instance.\n */\nexport function createAcpServer(\n code: Agent,\n transport: AcpTransport,\n options?: AcpHandlerOptions,\n): AcpHandler {\n return new AcpHandler(code, transport, options);\n}\n"],"mappings":"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","names":[]}
|