@mastra/acp 0.4.1 → 0.4.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,0BAA0B,CAAC;AACzE,OAAO,KAAK,EACV,oBAAoB,EAEpB,kBAAkB,EAElB,QAAQ,EACR,sBAAsB,EACtB,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AA0BpD,MAAM,MAAM,eAAe,GAAG,oBAAoB,GAAG;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,qBAAa,QAAQ,CACnB,GAAG,SAAS,MAAM,GAAG,MAAM,EAC3B,eAAe,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,GAAG,OAAO,CAC/D,YAAW,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;IACzC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,YAAY,OAAO,EAAE,eAAe,EAKnC;IAED,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAG;IAE1C,cAAc,IAAI,MAAM,CAEvB;IAED,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,UAAU,CAAC,CAAC,CAEjE;IAED,YAAY,IAAI,OAAO,CAEtB;IAED,WAAW,CAAC,OAAO,EAAE,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAG;IAExD,SAAS,IAAI,SAAS,CAErB;IAED,eAAe,IAAI,MAAM,CAExB;IAEK,kBAAkB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAE/C;IAEK,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7C;IAEK,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAiB1G;IAEK,cAAc,IAAI,OAAO,CAAC,sBAAsB,CAAC,CAEtD;IAEK,YAAY,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAElD;IAEK,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAoEpG;IAED,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,iBAAiB;CAM1B"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,0BAA0B,CAAC;AACzE,OAAO,KAAK,EACV,oBAAoB,EAEpB,kBAAkB,EAElB,QAAQ,EACR,sBAAsB,EACtB,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AA0BpD,MAAM,MAAM,eAAe,GAAG,oBAAoB,GAAG;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,qBAAa,QAAQ,CACnB,GAAG,SAAS,MAAM,GAAG,MAAM,EAC3B,eAAe,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,GAAG,OAAO,CAC/D,YAAW,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;IACzC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,YAAY,OAAO,EAAE,eAAe,EAKnC;IAED,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAG;IAE1C,cAAc,IAAI,MAAM,CAEvB;IAED,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,UAAU,CAAC,CAAC,CAEjE;IAED,YAAY,IAAI,OAAO,CAEtB;IAED,WAAW,CAAC,OAAO,EAAE,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAG;IAExD,SAAS,IAAI,SAAS,CAErB;IAED,eAAe,IAAI,MAAM,CAExB;IAEK,kBAAkB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAE/C;IAEK,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7C;IAEK,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAiB1G;IAEK,cAAc,IAAI,OAAO,CAAC,sBAAsB,CAAC,CAEtD;IAEK,YAAY,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAElD;IAEK,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAoEpG;IAED,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,iBAAiB;CAM1B"}
@@ -3,7 +3,7 @@ name: mastra-acp
3
3
  description: Documentation for @mastra/acp. Use when working with @mastra/acp APIs, configuration, or implementation.
4
4
  metadata:
5
5
  package: "@mastra/acp"
6
- version: "0.4.1"
6
+ version: "0.4.2"
7
7
  ---
8
8
 
9
9
  ## When to use
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.4.1",
2
+ "version": "0.4.2",
3
3
  "package": "@mastra/acp",
4
4
  "exports": {},
5
5
  "modules": {}
@@ -30,7 +30,7 @@ The flow is:
30
30
  6. Mastra returns the buffered output or emits streaming chunks, or alternatively handles permission input.
31
31
  7. The ACP connection stops the process after the prompt when `persistSession` is `false`. `AcpAgent` can keep a reusable process alive across calls by default.
32
32
 
33
- During execution, the ACP client also handles permission requests and file operations. File reads and writes go through Mastra's `Workspace`, so the ACP agent operates inside the workspace you provide.
33
+ During execution, the ACP client also handles permission requests and file operations. File reads and writes that the agent requests through the protocol go through Mastra's `Workspace`. The workspace covers only those requests: the agent process runs with the configured `cwd` and isn't sandboxed or isolated, and it can still reach files through its own tools and shell commands.
34
34
 
35
35
  ## Compatible agents
36
36
 
@@ -144,7 +144,7 @@ See the [AcpAgent model management methods](https://mastra.ai/reference/acp/acp-
144
144
 
145
145
  ## Session lifecycle
146
146
 
147
- `AcpAgent` starts the configured command on first use and creates an ACP session. By default, `persistSession` is `true`, so the child process stays alive across calls. Set `persistSession: false` when each prompt should run in an isolated process.
147
+ `AcpAgent` starts the configured command on first use and creates an ACP session. By default, `persistSession` is `true`. The child process stays alive across calls. Set `persistSession: false` when each prompt should run in an isolated process.
148
148
 
149
149
  See the [AcpAgent session lifecycle](https://mastra.ai/reference/acp/acp-agent) section for details.
150
150
 
@@ -156,7 +156,7 @@ See the [createACPTool() permission handling](https://mastra.ai/reference/acp/cr
156
156
 
157
157
  ## Workspace integration
158
158
 
159
- ACP file operations go through Mastra's workspace abstraction. `AcpAgent` can use a `workspace` option, and `createACPTool()` uses the current Mastra workspace from the tool execution context when one is available. Without a workspace, `@mastra/acp` falls back to a `Workspace` backed by `LocalFilesystem` at `cwd` or `process.cwd()`.
159
+ ACP file requests go through Mastra's workspace abstraction. `AcpAgent` can use a `workspace` option, and `createACPTool()` uses the current Mastra workspace from the tool execution context when one is available. Without a workspace, `@mastra/acp` falls back to a `Workspace` backed by `LocalFilesystem` at `cwd` or `process.cwd()`.
160
160
 
161
161
  See the [AcpAgent workspace integration](https://mastra.ai/reference/acp/acp-agent) section for custom workspace examples.
162
162
 
package/dist/index.cjs CHANGED
@@ -21,7 +21,6 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
21
21
  enumerable: true
22
22
  }) : target, mod));
23
23
  //#endregion
24
- let crypto = require("crypto");
25
24
  let stream_web = require("stream/web");
26
25
  let _mastra_core_agent_message_list = require("@mastra/core/agent/message-list");
27
26
  let child_process = require("child_process");
@@ -373,7 +372,7 @@ var AcpAgent = class {
373
372
  response: { dbMessages: this.createMessageList(messages, text).get.response.db() },
374
373
  toolResults: [],
375
374
  finishReason: "stop",
376
- runId: options?.runId ?? (0, crypto.randomUUID)()
375
+ runId: options?.runId ?? globalThis.crypto.randomUUID()
377
376
  };
378
377
  }
