@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.
Files changed (42) hide show
  1. package/LICENSE +21 -0
  2. package/dist/agent/index.d.ts +7 -0
  3. package/dist/agent/index.d.ts.map +1 -0
  4. package/dist/agent/index.js +5 -0
  5. package/dist/agent/index.js.map +1 -0
  6. package/dist/agent/protocol-handler.d.ts +40 -0
  7. package/dist/agent/protocol-handler.d.ts.map +1 -0
  8. package/dist/agent/protocol-handler.js +144 -0
  9. package/dist/agent/protocol-handler.js.map +1 -0
  10. package/dist/agent/stdio-transport.d.ts +74 -0
  11. package/dist/agent/stdio-transport.d.ts.map +1 -0
  12. package/dist/agent/stdio-transport.js +239 -0
  13. package/dist/agent/stdio-transport.js.map +1 -0
  14. package/dist/agent/tools-registry.d.ts +33 -0
  15. package/dist/agent/tools-registry.d.ts.map +1 -0
  16. package/dist/agent/tools-registry.js +137 -0
  17. package/dist/agent/tools-registry.js.map +1 -0
  18. package/dist/agent/wrongstack-acp-agent.d.ts +32 -0
  19. package/dist/agent/wrongstack-acp-agent.d.ts.map +1 -0
  20. package/dist/agent/wrongstack-acp-agent.js +82 -0
  21. package/dist/agent/wrongstack-acp-agent.js.map +1 -0
  22. package/dist/client/index.d.ts +6 -0
  23. package/dist/client/index.d.ts.map +1 -0
  24. package/dist/client/index.js +4 -0
  25. package/dist/client/index.js.map +1 -0
  26. package/dist/client/tool-translator.d.ts +63 -0
  27. package/dist/client/tool-translator.d.ts.map +1 -0
  28. package/dist/client/tool-translator.js +112 -0
  29. package/dist/client/tool-translator.js.map +1 -0
  30. package/dist/index.d.ts +24 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +22 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/integration/acp-subagent-runner.d.ts +34 -0
  35. package/dist/integration/acp-subagent-runner.d.ts.map +1 -0
  36. package/dist/integration/acp-subagent-runner.js +218 -0
  37. package/dist/integration/acp-subagent-runner.js.map +1 -0
  38. package/dist/types/acp-messages.d.ts +133 -0
  39. package/dist/types/acp-messages.d.ts.map +1 -0
  40. package/dist/types/acp-messages.js +2 -0
  41. package/dist/types/acp-messages.js.map +1 -0
  42. package/package.json +37 -0
