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.
Files changed (118) hide show
  1. package/README.md +767 -51
  2. package/dist/a2a/index.d.ts +148 -0
  3. package/dist/a2a/index.js +579 -0
  4. package/dist/a2a/index.js.map +1 -0
  5. package/dist/acp/index.d.ts +129 -0
  6. package/dist/acp/index.js +498 -0
  7. package/dist/acp/index.js.map +1 -0
  8. package/dist/agent-BrkbZyOT.d.ts +1028 -0
  9. package/dist/cache-DVqaCX8v.d.ts +38 -0
  10. package/dist/chunk-2ZTGQLYK.js +356 -0
  11. package/dist/chunk-2ZTGQLYK.js.map +1 -0
  12. package/dist/chunk-42PHHZUA.js +132 -0
  13. package/dist/chunk-42PHHZUA.js.map +1 -0
  14. package/dist/chunk-4SQA2UCV.js +26 -0
  15. package/dist/chunk-4SQA2UCV.js.map +1 -0
  16. package/dist/chunk-5GEX6ZSB.js +179 -0
  17. package/dist/chunk-5GEX6ZSB.js.map +1 -0
  18. package/dist/chunk-7ZMN7XJE.js +94 -0
  19. package/dist/chunk-7ZMN7XJE.js.map +1 -0
  20. package/dist/chunk-AMYIJSAZ.js +57 -0
  21. package/dist/chunk-AMYIJSAZ.js.map +1 -0
  22. package/dist/chunk-BGG2E6JD.js +10 -0
  23. package/dist/chunk-BGG2E6JD.js.map +1 -0
  24. package/dist/chunk-BZSFUEWM.js +43 -0
  25. package/dist/chunk-BZSFUEWM.js.map +1 -0
  26. package/dist/chunk-CPFHEPW4.js +139 -0
  27. package/dist/chunk-CPFHEPW4.js.map +1 -0
  28. package/dist/chunk-D43BWEZA.js +346 -0
  29. package/dist/chunk-D43BWEZA.js.map +1 -0
  30. package/dist/chunk-DGUM43GV.js +11 -0
  31. package/dist/chunk-DGUM43GV.js.map +1 -0
  32. package/dist/chunk-JACGEMTF.js +43 -0
  33. package/dist/chunk-JACGEMTF.js.map +1 -0
  34. package/dist/chunk-JX7CLUCV.js +21 -0
  35. package/dist/chunk-JX7CLUCV.js.map +1 -0
  36. package/dist/chunk-KXDB56YW.js +39 -0
  37. package/dist/chunk-KXDB56YW.js.map +1 -0
  38. package/dist/chunk-KY6ZPWHO.js +112 -0
  39. package/dist/chunk-KY6ZPWHO.js.map +1 -0
  40. package/dist/chunk-NBDFQYUZ.js +7992 -0
  41. package/dist/chunk-NBDFQYUZ.js.map +1 -0
  42. package/dist/chunk-OGXNFXFA.js +196 -0
  43. package/dist/chunk-OGXNFXFA.js.map +1 -0
  44. package/dist/chunk-QTJ7VTJY.js +1994 -0
  45. package/dist/chunk-QTJ7VTJY.js.map +1 -0
  46. package/dist/chunk-UVSSQBDY.js +192 -0
  47. package/dist/chunk-UVSSQBDY.js.map +1 -0
  48. package/dist/chunk-Y45R3PQL.js +684 -0
  49. package/dist/chunk-Y45R3PQL.js.map +1 -0
  50. package/dist/cli/index.d.ts +1 -0
  51. package/dist/cli/index.js +868 -0
  52. package/dist/cli/index.js.map +1 -0
  53. package/dist/client/index.d.ts +64 -0
  54. package/dist/client/index.js +409 -0
  55. package/dist/client/index.js.map +1 -0
  56. package/dist/client-CRRO2376.js +10 -0
  57. package/dist/client-CRRO2376.js.map +1 -0
  58. package/dist/headless-Q7XHHZIW.js +143 -0
  59. package/dist/headless-Q7XHHZIW.js.map +1 -0
  60. package/dist/history-snip-64GYP4ZL.js +12 -0
  61. package/dist/history-snip-64GYP4ZL.js.map +1 -0
  62. package/dist/index.d.ts +1305 -418
  63. package/dist/index.js +384 -1757
  64. package/dist/index.js.map +1 -1
  65. package/dist/jsonrpc/index.d.ts +54 -0
  66. package/dist/jsonrpc/index.js +34 -0
  67. package/dist/jsonrpc/index.js.map +1 -0
  68. package/dist/lsp/index.d.ts +36 -0
  69. package/dist/lsp/index.js +16 -0
  70. package/dist/lsp/index.js.map +1 -0
  71. package/dist/lsp-PS3BWIHC.js +8 -0
  72. package/dist/lsp-PS3BWIHC.js.map +1 -0
  73. package/dist/manager-DLXK63XC.js +8 -0
  74. package/dist/manager-DLXK63XC.js.map +1 -0
  75. package/dist/mcp/index.d.ts +111 -0
  76. package/dist/mcp/index.js +104 -0
  77. package/dist/mcp/index.js.map +1 -0
  78. package/dist/mcp-auth-AEI2R4ZC.js +9 -0
  79. package/dist/mcp-auth-AEI2R4ZC.js.map +1 -0
  80. package/dist/ollama-YNXAYP3R.js +18 -0
  81. package/dist/ollama-YNXAYP3R.js.map +1 -0
  82. package/dist/provider-factory-34MSWJZ3.js +20 -0
  83. package/dist/provider-factory-34MSWJZ3.js.map +1 -0
  84. package/dist/providers/anthropic.d.ts +19 -0
  85. package/dist/providers/anthropic.js +33 -0
  86. package/dist/providers/anthropic.js.map +1 -0
  87. package/dist/providers/bedrock.d.ts +39 -0
  88. package/dist/providers/bedrock.js +54 -0
  89. package/dist/providers/bedrock.js.map +1 -0
  90. package/dist/providers/gemini.d.ts +16 -0
  91. package/dist/providers/gemini.js +224 -0
  92. package/dist/providers/gemini.js.map +1 -0
  93. package/dist/providers/openai.d.ts +18 -0
  94. package/dist/providers/openai.js +8 -0
  95. package/dist/providers/openai.js.map +1 -0
  96. package/dist/providers/openrouter.d.ts +16 -0
  97. package/dist/providers/openrouter.js +23 -0
  98. package/dist/providers/openrouter.js.map +1 -0
  99. package/dist/providers/vertex.d.ts +40 -0
  100. package/dist/providers/vertex.js +64 -0
  101. package/dist/providers/vertex.js.map +1 -0
  102. package/dist/render-GRN4ZSSW.js +14 -0
  103. package/dist/render-GRN4ZSSW.js.map +1 -0
  104. package/dist/resolve-XM52G7YE.js +14 -0
  105. package/dist/resolve-XM52G7YE.js.map +1 -0
  106. package/dist/server/index.d.ts +128 -0
  107. package/dist/server/index.js +626 -0
  108. package/dist/server/index.js.map +1 -0
  109. package/dist/server-Cg1yWGaV.d.ts +96 -0
  110. package/dist/spinner-OJNR6NFO.js +8 -0
  111. package/dist/spinner-OJNR6NFO.js.map +1 -0
  112. package/dist/types-2kTLUCnD.d.ts +107 -0
  113. package/dist/types-3c88cRKH.d.ts +547 -0
  114. package/dist/types-CwKKucOF.d.ts +620 -0
  115. package/dist/types-DwdzmXfs.d.ts +107 -0
  116. package/dist/types-NIyVwQ4h.d.ts +109 -0
  117. package/dist/types-QwfylltH.d.ts +71 -0
  118. package/package.json +134 -6