379
378
  async resumeGenerate() {
@@ -383,7 +382,7 @@ var AcpAgent = class {
383
382
  throw new Error("AcpAgent does not support resuming suspended stream calls");
384
383
  }
385
384
  async stream(messages, options) {
386
- const runId = options?.runId ?? (0, crypto.randomUUID)();
385
+ const runId = options?.runId ?? globalThis.crypto.randomUUID();
387
386
  const prompt = this.getPrompt(messages, options?.instructions);
388
387
  const signal = options?.abortSignal;
389
388
  const messageList = new _mastra_core_agent_message_list.MessageList();
@@ -396,7 +395,7 @@ var AcpAgent = class {
396
395
  });
397
396
  return {
398
397
  fullStream: new stream_web.ReadableStream({ start: async (controller) => {
399
- const textId = (0, crypto.randomUUID)();
398
+ const textId = globalThis.crypto.randomUUID();
400
399
  const chunks = [];
401
400
  const toolNames = /* @__PURE__ */ new Map();
402
401
  const toolResults = [];
@@ -569,7 +568,7 @@ function createFinishChunk(type, runId) {
569
568
  runId,
570
569
  from: CHUNK_FROM_AGENT,
571
570
  payload: {
572
- id: (0, crypto.randomUUID)(),
571
+ id: globalThis.crypto.randomUUID(),
573
572
  output: {
574
573
  steps: [],
575
574
  usage: {
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["stream","Writable","Readable","Workspace","LocalFilesystem","ClientSideConnection","PROTOCOL_VERSION","ReadableStream","MessageList"],"sources":["../src/connection.ts","../src/agent.ts","../src/session.ts","../src/tool.ts"],"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 InitializeRequest,\n ModelInfo,\n NewSessionRequest,\n NewSessionResponse,\n PermissionOption,\n PromptResponse,\n ReadTextFileRequest,\n ReadTextFileResponse,\n RequestPermissionRequest,\n RequestPermissionResponse,\n SessionNotification,\n SessionUpdate,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from '@agentclientprotocol/sdk';\n\nimport { LocalFilesystem, Workspace } from '@mastra/core/workspace';\nimport type { CreateACPToolOptions } from './types';\n\nexport type ACPStreamEvent = { type: 'text'; text: string } | { type: 'session-update'; update: SessionUpdate };\n\ntype PromptState = {\n sessionId: string;\n onEvent?: (event: ACPStreamEvent) => 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 if (update.content.type === 'text') {\n state.onEvent?.({ type: 'text', text: update.content.text });\n }\n } else {\n state.onEvent?.({ type: 'session-update', update });\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 getAvailableModels(): Promise<ModelInfo[]> {\n await this.ensureConnected();\n return this.session?.models?.availableModels ?? [];\n }\n\n async setModel(modelId: string): Promise<void> {\n await this.ensureConnected();\n\n const available = this.session?.models?.availableModels;\n\n if (available && !available.some(m => m.modelId === modelId)) {\n const ids = available.map(m => m.modelId).join(', ') || '(none)';\n throw new Error(`Model \"${modelId}\" is not available. Available models: ${ids}`);\n }\n\n await this.connection!.unstable_setSessionModel({\n sessionId: this.session!.sessionId,\n modelId,\n });\n }\n\n async prompt(task: string, signal?: AbortSignal): Promise<string> {\n const parts: string[] = [];\n\n for await (const event of this.promptStream(task, signal)) {\n if (event.type === 'text') {\n parts.push(event.text);\n }\n }\n\n return parts.join('');\n }\n\n async *promptStream(task: string, signal?: AbortSignal): AsyncGenerator<ACPStreamEvent> {\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<ACPStreamEvent>();\n const state: PromptState = {\n sessionId,\n onEvent: event => queue.push(event),\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 // Keep an 'error' listener attached for the lifetime of the process so a\n // failed spawn (e.g. ENOENT) rejects initialization instead of crashing\n // the host process with an unhandled 'error' event.\n const processFailure = new Promise<never>((_, reject) => {\n this.agentProcess!.on('error', error => {\n reject(error instanceof Error ? error : new Error(String(error)));\n });\n this.agentProcess!.on('exit', (code, signal) => {\n reject(new Error(`ACP agent process exited during initialization (code: ${code}, signal: ${signal})`));\n });\n });\n processFailure.catch(() => undefined);\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 try {\n this.connection = new ClientSideConnection(() => {\n const defaultClient = new ACPClient(() => this.currentPrompt, workspace, this.options.onPermissionRequest);\n return this.options.createClient?.(defaultClient) ?? defaultClient;\n }, stream);\n\n await Promise.race([processFailure, this.initializeSession()]);\n } catch (error) {\n this.disconnect();\n throw this.withStderr(error);\n }\n }\n\n private async initializeSession(): Promise<void> {\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\n if (this.options.model) {\n const available = this.session.models?.availableModels;\n\n if (available && !available.some(m => m.modelId === this.options.model)) {\n const ids = available.map(m => m.modelId).join(', ') || '(none)';\n throw new Error(`Model \"${this.options.model}\" is not available. Available models: ${ids}`);\n }\n\n await this.connection!.unstable_setSessionModel({\n sessionId: this.session.sessionId,\n modelId: this.options.model,\n });\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\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 { ModelInfo, SessionUpdate } from '@agentclientprotocol/sdk';\nimport type {\n AgentGenerateOptions,\n AgentInstructions,\n AgentStreamOptions,\n MastraLanguageModel,\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 { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nconst CHUNK_FROM_AGENT = 'AGENT' as ChunkType['from'];\ntype AcpToolResult = Extract<NonNullable<SubAgentStreamResult['toolResults']>, unknown[]>[number];\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 MastraLanguageModel;\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 getAvailableModels(): Promise<ModelInfo[]> {\n return this.connection.getAvailableModels();\n }\n\n async setModel(modelId: string): Promise<void> {\n return this.connection.setModel(modelId);\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 const toolNames = new Map<string, string>();\n const toolResults: AcpToolResult[] = [];\n\n try {\n controller.enqueue({ type: 'text-start', runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });\n\n for await (const event of this.connection.promptStream(prompt, signal)) {\n if (event.type === 'text') {\n chunks.push(event.text);\n controller.enqueue({\n type: 'text-delta',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: { id: textId, text: event.text },\n });\n } else if (event.type === 'session-update') {\n for (const chunk of getMastraChunksFromACPUpdate(event.update, runId, toolNames)) {\n if (chunk.type === 'tool-result') {\n toolResults.push({ payload: chunk.payload });\n }\n controller.enqueue(chunk);\n }\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 await options?.onFinish?.(createOnFinishResult({ text, runId, messageList, toolResults }) as any);\n resolveText(text);\n controller.close();\n } catch (error) {\n const text = chunks.join('');\n await options?.onFinish?.(createOnFinishResult({ text, runId, messageList, toolResults, error }) as any);\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 getMastraChunksFromACPUpdate(\n update: SessionUpdate,\n runId: string,\n toolNames: Map<string, string>,\n): ChunkType[] {\n switch (update.sessionUpdate) {\n case 'tool_call': {\n const toolName = getToolName(update, toolNames);\n toolNames.set(update.toolCallId, toolName);\n\n return [\n {\n type: 'tool-call',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n args: toRecord(update.rawInput),\n },\n },\n ];\n }\n case 'tool_call_update': {\n const toolName = getToolName(update, toolNames);\n\n if (update.status === 'completed' || update.status === 'failed') {\n return [\n {\n type: 'tool-result',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n result: update.rawOutput ?? update.content ?? { status: update.status, title: update.title },\n isError: update.status === 'failed',\n },\n },\n ];\n }\n\n return [\n {\n type: 'tool-call-delta',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n argsTextDelta: update.title ?? update.status ?? '',\n },\n },\n ];\n }\n default:\n return [];\n }\n}\n\nfunction getToolName(\n update: Extract<SessionUpdate, { sessionUpdate: 'tool_call' | 'tool_call_update' }>,\n toolNames: Map<string, string>,\n): string {\n return update.title ?? toolNames.get(update.toolCallId) ?? update.kind ?? 'acp_tool';\n}\n\nfunction toRecord(value: unknown): Record<string, unknown> {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n\n if (value === undefined) {\n return {};\n }\n\n return { input: value };\n}\n\nfunction createOnFinishResult({\n text,\n runId,\n messageList,\n toolResults,\n error,\n}: {\n text: string;\n runId: string;\n messageList: MessageList;\n toolResults: AcpToolResult[];\n error?: unknown;\n}) {\n const usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n\n return {\n text,\n finishReason: 'stop',\n usage,\n totalUsage: usage,\n warnings: [],\n response: {\n messages: messageList.get.response.aiV5.model(),\n },\n steps: [],\n toolResults,\n runId,\n ...(error === undefined ? {} : { error }),\n };\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 { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nexport class ACPToolSession {\n private connection?: ACPConnection;\n\n constructor(private readonly options: CreateACPToolOptions) {}\n\n getConnection(workspace: CreateACPToolOptions['workspace']): ACPConnection {\n if (this.options.persistSession === false) {\n return this.createConnection(workspace);\n }\n\n this.connection ??= this.createConnection(workspace);\n return this.connection;\n }\n\n private createConnection(workspace: CreateACPToolOptions['workspace']): ACPConnection {\n return new ACPConnection({\n ...this.options,\n workspace: workspace ?? this.options.workspace,\n });\n }\n}\n","import { compileSchema } from '@internal/types-builder/compile-zod';\nimport { createTool } from '@mastra/core/tools';\nimport { z } from 'zod/v4';\n\nimport { ACPToolSession } from './session';\nimport type { CreateACPToolOptions } from './types';\n\nexport function createACPTool(options: CreateACPToolOptions) {\n const session = new ACPToolSession(options);\n\n return createTool({\n id: options.id,\n description: options.description,\n inputSchema: compileSchema(\n z.object({\n task: z.string().describe('The task to send to the ACP agent'),\n }),\n ),\n outputSchema: compileSchema(\n z.object({\n output: z.string().describe('The output of the ACP agent'),\n }),\n ),\n suspendSchema: compileSchema(\n 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 ),\n resumeSchema: compileSchema(\n 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 ),\n execute: async ({ task }, context) => {\n const workspace = await context?.mastra?.getWorkspace();\n const connection = session.getConnection(workspace);\n const output = await connection.prompt(task, context?.abortSignal);\n\n return { output };\n },\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCA,IAAM,YAAN,MAAkC;CAEb;CACA;CACA;CAHnB,YACE,gBACA,WACA,qBACA;EAHiB,KAAA,iBAAA;EACA,KAAA,YAAA;EACA,KAAA,sBAAA;CAChB;CAEH,MAAM,cAAc,cAAkD;EACpE,MAAM,QAAQ,KAAK,eAAe;EAElC,IAAI,CAAC,SAAS,aAAa,cAAc,MAAM,WAC7C;EAGF,MAAM,SAAS,aAAa;EAE5B,IAAI,OAAO,kBAAkB,uBACvB;OAAA,OAAO,QAAQ,SAAS,QAC1B,MAAM,UAAU;IAAE,MAAM;IAAQ,MAAM,OAAO,QAAQ;GAAK,CAAC;EAAA,OAG7D,MAAM,UAAU;GAAE,MAAM;GAAkB;EAAO,CAAC;CAEtD;CAEA,MAAM,kBAAkB,SAAuE;EAC7F,IAAI,KAAK,qBACP,OAAO,KAAK,oBAAoB,OAAO;EAGzC,MAAM,SAAS,QAAQ,QAAQ;EAE/B,IAAI,CAAC,QACH,OAAO,EAAE,SAAS,EAAE,SAAS,YAAY,EAAE;EAG7C,OAAO,EAAE,SAAS,0BAA0B,MAAM,EAAE;CACtD;CAEA,MAAM,aAAa,QAA4D;EAC7E,IAAI,UAAU,MAAM,KAAK,UAAU,YAAY,SAAS,OAAO,IAAI;EAEnE,IAAI,EAAE,OAAO,YAAY,WAEvB,UAAU,IADU,YAAY,OAChB,CAAC,CAAC,OAAO,OAAO;EAGlC,IAAI,OAAO,QAAQ,QAAQ,OAAO,SAAS,MAAM;GAC/C,MAAM,QAAQ,QAAQ,MAAM,IAAI;GAChC,MAAM,SAAS,OAAO,QAAQ,KAAK;GACnC,MAAM,MAAM,OAAO,SAAS,OAAO,QAAQ,OAAO,QAAQ,MAAM;GAChE,OAAO,EAAE,SAAS,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE;EACvD;EAEA,OAAO,EAAE,QAAQ;CACnB;CAEA,MAAM,cAAc,QAA8D;EAChF,MAAM,KAAK,UAAU,YAAY,UAAU,OAAO,MAAM,OAAO,OAAO;EAEtE,OAAO,CAAC;CACV;AACF;AAEA,IAAa,gBAAb,MAA2B;CACzB;CAEA;CACA;CACA;CACA;CACA;CACA,SAAiB;CAEjB,YAAY,SAA+B;EACzC,KAAK,UAAU;CACjB;CAEA,IAAI,YAAgC;EAClC,OAAO,KAAK,SAAS;CACvB;CAEA,MAAM,qBAA2C;EAC/C,MAAM,KAAK,gBAAgB;EAC3B,OAAO,KAAK,SAAS,QAAQ,mBAAmB,CAAC;CACnD;CAEA,MAAM,SAAS,SAAgC;EAC7C,MAAM,KAAK,gBAAgB;EAE3B,MAAM,YAAY,KAAK,SAAS,QAAQ;EAExC,IAAI,aAAa,CAAC,UAAU,MAAK,MAAK,EAAE,YAAY,OAAO,GAAG;GAC5D,MAAM,MAAM,UAAU,KAAI,MAAK,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,KAAK;GACxD,MAAM,IAAI,MAAM,UAAU,QAAQ,wCAAwC,KAAK;EACjF;EAEA,MAAM,KAAK,WAAY,yBAAyB;GAC9C,WAAW,KAAK,QAAS;GACzB;EACF,CAAC;CACH;CAEA,MAAM,OAAO,MAAc,QAAuC;EAChE,MAAM,QAAkB,CAAC;EAEzB,WAAW,MAAM,SAAS,KAAK,aAAa,MAAM,MAAM,GACtD,IAAI,MAAM,SAAS,QACjB,MAAM,KAAK,MAAM,IAAI;EAIzB,OAAO,MAAM,KAAK,EAAE;CACtB;CAEA,OAAO,aAAa,MAAc,QAAsD;EACtF,MAAM,KAAK,gBAAgB;EAE3B,MAAM,YAAY,KAAK,SAAS;EAEhC,IAAI,CAAC,KAAK,cAAc,CAAC,WACvB,MAAM,IAAI,MAAM,mCAAmC;EAGrD,IAAI,QAAQ,SAAS;GACnB,MAAM,KAAK,OAAO;GAClB,MAAM,OAAO,0BAAU,IAAI,MAAM,oBAAoB;EACvD;EAEA,MAAM,QAAQ,iBAAiC;EAC/C,MAAM,QAAqB;GACzB;GACA,UAAS,UAAS,MAAM,KAAK,KAAK;EACpC;EACA,KAAK,gBAAgB;EAErB,MAAM,qBAAqB;GACzB,KAAU,OAAO;GACjB,MAAM,MAAM,QAAQ,0BAAU,IAAI,MAAM,oBAAoB,CAAC;EAC/D;EAEA,QAAQ,iBAAiB,SAAS,cAAc,EAAE,MAAM,KAAK,CAAC;EAE9D,MAAM,kBAAkB,KAAK,WAC1B,OAAO;GACN;GACA,QAAQ,CAAC;IAAE,MAAM;IAAQ,MAAM;GAAK,CAAC;EACvC,CAAC,CAAC,CACD,MACC,aAAY;GACV,KAAK,4BAA4B,QAAQ;GACzC,MAAM,MAAM;EACd,IACA,UAAS;GACP,MAAM,MAAM,KAAK,WAAW,KAAK,CAAC;EACpC,CACF;EAEF,IAAI;GACF,WAAW,MAAM,SAAS,OACxB,MAAM;GAGR,MAAM;EACR,SAAS,OAAO;GACd,MAAM,gBAAgB,YAAY,KAAA,CAAS;GAC3C,MAAM;EACR,UAAU;GACR,QAAQ,oBAAoB,SAAS,YAAY;GACjD,IAAI,KAAK,kBAAkB,OACzB,KAAK,gBAAgB,KAAA;GAGvB,IAAI,KAAK,QAAQ,mBAAmB,OAClC,KAAK,WAAW;EAEpB;CACF;CAEA,MAAM,SAAwB;EAC5B,MAAM,YAAY,KAAK,SAAS;EAEhC,IAAI,CAAC,KAAK,cAAc,CAAC,WACvB;EAGF,MAAM,KAAK,WAAW,OAAO,EAAE,UAAU,CAAC;CAC5C;CAEA,aAAmB;EACjB,KAAK,aAAa,KAAA;EAClB,KAAK,UAAU,KAAA;EACf,KAAK,oBAAoB,KAAA;EACzB,KAAK,gBAAgB,KAAA;EAErB,IAAI,KAAK,gBAAgB,CAAC,KAAK,aAAa,QAC1C,KAAK,aAAa,KAAK;EAGzB,KAAK,eAAe,KAAA;CACtB;CAEA,MAAc,kBAAiC;EAC7C,IAAI,KAAK,cAAc,KAAK,SAC1B;EAGF,KAAK,sBAAsB,KAAK,WAAW;EAC3C,MAAM,KAAK;CACb;CAEA,MAAc,aAA4B;EACxC,KAAK,SAAS;EACd,KAAK,gBAAA,GAAA,cAAA,MAAA,CAAqB,KAAK,QAAQ,SAAS,KAAK,QAAQ,QAAQ,CAAC,GAAG;GACvE,KAAK,KAAK,QAAQ;GAClB,KAAK;IAAE,GAAG,QAAA,QAAQ;IAAK,GAAG,KAAK,QAAQ;GAAI;GAC3C,OAAO;IAAC;IAAQ;IAAQ;GAAM;EAChC,CAAC;EAKD,MAAM,iBAAiB,IAAI,SAAgB,GAAG,WAAW;GACvD,KAAK,aAAc,GAAG,UAAS,UAAS;IACtC,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;GAClE,CAAC;GACD,KAAK,aAAc,GAAG,SAAS,MAAM,WAAW;IAC9C,uBAAO,IAAI,MAAM,yDAAyD,KAAK,YAAY,OAAO,EAAE,CAAC;GACvG,CAAC;EACH,CAAC;EACD,eAAe,YAAY,KAAA,CAAS;EAEpC,KAAK,aAAa,OAAO,GAAG,SAAQ,UAAS;GAC3C,KAAK,UAAU,OAAO,KAAK;EAC7B,CAAC;EAED,MAAMA,YAAAA,GAAAA,yBAAAA,aAAAA,CACJC,OAAAA,SAAS,MAAM,KAAK,aAAa,KAAK,GACtCC,OAAAA,SAAS,MAAM,KAAK,aAAa,MAAM,CACzC;EAEA,MAAM,YACJ,KAAK,QAAQ,aACb,IAAIC,uBAAAA,UAAU,EACZ,YAAY,IAAIC,uBAAAA,gBAAgB,EAAE,UAAU,KAAK,QAAQ,OAAO,QAAA,QAAQ,IAAI,EAAE,CAAC,EACjF,CAAC;EAEH,IAAI;GACF,KAAK,aAAa,IAAIC,yBAAAA,2BAA2B;IAC/C,MAAM,gBAAgB,IAAI,gBAAgB,KAAK,eAAe,WAAW,KAAK,QAAQ,mBAAmB;IACzG,OAAO,KAAK,QAAQ,eAAe,aAAa,KAAK;GACvD,GAAGL,QAAM;GAET,MAAM,QAAQ,KAAK,CAAC,gBAAgB,KAAK,kBAAkB,CAAC,CAAC;EAC/D,SAAS,OAAO;GACd,KAAK,WAAW;GAChB,MAAM,KAAK,WAAW,KAAK;EAC7B;CACF;CAEA,MAAc,oBAAmC;EAC/C,MAAM,KAAK,WAAY,WAAW,KAAK,qBAAqB,CAAC;EAE7D,IAAI,KAAK,QAAQ,cACf,MAAM,KAAK,WAAY,aAAa,EAAE,UAAU,KAAK,QAAQ,aAAa,CAAC;EAG7E,KAAK,UAAU,MAAM,KAAK,WAAY,WAAW,KAAK,qBAAqB,CAAC;EAE5E,IAAI,KAAK,QAAQ,OAAO;GACtB,MAAM,YAAY,KAAK,QAAQ,QAAQ;GAEvC,IAAI,aAAa,CAAC,UAAU,MAAK,MAAK,EAAE,YAAY,KAAK,QAAQ,KAAK,GAAG;IACvE,MAAM,MAAM,UAAU,KAAI,MAAK,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,KAAK;IACxD,MAAM,IAAI,MAAM,UAAU,KAAK,QAAQ,MAAM,wCAAwC,KAAK;GAC5F;GAEA,MAAM,KAAK,WAAY,yBAAyB;IAC9C,WAAW,KAAK,QAAQ;IACxB,SAAS,KAAK,QAAQ;GACxB,CAAC;EACH;CACF;CAEA,uBAAkD;EAChD,OAAO;GACL,iBAAiBM,yBAAAA;GACjB,oBAAoB,EAClB,IAAI;IAAE,cAAc;IAAM,eAAe;GAAK,EAChD;GACA,YAAY;IACV,MAAM;IACN,SAAS;GACX;GACA,GAAG,KAAK,QAAQ;EAClB;CACF;CAEA,uBAAkD;EAChD,OAAO;GACL,KAAK,KAAK,QAAQ,OAAO,QAAA,QAAQ,IAAI;GACrC,YAAY,CAAC;GACb,GAAG,KAAK,QAAQ;EAClB;CACF;CAEA,4BAAoC,UAAgC;EAClE,IAAI,SAAS,eAAe,YAC1B;EAGF,MAAM,IAAI,MAAM,yCAAyC,SAAS,YAAY;CAChF;CAEA,WAAmB,OAAuB;EACxC,MAAM,SAAS,KAAK,OAAO,KAAK;EAEhC,IAAI,iBAAiB,OAAO;GAC1B,IAAI,UAAU,CAAC,MAAM,QAAQ,SAAS,MAAM,GAC1C,MAAM,UAAU,GAAG,MAAM,QAAQ,yBAAyB;GAG5D,OAAO;EACT;EAEA,OAAO,IAAI,MAAM,SAAS,GAAG,OAAO,KAAK,EAAE,yBAAyB,WAAW,OAAO,KAAK,CAAC;CAC9F;AACF;AAQA,SAAS,mBAAqC;CAC5C,MAAM,SAAc,CAAC;CACrB,MAAM,UAGD,CAAC;CACN,IAAI,SAAS;CACb,IAAI;CAEJ,MAAM,aAAyC;EAC7C,IAAI,OAAO,SAAS,GAClB,OAAO,QAAQ,QAAQ;GAAE,OAAO,OAAO,MAAM;GAAI,MAAM;EAAM,CAAC;EAGhE,IAAI,OACF,OAAO,QAAQ,OAAO,KAAK;EAG7B,IAAI,QACF,OAAO,QAAQ,QAAQ;GAAE,OAAO,KAAA;GAAW,MAAM;EAAK,CAAC;EAGzD,OAAO,IAAI,SAAS,SAAS,WAAW;GACtC,QAAQ,KAAK;IAAE;IAAS;GAAO,CAAC;EAClC,CAAC;CACH;CAEA,OAAO;EACL,KAAK,OAAO;GACV,MAAM,SAAS,QAAQ,MAAM;GAC7B,IAAI,QAAQ;IACV,OAAO,QAAQ;KAAE;KAAO,MAAM;IAAM,CAAC;IACrC;GACF;GAEA,OAAO,KAAK,KAAK;EACnB;EACA,QAAQ;GACN,SAAS;GACT,KAAK,MAAM,UAAU,QAAQ,OAAO,CAAC,GACnC,OAAO,QAAQ;IAAE,OAAO,KAAA;IAAW,MAAM;GAAK,CAAC;EAEnD;EACA,MAAM,YAAY;GAChB,QAAQ;GACR,KAAK,MAAM,UAAU,QAAQ,OAAO,CAAC,GACnC,OAAO,OAAO,UAAU;EAE5B;EACA,CAAC,OAAO,iBAAiB;GACvB,OAAO,EAAE,KAAK;EAChB;CACF;AACF;AAEA,SAAS,0BAA0B,QAAgE;CACjG,OAAO;EAAE,SAAS;EAAY,UAAU,OAAO;CAAS;AAC1D;;;ACnZA,MAAM,mBAAmB;AAGzB,MAAM,QAAQ;CACZ,SAAS;CACT,UAAU;CACV,sBAAsB;CACtB,eAAe,CAAC;CAChB,YAAY,aAAa,EACvB,QAAQ,IAAIC,WAAAA,eAAe,EACzB,OAAO,OAAM,eAAc;EACzB,WAAW,MAAM;CACnB,EACF,CAAC,EACH;CACA,UAAU,aAAa,EACrB,QAAQ,IAAIA,WAAAA,eAAe,EACzB,OAAO,OAAM,eAAc;EACzB,WAAW,MAAM;CACnB,EACF,CAAC,EACH;AACF;AAMA,IAAa,WAAb,MAG4C;CAC1C;CACA;CACA;CACA;CAEA,YAAY,SAA0B;EACpC,KAAK,KAAK,QAAQ;EAClB,KAAK,OAAO,QAAQ,QAAQ,QAAQ;EACpC,KAAK,cAAc,QAAQ;EAC3B,KAAK,aAAa,IAAI,cAAc,OAAO;CAC7C;CAEA,iBAAiB,SAAuB,CAAC;CAEzC,iBAAyB;EACvB,OAAO,KAAK;CACd;CAEA,WAAmE;EACjE,OAAO;CACT;CAEA,eAAwB;EACtB,OAAO;CACT;CAEA,YAAY,SAA0C,CAAC;CAEvD,YAAuB,CAEvB;CAEA,kBAA0B;EACxB,OAAO;CACT;CAEA,MAAM,qBAA2C;EAC/C,OAAO,KAAK,WAAW,mBAAmB;CAC5C;CAEA,MAAM,SAAS,SAAgC;EAC7C,OAAO,KAAK,WAAW,SAAS,OAAO;CACzC;CAEA,MAAM,SAAS,UAA4B,SAAiE;EAC1G,MAAM,SAAS,KAAK,UAAU,UAAU,SAAS,YAAY;EAC7D,MAAM,OAAO,MAAM,KAAK,WAAW,OACjC,QACC,SAAuD,WAC1D;EAGA,OAAO;GACL;GACA,UAAU,EACR,YALgB,KAAK,kBAAkB,UAAU,IAK3B,CAAC,CAAC,IAAI,SAAS,GAAG,EAC1C;GACA,aAAa,CAAC;GACd,cAAc;GACd,OAAO,SAAS,UAAA,GAAA,OAAA,WAAA,CAAoB;EACtC;CACF;CAEA,MAAM,iBAAkD;EACtD,MAAM,IAAI,MAAM,6DAA6D;CAC/E;CAEA,MAAM,eAA8C;EAClD,MAAM,IAAI,MAAM,2DAA2D;CAC7E;CAEA,MAAM,OAAO,UAA4B,SAA6D;EACpG,MAAM,QAAQ,SAAS,UAAA,GAAA,OAAA,WAAA,CAAoB;EAC3C,MAAM,SAAS,KAAK,UAAU,UAAU,SAAS,YAAY;EAC7D,MAAM,SAAU,SAAuD;EACvE,MAAM,cAAc,IAAIC,gCAAAA,YAAY;EACpC,YAAY,IAAI,UAAU,OAAO;EAEjC,IAAI;EACJ,IAAI;EACJ,MAAM,cAAc,IAAI,SAAiB,SAAS,WAAW;GAC3D,cAAc;GACd,aAAa;EACf,CAAC;EAiDD,OAAO;GACL,YAAA,IAhDqBD,WAAAA,eAA0B,EAC/C,OAAO,OAAM,eAAc;IACzB,MAAM,UAAA,GAAA,OAAA,WAAA,CAAoB;IAC1B,MAAM,SAAmB,CAAC;IAC1B,MAAM,4BAAY,IAAI,IAAoB;IAC1C,MAAM,cAA+B,CAAC;IAEtC,IAAI;KACF,WAAW,QAAQ;MAAE,MAAM;MAAc;MAAO,MAAM;MAAkB,SAAS,EAAE,IAAI,OAAO;KAAE,CAAC;KAEjG,WAAW,MAAM,SAAS,KAAK,WAAW,aAAa,QAAQ,MAAM,GACnE,IAAI,MAAM,SAAS,QAAQ;MACzB,OAAO,KAAK,MAAM,IAAI;MACtB,WAAW,QAAQ;OACjB,MAAM;OACN;OACA,MAAM;OACN,SAAS;QAAE,IAAI;QAAQ,MAAM,MAAM;OAAK;MAC1C,CAAC;KACH,OAAO,IAAI,MAAM,SAAS,kBACxB,KAAK,MAAM,SAAS,6BAA6B,MAAM,QAAQ,OAAO,SAAS,GAAG;MAChF,IAAI,MAAM,SAAS,eACjB,YAAY,KAAK,EAAE,SAAS,MAAM,QAAQ,CAAC;MAE7C,WAAW,QAAQ,KAAK;KAC1B;KAIJ,MAAM,OAAO,OAAO,KAAK,EAAE;KAC3B,YAAY,IAAI,CAAC;MAAE,MAAM;MAAa,SAAS;KAAK,CAAC,GAAG,UAAU;KAElE,WAAW,QAAQ;MAAE,MAAM;MAAY;MAAO,MAAM;MAAkB,SAAS,EAAE,IAAI,OAAO;KAAE,CAAC;KAC/F,WAAW,QAAQ,kBAAkB,eAAe,KAAK,CAAC;KAC1D,WAAW,QAAQ,kBAAkB,UAAU,KAAK,CAAC;KACrD,MAAM,SAAS,WAAW,qBAAqB;MAAE;MAAM;MAAO;MAAa;KAAY,CAAC,CAAQ;KAChG,YAAY,IAAI;KAChB,WAAW,MAAM;IACnB,SAAS,OAAO;KACd,MAAM,OAAO,OAAO,KAAK,EAAE;KAC3B,MAAM,SAAS,WAAW,qBAAqB;MAAE;MAAM;MAAO;MAAa;MAAa;KAAM,CAAC,CAAQ;KACvG,WAAW,KAAK;KAChB,WAAW,MAAM,KAAK;IACxB;GACF,EACF,CAGW;GACT,MAAM;GACN;GACA,aAAa,CAAC;GACd;EACF;CACF;CAEA,UAAkB,UAA4B,cAA0C;EACtF,MAAM,SAAS,YAAY,QAAQ;EACnC,MAAM,kBAAkB,eAAe,oBAAoB,YAAY,IAAI;EAE3E,IAAI,CAAC,iBACH,OAAO;EAGT,OAAO,GAAG,gBAAgB,MAAM;CAClC;CAEA,kBAA0B,UAA4B,MAA2B;EAC/E,MAAM,cAAc,IAAIC,gCAAAA,YAAY;EACpC,YAAY,IAAI,UAAU,OAAO;EACjC,YAAY,IAAI,CAAC;GAAE,MAAM;GAAa,SAAS;EAAK,CAAC,GAAG,UAAU;EAClE,OAAO;CACT;AACF;AAEA,SAAS,YAAY,UAAoC;CACvD,IAAI,OAAO,aAAa,UACtB,OAAO;CAGT,IAAI,MAAM,QAAQ,QAAQ,KAAK,SAAS,OAAM,YAAW,OAAO,YAAY,QAAQ,GAClF,OAAO,SAAS,KAAK,IAAI;CAG3B,MAAM,cAAc,IAAIA,gCAAAA,YAAY;CACpC,YAAY,IAAI,UAAU,OAAO;CAEjC,OAAO,YAAY,IAAI,IACpB,KAAK,CAAC,CACN,KAAI,aAAA,GAAA,gCAAA,oBAAA,CAA+B,QAAQ,OAAO,CAAC,CAAC,CACpD,OAAO,OAAO,CAAC,CACf,KAAK,IAAI;AACd;AAEA,SAAS,oBAAoB,cAAyC;CACpE,IAAI,OAAO,iBAAiB,UAC1B,OAAO;CAGT,IAAI,MAAM,QAAQ,YAAY,GAC5B,OAAO,aAAa,KAAI,gBAAe,oBAAoB,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI;CAGpF,QAAA,GAAA,gCAAA,oBAAA,CAA2B,aAAa,OAAO;AACjD;AAEA,SAAS,6BACP,QACA,OACA,WACa;CACb,QAAQ,OAAO,eAAf;EACE,KAAK,aAAa;GAChB,MAAM,WAAW,YAAY,QAAQ,SAAS;GAC9C,UAAU,IAAI,OAAO,YAAY,QAAQ;GAEzC,OAAO,CACL;IACE,MAAM;IACN;IACA,MAAM;IACN,SAAS;KACP,YAAY,OAAO;KACnB;KACA,MAAM,SAAS,OAAO,QAAQ;IAChC;GACF,CACF;EACF;EACA,KAAK,oBAAoB;GACvB,MAAM,WAAW,YAAY,QAAQ,SAAS;GAE9C,IAAI,OAAO,WAAW,eAAe,OAAO,WAAW,UACrD,OAAO,CACL;IACE,MAAM;IACN;IACA,MAAM;IACN,SAAS;KACP,YAAY,OAAO;KACnB;KACA,QAAQ,OAAO,aAAa,OAAO,WAAW;MAAE,QAAQ,OAAO;MAAQ,OAAO,OAAO;KAAM;KAC3F,SAAS,OAAO,WAAW;IAC7B;GACF,CACF;GAGF,OAAO,CACL;IACE,MAAM;IACN;IACA,MAAM;IACN,SAAS;KACP,YAAY,OAAO;KACnB;KACA,eAAe,OAAO,SAAS,OAAO,UAAU;IAClD;GACF,CACF;EACF;EACA,SACE,OAAO,CAAC;CACZ;AACF;AAEA,SAAS,YACP,QACA,WACQ;CACR,OAAO,OAAO,SAAS,UAAU,IAAI,OAAO,UAAU,KAAK,OAAO,QAAQ;AAC5E;AAEA,SAAS,SAAS,OAAyC;CACzD,IAAI,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAC5D,OAAO;CAGT,IAAI,UAAU,KAAA,GACZ,OAAO,CAAC;CAGV,OAAO,EAAE,OAAO,MAAM;AACxB;AAEA,SAAS,qBAAqB,EAC5B,MACA,OACA,aACA,aACA,SAOC;CACD,MAAM,QAAQ;EAAE,aAAa;EAAG,cAAc;EAAG,aAAa;CAAE;CAEhE,OAAO;EACL;EACA,cAAc;EACd;EACA,YAAY;EACZ,UAAU,CAAC;EACX,UAAU,EACR,UAAU,YAAY,IAAI,SAAS,KAAK,MAAM,EAChD;EACA,OAAO,CAAC;EACR;EACA;EACA,GAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM;CACzC;AACF;AAEA,SAAS,kBAAkB,MAAgC,OAA0B;CACnF,OAAO;EACL;EACA;EACA,MAAM;EACN,SAAS;GACP,KAAA,GAAA,OAAA,WAAA,CAAe;GACf,QAAQ;IACN,OAAO,CAAC;IACR,OAAO;KAAE,aAAa;KAAG,cAAc;KAAG,aAAa;IAAE;GAC3D;GACA,YAAY;IACV,QAAQ;IACR,UAAU,CAAC;IACX,aAAa;GACf;GACA,UAAU,CAAC;GACX,UAAU;IAAE,SAAS,CAAC;IAAG,KAAK,CAAC;GAAE;EACnC;CACF;AACF;;;ACpXA,IAAa,iBAAb,MAA4B;CAGG;CAF7B;CAEA,YAAY,SAAgD;EAA/B,KAAA,UAAA;CAAgC;CAE7D,cAAc,WAA6D;EACzE,IAAI,KAAK,QAAQ,mBAAmB,OAClC,OAAO,KAAK,iBAAiB,SAAS;EAGxC,KAAK,eAAe,KAAK,iBAAiB,SAAS;EACnD,OAAO,KAAK;CACd;CAEA,iBAAyB,WAA6D;EACpF,OAAO,IAAI,cAAc;GACvB,GAAG,KAAK;GACR,WAAW,aAAa,KAAK,QAAQ;EACvC,CAAC;CACH;AACF;;;AChBA,SAAgB,cAAc,SAA+B;CAC3D,MAAM,UAAU,IAAI,eAAe,OAAO;CAE1C,QAAA,GAAA,mBAAA,WAAA,CAAkB;EAChB,IAAI,QAAQ;EACZ,aAAa,QAAQ;EACrB,aAAa;GACf,WAAW;GACX,QAAQ;GACR,cAAc,EACZ,QAAQ;IACN,QAAQ;IACR,eAAe;GACjB,EACF;GACA,YAAY,CACV,MACF;EACF;EACI,cAAc;GAChB,WAAW;GACX,QAAQ;GACR,cAAc,EACZ,UAAU;IACR,QAAQ;IACR,eAAe;GACjB,EACF;GACA,YAAY,CACV,QACF;EACF;EACI,eAAe;GACjB,WAAW;GACX,QAAQ;GACR,cAAc,EACZ,qBAAqB;IACnB,QAAQ;IACR,cAAc;KACZ,SAAS;MACP,QAAQ;MACR,eAAe;KACjB;KACA,WAAW;MACT,QAAQ;MACR,SAAS;OACP,QAAQ;OACR,cAAc;QACZ,YAAY;SACV,QAAQ;SACR,eAAe;QACjB;QACA,QAAQ;SACN,QAAQ;SACR,eAAe;QACjB;OACF;OACA,YAAY,CACV,YACA,MACF;MACF;KACF;IACF;IACA,YAAY,CACV,SACA,SACF;GACF,EACF;GACA,YAAY,CACV,mBACF;EACF;EACI,cAAc;GAChB,WAAW;GACX,SAAS,CACP;IACE,QAAQ;IACR,cAAc;KACZ,YAAY;MACV,eAAe;MACf,QAAQ;KACV;KACA,WAAW;MACT,eAAe;MACf,QAAQ;MACR,SAAS;KACX;IACF;GACF,GACA;IACE,QAAQ;IACR,cAAc,EACZ,WAAW;KACT,eAAe;KACf,QAAQ;KACR,SAAS;IACX,EACF;GACF,CACF;EACF;EACI,SAAS,OAAO,EAAE,QAAQ,YAAY;GACpC,MAAM,YAAY,MAAM,SAAS,QAAQ,aAAa;GAItD,OAAO,EAAE,QAAA,MAHU,QAAQ,cAAc,SACX,CAAC,CAAC,OAAO,MAAM,SAAS,WAAW,EAEjD;EAClB;CACF,CAAC;AACH"}
1
+ {"version":3,"file":"index.cjs","names":["stream","Writable","Readable","Workspace","LocalFilesystem","ClientSideConnection","PROTOCOL_VERSION","ReadableStream","MessageList"],"sources":["../src/connection.ts","../src/agent.ts","../src/session.ts","../src/tool.ts"],"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 InitializeRequest,\n ModelInfo,\n NewSessionRequest,\n NewSessionResponse,\n PermissionOption,\n PromptResponse,\n ReadTextFileRequest,\n ReadTextFileResponse,\n RequestPermissionRequest,\n RequestPermissionResponse,\n SessionNotification,\n SessionUpdate,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from '@agentclientprotocol/sdk';\n\nimport { LocalFilesystem, Workspace } from '@mastra/core/workspace';\nimport type { CreateACPToolOptions } from './types';\n\nexport type ACPStreamEvent = { type: 'text'; text: string } | { type: 'session-update'; update: SessionUpdate };\n\ntype PromptState = {\n sessionId: string;\n onEvent?: (event: ACPStreamEvent) => 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 if (update.content.type === 'text') {\n state.onEvent?.({ type: 'text', text: update.content.text });\n }\n } else {\n state.onEvent?.({ type: 'session-update', update });\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 getAvailableModels(): Promise<ModelInfo[]> {\n await this.ensureConnected();\n return this.session?.models?.availableModels ?? [];\n }\n\n async setModel(modelId: string): Promise<void> {\n await this.ensureConnected();\n\n const available = this.session?.models?.availableModels;\n\n if (available && !available.some(m => m.modelId === modelId)) {\n const ids = available.map(m => m.modelId).join(', ') || '(none)';\n throw new Error(`Model \"${modelId}\" is not available. Available models: ${ids}`);\n }\n\n await this.connection!.unstable_setSessionModel({\n sessionId: this.session!.sessionId,\n modelId,\n });\n }\n\n async prompt(task: string, signal?: AbortSignal): Promise<string> {\n const parts: string[] = [];\n\n for await (const event of this.promptStream(task, signal)) {\n if (event.type === 'text') {\n parts.push(event.text);\n }\n }\n\n return parts.join('');\n }\n\n async *promptStream(task: string, signal?: AbortSignal): AsyncGenerator<ACPStreamEvent> {\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<ACPStreamEvent>();\n const state: PromptState = {\n sessionId,\n onEvent: event => queue.push(event),\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 // Keep an 'error' listener attached for the lifetime of the process so a\n // failed spawn (e.g. ENOENT) rejects initialization instead of crashing\n // the host process with an unhandled 'error' event.\n const processFailure = new Promise<never>((_, reject) => {\n this.agentProcess!.on('error', error => {\n reject(error instanceof Error ? error : new Error(String(error)));\n });\n this.agentProcess!.on('exit', (code, signal) => {\n reject(new Error(`ACP agent process exited during initialization (code: ${code}, signal: ${signal})`));\n });\n });\n processFailure.catch(() => undefined);\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 try {\n this.connection = new ClientSideConnection(() => {\n const defaultClient = new ACPClient(() => this.currentPrompt, workspace, this.options.onPermissionRequest);\n return this.options.createClient?.(defaultClient) ?? defaultClient;\n }, stream);\n\n await Promise.race([processFailure, this.initializeSession()]);\n } catch (error) {\n this.disconnect();\n throw this.withStderr(error);\n }\n }\n\n private async initializeSession(): Promise<void> {\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\n if (this.options.model) {\n const available = this.session.models?.availableModels;\n\n if (available && !available.some(m => m.modelId === this.options.model)) {\n const ids = available.map(m => m.modelId).join(', ') || '(none)';\n throw new Error(`Model \"${this.options.model}\" is not available. Available models: ${ids}`);\n }\n\n await this.connection!.unstable_setSessionModel({\n sessionId: this.session.sessionId,\n modelId: this.options.model,\n });\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\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 { ReadableStream } from 'node:stream/web';\n\nimport type { ModelInfo, SessionUpdate } from '@agentclientprotocol/sdk';\nimport type {\n AgentGenerateOptions,\n AgentInstructions,\n AgentStreamOptions,\n MastraLanguageModel,\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 { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nconst CHUNK_FROM_AGENT = 'AGENT' as ChunkType['from'];\ntype AcpToolResult = Extract<NonNullable<SubAgentStreamResult['toolResults']>, unknown[]>[number];\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 MastraLanguageModel;\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 getAvailableModels(): Promise<ModelInfo[]> {\n return this.connection.getAvailableModels();\n }\n\n async setModel(modelId: string): Promise<void> {\n return this.connection.setModel(modelId);\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 ?? globalThis.crypto.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 ?? globalThis.crypto.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 = globalThis.crypto.randomUUID();\n const chunks: string[] = [];\n const toolNames = new Map<string, string>();\n const toolResults: AcpToolResult[] = [];\n\n try {\n controller.enqueue({ type: 'text-start', runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });\n\n for await (const event of this.connection.promptStream(prompt, signal)) {\n if (event.type === 'text') {\n chunks.push(event.text);\n controller.enqueue({\n type: 'text-delta',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: { id: textId, text: event.text },\n });\n } else if (event.type === 'session-update') {\n for (const chunk of getMastraChunksFromACPUpdate(event.update, runId, toolNames)) {\n if (chunk.type === 'tool-result') {\n toolResults.push({ payload: chunk.payload });\n }\n controller.enqueue(chunk);\n }\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 await options?.onFinish?.(createOnFinishResult({ text, runId, messageList, toolResults }) as any);\n resolveText(text);\n controller.close();\n } catch (error) {\n const text = chunks.join('');\n await options?.onFinish?.(createOnFinishResult({ text, runId, messageList, toolResults, error }) as any);\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 getMastraChunksFromACPUpdate(\n update: SessionUpdate,\n runId: string,\n toolNames: Map<string, string>,\n): ChunkType[] {\n switch (update.sessionUpdate) {\n case 'tool_call': {\n const toolName = getToolName(update, toolNames);\n toolNames.set(update.toolCallId, toolName);\n\n return [\n {\n type: 'tool-call',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n args: toRecord(update.rawInput),\n },\n },\n ];\n }\n case 'tool_call_update': {\n const toolName = getToolName(update, toolNames);\n\n if (update.status === 'completed' || update.status === 'failed') {\n return [\n {\n type: 'tool-result',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n result: update.rawOutput ?? update.content ?? { status: update.status, title: update.title },\n isError: update.status === 'failed',\n },\n },\n ];\n }\n\n return [\n {\n type: 'tool-call-delta',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n argsTextDelta: update.title ?? update.status ?? '',\n },\n },\n ];\n }\n default:\n return [];\n }\n}\n\nfunction getToolName(\n update: Extract<SessionUpdate, { sessionUpdate: 'tool_call' | 'tool_call_update' }>,\n toolNames: Map<string, string>,\n): string {\n return update.title ?? toolNames.get(update.toolCallId) ?? update.kind ?? 'acp_tool';\n}\n\nfunction toRecord(value: unknown): Record<string, unknown> {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n\n if (value === undefined) {\n return {};\n }\n\n return { input: value };\n}\n\nfunction createOnFinishResult({\n text,\n runId,\n messageList,\n toolResults,\n error,\n}: {\n text: string;\n runId: string;\n messageList: MessageList;\n toolResults: AcpToolResult[];\n error?: unknown;\n}) {\n const usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n\n return {\n text,\n finishReason: 'stop',\n usage,\n totalUsage: usage,\n warnings: [],\n response: {\n messages: messageList.get.response.aiV5.model(),\n },\n steps: [],\n toolResults,\n runId,\n ...(error === undefined ? {} : { error }),\n };\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: globalThis.crypto.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 { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nexport class ACPToolSession {\n private connection?: ACPConnection;\n\n constructor(private readonly options: CreateACPToolOptions) {}\n\n getConnection(workspace: CreateACPToolOptions['workspace']): ACPConnection {\n if (this.options.persistSession === false) {\n return this.createConnection(workspace);\n }\n\n this.connection ??= this.createConnection(workspace);\n return this.connection;\n }\n\n private createConnection(workspace: CreateACPToolOptions['workspace']): ACPConnection {\n return new ACPConnection({\n ...this.options,\n workspace: workspace ?? this.options.workspace,\n });\n }\n}\n","import { compileSchema } from '@internal/types-builder/compile-zod';\nimport { createTool } from '@mastra/core/tools';\nimport { z } from 'zod/v4';\n\nimport { ACPToolSession } from './session';\nimport type { CreateACPToolOptions } from './types';\n\nexport function createACPTool(options: CreateACPToolOptions) {\n const session = new ACPToolSession(options);\n\n return createTool({\n id: options.id,\n description: options.description,\n inputSchema: compileSchema(\n z.object({\n task: z.string().describe('The task to send to the ACP agent'),\n }),\n ),\n outputSchema: compileSchema(\n z.object({\n output: z.string().describe('The output of the ACP agent'),\n }),\n ),\n suspendSchema: compileSchema(\n 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 ),\n resumeSchema: compileSchema(\n 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 ),\n execute: async ({ task }, context) => {\n const workspace = await context?.mastra?.getWorkspace();\n const connection = session.getConnection(workspace);\n const output = await connection.prompt(task, context?.abortSignal);\n\n return { output };\n },\n });\n}\n"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,4 +1,3 @@
1
- import { randomUUID } from "crypto";
2
1
  import { ReadableStream } from "stream/web";
3
2
  import { MessageList, coreContentToString } from "@mastra/core/agent/message-list";
4
3
  import { spawn } from "child_process";
@@ -349,7 +348,7 @@ var AcpAgent = class {
349
348
  response: { dbMessages: this.createMessageList(messages, text).get.response.db() },
350
349
  toolResults: [],
351
350
  finishReason: "stop",
352
- runId: options?.runId ?? randomUUID()
351
+ runId: options?.runId ?? globalThis.crypto.randomUUID()
353
352
  };
354
353
  }
355
354
  async resumeGenerate() {
@@ -359,7 +358,7 @@ var AcpAgent = class {
359
358
  throw new Error("AcpAgent does not support resuming suspended stream calls");
360
359
  }
361
360
  async stream(messages, options) {
362
- const runId = options?.runId ?? randomUUID();
361
+ const runId = options?.runId ?? globalThis.crypto.randomUUID();
363
362
  const prompt = this.getPrompt(messages, options?.instructions);
364
363
  const signal = options?.abortSignal;
365
364
  const messageList = new MessageList();
@@ -372,7 +371,7 @@ var AcpAgent = class {
372
371
  });
373
372
  return {
374
373
  fullStream: new ReadableStream({ start: async (controller) => {
375
- const textId = randomUUID();
374
+ const textId = globalThis.crypto.randomUUID();
376
375
  const chunks = [];
377
376
  const toolNames = /* @__PURE__ */ new Map();
378
377
  const toolResults = [];
@@ -545,7 +544,7 @@ function createFinishChunk(type, runId) {
545
544
  runId,
546
545
  from: CHUNK_FROM_AGENT,
547
546
  payload: {
548
- id: randomUUID(),
547
+ id: globalThis.crypto.randomUUID(),
549
548
  output: {
550
549
  steps: [],
551
550
  usage: {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/connection.ts","../src/agent.ts","../src/session.ts","../src/tool.ts"],"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 InitializeRequest,\n ModelInfo,\n NewSessionRequest,\n NewSessionResponse,\n PermissionOption,\n PromptResponse,\n ReadTextFileRequest,\n ReadTextFileResponse,\n RequestPermissionRequest,\n RequestPermissionResponse,\n SessionNotification,\n SessionUpdate,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from '@agentclientprotocol/sdk';\n\nimport { LocalFilesystem, Workspace } from '@mastra/core/workspace';\nimport type { CreateACPToolOptions } from './types';\n\nexport type ACPStreamEvent = { type: 'text'; text: string } | { type: 'session-update'; update: SessionUpdate };\n\ntype PromptState = {\n sessionId: string;\n onEvent?: (event: ACPStreamEvent) => 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 if (update.content.type === 'text') {\n state.onEvent?.({ type: 'text', text: update.content.text });\n }\n } else {\n state.onEvent?.({ type: 'session-update', update });\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 getAvailableModels(): Promise<ModelInfo[]> {\n await this.ensureConnected();\n return this.session?.models?.availableModels ?? [];\n }\n\n async setModel(modelId: string): Promise<void> {\n await this.ensureConnected();\n\n const available = this.session?.models?.availableModels;\n\n if (available && !available.some(m => m.modelId === modelId)) {\n const ids = available.map(m => m.modelId).join(', ') || '(none)';\n throw new Error(`Model \"${modelId}\" is not available. Available models: ${ids}`);\n }\n\n await this.connection!.unstable_setSessionModel({\n sessionId: this.session!.sessionId,\n modelId,\n });\n }\n\n async prompt(task: string, signal?: AbortSignal): Promise<string> {\n const parts: string[] = [];\n\n for await (const event of this.promptStream(task, signal)) {\n if (event.type === 'text') {\n parts.push(event.text);\n }\n }\n\n return parts.join('');\n }\n\n async *promptStream(task: string, signal?: AbortSignal): AsyncGenerator<ACPStreamEvent> {\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<ACPStreamEvent>();\n const state: PromptState = {\n sessionId,\n onEvent: event => queue.push(event),\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 // Keep an 'error' listener attached for the lifetime of the process so a\n // failed spawn (e.g. ENOENT) rejects initialization instead of crashing\n // the host process with an unhandled 'error' event.\n const processFailure = new Promise<never>((_, reject) => {\n this.agentProcess!.on('error', error => {\n reject(error instanceof Error ? error : new Error(String(error)));\n });\n this.agentProcess!.on('exit', (code, signal) => {\n reject(new Error(`ACP agent process exited during initialization (code: ${code}, signal: ${signal})`));\n });\n });\n processFailure.catch(() => undefined);\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 try {\n this.connection = new ClientSideConnection(() => {\n const defaultClient = new ACPClient(() => this.currentPrompt, workspace, this.options.onPermissionRequest);\n return this.options.createClient?.(defaultClient) ?? defaultClient;\n }, stream);\n\n await Promise.race([processFailure, this.initializeSession()]);\n } catch (error) {\n this.disconnect();\n throw this.withStderr(error);\n }\n }\n\n private async initializeSession(): Promise<void> {\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\n if (this.options.model) {\n const available = this.session.models?.availableModels;\n\n if (available && !available.some(m => m.modelId === this.options.model)) {\n const ids = available.map(m => m.modelId).join(', ') || '(none)';\n throw new Error(`Model \"${this.options.model}\" is not available. Available models: ${ids}`);\n }\n\n await this.connection!.unstable_setSessionModel({\n sessionId: this.session.sessionId,\n modelId: this.options.model,\n });\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\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 { ModelInfo, SessionUpdate } from '@agentclientprotocol/sdk';\nimport type {\n AgentGenerateOptions,\n AgentInstructions,\n AgentStreamOptions,\n MastraLanguageModel,\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 { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nconst CHUNK_FROM_AGENT = 'AGENT' as ChunkType['from'];\ntype AcpToolResult = Extract<NonNullable<SubAgentStreamResult['toolResults']>, unknown[]>[number];\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 MastraLanguageModel;\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 getAvailableModels(): Promise<ModelInfo[]> {\n return this.connection.getAvailableModels();\n }\n\n async setModel(modelId: string): Promise<void> {\n return this.connection.setModel(modelId);\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 const toolNames = new Map<string, string>();\n const toolResults: AcpToolResult[] = [];\n\n try {\n controller.enqueue({ type: 'text-start', runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });\n\n for await (const event of this.connection.promptStream(prompt, signal)) {\n if (event.type === 'text') {\n chunks.push(event.text);\n controller.enqueue({\n type: 'text-delta',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: { id: textId, text: event.text },\n });\n } else if (event.type === 'session-update') {\n for (const chunk of getMastraChunksFromACPUpdate(event.update, runId, toolNames)) {\n if (chunk.type === 'tool-result') {\n toolResults.push({ payload: chunk.payload });\n }\n controller.enqueue(chunk);\n }\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 await options?.onFinish?.(createOnFinishResult({ text, runId, messageList, toolResults }) as any);\n resolveText(text);\n controller.close();\n } catch (error) {\n const text = chunks.join('');\n await options?.onFinish?.(createOnFinishResult({ text, runId, messageList, toolResults, error }) as any);\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 getMastraChunksFromACPUpdate(\n update: SessionUpdate,\n runId: string,\n toolNames: Map<string, string>,\n): ChunkType[] {\n switch (update.sessionUpdate) {\n case 'tool_call': {\n const toolName = getToolName(update, toolNames);\n toolNames.set(update.toolCallId, toolName);\n\n return [\n {\n type: 'tool-call',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n args: toRecord(update.rawInput),\n },\n },\n ];\n }\n case 'tool_call_update': {\n const toolName = getToolName(update, toolNames);\n\n if (update.status === 'completed' || update.status === 'failed') {\n return [\n {\n type: 'tool-result',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n result: update.rawOutput ?? update.content ?? { status: update.status, title: update.title },\n isError: update.status === 'failed',\n },\n },\n ];\n }\n\n return [\n {\n type: 'tool-call-delta',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n argsTextDelta: update.title ?? update.status ?? '',\n },\n },\n ];\n }\n default:\n return [];\n }\n}\n\nfunction getToolName(\n update: Extract<SessionUpdate, { sessionUpdate: 'tool_call' | 'tool_call_update' }>,\n toolNames: Map<string, string>,\n): string {\n return update.title ?? toolNames.get(update.toolCallId) ?? update.kind ?? 'acp_tool';\n}\n\nfunction toRecord(value: unknown): Record<string, unknown> {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n\n if (value === undefined) {\n return {};\n }\n\n return { input: value };\n}\n\nfunction createOnFinishResult({\n text,\n runId,\n messageList,\n toolResults,\n error,\n}: {\n text: string;\n runId: string;\n messageList: MessageList;\n toolResults: AcpToolResult[];\n error?: unknown;\n}) {\n const usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n\n return {\n text,\n finishReason: 'stop',\n usage,\n totalUsage: usage,\n warnings: [],\n response: {\n messages: messageList.get.response.aiV5.model(),\n },\n steps: [],\n toolResults,\n runId,\n ...(error === undefined ? {} : { error }),\n };\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 { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nexport class ACPToolSession {\n private connection?: ACPConnection;\n\n constructor(private readonly options: CreateACPToolOptions) {}\n\n getConnection(workspace: CreateACPToolOptions['workspace']): ACPConnection {\n if (this.options.persistSession === false) {\n return this.createConnection(workspace);\n }\n\n this.connection ??= this.createConnection(workspace);\n return this.connection;\n }\n\n private createConnection(workspace: CreateACPToolOptions['workspace']): ACPConnection {\n return new ACPConnection({\n ...this.options,\n workspace: workspace ?? this.options.workspace,\n });\n }\n}\n","import { compileSchema } from '@internal/types-builder/compile-zod';\nimport { createTool } from '@mastra/core/tools';\nimport { z } from 'zod/v4';\n\nimport { ACPToolSession } from './session';\nimport type { CreateACPToolOptions } from './types';\n\nexport function createACPTool(options: CreateACPToolOptions) {\n const session = new ACPToolSession(options);\n\n return createTool({\n id: options.id,\n description: options.description,\n inputSchema: compileSchema(\n z.object({\n task: z.string().describe('The task to send to the ACP agent'),\n }),\n ),\n outputSchema: compileSchema(\n z.object({\n output: z.string().describe('The output of the ACP agent'),\n }),\n ),\n suspendSchema: compileSchema(\n 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 ),\n resumeSchema: compileSchema(\n 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 ),\n execute: async ({ task }, context) => {\n const workspace = await context?.mastra?.getWorkspace();\n const connection = session.getConnection(workspace);\n const output = await connection.prompt(task, context?.abortSignal);\n\n return { output };\n },\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/connection.ts","../src/agent.ts","../src/session.ts","../src/tool.ts"],"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 InitializeRequest,\n ModelInfo,\n NewSessionRequest,\n NewSessionResponse,\n PermissionOption,\n PromptResponse,\n ReadTextFileRequest,\n ReadTextFileResponse,\n RequestPermissionRequest,\n RequestPermissionResponse,\n SessionNotification,\n SessionUpdate,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from '@agentclientprotocol/sdk';\n\nimport { LocalFilesystem, Workspace } from '@mastra/core/workspace';\nimport type { CreateACPToolOptions } from './types';\n\nexport type ACPStreamEvent = { type: 'text'; text: string } | { type: 'session-update'; update: SessionUpdate };\n\ntype PromptState = {\n sessionId: string;\n onEvent?: (event: ACPStreamEvent) => 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 if (update.content.type === 'text') {\n state.onEvent?.({ type: 'text', text: update.content.text });\n }\n } else {\n state.onEvent?.({ type: 'session-update', update });\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 getAvailableModels(): Promise<ModelInfo[]> {\n await this.ensureConnected();\n return this.session?.models?.availableModels ?? [];\n }\n\n async setModel(modelId: string): Promise<void> {\n await this.ensureConnected();\n\n const available = this.session?.models?.availableModels;\n\n if (available && !available.some(m => m.modelId === modelId)) {\n const ids = available.map(m => m.modelId).join(', ') || '(none)';\n throw new Error(`Model \"${modelId}\" is not available. Available models: ${ids}`);\n }\n\n await this.connection!.unstable_setSessionModel({\n sessionId: this.session!.sessionId,\n modelId,\n });\n }\n\n async prompt(task: string, signal?: AbortSignal): Promise<string> {\n const parts: string[] = [];\n\n for await (const event of this.promptStream(task, signal)) {\n if (event.type === 'text') {\n parts.push(event.text);\n }\n }\n\n return parts.join('');\n }\n\n async *promptStream(task: string, signal?: AbortSignal): AsyncGenerator<ACPStreamEvent> {\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<ACPStreamEvent>();\n const state: PromptState = {\n sessionId,\n onEvent: event => queue.push(event),\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 // Keep an 'error' listener attached for the lifetime of the process so a\n // failed spawn (e.g. ENOENT) rejects initialization instead of crashing\n // the host process with an unhandled 'error' event.\n const processFailure = new Promise<never>((_, reject) => {\n this.agentProcess!.on('error', error => {\n reject(error instanceof Error ? error : new Error(String(error)));\n });\n this.agentProcess!.on('exit', (code, signal) => {\n reject(new Error(`ACP agent process exited during initialization (code: ${code}, signal: ${signal})`));\n });\n });\n processFailure.catch(() => undefined);\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 try {\n this.connection = new ClientSideConnection(() => {\n const defaultClient = new ACPClient(() => this.currentPrompt, workspace, this.options.onPermissionRequest);\n return this.options.createClient?.(defaultClient) ?? defaultClient;\n }, stream);\n\n await Promise.race([processFailure, this.initializeSession()]);\n } catch (error) {\n this.disconnect();\n throw this.withStderr(error);\n }\n }\n\n private async initializeSession(): Promise<void> {\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\n if (this.options.model) {\n const available = this.session.models?.availableModels;\n\n if (available && !available.some(m => m.modelId === this.options.model)) {\n const ids = available.map(m => m.modelId).join(', ') || '(none)';\n throw new Error(`Model \"${this.options.model}\" is not available. Available models: ${ids}`);\n }\n\n await this.connection!.unstable_setSessionModel({\n sessionId: this.session.sessionId,\n modelId: this.options.model,\n });\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\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 { ReadableStream } from 'node:stream/web';\n\nimport type { ModelInfo, SessionUpdate } from '@agentclientprotocol/sdk';\nimport type {\n AgentGenerateOptions,\n AgentInstructions,\n AgentStreamOptions,\n MastraLanguageModel,\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 { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nconst CHUNK_FROM_AGENT = 'AGENT' as ChunkType['from'];\ntype AcpToolResult = Extract<NonNullable<SubAgentStreamResult['toolResults']>, unknown[]>[number];\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 MastraLanguageModel;\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 getAvailableModels(): Promise<ModelInfo[]> {\n return this.connection.getAvailableModels();\n }\n\n async setModel(modelId: string): Promise<void> {\n return this.connection.setModel(modelId);\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 ?? globalThis.crypto.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 ?? globalThis.crypto.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 = globalThis.crypto.randomUUID();\n const chunks: string[] = [];\n const toolNames = new Map<string, string>();\n const toolResults: AcpToolResult[] = [];\n\n try {\n controller.enqueue({ type: 'text-start', runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });\n\n for await (const event of this.connection.promptStream(prompt, signal)) {\n if (event.type === 'text') {\n chunks.push(event.text);\n controller.enqueue({\n type: 'text-delta',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: { id: textId, text: event.text },\n });\n } else if (event.type === 'session-update') {\n for (const chunk of getMastraChunksFromACPUpdate(event.update, runId, toolNames)) {\n if (chunk.type === 'tool-result') {\n toolResults.push({ payload: chunk.payload });\n }\n controller.enqueue(chunk);\n }\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 await options?.onFinish?.(createOnFinishResult({ text, runId, messageList, toolResults }) as any);\n resolveText(text);\n controller.close();\n } catch (error) {\n const text = chunks.join('');\n await options?.onFinish?.(createOnFinishResult({ text, runId, messageList, toolResults, error }) as any);\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 getMastraChunksFromACPUpdate(\n update: SessionUpdate,\n runId: string,\n toolNames: Map<string, string>,\n): ChunkType[] {\n switch (update.sessionUpdate) {\n case 'tool_call': {\n const toolName = getToolName(update, toolNames);\n toolNames.set(update.toolCallId, toolName);\n\n return [\n {\n type: 'tool-call',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n args: toRecord(update.rawInput),\n },\n },\n ];\n }\n case 'tool_call_update': {\n const toolName = getToolName(update, toolNames);\n\n if (update.status === 'completed' || update.status === 'failed') {\n return [\n {\n type: 'tool-result',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n result: update.rawOutput ?? update.content ?? { status: update.status, title: update.title },\n isError: update.status === 'failed',\n },\n },\n ];\n }\n\n return [\n {\n type: 'tool-call-delta',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n argsTextDelta: update.title ?? update.status ?? '',\n },\n },\n ];\n }\n default:\n return [];\n }\n}\n\nfunction getToolName(\n update: Extract<SessionUpdate, { sessionUpdate: 'tool_call' | 'tool_call_update' }>,\n toolNames: Map<string, string>,\n): string {\n return update.title ?? toolNames.get(update.toolCallId) ?? update.kind ?? 'acp_tool';\n}\n\nfunction toRecord(value: unknown): Record<string, unknown> {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n\n if (value === undefined) {\n return {};\n }\n\n return { input: value };\n}\n\nfunction createOnFinishResult({\n text,\n runId,\n messageList,\n toolResults,\n error,\n}: {\n text: string;\n runId: string;\n messageList: MessageList;\n toolResults: AcpToolResult[];\n error?: unknown;\n}) {\n const usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n\n return {\n text,\n finishReason: 'stop',\n usage,\n totalUsage: usage,\n warnings: [],\n response: {\n messages: messageList.get.response.aiV5.model(),\n },\n steps: [],\n toolResults,\n runId,\n ...(error === undefined ? {} : { error }),\n };\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: globalThis.crypto.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 { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nexport class ACPToolSession {\n private connection?: ACPConnection;\n\n constructor(private readonly options: CreateACPToolOptions) {}\n\n getConnection(workspace: CreateACPToolOptions['workspace']): ACPConnection {\n if (this.options.persistSession === false) {\n return this.createConnection(workspace);\n }\n\n this.connection ??= this.createConnection(workspace);\n return this.connection;\n }\n\n private createConnection(workspace: CreateACPToolOptions['workspace']): ACPConnection {\n return new ACPConnection({\n ...this.options,\n workspace: workspace ?? this.options.workspace,\n });\n }\n}\n","import { compileSchema } from '@internal/types-builder/compile-zod';\nimport { createTool } from '@mastra/core/tools';\nimport { z } from 'zod/v4';\n\nimport { ACPToolSession } from './session';\nimport type { CreateACPToolOptions } from './types';\n\nexport function createACPTool(options: CreateACPToolOptions) {\n const session = new ACPToolSession(options);\n\n return createTool({\n id: options.id,\n description: options.description,\n inputSchema: compileSchema(\n z.object({\n task: z.string().describe('The task to send to the ACP agent'),\n }),\n ),\n outputSchema: compileSchema(\n z.object({\n output: z.string().describe('The output of the ACP agent'),\n }),\n ),\n suspendSchema: compileSchema(\n 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 ),\n resumeSchema: compileSchema(\n 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 ),\n execute: async ({ task }, context) => {\n const workspace = await context?.mastra?.getWorkspace();\n const connection = session.getConnection(workspace);\n const output = await connection.prompt(task, context?.abortSignal);\n\n return { output };\n },\n });\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mastra/acp",
3
- "version": "0.4.1",
3
+ "version": "0.4.2",
4
4
  "description": "ACP package for Mastra",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -26,18 +26,18 @@
26
26
  "license": "Apache-2.0",
27
27
  "devDependencies": {
28
28
  "@types/node": "22.20.1",
29
- "@vitest/coverage-v8": "4.1.10",
30
- "@vitest/ui": "4.1.10",
29
+ "@vitest/coverage-v8": "4.1.11",
30
+ "@vitest/ui": "4.1.11",
31
31
  "eslint": "^10.7.0",
32
32
  "tsdown": "0.22.9",
33
33
  "tsx": "^4.23.1",
34
34
  "typescript": "^7.0.2",
35
- "vitest": "4.1.10",
36
- "zod": "^4.4.3",
37
- "@internal/ai-sdk-v5": "0.0.77",
38
- "@internal/types-builder": "0.0.105",
39
- "@internal/lint": "0.0.130",
40
- "@mastra/core": "1.64.0"
35
+ "vitest": "4.1.11",
36
+ "zod": "^4.6.4",
37
+ "@internal/ai-sdk-v5": "0.0.86",
38
+ "@internal/lint": "0.0.139",
39
+ "@internal/types-builder": "0.0.114",
40
+ "@mastra/core": "1.73.0"
41
41
  },
42
42
  "homepage": "https://mastra.ai",
43
43
  "repository": {