@wrongstack/acp 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/agent/index.d.ts +7 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +5 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/protocol-handler.d.ts +40 -0
- package/dist/agent/protocol-handler.d.ts.map +1 -0
- package/dist/agent/protocol-handler.js +144 -0
- package/dist/agent/protocol-handler.js.map +1 -0
- package/dist/agent/stdio-transport.d.ts +74 -0
- package/dist/agent/stdio-transport.d.ts.map +1 -0
- package/dist/agent/stdio-transport.js +239 -0
- package/dist/agent/stdio-transport.js.map +1 -0
- package/dist/agent/tools-registry.d.ts +33 -0
- package/dist/agent/tools-registry.d.ts.map +1 -0
- package/dist/agent/tools-registry.js +137 -0
- package/dist/agent/tools-registry.js.map +1 -0
- package/dist/agent/wrongstack-acp-agent.d.ts +32 -0
- package/dist/agent/wrongstack-acp-agent.d.ts.map +1 -0
- package/dist/agent/wrongstack-acp-agent.js +82 -0
- package/dist/agent/wrongstack-acp-agent.js.map +1 -0
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +4 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/tool-translator.d.ts +63 -0
- package/dist/client/tool-translator.d.ts.map +1 -0
- package/dist/client/tool-translator.js +112 -0
- package/dist/client/tool-translator.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/integration/acp-subagent-runner.d.ts +34 -0
- package/dist/integration/acp-subagent-runner.d.ts.map +1 -0
- package/dist/integration/acp-subagent-runner.js +218 -0
- package/dist/integration/acp-subagent-runner.js.map +1 -0
- package/dist/types/acp-messages.d.ts +133 -0
- package/dist/types/acp-messages.d.ts.map +1 -0
- package/dist/types/acp-messages.js +2 -0
- package/dist/types/acp-messages.js.map +1 -0
- package/package.json +37 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 ECOSTACK TECHNOLOGY OÜ
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { StdioTransport } from './stdio-transport.js';
|
|
2
|
+
export { ACPToolsRegistry } from './tools-registry.js';
|
|
3
|
+
export { ACPProtocolHandler } from './protocol-handler.js';
|
|
4
|
+
export { WrongStackACPServer } from './wrongstack-acp-agent.js';
|
|
5
|
+
export type { WrongStackACPServerOptions } from './wrongstack-acp-agent.js';
|
|
6
|
+
export type { AgentServerTransport } from './stdio-transport.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAC,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAC,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAC,kBAAkB,EAAC,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAC,mBAAmB,EAAC,MAAM,2BAA2B,CAAC;AAC9D,YAAY,EAAC,0BAA0B,EAAC,MAAM,2BAA2B,CAAC;AAC1E,YAAY,EAAC,oBAAoB,EAAC,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { StdioTransport } from './stdio-transport.js';
|
|
2
|
+
export { ACPToolsRegistry } from './tools-registry.js';
|
|
3
|
+
export { ACPProtocolHandler } from './protocol-handler.js';
|
|
4
|
+
export { WrongStackACPServer } from './wrongstack-acp-agent.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAC,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAC,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAC,kBAAkB,EAAC,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAC,mBAAmB,EAAC,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ACPProtocolHandler — state machine for ACP server-side message handling.
|
|
3
|
+
*
|
|
4
|
+
* ACP turn lifecycle:
|
|
5
|
+
* idle → [initialize] → await-turn → [tools/call] → executing
|
|
6
|
+
* → [tool result sent] → idle
|
|
7
|
+
*
|
|
8
|
+
* We implement this as a simple switch on the method name, since the ACP
|
|
9
|
+
* protocol is request/response based (not streaming) on the wire.
|
|
10
|
+
*
|
|
11
|
+
* Concurrency: ACP allows Cancellations and multiple concurrent tool calls
|
|
12
|
+
* within a turn. We handle each tools/call in its own Promise.all.
|
|
13
|
+
*/
|
|
14
|
+
import type { ACPMessage } from '../types/acp-messages.js';
|
|
15
|
+
import type { AgentServerTransport } from './stdio-transport.js';
|
|
16
|
+
export declare const WRONGSTACK_VERSION = "0.1.0";
|
|
17
|
+
export declare class ACPProtocolHandler {
|
|
18
|
+
private readonly transport;
|
|
19
|
+
private readonly registry;
|
|
20
|
+
private readonly context;
|
|
21
|
+
private initialized;
|
|
22
|
+
private sessionId;
|
|
23
|
+
private readonly signal;
|
|
24
|
+
private pendingCalls;
|
|
25
|
+
constructor(transport: AgentServerTransport, registry: import('./tools-registry.js').ACPToolsRegistry, context: unknown);
|
|
26
|
+
/** Wire an external abort signal from the ACP client */
|
|
27
|
+
wireAbortController(abortController: AbortController): void;
|
|
28
|
+
/** Process one inbound message. Returns true if this was a terminal message. */
|
|
29
|
+
handleMessage(msg: ACPMessage): Promise<boolean>;
|
|
30
|
+
private handleRequest;
|
|
31
|
+
private handleNotification;
|
|
32
|
+
private handleInitialize;
|
|
33
|
+
private handleToolsList;
|
|
34
|
+
private handleToolCall;
|
|
35
|
+
private handleCancel;
|
|
36
|
+
private handleCancelNotification;
|
|
37
|
+
private handleSessionList;
|
|
38
|
+
private sendError;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=protocol-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol-handler.d.ts","sourceRoot":"","sources":["../../src/agent/protocol-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EACV,UAAU,EAOX,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,sBAAsB,CAAC;AAE/D,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAQ1C,qBAAa,kBAAkB;IAO3B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAR1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,YAAY,CAAgD;gBAGjD,SAAS,EAAE,oBAAoB,EAC/B,QAAQ,EAAE,OAAO,qBAAqB,EAAE,gBAAgB,EACxD,OAAO,EAAE,OAAO;IAGnC,wDAAwD;IACxD,mBAAmB,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI;IAQ3D,gFAAgF;IAC1E,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;YAOxC,aAAa;YAgCb,kBAAkB;YAOlB,gBAAgB;YAmBhB,eAAe;YASf,cAAc;YA4Cd,YAAY;IAM1B,OAAO,CAAC,wBAAwB;YAMlB,iBAAiB;YASjB,SAAS;CAIxB"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
export const WRONGSTACK_VERSION = '0.1.0';
|
|
2
|
+
const WRONGSTACK_CAPABILITIES = [
|
|
3
|
+
'code-generation',
|
|
4
|
+
'async-tools',
|
|
5
|
+
'streaming',
|
|
6
|
+
'progress',
|
|
7
|
+
];
|
|
8
|
+
export class ACPProtocolHandler {
|
|
9
|
+
transport;
|
|
10
|
+
registry;
|
|
11
|
+
context;
|
|
12
|
+
initialized = false;
|
|
13
|
+
sessionId;
|
|
14
|
+
signal = new AbortController();
|
|
15
|
+
pendingCalls = new Map();
|
|
16
|
+
constructor(transport, registry, context) {
|
|
17
|
+
this.transport = transport;
|
|
18
|
+
this.registry = registry;
|
|
19
|
+
this.context = context;
|
|
20
|
+
}
|
|
21
|
+
/** Wire an external abort signal from the ACP client */
|
|
22
|
+
wireAbortController(abortController) {
|
|
23
|
+
abortController.signal.addEventListener('abort', () => {
|
|
24
|
+
for (const id of this.pendingCalls.keys()) {
|
|
25
|
+
this.transport.send({ id, method: 'cancel', result: { ok: true } }).catch(() => { });
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/** Process one inbound message. Returns true if this was a terminal message. */
|
|
30
|
+
async handleMessage(msg) {
|
|
31
|
+
if (msg.id !== undefined) {
|
|
32
|
+
return this.handleRequest(msg);
|
|
33
|
+
}
|
|
34
|
+
return this.handleNotification(msg);
|
|
35
|
+
}
|
|
36
|
+
async handleRequest(req) {
|
|
37
|
+
if (req.method !== 'initialize' && !this.initialized) {
|
|
38
|
+
await this.sendError(req.id ?? null, -32000, 'Not initialized');
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
// All requests after initialization check have a guaranteed id
|
|
42
|
+
const id = req.id;
|
|
43
|
+
switch (req.method) {
|
|
44
|
+
case 'initialize':
|
|
45
|
+
return this.handleInitialize(req, id);
|
|
46
|
+
case 'ping':
|
|
47
|
+
await this.transport.send({ id, method: 'ping', result: { pong: true } });
|
|
48
|
+
return false;
|
|
49
|
+
case 'tools/call':
|
|
50
|
+
return this.handleToolCall(req, id);
|
|
51
|
+
case 'tools/list':
|
|
52
|
+
return this.handleToolsList(id);
|
|
53
|
+
case 'cancel':
|
|
54
|
+
return this.handleCancel(id);
|
|
55
|
+
case 'session/list':
|
|
56
|
+
return this.handleSessionList(id);
|
|
57
|
+
case 'sessionInfoUpdate':
|
|
58
|
+
await this.transport.send({ id, method: 'sessionInfoUpdate', result: { ok: true } });
|
|
59
|
+
return false;
|
|
60
|
+
default:
|
|
61
|
+
await this.sendError(id, -32601, `Unknown method: ${req.method}`);
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async handleNotification(n) {
|
|
66
|
+
if (n.method === 'cancel') {
|
|
67
|
+
this.handleCancelNotification(n);
|
|
68
|
+
}
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
async handleInitialize(req, id) {
|
|
72
|
+
this.sessionId = req.params?.sessionId ?? crypto.randomUUID();
|
|
73
|
+
this.initialized = true;
|
|
74
|
+
const result = {
|
|
75
|
+
capabilities: WRONGSTACK_CAPABILITIES,
|
|
76
|
+
agentName: 'WrongStack',
|
|
77
|
+
agentVersion: WRONGSTACK_VERSION,
|
|
78
|
+
protocolVersion: req.params?.protocolVersion ?? '2024-11',
|
|
79
|
+
...this.registry.buildToolList(),
|
|
80
|
+
};
|
|
81
|
+
await this.transport.send({ id, method: 'initialize', result });
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
async handleToolsList(id) {
|
|
85
|
+
await this.transport.send({
|
|
86
|
+
id,
|
|
87
|
+
method: 'tools/list',
|
|
88
|
+
result: this.registry.buildToolList(),
|
|
89
|
+
});
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
async handleToolCall(req, id) {
|
|
93
|
+
const { name, arguments: args } = req.params;
|
|
94
|
+
const runPromise = (async () => {
|
|
95
|
+
if (!this.registry.has(name)) {
|
|
96
|
+
return {
|
|
97
|
+
content: [{ type: 'text', text: `Tool not found: ${name}` }],
|
|
98
|
+
isError: true,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
const result = await this.registry.execute(name, args, this.context, this.signal.signal);
|
|
102
|
+
return result ?? { content: [{ type: 'text', text: 'Tool returned null' }], isError: false };
|
|
103
|
+
})();
|
|
104
|
+
this.pendingCalls.set(id, runPromise);
|
|
105
|
+
try {
|
|
106
|
+
const toolResult = (await runPromise);
|
|
107
|
+
this.pendingCalls.delete(id);
|
|
108
|
+
const response = { method: 'tools/call', id, result: toolResult };
|
|
109
|
+
await this.transport.send(response);
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
this.pendingCalls.delete(id);
|
|
113
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
114
|
+
await this.transport.send({
|
|
115
|
+
id,
|
|
116
|
+
method: 'tools/call',
|
|
117
|
+
result: { content: [{ type: 'text', text: msg }], isError: true },
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
async handleCancel(id) {
|
|
123
|
+
this.pendingCalls.delete(id);
|
|
124
|
+
await this.transport.send({ id, method: 'cancel', result: { ok: true } });
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
handleCancelNotification(n) {
|
|
128
|
+
// Broadcast cancellation to all pending — best-effort
|
|
129
|
+
}
|
|
130
|
+
async handleSessionList(id) {
|
|
131
|
+
await this.transport.send({
|
|
132
|
+
id,
|
|
133
|
+
method: 'session/list',
|
|
134
|
+
result: { sessions: [] },
|
|
135
|
+
});
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
async sendError(id, code, message) {
|
|
139
|
+
if (id === null)
|
|
140
|
+
return;
|
|
141
|
+
await this.transport.send({ id, method: '', error: { code, message } });
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=protocol-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol-handler.js","sourceRoot":"","sources":["../../src/agent/protocol-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StdioTransport — bidirectional stdin/stdout communication for ACP.
|
|
3
|
+
*
|
|
4
|
+
* ACP uses newline-delimited JSON-RPC 2.0 messages over stdio:
|
|
5
|
+
* client → agent: JSON-RPC request/notification on stdin
|
|
6
|
+
* agent → client: JSON-RPC response/notification on stdout
|
|
7
|
+
*
|
|
8
|
+
* Start message: clients look for the `[wstack-acp]` marker on stdout before
|
|
9
|
+
* treating subsequent lines as protocol messages.
|
|
10
|
+
*/
|
|
11
|
+
import { ACPMessage } from '../types/acp-messages.js';
|
|
12
|
+
export interface AgentServerTransport {
|
|
13
|
+
send(msg: ACPMessage): Promise<void>;
|
|
14
|
+
sendRaw(chunk: string): void;
|
|
15
|
+
read(): Promise<ACPMessage | null>;
|
|
16
|
+
close(): void;
|
|
17
|
+
onMessage(handler: (msg: ACPMessage) => void): () => void;
|
|
18
|
+
}
|
|
19
|
+
export declare class StdioTransport implements AgentServerTransport {
|
|
20
|
+
private readonly stdin;
|
|
21
|
+
private readonly stdout;
|
|
22
|
+
private readonly stderr;
|
|
23
|
+
private buffer;
|
|
24
|
+
private readonly handlers;
|
|
25
|
+
private closed;
|
|
26
|
+
private resolveRead;
|
|
27
|
+
private messageQueue;
|
|
28
|
+
constructor();
|
|
29
|
+
sendStartupMarker(): void;
|
|
30
|
+
send(msg: ACPMessage): Promise<void>;
|
|
31
|
+
sendRaw(chunk: string): void;
|
|
32
|
+
read(): Promise<ACPMessage | null>;
|
|
33
|
+
onMessage(handler: (msg: ACPMessage) => void): () => void;
|
|
34
|
+
close(): void;
|
|
35
|
+
private onData;
|
|
36
|
+
private dispatch;
|
|
37
|
+
private handleClose;
|
|
38
|
+
private failAll;
|
|
39
|
+
}
|
|
40
|
+
import { EventEmitter } from 'node:events';
|
|
41
|
+
export interface ClientTransportOptions {
|
|
42
|
+
command: string;
|
|
43
|
+
args?: string[];
|
|
44
|
+
env?: Record<string, string>;
|
|
45
|
+
cwd?: string;
|
|
46
|
+
handshakeTimeoutMs?: number;
|
|
47
|
+
}
|
|
48
|
+
export interface ACPChildProcess extends EventEmitter {
|
|
49
|
+
stdout: NodeJS.ReadableStream;
|
|
50
|
+
stdin: NodeJS.WritableStream;
|
|
51
|
+
stderr: NodeJS.ReadableStream;
|
|
52
|
+
pid: number | undefined;
|
|
53
|
+
kill(): void;
|
|
54
|
+
}
|
|
55
|
+
export declare class ClientTransport {
|
|
56
|
+
private child;
|
|
57
|
+
private buffer;
|
|
58
|
+
private readonly handlers;
|
|
59
|
+
private closed;
|
|
60
|
+
private resolveRead;
|
|
61
|
+
private messageQueue;
|
|
62
|
+
private readonly opts;
|
|
63
|
+
constructor(options: ClientTransportOptions);
|
|
64
|
+
start(): Promise<void>;
|
|
65
|
+
send(msg: ACPMessage): Promise<void>;
|
|
66
|
+
read(): Promise<ACPMessage | null>;
|
|
67
|
+
onMessage(handler: (msg: ACPMessage) => void): () => void;
|
|
68
|
+
stop(): void;
|
|
69
|
+
private onChildData;
|
|
70
|
+
private onChildError;
|
|
71
|
+
private onChildClose;
|
|
72
|
+
private dispatch;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=stdio-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio-transport.d.ts","sourceRoot":"","sources":["../../src/agent/stdio-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAC,UAAU,EAAC,MAAM,0BAA0B,CAAC;AAEpD,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACnC,KAAK,IAAI,IAAI,CAAC;IACd,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CAC3D;AAED,qBAAa,cAAe,YAAW,oBAAoB;IACzD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiB;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IAEzC,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwC;IACjE,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAmD;IACtE,OAAO,CAAC,YAAY,CAAoB;;IAUxC,iBAAiB,IAAI,IAAI;IAIzB,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAQpC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI5B,IAAI,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAQlC,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,GAAG,MAAM,IAAI;IAKzD,KAAK,IAAI,IAAI;IAOb,OAAO,CAAC,MAAM;IAed,OAAO,CAAC,QAAQ;IAiBhB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,OAAO;CAIhB;AAOD,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AAEzC,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC;IAC9B,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,IAAI,IAAI,IAAI,CAAC;CACd;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwC;IACjE,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAmD;IACtE,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,QAAQ,CAAC,IAAI,CACI;gBAEb,OAAO,EAAE,sBAAsB;IAOrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiD5B,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAWpC,IAAI,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAQlC,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,GAAG,MAAM,IAAI;IAKzD,IAAI,IAAI,IAAI;IAWZ,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,QAAQ;CAgBjB"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
export class StdioTransport {
|
|
2
|
+
stdin = process.stdin;
|
|
3
|
+
stdout = process.stdout;
|
|
4
|
+
stderr = process.stderr;
|
|
5
|
+
buffer = '';
|
|
6
|
+
handlers = new Set();
|
|
7
|
+
closed = false;
|
|
8
|
+
resolveRead = null;
|
|
9
|
+
messageQueue = [];
|
|
10
|
+
constructor() {
|
|
11
|
+
this.stdin.resume();
|
|
12
|
+
this.stdin.setEncoding('utf8');
|
|
13
|
+
this.stdin.on('data', (chunk) => this.onData(chunk));
|
|
14
|
+
this.stdin.on('end', () => this.handleClose());
|
|
15
|
+
this.stdin.on('error', (err) => this.failAll(err));
|
|
16
|
+
}
|
|
17
|
+
sendStartupMarker() {
|
|
18
|
+
this.stdout.write('[wstack-acp]\n', 'utf8');
|
|
19
|
+
}
|
|
20
|
+
send(msg) {
|
|
21
|
+
if (this.closed)
|
|
22
|
+
return Promise.resolve();
|
|
23
|
+
return new Promise((resolve) => {
|
|
24
|
+
const line = JSON.stringify(msg) + '\n';
|
|
25
|
+
this.stdout.write(line, 'utf8', () => resolve());
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
sendRaw(chunk) {
|
|
29
|
+
this.stdout.write(chunk, 'utf8');
|
|
30
|
+
}
|
|
31
|
+
read() {
|
|
32
|
+
if (this.messageQueue.length > 0)
|
|
33
|
+
return Promise.resolve(this.messageQueue.shift());
|
|
34
|
+
if (this.closed)
|
|
35
|
+
return Promise.resolve(null);
|
|
36
|
+
return new Promise((resolve) => {
|
|
37
|
+
this.resolveRead = resolve;
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
onMessage(handler) {
|
|
41
|
+
this.handlers.add(handler);
|
|
42
|
+
return () => this.handlers.delete(handler);
|
|
43
|
+
}
|
|
44
|
+
close() {
|
|
45
|
+
this.closed = true;
|
|
46
|
+
this.stdin.pause();
|
|
47
|
+
this.resolveRead?.(null);
|
|
48
|
+
this.resolveRead = null;
|
|
49
|
+
}
|
|
50
|
+
onData(chunk) {
|
|
51
|
+
this.buffer += chunk;
|
|
52
|
+
const lines = this.buffer.split('\n');
|
|
53
|
+
this.buffer = lines.pop() ?? '';
|
|
54
|
+
for (const raw of lines) {
|
|
55
|
+
if (!raw.trim())
|
|
56
|
+
continue;
|
|
57
|
+
try {
|
|
58
|
+
this.dispatch(JSON.parse(raw));
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
this.stderr.write(`[wstack-acp parse error] ${err}\n`, 'utf8');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
dispatch(msg) {
|
|
66
|
+
if (this.resolveRead) {
|
|
67
|
+
const resolve = this.resolveRead;
|
|
68
|
+
this.resolveRead = null;
|
|
69
|
+
resolve(msg);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
this.messageQueue.push(msg);
|
|
73
|
+
}
|
|
74
|
+
for (const handler of this.handlers) {
|
|
75
|
+
try {
|
|
76
|
+
handler(msg);
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
this.stderr.write(`[wstack-acp handler error] ${err}\n`, '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}\n`, 'utf8');
|
|
90
|
+
this.close();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
// ClientTransport — spawns a child ACP agent process (DIR-1)
|
|
95
|
+
// ---------------------------------------------------------------------------
|
|
96
|
+
import { spawn } from 'node:child_process';
|
|
97
|
+
export class ClientTransport {
|
|
98
|
+
child = null;
|
|
99
|
+
buffer = '';
|
|
100
|
+
handlers = new Set();
|
|
101
|
+
closed = false;
|
|
102
|
+
resolveRead = null;
|
|
103
|
+
messageQueue = [];
|
|
104
|
+
opts;
|
|
105
|
+
constructor(options) {
|
|
106
|
+
this.opts = {
|
|
107
|
+
handshakeTimeoutMs: 30_000,
|
|
108
|
+
...options,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
async start() {
|
|
112
|
+
if (this.child)
|
|
113
|
+
return;
|
|
114
|
+
return new Promise((resolve, reject) => {
|
|
115
|
+
const timeout = setTimeout(() => {
|
|
116
|
+
reject(new Error(`ACP child process failed to start within ${this.opts.handshakeTimeoutMs}ms`));
|
|
117
|
+
}, this.opts.handshakeTimeoutMs);
|
|
118
|
+
try {
|
|
119
|
+
this.child = spawn(this.opts.command, this.opts.args ?? [], {
|
|
120
|
+
env: { ...process.env, ...this.opts.env },
|
|
121
|
+
cwd: this.opts.cwd,
|
|
122
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
clearTimeout(timeout);
|
|
127
|
+
reject(err);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const child = this.child;
|
|
131
|
+
child.stdout.setEncoding('utf8');
|
|
132
|
+
const waitForMarker = (chunk) => {
|
|
133
|
+
this.buffer += chunk;
|
|
134
|
+
const idx = this.buffer.indexOf('[wstack-acp]\n');
|
|
135
|
+
if (idx !== -1) {
|
|
136
|
+
this.buffer = this.buffer.slice(idx + '[wstack-acp]\n'.length);
|
|
137
|
+
child.stdout.removeListener('data', waitForMarker);
|
|
138
|
+
child.stdout.on('data', (c) => this.onChildData(c));
|
|
139
|
+
child.stderr.on('data', (c) => this.onChildError(c));
|
|
140
|
+
child.on('close', (code) => this.onChildClose(code));
|
|
141
|
+
clearTimeout(timeout);
|
|
142
|
+
resolve();
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
child.stdout.on('data', waitForMarker);
|
|
146
|
+
child.stdout.on('error', (err) => {
|
|
147
|
+
clearTimeout(timeout);
|
|
148
|
+
reject(err);
|
|
149
|
+
});
|
|
150
|
+
child.on('error', (err) => {
|
|
151
|
+
clearTimeout(timeout);
|
|
152
|
+
reject(err);
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
send(msg) {
|
|
157
|
+
if (!this.child)
|
|
158
|
+
return Promise.reject(new Error('ClientTransport not started'));
|
|
159
|
+
return new Promise((resolve, reject) => {
|
|
160
|
+
const line = JSON.stringify(msg) + '\n';
|
|
161
|
+
this.child.stdin.write(line, 'utf8', (err) => {
|
|
162
|
+
if (err)
|
|
163
|
+
reject(err);
|
|
164
|
+
else
|
|
165
|
+
resolve();
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
read() {
|
|
170
|
+
if (this.messageQueue.length > 0)
|
|
171
|
+
return Promise.resolve(this.messageQueue.shift());
|
|
172
|
+
if (this.closed)
|
|
173
|
+
return Promise.resolve(null);
|
|
174
|
+
return new Promise((resolve) => {
|
|
175
|
+
this.resolveRead = resolve;
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
onMessage(handler) {
|
|
179
|
+
this.handlers.add(handler);
|
|
180
|
+
return () => this.handlers.delete(handler);
|
|
181
|
+
}
|
|
182
|
+
stop() {
|
|
183
|
+
if (!this.child)
|
|
184
|
+
return;
|
|
185
|
+
this.closed = true;
|
|
186
|
+
try {
|
|
187
|
+
this.child.kill();
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
// already dead
|
|
191
|
+
}
|
|
192
|
+
this.child = null;
|
|
193
|
+
}
|
|
194
|
+
onChildData(chunk) {
|
|
195
|
+
this.buffer += chunk;
|
|
196
|
+
const lines = this.buffer.split('\n');
|
|
197
|
+
this.buffer = lines.pop() ?? '';
|
|
198
|
+
for (const raw of lines) {
|
|
199
|
+
if (!raw.trim())
|
|
200
|
+
continue;
|
|
201
|
+
try {
|
|
202
|
+
this.dispatch(JSON.parse(raw));
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
// skip malformed
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
onChildError(chunk) {
|
|
210
|
+
process.stderr.write(`[acp-child stderr] ${chunk}`, 'utf8');
|
|
211
|
+
}
|
|
212
|
+
onChildClose(code) {
|
|
213
|
+
this.closed = true;
|
|
214
|
+
this.resolveRead?.(null);
|
|
215
|
+
this.resolveRead = null;
|
|
216
|
+
if (code !== 0 && code !== null) {
|
|
217
|
+
process.stderr.write(`[acp-child exited with code ${code}]\n`, 'utf8');
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
dispatch(msg) {
|
|
221
|
+
if (this.resolveRead) {
|
|
222
|
+
const resolve = this.resolveRead;
|
|
223
|
+
this.resolveRead = null;
|
|
224
|
+
resolve(msg);
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
this.messageQueue.push(msg);
|
|
228
|
+
}
|
|
229
|
+
for (const handler of this.handlers) {
|
|
230
|
+
try {
|
|
231
|
+
handler(msg);
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
// non-fatal
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=stdio-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio-transport.js","sourceRoot":"","sources":["../../src/agent/stdio-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tools registry for ACP agent-side.
|
|
3
|
+
*
|
|
4
|
+
* Translates WrongStack Tool definitions → ACP ACPToolDefinition format.
|
|
5
|
+
* Provides tool lookup and result assembly for the ACP protocol handler.
|
|
6
|
+
*/
|
|
7
|
+
import type { Tool } from '@wrongstack/core';
|
|
8
|
+
import type { ACPToolList, ACPToolResult } from '../types/acp-messages.js';
|
|
9
|
+
export declare class ACPToolsRegistry {
|
|
10
|
+
private tools;
|
|
11
|
+
private readonly owner;
|
|
12
|
+
constructor(owner?: string);
|
|
13
|
+
/**
|
|
14
|
+
* Register one or more tools.
|
|
15
|
+
* Throws on duplicate name unless force=true.
|
|
16
|
+
*/
|
|
17
|
+
register(tools: Tool[]): void;
|
|
18
|
+
/**
|
|
19
|
+
* Replace the current tool set.
|
|
20
|
+
*/
|
|
21
|
+
setTools(tools: Tool[]): void;
|
|
22
|
+
get(name: string): Tool | undefined;
|
|
23
|
+
has(name: string): boolean;
|
|
24
|
+
list(): Tool[];
|
|
25
|
+
/** Build the ACP tools/list payload from registered tools. */
|
|
26
|
+
buildToolList(): ACPToolList;
|
|
27
|
+
/**
|
|
28
|
+
* Execute a tool by name and return ACP-formatted result.
|
|
29
|
+
* Returns null if the tool is not found.
|
|
30
|
+
*/
|
|
31
|
+
execute(name: string, args: Record<string, unknown>, ctx: unknown, signal: AbortSignal): Promise<ACPToolResult | null>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=tools-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools-registry.d.ts","sourceRoot":"","sources":["../../src/agent/tools-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,kBAAkB,CAAC;AAC3C,OAAO,KAAK,EAEV,WAAW,EAEX,aAAa,EAEd,MAAM,0BAA0B,CAAC;AASlC,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,KAAK,SAAe;IAIhC;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;IAM7B;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;IAK7B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAInC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,IAAI,IAAI,IAAI,EAAE;IAId,8DAA8D;IAC9D,aAAa,IAAI,WAAW;IAQ5B;;;OAGG;IACG,OAAO,CACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;CAcjC"}
|