@wrongstack/acp 0.10.2 → 0.10.3

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 (48) hide show
  1. package/dist/agent.d.ts +92 -0
  2. package/dist/agent.js +420 -0
  3. package/dist/agent.js.map +1 -0
  4. package/dist/client.d.ts +4 -0
  5. package/dist/client.js +315 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/{client/tool-translator.d.ts → index-CncECXiF.d.ts} +41 -17
  8. package/dist/index.d.ts +5 -24
  9. package/dist/index.js +841 -21
  10. package/dist/index.js.map +1 -1
  11. package/dist/stdio-transport-DqWq-2iP.d.ts +198 -0
  12. package/package.json +7 -7
  13. package/dist/agent/index.d.ts +0 -7
  14. package/dist/agent/index.d.ts.map +0 -1
  15. package/dist/agent/index.js +0 -5
  16. package/dist/agent/index.js.map +0 -1
  17. package/dist/agent/protocol-handler.d.ts +0 -39
  18. package/dist/agent/protocol-handler.d.ts.map +0 -1
  19. package/dist/agent/protocol-handler.js +0 -142
  20. package/dist/agent/protocol-handler.js.map +0 -1
  21. package/dist/agent/stdio-transport.d.ts +0 -64
  22. package/dist/agent/stdio-transport.d.ts.map +0 -1
  23. package/dist/agent/stdio-transport.js +0 -250
  24. package/dist/agent/stdio-transport.js.map +0 -1
  25. package/dist/agent/tools-registry.d.ts +0 -33
  26. package/dist/agent/tools-registry.d.ts.map +0 -1
  27. package/dist/agent/tools-registry.js +0 -131
  28. package/dist/agent/tools-registry.js.map +0 -1
  29. package/dist/agent/wrongstack-acp-agent.d.ts +0 -32
  30. package/dist/agent/wrongstack-acp-agent.d.ts.map +0 -1
  31. package/dist/agent/wrongstack-acp-agent.js +0 -90
  32. package/dist/agent/wrongstack-acp-agent.js.map +0 -1
  33. package/dist/client/index.d.ts +0 -6
  34. package/dist/client/index.d.ts.map +0 -1
  35. package/dist/client/index.js +0 -4
  36. package/dist/client/index.js.map +0 -1
  37. package/dist/client/tool-translator.d.ts.map +0 -1
  38. package/dist/client/tool-translator.js +0 -112
  39. package/dist/client/tool-translator.js.map +0 -1
  40. package/dist/index.d.ts.map +0 -1
  41. package/dist/integration/acp-subagent-runner.d.ts +0 -34
  42. package/dist/integration/acp-subagent-runner.d.ts.map +0 -1
  43. package/dist/integration/acp-subagent-runner.js +0 -218
  44. package/dist/integration/acp-subagent-runner.js.map +0 -1
  45. package/dist/types/acp-messages.d.ts +0 -133
  46. package/dist/types/acp-messages.d.ts.map +0 -1
  47. package/dist/types/acp-messages.js +0 -2
  48. package/dist/types/acp-messages.js.map +0 -1