@@ -0,0 +1,129 @@
1
+ import { A as Agent } from '../agent-BrkbZyOT.js';
2
+ import { A as AcpTransport } from '../types-QwfylltH.js';
3
+ export { a as ACP_METHODS, b as AcpCapabilities, c as AcpInitializeParams, d as AcpInitializeResult, e as AcpSessionNewParams, f as AcpSessionPromptParams } from '../types-QwfylltH.js';
4
+ import { V as VirtualFs, R as ReadOptions, F as FileEntry, i as FileStat, j as VirtualComputer, E as ExecOptions, C as CommandResult } from '../types-CwKKucOF.js';
5
+ import '../types-3c88cRKH.js';
6
+ import '../cache-DVqaCX8v.js';
7
+ import '../types-2kTLUCnD.js';
8
+ import '@modelcontextprotocol/sdk/client/index.js';
9
+ import '@modelcontextprotocol/sdk/client/auth.js';
10
+ import '@modelcontextprotocol/sdk/shared/auth.js';
11
+ import '../types-DwdzmXfs.js';
12
+
13
+ /**
14
+ * ACP protocol handler: maps ACP JSON-RPC methods to Agent/Thread APIs.
15
+ */
16
+
17
+ interface AcpHandlerOptions {
18
+ agentName?: string;
19
+ agentVersion?: string;
20
+ }
21
+ declare class AcpHandler {
22
+ private code;
23
+ private transport;
24
+ private options;
25
+ private sessions;
26
+ private initialized;
27
+ private clientCapabilities;
28
+ private pendingRequests;
29
+ private nextRequestId;
30
+ constructor(code: Agent, transport: AcpTransport, options?: AcpHandlerOptions);
31
+ /**
32
+ * Send a JSON-RPC request to the client and wait for the response.
33
+ * Used by AcpClientSandbox to invoke client-side fs/terminal methods.
34
+ */
35
+ sendClientRequest(method: string, params: unknown): Promise<unknown>;
36
+ private handleMessage;
37
+ private dispatch;
38
+ private handleInitialize;
39
+ private handleSessionNew;
40
+ private handleSessionPrompt;
41
+ private handleSessionLoad;
42
+ private emitStreamEvent;
43
+ private bridgePermission;
44
+ private bridgeUserInput;
45
+ private handleClose;
46
+ }
47
+
48
+ /**
49
+ * ACP stdio transport: newline-delimited JSON-RPC over stdin/stdout.
50
+ */
51
+
52
+ declare class StdioTransport implements AcpTransport {
53
+ private input;
54
+ private output;
55
+ private messageHandler;
56
+ private closeHandler;
57
+ private buffer;
58
+ private closed;
59
+ constructor(input?: NodeJS.ReadableStream, output?: NodeJS.WritableStream);
60
+ send(message: unknown): void;
61
+ onMessage(handler: (message: unknown) => void): void;
62
+ onClose(handler: () => void): void;
63
+ close(): void;
64
+ private onData;
65
+ private handleClose;
66
+ }
67
+
68
+ /**
69
+ * AcpClientSandbox: VirtualFs + VirtualComputer backed by the ACP client.
70
+ *
71
+ * In the ACP model, the **client** (editor/IDE) provides filesystem and
72
+ * terminal access. This sandbox implementation sends JSON-RPC requests to
73
+ * the client for every fs/shell operation. It's a natural fit for noumen's
74
+ * pluggable sandbox architecture.
75
+ */
76
+
77
+ declare class AcpClientSandbox {
78
+ private transport;
79
+ private sendRequest;
80
+ readonly fs: AcpClientFs;
81
+ readonly computer: AcpClientComputer;
82
+ constructor(transport: AcpTransport, sendRequest: (method: string, params: unknown) => Promise<unknown>);
83
+ }
84
+ declare class AcpClientFs implements VirtualFs {
85
+ private sendRequest;
86
+ constructor(sendRequest: (method: string, params: unknown) => Promise<unknown>);
87
+ readFile(path: string, _opts?: ReadOptions): Promise<string>;
88
+ readFileBytes(path: string, maxBytes?: number): Promise<Buffer>;
89
+ writeFile(path: string, content: string): Promise<void>;
90
+ appendFile(path: string, content: string): Promise<void>;
91
+ deleteFile(path: string, opts?: {
92
+ recursive?: boolean;
93
+ }): Promise<void>;
94
+ mkdir(path: string, opts?: {
95
+ recursive?: boolean;
96
+ }): Promise<void>;
97
+ readdir(path: string, _opts?: {
98
+ recursive?: boolean;
99
+ }): Promise<FileEntry[]>;
100
+ exists(path: string): Promise<boolean>;
101
+ stat(path: string): Promise<FileStat>;
102
+ }
103
+ declare class AcpClientComputer implements VirtualComputer {
104
+ private sendRequest;
105
+ constructor(sendRequest: (method: string, params: unknown) => Promise<unknown>);
106
+ executeCommand(command: string, opts?: ExecOptions): Promise<CommandResult>;
107
+ }
108
+
109
+ /**
110
+ * ACP (Agent Client Protocol) adapter for noumen.
111
+ *
112
+ * Usage:
113
+ * import { createAcpServer, StdioTransport, AcpClientSandbox } from "noumen/acp";
114
+ *
115
+ * // Stdio mode (editor launches agent as subprocess)
116
+ * const transport = new StdioTransport();
117
+ * const handler = createAcpServer(code, transport);
118
+ *
119
+ * // Or use AcpClientSandbox to let the client provide fs/terminal
120
+ * const sandbox = new AcpClientSandbox(transport, handler.sendClientRequest);
121
+ * const agent = new Agent({ provider, sandbox });
122
+ */
123
+
124
+ /**
125
+ * Create an ACP server that bridges an ACP transport to an Agent instance.
126
+ */
127
+ declare function createAcpServer(code: Agent, transport: AcpTransport, options?: AcpHandlerOptions): AcpHandler;
128
+
129
+ export { AcpClientSandbox, AcpHandler, type AcpHandlerOptions, AcpTransport, StdioTransport, createAcpServer };
@@ -0,0 +1,498 @@
1
+ import {
2
+ INTERNAL_ERROR,
3
+ INVALID_PARAMS,
4
+ METHOD_NOT_FOUND,
5
+ formatError,
6
+ formatNotification,
7
+ formatResponse,
8
+ isRequest
9
+ } from "../chunk-AMYIJSAZ.js";
10
+ import {
11
+ contentToString
12
+ } from "../chunk-JACGEMTF.js";
13
+ import "../chunk-DGUM43GV.js";
14
+
15
+ // src/acp/types.ts
16
+ var ACP_METHODS = {
17
+ INITIALIZE: "initialize",
18
+ SESSION_NEW: "session/new",
19
+ SESSION_PROMPT: "session/prompt",
20
+ SESSION_LOAD: "session/load",
21
+ SESSION_ABORT: "session/abort",
22
+ // Client-invoked
23
+ FS_READ: "fs/read_text_file",
24
+ FS_READ_BYTES: "fs/read_bytes",
25
+ FS_WRITE: "fs/write_text_file",
26
+ FS_STAT: "fs/stat",
27
+ FS_EXISTS: "fs/exists",
28
+ FS_READDIR: "fs/readdir",
29
+ FS_MKDIR: "fs/mkdir",
30
+ FS_DELETE: "fs/delete",
31
+ TERMINAL_EXEC: "terminal/exec",
32
+ // Notifications (agent -> client)
33
+ STREAM_TEXT: "stream/text",
34
+ STREAM_THINKING: "stream/thinking",
35
+ STREAM_TOOL_USE: "stream/toolUse",
36
+ STREAM_TOOL_RESULT: "stream/toolResult",
37
+ STREAM_COMPLETE: "stream/complete",
38
+ STREAM_ERROR: "stream/error",
39
+ PERMISSION_REQUEST: "permission/request",
40
+ PERMISSION_RESPONSE: "permission/response",
41
+ USER_INPUT_REQUEST: "userInput/request",
42
+ USER_INPUT_RESPONSE: "userInput/response"
43
+ };
44
+
45
+ // src/acp/handler.ts
46
+ var AcpHandler = class {
47
+ code;
48
+ transport;
49
+ options;
50
+ sessions = /* @__PURE__ */ new Map();
51
+ initialized = false;
52
+ clientCapabilities = {};
53
+ pendingRequests = /* @__PURE__ */ new Map();
54
+ nextRequestId = 1;
55
+ constructor(code, transport, options) {
56
+ this.code = code;
57
+ this.transport = transport;
58
+ this.options = options ?? {};
59
+ transport.onMessage((msg) => this.handleMessage(msg));
60
+ transport.onClose(() => this.handleClose());
61
+ }
62
+ /**
63
+ * Send a JSON-RPC request to the client and wait for the response.
64
+ * Used by AcpClientSandbox to invoke client-side fs/terminal methods.
65
+ */
66
+ async sendClientRequest(method, params) {
67
+ const id = this.nextRequestId++;
68
+ return new Promise((resolve, reject) => {
69
+ this.pendingRequests.set(id, { resolve, reject });
70
+ this.transport.send({
71
+ jsonrpc: "2.0",
72
+ id,
73
+ method,
74
+ params
75
+ });
76
+ });
77
+ }
78
+ async handleMessage(msg) {
79
+ if ("result" in msg || "error" in msg) {
80
+ const response = msg;
81
+ const pending = this.pendingRequests.get(response.id);
82
+ if (pending) {
83
+ this.pendingRequests.delete(response.id);
84
+ if ("error" in response && response.error) {
85
+ pending.reject(new Error(response.error.message));
86
+ } else {
87
+ pending.resolve(response.result);
88
+ }
89
+ }
90
+ return;
91
+ }
92
+ if (!isRequest(msg)) return;
93
+ const request = msg;
94
+ try {
95
+ const result = await this.dispatch(request);
96
+ if (result !== void 0) {
97
+ this.transport.send(formatResponse(request.id, result));
98
+ }
99
+ } catch (err) {
100
+ this.transport.send(
101
+ formatError(
102
+ request.id,
103
+ INTERNAL_ERROR,
104
+ err instanceof Error ? err.message : String(err)
105
+ )
106
+ );
107
+ }
108
+ }
109
+ async dispatch(request) {
110
+ switch (request.method) {
111
+ case ACP_METHODS.INITIALIZE:
112
+ return this.handleInitialize(request.params);
113
+ case ACP_METHODS.SESSION_NEW:
114
+ return this.handleSessionNew(request.params);
115
+ case ACP_METHODS.SESSION_PROMPT:
116
+ this.handleSessionPrompt(
117
+ request.id,
118
+ request.params
119
+ );
120
+ return void 0;
121
+ case ACP_METHODS.SESSION_LOAD:
122
+ return this.handleSessionLoad(request.params);
123
+ case ACP_METHODS.SESSION_ABORT: {
124
+ const p = request.params;
125
+ const session = this.sessions.get(p.sessionId);
126
+ if (session) {
127
+ session.abortController?.abort();
128
+ }
129
+ return { ok: true };
130
+ }
131
+ case ACP_METHODS.PERMISSION_RESPONSE: {
132
+ const p = request.params;
133
+ const session = this.sessions.get(p.sessionId);
134
+ if (session?.pendingPermission) {
135
+ session.pendingPermission.resolve({
136
+ allow: p.allow,
137
+ feedback: p.feedback
138
+ });
139
+ session.pendingPermission = null;
140
+ }
141
+ return { ok: true };
142
+ }
143
+ case ACP_METHODS.USER_INPUT_RESPONSE: {
144
+ const p = request.params;
145
+ const session = this.sessions.get(p.sessionId);
146
+ if (session?.pendingInput) {
147
+ session.pendingInput.resolve(p.answer ?? "");
148
+ session.pendingInput = null;
149
+ }
150
+ return { ok: true };
151
+ }
152
+ default:
153
+ throw Object.assign(
154
+ new Error(`Unknown method: ${request.method}`),
155
+ { code: METHOD_NOT_FOUND }
156
+ );
157
+ }
158
+ }
159
+ handleInitialize(params) {
160
+ this.initialized = true;
161
+ this.clientCapabilities = params.capabilities ?? {};
162
+ return {
163
+ agentName: this.options.agentName ?? "noumen",
164
+ agentVersion: this.options.agentVersion ?? "0.1.0",
165
+ protocolVersion: "0.1.0",
166
+ capabilities: {
167
+ streaming: true,
168
+ permissions: true,
169
+ sessions: true
170
+ }
171
+ };
172
+ }
173
+ handleSessionNew(params) {
174
+ const thread = this.code.createThread({
175
+ sessionId: params.sessionId,
176
+ permissionHandler: (req) => this.bridgePermission(thread.sessionId, req),
177
+ userInputHandler: (question) => this.bridgeUserInput(thread.sessionId, question)
178
+ });
179
+ this.sessions.set(thread.sessionId, {
180
+ thread,
181
+ running: false,
182
+ abortController: null,
183
+ pendingPermission: null,
184
+ pendingInput: null
185
+ });
186
+ return { sessionId: thread.sessionId };
187
+ }
188
+ async handleSessionPrompt(requestId, params) {
189
+ const session = this.sessions.get(params.sessionId);
190
+ if (!session) {
191
+ this.transport.send(
192
+ formatError(requestId, INVALID_PARAMS, `Session not found: ${params.sessionId}`)
193
+ );
194
+ return;
195
+ }
196
+ session.running = true;
197
+ session.abortController = new AbortController();
198
+ this.transport.send(formatResponse(requestId, { ok: true }));
199
+ try {
200
+ for await (const event of session.thread.run(params.prompt, {
201
+ signal: session.abortController.signal
202
+ })) {
203
+ this.emitStreamEvent(params.sessionId, event);
204
+ }
205
+ } catch (err) {
206
+ this.transport.send(
207
+ formatNotification(ACP_METHODS.STREAM_ERROR, {
208
+ sessionId: params.sessionId,
209
+ error: err instanceof Error ? err.message : String(err)
210
+ })
211
+ );
212
+ } finally {
213
+ session.running = false;
214
+ session.abortController = null;
215
+ }
216
+ }
217
+ handleSessionLoad(params) {
218
+ const thread = this.code.resumeThread(params.sessionId, {
219
+ permissionHandler: (req) => this.bridgePermission(params.sessionId, req),
220
+ userInputHandler: (question) => this.bridgeUserInput(params.sessionId, question)
221
+ });
222
+ this.sessions.set(params.sessionId, {
223
+ thread,
224
+ running: false,
225
+ abortController: null,
226
+ pendingPermission: null,
227
+ pendingInput: null
228
+ });
229
+ return { sessionId: params.sessionId };
230
+ }
231
+ emitStreamEvent(sessionId, event) {
232
+ switch (event.type) {
233
+ case "text_delta":
234
+ this.transport.send(
235
+ formatNotification(ACP_METHODS.STREAM_TEXT, {
236
+ sessionId,
237
+ text: event.text
238
+ })
239
+ );
240
+ break;
241
+ case "thinking_delta":
242
+ this.transport.send(
243
+ formatNotification(ACP_METHODS.STREAM_THINKING, {
244
+ sessionId,
245
+ text: event.text
246
+ })
247
+ );
248
+ break;
249
+ case "tool_use_start":
250
+ this.transport.send(
251
+ formatNotification(ACP_METHODS.STREAM_TOOL_USE, {
252
+ sessionId,
253
+ toolName: event.toolName,
254
+ toolUseId: event.toolUseId,
255
+ phase: "start"
256
+ })
257
+ );
258
+ break;
259
+ case "tool_result":
260
+ this.transport.send(
261
+ formatNotification(ACP_METHODS.STREAM_TOOL_RESULT, {
262
+ sessionId,
263
+ toolName: event.toolName,
264
+ toolUseId: event.toolUseId,
265
+ result: contentToString(event.result.content),
266
+ isError: event.result.isError
267
+ })
268
+ );
269
+ break;
270
+ case "message_complete":
271
+ this.transport.send(
272
+ formatNotification(ACP_METHODS.STREAM_COMPLETE, {
273
+ sessionId,
274
+ text: event.message.content
275
+ })
276
+ );
277
+ break;
278
+ case "turn_complete":
279
+ this.transport.send(
280
+ formatNotification(ACP_METHODS.STREAM_COMPLETE, {
281
+ sessionId,
282
+ done: true,
283
+ usage: event.usage
284
+ })
285
+ );
286
+ break;
287
+ case "error":
288
+ this.transport.send(
289
+ formatNotification(ACP_METHODS.STREAM_ERROR, {
290
+ sessionId,
291
+ error: event.error.message
292
+ })
293
+ );
294
+ break;
295
+ case "permission_request":
296
+ this.transport.send(
297
+ formatNotification(ACP_METHODS.PERMISSION_REQUEST, {
298
+ sessionId,
299
+ toolName: event.toolName,
300
+ input: event.input,
301
+ message: event.message
302
+ })
303
+ );
304
+ break;
305
+ case "user_input_request":
306
+ this.transport.send(
307
+ formatNotification(ACP_METHODS.USER_INPUT_REQUEST, {
308
+ sessionId,
309
+ toolUseId: event.toolUseId,
310
+ question: event.question
311
+ })
312
+ );
313
+ break;
314
+ }
315
+ }
316
+ bridgePermission(sessionId, request) {
317
+ return new Promise((resolve) => {
318
+ const session = this.sessions.get(sessionId);
319
+ if (session) {
320
+ session.pendingPermission = { resolve };
321
+ }
322
+ });
323
+ }
324
+ bridgeUserInput(sessionId, question) {
325
+ return new Promise((resolve) => {
326
+ const session = this.sessions.get(sessionId);
327
+ if (session) {
328
+ session.pendingInput = { resolve };
329
+ }
330
+ });
331
+ }
332
+ handleClose() {
333
+ for (const session of this.sessions.values()) {
334
+ session.abortController?.abort();
335
+ }
336
+ this.sessions.clear();
337
+ }
338
+ };
339
+
340
+ // src/acp/transport-stdio.ts
341
+ var StdioTransport = class {
342
+ constructor(input = process.stdin, output = process.stdout) {
343
+ this.input = input;
344
+ this.output = output;
345
+ this.input.setEncoding?.("utf-8");
346
+ this.input.on("data", (chunk) => this.onData(chunk));
347
+ this.input.on("end", () => this.handleClose());
348
+ this.input.on("error", () => this.handleClose());
349
+ }
350
+ input;
351
+ output;
352
+ messageHandler = null;
353
+ closeHandler = null;
354
+ buffer = "";
355
+ closed = false;
356
+ send(message) {
357
+ if (this.closed) return;
358
+ const line = JSON.stringify(message) + "\n";
359
+ this.output.write(line);
360
+ }
361
+ onMessage(handler) {
362
+ this.messageHandler = handler;
363
+ }
364
+ onClose(handler) {
365
+ this.closeHandler = handler;
366
+ }
367
+ close() {
368
+ if (this.closed) return;
369
+ this.closed = true;
370
+ this.handleClose();
371
+ }
372
+ onData(chunk) {
373
+ this.buffer += chunk;
374
+ const lines = this.buffer.split("\n");
375
+ this.buffer = lines.pop() ?? "";
376
+ for (const line of lines) {
377
+ const trimmed = line.trim();
378
+ if (!trimmed) continue;
379
+ try {
380
+ const msg = JSON.parse(trimmed);
381
+ this.messageHandler?.(msg);
382
+ } catch {
383
+ }
384
+ }
385
+ }
386
+ handleClose() {
387
+ this.closed = true;
388
+ this.closeHandler?.();
389
+ }
390
+ };
391
+
392
+ // src/acp/client-sandbox.ts
393
+ var AcpClientSandbox = class {
394
+ constructor(transport, sendRequest) {
395
+ this.transport = transport;
396
+ this.sendRequest = sendRequest;
397
+ this.fs = new AcpClientFs(sendRequest);
398
+ this.computer = new AcpClientComputer(sendRequest);
399
+ }
400
+ transport;
401
+ sendRequest;
402
+ fs;
403
+ computer;
404
+ };
405
+ var AcpClientFs = class {
406
+ constructor(sendRequest) {
407
+ this.sendRequest = sendRequest;
408
+ }
409
+ sendRequest;
410
+ async readFile(path, _opts) {
411
+ const result = await this.sendRequest(ACP_METHODS.FS_READ, { path });
412
+ return result.content;
413
+ }
414
+ async readFileBytes(path, maxBytes) {
415
+ const result = await this.sendRequest(ACP_METHODS.FS_READ_BYTES, {
416
+ path,
417
+ maxBytes
418
+ });
419
+ return Buffer.from(result.data, "base64");
420
+ }
421
+ async writeFile(path, content) {
422
+ await this.sendRequest(ACP_METHODS.FS_WRITE, { path, content });
423
+ }
424
+ async appendFile(path, content) {
425
+ let existing = "";
426
+ try {
427
+ existing = await this.readFile(path);
428
+ } catch {
429
+ }
430
+ await this.writeFile(path, existing + content);
431
+ }
432
+ async deleteFile(path, opts) {
433
+ await this.sendRequest(ACP_METHODS.FS_DELETE, {
434
+ path,
435
+ recursive: opts?.recursive ?? false
436
+ });
437
+ }
438
+ async mkdir(path, opts) {
439
+ await this.sendRequest(ACP_METHODS.FS_MKDIR, {
440
+ path,
441
+ recursive: opts?.recursive ?? false
442
+ });
443
+ }
444
+ async readdir(path, _opts) {
445
+ const result = await this.sendRequest(ACP_METHODS.FS_READDIR, {
446
+ path
447
+ });
448
+ return result;
449
+ }
450
+ async exists(path) {
451
+ const result = await this.sendRequest(ACP_METHODS.FS_EXISTS, {
452
+ path
453
+ });
454
+ return result;
455
+ }
456
+ async stat(path) {
457
+ const result = await this.sendRequest(ACP_METHODS.FS_STAT, {
458
+ path
459
+ });
460
+ return {
461
+ size: result.size,
462
+ isDirectory: result.isDirectory,
463
+ isFile: result.isFile,
464
+ modifiedAt: result.modifiedAt ? new Date(result.modifiedAt) : void 0
465
+ };
466
+ }
467
+ };
468
+ var AcpClientComputer = class {
469
+ constructor(sendRequest) {
470
+ this.sendRequest = sendRequest;
471
+ }
472
+ sendRequest;
473
+ async executeCommand(command, opts) {
474
+ const result = await this.sendRequest(ACP_METHODS.TERMINAL_EXEC, {
475
+ command,
476
+ cwd: opts?.cwd,
477
+ timeout: opts?.timeout
478
+ });
479
+ return {
480
+ exitCode: result.exitCode,
481
+ stdout: result.stdout,
482
+ stderr: result.stderr
483
+ };
484
+ }
485
+ };
486
+
487
+ // src/acp/index.ts
488
+ function createAcpServer(code, transport, options) {
489
+ return new AcpHandler(code, transport, options);
490
+ }
491
+ export {
492
+ ACP_METHODS,
493
+ AcpClientSandbox,
494
+ AcpHandler,
495
+ StdioTransport,
496
+ createAcpServer
497
+ };
498
+ //# sourceMappingURL=index.js.map