@mastra/acp 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,517 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { ReadableStream } from 'stream/web';
3
+ import { MessageList, coreContentToString } from '@mastra/core/agent/message-list';
4
+ import { spawn } from 'child_process';
5
+ import process from 'process';
6
+ import { Writable, Readable } from 'stream';
7
+ import { ndJsonStream, ClientSideConnection, PROTOCOL_VERSION } from '@agentclientprotocol/sdk';
8
+ import { Workspace, LocalFilesystem } from '@mastra/core/workspace';
9
+ import { createTool } from '@mastra/core/tools';
10
+ import { z } from 'zod';
11
+
12
+ // src/agent.ts
13
+ var ACPClient = class {
14
+ constructor(getPromptState, workspace, onPermissionRequest) {
15
+ this.getPromptState = getPromptState;
16
+ this.workspace = workspace;
17
+ this.onPermissionRequest = onPermissionRequest;
18
+ }
19
+ async sessionUpdate(notification) {
20
+ const state = this.getPromptState();
21
+ if (!state || notification.sessionId !== state.sessionId) {
22
+ return;
23
+ }
24
+ const update = notification.update;
25
+ if (update.sessionUpdate === "agent_message_chunk") {
26
+ const chunk = appendContentChunk(state.chunks, update);
27
+ if (chunk) {
28
+ state.onChunk?.(chunk);
29
+ }
30
+ }
31
+ }
32
+ async requestPermission(request) {
33
+ if (this.onPermissionRequest) {
34
+ return this.onPermissionRequest(request);
35
+ }
36
+ const option = request.options[0];
37
+ if (!option) {
38
+ return { outcome: { outcome: "cancelled" } };
39
+ }
40
+ return { outcome: selectedPermissionOutcome(option) };
41
+ }
42
+ async readTextFile(params) {
43
+ let content = await this.workspace.filesystem?.readFile(params.path);
44
+ if (!(typeof content === "string")) {
45
+ const decoder = new TextDecoder("utf-8");
46
+ content = decoder.decode(content);
47
+ }
48
+ if (params.line != null || params.limit != null) {
49
+ const lines = content.split("\n");
50
+ const start = (params.line ?? 1) - 1;
51
+ const end = params.limit != null ? start + params.limit : lines.length;
52
+ return { content: lines.slice(start, end).join("\n") };
53
+ }
54
+ return { content };
55
+ }
56
+ async writeTextFile(params) {
57
+ await this.workspace.filesystem?.writeFile(params.path, params.content);
58
+ return {};
59
+ }
60
+ };
61
+ var ACPConnection = class {
62
+ options;
63
+ agentProcess;
64
+ connection;
65
+ session;
66
+ initializePromise;
67
+ currentPrompt;
68
+ stderr = "";
69
+ constructor(options) {
70
+ this.options = options;
71
+ }
72
+ get sessionId() {
73
+ return this.session?.sessionId;
74
+ }
75
+ async prompt(task, signal) {
76
+ const chunks = [];
77
+ for await (const chunk of this.promptStream(task, signal)) {
78
+ chunks.push(chunk);
79
+ }
80
+ return chunks.join("");
81
+ }
82
+ async *promptStream(task, signal) {
83
+ await this.ensureConnected();
84
+ const sessionId = this.session?.sessionId;
85
+ if (!this.connection || !sessionId) {
86
+ throw new Error("ACP connection is not initialized");
87
+ }
88
+ if (signal?.aborted) {
89
+ await this.cancel();
90
+ throw signal.reason ?? new Error("ACP prompt aborted");
91
+ }
92
+ const queue = createAsyncQueue();
93
+ const state = {
94
+ sessionId,
95
+ chunks: [],
96
+ onChunk: (chunk) => queue.push(chunk)
97
+ };
98
+ this.currentPrompt = state;
99
+ const abortHandler = () => {
100
+ void this.cancel();
101
+ queue.throw(signal?.reason ?? new Error("ACP prompt aborted"));
102
+ };
103
+ signal?.addEventListener("abort", abortHandler, { once: true });
104
+ const responsePromise = this.connection.prompt({
105
+ sessionId,
106
+ prompt: [{ type: "text", text: task }]
107
+ }).then(
108
+ (response) => {
109
+ this.throwIfPromptDidNotComplete(response);
110
+ queue.close();
111
+ },
112
+ (error) => {
113
+ queue.throw(this.withStderr(error));
114
+ }
115
+ );
116
+ try {
117
+ for await (const chunk of queue) {
118
+ yield chunk;
119
+ }
120
+ await responsePromise;
121
+ } catch (error) {
122
+ await responsePromise.catch(() => void 0);
123
+ throw error;
124
+ } finally {
125
+ signal?.removeEventListener("abort", abortHandler);
126
+ if (this.currentPrompt === state) {
127
+ this.currentPrompt = void 0;
128
+ }
129
+ if (this.options.persistSession === false) {
130
+ this.disconnect();
131
+ }
132
+ }
133
+ }
134
+ async cancel() {
135
+ const sessionId = this.session?.sessionId;
136
+ if (!this.connection || !sessionId) {
137
+ return;
138
+ }
139
+ await this.connection.cancel({ sessionId });
140
+ }
141
+ disconnect() {
142
+ this.connection = void 0;
143
+ this.session = void 0;
144
+ this.initializePromise = void 0;
145
+ this.currentPrompt = void 0;
146
+ if (this.agentProcess && !this.agentProcess.killed) {
147
+ this.agentProcess.kill();
148
+ }
149
+ this.agentProcess = void 0;
150
+ }
151
+ async ensureConnected() {
152
+ if (this.connection && this.session) {
153
+ return;
154
+ }
155
+ this.initializePromise ??= this.initialize();
156
+ await this.initializePromise;
157
+ }
158
+ async initialize() {
159
+ this.stderr = "";
160
+ this.agentProcess = spawn(this.options.command, this.options.args ?? [], {
161
+ cwd: this.options.cwd,
162
+ env: { ...process.env, ...this.options.env },
163
+ stdio: ["pipe", "pipe", "pipe"]
164
+ });
165
+ this.agentProcess.stderr.on("data", (chunk) => {
166
+ this.stderr += String(chunk);
167
+ });
168
+ const stream = ndJsonStream(
169
+ Writable.toWeb(this.agentProcess.stdin),
170
+ Readable.toWeb(this.agentProcess.stdout)
171
+ );
172
+ const workspace = this.options.workspace ?? new Workspace({
173
+ filesystem: new LocalFilesystem({ basePath: this.options.cwd ?? process.cwd() })
174
+ });
175
+ this.connection = new ClientSideConnection(
176
+ () => new ACPClient(() => this.currentPrompt, workspace, this.options.onPermissionRequest),
177
+ stream
178
+ );
179
+ try {
180
+ await this.connection.initialize(this.getInitializeRequest());
181
+ if (this.options.authMethodId) {
182
+ await this.connection.authenticate({ methodId: this.options.authMethodId });
183
+ }
184
+ this.session = await this.connection.newSession(this.getNewSessionRequest());
185
+ } catch (error) {
186
+ this.disconnect();
187
+ throw this.withStderr(error);
188
+ }
189
+ }
190
+ getInitializeRequest() {
191
+ return {
192
+ protocolVersion: PROTOCOL_VERSION,
193
+ clientCapabilities: {
194
+ fs: { readTextFile: true, writeTextFile: true }
195
+ },
196
+ clientInfo: {
197
+ name: "@mastra/acp",
198
+ version: "0.1.0"
199
+ },
200
+ ...this.options.initialize
201
+ };
202
+ }
203
+ getNewSessionRequest() {
204
+ return {
205
+ cwd: this.options.cwd ?? process.cwd(),
206
+ mcpServers: [],
207
+ ...this.options.session
208
+ };
209
+ }
210
+ throwIfPromptDidNotComplete(response) {
211
+ if (response.stopReason === "end_turn") {
212
+ return;
213
+ }
214
+ throw new Error(`ACP prompt stopped before completing: ${response.stopReason}`);
215
+ }
216
+ withStderr(error) {
217
+ const stderr = this.stderr.trim();
218
+ if (error instanceof Error) {
219
+ if (stderr && !error.message.includes(stderr)) {
220
+ error.message = `${error.message}
221
+
222
+ ACP agent stderr:
223
+ ${stderr}`;
224
+ }
225
+ return error;
226
+ }
227
+ return new Error(stderr ? `${String(error)}
228
+
229
+ ACP agent stderr:
230
+ ${stderr}` : String(error));
231
+ }
232
+ };
233
+ function appendContentChunk(chunks, chunk) {
234
+ return appendContentBlock(chunks, chunk.content);
235
+ }
236
+ function appendContentBlock(chunks, content) {
237
+ if (content.type === "text") {
238
+ chunks.push(content.text);
239
+ return content.text;
240
+ }
241
+ return void 0;
242
+ }
243
+ function createAsyncQueue() {
244
+ const values = [];
245
+ const waiters = [];
246
+ let closed = false;
247
+ let error;
248
+ const next = () => {
249
+ if (values.length > 0) {
250
+ return Promise.resolve({ value: values.shift(), done: false });
251
+ }
252
+ if (error) {
253
+ return Promise.reject(error);
254
+ }
255
+ if (closed) {
256
+ return Promise.resolve({ value: void 0, done: true });
257
+ }
258
+ return new Promise((resolve, reject) => {
259
+ waiters.push({ resolve, reject });
260
+ });
261
+ };
262
+ return {
263
+ push(value) {
264
+ const waiter = waiters.shift();
265
+ if (waiter) {
266
+ waiter.resolve({ value, done: false });
267
+ return;
268
+ }
269
+ values.push(value);
270
+ },
271
+ close() {
272
+ closed = true;
273
+ for (const waiter of waiters.splice(0)) {
274
+ waiter.resolve({ value: void 0, done: true });
275
+ }
276
+ },
277
+ throw(queueError) {
278
+ error = queueError;
279
+ for (const waiter of waiters.splice(0)) {
280
+ waiter.reject(queueError);
281
+ }
282
+ },
283
+ [Symbol.asyncIterator]() {
284
+ return { next };
285
+ }
286
+ };
287
+ }
288
+ function selectedPermissionOutcome(option) {
289
+ return { outcome: "selected", optionId: option.optionId };
290
+ }
291
+
292
+ // src/agent.ts
293
+ var CHUNK_FROM_AGENT = "AGENT";
294
+ var model = {
295
+ modelId: "acp-agent",
296
+ provider: "@mastra/acp",
297
+ specificationVersion: "v3",
298
+ supportedUrls: {},
299
+ doGenerate: async () => ({
300
+ stream: new ReadableStream({
301
+ start: async (controller) => {
302
+ controller.close();
303
+ }
304
+ })
305
+ }),
306
+ doStream: async () => ({
307
+ stream: new ReadableStream({
308
+ start: async (controller) => {
309
+ controller.close();
310
+ }
311
+ })
312
+ })
313
+ };
314
+ var AcpAgent = class {
315
+ id;
316
+ name;
317
+ connection;
318
+ description;
319
+ constructor(options) {
320
+ this.id = options.id;
321
+ this.name = options.name ?? options.id;
322
+ this.description = options.description;
323
+ this.connection = new ACPConnection(options);
324
+ }
325
+ __registerMastra(_mastra) {
326
+ }
327
+ getDescription() {
328
+ return this.description;
329
+ }
330
+ getModel() {
331
+ return model;
332
+ }
333
+ hasOwnMemory() {
334
+ return false;
335
+ }
336
+ __setMemory(_memory) {
337
+ }
338
+ getMemory() {
339
+ return void 0;
340
+ }
341
+ getInstructions() {
342
+ return "";
343
+ }
344
+ async generate(messages, options) {
345
+ const prompt = this.getPrompt(messages, options?.instructions);
346
+ const text = await this.connection.prompt(
347
+ prompt,
348
+ options?.abortSignal
349
+ );
350
+ const messageList = this.createMessageList(messages, text);
351
+ return {
352
+ text,
353
+ response: {
354
+ dbMessages: messageList.get.response.db()
355
+ },
356
+ toolResults: [],
357
+ finishReason: "stop",
358
+ runId: options?.runId ?? randomUUID()
359
+ };
360
+ }
361
+ async resumeGenerate() {
362
+ throw new Error("AcpAgent does not support resuming suspended generate calls");
363
+ }
364
+ async resumeStream() {
365
+ throw new Error("AcpAgent does not support resuming suspended stream calls");
366
+ }
367
+ async stream(messages, options) {
368
+ const runId = options?.runId ?? randomUUID();
369
+ const prompt = this.getPrompt(messages, options?.instructions);
370
+ const signal = options?.abortSignal;
371
+ const messageList = new MessageList();
372
+ messageList.add(messages, "input");
373
+ let resolveText;
374
+ let rejectText;
375
+ const textPromise = new Promise((resolve, reject) => {
376
+ resolveText = resolve;
377
+ rejectText = reject;
378
+ });
379
+ const fullStream = new ReadableStream({
380
+ start: async (controller) => {
381
+ const textId = randomUUID();
382
+ const chunks = [];
383
+ try {
384
+ controller.enqueue({ type: "text-start", runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });
385
+ for await (const chunk of this.connection.promptStream(prompt, signal)) {
386
+ chunks.push(chunk);
387
+ controller.enqueue({
388
+ type: "text-delta",
389
+ runId,
390
+ from: CHUNK_FROM_AGENT,
391
+ payload: { id: textId, text: chunk }
392
+ });
393
+ }
394
+ const text = chunks.join("");
395
+ messageList.add([{ role: "assistant", content: text }], "response");
396
+ controller.enqueue({ type: "text-end", runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });
397
+ controller.enqueue(createFinishChunk("step-finish", runId));
398
+ controller.enqueue(createFinishChunk("finish", runId));
399
+ resolveText(text);
400
+ controller.close();
401
+ } catch (error) {
402
+ rejectText(error);
403
+ controller.error(error);
404
+ }
405
+ }
406
+ });
407
+ return {
408
+ fullStream,
409
+ text: textPromise,
410
+ messageList,
411
+ toolResults: [],
412
+ runId
413
+ };
414
+ }
415
+ getPrompt(messages, instructions) {
416
+ const prompt = extractText(messages);
417
+ const instructionText = instructions ? extractInstructions(instructions) : "";
418
+ if (!instructionText) {
419
+ return prompt;
420
+ }
421
+ return `${instructionText}
422
+
423
+ ${prompt}`;
424
+ }
425
+ createMessageList(messages, text) {
426
+ const messageList = new MessageList();
427
+ messageList.add(messages, "input");
428
+ messageList.add([{ role: "assistant", content: text }], "response");
429
+ return messageList;
430
+ }
431
+ };
432
+ function extractText(messages) {
433
+ if (typeof messages === "string") {
434
+ return messages;
435
+ }
436
+ if (Array.isArray(messages) && messages.every((message) => typeof message === "string")) {
437
+ return messages.join("\n");
438
+ }
439
+ const messageList = new MessageList();
440
+ messageList.add(messages, "input");
441
+ return messageList.get.all.core().map((message) => coreContentToString(message.content)).filter(Boolean).join("\n");
442
+ }
443
+ function extractInstructions(instructions) {
444
+ if (typeof instructions === "string") {
445
+ return instructions;
446
+ }
447
+ if (Array.isArray(instructions)) {
448
+ return instructions.map((instruction) => extractInstructions(instruction)).join("\n");
449
+ }
450
+ return coreContentToString(instructions.content);
451
+ }
452
+ function createFinishChunk(type, runId) {
453
+ return {
454
+ type,
455
+ runId,
456
+ from: CHUNK_FROM_AGENT,
457
+ payload: {
458
+ id: randomUUID(),
459
+ output: {
460
+ steps: [],
461
+ usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 }
462
+ },
463
+ stepResult: {
464
+ reason: "stop",
465
+ warnings: [],
466
+ isContinued: false
467
+ },
468
+ metadata: {},
469
+ messages: { nonUser: [], all: [] }
470
+ }
471
+ };
472
+ }
473
+ function createACPTool(options) {
474
+ return createTool({
475
+ id: options.id,
476
+ description: options.description,
477
+ inputSchema: z.object({
478
+ task: z.string().describe("The task to send to the ACP agent")
479
+ }),
480
+ outputSchema: z.object({
481
+ output: z.string().describe("The output of the ACP agent")
482
+ }),
483
+ suspendSchema: z.object({
484
+ permissionRequest: z.object({
485
+ title: z.string().describe("The title of the permission request"),
486
+ options: z.array(
487
+ z.object({
488
+ optionId: z.string().describe("The option id to select"),
489
+ name: z.string().describe("The title of the permission request")
490
+ })
491
+ )
492
+ })
493
+ }),
494
+ resumeSchema: z.union([
495
+ z.object({
496
+ optionId: z.string().optional().describe("The option id to select"),
497
+ outcome: z.literal("selected").optional().describe("The outcome of the permission request")
498
+ }),
499
+ z.object({
500
+ outcome: z.literal("cancelled").optional().describe("The outcome of the permission request")
501
+ })
502
+ ]),
503
+ execute: async ({ task }, context) => {
504
+ const workspace = await context?.mastra?.getWorkspace();
505
+ const connection = new ACPConnection({
506
+ ...options,
507
+ workspace
508
+ });
509
+ const output = await connection.prompt(task, context?.abortSignal);
510
+ return { output };
511
+ }
512
+ });
513
+ }
514
+
515
+ export { ACPConnection, AcpAgent, createACPTool };
516
+ //# sourceMappingURL=index.js.map
517
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/connection.ts","../src/agent.ts","../src/tool.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { spawn } from 'node:child_process';\nimport type { ChildProcessWithoutNullStreams } from 'node:child_process';\nimport process from 'node:process';\nimport { Readable, Writable } from 'node:stream';\nimport { ClientSideConnection, ndJsonStream, PROTOCOL_VERSION } from '@agentclientprotocol/sdk';\nimport type {\n Client,\n ContentBlock,\n ContentChunk,\n InitializeRequest,\n NewSessionRequest,\n NewSessionResponse,\n PermissionOption,\n PromptResponse,\n ReadTextFileRequest,\n ReadTextFileResponse,\n RequestPermissionRequest,\n RequestPermissionResponse,\n SessionNotification,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from '@agentclientprotocol/sdk';\n\nimport { LocalFilesystem, Workspace } from '@mastra/core/workspace';\nimport type { CreateACPToolOptions } from './types';\n\ntype PromptState = {\n sessionId: string;\n chunks: string[];\n onChunk?: (chunk: string) => void;\n};\n\nclass ACPClient implements Client {\n constructor(\n private readonly getPromptState: () => PromptState | undefined,\n private readonly workspace: Workspace,\n private readonly onPermissionRequest?: CreateACPToolOptions['onPermissionRequest'],\n ) {}\n\n async sessionUpdate(notification: SessionNotification): Promise<void> {\n const state = this.getPromptState();\n\n if (!state || notification.sessionId !== state.sessionId) {\n return;\n }\n\n const update = notification.update;\n\n if (update.sessionUpdate === 'agent_message_chunk') {\n const chunk = appendContentChunk(state.chunks, update);\n if (chunk) {\n state.onChunk?.(chunk);\n }\n }\n }\n\n async requestPermission(request: RequestPermissionRequest): Promise<RequestPermissionResponse> {\n if (this.onPermissionRequest) {\n return this.onPermissionRequest(request);\n }\n\n const option = request.options[0];\n\n if (!option) {\n return { outcome: { outcome: 'cancelled' } };\n }\n\n return { outcome: selectedPermissionOutcome(option) };\n }\n\n async readTextFile(params: ReadTextFileRequest): Promise<ReadTextFileResponse> {\n let content = await this.workspace.filesystem?.readFile(params.path);\n\n if (!(typeof content === 'string')) {\n const decoder = new TextDecoder('utf-8');\n content = decoder.decode(content);\n }\n\n if (params.line != null || params.limit != null) {\n const lines = content.split('\\n');\n const start = (params.line ?? 1) - 1;\n const end = params.limit != null ? start + params.limit : lines.length;\n return { content: lines.slice(start, end).join('\\n') };\n }\n\n return { content };\n }\n\n async writeTextFile(params: WriteTextFileRequest): Promise<WriteTextFileResponse> {\n await this.workspace.filesystem?.writeFile(params.path, params.content);\n\n return {};\n }\n}\n\nexport class ACPConnection {\n readonly options: CreateACPToolOptions;\n\n private agentProcess?: ChildProcessWithoutNullStreams;\n private connection?: ClientSideConnection;\n private session?: NewSessionResponse;\n private initializePromise?: Promise<void>;\n private currentPrompt?: PromptState;\n private stderr = '';\n\n constructor(options: CreateACPToolOptions) {\n this.options = options;\n }\n\n get sessionId(): string | undefined {\n return this.session?.sessionId;\n }\n\n async prompt(task: string, signal?: AbortSignal): Promise<string> {\n const chunks: string[] = [];\n\n for await (const chunk of this.promptStream(task, signal)) {\n chunks.push(chunk);\n }\n\n return chunks.join('');\n }\n\n async *promptStream(task: string, signal?: AbortSignal): AsyncGenerator<string> {\n await this.ensureConnected();\n\n const sessionId = this.session?.sessionId;\n\n if (!this.connection || !sessionId) {\n throw new Error('ACP connection is not initialized');\n }\n\n if (signal?.aborted) {\n await this.cancel();\n throw signal.reason ?? new Error('ACP prompt aborted');\n }\n\n const queue = createAsyncQueue<string>();\n const state: PromptState = {\n sessionId,\n chunks: [],\n onChunk: chunk => queue.push(chunk),\n };\n this.currentPrompt = state;\n\n const abortHandler = () => {\n void this.cancel();\n queue.throw(signal?.reason ?? new Error('ACP prompt aborted'));\n };\n\n signal?.addEventListener('abort', abortHandler, { once: true });\n\n const responsePromise = this.connection\n .prompt({\n sessionId,\n prompt: [{ type: 'text', text: task }],\n })\n .then(\n response => {\n this.throwIfPromptDidNotComplete(response);\n queue.close();\n },\n error => {\n queue.throw(this.withStderr(error));\n },\n );\n\n try {\n for await (const chunk of queue) {\n yield chunk;\n }\n\n await responsePromise;\n } catch (error) {\n await responsePromise.catch(() => undefined);\n throw error;\n } finally {\n signal?.removeEventListener('abort', abortHandler);\n if (this.currentPrompt === state) {\n this.currentPrompt = undefined;\n }\n\n if (this.options.persistSession === false) {\n this.disconnect();\n }\n }\n }\n\n async cancel(): Promise<void> {\n const sessionId = this.session?.sessionId;\n\n if (!this.connection || !sessionId) {\n return;\n }\n\n await this.connection.cancel({ sessionId });\n }\n\n disconnect(): void {\n this.connection = undefined;\n this.session = undefined;\n this.initializePromise = undefined;\n this.currentPrompt = undefined;\n\n if (this.agentProcess && !this.agentProcess.killed) {\n this.agentProcess.kill();\n }\n\n this.agentProcess = undefined;\n }\n\n private async ensureConnected(): Promise<void> {\n if (this.connection && this.session) {\n return;\n }\n\n this.initializePromise ??= this.initialize();\n await this.initializePromise;\n }\n\n private async initialize(): Promise<void> {\n this.stderr = '';\n this.agentProcess = spawn(this.options.command, this.options.args ?? [], {\n cwd: this.options.cwd,\n env: { ...process.env, ...this.options.env },\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n this.agentProcess.stderr.on('data', chunk => {\n this.stderr += String(chunk);\n });\n\n const stream = ndJsonStream(\n Writable.toWeb(this.agentProcess.stdin) as WritableStream<Uint8Array>,\n Readable.toWeb(this.agentProcess.stdout) as ReadableStream<Uint8Array>,\n );\n\n const workspace =\n this.options.workspace ??\n new Workspace({\n filesystem: new LocalFilesystem({ basePath: this.options.cwd ?? process.cwd() }),\n });\n\n this.connection = new ClientSideConnection(\n () => new ACPClient(() => this.currentPrompt, workspace, this.options.onPermissionRequest),\n stream,\n );\n\n try {\n await this.connection.initialize(this.getInitializeRequest());\n\n if (this.options.authMethodId) {\n await this.connection.authenticate({ methodId: this.options.authMethodId });\n }\n\n this.session = await this.connection.newSession(this.getNewSessionRequest());\n } catch (error) {\n this.disconnect();\n throw this.withStderr(error);\n }\n }\n\n private getInitializeRequest(): InitializeRequest {\n return {\n protocolVersion: PROTOCOL_VERSION,\n clientCapabilities: {\n fs: { readTextFile: true, writeTextFile: true },\n },\n clientInfo: {\n name: '@mastra/acp',\n version: '0.1.0',\n },\n ...this.options.initialize,\n };\n }\n\n private getNewSessionRequest(): NewSessionRequest {\n return {\n cwd: this.options.cwd ?? process.cwd(),\n mcpServers: [],\n ...this.options.session,\n };\n }\n\n private throwIfPromptDidNotComplete(response: PromptResponse): void {\n if (response.stopReason === 'end_turn') {\n return;\n }\n\n throw new Error(`ACP prompt stopped before completing: ${response.stopReason}`);\n }\n\n private withStderr(error: unknown): Error {\n const stderr = this.stderr.trim();\n\n if (error instanceof Error) {\n if (stderr && !error.message.includes(stderr)) {\n error.message = `${error.message}\\n\\nACP agent stderr:\\n${stderr}`;\n }\n\n return error;\n }\n\n return new Error(stderr ? `${String(error)}\\n\\nACP agent stderr:\\n${stderr}` : String(error));\n }\n}\n\nfunction appendContentChunk(chunks: string[], chunk: ContentChunk): string | undefined {\n return appendContentBlock(chunks, chunk.content);\n}\n\nfunction appendContentBlock(chunks: string[], content: ContentBlock): string | undefined {\n if (content.type === 'text') {\n chunks.push(content.text);\n return content.text;\n }\n\n return undefined;\n}\n\ntype AsyncQueue<T> = AsyncIterable<T> & {\n close: () => void;\n push: (value: T) => void;\n throw: (error: unknown) => void;\n};\n\nfunction createAsyncQueue<T>(): AsyncQueue<T> {\n const values: T[] = [];\n const waiters: Array<{\n resolve: (value: IteratorResult<T>) => void;\n reject: (error: unknown) => void;\n }> = [];\n let closed = false;\n let error: unknown;\n\n const next = (): Promise<IteratorResult<T>> => {\n if (values.length > 0) {\n return Promise.resolve({ value: values.shift()!, done: false });\n }\n\n if (error) {\n return Promise.reject(error);\n }\n\n if (closed) {\n return Promise.resolve({ value: undefined, done: true });\n }\n\n return new Promise((resolve, reject) => {\n waiters.push({ resolve, reject });\n });\n };\n\n return {\n push(value) {\n const waiter = waiters.shift();\n if (waiter) {\n waiter.resolve({ value, done: false });\n return;\n }\n\n values.push(value);\n },\n close() {\n closed = true;\n for (const waiter of waiters.splice(0)) {\n waiter.resolve({ value: undefined, done: true });\n }\n },\n throw(queueError) {\n error = queueError;\n for (const waiter of waiters.splice(0)) {\n waiter.reject(queueError);\n }\n },\n [Symbol.asyncIterator]() {\n return { next };\n },\n };\n}\n\nfunction selectedPermissionOutcome(option: PermissionOption): RequestPermissionResponse['outcome'] {\n return { outcome: 'selected', optionId: option.optionId };\n}\n","import { randomUUID } from 'node:crypto';\nimport { ReadableStream } from 'node:stream/web';\n\nimport type {\n AgentGenerateOptions,\n AgentInstructions,\n AgentStreamOptions,\n SubAgent,\n SubAgentGenerateResult,\n SubAgentStreamResult,\n} from '@mastra/core/agent';\nimport { MessageList, coreContentToString } from '@mastra/core/agent/message-list';\nimport type { MessageListInput } from '@mastra/core/agent/message-list';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { ChunkType } from '@mastra/core/stream';\nimport type { DynamicArgument } from '@mastra/core/types';\n\nimport type { MastraLanguageModelV3 } from '../../core/dist/llm/model/shared.types';\nimport { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nconst CHUNK_FROM_AGENT = 'AGENT' as ChunkType['from'];\n\nconst model = {\n modelId: 'acp-agent',\n provider: '@mastra/acp',\n specificationVersion: 'v3',\n supportedUrls: {},\n doGenerate: async () => ({\n stream: new ReadableStream({\n start: async controller => {\n controller.close();\n },\n }),\n }),\n doStream: async () => ({\n stream: new ReadableStream({\n start: async controller => {\n controller.close();\n },\n }),\n }),\n} as const satisfies MastraLanguageModelV3;\n\nexport type AcpAgentOptions = CreateACPToolOptions & {\n name?: string;\n};\n\nexport class AcpAgent<\n TId extends string = string,\n TRequestContext extends Record<string, any> | unknown = unknown,\n> implements SubAgent<TId, TRequestContext> {\n readonly id: TId;\n readonly name: string;\n readonly connection: ACPConnection;\n readonly description: string;\n\n constructor(options: AcpAgentOptions) {\n this.id = options.id as TId;\n this.name = options.name ?? options.id;\n this.description = options.description;\n this.connection = new ACPConnection(options);\n }\n\n __registerMastra(_mastra: Mastra): void {}\n\n getDescription(): string {\n return this.description;\n }\n\n getModel(): ReturnType<SubAgent<TId, TRequestContext>['getModel']> {\n return model;\n }\n\n hasOwnMemory(): boolean {\n return false;\n }\n\n __setMemory(_memory: DynamicArgument<any, any>): void {}\n\n getMemory(): undefined {\n return undefined;\n }\n\n getInstructions(): string {\n return '';\n }\n\n async generate(messages: MessageListInput, options?: AgentGenerateOptions): Promise<SubAgentGenerateResult> {\n const prompt = this.getPrompt(messages, options?.instructions);\n const text = await this.connection.prompt(\n prompt,\n (options as { abortSignal?: AbortSignal } | undefined)?.abortSignal,\n );\n const messageList = this.createMessageList(messages, text);\n\n return {\n text,\n response: {\n dbMessages: messageList.get.response.db(),\n },\n toolResults: [],\n finishReason: 'stop',\n runId: options?.runId ?? randomUUID(),\n };\n }\n\n async resumeGenerate(): Promise<SubAgentGenerateResult> {\n throw new Error('AcpAgent does not support resuming suspended generate calls');\n }\n\n async resumeStream(): Promise<SubAgentStreamResult> {\n throw new Error('AcpAgent does not support resuming suspended stream calls');\n }\n\n async stream(messages: MessageListInput, options?: AgentStreamOptions): Promise<SubAgentStreamResult> {\n const runId = options?.runId ?? randomUUID();\n const prompt = this.getPrompt(messages, options?.instructions);\n const signal = (options as { abortSignal?: AbortSignal } | undefined)?.abortSignal;\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n\n let resolveText!: (text: string) => void;\n let rejectText!: (error: unknown) => void;\n const textPromise = new Promise<string>((resolve, reject) => {\n resolveText = resolve;\n rejectText = reject;\n });\n\n const fullStream = new ReadableStream<ChunkType>({\n start: async controller => {\n const textId = randomUUID();\n const chunks: string[] = [];\n\n try {\n controller.enqueue({ type: 'text-start', runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });\n\n for await (const chunk of this.connection.promptStream(prompt, signal)) {\n chunks.push(chunk);\n controller.enqueue({\n type: 'text-delta',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: { id: textId, text: chunk },\n });\n }\n\n const text = chunks.join('');\n messageList.add([{ role: 'assistant', content: text }], 'response');\n\n controller.enqueue({ type: 'text-end', runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });\n controller.enqueue(createFinishChunk('step-finish', runId));\n controller.enqueue(createFinishChunk('finish', runId));\n resolveText(text);\n controller.close();\n } catch (error) {\n rejectText(error);\n controller.error(error);\n }\n },\n });\n\n return {\n fullStream,\n text: textPromise,\n messageList,\n toolResults: [],\n runId,\n };\n }\n\n private getPrompt(messages: MessageListInput, instructions?: AgentInstructions): string {\n const prompt = extractText(messages);\n const instructionText = instructions ? extractInstructions(instructions) : '';\n\n if (!instructionText) {\n return prompt;\n }\n\n return `${instructionText}\\n\\n${prompt}`;\n }\n\n private createMessageList(messages: MessageListInput, text: string): MessageList {\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n messageList.add([{ role: 'assistant', content: text }], 'response');\n return messageList;\n }\n}\n\nfunction extractText(messages: MessageListInput): string {\n if (typeof messages === 'string') {\n return messages;\n }\n\n if (Array.isArray(messages) && messages.every(message => typeof message === 'string')) {\n return messages.join('\\n');\n }\n\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n\n return messageList.get.all\n .core()\n .map(message => coreContentToString(message.content))\n .filter(Boolean)\n .join('\\n');\n}\n\nfunction extractInstructions(instructions: AgentInstructions): string {\n if (typeof instructions === 'string') {\n return instructions;\n }\n\n if (Array.isArray(instructions)) {\n return instructions.map(instruction => extractInstructions(instruction)).join('\\n');\n }\n\n return coreContentToString(instructions.content);\n}\n\nfunction createFinishChunk(type: 'step-finish' | 'finish', runId: string): ChunkType {\n return {\n type,\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n id: randomUUID(),\n output: {\n steps: [],\n usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n },\n stepResult: {\n reason: 'stop',\n warnings: [],\n isContinued: false,\n },\n metadata: {},\n messages: { nonUser: [], all: [] },\n },\n } as unknown as ChunkType;\n}\n","import { createTool } from '@mastra/core/tools';\nimport { z } from 'zod';\n\nimport { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nexport function createACPTool(options: CreateACPToolOptions) {\n return createTool({\n id: options.id,\n description: options.description,\n inputSchema: z.object({\n task: z.string().describe('The task to send to the ACP agent'),\n }),\n outputSchema: z.object({\n output: z.string().describe('The output of the ACP agent'),\n }),\n suspendSchema: z.object({\n permissionRequest: z.object({\n title: z.string().describe('The title of the permission request'),\n options: z.array(\n z.object({\n optionId: z.string().describe('The option id to select'),\n name: z.string().describe('The title of the permission request'),\n }),\n ),\n }),\n }),\n resumeSchema: z.union([\n z.object({\n optionId: z.string().optional().describe('The option id to select'),\n outcome: z.literal('selected').optional().describe('The outcome of the permission request'),\n }),\n z.object({\n outcome: z.literal('cancelled').optional().describe('The outcome of the permission request'),\n }),\n ]),\n execute: async ({ task }, context) => {\n const workspace = await context?.mastra?.getWorkspace();\n const connection = new ACPConnection({\n ...options,\n workspace,\n });\n\n const output = await connection.prompt(task, context?.abortSignal);\n\n return { output };\n },\n });\n}\n"]}
package/dist/tool.d.ts ADDED
@@ -0,0 +1,33 @@
1
+ import type { CreateACPToolOptions } from './types.js';
2
+ export declare function createACPTool(options: CreateACPToolOptions): import("@mastra/core/tools").Tool<{
3
+ task: string;
4
+ }, {
5
+ output: string;
6
+ }, {
7
+ permissionRequest: {
8
+ title: string;
9
+ options: {
10
+ optionId: string;
11
+ name: string;
12
+ }[];
13
+ };
14
+ }, {
15
+ optionId?: string | undefined;
16
+ outcome?: "selected" | undefined;
17
+ } | {
18
+ outcome?: "cancelled" | undefined;
19
+ }, import("@mastra/core/tools").ToolExecutionContext<{
20
+ permissionRequest: {
21
+ title: string;
22
+ options: {
23
+ optionId: string;
24
+ name: string;
25
+ }[];
26
+ };
27
+ }, {
28
+ optionId?: string | undefined;
29
+ outcome?: "selected" | undefined;
30
+ } | {
31
+ outcome?: "cancelled" | undefined;
32
+ }, unknown>, string, unknown>;
33
+ //# sourceMappingURL=tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAEpD,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BA0C1D"}
@@ -0,0 +1,38 @@
1
+ import type { InitializeRequest, NewSessionRequest, RequestPermissionRequest, RequestPermissionResponse } from '@agentclientprotocol/sdk';
2
+ import type { Workspace } from '@mastra/core/workspace';
3
+ export type CreateACPToolOptions = {
4
+ /** Unique identifier for the Mastra tool. */
5
+ id: string;
6
+ /** Description shown to the model when it can call this tool. */
7
+ description: string;
8
+ /** ACP agent executable to spawn. */
9
+ command: string;
10
+ /** Arguments passed to the ACP agent executable. */
11
+ args?: string[];
12
+ /** Environment variables to merge with the current process environment. */
13
+ env?: Record<string, string>;
14
+ /** Working directory for the ACP agent process and ACP session. */
15
+ cwd?: string;
16
+ /** ACP session creation options. Defaults to cwd/process.cwd() and no MCP servers. */
17
+ session?: Partial<NewSessionRequest>;
18
+ /** ACP initialization options. Defaults to Mastra client info and protocol version. */
19
+ initialize?: Partial<InitializeRequest>;
20
+ /** ACP authentication method id to invoke after initialization. */
21
+ authMethodId?: string;
22
+ /** Keep the ACP process alive after tool execution. Defaults to true. */
23
+ persistSession?: boolean;
24
+ /**
25
+ * Callback invoked when the ACP agent requests permission.
26
+ * Defaults to auto-selecting the first permission option.
27
+ */
28
+ onPermissionRequest?: (request: RequestPermissionRequest) => Promise<RequestPermissionResponse>;
29
+ /** Workspace for the ACP agent process and ACP session. */
30
+ workspace?: Workspace;
31
+ };
32
+ export type ACPToolInput = {
33
+ task: string;
34
+ };
35
+ export type ACPToolOutput = {
36
+ output: string;
37
+ };
38
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,wBAAwB,EACxB,yBAAyB,EAC1B,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,MAAM,oBAAoB,GAAG;IACjC,6CAA6C;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAC;IACpB,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,2EAA2E;IAC3E,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sFAAsF;IACtF,OAAO,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACrC,uFAAuF;IACvF,UAAU,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACxC,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,wBAAwB,KAAK,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAChG,2DAA2D;IAC3D,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC"}