@@ -0,0 +1,92 @@
1
+ import { u as ACPToolList, v as ACPToolResult, w as AgentServerTransport, g as ACPMessage } from './stdio-transport-DqWq-2iP.js';
2
+ export { S as StdioTransport } from './stdio-transport-DqWq-2iP.js';
3
+ import { Tool } from '@wrongstack/core';
4
+ import 'node:events';
5
+
6
+ /**
7
+ * Tools registry for ACP agent-side.
8
+ *
9
+ * Translates WrongStack Tool definitions → ACP ACPToolDefinition format.
10
+ * Provides tool lookup and result assembly for the ACP protocol handler.
11
+ */
12
+
13
+ declare class ACPToolsRegistry {
14
+ private tools;
15
+ private readonly owner;
16
+ constructor(owner?: string);
17
+ /**
18
+ * Register one or more tools.
19
+ * Throws on duplicate name unless force=true.
20
+ */
21
+ register(tools: Tool[]): void;
22
+ /**
23
+ * Replace the current tool set.
24
+ */
25
+ setTools(tools: Tool[]): void;
26
+ get(name: string): Tool | undefined;
27
+ has(name: string): boolean;
28
+ list(): Tool[];
29
+ /** Build the ACP tools/list payload from registered tools. */
30
+ buildToolList(): ACPToolList;
31
+ /**
32
+ * Execute a tool by name and return ACP-formatted result.
33
+ * Returns null if the tool is not found.
34
+ */
35
+ execute(name: string, args: Record<string, unknown>, ctx: unknown, signal: AbortSignal): Promise<ACPToolResult | null>;
36
+ }
37
+
38
+ declare class ACPProtocolHandler {
39
+ private readonly transport;
40
+ private readonly registry;
41
+ private readonly context;
42
+ private initialized;
43
+ private readonly signal;
44
+ private pendingCalls;
45
+ constructor(transport: AgentServerTransport, registry: ACPToolsRegistry, context: unknown);
46
+ /** Wire an external abort signal from the ACP client */
47
+ wireAbortController(abortController: AbortController): void;
48
+ /** Process one inbound message. Returns true if this was a terminal message. */
49
+ handleMessage(msg: ACPMessage): Promise<boolean>;
50
+ private handleRequest;
51
+ private handleNotification;
52
+ private handleInitialize;
53
+ private handleToolsList;
54
+ private handleToolCall;
55
+ private handleCancel;
56
+ private handleCancelNotification;
57
+ private handleSessionList;
58
+ private sendError;
59
+ }
60
+
61
+ interface WrongStackACPServerOptions {
62
+ /**
63
+ * Initial tool set. Typically loaded from the WrongStack tool registry
64
+ * via `api.tools.list()` so the ACP server exposes exactly the tools the
65
+ * CLI has configured.
66
+ */
67
+ tools: Tool[];
68
+ /**
69
+ * Owner label for tool metadata. Passed to ACPToolsRegistry.
70
+ * @default 'wrongstack'
71
+ */
72
+ owner?: string;
73
+ }
74
+ declare class WrongStackACPServer {
75
+ private readonly transport;
76
+ private readonly registry;
77
+ private readonly handler;
78
+ private running;
79
+ constructor(opts: WrongStackACPServerOptions);
80
+ /**
81
+ * Start the server. Blocks until the client disconnects.
82
+ *
83
+ * 1. Send the startup marker `[wstack-acp]` so the client
84
+ * knows which stdout line is the protocol boundary.
85
+ * 2. Loop: read messages, dispatch to handler, until EOF or error.
86
+ */
87
+ start(): Promise<void>;
88
+ /** Stop the server. */
89
+ stop(): void;
90
+ }
91
+
92
+ export { ACPProtocolHandler, ACPToolsRegistry, AgentServerTransport, WrongStackACPServer, type WrongStackACPServerOptions };
package/dist/agent.js ADDED
@@ -0,0 +1,420 @@
1
+ import '@wrongstack/core';
2
+ import 'child_process';
3
+ import { fileURLToPath } from 'url';
4
+
5
+ // src/agent/stdio-transport.ts
6
+ var StdioTransport = class {
7
+ stdin = process.stdin;
8
+ stdout = process.stdout;
9
+ stderr = process.stderr;
10
+ buffer = "";
11
+ handlers = /* @__PURE__ */ new Set();
12
+ closed = false;
13
+ resolveRead = null;
14
+ messageQueue = [];
15
+ constructor() {
16
+ this.stdin.resume();
17
+ this.stdin.setEncoding("utf8");
18
+ this.stdin.on("data", (chunk) => this.onData(chunk));
19
+ this.stdin.on("end", () => this.handleClose());
20
+ this.stdin.on("error", (err) => this.failAll(err));
21
+ }
22
+ sendStartupMarker() {
23
+ this.stdout.write("[wstack-acp]\n", "utf8");
24
+ }
25
+ send(msg) {
26
+ if (this.closed) return Promise.resolve();
27
+ return new Promise((resolve) => {
28
+ const line = JSON.stringify(msg) + "\n";
29
+ this.stdout.write(line, "utf8", () => resolve());
30
+ });
31
+ }
32
+ sendRaw(chunk) {
33
+ this.stdout.write(chunk, "utf8");
34
+ }
35
+ read() {
36
+ if (this.messageQueue.length > 0) return Promise.resolve(this.messageQueue.shift());
37
+ if (this.closed) return Promise.resolve(null);
38
+ return new Promise((resolve) => {
39
+ this.resolveRead = resolve;
40
+ });
41
+ }
42
+ onMessage(handler) {
43
+ this.handlers.add(handler);
44
+ return () => this.handlers.delete(handler);
45
+ }
46
+ close() {
47
+ this.closed = true;
48
+ this.stdin.pause();
49
+ this.resolveRead?.(null);
50
+ this.resolveRead = null;
51
+ }
52
+ onData(chunk) {
53
+ this.buffer += chunk;
54
+ const lines = this.buffer.split("\n");
55
+ this.buffer = lines.pop() ?? "";
56
+ for (const raw of lines) {
57
+ if (!raw.trim()) continue;
58
+ try {
59
+ this.dispatch(JSON.parse(raw));
60
+ } catch (err) {
61
+ this.stderr.write(`[wstack-acp parse error] ${err}
62
+ `, "utf8");
63
+ }
64
+ }
65
+ }
66
+ dispatch(msg) {
67
+ if (this.resolveRead) {
68
+ const resolve = this.resolveRead;
69
+ this.resolveRead = null;
70
+ resolve(msg);
71
+ } else {
72
+ this.messageQueue.push(msg);
73
+ }
74
+ for (const handler of this.handlers) {
75
+ try {
76
+ handler(msg);
77
+ } catch (err) {
78
+ this.stderr.write(`[wstack-acp handler error] ${err}
79
+ `, "utf8");
80
+ }
81
+ }
82
+ }
83
+ handleClose() {
84
+ this.closed = true;
85
+ this.resolveRead?.(null);
86
+ this.resolveRead = null;
87
+ }
88
+ failAll(err) {
89
+ this.stderr.write(`[wstack-acp stdin error] ${err.message}
90
+ `, "utf8");
91
+ this.close();
92
+ }
93
+ };
94
+
95
+ // src/agent/tools-registry.ts
96
+ var ACPToolsRegistry = class {
97
+ tools = /* @__PURE__ */ new Map();
98
+ owner;
99
+ constructor(owner = "wrongstack") {
100
+ this.owner = owner;
101
+ }
102
+ /**
103
+ * Register one or more tools.
104
+ * Throws on duplicate name unless force=true.
105
+ */
106
+ register(tools) {
107
+ for (const tool of tools) {
108
+ this.tools.set(tool.name, tool);
109
+ }
110
+ }
111
+ /**
112
+ * Replace the current tool set.
113
+ */
114
+ setTools(tools) {
115
+ this.tools.clear();
116
+ for (const tool of tools) this.tools.set(tool.name, tool);
117
+ }
118
+ get(name) {
119
+ return this.tools.get(name);
120
+ }
121
+ has(name) {
122
+ return this.tools.has(name);
123
+ }
124
+ list() {
125
+ return Array.from(this.tools.values());
126
+ }
127
+ /** Build the ACP tools/list payload from registered tools. */
128
+ buildToolList() {
129
+ return {
130
+ tools: Array.from(this.tools.values()).map(
131
+ (t) => toACPToolDefinition(t, this.owner)
132
+ )
133
+ };
134
+ }
135
+ /**
136
+ * Execute a tool by name and return ACP-formatted result.
137
+ * Returns null if the tool is not found.
138
+ */
139
+ async execute(name, args, ctx, signal) {
140
+ const tool = this.tools.get(name);
141
+ if (!tool) return null;
142
+ try {
143
+ const result = await tool.execute(args, ctx, {
144
+ signal
145
+ });
146
+ return toACPToolResult(result);
147
+ } catch (err) {
148
+ const msg = err instanceof Error ? err.message : String(err);
149
+ return { content: [{ type: "text", text: msg }], isError: true };
150
+ }
151
+ }
152
+ };
153
+ function toACPToolDefinition(tool, _owner) {
154
+ return {
155
+ name: tool.name,
156
+ description: tool.description,
157
+ inputSchema: toACPInputSchema(tool.inputSchema),
158
+ annotations: {
159
+ title: tool.name,
160
+ description: tool.usageHint ?? tool.description,
161
+ priority: toolToPriority(tool),
162
+ alwaysAccept: tool.permission === "auto"
163
+ }
164
+ };
165
+ }
166
+ function toACPInputSchema(src) {
167
+ if (!src || typeof src !== "object") {
168
+ return {};
169
+ }
170
+ const s = src;
171
+ if (s.properties && typeof s.properties === "object") {
172
+ const props = {};
173
+ for (const [k, v] of Object.entries(s.properties)) {
174
+ props[k] = toACPInputSchema(v);
175
+ }
176
+ return {
177
+ type: typeof s.type === "string" ? s.type : void 0,
178
+ properties: props,
179
+ required: Array.isArray(s.required) ? s.required : void 0,
180
+ items: s.items ? toACPInputSchema(s.items) : void 0,
181
+ enum: Array.isArray(s.enum) ? s.enum : void 0,
182
+ description: typeof s.description === "string" ? s.description : void 0,
183
+ default: s.default,
184
+ minimum: typeof s.minimum === "number" ? s.minimum : void 0,
185
+ maximum: typeof s.maximum === "number" ? s.maximum : void 0
186
+ };
187
+ }
188
+ return {
189
+ type: typeof s.type === "string" ? s.type : void 0,
190
+ items: s.items ? toACPInputSchema(s.items) : void 0,
191
+ enum: Array.isArray(s.enum) ? s.enum : void 0,
192
+ description: typeof s.description === "string" ? s.description : void 0,
193
+ default: s.default,
194
+ minimum: typeof s.minimum === "number" ? s.minimum : void 0,
195
+ maximum: typeof s.maximum === "number" ? s.maximum : void 0
196
+ };
197
+ }
198
+ function toACPToolResult(result) {
199
+ const blocks = [];
200
+ if (result === void 0 || result === null) {
201
+ return { content: [{ type: "text", text: "ok" }] };
202
+ }
203
+ if (typeof result === "string") {
204
+ blocks.push({ type: "text", text: result });
205
+ } else if (typeof result === "object") {
206
+ blocks.push({ type: "text", text: JSON.stringify(result, null, 2) });
207
+ } else {
208
+ blocks.push({ type: "text", text: String(result) });
209
+ }
210
+ return { content: blocks };
211
+ }
212
+ function toolToPriority(tool) {
213
+ if (tool.riskTier === "destructive") return "high";
214
+ if (tool.riskTier === "standard" || tool.permission === "confirm") return "medium";
215
+ return "low";
216
+ }
217
+
218
+ // src/agent/protocol-handler.ts
219
+ var WRONGSTACK_VERSION = "0.1.0";
220
+ var WRONGSTACK_CAPABILITIES = [
221
+ "code-generation",
222
+ "async-tools",
223
+ "streaming",
224
+ "progress"
225
+ ];
226
+ var ACPProtocolHandler = class {
227
+ constructor(transport, registry, context) {
228
+ this.transport = transport;
229
+ this.registry = registry;
230
+ this.context = context;
231
+ }
232
+ transport;
233
+ registry;
234
+ context;
235
+ initialized = false;
236
+ signal = new AbortController();
237
+ pendingCalls = /* @__PURE__ */ new Map();
238
+ /** Wire an external abort signal from the ACP client */
239
+ wireAbortController(abortController) {
240
+ abortController.signal.addEventListener("abort", () => {
241
+ for (const id of this.pendingCalls.keys()) {
242
+ this.transport.send({ id, method: "cancel", result: { ok: true } }).catch(() => {
243
+ });
244
+ }
245
+ });
246
+ }
247
+ /** Process one inbound message. Returns true if this was a terminal message. */
248
+ async handleMessage(msg) {
249
+ if (msg.id !== void 0) {
250
+ return this.handleRequest(msg);
251
+ }
252
+ return this.handleNotification(msg);
253
+ }
254
+ async handleRequest(req) {
255
+ if (req.method !== "initialize" && !this.initialized) {
256
+ await this.sendError(req.id ?? null, -32e3, "Not initialized");
257
+ return false;
258
+ }
259
+ const id = req.id;
260
+ switch (req.method) {
261
+ case "initialize":
262
+ return this.handleInitialize(req, id);
263
+ case "ping":
264
+ await this.transport.send({ id, method: "ping", result: { pong: true } });
265
+ return false;
266
+ case "tools/call":
267
+ return this.handleToolCall(req, id);
268
+ case "tools/list":
269
+ return this.handleToolsList(id);
270
+ case "cancel":
271
+ return this.handleCancel(id);
272
+ case "session/list":
273
+ return this.handleSessionList(id);
274
+ case "sessionInfoUpdate":
275
+ await this.transport.send({ id, method: "sessionInfoUpdate", result: { ok: true } });
276
+ return false;
277
+ default:
278
+ await this.sendError(id, -32601, `Unknown method: ${req.method}`);
279
+ return false;
280
+ }
281
+ }
282
+ async handleNotification(n) {
283
+ if (n.method === "cancel") {
284
+ this.handleCancelNotification(n);
285
+ }
286
+ return false;
287
+ }
288
+ async handleInitialize(req, id) {
289
+ this.initialized = true;
290
+ const result = {
291
+ capabilities: WRONGSTACK_CAPABILITIES,
292
+ agentName: "WrongStack",
293
+ agentVersion: WRONGSTACK_VERSION,
294
+ protocolVersion: req.params?.protocolVersion ?? "2024-11",
295
+ ...this.registry.buildToolList()
296
+ };
297
+ await this.transport.send({ id, method: "initialize", result });
298
+ return false;
299
+ }
300
+ async handleToolsList(id) {
301
+ await this.transport.send({
302
+ id,
303
+ method: "tools/list",
304
+ result: this.registry.buildToolList()
305
+ });
306
+ return false;
307
+ }
308
+ async handleToolCall(req, id) {
309
+ const { name, arguments: args } = req.params;
310
+ const runPromise = (async () => {
311
+ if (!this.registry.has(name)) {
312
+ return {
313
+ content: [{ type: "text", text: `Tool not found: ${name}` }],
314
+ isError: true
315
+ };
316
+ }
317
+ const result = await this.registry.execute(
318
+ name,
319
+ args,
320
+ this.context,
321
+ this.signal.signal
322
+ );
323
+ return result ?? { content: [{ type: "text", text: "Tool returned null" }], isError: false };
324
+ })();
325
+ this.pendingCalls.set(id, runPromise);
326
+ try {
327
+ const toolResult = await runPromise;
328
+ this.pendingCalls.delete(id);
329
+ const response = { method: "tools/call", id, result: toolResult };
330
+ await this.transport.send(response);
331
+ } catch (err) {
332
+ this.pendingCalls.delete(id);
333
+ const msg = err instanceof Error ? err.message : String(err);
334
+ await this.transport.send({
335
+ id,
336
+ method: "tools/call",
337
+ result: { content: [{ type: "text", text: msg }], isError: true }
338
+ });
339
+ }
340
+ return false;
341
+ }
342
+ async handleCancel(id) {
343
+ this.pendingCalls.delete(id);
344
+ await this.transport.send({ id, method: "cancel", result: { ok: true } });
345
+ return false;
346
+ }
347
+ handleCancelNotification(_n) {
348
+ }
349
+ async handleSessionList(id) {
350
+ await this.transport.send({
351
+ id,
352
+ method: "session/list",
353
+ result: { sessions: [] }
354
+ });
355
+ return false;
356
+ }
357
+ async sendError(id, code, message) {
358
+ if (id === null) return;
359
+ await this.transport.send({ id, method: "", error: { code, message } });
360
+ }
361
+ };
362
+ var WrongStackACPServer = class {
363
+ transport;
364
+ registry;
365
+ handler;
366
+ running = false;
367
+ constructor(opts) {
368
+ this.transport = new StdioTransport();
369
+ this.registry = new ACPToolsRegistry(opts.owner);
370
+ this.registry.register(opts.tools);
371
+ this.handler = new ACPProtocolHandler(
372
+ this.transport,
373
+ this.registry,
374
+ /* TODO: load WrongStack Context */
375
+ {}
376
+ );
377
+ }
378
+ /**
379
+ * Start the server. Blocks until the client disconnects.
380
+ *
381
+ * 1. Send the startup marker `[wstack-acp]` so the client
382
+ * knows which stdout line is the protocol boundary.
383
+ * 2. Loop: read messages, dispatch to handler, until EOF or error.
384
+ */
385
+ async start() {
386
+ this.transport.sendStartupMarker();
387
+ this.running = true;
388
+ this.transport.onMessage((msg) => {
389
+ void this.handler.handleMessage(msg);
390
+ });
391
+ while (this.running) {
392
+ const msg = await this.transport.read();
393
+ if (!msg) break;
394
+ const terminal = await this.handler.handleMessage(msg);
395
+ if (terminal) break;
396
+ }
397
+ this.transport.close();
398
+ }
399
+ /** Stop the server. */
400
+ stop() {
401
+ this.running = false;
402
+ this.transport.close();
403
+ }
404
+ };
405
+ async function main() {
406
+ const server = new WrongStackACPServer({ tools: [] });
407
+ await server.start();
408
+ }
409
+ var isEntrypoint = process.argv[1] !== void 0 && fileURLToPath(import.meta.url) === process.argv[1];
410
+ if (isEntrypoint) {
411
+ main().catch((err) => {
412
+ process.stderr.write(`[wstack-acp fatal] ${err}
413
+ `);
414
+ process.exit(1);
415
+ });
416
+ }
417
+
418
+ export { ACPProtocolHandler, ACPToolsRegistry, StdioTransport, WrongStackACPServer };
419
+ //# sourceMappingURL=agent.js.map
420
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/agent/stdio-transport.ts","../src/agent/tools-registry.ts","../src/agent/protocol-handler.ts","../src/agent/wrongstack-acp-agent.ts"],"names":[],"mappings":"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","file":"agent.js","sourcesContent":["/**\n * StdioTransport — bidirectional stdin/stdout communication for ACP.\n *\n * ACP uses newline-delimited JSON-RPC 2.0 messages over stdio:\n * client → agent: JSON-RPC request/notification on stdin\n * agent → client: JSON-RPC response/notification on stdout\n *\n * Start message: clients look for the `[wstack-acp]` marker on stdout before\n * treating subsequent lines as protocol messages.\n */\nimport { buildChildEnv } from '@wrongstack/core';\nimport type { ACPMessage } from '../types/acp-messages.js';\n\nexport interface AgentServerTransport {\n send(msg: ACPMessage): Promise<void>;\n sendRaw(chunk: string): void;\n read(): Promise<ACPMessage | null>;\n close(): void;\n onMessage(handler: (msg: ACPMessage) => void): () => void;\n}\n\nexport class StdioTransport implements AgentServerTransport {\n private readonly stdin = process.stdin;\n private readonly stdout = process.stdout;\n private readonly stderr = process.stderr;\n\n private buffer = '';\n private readonly handlers = new Set<(msg: ACPMessage) => void>();\n private closed = false;\n private resolveRead: ((msg: ACPMessage | null) => void) | null = null;\n private messageQueue: ACPMessage[] = [];\n\n constructor() {\n this.stdin.resume();\n this.stdin.setEncoding('utf8');\n this.stdin.on('data', (chunk: string) => this.onData(chunk));\n this.stdin.on('end', () => this.handleClose());\n this.stdin.on('error', (err: Error) => this.failAll(err));\n }\n\n sendStartupMarker(): void {\n this.stdout.write('[wstack-acp]\\n', 'utf8');\n }\n\n send(msg: ACPMessage): Promise<void> {\n if (this.closed) return Promise.resolve();\n return new Promise((resolve) => {\n const line = JSON.stringify(msg) + '\\n';\n this.stdout.write(line, 'utf8', () => resolve());\n });\n }\n\n sendRaw(chunk: string): void {\n this.stdout.write(chunk, 'utf8');\n }\n\n read(): Promise<ACPMessage | null> {\n if (this.messageQueue.length > 0) return Promise.resolve(this.messageQueue.shift()!);\n if (this.closed) return Promise.resolve(null);\n return new Promise((resolve) => {\n this.resolveRead = resolve;\n });\n }\n\n onMessage(handler: (msg: ACPMessage) => void): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n close(): void {\n this.closed = true;\n this.stdin.pause();\n this.resolveRead?.(null);\n this.resolveRead = null;\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 raw of lines) {\n if (!raw.trim()) continue;\n try {\n this.dispatch(JSON.parse(raw) as ACPMessage);\n } catch (err) {\n this.stderr.write(`[wstack-acp parse error] ${err}\\n`, 'utf8');\n }\n }\n }\n\n private dispatch(msg: ACPMessage): void {\n if (this.resolveRead) {\n const resolve = this.resolveRead;\n this.resolveRead = null;\n resolve(msg);\n } else {\n this.messageQueue.push(msg);\n }\n for (const handler of this.handlers) {\n try {\n handler(msg);\n } catch (err) {\n this.stderr.write(`[wstack-acp handler error] ${err}\\n`, 'utf8');\n }\n }\n }\n\n private handleClose(): void {\n this.closed = true;\n this.resolveRead?.(null);\n this.resolveRead = null;\n }\n\n private failAll(err: Error): void {\n this.stderr.write(`[wstack-acp stdin error] ${err.message}\\n`, 'utf8');\n this.close();\n }\n}\n\n// ---------------------------------------------------------------------------\n// ClientTransport — spawns a child ACP agent process (DIR-1)\n// ---------------------------------------------------------------------------\n\nimport { spawn } from 'node:child_process';\nimport type { EventEmitter } from 'node:events';\n\nexport interface ClientTransportOptions {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n cwd?: string;\n handshakeTimeoutMs?: number;\n}\n\nexport interface ACPChildProcess extends EventEmitter {\n stdout: NodeJS.ReadableStream;\n stdin: NodeJS.WritableStream;\n stderr: NodeJS.ReadableStream;\n pid: number | undefined;\n kill(): void;\n}\n\nexport class ClientTransport {\n private child: ACPChildProcess | null = null;\n private buffer = '';\n private readonly handlers = new Set<(msg: ACPMessage) => void>();\n private closed = false;\n private resolveRead: ((msg: ACPMessage | null) => void) | null = null;\n private messageQueue: ACPMessage[] = [];\n private readonly opts: Required<Pick<ClientTransportOptions, 'handshakeTimeoutMs'>> &\n ClientTransportOptions;\n\n constructor(options: ClientTransportOptions) {\n this.opts = {\n handshakeTimeoutMs: 30_000,\n ...options,\n };\n }\n\n async start(): Promise<void> {\n if (this.child) return;\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(\n new Error(`ACP child process failed to start within ${this.opts.handshakeTimeoutMs}ms`),\n );\n }, this.opts.handshakeTimeoutMs);\n\n try {\n this.child = spawn(this.opts.command, this.opts.args ?? [], {\n env: { ...buildChildEnv(), ...this.opts.env },\n cwd: this.opts.cwd,\n stdio: ['pipe', 'pipe', 'pipe'],\n }) as unknown as ACPChildProcess;\n } catch (err) {\n clearTimeout(timeout);\n reject(err);\n return;\n }\n\n const child = this.child;\n\n child.stdout.setEncoding('utf8');\n\n const waitForMarker = (chunk: string) => {\n this.buffer += chunk;\n const idx = this.buffer.indexOf('[wstack-acp]\\n');\n if (idx !== -1) {\n this.buffer = this.buffer.slice(idx + '[wstack-acp]\\n'.length);\n child.stdout.removeListener('data', waitForMarker);\n child.stdout.on('data', (c: string) => this.onChildData(c));\n child.stderr.on('data', (c: string) => this.onChildError(c));\n child.on('close', (code: number | null) => this.onChildClose(code));\n clearTimeout(timeout);\n resolve();\n }\n };\n\n child.stdout.on('data', waitForMarker);\n child.stdout.on('error', (err: Error) => {\n clearTimeout(timeout);\n reject(err);\n });\n child.on('error', (err: Error) => {\n clearTimeout(timeout);\n reject(err);\n });\n });\n }\n\n send(msg: ACPMessage): Promise<void> {\n if (!this.child) return Promise.reject(new Error('ClientTransport not started'));\n return new Promise((resolve, reject) => {\n const line = JSON.stringify(msg) + '\\n';\n this.child!.stdin.write(line, 'utf8', (err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n\n read(): Promise<ACPMessage | null> {\n if (this.messageQueue.length > 0) return Promise.resolve(this.messageQueue.shift()!);\n if (this.closed) return Promise.resolve(null);\n return new Promise((resolve) => {\n this.resolveRead = resolve;\n });\n }\n\n onMessage(handler: (msg: ACPMessage) => void): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n stop(): void {\n if (!this.child) return;\n this.closed = true;\n try {\n this.child.kill();\n } catch {\n // already dead\n }\n this.child = null;\n }\n\n private onChildData(chunk: string): void {\n this.buffer += chunk;\n const lines = this.buffer.split('\\n');\n this.buffer = lines.pop() ?? '';\n\n for (const raw of lines) {\n if (!raw.trim()) continue;\n try {\n this.dispatch(JSON.parse(raw) as ACPMessage);\n } catch {\n // skip malformed\n }\n }\n }\n\n private onChildError(chunk: string): void {\n process.stderr.write(`[acp-child stderr] ${chunk}`, 'utf8');\n }\n\n private onChildClose(code: number | null): void {\n this.closed = true;\n this.resolveRead?.(null);\n this.resolveRead = null;\n if (code !== 0 && code !== null) {\n process.stderr.write(`[acp-child exited with code ${code}]\\n`, 'utf8');\n }\n }\n\n private dispatch(msg: ACPMessage): void {\n if (this.resolveRead) {\n const resolve = this.resolveRead;\n this.resolveRead = null;\n resolve(msg);\n } else {\n this.messageQueue.push(msg);\n }\n for (const handler of this.handlers) {\n try {\n handler(msg);\n } catch {\n // non-fatal\n }\n }\n }\n}\n","/**\n * Tools registry for ACP agent-side.\n *\n * Translates WrongStack Tool definitions → ACP ACPToolDefinition format.\n * Provides tool lookup and result assembly for the ACP protocol handler.\n */\nimport type {Tool} from '@wrongstack/core';\nimport type {\n ACPToolDefinition,\n ACPToolList,\n ACPInputSchema,\n ACPToolResult,\n ContentBlock,\n} from '../types/acp-messages.js';\n\nexport class ACPToolsRegistry {\n private tools = new Map<string, Tool>();\n private readonly owner: string;\n\n constructor(owner = 'wrongstack') {\n this.owner = owner;\n }\n\n /**\n * Register one or more tools.\n * Throws on duplicate name unless force=true.\n */\n register(tools: Tool[]): void {\n for (const tool of tools) {\n this.tools.set(tool.name, tool);\n }\n }\n\n /**\n * Replace the current tool set.\n */\n setTools(tools: Tool[]): void {\n this.tools.clear();\n for (const tool of tools) this.tools.set(tool.name, tool);\n }\n\n get(name: string): Tool | undefined {\n return this.tools.get(name);\n }\n\n has(name: string): boolean {\n return this.tools.has(name);\n }\n\n list(): Tool[] {\n return Array.from(this.tools.values());\n }\n\n /** Build the ACP tools/list payload from registered tools. */\n buildToolList(): ACPToolList {\n return {\n tools: Array.from(this.tools.values()).map((t) =>\n toACPToolDefinition(t, this.owner),\n ),\n };\n }\n\n /**\n * Execute a tool by name and return ACP-formatted result.\n * Returns null if the tool is not found.\n */\n async execute(\n name: string,\n args: Record<string, unknown>,\n ctx: unknown,\n signal: AbortSignal,\n ): Promise<ACPToolResult | null> {\n const tool = this.tools.get(name);\n if (!tool) return null;\n\n try {\n const result = await tool.execute(args, ctx as Parameters<Tool['execute']>[1], {\n signal,\n });\n return toACPToolResult(result);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {content: [{type: 'text', text: msg}], isError: true} satisfies ACPToolResult;\n }\n }\n}\n\n/** Convert a WrongStack Tool → ACP ACPToolDefinition */\nfunction toACPToolDefinition(tool: Tool, _owner: string): ACPToolDefinition {\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: toACPInputSchema(tool.inputSchema),\n annotations: {\n title: tool.name,\n description: tool.usageHint ?? tool.description,\n priority: toolToPriority(tool),\n alwaysAccept: tool.permission === 'auto',\n },\n };\n}\n\n/** Minimal JSON Schema → ACP input schema. ACP uses JSON Schema draft-07. */\nfunction toACPInputSchema(src: unknown): ACPInputSchema {\n if (!src || typeof src !== 'object') {\n return {};\n }\n const s = src as Record<string, unknown>;\n\n // Recursively convert properties\n if (s.properties && typeof s.properties === 'object') {\n const props: Record<string, ACPInputSchema> = {};\n for (const [k, v] of Object.entries(s.properties as Record<string, unknown>)) {\n props[k] = toACPInputSchema(v);\n }\n return {\n type: typeof s.type === 'string' ? s.type : undefined,\n properties: props,\n required: Array.isArray(s.required) ? (s.required as string[]) : undefined,\n items: s.items ? toACPInputSchema(s.items) : undefined,\n enum: Array.isArray(s.enum) ? s.enum : undefined,\n description: typeof s.description === 'string' ? s.description : undefined,\n default: s.default,\n minimum: typeof s.minimum === 'number' ? s.minimum : undefined,\n maximum: typeof s.maximum === 'number' ? s.maximum : undefined,\n };\n }\n\n return {\n type: typeof s.type === 'string' ? s.type : undefined,\n items: s.items ? toACPInputSchema(s.items) : undefined,\n enum: Array.isArray(s.enum) ? s.enum : undefined,\n description: typeof s.description === 'string' ? s.description : undefined,\n default: s.default,\n minimum: typeof s.minimum === 'number' ? s.minimum : undefined,\n maximum: typeof s.maximum === 'number' ? s.maximum : undefined,\n };\n}\n\n/** Convert a WrongStack ToolResult → ACP ContentBlock[] */\nfunction toACPToolResult(result: unknown): ACPToolResult {\n const blocks: ContentBlock[] = [];\n\n if (result === undefined || result === null) {\n return {content: [{type: 'text', text: 'ok'}]};\n }\n\n if (typeof result === 'string') {\n blocks.push({type: 'text', text: result});\n } else if (typeof result === 'object') {\n blocks.push({type: 'text', text: JSON.stringify(result, null, 2)});\n } else {\n blocks.push({type: 'text', text: String(result)});\n }\n\n return {content: blocks};\n}\n\nfunction toolToPriority(tool: Tool): 'high' | 'medium' | 'low' {\n if (tool.riskTier === 'destructive') return 'high';\n if (tool.riskTier === 'standard' || tool.permission === 'confirm') return 'medium';\n return 'low';\n}\n","/**\n * ACPProtocolHandler — state machine for ACP server-side message handling.\n *\n * ACP turn lifecycle:\n * idle → [initialize] → await-turn → [tools/call] → executing\n * → [tool result sent] → idle\n *\n * We implement this as a simple switch on the method name, since the ACP\n * protocol is request/response based (not streaming) on the wire.\n *\n * Concurrency: ACP allows Cancellations and multiple concurrent tool calls\n * within a turn. We handle each tools/call in its own Promise.all.\n */\nimport type {\n ACPMessage,\n ACPRequest,\n ACPNotification,\n ACPInitializeParams,\n ACPToolCallRequest,\n ACPToolResult,\n ACPToolCallResponse,\n} from '../types/acp-messages.js';\nimport type {AgentServerTransport} from './stdio-transport.js';\n\nexport const WRONGSTACK_VERSION = '0.1.0';\nconst WRONGSTACK_CAPABILITIES = [\n 'code-generation',\n 'async-tools',\n 'streaming',\n 'progress',\n];\n\nexport class ACPProtocolHandler {\n private initialized = false;\n private readonly signal = new AbortController();\n private pendingCalls = new Map<string | number, Promise<unknown>>();\n\n constructor(\n private readonly transport: AgentServerTransport,\n private readonly registry: import('./tools-registry.js').ACPToolsRegistry,\n private readonly context: unknown,\n ) {}\n\n /** Wire an external abort signal from the ACP client */\n wireAbortController(abortController: AbortController): void {\n abortController.signal.addEventListener('abort', () => {\n for (const id of this.pendingCalls.keys()) {\n this.transport.send({id, method: 'cancel', result: {ok: true}}).catch(() => {});\n }\n });\n }\n\n /** Process one inbound message. Returns true if this was a terminal message. */\n async handleMessage(msg: ACPMessage): Promise<boolean> {\n if (msg.id !== undefined) {\n return this.handleRequest(msg as ACPRequest);\n }\n return this.handleNotification(msg as ACPNotification);\n }\n\n private async handleRequest(req: ACPRequest): Promise<boolean> {\n if (req.method !== 'initialize' && !this.initialized) {\n await this.sendError(req.id ?? null, -32000, 'Not initialized');\n return false;\n }\n\n // All requests after initialization check have a guaranteed id\n const id = req.id as string | number;\n\n switch (req.method) {\n case 'initialize':\n return this.handleInitialize(req as ACPRequest & {params: ACPInitializeParams}, id);\n case 'ping':\n await this.transport.send({id, method: 'ping', result: {pong: true}});\n return false;\n case 'tools/call':\n return this.handleToolCall(req as ACPRequest & {params: ACPToolCallRequest['params']}, id);\n case 'tools/list':\n return this.handleToolsList(id);\n case 'cancel':\n return this.handleCancel(id);\n case 'session/list':\n return this.handleSessionList(id);\n case 'sessionInfoUpdate':\n await this.transport.send({id, method: 'sessionInfoUpdate', result: {ok: true}});\n return false;\n default:\n await this.sendError(id, -32601, `Unknown method: ${req.method}`);\n return false;\n }\n }\n\n private async handleNotification(n: ACPNotification): Promise<boolean> {\n if (n.method === 'cancel') {\n this.handleCancelNotification(n as ACPNotification & {params?: {reason?: string}});\n }\n return false;\n }\n\n private async handleInitialize(\n req: ACPRequest & {params: ACPInitializeParams},\n id: string | number,\n ): Promise<boolean> {\n this.initialized = true;\n\n const result = {\n capabilities: WRONGSTACK_CAPABILITIES,\n agentName: 'WrongStack',\n agentVersion: WRONGSTACK_VERSION,\n protocolVersion: req.params?.protocolVersion ?? '2024-11',\n ...this.registry.buildToolList(),\n };\n\n await this.transport.send({id, method: 'initialize', result});\n return false;\n }\n\n private async handleToolsList(id: string | number): Promise<boolean> {\n await this.transport.send({\n id,\n method: 'tools/list',\n result: this.registry.buildToolList(),\n });\n return false;\n }\n\n private async handleToolCall(\n req: ACPRequest & {params: {name: string; arguments: Record<string, unknown>}},\n id: string | number,\n ): Promise<boolean> {\n const {name, arguments: args} = req.params;\n\n const runPromise = (async () => {\n if (!this.registry.has(name)) {\n return {\n content: [{type: 'text', text: `Tool not found: ${name}`}],\n isError: true,\n } satisfies ACPToolResult;\n }\n\n const result = await this.registry.execute(\n name,\n args,\n this.context,\n this.signal.signal,\n );\n return result ?? {content: [{type: 'text', text: 'Tool returned null'}], isError: false};\n })();\n\n this.pendingCalls.set(id, runPromise);\n\n try {\n const toolResult = (await runPromise) as ACPToolResult;\n this.pendingCalls.delete(id);\n\n const response: ACPToolCallResponse = {method: 'tools/call', id, result: toolResult};\n await this.transport.send(response);\n } catch (err) {\n this.pendingCalls.delete(id);\n const msg = err instanceof Error ? err.message : String(err);\n await this.transport.send({\n id,\n method: 'tools/call',\n result: {content: [{type: 'text', text: msg}], isError: true},\n });\n }\n\n return false;\n }\n\n private async handleCancel(id: string | number): Promise<boolean> {\n this.pendingCalls.delete(id);\n await this.transport.send({id, method: 'cancel', result: {ok: true}});\n return false;\n }\n\n private handleCancelNotification(\n _n: ACPNotification & {params?: {reason?: string}},\n ): void {\n // Broadcast cancellation to all pending — best-effort\n }\n\n private async handleSessionList(id: string | number): Promise<boolean> {\n await this.transport.send({\n id,\n method: 'session/list',\n result: {sessions: []},\n });\n return false;\n }\n\n private async sendError(id: string | number | null, code: number, message: string): Promise<void> {\n if (id === null) return;\n await this.transport.send({id, method: '', error: {code, message}});\n }\n}\n","/**\n * WrongStackACPServer — ACP server-side entry point.\n *\n * Exposes WrongStack as an ACP-compatible agent. ACP clients (Zed, JetBrains,\n * VS Code ACP extension) spawn this as a subprocess, send JSON-RPC messages\n * over stdio, and receive tool responses.\n *\n * Usage:\n * node dist/agent/wrongstack-acp-agent.js\n *\n * Or via the CLI:\n * wstack acp-server\n *\n * Startup: sends `[wstack-acp]\\n` to stdout so the client knows which process\n * is the ACP server before protocol messages begin.\n */\nimport {fileURLToPath} from 'node:url';\nimport {StdioTransport} from './stdio-transport.js';\nimport {ACPToolsRegistry} from './tools-registry.js';\nimport {ACPProtocolHandler} from './protocol-handler.js';\nimport type {Tool} from '@wrongstack/core';\n\nexport interface WrongStackACPServerOptions {\n /**\n * Initial tool set. Typically loaded from the WrongStack tool registry\n * via `api.tools.list()` so the ACP server exposes exactly the tools the\n * CLI has configured.\n */\n tools: Tool[];\n /**\n * Owner label for tool metadata. Passed to ACPToolsRegistry.\n * @default 'wrongstack'\n */\n owner?: string;\n}\n\nexport class WrongStackACPServer {\n private readonly transport: StdioTransport;\n private readonly registry: ACPToolsRegistry;\n private readonly handler: ACPProtocolHandler;\n private running = false;\n\n constructor(opts: WrongStackACPServerOptions) {\n this.transport = new StdioTransport();\n this.registry = new ACPToolsRegistry(opts.owner);\n this.registry.register(opts.tools);\n this.handler = new ACPProtocolHandler(\n this.transport,\n this.registry,\n /* TODO: load WrongStack Context */ {},\n );\n }\n\n /**\n * Start the server. Blocks until the client disconnects.\n *\n * 1. Send the startup marker `[wstack-acp]` so the client\n * knows which stdout line is the protocol boundary.\n * 2. Loop: read messages, dispatch to handler, until EOF or error.\n */\n async start(): Promise<void> {\n this.transport.sendStartupMarker();\n this.running = true;\n\n // Handle messages via callback + read loop hybrid\n this.transport.onMessage((msg) => {\n void this.handler.handleMessage(msg); // fire-and-forget; ordering is per-message\n });\n\n while (this.running) {\n const msg = await this.transport.read();\n if (!msg) break; // EOF\n const terminal = await this.handler.handleMessage(msg);\n if (terminal) break;\n }\n\n this.transport.close();\n }\n\n /** Stop the server. */\n stop(): void {\n this.running = false;\n this.transport.close();\n }\n}\n\n/**\n * Bootstrap function for `node dist/agent/wrongstack-acp-agent.js`.\n * Instantiates the server with the default tool set.\n *\n * Tool loading: the ACP agent is a subprocess without the full CLI context,\n * so it needs to receive its tools from the parent via environment or a\n * pre-main bootstrap. For now, it uses an empty tool set unless tools are\n * explicitly passed via constructor options.\n *\n * In practice the CLI will instantiate and run WrongStackACPServer directly,\n * passing `api.tools.list()` as the tool set.\n */\nasync function main(): Promise<void> {\n const server = new WrongStackACPServer({tools: []});\n await server.start();\n}\n\n// Only auto-start when this file is the process entrypoint (e.g.\n// `node dist/agent/wrongstack-acp-agent.js`). Importing the module — which the\n// CLI does to reuse `WrongStackACPServer` — must stay side-effect-free, or\n// every launch would start an ACP server and hijack stdin.\nconst isEntrypoint = process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1];\nif (isEntrypoint) {\n main().catch((err) => {\n process.stderr.write(`[wstack-acp fatal] ${err}\\n`);\n process.exit(1);\n });\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export { b as ACPChildProcess, C as ClientTransport, x as ClientTransportOptions } from './stdio-transport-DqWq-2iP.js';
2
+ export { A as ACPSubagentRunnerOptions, T as ToolTranslator, m as makeACPSubagentRunner } from './index-CncECXiF.js';
3
+ import 'node:events';
4
+ import '@wrongstack/core';