@mastra/acp 0.0.0 → 0.1.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,43 @@
1
+ # @mastra/acp
2
+
3
+ ## 0.1.0-alpha.0
4
+
5
+ ### Minor Changes
6
+
7
+ - You can now run ACP-compatible coding agents as Mastra tools or lightweight subagents. ACP agents support incremental response streaming and can be used anywhere Mastra accepts a `SubAgent`, including supervisor delegation and workflow steps. ([#16423](https://github.com/mastra-ai/mastra/pull/16423))
8
+
9
+ ```ts
10
+ import { createACPTool, AcpAgent } from '@mastra/acp';
11
+
12
+ export const codingTool = createACPTool({
13
+ id: 'coding-agent',
14
+ command: 'my-acp-agent',
15
+ });
16
+
17
+ export const codingAgent = new AcpAgent({
18
+ id: 'coding-agent',
19
+ command: 'my-acp-agent',
20
+ });
21
+ ```
22
+
23
+ You can also wire an `AcpAgent` into a supervisor or workflow as a `SubAgent`-compatible implementation:
24
+
25
+ ```ts
26
+ import { Agent } from '@mastra/core/agent';
27
+
28
+ export const supervisor = new Agent({
29
+ name: 'supervisor',
30
+ instructions: 'Delegate coding tasks to the ACP agent.',
31
+ model,
32
+ agents: {
33
+ codingAgent,
34
+ },
35
+ });
36
+ ```
37
+
38
+ Workflows and the Inngest workflow adapter now recognize `SubAgent`-compatible implementations when creating agent-backed workflow steps.
39
+
40
+ ### Patch Changes
41
+
42
+ - Updated dependencies [[`20787de`](https://github.com/mastra-ai/mastra/commit/20787de5965234a1af28fe35f49437c537dbfa0d), [`784ad98`](https://github.com/mastra-ai/mastra/commit/784ad989549de91dc5d33ab8ef36caa6f7dcd34e), [`0d53730`](https://github.com/mastra-ai/mastra/commit/0d53730c1ed87ef80c87caa5701c4170ea8028e6)]:
43
+ - @mastra/core@1.34.0-alpha.0
package/LICENSE.md ADDED
@@ -0,0 +1,30 @@
1
+ Portions of this software are licensed as follows:
2
+
3
+ - All content that resides under any directory named "ee/" within this
4
+ repository, including but not limited to:
5
+ - `packages/core/src/auth/ee/`
6
+ - `packages/server/src/server/auth/ee/`
7
+ is licensed under the license defined in `ee/LICENSE`.
8
+
9
+ - All third-party components incorporated into the Mastra Software are
10
+ licensed under the original license provided by the owner of the
11
+ applicable component.
12
+
13
+ - Content outside of the above-mentioned directories or restrictions is
14
+ available under the "Apache License 2.0" as defined below.
15
+
16
+ # Apache License 2.0
17
+
18
+ Copyright (c) 2025 Kepler Software, Inc.
19
+
20
+ Licensed under the Apache License, Version 2.0 (the "License");
21
+ you may not use this file except in compliance with the License.
22
+ You may obtain a copy of the License at
23
+
24
+ http://www.apache.org/licenses/LICENSE-2.0
25
+
26
+ Unless required by applicable law or agreed to in writing, software
27
+ distributed under the License is distributed on an "AS IS" BASIS,
28
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
29
+ See the License for the specific language governing permissions and
30
+ limitations under the License.
package/README.md ADDED
@@ -0,0 +1,152 @@
1
+ # @mastra/acp
2
+
3
+ `@mastra/acp` connects Mastra to coding agents that implement the Agent Client Protocol (ACP). Use it to run an ACP-compatible agent from a Mastra tool or as a Mastra sub-agent.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @mastra/acp
9
+ ```
10
+
11
+ ## Overview
12
+
13
+ The package exports:
14
+
15
+ - `createACPTool`: Creates a Mastra tool that sends a task to an ACP agent and returns the completed output.
16
+ - `AcpAgent`: Wraps an ACP agent as a Mastra sub-agent with `generate()` and `stream()` support.
17
+
18
+ Use `createACPTool` when the ACP agent should be callable as a tool. Use `AcpAgent` when the ACP agent should participate in Mastra agent delegation.
19
+
20
+ ## Create an ACP tool
21
+
22
+ The following example creates a tool that starts an ACP-compatible agent process and sends the provided task to it.
23
+
24
+ ```typescript
25
+ import { Agent } from '@mastra/core/agent';
26
+ import { createACPTool } from '@mastra/acp';
27
+
28
+ const codeAgentTool = createACPTool({
29
+ id: 'code-agent',
30
+ description: 'Use an ACP-compatible coding agent to make code changes',
31
+ command: 'acp-agent',
32
+ args: ['--stdio'],
33
+ cwd: process.cwd(),
34
+ });
35
+
36
+ export const agent = new Agent({
37
+ name: 'supervisor',
38
+ instructions: 'Use the code-agent tool when a task requires editing code.',
39
+ model,
40
+ tools: {
41
+ codeAgentTool,
42
+ },
43
+ });
44
+ ```
45
+
46
+ The tool accepts a `task` string and returns an `output` string.
47
+
48
+ ```typescript
49
+ const result = await codeAgentTool.execute({
50
+ context: {
51
+ task: 'Update the README with setup instructions.',
52
+ },
53
+ });
54
+
55
+ console.log(result.output);
56
+ ```
57
+
58
+ ## Use an ACP agent as a sub-agent
59
+
60
+ `AcpAgent` implements Mastra's `SubAgent` interface. Add it to another agent's `agents` configuration to let the supervisor delegate work to the ACP agent.
61
+
62
+ ```typescript
63
+ import { Agent } from '@mastra/core/agent';
64
+ import { AcpAgent } from '@mastra/acp';
65
+
66
+ const codeAgent = new AcpAgent({
67
+ id: 'code-agent',
68
+ name: 'Code agent',
69
+ description: 'An ACP-compatible coding agent that can inspect and edit files',
70
+ command: 'acp-agent',
71
+ args: ['--stdio'],
72
+ cwd: process.cwd(),
73
+ });
74
+
75
+ export const supervisor = new Agent({
76
+ name: 'supervisor',
77
+ instructions: 'Delegate code editing tasks to the code-agent sub-agent.',
78
+ model,
79
+ agents: {
80
+ codeAgent,
81
+ },
82
+ });
83
+ ```
84
+
85
+ `AcpAgent.generate()` buffers the ACP response and returns it as text. `AcpAgent.stream()` emits Mastra `text-delta` chunks as ACP `agent_message_chunk` updates arrive.
86
+
87
+ ## Configure permissions
88
+
89
+ ACP agents may request permission before running actions. By default, `@mastra/acp` selects the first permission option. Pass `onPermissionRequest` to handle permission requests yourself.
90
+
91
+ ```typescript
92
+ import { createACPTool } from '@mastra/acp';
93
+
94
+ const codeAgentTool = createACPTool({
95
+ id: 'code-agent',
96
+ description: 'Use an ACP-compatible coding agent',
97
+ command: 'acp-agent',
98
+ args: ['--stdio'],
99
+ async onPermissionRequest(request) {
100
+ const option = request.options.find(option => option.name === 'Allow');
101
+
102
+ if (!option) {
103
+ return { outcome: { outcome: 'cancelled' } };
104
+ }
105
+
106
+ return {
107
+ outcome: {
108
+ outcome: 'selected',
109
+ optionId: option.optionId,
110
+ },
111
+ };
112
+ },
113
+ });
114
+ ```
115
+
116
+ ## Session and workspace behavior
117
+
118
+ `createACPTool` and `AcpAgent` start the configured command on first use and create an ACP session. Sessions persist across calls by default. Set `persistSession: false` to stop the ACP process after each prompt.
119
+
120
+ ```typescript
121
+ const codeAgent = new AcpAgent({
122
+ id: 'code-agent',
123
+ description: 'Run one isolated ACP task',
124
+ command: 'acp-agent',
125
+ args: ['--stdio'],
126
+ cwd: process.cwd(),
127
+ persistSession: false,
128
+ });
129
+ ```
130
+
131
+ By default, the ACP workspace uses `cwd` as its filesystem root. Pass a Mastra `Workspace` with a custom filesystem when you need explicit workspace control.
132
+
133
+ ## Configuration
134
+
135
+ `createACPTool` and `AcpAgent` accept the same ACP connection options.
136
+
137
+ | Option | Type | Description |
138
+ | --------------------- | -------------------------------- | -------------------------------------------------------------------------------------- |
139
+ | `id` | `string` | Unique tool or sub-agent identifier. |
140
+ | `description` | `string` | Description shown to the model when it can call the tool or delegate to the sub-agent. |
141
+ | `command` | `string` | ACP agent executable to spawn. |
142
+ | `args` | `string[]` | Arguments passed to the ACP agent executable. |
143
+ | `env` | `Record<string, string>` | Environment variables to merge with the current process environment. |
144
+ | `cwd` | `string` | Working directory for the ACP process and default workspace. |
145
+ | `session` | `Partial<NewSessionRequest>` | ACP session creation options. |
146
+ | `initialize` | `Partial<InitializeRequest>` | ACP initialization options. |
147
+ | `authMethodId` | `string` | ACP authentication method ID to invoke after initialization. |
148
+ | `persistSession` | `boolean` | Keep the ACP process alive after execution. Defaults to `true`. |
149
+ | `onPermissionRequest` | `(request) => Promise<Response>` | Callback for ACP permission requests. |
150
+ | `workspace` | `Workspace` | Workspace used for ACP file reads and writes. |
151
+
152
+ `AcpAgent` also accepts `name` to set the display name used by Mastra agent delegation.
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,oBAAoB,EAEpB,kBAAkB,EAClB,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;AAG1D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAyBpD,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;gBAEjB,OAAO,EAAE,eAAe;IAOpC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAEvC,cAAc,IAAI,MAAM;IAIxB,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,UAAU,CAAC,CAAC;IAIlE,YAAY,IAAI,OAAO;IAIvB,WAAW,CAAC,OAAO,EAAE,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI;IAErD,SAAS,IAAI,SAAS;IAItB,eAAe,IAAI,MAAM;IAInB,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAmBrG,cAAc,IAAI,OAAO,CAAC,sBAAsB,CAAC;IAIjD,YAAY,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAI7C,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAwDrG,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,iBAAiB;CAM1B"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAIA,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;gBAEjB,OAAO,EAAE,eAAe;IAOpC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAEvC,cAAc,IAAI,MAAM;IAIxB,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,UAAU,CAAC,CAAC;IAIlE,YAAY,IAAI,OAAO;IAIvB,WAAW,CAAC,OAAO,EAAE,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI;IAErD,SAAS,IAAI,SAAS;IAItB,eAAe,IAAI,MAAM;IAInB,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAmBrG,cAAc,IAAI,OAAO,CAAC,sBAAsB,CAAC;IAIjD,YAAY,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAI7C,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAsErG,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,iBAAiB;CAM1B"}
@@ -1,4 +1,12 @@
1
+ import type { SessionUpdate } from '@agentclientprotocol/sdk';
1
2
  import type { CreateACPToolOptions } from './types.js';
3
+ export type ACPStreamEvent = {
4
+ type: 'text';
5
+ text: string;
6
+ } | {
7
+ type: 'session-update';
8
+ update: SessionUpdate;
9
+ };
2
10
  export declare class ACPConnection {
3
11
  readonly options: CreateACPToolOptions;
4
12
  private agentProcess?;
@@ -10,7 +18,7 @@ export declare class ACPConnection {
10
18
  constructor(options: CreateACPToolOptions);
11
19
  get sessionId(): string | undefined;
12
20
  prompt(task: string, signal?: AbortSignal): Promise<string>;
13
- promptStream(task: string, signal?: AbortSignal): AsyncGenerator<string>;
21
+ promptStream(task: string, signal?: AbortSignal): AsyncGenerator<ACPStreamEvent>;
14
22
  cancel(): Promise<void>;
15
23
  disconnect(): void;
16
24
  private ensureConnected;
@@ -1 +1 @@
1
- {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAuEpD,qBAAa,aAAa;IACxB,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC;IAEvC,OAAO,CAAC,YAAY,CAAC,CAAiC;IACtD,OAAO,CAAC,UAAU,CAAC,CAAuB;IAC1C,OAAO,CAAC,OAAO,CAAC,CAAqB;IACrC,OAAO,CAAC,iBAAiB,CAAC,CAAgB;IAC1C,OAAO,CAAC,aAAa,CAAC,CAAc;IACpC,OAAO,CAAC,MAAM,CAAM;gBAER,OAAO,EAAE,oBAAoB;IAIzC,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;IAEK,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAU1D,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC;IAiEzE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAU7B,UAAU,IAAI,IAAI;YAaJ,eAAe;YASf,UAAU;IA0CxB,OAAO,CAAC,oBAAoB;IAc5B,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,2BAA2B;IAQnC,OAAO,CAAC,UAAU;CAanB"}
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAYV,aAAa,EAGd,MAAM,0BAA0B,CAAC;AAGlC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAEpD,MAAM,MAAM,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,CAAC;AAuEhH,qBAAa,aAAa;IACxB,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC;IAEvC,OAAO,CAAC,YAAY,CAAC,CAAiC;IACtD,OAAO,CAAC,UAAU,CAAC,CAAuB;IAC1C,OAAO,CAAC,OAAO,CAAC,CAAqB;IACrC,OAAO,CAAC,iBAAiB,CAAC,CAAgB;IAC1C,OAAO,CAAC,aAAa,CAAC,CAAc;IACpC,OAAO,CAAC,MAAM,CAAM;gBAER,OAAO,EAAE,oBAAoB;IAIzC,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;IAEK,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAY1D,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC,cAAc,CAAC;IAgEjF,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAU7B,UAAU,IAAI,IAAI;YAaJ,eAAe;YASf,UAAU;IA0CxB,OAAO,CAAC,oBAAoB;IAc5B,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,2BAA2B;IAQnC,OAAO,CAAC,UAAU;CAanB"}
package/dist/index.cjs CHANGED
@@ -29,10 +29,11 @@ var ACPClient = class {
29
29
  }
30
30
  const update = notification.update;
31
31
  if (update.sessionUpdate === "agent_message_chunk") {
32
- const chunk = appendContentChunk(state.chunks, update);
33
- if (chunk) {
34
- state.onChunk?.(chunk);
32
+ if (update.content.type === "text") {
33
+ state.onEvent?.({ type: "text", text: update.content.text });
35
34
  }
35
+ } else {
36
+ state.onEvent?.({ type: "session-update", update });
36
37
  }
37
38
  }
38
39
  async requestPermission(request) {
@@ -79,11 +80,13 @@ var ACPConnection = class {
79
80
  return this.session?.sessionId;
80
81
  }
81
82
  async prompt(task, signal) {
82
- const chunks = [];
83
- for await (const chunk of this.promptStream(task, signal)) {
84
- chunks.push(chunk);
83
+ const parts = [];
84
+ for await (const event of this.promptStream(task, signal)) {
85
+ if (event.type === "text") {
86
+ parts.push(event.text);
87
+ }
85
88
  }
86
- return chunks.join("");
89
+ return parts.join("");
87
90
  }
88
91
  async *promptStream(task, signal) {
89
92
  await this.ensureConnected();
@@ -98,8 +101,7 @@ var ACPConnection = class {
98
101
  const queue = createAsyncQueue();
99
102
  const state = {
100
103
  sessionId,
101
- chunks: [],
102
- onChunk: (chunk) => queue.push(chunk)
104
+ onEvent: (event) => queue.push(event)
103
105
  };
104
106
  this.currentPrompt = state;
105
107
  const abortHandler = () => {
@@ -236,16 +238,6 @@ ACP agent stderr:
236
238
  ${stderr}` : String(error));
237
239
  }
238
240
  };
239
- function appendContentChunk(chunks, chunk) {
240
- return appendContentBlock(chunks, chunk.content);
241
- }
242
- function appendContentBlock(chunks, content) {
243
- if (content.type === "text") {
244
- chunks.push(content.text);
245
- return content.text;
246
- }
247
- return void 0;
248
- }
249
241
  function createAsyncQueue() {
250
242
  const values = [];
251
243
  const waiters = [];
@@ -386,25 +378,39 @@ var AcpAgent = class {
386
378
  start: async (controller) => {
387
379
  const textId = crypto.randomUUID();
388
380
  const chunks = [];
381
+ const toolNames = /* @__PURE__ */ new Map();
382
+ const toolResults = [];
389
383
  try {
390
384
  controller.enqueue({ type: "text-start", runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });
391
- for await (const chunk of this.connection.promptStream(prompt, signal)) {
392
- chunks.push(chunk);
393
- controller.enqueue({
394
- type: "text-delta",
395
- runId,
396
- from: CHUNK_FROM_AGENT,
397
- payload: { id: textId, text: chunk }
398
- });
385
+ for await (const event of this.connection.promptStream(prompt, signal)) {
386
+ if (event.type === "text") {
387
+ chunks.push(event.text);
388
+ controller.enqueue({
389
+ type: "text-delta",
390
+ runId,
391
+ from: CHUNK_FROM_AGENT,
392
+ payload: { id: textId, text: event.text }
393
+ });
394
+ } else if (event.type === "session-update") {
395
+ for (const chunk of getMastraChunksFromACPUpdate(event.update, runId, toolNames)) {
396
+ if (chunk.type === "tool-result") {
397
+ toolResults.push({ payload: chunk.payload });
398
+ }
399
+ controller.enqueue(chunk);
400
+ }
401
+ }
399
402
  }
400
403
  const text = chunks.join("");
401
404
  messageList$1.add([{ role: "assistant", content: text }], "response");
402
405
  controller.enqueue({ type: "text-end", runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });
403
406
  controller.enqueue(createFinishChunk("step-finish", runId));
404
407
  controller.enqueue(createFinishChunk("finish", runId));
408
+ await options?.onFinish?.(createOnFinishResult({ text, runId, messageList: messageList$1, toolResults }));
405
409
  resolveText(text);
406
410
  controller.close();
407
411
  } catch (error) {
412
+ const text = chunks.join("");
413
+ await options?.onFinish?.(createOnFinishResult({ text, runId, messageList: messageList$1, toolResults, error }));
408
414
  rejectText(error);
409
415
  controller.error(error);
410
416
  }
@@ -455,6 +461,93 @@ function extractInstructions(instructions) {
455
461
  }
456
462
  return messageList.coreContentToString(instructions.content);
457
463
  }
464
+ function getMastraChunksFromACPUpdate(update, runId, toolNames) {
465
+ switch (update.sessionUpdate) {
466
+ case "tool_call": {
467
+ const toolName = getToolName(update, toolNames);
468
+ toolNames.set(update.toolCallId, toolName);
469
+ return [
470
+ {
471
+ type: "tool-call",
472
+ runId,
473
+ from: CHUNK_FROM_AGENT,
474
+ payload: {
475
+ toolCallId: update.toolCallId,
476
+ toolName,
477
+ args: toRecord(update.rawInput)
478
+ }
479
+ }
480
+ ];
481
+ }
482
+ case "tool_call_update": {
483
+ const toolName = getToolName(update, toolNames);
484
+ if (update.status === "completed" || update.status === "failed") {
485
+ return [
486
+ {
487
+ type: "tool-result",
488
+ runId,
489
+ from: CHUNK_FROM_AGENT,
490
+ payload: {
491
+ toolCallId: update.toolCallId,
492
+ toolName,
493
+ result: update.rawOutput ?? update.content ?? { status: update.status, title: update.title },
494
+ isError: update.status === "failed"
495
+ }
496
+ }
497
+ ];
498
+ }
499
+ return [
500
+ {
501
+ type: "tool-call-delta",
502
+ runId,
503
+ from: CHUNK_FROM_AGENT,
504
+ payload: {
505
+ toolCallId: update.toolCallId,
506
+ toolName,
507
+ argsTextDelta: update.title ?? update.status ?? ""
508
+ }
509
+ }
510
+ ];
511
+ }
512
+ default:
513
+ return [];
514
+ }
515
+ }
516
+ function getToolName(update, toolNames) {
517
+ return update.title ?? toolNames.get(update.toolCallId) ?? update.kind ?? "acp_tool";
518
+ }
519
+ function toRecord(value) {
520
+ if (value && typeof value === "object" && !Array.isArray(value)) {
521
+ return value;
522
+ }
523
+ if (value === void 0) {
524
+ return {};
525
+ }
526
+ return { input: value };
527
+ }
528
+ function createOnFinishResult({
529
+ text,
530
+ runId,
531
+ messageList,
532
+ toolResults,
533
+ error
534
+ }) {
535
+ const usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };
536
+ return {
537
+ text,
538
+ finishReason: "stop",
539
+ usage,
540
+ totalUsage: usage,
541
+ warnings: [],
542
+ response: {
543
+ messages: messageList.get.response.aiV5.model()
544
+ },
545
+ steps: [],
546
+ toolResults,
547
+ runId,
548
+ ...error === void 0 ? {} : { error }
549
+ };
550
+ }
458
551
  function createFinishChunk(type, runId) {
459
552
  return {
460
553
  type,
@@ -518,7 +611,6 @@ function createACPTool(options) {
518
611
  });
519
612
  }
520
613
 
521
- exports.ACPConnection = ACPConnection;
522
614
  exports.AcpAgent = AcpAgent;
523
615
  exports.createACPTool = createACPTool;
524
616
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/connection.ts","../src/agent.ts","../src/tool.ts"],"names":["spawn","process","stream","ndJsonStream","Writable","Readable","workspace","Workspace","LocalFilesystem","ClientSideConnection","PROTOCOL_VERSION","ReadableStream","randomUUID","messageList","MessageList","coreContentToString","createTool","z"],"mappings":"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","file":"index.cjs","sourcesContent":["import { spawn } from 'node:child_process';\nimport type { ChildProcessWithoutNullStreams } from 'node:child_process';\nimport process from 'node:process';\nimport { Readable, Writable } from 'node:stream';\nimport { ClientSideConnection, ndJsonStream, PROTOCOL_VERSION } from '@agentclientprotocol/sdk';\nimport type {\n Client,\n ContentBlock,\n ContentChunk,\n InitializeRequest,\n NewSessionRequest,\n NewSessionResponse,\n PermissionOption,\n PromptResponse,\n ReadTextFileRequest,\n ReadTextFileResponse,\n RequestPermissionRequest,\n RequestPermissionResponse,\n SessionNotification,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from '@agentclientprotocol/sdk';\n\nimport { LocalFilesystem, Workspace } from '@mastra/core/workspace';\nimport type { CreateACPToolOptions } from './types';\n\ntype PromptState = {\n sessionId: string;\n chunks: string[];\n onChunk?: (chunk: string) => void;\n};\n\nclass ACPClient implements Client {\n constructor(\n private readonly getPromptState: () => PromptState | undefined,\n private readonly workspace: Workspace,\n private readonly onPermissionRequest?: CreateACPToolOptions['onPermissionRequest'],\n ) {}\n\n async sessionUpdate(notification: SessionNotification): Promise<void> {\n const state = this.getPromptState();\n\n if (!state || notification.sessionId !== state.sessionId) {\n return;\n }\n\n const update = notification.update;\n\n if (update.sessionUpdate === 'agent_message_chunk') {\n const chunk = appendContentChunk(state.chunks, update);\n if (chunk) {\n state.onChunk?.(chunk);\n }\n }\n }\n\n async requestPermission(request: RequestPermissionRequest): Promise<RequestPermissionResponse> {\n if (this.onPermissionRequest) {\n return this.onPermissionRequest(request);\n }\n\n const option = request.options[0];\n\n if (!option) {\n return { outcome: { outcome: 'cancelled' } };\n }\n\n return { outcome: selectedPermissionOutcome(option) };\n }\n\n async readTextFile(params: ReadTextFileRequest): Promise<ReadTextFileResponse> {\n let content = await this.workspace.filesystem?.readFile(params.path);\n\n if (!(typeof content === 'string')) {\n const decoder = new TextDecoder('utf-8');\n content = decoder.decode(content);\n }\n\n if (params.line != null || params.limit != null) {\n const lines = content.split('\\n');\n const start = (params.line ?? 1) - 1;\n const end = params.limit != null ? start + params.limit : lines.length;\n return { content: lines.slice(start, end).join('\\n') };\n }\n\n return { content };\n }\n\n async writeTextFile(params: WriteTextFileRequest): Promise<WriteTextFileResponse> {\n await this.workspace.filesystem?.writeFile(params.path, params.content);\n\n return {};\n }\n}\n\nexport class ACPConnection {\n readonly options: CreateACPToolOptions;\n\n private agentProcess?: ChildProcessWithoutNullStreams;\n private connection?: ClientSideConnection;\n private session?: NewSessionResponse;\n private initializePromise?: Promise<void>;\n private currentPrompt?: PromptState;\n private stderr = '';\n\n constructor(options: CreateACPToolOptions) {\n this.options = options;\n }\n\n get sessionId(): string | undefined {\n return this.session?.sessionId;\n }\n\n async prompt(task: string, signal?: AbortSignal): Promise<string> {\n const chunks: string[] = [];\n\n for await (const chunk of this.promptStream(task, signal)) {\n chunks.push(chunk);\n }\n\n return chunks.join('');\n }\n\n async *promptStream(task: string, signal?: AbortSignal): AsyncGenerator<string> {\n await this.ensureConnected();\n\n const sessionId = this.session?.sessionId;\n\n if (!this.connection || !sessionId) {\n throw new Error('ACP connection is not initialized');\n }\n\n if (signal?.aborted) {\n await this.cancel();\n throw signal.reason ?? new Error('ACP prompt aborted');\n }\n\n const queue = createAsyncQueue<string>();\n const state: PromptState = {\n sessionId,\n chunks: [],\n onChunk: chunk => queue.push(chunk),\n };\n this.currentPrompt = state;\n\n const abortHandler = () => {\n void this.cancel();\n queue.throw(signal?.reason ?? new Error('ACP prompt aborted'));\n };\n\n signal?.addEventListener('abort', abortHandler, { once: true });\n\n const responsePromise = this.connection\n .prompt({\n sessionId,\n prompt: [{ type: 'text', text: task }],\n })\n .then(\n response => {\n this.throwIfPromptDidNotComplete(response);\n queue.close();\n },\n error => {\n queue.throw(this.withStderr(error));\n },\n );\n\n try {\n for await (const chunk of queue) {\n yield chunk;\n }\n\n await responsePromise;\n } catch (error) {\n await responsePromise.catch(() => undefined);\n throw error;\n } finally {\n signal?.removeEventListener('abort', abortHandler);\n if (this.currentPrompt === state) {\n this.currentPrompt = undefined;\n }\n\n if (this.options.persistSession === false) {\n this.disconnect();\n }\n }\n }\n\n async cancel(): Promise<void> {\n const sessionId = this.session?.sessionId;\n\n if (!this.connection || !sessionId) {\n return;\n }\n\n await this.connection.cancel({ sessionId });\n }\n\n disconnect(): void {\n this.connection = undefined;\n this.session = undefined;\n this.initializePromise = undefined;\n this.currentPrompt = undefined;\n\n if (this.agentProcess && !this.agentProcess.killed) {\n this.agentProcess.kill();\n }\n\n this.agentProcess = undefined;\n }\n\n private async ensureConnected(): Promise<void> {\n if (this.connection && this.session) {\n return;\n }\n\n this.initializePromise ??= this.initialize();\n await this.initializePromise;\n }\n\n private async initialize(): Promise<void> {\n this.stderr = '';\n this.agentProcess = spawn(this.options.command, this.options.args ?? [], {\n cwd: this.options.cwd,\n env: { ...process.env, ...this.options.env },\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n this.agentProcess.stderr.on('data', chunk => {\n this.stderr += String(chunk);\n });\n\n const stream = ndJsonStream(\n Writable.toWeb(this.agentProcess.stdin) as WritableStream<Uint8Array>,\n Readable.toWeb(this.agentProcess.stdout) as ReadableStream<Uint8Array>,\n );\n\n const workspace =\n this.options.workspace ??\n new Workspace({\n filesystem: new LocalFilesystem({ basePath: this.options.cwd ?? process.cwd() }),\n });\n\n this.connection = new ClientSideConnection(\n () => new ACPClient(() => this.currentPrompt, workspace, this.options.onPermissionRequest),\n stream,\n );\n\n try {\n await this.connection.initialize(this.getInitializeRequest());\n\n if (this.options.authMethodId) {\n await this.connection.authenticate({ methodId: this.options.authMethodId });\n }\n\n this.session = await this.connection.newSession(this.getNewSessionRequest());\n } catch (error) {\n this.disconnect();\n throw this.withStderr(error);\n }\n }\n\n private getInitializeRequest(): InitializeRequest {\n return {\n protocolVersion: PROTOCOL_VERSION,\n clientCapabilities: {\n fs: { readTextFile: true, writeTextFile: true },\n },\n clientInfo: {\n name: '@mastra/acp',\n version: '0.1.0',\n },\n ...this.options.initialize,\n };\n }\n\n private getNewSessionRequest(): NewSessionRequest {\n return {\n cwd: this.options.cwd ?? process.cwd(),\n mcpServers: [],\n ...this.options.session,\n };\n }\n\n private throwIfPromptDidNotComplete(response: PromptResponse): void {\n if (response.stopReason === 'end_turn') {\n return;\n }\n\n throw new Error(`ACP prompt stopped before completing: ${response.stopReason}`);\n }\n\n private withStderr(error: unknown): Error {\n const stderr = this.stderr.trim();\n\n if (error instanceof Error) {\n if (stderr && !error.message.includes(stderr)) {\n error.message = `${error.message}\\n\\nACP agent stderr:\\n${stderr}`;\n }\n\n return error;\n }\n\n return new Error(stderr ? `${String(error)}\\n\\nACP agent stderr:\\n${stderr}` : String(error));\n }\n}\n\nfunction appendContentChunk(chunks: string[], chunk: ContentChunk): string | undefined {\n return appendContentBlock(chunks, chunk.content);\n}\n\nfunction appendContentBlock(chunks: string[], content: ContentBlock): string | undefined {\n if (content.type === 'text') {\n chunks.push(content.text);\n return content.text;\n }\n\n return undefined;\n}\n\ntype AsyncQueue<T> = AsyncIterable<T> & {\n close: () => void;\n push: (value: T) => void;\n throw: (error: unknown) => void;\n};\n\nfunction createAsyncQueue<T>(): AsyncQueue<T> {\n const values: T[] = [];\n const waiters: Array<{\n resolve: (value: IteratorResult<T>) => void;\n reject: (error: unknown) => void;\n }> = [];\n let closed = false;\n let error: unknown;\n\n const next = (): Promise<IteratorResult<T>> => {\n if (values.length > 0) {\n return Promise.resolve({ value: values.shift()!, done: false });\n }\n\n if (error) {\n return Promise.reject(error);\n }\n\n if (closed) {\n return Promise.resolve({ value: undefined, done: true });\n }\n\n return new Promise((resolve, reject) => {\n waiters.push({ resolve, reject });\n });\n };\n\n return {\n push(value) {\n const waiter = waiters.shift();\n if (waiter) {\n waiter.resolve({ value, done: false });\n return;\n }\n\n values.push(value);\n },\n close() {\n closed = true;\n for (const waiter of waiters.splice(0)) {\n waiter.resolve({ value: undefined, done: true });\n }\n },\n throw(queueError) {\n error = queueError;\n for (const waiter of waiters.splice(0)) {\n waiter.reject(queueError);\n }\n },\n [Symbol.asyncIterator]() {\n return { next };\n },\n };\n}\n\nfunction selectedPermissionOutcome(option: PermissionOption): RequestPermissionResponse['outcome'] {\n return { outcome: 'selected', optionId: option.optionId };\n}\n","import { randomUUID } from 'node:crypto';\nimport { ReadableStream } from 'node:stream/web';\n\nimport type {\n AgentGenerateOptions,\n AgentInstructions,\n AgentStreamOptions,\n SubAgent,\n SubAgentGenerateResult,\n SubAgentStreamResult,\n} from '@mastra/core/agent';\nimport { MessageList, coreContentToString } from '@mastra/core/agent/message-list';\nimport type { MessageListInput } from '@mastra/core/agent/message-list';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { ChunkType } from '@mastra/core/stream';\nimport type { DynamicArgument } from '@mastra/core/types';\n\nimport type { MastraLanguageModelV3 } from '../../core/dist/llm/model/shared.types';\nimport { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nconst CHUNK_FROM_AGENT = 'AGENT' as ChunkType['from'];\n\nconst model = {\n modelId: 'acp-agent',\n provider: '@mastra/acp',\n specificationVersion: 'v3',\n supportedUrls: {},\n doGenerate: async () => ({\n stream: new ReadableStream({\n start: async controller => {\n controller.close();\n },\n }),\n }),\n doStream: async () => ({\n stream: new ReadableStream({\n start: async controller => {\n controller.close();\n },\n }),\n }),\n} as const satisfies MastraLanguageModelV3;\n\nexport type AcpAgentOptions = CreateACPToolOptions & {\n name?: string;\n};\n\nexport class AcpAgent<\n TId extends string = string,\n TRequestContext extends Record<string, any> | unknown = unknown,\n> implements SubAgent<TId, TRequestContext> {\n readonly id: TId;\n readonly name: string;\n readonly connection: ACPConnection;\n readonly description: string;\n\n constructor(options: AcpAgentOptions) {\n this.id = options.id as TId;\n this.name = options.name ?? options.id;\n this.description = options.description;\n this.connection = new ACPConnection(options);\n }\n\n __registerMastra(_mastra: Mastra): void {}\n\n getDescription(): string {\n return this.description;\n }\n\n getModel(): ReturnType<SubAgent<TId, TRequestContext>['getModel']> {\n return model;\n }\n\n hasOwnMemory(): boolean {\n return false;\n }\n\n __setMemory(_memory: DynamicArgument<any, any>): void {}\n\n getMemory(): undefined {\n return undefined;\n }\n\n getInstructions(): string {\n return '';\n }\n\n async generate(messages: MessageListInput, options?: AgentGenerateOptions): Promise<SubAgentGenerateResult> {\n const prompt = this.getPrompt(messages, options?.instructions);\n const text = await this.connection.prompt(\n prompt,\n (options as { abortSignal?: AbortSignal } | undefined)?.abortSignal,\n );\n const messageList = this.createMessageList(messages, text);\n\n return {\n text,\n response: {\n dbMessages: messageList.get.response.db(),\n },\n toolResults: [],\n finishReason: 'stop',\n runId: options?.runId ?? randomUUID(),\n };\n }\n\n async resumeGenerate(): Promise<SubAgentGenerateResult> {\n throw new Error('AcpAgent does not support resuming suspended generate calls');\n }\n\n async resumeStream(): Promise<SubAgentStreamResult> {\n throw new Error('AcpAgent does not support resuming suspended stream calls');\n }\n\n async stream(messages: MessageListInput, options?: AgentStreamOptions): Promise<SubAgentStreamResult> {\n const runId = options?.runId ?? randomUUID();\n const prompt = this.getPrompt(messages, options?.instructions);\n const signal = (options as { abortSignal?: AbortSignal } | undefined)?.abortSignal;\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n\n let resolveText!: (text: string) => void;\n let rejectText!: (error: unknown) => void;\n const textPromise = new Promise<string>((resolve, reject) => {\n resolveText = resolve;\n rejectText = reject;\n });\n\n const fullStream = new ReadableStream<ChunkType>({\n start: async controller => {\n const textId = randomUUID();\n const chunks: string[] = [];\n\n try {\n controller.enqueue({ type: 'text-start', runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });\n\n for await (const chunk of this.connection.promptStream(prompt, signal)) {\n chunks.push(chunk);\n controller.enqueue({\n type: 'text-delta',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: { id: textId, text: chunk },\n });\n }\n\n const text = chunks.join('');\n messageList.add([{ role: 'assistant', content: text }], 'response');\n\n controller.enqueue({ type: 'text-end', runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });\n controller.enqueue(createFinishChunk('step-finish', runId));\n controller.enqueue(createFinishChunk('finish', runId));\n resolveText(text);\n controller.close();\n } catch (error) {\n rejectText(error);\n controller.error(error);\n }\n },\n });\n\n return {\n fullStream,\n text: textPromise,\n messageList,\n toolResults: [],\n runId,\n };\n }\n\n private getPrompt(messages: MessageListInput, instructions?: AgentInstructions): string {\n const prompt = extractText(messages);\n const instructionText = instructions ? extractInstructions(instructions) : '';\n\n if (!instructionText) {\n return prompt;\n }\n\n return `${instructionText}\\n\\n${prompt}`;\n }\n\n private createMessageList(messages: MessageListInput, text: string): MessageList {\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n messageList.add([{ role: 'assistant', content: text }], 'response');\n return messageList;\n }\n}\n\nfunction extractText(messages: MessageListInput): string {\n if (typeof messages === 'string') {\n return messages;\n }\n\n if (Array.isArray(messages) && messages.every(message => typeof message === 'string')) {\n return messages.join('\\n');\n }\n\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n\n return messageList.get.all\n .core()\n .map(message => coreContentToString(message.content))\n .filter(Boolean)\n .join('\\n');\n}\n\nfunction extractInstructions(instructions: AgentInstructions): string {\n if (typeof instructions === 'string') {\n return instructions;\n }\n\n if (Array.isArray(instructions)) {\n return instructions.map(instruction => extractInstructions(instruction)).join('\\n');\n }\n\n return coreContentToString(instructions.content);\n}\n\nfunction createFinishChunk(type: 'step-finish' | 'finish', runId: string): ChunkType {\n return {\n type,\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n id: randomUUID(),\n output: {\n steps: [],\n usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n },\n stepResult: {\n reason: 'stop',\n warnings: [],\n isContinued: false,\n },\n metadata: {},\n messages: { nonUser: [], all: [] },\n },\n } as unknown as ChunkType;\n}\n","import { createTool } from '@mastra/core/tools';\nimport { z } from 'zod';\n\nimport { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nexport function createACPTool(options: CreateACPToolOptions) {\n return createTool({\n id: options.id,\n description: options.description,\n inputSchema: z.object({\n task: z.string().describe('The task to send to the ACP agent'),\n }),\n outputSchema: z.object({\n output: z.string().describe('The output of the ACP agent'),\n }),\n suspendSchema: z.object({\n permissionRequest: z.object({\n title: z.string().describe('The title of the permission request'),\n options: z.array(\n z.object({\n optionId: z.string().describe('The option id to select'),\n name: z.string().describe('The title of the permission request'),\n }),\n ),\n }),\n }),\n resumeSchema: z.union([\n z.object({\n optionId: z.string().optional().describe('The option id to select'),\n outcome: z.literal('selected').optional().describe('The outcome of the permission request'),\n }),\n z.object({\n outcome: z.literal('cancelled').optional().describe('The outcome of the permission request'),\n }),\n ]),\n execute: async ({ task }, context) => {\n const workspace = await context?.mastra?.getWorkspace();\n const connection = new ACPConnection({\n ...options,\n workspace,\n });\n\n const output = await connection.prompt(task, context?.abortSignal);\n\n return { output };\n },\n });\n}\n"]}
1
+ {"version":3,"sources":["../src/connection.ts","../src/agent.ts","../src/tool.ts"],"names":["spawn","process","stream","ndJsonStream","Writable","Readable","workspace","Workspace","LocalFilesystem","ClientSideConnection","PROTOCOL_VERSION","ReadableStream","randomUUID","messageList","MessageList","coreContentToString","createTool","z"],"mappings":"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","file":"index.cjs","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 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 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 this.agentProcess.stderr.on('data', chunk => {\n this.stderr += String(chunk);\n });\n\n const stream = ndJsonStream(\n Writable.toWeb(this.agentProcess.stdin) as WritableStream<Uint8Array>,\n Readable.toWeb(this.agentProcess.stdout) as ReadableStream<Uint8Array>,\n );\n\n const workspace =\n this.options.workspace ??\n new Workspace({\n filesystem: new LocalFilesystem({ basePath: this.options.cwd ?? process.cwd() }),\n });\n\n this.connection = new ClientSideConnection(\n () => new ACPClient(() => this.currentPrompt, workspace, this.options.onPermissionRequest),\n stream,\n );\n\n try {\n await this.connection.initialize(this.getInitializeRequest());\n\n if (this.options.authMethodId) {\n await this.connection.authenticate({ methodId: this.options.authMethodId });\n }\n\n this.session = await this.connection.newSession(this.getNewSessionRequest());\n } catch (error) {\n this.disconnect();\n throw this.withStderr(error);\n }\n }\n\n private getInitializeRequest(): InitializeRequest {\n return {\n protocolVersion: PROTOCOL_VERSION,\n clientCapabilities: {\n fs: { readTextFile: true, writeTextFile: true },\n },\n clientInfo: {\n name: '@mastra/acp',\n version: '0.1.0',\n },\n ...this.options.initialize,\n };\n }\n\n private getNewSessionRequest(): NewSessionRequest {\n return {\n cwd: this.options.cwd ?? process.cwd(),\n mcpServers: [],\n ...this.options.session,\n };\n }\n\n private throwIfPromptDidNotComplete(response: PromptResponse): void {\n if (response.stopReason === 'end_turn') {\n return;\n }\n\n throw new Error(`ACP prompt stopped before completing: ${response.stopReason}`);\n }\n\n private withStderr(error: unknown): Error {\n const stderr = this.stderr.trim();\n\n if (error instanceof Error) {\n if (stderr && !error.message.includes(stderr)) {\n error.message = `${error.message}\\n\\nACP agent stderr:\\n${stderr}`;\n }\n\n return error;\n }\n\n return new Error(stderr ? `${String(error)}\\n\\nACP agent stderr:\\n${stderr}` : String(error));\n }\n}\n\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 { 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 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 { createTool } from '@mastra/core/tools';\nimport { z } from 'zod';\n\nimport { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nexport function createACPTool(options: CreateACPToolOptions) {\n return createTool({\n id: options.id,\n description: options.description,\n inputSchema: z.object({\n task: z.string().describe('The task to send to the ACP agent'),\n }),\n outputSchema: z.object({\n output: z.string().describe('The output of the ACP agent'),\n }),\n suspendSchema: z.object({\n permissionRequest: z.object({\n title: z.string().describe('The title of the permission request'),\n options: z.array(\n z.object({\n optionId: z.string().describe('The option id to select'),\n name: z.string().describe('The title of the permission request'),\n }),\n ),\n }),\n }),\n resumeSchema: z.union([\n z.object({\n optionId: z.string().optional().describe('The option id to select'),\n outcome: z.literal('selected').optional().describe('The outcome of the permission request'),\n }),\n z.object({\n outcome: z.literal('cancelled').optional().describe('The outcome of the permission request'),\n }),\n ]),\n execute: async ({ task }, context) => {\n const workspace = await context?.mastra?.getWorkspace();\n const connection = new ACPConnection({\n ...options,\n workspace,\n });\n\n const output = await connection.prompt(task, context?.abortSignal);\n\n return { output };\n },\n });\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  export { AcpAgent } from './agent.js';
2
- export { ACPConnection } from './connection.js';
3
2
  export { createACPTool } from './tool.js';
4
3
  export type { AcpAgentOptions } from './agent.js';
5
4
  export type { ACPToolInput, ACPToolOutput, CreateACPToolOptions } from './types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -23,10 +23,11 @@ var ACPClient = class {
23
23
  }
24
24
  const update = notification.update;
25
25
  if (update.sessionUpdate === "agent_message_chunk") {
26
- const chunk = appendContentChunk(state.chunks, update);
27
- if (chunk) {
28
- state.onChunk?.(chunk);
26
+ if (update.content.type === "text") {
27
+ state.onEvent?.({ type: "text", text: update.content.text });
29
28
  }
29
+ } else {
30
+ state.onEvent?.({ type: "session-update", update });
30
31
  }
31
32
  }
32
33
  async requestPermission(request) {
@@ -73,11 +74,13 @@ var ACPConnection = class {
73
74
  return this.session?.sessionId;
74
75
  }
75
76
  async prompt(task, signal) {
76
- const chunks = [];
77
- for await (const chunk of this.promptStream(task, signal)) {
78
- chunks.push(chunk);
77
+ const parts = [];
78
+ for await (const event of this.promptStream(task, signal)) {
79
+ if (event.type === "text") {
80
+ parts.push(event.text);
81
+ }
79
82
  }
80
- return chunks.join("");
83
+ return parts.join("");
81
84
  }
82
85
  async *promptStream(task, signal) {
83
86
  await this.ensureConnected();
@@ -92,8 +95,7 @@ var ACPConnection = class {
92
95
  const queue = createAsyncQueue();
93
96
  const state = {
94
97
  sessionId,
95
- chunks: [],
96
- onChunk: (chunk) => queue.push(chunk)
98
+ onEvent: (event) => queue.push(event)
97
99
  };
98
100
  this.currentPrompt = state;
99
101
  const abortHandler = () => {
@@ -230,16 +232,6 @@ ACP agent stderr:
230
232
  ${stderr}` : String(error));
231
233
  }
232
234
  };
233
- function appendContentChunk(chunks, chunk) {
234
- return appendContentBlock(chunks, chunk.content);
235
- }
236
- function appendContentBlock(chunks, content) {
237
- if (content.type === "text") {
238
- chunks.push(content.text);
239
- return content.text;
240
- }
241
- return void 0;
242
- }
243
235
  function createAsyncQueue() {
244
236
  const values = [];
245
237
  const waiters = [];
@@ -380,25 +372,39 @@ var AcpAgent = class {
380
372
  start: async (controller) => {
381
373
  const textId = randomUUID();
382
374
  const chunks = [];
375
+ const toolNames = /* @__PURE__ */ new Map();
376
+ const toolResults = [];
383
377
  try {
384
378
  controller.enqueue({ type: "text-start", runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });
385
- for await (const chunk of this.connection.promptStream(prompt, signal)) {
386
- chunks.push(chunk);
387
- controller.enqueue({
388
- type: "text-delta",
389
- runId,
390
- from: CHUNK_FROM_AGENT,
391
- payload: { id: textId, text: chunk }
392
- });
379
+ for await (const event of this.connection.promptStream(prompt, signal)) {
380
+ if (event.type === "text") {
381
+ chunks.push(event.text);
382
+ controller.enqueue({
383
+ type: "text-delta",
384
+ runId,
385
+ from: CHUNK_FROM_AGENT,
386
+ payload: { id: textId, text: event.text }
387
+ });
388
+ } else if (event.type === "session-update") {
389
+ for (const chunk of getMastraChunksFromACPUpdate(event.update, runId, toolNames)) {
390
+ if (chunk.type === "tool-result") {
391
+ toolResults.push({ payload: chunk.payload });
392
+ }
393
+ controller.enqueue(chunk);
394
+ }
395
+ }
393
396
  }
394
397
  const text = chunks.join("");
395
398
  messageList.add([{ role: "assistant", content: text }], "response");
396
399
  controller.enqueue({ type: "text-end", runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });
397
400
  controller.enqueue(createFinishChunk("step-finish", runId));
398
401
  controller.enqueue(createFinishChunk("finish", runId));
402
+ await options?.onFinish?.(createOnFinishResult({ text, runId, messageList, toolResults }));
399
403
  resolveText(text);
400
404
  controller.close();
401
405
  } catch (error) {
406
+ const text = chunks.join("");
407
+ await options?.onFinish?.(createOnFinishResult({ text, runId, messageList, toolResults, error }));
402
408
  rejectText(error);
403
409
  controller.error(error);
404
410
  }
@@ -449,6 +455,93 @@ function extractInstructions(instructions) {
449
455
  }
450
456
  return coreContentToString(instructions.content);
451
457
  }
458
+ function getMastraChunksFromACPUpdate(update, runId, toolNames) {
459
+ switch (update.sessionUpdate) {
460
+ case "tool_call": {
461
+ const toolName = getToolName(update, toolNames);
462
+ toolNames.set(update.toolCallId, toolName);
463
+ return [
464
+ {
465
+ type: "tool-call",
466
+ runId,
467
+ from: CHUNK_FROM_AGENT,
468
+ payload: {
469
+ toolCallId: update.toolCallId,
470
+ toolName,
471
+ args: toRecord(update.rawInput)
472
+ }
473
+ }
474
+ ];
475
+ }
476
+ case "tool_call_update": {
477
+ const toolName = getToolName(update, toolNames);
478
+ if (update.status === "completed" || update.status === "failed") {
479
+ return [
480
+ {
481
+ type: "tool-result",
482
+ runId,
483
+ from: CHUNK_FROM_AGENT,
484
+ payload: {
485
+ toolCallId: update.toolCallId,
486
+ toolName,
487
+ result: update.rawOutput ?? update.content ?? { status: update.status, title: update.title },
488
+ isError: update.status === "failed"
489
+ }
490
+ }
491
+ ];
492
+ }
493
+ return [
494
+ {
495
+ type: "tool-call-delta",
496
+ runId,
497
+ from: CHUNK_FROM_AGENT,
498
+ payload: {
499
+ toolCallId: update.toolCallId,
500
+ toolName,
501
+ argsTextDelta: update.title ?? update.status ?? ""
502
+ }
503
+ }
504
+ ];
505
+ }
506
+ default:
507
+ return [];
508
+ }
509
+ }
510
+ function getToolName(update, toolNames) {
511
+ return update.title ?? toolNames.get(update.toolCallId) ?? update.kind ?? "acp_tool";
512
+ }
513
+ function toRecord(value) {
514
+ if (value && typeof value === "object" && !Array.isArray(value)) {
515
+ return value;
516
+ }
517
+ if (value === void 0) {
518
+ return {};
519
+ }
520
+ return { input: value };
521
+ }
522
+ function createOnFinishResult({
523
+ text,
524
+ runId,
525
+ messageList,
526
+ toolResults,
527
+ error
528
+ }) {
529
+ const usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };
530
+ return {
531
+ text,
532
+ finishReason: "stop",
533
+ usage,
534
+ totalUsage: usage,
535
+ warnings: [],
536
+ response: {
537
+ messages: messageList.get.response.aiV5.model()
538
+ },
539
+ steps: [],
540
+ toolResults,
541
+ runId,
542
+ ...error === void 0 ? {} : { error }
543
+ };
544
+ }
452
545
  function createFinishChunk(type, runId) {
453
546
  return {
454
547
  type,
@@ -512,6 +605,6 @@ function createACPTool(options) {
512
605
  });
513
606
  }
514
607
 
515
- export { ACPConnection, AcpAgent, createACPTool };
608
+ export { AcpAgent, createACPTool };
516
609
  //# sourceMappingURL=index.js.map
517
610
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/connection.ts","../src/agent.ts","../src/tool.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { spawn } from 'node:child_process';\nimport type { ChildProcessWithoutNullStreams } from 'node:child_process';\nimport process from 'node:process';\nimport { Readable, Writable } from 'node:stream';\nimport { ClientSideConnection, ndJsonStream, PROTOCOL_VERSION } from '@agentclientprotocol/sdk';\nimport type {\n Client,\n ContentBlock,\n ContentChunk,\n InitializeRequest,\n NewSessionRequest,\n NewSessionResponse,\n PermissionOption,\n PromptResponse,\n ReadTextFileRequest,\n ReadTextFileResponse,\n RequestPermissionRequest,\n RequestPermissionResponse,\n SessionNotification,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from '@agentclientprotocol/sdk';\n\nimport { LocalFilesystem, Workspace } from '@mastra/core/workspace';\nimport type { CreateACPToolOptions } from './types';\n\ntype PromptState = {\n sessionId: string;\n chunks: string[];\n onChunk?: (chunk: string) => void;\n};\n\nclass ACPClient implements Client {\n constructor(\n private readonly getPromptState: () => PromptState | undefined,\n private readonly workspace: Workspace,\n private readonly onPermissionRequest?: CreateACPToolOptions['onPermissionRequest'],\n ) {}\n\n async sessionUpdate(notification: SessionNotification): Promise<void> {\n const state = this.getPromptState();\n\n if (!state || notification.sessionId !== state.sessionId) {\n return;\n }\n\n const update = notification.update;\n\n if (update.sessionUpdate === 'agent_message_chunk') {\n const chunk = appendContentChunk(state.chunks, update);\n if (chunk) {\n state.onChunk?.(chunk);\n }\n }\n }\n\n async requestPermission(request: RequestPermissionRequest): Promise<RequestPermissionResponse> {\n if (this.onPermissionRequest) {\n return this.onPermissionRequest(request);\n }\n\n const option = request.options[0];\n\n if (!option) {\n return { outcome: { outcome: 'cancelled' } };\n }\n\n return { outcome: selectedPermissionOutcome(option) };\n }\n\n async readTextFile(params: ReadTextFileRequest): Promise<ReadTextFileResponse> {\n let content = await this.workspace.filesystem?.readFile(params.path);\n\n if (!(typeof content === 'string')) {\n const decoder = new TextDecoder('utf-8');\n content = decoder.decode(content);\n }\n\n if (params.line != null || params.limit != null) {\n const lines = content.split('\\n');\n const start = (params.line ?? 1) - 1;\n const end = params.limit != null ? start + params.limit : lines.length;\n return { content: lines.slice(start, end).join('\\n') };\n }\n\n return { content };\n }\n\n async writeTextFile(params: WriteTextFileRequest): Promise<WriteTextFileResponse> {\n await this.workspace.filesystem?.writeFile(params.path, params.content);\n\n return {};\n }\n}\n\nexport class ACPConnection {\n readonly options: CreateACPToolOptions;\n\n private agentProcess?: ChildProcessWithoutNullStreams;\n private connection?: ClientSideConnection;\n private session?: NewSessionResponse;\n private initializePromise?: Promise<void>;\n private currentPrompt?: PromptState;\n private stderr = '';\n\n constructor(options: CreateACPToolOptions) {\n this.options = options;\n }\n\n get sessionId(): string | undefined {\n return this.session?.sessionId;\n }\n\n async prompt(task: string, signal?: AbortSignal): Promise<string> {\n const chunks: string[] = [];\n\n for await (const chunk of this.promptStream(task, signal)) {\n chunks.push(chunk);\n }\n\n return chunks.join('');\n }\n\n async *promptStream(task: string, signal?: AbortSignal): AsyncGenerator<string> {\n await this.ensureConnected();\n\n const sessionId = this.session?.sessionId;\n\n if (!this.connection || !sessionId) {\n throw new Error('ACP connection is not initialized');\n }\n\n if (signal?.aborted) {\n await this.cancel();\n throw signal.reason ?? new Error('ACP prompt aborted');\n }\n\n const queue = createAsyncQueue<string>();\n const state: PromptState = {\n sessionId,\n chunks: [],\n onChunk: chunk => queue.push(chunk),\n };\n this.currentPrompt = state;\n\n const abortHandler = () => {\n void this.cancel();\n queue.throw(signal?.reason ?? new Error('ACP prompt aborted'));\n };\n\n signal?.addEventListener('abort', abortHandler, { once: true });\n\n const responsePromise = this.connection\n .prompt({\n sessionId,\n prompt: [{ type: 'text', text: task }],\n })\n .then(\n response => {\n this.throwIfPromptDidNotComplete(response);\n queue.close();\n },\n error => {\n queue.throw(this.withStderr(error));\n },\n );\n\n try {\n for await (const chunk of queue) {\n yield chunk;\n }\n\n await responsePromise;\n } catch (error) {\n await responsePromise.catch(() => undefined);\n throw error;\n } finally {\n signal?.removeEventListener('abort', abortHandler);\n if (this.currentPrompt === state) {\n this.currentPrompt = undefined;\n }\n\n if (this.options.persistSession === false) {\n this.disconnect();\n }\n }\n }\n\n async cancel(): Promise<void> {\n const sessionId = this.session?.sessionId;\n\n if (!this.connection || !sessionId) {\n return;\n }\n\n await this.connection.cancel({ sessionId });\n }\n\n disconnect(): void {\n this.connection = undefined;\n this.session = undefined;\n this.initializePromise = undefined;\n this.currentPrompt = undefined;\n\n if (this.agentProcess && !this.agentProcess.killed) {\n this.agentProcess.kill();\n }\n\n this.agentProcess = undefined;\n }\n\n private async ensureConnected(): Promise<void> {\n if (this.connection && this.session) {\n return;\n }\n\n this.initializePromise ??= this.initialize();\n await this.initializePromise;\n }\n\n private async initialize(): Promise<void> {\n this.stderr = '';\n this.agentProcess = spawn(this.options.command, this.options.args ?? [], {\n cwd: this.options.cwd,\n env: { ...process.env, ...this.options.env },\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n this.agentProcess.stderr.on('data', chunk => {\n this.stderr += String(chunk);\n });\n\n const stream = ndJsonStream(\n Writable.toWeb(this.agentProcess.stdin) as WritableStream<Uint8Array>,\n Readable.toWeb(this.agentProcess.stdout) as ReadableStream<Uint8Array>,\n );\n\n const workspace =\n this.options.workspace ??\n new Workspace({\n filesystem: new LocalFilesystem({ basePath: this.options.cwd ?? process.cwd() }),\n });\n\n this.connection = new ClientSideConnection(\n () => new ACPClient(() => this.currentPrompt, workspace, this.options.onPermissionRequest),\n stream,\n );\n\n try {\n await this.connection.initialize(this.getInitializeRequest());\n\n if (this.options.authMethodId) {\n await this.connection.authenticate({ methodId: this.options.authMethodId });\n }\n\n this.session = await this.connection.newSession(this.getNewSessionRequest());\n } catch (error) {\n this.disconnect();\n throw this.withStderr(error);\n }\n }\n\n private getInitializeRequest(): InitializeRequest {\n return {\n protocolVersion: PROTOCOL_VERSION,\n clientCapabilities: {\n fs: { readTextFile: true, writeTextFile: true },\n },\n clientInfo: {\n name: '@mastra/acp',\n version: '0.1.0',\n },\n ...this.options.initialize,\n };\n }\n\n private getNewSessionRequest(): NewSessionRequest {\n return {\n cwd: this.options.cwd ?? process.cwd(),\n mcpServers: [],\n ...this.options.session,\n };\n }\n\n private throwIfPromptDidNotComplete(response: PromptResponse): void {\n if (response.stopReason === 'end_turn') {\n return;\n }\n\n throw new Error(`ACP prompt stopped before completing: ${response.stopReason}`);\n }\n\n private withStderr(error: unknown): Error {\n const stderr = this.stderr.trim();\n\n if (error instanceof Error) {\n if (stderr && !error.message.includes(stderr)) {\n error.message = `${error.message}\\n\\nACP agent stderr:\\n${stderr}`;\n }\n\n return error;\n }\n\n return new Error(stderr ? `${String(error)}\\n\\nACP agent stderr:\\n${stderr}` : String(error));\n }\n}\n\nfunction appendContentChunk(chunks: string[], chunk: ContentChunk): string | undefined {\n return appendContentBlock(chunks, chunk.content);\n}\n\nfunction appendContentBlock(chunks: string[], content: ContentBlock): string | undefined {\n if (content.type === 'text') {\n chunks.push(content.text);\n return content.text;\n }\n\n return undefined;\n}\n\ntype AsyncQueue<T> = AsyncIterable<T> & {\n close: () => void;\n push: (value: T) => void;\n throw: (error: unknown) => void;\n};\n\nfunction createAsyncQueue<T>(): AsyncQueue<T> {\n const values: T[] = [];\n const waiters: Array<{\n resolve: (value: IteratorResult<T>) => void;\n reject: (error: unknown) => void;\n }> = [];\n let closed = false;\n let error: unknown;\n\n const next = (): Promise<IteratorResult<T>> => {\n if (values.length > 0) {\n return Promise.resolve({ value: values.shift()!, done: false });\n }\n\n if (error) {\n return Promise.reject(error);\n }\n\n if (closed) {\n return Promise.resolve({ value: undefined, done: true });\n }\n\n return new Promise((resolve, reject) => {\n waiters.push({ resolve, reject });\n });\n };\n\n return {\n push(value) {\n const waiter = waiters.shift();\n if (waiter) {\n waiter.resolve({ value, done: false });\n return;\n }\n\n values.push(value);\n },\n close() {\n closed = true;\n for (const waiter of waiters.splice(0)) {\n waiter.resolve({ value: undefined, done: true });\n }\n },\n throw(queueError) {\n error = queueError;\n for (const waiter of waiters.splice(0)) {\n waiter.reject(queueError);\n }\n },\n [Symbol.asyncIterator]() {\n return { next };\n },\n };\n}\n\nfunction selectedPermissionOutcome(option: PermissionOption): RequestPermissionResponse['outcome'] {\n return { outcome: 'selected', optionId: option.optionId };\n}\n","import { randomUUID } from 'node:crypto';\nimport { ReadableStream } from 'node:stream/web';\n\nimport type {\n AgentGenerateOptions,\n AgentInstructions,\n AgentStreamOptions,\n SubAgent,\n SubAgentGenerateResult,\n SubAgentStreamResult,\n} from '@mastra/core/agent';\nimport { MessageList, coreContentToString } from '@mastra/core/agent/message-list';\nimport type { MessageListInput } from '@mastra/core/agent/message-list';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { ChunkType } from '@mastra/core/stream';\nimport type { DynamicArgument } from '@mastra/core/types';\n\nimport type { MastraLanguageModelV3 } from '../../core/dist/llm/model/shared.types';\nimport { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nconst CHUNK_FROM_AGENT = 'AGENT' as ChunkType['from'];\n\nconst model = {\n modelId: 'acp-agent',\n provider: '@mastra/acp',\n specificationVersion: 'v3',\n supportedUrls: {},\n doGenerate: async () => ({\n stream: new ReadableStream({\n start: async controller => {\n controller.close();\n },\n }),\n }),\n doStream: async () => ({\n stream: new ReadableStream({\n start: async controller => {\n controller.close();\n },\n }),\n }),\n} as const satisfies MastraLanguageModelV3;\n\nexport type AcpAgentOptions = CreateACPToolOptions & {\n name?: string;\n};\n\nexport class AcpAgent<\n TId extends string = string,\n TRequestContext extends Record<string, any> | unknown = unknown,\n> implements SubAgent<TId, TRequestContext> {\n readonly id: TId;\n readonly name: string;\n readonly connection: ACPConnection;\n readonly description: string;\n\n constructor(options: AcpAgentOptions) {\n this.id = options.id as TId;\n this.name = options.name ?? options.id;\n this.description = options.description;\n this.connection = new ACPConnection(options);\n }\n\n __registerMastra(_mastra: Mastra): void {}\n\n getDescription(): string {\n return this.description;\n }\n\n getModel(): ReturnType<SubAgent<TId, TRequestContext>['getModel']> {\n return model;\n }\n\n hasOwnMemory(): boolean {\n return false;\n }\n\n __setMemory(_memory: DynamicArgument<any, any>): void {}\n\n getMemory(): undefined {\n return undefined;\n }\n\n getInstructions(): string {\n return '';\n }\n\n async generate(messages: MessageListInput, options?: AgentGenerateOptions): Promise<SubAgentGenerateResult> {\n const prompt = this.getPrompt(messages, options?.instructions);\n const text = await this.connection.prompt(\n prompt,\n (options as { abortSignal?: AbortSignal } | undefined)?.abortSignal,\n );\n const messageList = this.createMessageList(messages, text);\n\n return {\n text,\n response: {\n dbMessages: messageList.get.response.db(),\n },\n toolResults: [],\n finishReason: 'stop',\n runId: options?.runId ?? randomUUID(),\n };\n }\n\n async resumeGenerate(): Promise<SubAgentGenerateResult> {\n throw new Error('AcpAgent does not support resuming suspended generate calls');\n }\n\n async resumeStream(): Promise<SubAgentStreamResult> {\n throw new Error('AcpAgent does not support resuming suspended stream calls');\n }\n\n async stream(messages: MessageListInput, options?: AgentStreamOptions): Promise<SubAgentStreamResult> {\n const runId = options?.runId ?? randomUUID();\n const prompt = this.getPrompt(messages, options?.instructions);\n const signal = (options as { abortSignal?: AbortSignal } | undefined)?.abortSignal;\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n\n let resolveText!: (text: string) => void;\n let rejectText!: (error: unknown) => void;\n const textPromise = new Promise<string>((resolve, reject) => {\n resolveText = resolve;\n rejectText = reject;\n });\n\n const fullStream = new ReadableStream<ChunkType>({\n start: async controller => {\n const textId = randomUUID();\n const chunks: string[] = [];\n\n try {\n controller.enqueue({ type: 'text-start', runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });\n\n for await (const chunk of this.connection.promptStream(prompt, signal)) {\n chunks.push(chunk);\n controller.enqueue({\n type: 'text-delta',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: { id: textId, text: chunk },\n });\n }\n\n const text = chunks.join('');\n messageList.add([{ role: 'assistant', content: text }], 'response');\n\n controller.enqueue({ type: 'text-end', runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });\n controller.enqueue(createFinishChunk('step-finish', runId));\n controller.enqueue(createFinishChunk('finish', runId));\n resolveText(text);\n controller.close();\n } catch (error) {\n rejectText(error);\n controller.error(error);\n }\n },\n });\n\n return {\n fullStream,\n text: textPromise,\n messageList,\n toolResults: [],\n runId,\n };\n }\n\n private getPrompt(messages: MessageListInput, instructions?: AgentInstructions): string {\n const prompt = extractText(messages);\n const instructionText = instructions ? extractInstructions(instructions) : '';\n\n if (!instructionText) {\n return prompt;\n }\n\n return `${instructionText}\\n\\n${prompt}`;\n }\n\n private createMessageList(messages: MessageListInput, text: string): MessageList {\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n messageList.add([{ role: 'assistant', content: text }], 'response');\n return messageList;\n }\n}\n\nfunction extractText(messages: MessageListInput): string {\n if (typeof messages === 'string') {\n return messages;\n }\n\n if (Array.isArray(messages) && messages.every(message => typeof message === 'string')) {\n return messages.join('\\n');\n }\n\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n\n return messageList.get.all\n .core()\n .map(message => coreContentToString(message.content))\n .filter(Boolean)\n .join('\\n');\n}\n\nfunction extractInstructions(instructions: AgentInstructions): string {\n if (typeof instructions === 'string') {\n return instructions;\n }\n\n if (Array.isArray(instructions)) {\n return instructions.map(instruction => extractInstructions(instruction)).join('\\n');\n }\n\n return coreContentToString(instructions.content);\n}\n\nfunction createFinishChunk(type: 'step-finish' | 'finish', runId: string): ChunkType {\n return {\n type,\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n id: randomUUID(),\n output: {\n steps: [],\n usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n },\n stepResult: {\n reason: 'stop',\n warnings: [],\n isContinued: false,\n },\n metadata: {},\n messages: { nonUser: [], all: [] },\n },\n } as unknown as ChunkType;\n}\n","import { createTool } from '@mastra/core/tools';\nimport { z } from 'zod';\n\nimport { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nexport function createACPTool(options: CreateACPToolOptions) {\n return createTool({\n id: options.id,\n description: options.description,\n inputSchema: z.object({\n task: z.string().describe('The task to send to the ACP agent'),\n }),\n outputSchema: z.object({\n output: z.string().describe('The output of the ACP agent'),\n }),\n suspendSchema: z.object({\n permissionRequest: z.object({\n title: z.string().describe('The title of the permission request'),\n options: z.array(\n z.object({\n optionId: z.string().describe('The option id to select'),\n name: z.string().describe('The title of the permission request'),\n }),\n ),\n }),\n }),\n resumeSchema: z.union([\n z.object({\n optionId: z.string().optional().describe('The option id to select'),\n outcome: z.literal('selected').optional().describe('The outcome of the permission request'),\n }),\n z.object({\n outcome: z.literal('cancelled').optional().describe('The outcome of the permission request'),\n }),\n ]),\n execute: async ({ task }, context) => {\n const workspace = await context?.mastra?.getWorkspace();\n const connection = new ACPConnection({\n ...options,\n workspace,\n });\n\n const output = await connection.prompt(task, context?.abortSignal);\n\n return { output };\n },\n });\n}\n"]}
1
+ {"version":3,"sources":["../src/connection.ts","../src/agent.ts","../src/tool.ts"],"names":[],"mappings":";;;;;;;;;;;;AAgCA,IAAM,YAAN,MAAkC;AAAA,EAChC,WAAA,CACmB,cAAA,EACA,SAAA,EACA,mBAAA,EACjB;AAHiB,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,mBAAA,GAAA,mBAAA;AAAA,EAChB;AAAA,EAEH,MAAM,cAAc,YAAA,EAAkD;AACpE,IAAA,MAAM,KAAA,GAAQ,KAAK,cAAA,EAAe;AAElC,IAAA,IAAI,CAAC,KAAA,IAAS,YAAA,CAAa,SAAA,KAAc,MAAM,SAAA,EAAW;AACxD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAS,YAAA,CAAa,MAAA;AAE5B,IAAA,IAAI,MAAA,CAAO,kBAAkB,qBAAA,EAAuB;AAClD,MAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,IAAA,KAAS,MAAA,EAAQ;AAClC,QAAA,KAAA,CAAM,OAAA,GAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA;AAAA,MAC7D;AAAA,IACF,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,OAAA,GAAU,EAAE,IAAA,EAAM,gBAAA,EAAkB,QAAQ,CAAA;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,MAAM,kBAAkB,OAAA,EAAuE;AAC7F,IAAA,IAAI,KAAK,mBAAA,EAAqB;AAC5B,MAAA,OAAO,IAAA,CAAK,oBAAoB,OAAO,CAAA;AAAA,IACzC;AAEA,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA;AAEhC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,EAAE,OAAA,EAAS,EAAE,OAAA,EAAS,aAAY,EAAE;AAAA,IAC7C;AAEA,IAAA,OAAO,EAAE,OAAA,EAAS,yBAAA,CAA0B,MAAM,CAAA,EAAE;AAAA,EACtD;AAAA,EAEA,MAAM,aAAa,MAAA,EAA4D;AAC7E,IAAA,IAAI,UAAU,MAAM,IAAA,CAAK,UAAU,UAAA,EAAY,QAAA,CAAS,OAAO,IAAI,CAAA;AAEnE,IAAA,IAAI,EAAE,OAAO,OAAA,KAAY,QAAA,CAAA,EAAW;AAClC,MAAA,MAAM,OAAA,GAAU,IAAI,WAAA,CAAY,OAAO,CAAA;AACvC,MAAA,OAAA,GAAU,OAAA,CAAQ,OAAO,OAAO,CAAA;AAAA,IAClC;AAEA,IAAA,IAAI,MAAA,CAAO,IAAA,IAAQ,IAAA,IAAQ,MAAA,CAAO,SAAS,IAAA,EAAM;AAC/C,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAChC,MAAA,MAAM,KAAA,GAAA,CAAS,MAAA,CAAO,IAAA,IAAQ,CAAA,IAAK,CAAA;AACnC,MAAA,MAAM,MAAM,MAAA,CAAO,KAAA,IAAS,OAAO,KAAA,GAAQ,MAAA,CAAO,QAAQ,KAAA,CAAM,MAAA;AAChE,MAAA,OAAO,EAAE,SAAS,KAAA,CAAM,KAAA,CAAM,OAAO,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,EAAE;AAAA,IACvD;AAEA,IAAA,OAAO,EAAE,OAAA,EAAQ;AAAA,EACnB;AAAA,EAEA,MAAM,cAAc,MAAA,EAA8D;AAChF,IAAA,MAAM,KAAK,SAAA,CAAU,UAAA,EAAY,UAAU,MAAA,CAAO,IAAA,EAAM,OAAO,OAAO,CAAA;AAEtE,IAAA,OAAO,EAAC;AAAA,EACV;AACF,CAAA;AAEO,IAAM,gBAAN,MAAoB;AAAA,EAChB,OAAA;AAAA,EAED,YAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA,GAAS,EAAA;AAAA,EAEjB,YAAY,OAAA,EAA+B;AACzC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA,EAEA,IAAI,SAAA,GAAgC;AAClC,IAAA,OAAO,KAAK,OAAA,EAAS,SAAA;AAAA,EACvB;AAAA,EAEA,MAAM,MAAA,CAAO,IAAA,EAAc,MAAA,EAAuC;AAChE,IAAA,MAAM,QAAkB,EAAC;AAEzB,IAAA,WAAA,MAAiB,KAAA,IAAS,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,MAAM,CAAA,EAAG;AACzD,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,QAAA,KAAA,CAAM,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,MACvB;AAAA,IACF;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACtB;AAAA,EAEA,OAAO,YAAA,CAAa,IAAA,EAAc,MAAA,EAAsD;AACtF,IAAA,MAAM,KAAK,eAAA,EAAgB;AAE3B,IAAA,MAAM,SAAA,GAAY,KAAK,OAAA,EAAS,SAAA;AAEhC,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,CAAC,SAAA,EAAW;AAClC,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAEA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,MAAM,KAAK,MAAA,EAAO;AAClB,MAAA,MAAM,MAAA,CAAO,MAAA,IAAU,IAAI,KAAA,CAAM,oBAAoB,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,QAAQ,gBAAA,EAAiC;AAC/C,IAAA,MAAM,KAAA,GAAqB;AAAA,MACzB,SAAA;AAAA,MACA,OAAA,EAAS,CAAA,KAAA,KAAS,KAAA,CAAM,IAAA,CAAK,KAAK;AAAA,KACpC;AACA,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AAErB,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,KAAK,KAAK,MAAA,EAAO;AACjB,MAAA,KAAA,CAAM,MAAM,MAAA,EAAQ,MAAA,IAAU,IAAI,KAAA,CAAM,oBAAoB,CAAC,CAAA;AAAA,IAC/D,CAAA;AAEA,IAAA,MAAA,EAAQ,iBAAiB,OAAA,EAAS,YAAA,EAAc,EAAE,IAAA,EAAM,MAAM,CAAA;AAE9D,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,UAAA,CAC1B,MAAA,CAAO;AAAA,MACN,SAAA;AAAA,MACA,QAAQ,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,MAAM;AAAA,KACtC,CAAA,CACA,IAAA;AAAA,MACC,CAAA,QAAA,KAAY;AACV,QAAA,IAAA,CAAK,4BAA4B,QAAQ,CAAA;AACzC,QAAA,KAAA,CAAM,KAAA,EAAM;AAAA,MACd,CAAA;AAAA,MACA,CAAA,KAAA,KAAS;AACP,QAAA,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,MACpC;AAAA,KACF;AAEF,IAAA,IAAI;AACF,MAAA,WAAA,MAAiB,SAAS,KAAA,EAAO;AAC/B,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,MAAM,eAAA;AAAA,IACR,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,eAAA,CAAgB,KAAA,CAAM,MAAM,MAAS,CAAA;AAC3C,MAAA,MAAM,KAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,MAAA,EAAQ,mBAAA,CAAoB,SAAS,YAAY,CAAA;AACjD,MAAA,IAAI,IAAA,CAAK,kBAAkB,KAAA,EAAO;AAChC,QAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AAAA,MACvB;AAEA,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,cAAA,KAAmB,KAAA,EAAO;AACzC,QAAA,IAAA,CAAK,UAAA,EAAW;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,MAAA,GAAwB;AAC5B,IAAA,MAAM,SAAA,GAAY,KAAK,OAAA,EAAS,SAAA;AAEhC,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,CAAC,SAAA,EAAW;AAClC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,EAAE,WAAW,CAAA;AAAA,EAC5C;AAAA,EAEA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAClB,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAA,CAAK,iBAAA,GAAoB,MAAA;AACzB,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AAErB,IAAA,IAAI,IAAA,CAAK,YAAA,IAAgB,CAAC,IAAA,CAAK,aAAa,MAAA,EAAQ;AAClD,MAAA,IAAA,CAAK,aAAa,IAAA,EAAK;AAAA,IACzB;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AAAA,EACtB;AAAA,EAEA,MAAc,eAAA,GAAiC;AAC7C,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,OAAA,EAAS;AACnC,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,iBAAA,KAAsB,KAAK,UAAA,EAAW;AAC3C,IAAA,MAAM,IAAA,CAAK,iBAAA;AAAA,EACb;AAAA,EAEA,MAAc,UAAA,GAA4B;AACxC,IAAA,IAAA,CAAK,MAAA,GAAS,EAAA;AACd,IAAA,IAAA,CAAK,YAAA,GAAe,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,IAAA,CAAK,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG;AAAA,MACvE,GAAA,EAAK,KAAK,OAAA,CAAQ,GAAA;AAAA,MAClB,GAAA,EAAK,EAAE,GAAG,OAAA,CAAQ,KAAK,GAAG,IAAA,CAAK,QAAQ,GAAA,EAAI;AAAA,MAC3C,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM;AAAA,KAC/B,CAAA;AAED,IAAA,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,CAAA,KAAA,KAAS;AAC3C,MAAA,IAAA,CAAK,MAAA,IAAU,OAAO,KAAK,CAAA;AAAA,IAC7B,CAAC,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,YAAA;AAAA,MACb,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AAAA,MACtC,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,MAAM;AAAA,KACzC;AAEA,IAAA,MAAM,SAAA,GACJ,IAAA,CAAK,OAAA,CAAQ,SAAA,IACb,IAAI,SAAA,CAAU;AAAA,MACZ,UAAA,EAAY,IAAI,eAAA,CAAgB,EAAE,QAAA,EAAU,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI,EAAG;AAAA,KAChF,CAAA;AAEH,IAAA,IAAA,CAAK,aAAa,IAAI,oBAAA;AAAA,MACpB,MAAM,IAAI,SAAA,CAAU,MAAM,KAAK,aAAA,EAAe,SAAA,EAAW,IAAA,CAAK,OAAA,CAAQ,mBAAmB,CAAA;AAAA,MACzF;AAAA,KACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,UAAA,CAAW,UAAA,CAAW,IAAA,CAAK,sBAAsB,CAAA;AAE5D,MAAA,IAAI,IAAA,CAAK,QAAQ,YAAA,EAAc;AAC7B,QAAA,MAAM,IAAA,CAAK,WAAW,YAAA,CAAa,EAAE,UAAU,IAAA,CAAK,OAAA,CAAQ,cAAc,CAAA;AAAA,MAC5E;AAEA,MAAA,IAAA,CAAK,UAAU,MAAM,IAAA,CAAK,WAAW,UAAA,CAAW,IAAA,CAAK,sBAAsB,CAAA;AAAA,IAC7E,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,UAAA,EAAW;AAChB,MAAA,MAAM,IAAA,CAAK,WAAW,KAAK,CAAA;AAAA,IAC7B;AAAA,EACF;AAAA,EAEQ,oBAAA,GAA0C;AAChD,IAAA,OAAO;AAAA,MACL,eAAA,EAAiB,gBAAA;AAAA,MACjB,kBAAA,EAAoB;AAAA,QAClB,EAAA,EAAI,EAAE,YAAA,EAAc,IAAA,EAAM,eAAe,IAAA;AAAK,OAChD;AAAA,MACA,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,aAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACX;AAAA,MACA,GAAG,KAAK,OAAA,CAAQ;AAAA,KAClB;AAAA,EACF;AAAA,EAEQ,oBAAA,GAA0C;AAChD,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,QAAQ,GAAA,EAAI;AAAA,MACrC,YAAY,EAAC;AAAA,MACb,GAAG,KAAK,OAAA,CAAQ;AAAA,KAClB;AAAA,EACF;AAAA,EAEQ,4BAA4B,QAAA,EAAgC;AAClE,IAAA,IAAI,QAAA,CAAS,eAAe,UAAA,EAAY;AACtC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAyC,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,EAChF;AAAA,EAEQ,WAAW,KAAA,EAAuB;AACxC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK;AAEhC,IAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,MAAA,IAAI,UAAU,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC7C,QAAA,KAAA,CAAM,OAAA,GAAU,CAAA,EAAG,KAAA,CAAM,OAAO;;AAAA;AAAA,EAA0B,MAAM,CAAA,CAAA;AAAA,MAClE;AAEA,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,MAAA,CAAO,KAAK,CAAC;;AAAA;AAAA,EAA0B,MAAM,CAAA,CAAA,GAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EAC9F;AACF,CAAA;AAQA,SAAS,gBAAA,GAAqC;AAC5C,EAAA,MAAM,SAAc,EAAC;AACrB,EAAA,MAAM,UAGD,EAAC;AACN,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,IAAI,KAAA;AAEJ,EAAA,MAAM,OAAO,MAAkC;AAC7C,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,OAAO,OAAA,CAAQ,QAAQ,EAAE,KAAA,EAAO,OAAO,KAAA,EAAM,EAAI,IAAA,EAAM,KAAA,EAAO,CAAA;AAAA,IAChE;AAEA,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAO,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,IAC7B;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,QAAQ,OAAA,CAAQ,EAAE,OAAO,MAAA,EAAW,IAAA,EAAM,MAAM,CAAA;AAAA,IACzD;AAEA,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,OAAA,EAAS,MAAA,EAAQ,CAAA;AAAA,IAClC,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,KAAK,KAAA,EAAO;AACV,MAAA,MAAM,MAAA,GAAS,QAAQ,KAAA,EAAM;AAC7B,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,OAAA,CAAQ,EAAE,KAAA,EAAO,IAAA,EAAM,OAAO,CAAA;AACrC,QAAA;AAAA,MACF;AAEA,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,KAAA,GAAQ;AACN,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,KAAA,MAAW,MAAA,IAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG;AACtC,QAAA,MAAA,CAAO,QAAQ,EAAE,KAAA,EAAO,MAAA,EAAW,IAAA,EAAM,MAAM,CAAA;AAAA,MACjD;AAAA,IACF,CAAA;AAAA,IACA,MAAM,UAAA,EAAY;AAChB,MAAA,KAAA,GAAQ,UAAA;AACR,MAAA,KAAA,MAAW,MAAA,IAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG;AACtC,QAAA,MAAA,CAAO,OAAO,UAAU,CAAA;AAAA,MAC1B;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAA,CAAO,aAAa,CAAA,GAAI;AACvB,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB;AAAA,GACF;AACF;AAEA,SAAS,0BAA0B,MAAA,EAAgE;AACjG,EAAA,OAAO,EAAE,OAAA,EAAS,UAAA,EAAY,QAAA,EAAU,OAAO,QAAA,EAAS;AAC1D;;;AC9VA,IAAM,gBAAA,GAAmB,OAAA;AAGzB,IAAM,KAAA,GAAQ;AAAA,EACZ,OAAA,EAAS,WAAA;AAAA,EACT,QAAA,EAAU,aAAA;AAAA,EACV,oBAAA,EAAsB,IAAA;AAAA,EACtB,eAAe,EAAC;AAAA,EAChB,YAAY,aAAa;AAAA,IACvB,MAAA,EAAQ,IAAI,cAAA,CAAe;AAAA,MACzB,KAAA,EAAO,OAAM,UAAA,KAAc;AACzB,QAAA,UAAA,CAAW,KAAA,EAAM;AAAA,MACnB;AAAA,KACD;AAAA,GACH,CAAA;AAAA,EACA,UAAU,aAAa;AAAA,IACrB,MAAA,EAAQ,IAAI,cAAA,CAAe;AAAA,MACzB,KAAA,EAAO,OAAM,UAAA,KAAc;AACzB,QAAA,UAAA,CAAW,KAAA,EAAM;AAAA,MACnB;AAAA,KACD;AAAA,GACH;AACF,CAAA;AAMO,IAAM,WAAN,MAGqC;AAAA,EACjC,EAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EAET,YAAY,OAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,KAAK,OAAA,CAAQ,EAAA;AAClB,IAAA,IAAA,CAAK,IAAA,GAAO,OAAA,CAAQ,IAAA,IAAQ,OAAA,CAAQ,EAAA;AACpC,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAC3B,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,aAAA,CAAc,OAAO,CAAA;AAAA,EAC7C;AAAA,EAEA,iBAAiB,OAAA,EAAuB;AAAA,EAAC;AAAA,EAEzC,cAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA,EAEA,QAAA,GAAmE;AACjE,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,YAAA,GAAwB;AACtB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,YAAY,OAAA,EAA0C;AAAA,EAAC;AAAA,EAEvD,SAAA,GAAuB;AACrB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,eAAA,GAA0B;AACxB,IAAA,OAAO,EAAA;AAAA,EACT;AAAA,EAEA,MAAM,QAAA,CAAS,QAAA,EAA4B,OAAA,EAAiE;AAC1G,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,SAAS,YAAY,CAAA;AAC7D,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA;AAAA,MACjC,MAAA;AAAA,MACC,OAAA,EAAuD;AAAA,KAC1D;AACA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,iBAAA,CAAkB,QAAA,EAAU,IAAI,CAAA;AAEzD,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,QAAA,EAAU;AAAA,QACR,UAAA,EAAY,WAAA,CAAY,GAAA,CAAI,QAAA,CAAS,EAAA;AAAG,OAC1C;AAAA,MACA,aAAa,EAAC;AAAA,MACd,YAAA,EAAc,MAAA;AAAA,MACd,KAAA,EAAO,OAAA,EAAS,KAAA,IAAS,UAAA;AAAW,KACtC;AAAA,EACF;AAAA,EAEA,MAAM,cAAA,GAAkD;AACtD,IAAA,MAAM,IAAI,MAAM,6DAA6D,CAAA;AAAA,EAC/E;AAAA,EAEA,MAAM,YAAA,GAA8C;AAClD,IAAA,MAAM,IAAI,MAAM,2DAA2D,CAAA;AAAA,EAC7E;AAAA,EAEA,MAAM,MAAA,CAAO,QAAA,EAA4B,OAAA,EAA6D;AACpG,IAAA,MAAM,KAAA,GAAQ,OAAA,EAAS,KAAA,IAAS,UAAA,EAAW;AAC3C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,SAAS,YAAY,CAAA;AAC7D,IAAA,MAAM,SAAU,OAAA,EAAuD,WAAA;AACvE,IAAA,MAAM,WAAA,GAAc,IAAI,WAAA,EAAY;AACpC,IAAA,WAAA,CAAY,GAAA,CAAI,UAAU,OAAO,CAAA;AAEjC,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI,UAAA;AACJ,IAAA,MAAM,WAAA,GAAc,IAAI,OAAA,CAAgB,CAAC,SAAS,MAAA,KAAW;AAC3D,MAAA,WAAA,GAAc,OAAA;AACd,MAAA,UAAA,GAAa,MAAA;AAAA,IACf,CAAC,CAAA;AAED,IAAA,MAAM,UAAA,GAAa,IAAI,cAAA,CAA0B;AAAA,MAC/C,KAAA,EAAO,OAAM,UAAA,KAAc;AACzB,QAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,QAAA,MAAM,SAAmB,EAAC;AAC1B,QAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAC1C,QAAA,MAAM,cAA+B,EAAC;AAEtC,QAAA,IAAI;AACF,UAAA,UAAA,CAAW,OAAA,CAAQ,EAAE,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,IAAA,EAAM,gBAAA,EAAkB,OAAA,EAAS,EAAE,EAAA,EAAI,MAAA,EAAO,EAAG,CAAA;AAEjG,UAAA,WAAA,MAAiB,SAAS,IAAA,CAAK,UAAA,CAAW,YAAA,CAAa,MAAA,EAAQ,MAAM,CAAA,EAAG;AACtE,YAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,cAAA,MAAA,CAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AACtB,cAAA,UAAA,CAAW,OAAA,CAAQ;AAAA,gBACjB,IAAA,EAAM,YAAA;AAAA,gBACN,KAAA;AAAA,gBACA,IAAA,EAAM,gBAAA;AAAA,gBACN,SAAS,EAAE,EAAA,EAAI,MAAA,EAAQ,IAAA,EAAM,MAAM,IAAA;AAAK,eACzC,CAAA;AAAA,YACH,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,gBAAA,EAAkB;AAC1C,cAAA,KAAA,MAAW,SAAS,4BAAA,CAA6B,KAAA,CAAM,MAAA,EAAQ,KAAA,EAAO,SAAS,CAAA,EAAG;AAChF,gBAAA,IAAI,KAAA,CAAM,SAAS,aAAA,EAAe;AAChC,kBAAA,WAAA,CAAY,IAAA,CAAK,EAAE,OAAA,EAAS,KAAA,CAAM,SAAS,CAAA;AAAA,gBAC7C;AACA,gBAAA,UAAA,CAAW,QAAQ,KAAK,CAAA;AAAA,cAC1B;AAAA,YACF;AAAA,UACF;AAEA,UAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAC3B,UAAA,WAAA,CAAY,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,aAAa,OAAA,EAAS,IAAA,EAAM,CAAA,EAAG,UAAU,CAAA;AAElE,UAAA,UAAA,CAAW,OAAA,CAAQ,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,IAAA,EAAM,gBAAA,EAAkB,OAAA,EAAS,EAAE,EAAA,EAAI,MAAA,EAAO,EAAG,CAAA;AAC/F,UAAA,UAAA,CAAW,OAAA,CAAQ,iBAAA,CAAkB,aAAA,EAAe,KAAK,CAAC,CAAA;AAC1D,UAAA,UAAA,CAAW,OAAA,CAAQ,iBAAA,CAAkB,QAAA,EAAU,KAAK,CAAC,CAAA;AACrD,UAAA,MAAM,OAAA,EAAS,WAAW,oBAAA,CAAqB,EAAE,MAAM,KAAA,EAAO,WAAA,EAAa,WAAA,EAAa,CAAQ,CAAA;AAChG,UAAA,WAAA,CAAY,IAAI,CAAA;AAChB,UAAA,UAAA,CAAW,KAAA,EAAM;AAAA,QACnB,SAAS,KAAA,EAAO;AACd,UAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAC3B,UAAA,MAAM,OAAA,EAAS,QAAA,GAAW,oBAAA,CAAqB,EAAE,IAAA,EAAM,OAAO,WAAA,EAAa,WAAA,EAAa,KAAA,EAAO,CAAQ,CAAA;AACvG,UAAA,UAAA,CAAW,KAAK,CAAA;AAChB,UAAA,UAAA,CAAW,MAAM,KAAK,CAAA;AAAA,QACxB;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,OAAO;AAAA,MACL,UAAA;AAAA,MACA,IAAA,EAAM,WAAA;AAAA,MACN,WAAA;AAAA,MACA,aAAa,EAAC;AAAA,MACd;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,SAAA,CAAU,UAA4B,YAAA,EAA0C;AACtF,IAAA,MAAM,MAAA,GAAS,YAAY,QAAQ,CAAA;AACnC,IAAA,MAAM,eAAA,GAAkB,YAAA,GAAe,mBAAA,CAAoB,YAAY,CAAA,GAAI,EAAA;AAE3E,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,OAAO,GAAG,eAAe;;AAAA,EAAO,MAAM,CAAA,CAAA;AAAA,EACxC;AAAA,EAEQ,iBAAA,CAAkB,UAA4B,IAAA,EAA2B;AAC/E,IAAA,MAAM,WAAA,GAAc,IAAI,WAAA,EAAY;AACpC,IAAA,WAAA,CAAY,GAAA,CAAI,UAAU,OAAO,CAAA;AACjC,IAAA,WAAA,CAAY,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,aAAa,OAAA,EAAS,IAAA,EAAM,CAAA,EAAG,UAAU,CAAA;AAClE,IAAA,OAAO,WAAA;AAAA,EACT;AACF;AAEA,SAAS,YAAY,QAAA,EAAoC;AACvD,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,IAAK,QAAA,CAAS,MAAM,CAAA,OAAA,KAAW,OAAO,OAAA,KAAY,QAAQ,CAAA,EAAG;AACrF,IAAA,OAAO,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,WAAA,GAAc,IAAI,WAAA,EAAY;AACpC,EAAA,WAAA,CAAY,GAAA,CAAI,UAAU,OAAO,CAAA;AAEjC,EAAA,OAAO,YAAY,GAAA,CAAI,GAAA,CACpB,IAAA,EAAK,CACL,IAAI,CAAA,OAAA,KAAW,mBAAA,CAAoB,OAAA,CAAQ,OAAO,CAAC,CAAA,CACnD,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,IAAI,CAAA;AACd;AAEA,SAAS,oBAAoB,YAAA,EAAyC;AACpE,EAAA,IAAI,OAAO,iBAAiB,QAAA,EAAU;AACpC,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,EAAG;AAC/B,IAAA,OAAO,YAAA,CAAa,IAAI,CAAA,WAAA,KAAe,mBAAA,CAAoB,WAAW,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,EACpF;AAEA,EAAA,OAAO,mBAAA,CAAoB,aAAa,OAAO,CAAA;AACjD;AAEA,SAAS,4BAAA,CACP,MAAA,EACA,KAAA,EACA,SAAA,EACa;AACb,EAAA,QAAQ,OAAO,aAAA;AAAe,IAC5B,KAAK,WAAA,EAAa;AAChB,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,MAAA,EAAQ,SAAS,CAAA;AAC9C,MAAA,SAAA,CAAU,GAAA,CAAI,MAAA,CAAO,UAAA,EAAY,QAAQ,CAAA;AAEzC,MAAA,OAAO;AAAA,QACL;AAAA,UACE,IAAA,EAAM,WAAA;AAAA,UACN,KAAA;AAAA,UACA,IAAA,EAAM,gBAAA;AAAA,UACN,OAAA,EAAS;AAAA,YACP,YAAY,MAAA,CAAO,UAAA;AAAA,YACnB,QAAA;AAAA,YACA,IAAA,EAAM,QAAA,CAAS,MAAA,CAAO,QAAQ;AAAA;AAChC;AACF,OACF;AAAA,IACF;AAAA,IACA,KAAK,kBAAA,EAAoB;AACvB,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,MAAA,EAAQ,SAAS,CAAA;AAE9C,MAAA,IAAI,MAAA,CAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,WAAW,QAAA,EAAU;AAC/D,QAAA,OAAO;AAAA,UACL;AAAA,YACE,IAAA,EAAM,aAAA;AAAA,YACN,KAAA;AAAA,YACA,IAAA,EAAM,gBAAA;AAAA,YACN,OAAA,EAAS;AAAA,cACP,YAAY,MAAA,CAAO,UAAA;AAAA,cACnB,QAAA;AAAA,cACA,MAAA,EAAQ,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO,OAAA,IAAW,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,CAAO,KAAA,EAAM;AAAA,cAC3F,OAAA,EAAS,OAAO,MAAA,KAAW;AAAA;AAC7B;AACF,SACF;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL;AAAA,UACE,IAAA,EAAM,iBAAA;AAAA,UACN,KAAA;AAAA,UACA,IAAA,EAAM,gBAAA;AAAA,UACN,OAAA,EAAS;AAAA,YACP,YAAY,MAAA,CAAO,UAAA;AAAA,YACnB,QAAA;AAAA,YACA,aAAA,EAAe,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,MAAA,IAAU;AAAA;AAClD;AACF,OACF;AAAA,IACF;AAAA,IACA;AACE,MAAA,OAAO,EAAC;AAAA;AAEd;AAEA,SAAS,WAAA,CACP,QACA,SAAA,EACQ;AACR,EAAA,OAAO,MAAA,CAAO,SAAS,SAAA,CAAU,GAAA,CAAI,OAAO,UAAU,CAAA,IAAK,OAAO,IAAA,IAAQ,UAAA;AAC5E;AAEA,SAAS,SAAS,KAAA,EAAyC;AACzD,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/D,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO,EAAE,OAAO,KAAA,EAAM;AACxB;AAEA,SAAS,oBAAA,CAAqB;AAAA,EAC5B,IAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,MAAM,QAAQ,EAAE,WAAA,EAAa,GAAG,YAAA,EAAc,CAAA,EAAG,aAAa,CAAA,EAAE;AAEhE,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,YAAA,EAAc,MAAA;AAAA,IACd,KAAA;AAAA,IACA,UAAA,EAAY,KAAA;AAAA,IACZ,UAAU,EAAC;AAAA,IACX,QAAA,EAAU;AAAA,MACR,QAAA,EAAU,WAAA,CAAY,GAAA,CAAI,QAAA,CAAS,KAAK,KAAA;AAAM,KAChD;AAAA,IACA,OAAO,EAAC;AAAA,IACR,WAAA;AAAA,IACA,KAAA;AAAA,IACA,GAAI,KAAA,KAAU,MAAA,GAAY,EAAC,GAAI,EAAE,KAAA;AAAM,GACzC;AACF;AAEA,SAAS,iBAAA,CAAkB,MAAgC,KAAA,EAA0B;AACnF,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA,EAAM,gBAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP,IAAI,UAAA,EAAW;AAAA,MACf,MAAA,EAAQ;AAAA,QACN,OAAO,EAAC;AAAA,QACR,OAAO,EAAE,WAAA,EAAa,GAAG,YAAA,EAAc,CAAA,EAAG,aAAa,CAAA;AAAE,OAC3D;AAAA,MACA,UAAA,EAAY;AAAA,QACV,MAAA,EAAQ,MAAA;AAAA,QACR,UAAU,EAAC;AAAA,QACX,WAAA,EAAa;AAAA,OACf;AAAA,MACA,UAAU,EAAC;AAAA,MACX,UAAU,EAAE,OAAA,EAAS,EAAC,EAAG,GAAA,EAAK,EAAC;AAAE;AACnC,GACF;AACF;ACzWO,SAAS,cAAc,OAAA,EAA+B;AAC3D,EAAA,OAAO,UAAA,CAAW;AAAA,IAChB,IAAI,OAAA,CAAQ,EAAA;AAAA,IACZ,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,WAAA,EAAa,EAAE,MAAA,CAAO;AAAA,MACpB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,mCAAmC;AAAA,KAC9D,CAAA;AAAA,IACD,YAAA,EAAc,EAAE,MAAA,CAAO;AAAA,MACrB,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,6BAA6B;AAAA,KAC1D,CAAA;AAAA,IACD,aAAA,EAAe,EAAE,MAAA,CAAO;AAAA,MACtB,iBAAA,EAAmB,EAAE,MAAA,CAAO;AAAA,QAC1B,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,qCAAqC,CAAA;AAAA,QAChE,SAAS,CAAA,CAAE,KAAA;AAAA,UACT,EAAE,MAAA,CAAO;AAAA,YACP,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,yBAAyB,CAAA;AAAA,YACvD,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,qCAAqC;AAAA,WAChE;AAAA;AACH,OACD;AAAA,KACF,CAAA;AAAA,IACD,YAAA,EAAc,EAAE,KAAA,CAAM;AAAA,MACpB,EAAE,MAAA,CAAO;AAAA,QACP,UAAU,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,yBAAyB,CAAA;AAAA,QAClE,OAAA,EAAS,EAAE,OAAA,CAAQ,UAAU,EAAE,QAAA,EAAS,CAAE,SAAS,uCAAuC;AAAA,OAC3F,CAAA;AAAA,MACD,EAAE,MAAA,CAAO;AAAA,QACP,OAAA,EAAS,EAAE,OAAA,CAAQ,WAAW,EAAE,QAAA,EAAS,CAAE,SAAS,uCAAuC;AAAA,OAC5F;AAAA,KACF,CAAA;AAAA,IACD,OAAA,EAAS,OAAO,EAAE,IAAA,IAAQ,OAAA,KAAY;AACpC,MAAA,MAAM,SAAA,GAAY,MAAM,OAAA,EAAS,MAAA,EAAQ,YAAA,EAAa;AACtD,MAAA,MAAM,UAAA,GAAa,IAAI,aAAA,CAAc;AAAA,QACnC,GAAG,OAAA;AAAA,QACH;AAAA,OACD,CAAA;AAED,MAAA,MAAM,SAAS,MAAM,UAAA,CAAW,MAAA,CAAO,IAAA,EAAM,SAAS,WAAW,CAAA;AAEjE,MAAA,OAAO,EAAE,MAAA,EAAO;AAAA,IAClB;AAAA,GACD,CAAA;AACH","file":"index.js","sourcesContent":["import { spawn } from 'node:child_process';\nimport type { ChildProcessWithoutNullStreams } from 'node:child_process';\nimport process from 'node:process';\nimport { Readable, Writable } from 'node:stream';\nimport { ClientSideConnection, ndJsonStream, PROTOCOL_VERSION } from '@agentclientprotocol/sdk';\nimport type {\n Client,\n InitializeRequest,\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 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 this.agentProcess.stderr.on('data', chunk => {\n this.stderr += String(chunk);\n });\n\n const stream = ndJsonStream(\n Writable.toWeb(this.agentProcess.stdin) as WritableStream<Uint8Array>,\n Readable.toWeb(this.agentProcess.stdout) as ReadableStream<Uint8Array>,\n );\n\n const workspace =\n this.options.workspace ??\n new Workspace({\n filesystem: new LocalFilesystem({ basePath: this.options.cwd ?? process.cwd() }),\n });\n\n this.connection = new ClientSideConnection(\n () => new ACPClient(() => this.currentPrompt, workspace, this.options.onPermissionRequest),\n stream,\n );\n\n try {\n await this.connection.initialize(this.getInitializeRequest());\n\n if (this.options.authMethodId) {\n await this.connection.authenticate({ methodId: this.options.authMethodId });\n }\n\n this.session = await this.connection.newSession(this.getNewSessionRequest());\n } catch (error) {\n this.disconnect();\n throw this.withStderr(error);\n }\n }\n\n private getInitializeRequest(): InitializeRequest {\n return {\n protocolVersion: PROTOCOL_VERSION,\n clientCapabilities: {\n fs: { readTextFile: true, writeTextFile: true },\n },\n clientInfo: {\n name: '@mastra/acp',\n version: '0.1.0',\n },\n ...this.options.initialize,\n };\n }\n\n private getNewSessionRequest(): NewSessionRequest {\n return {\n cwd: this.options.cwd ?? process.cwd(),\n mcpServers: [],\n ...this.options.session,\n };\n }\n\n private throwIfPromptDidNotComplete(response: PromptResponse): void {\n if (response.stopReason === 'end_turn') {\n return;\n }\n\n throw new Error(`ACP prompt stopped before completing: ${response.stopReason}`);\n }\n\n private withStderr(error: unknown): Error {\n const stderr = this.stderr.trim();\n\n if (error instanceof Error) {\n if (stderr && !error.message.includes(stderr)) {\n error.message = `${error.message}\\n\\nACP agent stderr:\\n${stderr}`;\n }\n\n return error;\n }\n\n return new Error(stderr ? `${String(error)}\\n\\nACP agent stderr:\\n${stderr}` : String(error));\n }\n}\n\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 { 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 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 { createTool } from '@mastra/core/tools';\nimport { z } from 'zod';\n\nimport { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nexport function createACPTool(options: CreateACPToolOptions) {\n return createTool({\n id: options.id,\n description: options.description,\n inputSchema: z.object({\n task: z.string().describe('The task to send to the ACP agent'),\n }),\n outputSchema: z.object({\n output: z.string().describe('The output of the ACP agent'),\n }),\n suspendSchema: z.object({\n permissionRequest: z.object({\n title: z.string().describe('The title of the permission request'),\n options: z.array(\n z.object({\n optionId: z.string().describe('The option id to select'),\n name: z.string().describe('The title of the permission request'),\n }),\n ),\n }),\n }),\n resumeSchema: z.union([\n z.object({\n optionId: z.string().optional().describe('The option id to select'),\n outcome: z.literal('selected').optional().describe('The outcome of the permission request'),\n }),\n z.object({\n outcome: z.literal('cancelled').optional().describe('The outcome of the permission request'),\n }),\n ]),\n execute: async ({ task }, context) => {\n const workspace = await context?.mastra?.getWorkspace();\n const connection = new ACPConnection({\n ...options,\n workspace,\n });\n\n const output = await connection.prompt(task, context?.abortSignal);\n\n return { output };\n },\n });\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mastra/acp",
3
- "version": "0.0.0",
3
+ "version": "0.1.0-alpha.0",
4
4
  "description": "ACP package for Mastra",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -22,28 +22,21 @@
22
22
  },
23
23
  "./package.json": "./package.json"
24
24
  },
25
- "scripts": {
26
- "build": "pnpm build:lib",
27
- "build:lib": "tsup --silent --config tsup.config.ts",
28
- "prepack": "pnpx tsx ../../scripts/generate-package-docs.ts",
29
- "build:watch": "pnpm build:lib --watch",
30
- "test": "vitest run --passWithNoTests",
31
- "lint": "eslint ."
32
- },
33
25
  "keywords": [],
34
26
  "author": "",
35
27
  "license": "Apache-2.0",
36
28
  "devDependencies": {
37
- "@internal/lint": "workspace:*",
38
- "@internal/types-builder": "workspace:*",
39
- "@mastra/core": "workspace:*",
40
29
  "@types/node": "22.19.15",
41
- "@vitest/coverage-v8": "catalog:",
42
- "@vitest/ui": "catalog:",
30
+ "@vitest/coverage-v8": "4.1.5",
31
+ "@vitest/ui": "4.1.5",
43
32
  "eslint": "^10.2.1",
44
33
  "tsup": "^8.5.1",
45
- "typescript": "catalog:",
46
- "vitest": "catalog:"
34
+ "typescript": "^6.0.3",
35
+ "vitest": "4.1.5",
36
+ "@internal/lint": "0.0.94",
37
+ "@internal/types-builder": "0.0.69",
38
+ "@internal/ai-sdk-v5": "0.0.41",
39
+ "@mastra/core": "1.34.0-alpha.0"
47
40
  },
48
41
  "homepage": "https://mastra.ai",
49
42
  "repository": {
@@ -55,7 +48,7 @@
55
48
  "url": "https://github.com/mastra-ai/mastra/issues"
56
49
  },
57
50
  "peerDependencies": {
58
- "@mastra/core": ">=1.33.0-0 <2.0.0-0",
51
+ "@mastra/core": ">=1.34.0-0 <2.0.0-0",
59
52
  "zod": "^3.25.0 || ^4.0.0"
60
53
  },
61
54
  "engines": {
@@ -63,6 +56,13 @@
63
56
  },
64
57
  "dependencies": {
65
58
  "@agentclientprotocol/sdk": "^0.21.0",
66
- "zod": "catalog:"
59
+ "zod": "^4.3.6"
60
+ },
61
+ "scripts": {
62
+ "build": "pnpm build:lib",
63
+ "build:lib": "tsup --silent --config tsup.config.ts",
64
+ "build:watch": "pnpm build:lib --watch",
65
+ "test": "vitest run --passWithNoTests",
66
+ "lint": "eslint ."
67
67
  }
68
- }
68
+ }