@@ -0,0 +1,218 @@
1
+ import { ClientTransport } from '../agent/stdio-transport.js';
2
+ import { ToolTranslator, parseToolResponse } from '../client/tool-translator.js';
3
+ /** Map WrongStack ACP agent role → how to spawn it. */
4
+ export const ACP_AGENT_COMMANDS = {
5
+ cline: {
6
+ command: 'npx',
7
+ args: ['-y', '@agentify/cline'],
8
+ role: 'cline',
9
+ },
10
+ 'gemini-cli': {
11
+ command: 'gemini',
12
+ role: 'gemini-cli',
13
+ },
14
+ copilot: {
15
+ command: 'gh',
16
+ args: ['copilot', 'agent'],
17
+ role: 'copilot',
18
+ },
19
+ openhands: {
20
+ command: 'openhands',
21
+ role: 'openhands',
22
+ },
23
+ goose: {
24
+ command: 'goose',
25
+ role: 'goose',
26
+ },
27
+ };
28
+ /**
29
+ * Build an ACPSubagentRunner for a given role, or a generic one from explicit options.
30
+ */
31
+ export async function makeACPSubagentRunner(options) {
32
+ const transport = new ClientTransport({
33
+ command: options.command,
34
+ args: options.args,
35
+ env: options.env,
36
+ cwd: options.cwd,
37
+ handshakeTimeoutMs: 30_000,
38
+ });
39
+ const translator = new ToolTranslator(options.toolTranslatorOpts);
40
+ const activeAbort = new AbortController();
41
+ let sessionStarted = false;
42
+ const startSession = async () => {
43
+ if (sessionStarted)
44
+ return;
45
+ await transport.start();
46
+ await transport.send({
47
+ method: 'initialize',
48
+ id: '1',
49
+ params: {
50
+ capabilities: ['code-generation', 'async-tools', 'streaming', 'progress'],
51
+ protocolVersion: '2024-11',
52
+ sessionId: options.role ?? 'wrongstack-subagent',
53
+ },
54
+ });
55
+ const initResp = await transport.read();
56
+ if (!initResp || initResp.error) {
57
+ throw new Error(`ACP initialize failed: ${initResp?.error?.message ?? 'no response'}`);
58
+ }
59
+ translator.attachToTransport({
60
+ onMessage: (h) => transport.onMessage(h),
61
+ send: (m) => transport.send(m),
62
+ });
63
+ sessionStarted = true;
64
+ };
65
+ const runner = async (task, ctx) => {
66
+ ctx.signal.addEventListener('abort', () => {
67
+ activeAbort.abort();
68
+ transport.stop();
69
+ });
70
+ await startSession();
71
+ const callId = crypto.randomUUID();
72
+ let toolResult = null;
73
+ const resultPromise = new Promise((resolve, reject) => {
74
+ const budgetMs = ctx.budget.limits.timeoutMs ?? 300_000;
75
+ const timeout = setTimeout(() => {
76
+ reject(new Error(`ACP task timed out for subagent ${ctx.subagentId} (${budgetMs}ms budget)`));
77
+ }, budgetMs);
78
+ transport.onMessage((msg) => {
79
+ if (msg.method === 'tools/call' && msg.id !== undefined) {
80
+ clearTimeout(timeout);
81
+ resolve(msg);
82
+ }
83
+ });
84
+ ctx.signal.addEventListener('abort', () => {
85
+ clearTimeout(timeout);
86
+ reject(new Error('Task aborted by parent'));
87
+ });
88
+ });
89
+ try {
90
+ // Most ACP agents accept a free-form task string as their primary input.
91
+ // Use the tools/call protocol with a special 'task' pseudo-tool if the
92
+ // agent advertises it; otherwise send it as an initialize session detail
93
+ // or a custom agent/run message. The agent will respond on stdout.
94
+ await transport.send({
95
+ method: 'agent/run',
96
+ id: callId,
97
+ params: {
98
+ task: task.description,
99
+ sessionId: ctx.subagentId,
100
+ },
101
+ });
102
+ toolResult = await resultPromise;
103
+ }
104
+ catch (err) {
105
+ const msg = err instanceof Error ? err.message : String(err);
106
+ return {
107
+ result: `ACP subagent error: ${msg}`,
108
+ iterations: 0,
109
+ toolCalls: 0,
110
+ };
111
+ }
112
+ if (!toolResult) {
113
+ return { result: 'ACP subagent returned no result', iterations: 1, toolCalls: 1 };
114
+ }
115
+ const parsed = parseToolResponse(task.id, ctx.subagentId, toolResult);
116
+ return {
117
+ result: parsed.result ?? parsed.error,
118
+ iterations: parsed.iterations,
119
+ toolCalls: parsed.toolCalls,
120
+ };
121
+ };
122
+ return runner;
123
+ }
124
+ /** Returns the runner and a stop function to clean up the transport. */
125
+ export async function makeACPSubagentRunnerWithStop(options) {
126
+ const transport = new ClientTransport({
127
+ command: options.command,
128
+ args: options.args,
129
+ env: options.env,
130
+ cwd: options.cwd,
131
+ handshakeTimeoutMs: 30_000,
132
+ });
133
+ const translator = new ToolTranslator(options.toolTranslatorOpts);
134
+ const activeAbort = new AbortController();
135
+ let sessionStarted = false;
136
+ const startSession = async () => {
137
+ if (sessionStarted)
138
+ return;
139
+ await transport.start();
140
+ await transport.send({
141
+ method: 'initialize',
142
+ id: '1',
143
+ params: {
144
+ capabilities: ['code-generation', 'async-tools', 'streaming', 'progress'],
145
+ protocolVersion: '2024-11',
146
+ sessionId: options.role ?? 'wrongstack-subagent',
147
+ },
148
+ });
149
+ const initResp = await transport.read();
150
+ if (!initResp || initResp.error) {
151
+ throw new Error(`ACP initialize failed: ${initResp?.error?.message ?? 'no response'}`);
152
+ }
153
+ translator.attachToTransport({
154
+ onMessage: (h) => transport.onMessage(h),
155
+ send: (m) => transport.send(m),
156
+ });
157
+ sessionStarted = true;
158
+ };
159
+ const stop = () => {
160
+ activeAbort.abort();
161
+ transport.stop();
162
+ };
163
+ const runner = async (task, ctx) => {
164
+ ctx.signal.addEventListener('abort', () => {
165
+ activeAbort.abort();
166
+ transport.stop();
167
+ });
168
+ await startSession();
169
+ const callId = crypto.randomUUID();
170
+ let toolResult = null;
171
+ const resultPromise = new Promise((resolve, reject) => {
172
+ const budgetMs = ctx.budget.limits.timeoutMs ?? 300_000;
173
+ const timeout = setTimeout(() => {
174
+ reject(new Error(`ACP task timed out for subagent ${ctx.subagentId} (${budgetMs}ms budget)`));
175
+ }, budgetMs);
176
+ transport.onMessage((msg) => {
177
+ if (msg.method === 'tools/call' && msg.id !== undefined) {
178
+ clearTimeout(timeout);
179
+ resolve(msg);
180
+ }
181
+ });
182
+ ctx.signal.addEventListener('abort', () => {
183
+ clearTimeout(timeout);
184
+ reject(new Error('Task aborted by parent'));
185
+ });
186
+ });
187
+ try {
188
+ await transport.send({
189
+ method: 'agent/run',
190
+ id: callId,
191
+ params: {
192
+ task: task.description,
193
+ sessionId: ctx.subagentId,
194
+ },
195
+ });
196
+ toolResult = await resultPromise;
197
+ }
198
+ catch (err) {
199
+ const msg = err instanceof Error ? err.message : String(err);
200
+ return {
201
+ result: `ACP subagent error: ${msg}`,
202
+ iterations: 0,
203
+ toolCalls: 0,
204
+ };
205
+ }
206
+ if (!toolResult) {
207
+ return { result: 'ACP subagent returned no result', iterations: 1, toolCalls: 1 };
208
+ }
209
+ const parsed = parseToolResponse(task.id, ctx.subagentId, toolResult);
210
+ return {
211
+ result: parsed.result ?? parsed.error,
212
+ iterations: parsed.iterations,
213
+ toolCalls: parsed.toolCalls,
214
+ };
215
+ };
216
+ return { runner, stop };
217
+ }
218
+ //# sourceMappingURL=acp-subagent-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-subagent-runner.js","sourceRoot":"","sources":["../../src/integration/acp-subagent-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * ACP message types — transport-agnostic JSON-RPC 2.0 envelope.
3
+ * Reuses MCP types where possible; custom types for agentic UX (diffs, plans).
4
+ */
5
+ export interface ACPMessage {
6
+ method: string;
7
+ id?: string | number;
8
+ params?: unknown;
9
+ result?: unknown;
10
+ error?: ACPError;
11
+ }
12
+ export interface ACPError {
13
+ code: number;
14
+ message: string;
15
+ data?: unknown;
16
+ }
17
+ export type ACPRequest = RequiredPick<ACPMessage, 'id' | 'params' | 'method'>;
18
+ export type ACPResponse = RequiredPick<ACPMessage, 'id' | 'result' | 'method'>;
19
+ export type ACPNotification = Omit<ACPMessage, 'id'> & {
20
+ method: string;
21
+ };
22
+ export interface ACPInitializeParams {
23
+ capabilities?: string[];
24
+ protocolVersion?: string;
25
+ sessionId?: string;
26
+ authToken?: string;
27
+ sessionPath?: string;
28
+ workspaceRoots?: string[];
29
+ mcpServers?: unknown[];
30
+ [key: string]: unknown;
31
+ }
32
+ export interface ACPCapabilities {
33
+ capabilities: string[];
34
+ agentName: string;
35
+ agentVersion: string;
36
+ tools?: ACPToolList;
37
+ protocolVersion: string;
38
+ }
39
+ export interface ACPToolList {
40
+ tools: ACPToolDefinition[];
41
+ }
42
+ export interface ACPToolDefinition {
43
+ name: string;
44
+ description?: string;
45
+ inputSchema: ACPInputSchema;
46
+ annotations?: {
47
+ title?: string;
48
+ description?: string;
49
+ priority?: 'high' | 'medium' | 'low';
50
+ alwaysAccept?: boolean;
51
+ };
52
+ }
53
+ export type ACPInputSchema = {
54
+ type?: string;
55
+ properties?: Record<string, ACPInputSchema>;
56
+ required?: string[];
57
+ items?: ACPInputSchema;
58
+ enum?: unknown[];
59
+ description?: string;
60
+ default?: unknown;
61
+ minimum?: number;
62
+ maximum?: number;
63
+ [key: string]: unknown;
64
+ };
65
+ export type ContentBlock = ACPTextContent | ACPResourceContent | ACPImageContent | ACPProgressContent;
66
+ export interface ACPTextContent {
67
+ type: 'text';
68
+ text: string;
69
+ }
70
+ export interface ACPResourceContent {
71
+ type: 'resource';
72
+ resource: {
73
+ type: string;
74
+ uri: string;
75
+ data?: string;
76
+ mimeType?: string;
77
+ };
78
+ }
79
+ export interface ACPImageContent {
80
+ type: 'image';
81
+ data: string;
82
+ mimeType?: string;
83
+ }
84
+ export interface ACPProgressContent {
85
+ type: 'progress';
86
+ id: string;
87
+ label?: string;
88
+ message?: string;
89
+ messages?: string[];
90
+ }
91
+ export interface ACPToolCallRequest {
92
+ method: 'tools/call';
93
+ id: string | number;
94
+ params: {
95
+ name: string;
96
+ arguments: Record<string, unknown>;
97
+ };
98
+ }
99
+ export interface ACPToolResult {
100
+ content: ContentBlock[];
101
+ isError?: boolean;
102
+ }
103
+ export type ACPToolCallResponse = {
104
+ method: 'tools/call';
105
+ id: string | number;
106
+ result: ACPToolResult;
107
+ };
108
+ export interface ACPSessionInfo {
109
+ sessionId: string;
110
+ path: string;
111
+ title?: string;
112
+ modelId?: string;
113
+ createdAt: string;
114
+ lastActiveAt: string;
115
+ }
116
+ export interface ACPPlanStep {
117
+ id: string;
118
+ description: string;
119
+ status?: 'pending' | 'running' | 'completed' | 'skipped';
120
+ }
121
+ export interface ACPPlanContent {
122
+ type: 'plan';
123
+ plan: {
124
+ steps: ACPPlanStep[];
125
+ };
126
+ }
127
+ export type ACPSessionMode = 'agent' | 'chat' | 'edit' | 'preview';
128
+ export interface ACPCancelParams {
129
+ reason?: string;
130
+ }
131
+ type RequiredPick<T, K extends keyof T> = Pick<T, K> & Partial<Omit<T, K>>;
132
+ export {};
133
+ //# sourceMappingURL=acp-messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-messages.d.ts","sourceRoot":"","sources":["../../src/types/acp-messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=acp-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-messages.js","sourceRoot":"","sources":["../../src/types/acp-messages.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@wrongstack/acp",
3
+ "version": "0.0.1",
4
+ "description": "ACP (Agent Client Protocol) integration for WrongStack — client + agent support",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "import": "./dist/index.js",
9
+ "types": "./dist/index.d.ts"
10
+ },
11
+ "./client": {
12
+ "import": "./dist/client/index.js",
13
+ "types": "./dist/client/index.d.ts"
14
+ },
15
+ "./agent": {
16
+ "import": "./dist/agent/index.js",
17
+ "types": "./dist/agent/index.d.ts"
18
+ }
19
+ },
20
+ "files": [
21
+ "dist"
22
+ ],
23
+ "dependencies": {
24
+ "@wrongstack/core": "0.7.2"
25
+ },
26
+ "devDependencies": {
27
+ "@types/node": "^22",
28
+ "typescript": "^5",
29
+ "vitest": "^4.1.6"
30
+ },
31
+ "scripts": {
32
+ "build": "tsc",
33
+ "typecheck": "tsc --noEmit",
34
+ "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
35
+ "test": "vitest run"
36
+ }
37
+ }