@mastra/acp 0.4.3 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/docs/references/docs-connections-acp.md +2 -2
- package/dist/docs/references/docs-connections-overview.md +1 -1
- package/dist/docs/references/reference-acp-acp-agent.md +5 -5
- package/dist/docs/references/reference-acp-create-acp-tool.md +2 -2
- package/dist/index.cjs +5 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +4 -8
- package/dist/index.js.map +1 -1
- package/package.json +12 -12
package/dist/docs/SKILL.md
CHANGED
|
@@ -98,7 +98,7 @@ export const codeSupervisor = new Agent({
|
|
|
98
98
|
id: 'code-supervisor',
|
|
99
99
|
name: 'Code Supervisor',
|
|
100
100
|
instructions: 'Delegate code editing tasks to the code-agent subagent.',
|
|
101
|
-
model: 'openai/gpt-
|
|
101
|
+
model: 'openai/gpt-6.1-sol',
|
|
102
102
|
agents: {
|
|
103
103
|
codeAgent,
|
|
104
104
|
},
|
|
@@ -127,7 +127,7 @@ export const codeSupervisor = new Agent({
|
|
|
127
127
|
id: 'code-supervisor',
|
|
128
128
|
name: 'Code Supervisor',
|
|
129
129
|
instructions: 'Use the code-agent tool when a task requires repository inspection or code edits.',
|
|
130
|
-
model: 'openai/gpt-
|
|
130
|
+
model: 'openai/gpt-6.1-sol',
|
|
131
131
|
tools: {
|
|
132
132
|
codeAgentTool,
|
|
133
133
|
},
|
|
@@ -29,7 +29,7 @@ export const codeSupervisor = new Agent({
|
|
|
29
29
|
id: 'code-supervisor',
|
|
30
30
|
name: 'Code Supervisor',
|
|
31
31
|
instructions: 'Delegate code editing tasks to the code-agent subagent.',
|
|
32
|
-
model: 'openai/gpt-
|
|
32
|
+
model: 'openai/gpt-6.1-sol',
|
|
33
33
|
agents: {
|
|
34
34
|
codeAgent,
|
|
35
35
|
},
|
|
@@ -48,7 +48,7 @@ export const claudeCodeAgent = new AcpAgent({
|
|
|
48
48
|
command: 'npx',
|
|
49
49
|
args: ['@agentclientprotocol/claude-agent-acp'],
|
|
50
50
|
cwd: process.cwd(),
|
|
51
|
-
model: 'claude-sonnet-
|
|
51
|
+
model: 'claude-sonnet-5-5',
|
|
52
52
|
})
|
|
53
53
|
```
|
|
54
54
|
|
|
@@ -82,7 +82,7 @@ export const claudeCodeAgent = new AcpAgent({
|
|
|
82
82
|
|
|
83
83
|
**workspace** (`Workspace`): Workspace used for ACP file read and write requests. Defaults to a Workspace backed by LocalFilesystem at cwd or process.cwd().
|
|
84
84
|
|
|
85
|
-
**model** (`ModelId`): Model ID to select after ACP session creation using the ACP session/
|
|
85
|
+
**model** (`ModelId`): Model ID to select after ACP session creation using the ACP session/set_model method.
|
|
86
86
|
|
|
87
87
|
## Properties
|
|
88
88
|
|
|
@@ -132,7 +132,7 @@ Starts the ACP process if needed and returns the model list advertised by the AC
|
|
|
132
132
|
|
|
133
133
|
```typescript
|
|
134
134
|
const models = await codeAgent.getAvailableModels()
|
|
135
|
-
// [{ modelId: 'claude-sonnet-
|
|
135
|
+
// [{ modelId: 'claude-sonnet-5-5', name: 'Claude Sonnet' }, ...]
|
|
136
136
|
```
|
|
137
137
|
|
|
138
138
|
#### `setModel(modelId)`
|
|
@@ -140,7 +140,7 @@ const models = await codeAgent.getAvailableModels()
|
|
|
140
140
|
Selects a model for the active ACP session. If the ACP agent advertises available models, the model ID must match one of them.
|
|
141
141
|
|
|
142
142
|
```typescript
|
|
143
|
-
await codeAgent.setModel('claude-sonnet-
|
|
143
|
+
await codeAgent.setModel('claude-sonnet-5-5')
|
|
144
144
|
```
|
|
145
145
|
|
|
146
146
|
## Session lifecycle
|
|
@@ -28,7 +28,7 @@ export const codeSupervisor = new Agent({
|
|
|
28
28
|
id: 'code-supervisor',
|
|
29
29
|
name: 'Code Supervisor',
|
|
30
30
|
instructions: 'Use the code-agent tool when a task requires repository inspection or code edits.',
|
|
31
|
-
model: 'openai/gpt-
|
|
31
|
+
model: 'openai/gpt-6.1-sol',
|
|
32
32
|
tools: {
|
|
33
33
|
codeAgentTool,
|
|
34
34
|
},
|
|
@@ -63,7 +63,7 @@ export const codeSupervisor = new Agent({
|
|
|
63
63
|
|
|
64
64
|
**workspace** (`Workspace`): Workspace option from the shared ACP connection options. During tool execution, createACPTool() passes the current Mastra workspace from the execution context when one is available; otherwise the ACP connection falls back to a local filesystem workspace. Use AcpAgent when you need to provide an explicit workspace instance.
|
|
65
65
|
|
|
66
|
-
**model** (`ModelId`): Model ID to select after ACP session creation using the ACP session/
|
|
66
|
+
**model** (`ModelId`): Model ID to select after ACP session creation using the ACP session/set_model method.
|
|
67
67
|
|
|
68
68
|
## Input schema
|
|
69
69
|
|
package/dist/index.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
|
|
2
|
+
// \0rolldown/runtime.js
|
|
3
3
|
var __create = Object.create;
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
5
5
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -20,7 +20,6 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
20
20
|
value: mod,
|
|
21
21
|
enumerable: true
|
|
22
22
|
}) : target, mod));
|
|
23
|
-
//#endregion
|
|
24
23
|
let stream_web = require("stream/web");
|
|
25
24
|
let _mastra_core_agent_message_list = require("@mastra/core/agent/message-list");
|
|
26
25
|
let child_process = require("child_process");
|
|
@@ -30,7 +29,7 @@ let stream = require("stream");
|
|
|
30
29
|
let _agentclientprotocol_sdk = require("@agentclientprotocol/sdk");
|
|
31
30
|
let _mastra_core_workspace = require("@mastra/core/workspace");
|
|
32
31
|
let _mastra_core_tools = require("@mastra/core/tools");
|
|
33
|
-
|
|
32
|
+
// src/connection.ts
|
|
34
33
|
var ACPClient = class {
|
|
35
34
|
getPromptState;
|
|
36
35
|
workspace;
|
|
@@ -322,8 +321,7 @@ function selectedPermissionOutcome(option) {
|
|
|
322
321
|
optionId: option.optionId
|
|
323
322
|
};
|
|
324
323
|
}
|
|
325
|
-
|
|
326
|
-
//#region src/agent.ts
|
|
324
|
+
// src/agent.ts
|
|
327
325
|
const CHUNK_FROM_AGENT = "AGENT";
|
|
328
326
|
const model = {
|
|
329
327
|
modelId: "acp-agent",
|
|
@@ -599,8 +597,7 @@ function createFinishChunk(type, runId) {
|
|
|
599
597
|
}
|
|
600
598
|
};
|
|
601
599
|
}
|
|
602
|
-
|
|
603
|
-
//#region src/session.ts
|
|
600
|
+
// src/session.ts
|
|
604
601
|
var ACPToolSession = class {
|
|
605
602
|
options;
|
|
606
603
|
connection;
|
|
@@ -619,8 +616,7 @@ var ACPToolSession = class {
|
|
|
619
616
|
});
|
|
620
617
|
}
|
|
621
618
|
};
|
|
622
|
-
|
|
623
|
-
//#region src/tool.ts
|
|
619
|
+
// src/tool.ts
|
|
624
620
|
function createACPTool(options) {
|
|
625
621
|
const session = new ACPToolSession(options);
|
|
626
622
|
return (0, _mastra_core_tools.createTool)({
|
|
@@ -706,7 +702,6 @@ function createACPTool(options) {
|
|
|
706
702
|
}
|
|
707
703
|
});
|
|
708
704
|
}
|
|
709
|
-
//#endregion
|
|
710
705
|
exports.AcpAgent = AcpAgent;
|
|
711
706
|
exports.createACPTool = createACPTool;
|
|
712
707
|
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["spawn","stream","ndJsonStream","Writable","Readable","Workspace","LocalFilesystem","ClientSideConnection","PROTOCOL_VERSION","ReadableStream","MessageList","coreContentToString","createTool"],"sources":["../src/connection.ts","../src/agent.ts","../src/session.ts","../src/tool.ts"],"sourcesContent":["import { spawn } from 'node:child_process';\nimport type { ChildProcessWithoutNullStreams } from 'node:child_process';\nimport process from 'node:process';\nimport { Readable, Writable } from 'node:stream';\nimport { ClientSideConnection, ndJsonStream, PROTOCOL_VERSION } from '@agentclientprotocol/sdk';\nimport type {\n Client,\n InitializeRequest,\n ModelInfo,\n NewSessionRequest,\n NewSessionResponse,\n PermissionOption,\n PromptResponse,\n ReadTextFileRequest,\n ReadTextFileResponse,\n RequestPermissionRequest,\n RequestPermissionResponse,\n SessionNotification,\n SessionUpdate,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from '@agentclientprotocol/sdk';\n\nimport { LocalFilesystem, Workspace } from '@mastra/core/workspace';\nimport type { CreateACPToolOptions } from './types';\n\nexport type ACPStreamEvent = { type: 'text'; text: string } | { type: 'session-update'; update: SessionUpdate };\n\ntype PromptState = {\n sessionId: string;\n onEvent?: (event: ACPStreamEvent) => void;\n};\n\nclass ACPClient implements Client {\n constructor(\n private readonly getPromptState: () => PromptState | undefined,\n private readonly workspace: Workspace,\n private readonly onPermissionRequest?: CreateACPToolOptions['onPermissionRequest'],\n ) {}\n\n async sessionUpdate(notification: SessionNotification): Promise<void> {\n const state = this.getPromptState();\n\n if (!state || notification.sessionId !== state.sessionId) {\n return;\n }\n\n const update = notification.update;\n\n if (update.sessionUpdate === 'agent_message_chunk') {\n if (update.content.type === 'text') {\n state.onEvent?.({ type: 'text', text: update.content.text });\n }\n } else {\n state.onEvent?.({ type: 'session-update', update });\n }\n }\n\n async requestPermission(request: RequestPermissionRequest): Promise<RequestPermissionResponse> {\n if (this.onPermissionRequest) {\n return this.onPermissionRequest(request);\n }\n\n const option = request.options[0];\n\n if (!option) {\n return { outcome: { outcome: 'cancelled' } };\n }\n\n return { outcome: selectedPermissionOutcome(option) };\n }\n\n async readTextFile(params: ReadTextFileRequest): Promise<ReadTextFileResponse> {\n let content = await this.workspace.filesystem?.readFile(params.path);\n\n if (!(typeof content === 'string')) {\n const decoder = new TextDecoder('utf-8');\n content = decoder.decode(content);\n }\n\n if (params.line != null || params.limit != null) {\n const lines = content.split('\\n');\n const start = (params.line ?? 1) - 1;\n const end = params.limit != null ? start + params.limit : lines.length;\n return { content: lines.slice(start, end).join('\\n') };\n }\n\n return { content };\n }\n\n async writeTextFile(params: WriteTextFileRequest): Promise<WriteTextFileResponse> {\n await this.workspace.filesystem?.writeFile(params.path, params.content);\n\n return {};\n }\n}\n\nexport class ACPConnection {\n readonly options: CreateACPToolOptions;\n\n private agentProcess?: ChildProcessWithoutNullStreams;\n private connection?: ClientSideConnection;\n private session?: NewSessionResponse;\n private initializePromise?: Promise<void>;\n private currentPrompt?: PromptState;\n private stderr = '';\n\n constructor(options: CreateACPToolOptions) {\n this.options = options;\n }\n\n get sessionId(): string | undefined {\n return this.session?.sessionId;\n }\n\n async getAvailableModels(): Promise<ModelInfo[]> {\n await this.ensureConnected();\n return this.session?.models?.availableModels ?? [];\n }\n\n async setModel(modelId: string): Promise<void> {\n await this.ensureConnected();\n\n const available = this.session?.models?.availableModels;\n\n if (available && !available.some(m => m.modelId === modelId)) {\n const ids = available.map(m => m.modelId).join(', ') || '(none)';\n throw new Error(`Model \"${modelId}\" is not available. Available models: ${ids}`);\n }\n\n await this.connection!.unstable_setSessionModel({\n sessionId: this.session!.sessionId,\n modelId,\n });\n }\n\n async prompt(task: string, signal?: AbortSignal): Promise<string> {\n const parts: string[] = [];\n\n for await (const event of this.promptStream(task, signal)) {\n if (event.type === 'text') {\n parts.push(event.text);\n }\n }\n\n return parts.join('');\n }\n\n async *promptStream(task: string, signal?: AbortSignal): AsyncGenerator<ACPStreamEvent> {\n await this.ensureConnected();\n\n const sessionId = this.session?.sessionId;\n\n if (!this.connection || !sessionId) {\n throw new Error('ACP connection is not initialized');\n }\n\n if (signal?.aborted) {\n await this.cancel();\n throw signal.reason ?? new Error('ACP prompt aborted');\n }\n\n const queue = createAsyncQueue<ACPStreamEvent>();\n const state: PromptState = {\n sessionId,\n onEvent: event => queue.push(event),\n };\n this.currentPrompt = state;\n\n const abortHandler = () => {\n void this.cancel();\n queue.throw(signal?.reason ?? new Error('ACP prompt aborted'));\n };\n\n signal?.addEventListener('abort', abortHandler, { once: true });\n\n const responsePromise = this.connection\n .prompt({\n sessionId,\n prompt: [{ type: 'text', text: task }],\n })\n .then(\n response => {\n try {\n this.throwIfPromptDidNotComplete(response);\n } catch (error) {\n queue.throw(error);\n return;\n }\n queue.close();\n },\n error => {\n queue.throw(this.withStderr(error));\n },\n );\n\n try {\n for await (const chunk of queue) {\n yield chunk;\n }\n\n await responsePromise;\n } catch (error) {\n await responsePromise.catch(() => undefined);\n throw error;\n } finally {\n signal?.removeEventListener('abort', abortHandler);\n if (this.currentPrompt === state) {\n this.currentPrompt = undefined;\n }\n\n if (this.options.persistSession === false) {\n this.disconnect();\n }\n }\n }\n\n async cancel(): Promise<void> {\n const sessionId = this.session?.sessionId;\n\n if (!this.connection || !sessionId) {\n return;\n }\n\n await this.connection.cancel({ sessionId });\n }\n\n disconnect(): void {\n this.connection = undefined;\n this.session = undefined;\n this.initializePromise = undefined;\n this.currentPrompt = undefined;\n\n if (this.agentProcess && !this.agentProcess.killed) {\n this.agentProcess.kill();\n }\n\n this.agentProcess = undefined;\n }\n\n private async ensureConnected(): Promise<void> {\n if (this.connection && this.session) {\n return;\n }\n\n this.initializePromise ??= this.initialize();\n await this.initializePromise;\n }\n\n private async initialize(): Promise<void> {\n this.stderr = '';\n this.agentProcess = spawn(this.options.command, this.options.args ?? [], {\n cwd: this.options.cwd,\n env: { ...process.env, ...this.options.env },\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n // Keep an 'error' listener attached for the lifetime of the process so a\n // failed spawn (e.g. ENOENT) rejects initialization instead of crashing\n // the host process with an unhandled 'error' event.\n const processFailure = new Promise<never>((_, reject) => {\n this.agentProcess!.on('error', error => {\n reject(error instanceof Error ? error : new Error(String(error)));\n });\n this.agentProcess!.on('exit', (code, signal) => {\n reject(new Error(`ACP agent process exited during initialization (code: ${code}, signal: ${signal})`));\n });\n });\n processFailure.catch(() => undefined);\n\n this.agentProcess.stderr.on('data', chunk => {\n this.stderr += String(chunk);\n });\n\n const stream = ndJsonStream(\n Writable.toWeb(this.agentProcess.stdin) as WritableStream<Uint8Array>,\n Readable.toWeb(this.agentProcess.stdout) as ReadableStream<Uint8Array>,\n );\n\n const workspace =\n this.options.workspace ??\n new Workspace({\n filesystem: new LocalFilesystem({ basePath: this.options.cwd ?? process.cwd() }),\n });\n\n try {\n this.connection = new ClientSideConnection(() => {\n const defaultClient = new ACPClient(() => this.currentPrompt, workspace, this.options.onPermissionRequest);\n return this.options.createClient?.(defaultClient) ?? defaultClient;\n }, stream);\n\n await Promise.race([processFailure, this.initializeSession()]);\n } catch (error) {\n this.disconnect();\n throw this.withStderr(error);\n }\n }\n\n private async initializeSession(): Promise<void> {\n await this.connection!.initialize(this.getInitializeRequest());\n\n if (this.options.authMethodId) {\n await this.connection!.authenticate({ methodId: this.options.authMethodId });\n }\n\n this.session = await this.connection!.newSession(this.getNewSessionRequest());\n\n if (this.options.model) {\n const available = this.session.models?.availableModels;\n\n if (available && !available.some(m => m.modelId === this.options.model)) {\n const ids = available.map(m => m.modelId).join(', ') || '(none)';\n throw new Error(`Model \"${this.options.model}\" is not available. Available models: ${ids}`);\n }\n\n await this.connection!.unstable_setSessionModel({\n sessionId: this.session.sessionId,\n modelId: this.options.model,\n });\n }\n }\n\n private getInitializeRequest(): InitializeRequest {\n return {\n protocolVersion: PROTOCOL_VERSION,\n clientCapabilities: {\n fs: { readTextFile: true, writeTextFile: true },\n },\n clientInfo: {\n name: '@mastra/acp',\n version: '0.1.0',\n },\n ...this.options.initialize,\n };\n }\n\n private getNewSessionRequest(): NewSessionRequest {\n return {\n cwd: this.options.cwd ?? process.cwd(),\n mcpServers: [],\n ...this.options.session,\n };\n }\n\n private throwIfPromptDidNotComplete(response: PromptResponse): void {\n if (response.stopReason === 'end_turn') {\n return;\n }\n\n throw new Error(`ACP prompt stopped before completing: ${response.stopReason}`);\n }\n\n private withStderr(error: unknown): Error {\n const stderr = this.stderr.trim();\n\n if (error instanceof Error) {\n if (stderr && !error.message.includes(stderr)) {\n error.message = `${error.message}\\n\\nACP agent stderr:\\n${stderr}`;\n }\n\n return error;\n }\n\n return new Error(stderr ? `${String(error)}\\n\\nACP agent stderr:\\n${stderr}` : String(error));\n }\n}\n\ntype AsyncQueue<T> = AsyncIterable<T> & {\n close: () => void;\n push: (value: T) => void;\n throw: (error: unknown) => void;\n};\n\nfunction createAsyncQueue<T>(): AsyncQueue<T> {\n const values: T[] = [];\n const waiters: Array<{\n resolve: (value: IteratorResult<T>) => void;\n reject: (error: unknown) => void;\n }> = [];\n let closed = false;\n let error: unknown;\n\n const next = (): Promise<IteratorResult<T>> => {\n if (values.length > 0) {\n return Promise.resolve({ value: values.shift()!, done: false });\n }\n\n if (error) {\n return Promise.reject(error);\n }\n\n if (closed) {\n return Promise.resolve({ value: undefined, done: true });\n }\n\n return new Promise((resolve, reject) => {\n waiters.push({ resolve, reject });\n });\n };\n\n return {\n push(value) {\n const waiter = waiters.shift();\n if (waiter) {\n waiter.resolve({ value, done: false });\n return;\n }\n\n values.push(value);\n },\n close() {\n closed = true;\n for (const waiter of waiters.splice(0)) {\n waiter.resolve({ value: undefined, done: true });\n }\n },\n throw(queueError) {\n error = queueError;\n for (const waiter of waiters.splice(0)) {\n waiter.reject(queueError);\n }\n },\n [Symbol.asyncIterator]() {\n return { next };\n },\n };\n}\n\nfunction selectedPermissionOutcome(option: PermissionOption): RequestPermissionResponse['outcome'] {\n return { outcome: 'selected', optionId: option.optionId };\n}\n","import { ReadableStream } from 'node:stream/web';\n\nimport type { ModelInfo, SessionUpdate } from '@agentclientprotocol/sdk';\nimport type {\n AgentGenerateOptions,\n AgentInstructions,\n AgentStreamOptions,\n MastraLanguageModel,\n SubAgent,\n SubAgentGenerateResult,\n SubAgentStreamResult,\n} from '@mastra/core/agent';\nimport { MessageList, coreContentToString } from '@mastra/core/agent/message-list';\nimport type { MessageListInput } from '@mastra/core/agent/message-list';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { ChunkType } from '@mastra/core/stream';\nimport type { DynamicArgument } from '@mastra/core/types';\n\nimport { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nconst CHUNK_FROM_AGENT = 'AGENT' as ChunkType['from'];\ntype AcpToolResult = Extract<NonNullable<SubAgentStreamResult['toolResults']>, unknown[]>[number];\n\nconst model = {\n modelId: 'acp-agent',\n provider: '@mastra/acp',\n specificationVersion: 'v3',\n supportedUrls: {},\n doGenerate: async () => ({\n stream: new ReadableStream({\n start: async controller => {\n controller.close();\n },\n }),\n }),\n doStream: async () => ({\n stream: new ReadableStream({\n start: async controller => {\n controller.close();\n },\n }),\n }),\n} as const satisfies MastraLanguageModel;\n\nexport type AcpAgentOptions = CreateACPToolOptions & {\n name?: string;\n};\n\nexport class AcpAgent<\n TId extends string = string,\n TRequestContext extends Record<string, any> | unknown = unknown,\n> implements SubAgent<TId, TRequestContext> {\n readonly id: TId;\n readonly name: string;\n readonly connection: ACPConnection;\n readonly description: string;\n\n constructor(options: AcpAgentOptions) {\n this.id = options.id as TId;\n this.name = options.name ?? options.id;\n this.description = options.description;\n this.connection = new ACPConnection(options);\n }\n\n __registerMastra(_mastra: Mastra): void {}\n\n getDescription(): string {\n return this.description;\n }\n\n getModel(): ReturnType<SubAgent<TId, TRequestContext>['getModel']> {\n return model;\n }\n\n hasOwnMemory(): boolean {\n return false;\n }\n\n __setMemory(_memory: DynamicArgument<any, any>): void {}\n\n getMemory(): undefined {\n return undefined;\n }\n\n getInstructions(): string {\n return '';\n }\n\n async getAvailableModels(): Promise<ModelInfo[]> {\n return this.connection.getAvailableModels();\n }\n\n async setModel(modelId: string): Promise<void> {\n return this.connection.setModel(modelId);\n }\n\n async generate(messages: MessageListInput, options?: AgentGenerateOptions): Promise<SubAgentGenerateResult> {\n const prompt = this.getPrompt(messages, options?.instructions);\n const text = await this.connection.prompt(\n prompt,\n (options as { abortSignal?: AbortSignal } | undefined)?.abortSignal,\n );\n const messageList = this.createMessageList(messages, text);\n\n return {\n text,\n response: {\n dbMessages: messageList.get.response.db(),\n },\n toolResults: [],\n finishReason: 'stop',\n runId: options?.runId ?? globalThis.crypto.randomUUID(),\n };\n }\n\n async resumeGenerate(): Promise<SubAgentGenerateResult> {\n throw new Error('AcpAgent does not support resuming suspended generate calls');\n }\n\n async resumeStream(): Promise<SubAgentStreamResult> {\n throw new Error('AcpAgent does not support resuming suspended stream calls');\n }\n\n async stream(messages: MessageListInput, options?: AgentStreamOptions): Promise<SubAgentStreamResult> {\n const runId = options?.runId ?? globalThis.crypto.randomUUID();\n const prompt = this.getPrompt(messages, options?.instructions);\n const signal = (options as { abortSignal?: AbortSignal } | undefined)?.abortSignal;\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n\n let resolveText!: (text: string) => void;\n let rejectText!: (error: unknown) => void;\n const textPromise = new Promise<string>((resolve, reject) => {\n resolveText = resolve;\n rejectText = reject;\n });\n // Callers that only read fullStream never await text; keep its rejection handled.\n textPromise.catch(() => {});\n\n const fullStream = new ReadableStream<ChunkType>({\n start: async controller => {\n const textId = globalThis.crypto.randomUUID();\n const chunks: string[] = [];\n const toolNames = new Map<string, string>();\n const toolResults: AcpToolResult[] = [];\n\n try {\n controller.enqueue({ type: 'text-start', runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });\n\n for await (const event of this.connection.promptStream(prompt, signal)) {\n if (event.type === 'text') {\n chunks.push(event.text);\n controller.enqueue({\n type: 'text-delta',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: { id: textId, text: event.text },\n });\n } else if (event.type === 'session-update') {\n for (const chunk of getMastraChunksFromACPUpdate(event.update, runId, toolNames)) {\n if (chunk.type === 'tool-result') {\n toolResults.push({ payload: chunk.payload });\n }\n controller.enqueue(chunk);\n }\n }\n }\n\n const text = chunks.join('');\n messageList.add([{ role: 'assistant', content: text }], 'response');\n\n controller.enqueue({ type: 'text-end', runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });\n controller.enqueue(createFinishChunk('step-finish', runId));\n controller.enqueue(createFinishChunk('finish', runId));\n await options?.onFinish?.(createOnFinishResult({ text, runId, messageList, toolResults }) as any);\n resolveText(text);\n controller.close();\n } catch (error) {\n rejectText(error);\n try {\n const text = chunks.join('');\n await options?.onFinish?.(createOnFinishResult({ text, runId, messageList, toolResults, error }) as any);\n } finally {\n controller.error(error);\n }\n }\n },\n });\n\n return {\n fullStream,\n text: textPromise,\n messageList,\n toolResults: [],\n runId,\n };\n }\n\n private getPrompt(messages: MessageListInput, instructions?: AgentInstructions): string {\n const prompt = extractText(messages);\n const instructionText = instructions ? extractInstructions(instructions) : '';\n\n if (!instructionText) {\n return prompt;\n }\n\n return `${instructionText}\\n\\n${prompt}`;\n }\n\n private createMessageList(messages: MessageListInput, text: string): MessageList {\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n messageList.add([{ role: 'assistant', content: text }], 'response');\n return messageList;\n }\n}\n\nfunction extractText(messages: MessageListInput): string {\n if (typeof messages === 'string') {\n return messages;\n }\n\n if (Array.isArray(messages) && messages.every(message => typeof message === 'string')) {\n return messages.join('\\n');\n }\n\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n\n return messageList.get.all\n .core()\n .map(message => coreContentToString(message.content))\n .filter(Boolean)\n .join('\\n');\n}\n\nfunction extractInstructions(instructions: AgentInstructions): string {\n if (typeof instructions === 'string') {\n return instructions;\n }\n\n if (Array.isArray(instructions)) {\n return instructions.map(instruction => extractInstructions(instruction)).join('\\n');\n }\n\n return coreContentToString(instructions.content);\n}\n\nfunction getMastraChunksFromACPUpdate(\n update: SessionUpdate,\n runId: string,\n toolNames: Map<string, string>,\n): ChunkType[] {\n switch (update.sessionUpdate) {\n case 'tool_call': {\n const toolName = getToolName(update, toolNames);\n toolNames.set(update.toolCallId, toolName);\n\n return [\n {\n type: 'tool-call',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n args: toRecord(update.rawInput),\n },\n },\n ];\n }\n case 'tool_call_update': {\n const toolName = getToolName(update, toolNames);\n\n if (update.status === 'completed' || update.status === 'failed') {\n return [\n {\n type: 'tool-result',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n result: update.rawOutput ?? update.content ?? { status: update.status, title: update.title },\n isError: update.status === 'failed',\n },\n },\n ];\n }\n\n return [\n {\n type: 'tool-call-delta',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n argsTextDelta: update.title ?? update.status ?? '',\n },\n },\n ];\n }\n default:\n return [];\n }\n}\n\nfunction getToolName(\n update: Extract<SessionUpdate, { sessionUpdate: 'tool_call' | 'tool_call_update' }>,\n toolNames: Map<string, string>,\n): string {\n return update.title ?? toolNames.get(update.toolCallId) ?? update.kind ?? 'acp_tool';\n}\n\nfunction toRecord(value: unknown): Record<string, unknown> {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n\n if (value === undefined) {\n return {};\n }\n\n return { input: value };\n}\n\nfunction createOnFinishResult({\n text,\n runId,\n messageList,\n toolResults,\n error,\n}: {\n text: string;\n runId: string;\n messageList: MessageList;\n toolResults: AcpToolResult[];\n error?: unknown;\n}) {\n const usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n\n return {\n text,\n finishReason: 'stop',\n usage,\n totalUsage: usage,\n warnings: [],\n response: {\n messages: messageList.get.response.aiV5.model(),\n },\n steps: [],\n toolResults,\n runId,\n ...(error === undefined ? {} : { error }),\n };\n}\n\nfunction createFinishChunk(type: 'step-finish' | 'finish', runId: string): ChunkType {\n return {\n type,\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n id: globalThis.crypto.randomUUID(),\n output: {\n steps: [],\n usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n },\n stepResult: {\n reason: 'stop',\n warnings: [],\n isContinued: false,\n },\n metadata: {},\n messages: { nonUser: [], all: [] },\n },\n } as unknown as ChunkType;\n}\n","import { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nexport class ACPToolSession {\n private connection?: ACPConnection;\n\n constructor(private readonly options: CreateACPToolOptions) {}\n\n getConnection(workspace: CreateACPToolOptions['workspace']): ACPConnection {\n if (this.options.persistSession === false) {\n return this.createConnection(workspace);\n }\n\n this.connection ??= this.createConnection(workspace);\n return this.connection;\n }\n\n private createConnection(workspace: CreateACPToolOptions['workspace']): ACPConnection {\n return new ACPConnection({\n ...this.options,\n workspace: workspace ?? this.options.workspace,\n });\n }\n}\n","import { compileSchema } from '@internal/types-builder/compile-zod';\nimport { createTool } from '@mastra/core/tools';\nimport { z } from 'zod/v4';\n\nimport { ACPToolSession } from './session';\nimport type { CreateACPToolOptions } from './types';\n\nexport function createACPTool(options: CreateACPToolOptions) {\n const session = new ACPToolSession(options);\n\n return createTool({\n id: options.id,\n description: options.description,\n inputSchema: compileSchema(\n z.object({\n task: z.string().describe('The task to send to the ACP agent'),\n }),\n ),\n outputSchema: compileSchema(\n z.object({\n output: z.string().describe('The output of the ACP agent'),\n }),\n ),\n suspendSchema: compileSchema(\n z.object({\n permissionRequest: z.object({\n title: z.string().describe('The title of the permission request'),\n options: z.array(\n z.object({\n optionId: z.string().describe('The option id to select'),\n name: z.string().describe('The title of the permission request'),\n }),\n ),\n }),\n }),\n ),\n resumeSchema: compileSchema(\n z.union([\n z.object({\n optionId: z.string().optional().describe('The option id to select'),\n outcome: z.literal('selected').optional().describe('The outcome of the permission request'),\n }),\n z.object({\n outcome: z.literal('cancelled').optional().describe('The outcome of the permission request'),\n }),\n ]),\n ),\n execute: async ({ task }, context) => {\n const workspace = await context?.mastra?.getWorkspace();\n const connection = session.getConnection(workspace);\n const output = await connection.prompt(task, context?.abortSignal);\n\n return { output };\n },\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["spawn","stream","ndJsonStream","Writable","Readable","Workspace","LocalFilesystem","ClientSideConnection","PROTOCOL_VERSION","ReadableStream","MessageList","coreContentToString","createTool"],"sources":["../src/connection.ts","../src/agent.ts","../src/session.ts","../src/tool.ts"],"sourcesContent":["import { spawn } from 'node:child_process';\nimport type { ChildProcessWithoutNullStreams } from 'node:child_process';\nimport process from 'node:process';\nimport { Readable, Writable } from 'node:stream';\nimport { ClientSideConnection, ndJsonStream, PROTOCOL_VERSION } from '@agentclientprotocol/sdk';\nimport type {\n Client,\n InitializeRequest,\n ModelInfo,\n NewSessionRequest,\n NewSessionResponse,\n PermissionOption,\n PromptResponse,\n ReadTextFileRequest,\n ReadTextFileResponse,\n RequestPermissionRequest,\n RequestPermissionResponse,\n SessionNotification,\n SessionUpdate,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from '@agentclientprotocol/sdk';\n\nimport { LocalFilesystem, Workspace } from '@mastra/core/workspace';\nimport type { CreateACPToolOptions } from './types';\n\nexport type ACPStreamEvent = { type: 'text'; text: string } | { type: 'session-update'; update: SessionUpdate };\n\ntype PromptState = {\n sessionId: string;\n onEvent?: (event: ACPStreamEvent) => void;\n};\n\nclass ACPClient implements Client {\n constructor(\n private readonly getPromptState: () => PromptState | undefined,\n private readonly workspace: Workspace,\n private readonly onPermissionRequest?: CreateACPToolOptions['onPermissionRequest'],\n ) {}\n\n async sessionUpdate(notification: SessionNotification): Promise<void> {\n const state = this.getPromptState();\n\n if (!state || notification.sessionId !== state.sessionId) {\n return;\n }\n\n const update = notification.update;\n\n if (update.sessionUpdate === 'agent_message_chunk') {\n if (update.content.type === 'text') {\n state.onEvent?.({ type: 'text', text: update.content.text });\n }\n } else {\n state.onEvent?.({ type: 'session-update', update });\n }\n }\n\n async requestPermission(request: RequestPermissionRequest): Promise<RequestPermissionResponse> {\n if (this.onPermissionRequest) {\n return this.onPermissionRequest(request);\n }\n\n const option = request.options[0];\n\n if (!option) {\n return { outcome: { outcome: 'cancelled' } };\n }\n\n return { outcome: selectedPermissionOutcome(option) };\n }\n\n async readTextFile(params: ReadTextFileRequest): Promise<ReadTextFileResponse> {\n let content = await this.workspace.filesystem?.readFile(params.path);\n\n if (!(typeof content === 'string')) {\n const decoder = new TextDecoder('utf-8');\n content = decoder.decode(content);\n }\n\n if (params.line != null || params.limit != null) {\n const lines = content.split('\\n');\n const start = (params.line ?? 1) - 1;\n const end = params.limit != null ? start + params.limit : lines.length;\n return { content: lines.slice(start, end).join('\\n') };\n }\n\n return { content };\n }\n\n async writeTextFile(params: WriteTextFileRequest): Promise<WriteTextFileResponse> {\n await this.workspace.filesystem?.writeFile(params.path, params.content);\n\n return {};\n }\n}\n\nexport class ACPConnection {\n readonly options: CreateACPToolOptions;\n\n private agentProcess?: ChildProcessWithoutNullStreams;\n private connection?: ClientSideConnection;\n private session?: NewSessionResponse;\n private initializePromise?: Promise<void>;\n private currentPrompt?: PromptState;\n private stderr = '';\n\n constructor(options: CreateACPToolOptions) {\n this.options = options;\n }\n\n get sessionId(): string | undefined {\n return this.session?.sessionId;\n }\n\n async getAvailableModels(): Promise<ModelInfo[]> {\n await this.ensureConnected();\n return this.session?.models?.availableModels ?? [];\n }\n\n async setModel(modelId: string): Promise<void> {\n await this.ensureConnected();\n\n const available = this.session?.models?.availableModels;\n\n if (available && !available.some(m => m.modelId === modelId)) {\n const ids = available.map(m => m.modelId).join(', ') || '(none)';\n throw new Error(`Model \"${modelId}\" is not available. Available models: ${ids}`);\n }\n\n await this.connection!.unstable_setSessionModel({\n sessionId: this.session!.sessionId,\n modelId,\n });\n }\n\n async prompt(task: string, signal?: AbortSignal): Promise<string> {\n const parts: string[] = [];\n\n for await (const event of this.promptStream(task, signal)) {\n if (event.type === 'text') {\n parts.push(event.text);\n }\n }\n\n return parts.join('');\n }\n\n async *promptStream(task: string, signal?: AbortSignal): AsyncGenerator<ACPStreamEvent> {\n await this.ensureConnected();\n\n const sessionId = this.session?.sessionId;\n\n if (!this.connection || !sessionId) {\n throw new Error('ACP connection is not initialized');\n }\n\n if (signal?.aborted) {\n await this.cancel();\n throw signal.reason ?? new Error('ACP prompt aborted');\n }\n\n const queue = createAsyncQueue<ACPStreamEvent>();\n const state: PromptState = {\n sessionId,\n onEvent: event => queue.push(event),\n };\n this.currentPrompt = state;\n\n const abortHandler = () => {\n void this.cancel();\n queue.throw(signal?.reason ?? new Error('ACP prompt aborted'));\n };\n\n signal?.addEventListener('abort', abortHandler, { once: true });\n\n const responsePromise = this.connection\n .prompt({\n sessionId,\n prompt: [{ type: 'text', text: task }],\n })\n .then(\n response => {\n try {\n this.throwIfPromptDidNotComplete(response);\n } catch (error) {\n queue.throw(error);\n return;\n }\n queue.close();\n },\n error => {\n queue.throw(this.withStderr(error));\n },\n );\n\n try {\n for await (const chunk of queue) {\n yield chunk;\n }\n\n await responsePromise;\n } catch (error) {\n await responsePromise.catch(() => undefined);\n throw error;\n } finally {\n signal?.removeEventListener('abort', abortHandler);\n if (this.currentPrompt === state) {\n this.currentPrompt = undefined;\n }\n\n if (this.options.persistSession === false) {\n this.disconnect();\n }\n }\n }\n\n async cancel(): Promise<void> {\n const sessionId = this.session?.sessionId;\n\n if (!this.connection || !sessionId) {\n return;\n }\n\n await this.connection.cancel({ sessionId });\n }\n\n disconnect(): void {\n this.connection = undefined;\n this.session = undefined;\n this.initializePromise = undefined;\n this.currentPrompt = undefined;\n\n if (this.agentProcess && !this.agentProcess.killed) {\n this.agentProcess.kill();\n }\n\n this.agentProcess = undefined;\n }\n\n private async ensureConnected(): Promise<void> {\n if (this.connection && this.session) {\n return;\n }\n\n this.initializePromise ??= this.initialize();\n await this.initializePromise;\n }\n\n private async initialize(): Promise<void> {\n this.stderr = '';\n this.agentProcess = spawn(this.options.command, this.options.args ?? [], {\n cwd: this.options.cwd,\n env: { ...process.env, ...this.options.env },\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n // Keep an 'error' listener attached for the lifetime of the process so a\n // failed spawn (e.g. ENOENT) rejects initialization instead of crashing\n // the host process with an unhandled 'error' event.\n const processFailure = new Promise<never>((_, reject) => {\n this.agentProcess!.on('error', error => {\n reject(error instanceof Error ? error : new Error(String(error)));\n });\n this.agentProcess!.on('exit', (code, signal) => {\n reject(new Error(`ACP agent process exited during initialization (code: ${code}, signal: ${signal})`));\n });\n });\n processFailure.catch(() => undefined);\n\n this.agentProcess.stderr.on('data', chunk => {\n this.stderr += String(chunk);\n });\n\n const stream = ndJsonStream(\n Writable.toWeb(this.agentProcess.stdin) as WritableStream<Uint8Array>,\n Readable.toWeb(this.agentProcess.stdout) as ReadableStream<Uint8Array>,\n );\n\n const workspace =\n this.options.workspace ??\n new Workspace({\n filesystem: new LocalFilesystem({ basePath: this.options.cwd ?? process.cwd() }),\n });\n\n try {\n this.connection = new ClientSideConnection(() => {\n const defaultClient = new ACPClient(() => this.currentPrompt, workspace, this.options.onPermissionRequest);\n return this.options.createClient?.(defaultClient) ?? defaultClient;\n }, stream);\n\n await Promise.race([processFailure, this.initializeSession()]);\n } catch (error) {\n this.disconnect();\n throw this.withStderr(error);\n }\n }\n\n private async initializeSession(): Promise<void> {\n await this.connection!.initialize(this.getInitializeRequest());\n\n if (this.options.authMethodId) {\n await this.connection!.authenticate({ methodId: this.options.authMethodId });\n }\n\n this.session = await this.connection!.newSession(this.getNewSessionRequest());\n\n if (this.options.model) {\n const available = this.session.models?.availableModels;\n\n if (available && !available.some(m => m.modelId === this.options.model)) {\n const ids = available.map(m => m.modelId).join(', ') || '(none)';\n throw new Error(`Model \"${this.options.model}\" is not available. Available models: ${ids}`);\n }\n\n await this.connection!.unstable_setSessionModel({\n sessionId: this.session.sessionId,\n modelId: this.options.model,\n });\n }\n }\n\n private getInitializeRequest(): InitializeRequest {\n return {\n protocolVersion: PROTOCOL_VERSION,\n clientCapabilities: {\n fs: { readTextFile: true, writeTextFile: true },\n },\n clientInfo: {\n name: '@mastra/acp',\n version: '0.1.0',\n },\n ...this.options.initialize,\n };\n }\n\n private getNewSessionRequest(): NewSessionRequest {\n return {\n cwd: this.options.cwd ?? process.cwd(),\n mcpServers: [],\n ...this.options.session,\n };\n }\n\n private throwIfPromptDidNotComplete(response: PromptResponse): void {\n if (response.stopReason === 'end_turn') {\n return;\n }\n\n throw new Error(`ACP prompt stopped before completing: ${response.stopReason}`);\n }\n\n private withStderr(error: unknown): Error {\n const stderr = this.stderr.trim();\n\n if (error instanceof Error) {\n if (stderr && !error.message.includes(stderr)) {\n error.message = `${error.message}\\n\\nACP agent stderr:\\n${stderr}`;\n }\n\n return error;\n }\n\n return new Error(stderr ? `${String(error)}\\n\\nACP agent stderr:\\n${stderr}` : String(error));\n }\n}\n\ntype AsyncQueue<T> = AsyncIterable<T> & {\n close: () => void;\n push: (value: T) => void;\n throw: (error: unknown) => void;\n};\n\nfunction createAsyncQueue<T>(): AsyncQueue<T> {\n const values: T[] = [];\n const waiters: Array<{\n resolve: (value: IteratorResult<T>) => void;\n reject: (error: unknown) => void;\n }> = [];\n let closed = false;\n let error: unknown;\n\n const next = (): Promise<IteratorResult<T>> => {\n if (values.length > 0) {\n return Promise.resolve({ value: values.shift()!, done: false });\n }\n\n if (error) {\n return Promise.reject(error);\n }\n\n if (closed) {\n return Promise.resolve({ value: undefined, done: true });\n }\n\n return new Promise((resolve, reject) => {\n waiters.push({ resolve, reject });\n });\n };\n\n return {\n push(value) {\n const waiter = waiters.shift();\n if (waiter) {\n waiter.resolve({ value, done: false });\n return;\n }\n\n values.push(value);\n },\n close() {\n closed = true;\n for (const waiter of waiters.splice(0)) {\n waiter.resolve({ value: undefined, done: true });\n }\n },\n throw(queueError) {\n error = queueError;\n for (const waiter of waiters.splice(0)) {\n waiter.reject(queueError);\n }\n },\n [Symbol.asyncIterator]() {\n return { next };\n },\n };\n}\n\nfunction selectedPermissionOutcome(option: PermissionOption): RequestPermissionResponse['outcome'] {\n return { outcome: 'selected', optionId: option.optionId };\n}\n","import { ReadableStream } from 'node:stream/web';\n\nimport type { ModelInfo, SessionUpdate } from '@agentclientprotocol/sdk';\nimport type {\n AgentGenerateOptions,\n AgentInstructions,\n AgentStreamOptions,\n MastraLanguageModel,\n SubAgent,\n SubAgentGenerateResult,\n SubAgentStreamResult,\n} from '@mastra/core/agent';\nimport { MessageList, coreContentToString } from '@mastra/core/agent/message-list';\nimport type { MessageListInput } from '@mastra/core/agent/message-list';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { ChunkType } from '@mastra/core/stream';\nimport type { DynamicArgument } from '@mastra/core/types';\n\nimport { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nconst CHUNK_FROM_AGENT = 'AGENT' as ChunkType['from'];\ntype AcpToolResult = Extract<NonNullable<SubAgentStreamResult['toolResults']>, unknown[]>[number];\n\nconst model = {\n modelId: 'acp-agent',\n provider: '@mastra/acp',\n specificationVersion: 'v3',\n supportedUrls: {},\n doGenerate: async () => ({\n stream: new ReadableStream({\n start: async controller => {\n controller.close();\n },\n }),\n }),\n doStream: async () => ({\n stream: new ReadableStream({\n start: async controller => {\n controller.close();\n },\n }),\n }),\n} as const satisfies MastraLanguageModel;\n\nexport type AcpAgentOptions = CreateACPToolOptions & {\n name?: string;\n};\n\nexport class AcpAgent<\n TId extends string = string,\n TRequestContext extends Record<string, any> | unknown = unknown,\n> implements SubAgent<TId, TRequestContext> {\n readonly id: TId;\n readonly name: string;\n readonly connection: ACPConnection;\n readonly description: string;\n\n constructor(options: AcpAgentOptions) {\n this.id = options.id as TId;\n this.name = options.name ?? options.id;\n this.description = options.description;\n this.connection = new ACPConnection(options);\n }\n\n __registerMastra(_mastra: Mastra): void {}\n\n getDescription(): string {\n return this.description;\n }\n\n getModel(): ReturnType<SubAgent<TId, TRequestContext>['getModel']> {\n return model;\n }\n\n hasOwnMemory(): boolean {\n return false;\n }\n\n __setMemory(_memory: DynamicArgument<any, any>): void {}\n\n getMemory(): undefined {\n return undefined;\n }\n\n getInstructions(): string {\n return '';\n }\n\n async getAvailableModels(): Promise<ModelInfo[]> {\n return this.connection.getAvailableModels();\n }\n\n async setModel(modelId: string): Promise<void> {\n return this.connection.setModel(modelId);\n }\n\n async generate(messages: MessageListInput, options?: AgentGenerateOptions): Promise<SubAgentGenerateResult> {\n const prompt = this.getPrompt(messages, options?.instructions);\n const text = await this.connection.prompt(\n prompt,\n (options as { abortSignal?: AbortSignal } | undefined)?.abortSignal,\n );\n const messageList = this.createMessageList(messages, text);\n\n return {\n text,\n response: {\n dbMessages: messageList.get.response.db(),\n },\n toolResults: [],\n finishReason: 'stop',\n runId: options?.runId ?? globalThis.crypto.randomUUID(),\n };\n }\n\n async resumeGenerate(): Promise<SubAgentGenerateResult> {\n throw new Error('AcpAgent does not support resuming suspended generate calls');\n }\n\n async resumeStream(): Promise<SubAgentStreamResult> {\n throw new Error('AcpAgent does not support resuming suspended stream calls');\n }\n\n async stream(messages: MessageListInput, options?: AgentStreamOptions): Promise<SubAgentStreamResult> {\n const runId = options?.runId ?? globalThis.crypto.randomUUID();\n const prompt = this.getPrompt(messages, options?.instructions);\n const signal = (options as { abortSignal?: AbortSignal } | undefined)?.abortSignal;\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n\n let resolveText!: (text: string) => void;\n let rejectText!: (error: unknown) => void;\n const textPromise = new Promise<string>((resolve, reject) => {\n resolveText = resolve;\n rejectText = reject;\n });\n // Callers that only read fullStream never await text; keep its rejection handled.\n textPromise.catch(() => {});\n\n const fullStream = new ReadableStream<ChunkType>({\n start: async controller => {\n const textId = globalThis.crypto.randomUUID();\n const chunks: string[] = [];\n const toolNames = new Map<string, string>();\n const toolResults: AcpToolResult[] = [];\n\n try {\n controller.enqueue({ type: 'text-start', runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });\n\n for await (const event of this.connection.promptStream(prompt, signal)) {\n if (event.type === 'text') {\n chunks.push(event.text);\n controller.enqueue({\n type: 'text-delta',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: { id: textId, text: event.text },\n });\n } else if (event.type === 'session-update') {\n for (const chunk of getMastraChunksFromACPUpdate(event.update, runId, toolNames)) {\n if (chunk.type === 'tool-result') {\n toolResults.push({ payload: chunk.payload });\n }\n controller.enqueue(chunk);\n }\n }\n }\n\n const text = chunks.join('');\n messageList.add([{ role: 'assistant', content: text }], 'response');\n\n controller.enqueue({ type: 'text-end', runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });\n controller.enqueue(createFinishChunk('step-finish', runId));\n controller.enqueue(createFinishChunk('finish', runId));\n await options?.onFinish?.(createOnFinishResult({ text, runId, messageList, toolResults }) as any);\n resolveText(text);\n controller.close();\n } catch (error) {\n rejectText(error);\n try {\n const text = chunks.join('');\n await options?.onFinish?.(createOnFinishResult({ text, runId, messageList, toolResults, error }) as any);\n } finally {\n controller.error(error);\n }\n }\n },\n });\n\n return {\n fullStream,\n text: textPromise,\n messageList,\n toolResults: [],\n runId,\n };\n }\n\n private getPrompt(messages: MessageListInput, instructions?: AgentInstructions): string {\n const prompt = extractText(messages);\n const instructionText = instructions ? extractInstructions(instructions) : '';\n\n if (!instructionText) {\n return prompt;\n }\n\n return `${instructionText}\\n\\n${prompt}`;\n }\n\n private createMessageList(messages: MessageListInput, text: string): MessageList {\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n messageList.add([{ role: 'assistant', content: text }], 'response');\n return messageList;\n }\n}\n\nfunction extractText(messages: MessageListInput): string {\n if (typeof messages === 'string') {\n return messages;\n }\n\n if (Array.isArray(messages) && messages.every(message => typeof message === 'string')) {\n return messages.join('\\n');\n }\n\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n\n return messageList.get.all\n .core()\n .map(message => coreContentToString(message.content))\n .filter(Boolean)\n .join('\\n');\n}\n\nfunction extractInstructions(instructions: AgentInstructions): string {\n if (typeof instructions === 'string') {\n return instructions;\n }\n\n if (Array.isArray(instructions)) {\n return instructions.map(instruction => extractInstructions(instruction)).join('\\n');\n }\n\n return coreContentToString(instructions.content);\n}\n\nfunction getMastraChunksFromACPUpdate(\n update: SessionUpdate,\n runId: string,\n toolNames: Map<string, string>,\n): ChunkType[] {\n switch (update.sessionUpdate) {\n case 'tool_call': {\n const toolName = getToolName(update, toolNames);\n toolNames.set(update.toolCallId, toolName);\n\n return [\n {\n type: 'tool-call',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n args: toRecord(update.rawInput),\n },\n },\n ];\n }\n case 'tool_call_update': {\n const toolName = getToolName(update, toolNames);\n\n if (update.status === 'completed' || update.status === 'failed') {\n return [\n {\n type: 'tool-result',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n result: update.rawOutput ?? update.content ?? { status: update.status, title: update.title },\n isError: update.status === 'failed',\n },\n },\n ];\n }\n\n return [\n {\n type: 'tool-call-delta',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n argsTextDelta: update.title ?? update.status ?? '',\n },\n },\n ];\n }\n default:\n return [];\n }\n}\n\nfunction getToolName(\n update: Extract<SessionUpdate, { sessionUpdate: 'tool_call' | 'tool_call_update' }>,\n toolNames: Map<string, string>,\n): string {\n return update.title ?? toolNames.get(update.toolCallId) ?? update.kind ?? 'acp_tool';\n}\n\nfunction toRecord(value: unknown): Record<string, unknown> {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n\n if (value === undefined) {\n return {};\n }\n\n return { input: value };\n}\n\nfunction createOnFinishResult({\n text,\n runId,\n messageList,\n toolResults,\n error,\n}: {\n text: string;\n runId: string;\n messageList: MessageList;\n toolResults: AcpToolResult[];\n error?: unknown;\n}) {\n const usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n\n return {\n text,\n finishReason: 'stop',\n usage,\n totalUsage: usage,\n warnings: [],\n response: {\n messages: messageList.get.response.aiV5.model(),\n },\n steps: [],\n toolResults,\n runId,\n ...(error === undefined ? {} : { error }),\n };\n}\n\nfunction createFinishChunk(type: 'step-finish' | 'finish', runId: string): ChunkType {\n return {\n type,\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n id: globalThis.crypto.randomUUID(),\n output: {\n steps: [],\n usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n },\n stepResult: {\n reason: 'stop',\n warnings: [],\n isContinued: false,\n },\n metadata: {},\n messages: { nonUser: [], all: [] },\n },\n } as unknown as ChunkType;\n}\n","import { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nexport class ACPToolSession {\n private connection?: ACPConnection;\n\n constructor(private readonly options: CreateACPToolOptions) {}\n\n getConnection(workspace: CreateACPToolOptions['workspace']): ACPConnection {\n if (this.options.persistSession === false) {\n return this.createConnection(workspace);\n }\n\n this.connection ??= this.createConnection(workspace);\n return this.connection;\n }\n\n private createConnection(workspace: CreateACPToolOptions['workspace']): ACPConnection {\n return new ACPConnection({\n ...this.options,\n workspace: workspace ?? this.options.workspace,\n });\n }\n}\n","import { compileSchema } from '@internal/types-builder/compile-zod';\nimport { createTool } from '@mastra/core/tools';\nimport { z } from 'zod/v4';\n\nimport { ACPToolSession } from './session';\nimport type { CreateACPToolOptions } from './types';\n\nexport function createACPTool(options: CreateACPToolOptions) {\n const session = new ACPToolSession(options);\n\n return createTool({\n id: options.id,\n description: options.description,\n inputSchema: compileSchema(\n z.object({\n task: z.string().describe('The task to send to the ACP agent'),\n }),\n ),\n outputSchema: compileSchema(\n z.object({\n output: z.string().describe('The output of the ACP agent'),\n }),\n ),\n suspendSchema: compileSchema(\n z.object({\n permissionRequest: z.object({\n title: z.string().describe('The title of the permission request'),\n options: z.array(\n z.object({\n optionId: z.string().describe('The option id to select'),\n name: z.string().describe('The title of the permission request'),\n }),\n ),\n }),\n }),\n ),\n resumeSchema: compileSchema(\n z.union([\n z.object({\n optionId: z.string().optional().describe('The option id to select'),\n outcome: z.literal('selected').optional().describe('The outcome of the permission request'),\n }),\n z.object({\n outcome: z.literal('cancelled').optional().describe('The outcome of the permission request'),\n }),\n ]),\n ),\n execute: async ({ task }, context) => {\n const workspace = await context?.mastra?.getWorkspace();\n const connection = session.getConnection(workspace);\n const output = await connection.prompt(task, context?.abortSignal);\n\n return { output };\n },\n });\n}\n"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -6,7 +6,7 @@ import { Readable, Writable } from "stream";
|
|
|
6
6
|
import { ClientSideConnection, PROTOCOL_VERSION, ndJsonStream } from "@agentclientprotocol/sdk";
|
|
7
7
|
import { LocalFilesystem, Workspace } from "@mastra/core/workspace";
|
|
8
8
|
import { createTool } from "@mastra/core/tools";
|
|
9
|
-
|
|
9
|
+
// src/connection.ts
|
|
10
10
|
var ACPClient = class {
|
|
11
11
|
getPromptState;
|
|
12
12
|
workspace;
|
|
@@ -298,8 +298,7 @@ function selectedPermissionOutcome(option) {
|
|
|
298
298
|
optionId: option.optionId
|
|
299
299
|
};
|
|
300
300
|
}
|
|
301
|
-
|
|
302
|
-
//#region src/agent.ts
|
|
301
|
+
// src/agent.ts
|
|
303
302
|
const CHUNK_FROM_AGENT = "AGENT";
|
|
304
303
|
const model = {
|
|
305
304
|
modelId: "acp-agent",
|
|
@@ -575,8 +574,7 @@ function createFinishChunk(type, runId) {
|
|
|
575
574
|
}
|
|
576
575
|
};
|
|
577
576
|
}
|
|
578
|
-
|
|
579
|
-
//#region src/session.ts
|
|
577
|
+
// src/session.ts
|
|
580
578
|
var ACPToolSession = class {
|
|
581
579
|
options;
|
|
582
580
|
connection;
|
|
@@ -595,8 +593,7 @@ var ACPToolSession = class {
|
|
|
595
593
|
});
|
|
596
594
|
}
|
|
597
595
|
};
|
|
598
|
-
|
|
599
|
-
//#region src/tool.ts
|
|
596
|
+
// src/tool.ts
|
|
600
597
|
function createACPTool(options) {
|
|
601
598
|
const session = new ACPToolSession(options);
|
|
602
599
|
return createTool({
|
|
@@ -682,7 +679,6 @@ function createACPTool(options) {
|
|
|
682
679
|
}
|
|
683
680
|
});
|
|
684
681
|
}
|
|
685
|
-
//#endregion
|
|
686
682
|
export { AcpAgent, createACPTool };
|
|
687
683
|
|
|
688
684
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/connection.ts","../src/agent.ts","../src/session.ts","../src/tool.ts"],"sourcesContent":["import { spawn } from 'node:child_process';\nimport type { ChildProcessWithoutNullStreams } from 'node:child_process';\nimport process from 'node:process';\nimport { Readable, Writable } from 'node:stream';\nimport { ClientSideConnection, ndJsonStream, PROTOCOL_VERSION } from '@agentclientprotocol/sdk';\nimport type {\n Client,\n InitializeRequest,\n ModelInfo,\n NewSessionRequest,\n NewSessionResponse,\n PermissionOption,\n PromptResponse,\n ReadTextFileRequest,\n ReadTextFileResponse,\n RequestPermissionRequest,\n RequestPermissionResponse,\n SessionNotification,\n SessionUpdate,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from '@agentclientprotocol/sdk';\n\nimport { LocalFilesystem, Workspace } from '@mastra/core/workspace';\nimport type { CreateACPToolOptions } from './types';\n\nexport type ACPStreamEvent = { type: 'text'; text: string } | { type: 'session-update'; update: SessionUpdate };\n\ntype PromptState = {\n sessionId: string;\n onEvent?: (event: ACPStreamEvent) => void;\n};\n\nclass ACPClient implements Client {\n constructor(\n private readonly getPromptState: () => PromptState | undefined,\n private readonly workspace: Workspace,\n private readonly onPermissionRequest?: CreateACPToolOptions['onPermissionRequest'],\n ) {}\n\n async sessionUpdate(notification: SessionNotification): Promise<void> {\n const state = this.getPromptState();\n\n if (!state || notification.sessionId !== state.sessionId) {\n return;\n }\n\n const update = notification.update;\n\n if (update.sessionUpdate === 'agent_message_chunk') {\n if (update.content.type === 'text') {\n state.onEvent?.({ type: 'text', text: update.content.text });\n }\n } else {\n state.onEvent?.({ type: 'session-update', update });\n }\n }\n\n async requestPermission(request: RequestPermissionRequest): Promise<RequestPermissionResponse> {\n if (this.onPermissionRequest) {\n return this.onPermissionRequest(request);\n }\n\n const option = request.options[0];\n\n if (!option) {\n return { outcome: { outcome: 'cancelled' } };\n }\n\n return { outcome: selectedPermissionOutcome(option) };\n }\n\n async readTextFile(params: ReadTextFileRequest): Promise<ReadTextFileResponse> {\n let content = await this.workspace.filesystem?.readFile(params.path);\n\n if (!(typeof content === 'string')) {\n const decoder = new TextDecoder('utf-8');\n content = decoder.decode(content);\n }\n\n if (params.line != null || params.limit != null) {\n const lines = content.split('\\n');\n const start = (params.line ?? 1) - 1;\n const end = params.limit != null ? start + params.limit : lines.length;\n return { content: lines.slice(start, end).join('\\n') };\n }\n\n return { content };\n }\n\n async writeTextFile(params: WriteTextFileRequest): Promise<WriteTextFileResponse> {\n await this.workspace.filesystem?.writeFile(params.path, params.content);\n\n return {};\n }\n}\n\nexport class ACPConnection {\n readonly options: CreateACPToolOptions;\n\n private agentProcess?: ChildProcessWithoutNullStreams;\n private connection?: ClientSideConnection;\n private session?: NewSessionResponse;\n private initializePromise?: Promise<void>;\n private currentPrompt?: PromptState;\n private stderr = '';\n\n constructor(options: CreateACPToolOptions) {\n this.options = options;\n }\n\n get sessionId(): string | undefined {\n return this.session?.sessionId;\n }\n\n async getAvailableModels(): Promise<ModelInfo[]> {\n await this.ensureConnected();\n return this.session?.models?.availableModels ?? [];\n }\n\n async setModel(modelId: string): Promise<void> {\n await this.ensureConnected();\n\n const available = this.session?.models?.availableModels;\n\n if (available && !available.some(m => m.modelId === modelId)) {\n const ids = available.map(m => m.modelId).join(', ') || '(none)';\n throw new Error(`Model \"${modelId}\" is not available. Available models: ${ids}`);\n }\n\n await this.connection!.unstable_setSessionModel({\n sessionId: this.session!.sessionId,\n modelId,\n });\n }\n\n async prompt(task: string, signal?: AbortSignal): Promise<string> {\n const parts: string[] = [];\n\n for await (const event of this.promptStream(task, signal)) {\n if (event.type === 'text') {\n parts.push(event.text);\n }\n }\n\n return parts.join('');\n }\n\n async *promptStream(task: string, signal?: AbortSignal): AsyncGenerator<ACPStreamEvent> {\n await this.ensureConnected();\n\n const sessionId = this.session?.sessionId;\n\n if (!this.connection || !sessionId) {\n throw new Error('ACP connection is not initialized');\n }\n\n if (signal?.aborted) {\n await this.cancel();\n throw signal.reason ?? new Error('ACP prompt aborted');\n }\n\n const queue = createAsyncQueue<ACPStreamEvent>();\n const state: PromptState = {\n sessionId,\n onEvent: event => queue.push(event),\n };\n this.currentPrompt = state;\n\n const abortHandler = () => {\n void this.cancel();\n queue.throw(signal?.reason ?? new Error('ACP prompt aborted'));\n };\n\n signal?.addEventListener('abort', abortHandler, { once: true });\n\n const responsePromise = this.connection\n .prompt({\n sessionId,\n prompt: [{ type: 'text', text: task }],\n })\n .then(\n response => {\n try {\n this.throwIfPromptDidNotComplete(response);\n } catch (error) {\n queue.throw(error);\n return;\n }\n queue.close();\n },\n error => {\n queue.throw(this.withStderr(error));\n },\n );\n\n try {\n for await (const chunk of queue) {\n yield chunk;\n }\n\n await responsePromise;\n } catch (error) {\n await responsePromise.catch(() => undefined);\n throw error;\n } finally {\n signal?.removeEventListener('abort', abortHandler);\n if (this.currentPrompt === state) {\n this.currentPrompt = undefined;\n }\n\n if (this.options.persistSession === false) {\n this.disconnect();\n }\n }\n }\n\n async cancel(): Promise<void> {\n const sessionId = this.session?.sessionId;\n\n if (!this.connection || !sessionId) {\n return;\n }\n\n await this.connection.cancel({ sessionId });\n }\n\n disconnect(): void {\n this.connection = undefined;\n this.session = undefined;\n this.initializePromise = undefined;\n this.currentPrompt = undefined;\n\n if (this.agentProcess && !this.agentProcess.killed) {\n this.agentProcess.kill();\n }\n\n this.agentProcess = undefined;\n }\n\n private async ensureConnected(): Promise<void> {\n if (this.connection && this.session) {\n return;\n }\n\n this.initializePromise ??= this.initialize();\n await this.initializePromise;\n }\n\n private async initialize(): Promise<void> {\n this.stderr = '';\n this.agentProcess = spawn(this.options.command, this.options.args ?? [], {\n cwd: this.options.cwd,\n env: { ...process.env, ...this.options.env },\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n // Keep an 'error' listener attached for the lifetime of the process so a\n // failed spawn (e.g. ENOENT) rejects initialization instead of crashing\n // the host process with an unhandled 'error' event.\n const processFailure = new Promise<never>((_, reject) => {\n this.agentProcess!.on('error', error => {\n reject(error instanceof Error ? error : new Error(String(error)));\n });\n this.agentProcess!.on('exit', (code, signal) => {\n reject(new Error(`ACP agent process exited during initialization (code: ${code}, signal: ${signal})`));\n });\n });\n processFailure.catch(() => undefined);\n\n this.agentProcess.stderr.on('data', chunk => {\n this.stderr += String(chunk);\n });\n\n const stream = ndJsonStream(\n Writable.toWeb(this.agentProcess.stdin) as WritableStream<Uint8Array>,\n Readable.toWeb(this.agentProcess.stdout) as ReadableStream<Uint8Array>,\n );\n\n const workspace =\n this.options.workspace ??\n new Workspace({\n filesystem: new LocalFilesystem({ basePath: this.options.cwd ?? process.cwd() }),\n });\n\n try {\n this.connection = new ClientSideConnection(() => {\n const defaultClient = new ACPClient(() => this.currentPrompt, workspace, this.options.onPermissionRequest);\n return this.options.createClient?.(defaultClient) ?? defaultClient;\n }, stream);\n\n await Promise.race([processFailure, this.initializeSession()]);\n } catch (error) {\n this.disconnect();\n throw this.withStderr(error);\n }\n }\n\n private async initializeSession(): Promise<void> {\n await this.connection!.initialize(this.getInitializeRequest());\n\n if (this.options.authMethodId) {\n await this.connection!.authenticate({ methodId: this.options.authMethodId });\n }\n\n this.session = await this.connection!.newSession(this.getNewSessionRequest());\n\n if (this.options.model) {\n const available = this.session.models?.availableModels;\n\n if (available && !available.some(m => m.modelId === this.options.model)) {\n const ids = available.map(m => m.modelId).join(', ') || '(none)';\n throw new Error(`Model \"${this.options.model}\" is not available. Available models: ${ids}`);\n }\n\n await this.connection!.unstable_setSessionModel({\n sessionId: this.session.sessionId,\n modelId: this.options.model,\n });\n }\n }\n\n private getInitializeRequest(): InitializeRequest {\n return {\n protocolVersion: PROTOCOL_VERSION,\n clientCapabilities: {\n fs: { readTextFile: true, writeTextFile: true },\n },\n clientInfo: {\n name: '@mastra/acp',\n version: '0.1.0',\n },\n ...this.options.initialize,\n };\n }\n\n private getNewSessionRequest(): NewSessionRequest {\n return {\n cwd: this.options.cwd ?? process.cwd(),\n mcpServers: [],\n ...this.options.session,\n };\n }\n\n private throwIfPromptDidNotComplete(response: PromptResponse): void {\n if (response.stopReason === 'end_turn') {\n return;\n }\n\n throw new Error(`ACP prompt stopped before completing: ${response.stopReason}`);\n }\n\n private withStderr(error: unknown): Error {\n const stderr = this.stderr.trim();\n\n if (error instanceof Error) {\n if (stderr && !error.message.includes(stderr)) {\n error.message = `${error.message}\\n\\nACP agent stderr:\\n${stderr}`;\n }\n\n return error;\n }\n\n return new Error(stderr ? `${String(error)}\\n\\nACP agent stderr:\\n${stderr}` : String(error));\n }\n}\n\ntype AsyncQueue<T> = AsyncIterable<T> & {\n close: () => void;\n push: (value: T) => void;\n throw: (error: unknown) => void;\n};\n\nfunction createAsyncQueue<T>(): AsyncQueue<T> {\n const values: T[] = [];\n const waiters: Array<{\n resolve: (value: IteratorResult<T>) => void;\n reject: (error: unknown) => void;\n }> = [];\n let closed = false;\n let error: unknown;\n\n const next = (): Promise<IteratorResult<T>> => {\n if (values.length > 0) {\n return Promise.resolve({ value: values.shift()!, done: false });\n }\n\n if (error) {\n return Promise.reject(error);\n }\n\n if (closed) {\n return Promise.resolve({ value: undefined, done: true });\n }\n\n return new Promise((resolve, reject) => {\n waiters.push({ resolve, reject });\n });\n };\n\n return {\n push(value) {\n const waiter = waiters.shift();\n if (waiter) {\n waiter.resolve({ value, done: false });\n return;\n }\n\n values.push(value);\n },\n close() {\n closed = true;\n for (const waiter of waiters.splice(0)) {\n waiter.resolve({ value: undefined, done: true });\n }\n },\n throw(queueError) {\n error = queueError;\n for (const waiter of waiters.splice(0)) {\n waiter.reject(queueError);\n }\n },\n [Symbol.asyncIterator]() {\n return { next };\n },\n };\n}\n\nfunction selectedPermissionOutcome(option: PermissionOption): RequestPermissionResponse['outcome'] {\n return { outcome: 'selected', optionId: option.optionId };\n}\n","import { ReadableStream } from 'node:stream/web';\n\nimport type { ModelInfo, SessionUpdate } from '@agentclientprotocol/sdk';\nimport type {\n AgentGenerateOptions,\n AgentInstructions,\n AgentStreamOptions,\n MastraLanguageModel,\n SubAgent,\n SubAgentGenerateResult,\n SubAgentStreamResult,\n} from '@mastra/core/agent';\nimport { MessageList, coreContentToString } from '@mastra/core/agent/message-list';\nimport type { MessageListInput } from '@mastra/core/agent/message-list';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { ChunkType } from '@mastra/core/stream';\nimport type { DynamicArgument } from '@mastra/core/types';\n\nimport { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nconst CHUNK_FROM_AGENT = 'AGENT' as ChunkType['from'];\ntype AcpToolResult = Extract<NonNullable<SubAgentStreamResult['toolResults']>, unknown[]>[number];\n\nconst model = {\n modelId: 'acp-agent',\n provider: '@mastra/acp',\n specificationVersion: 'v3',\n supportedUrls: {},\n doGenerate: async () => ({\n stream: new ReadableStream({\n start: async controller => {\n controller.close();\n },\n }),\n }),\n doStream: async () => ({\n stream: new ReadableStream({\n start: async controller => {\n controller.close();\n },\n }),\n }),\n} as const satisfies MastraLanguageModel;\n\nexport type AcpAgentOptions = CreateACPToolOptions & {\n name?: string;\n};\n\nexport class AcpAgent<\n TId extends string = string,\n TRequestContext extends Record<string, any> | unknown = unknown,\n> implements SubAgent<TId, TRequestContext> {\n readonly id: TId;\n readonly name: string;\n readonly connection: ACPConnection;\n readonly description: string;\n\n constructor(options: AcpAgentOptions) {\n this.id = options.id as TId;\n this.name = options.name ?? options.id;\n this.description = options.description;\n this.connection = new ACPConnection(options);\n }\n\n __registerMastra(_mastra: Mastra): void {}\n\n getDescription(): string {\n return this.description;\n }\n\n getModel(): ReturnType<SubAgent<TId, TRequestContext>['getModel']> {\n return model;\n }\n\n hasOwnMemory(): boolean {\n return false;\n }\n\n __setMemory(_memory: DynamicArgument<any, any>): void {}\n\n getMemory(): undefined {\n return undefined;\n }\n\n getInstructions(): string {\n return '';\n }\n\n async getAvailableModels(): Promise<ModelInfo[]> {\n return this.connection.getAvailableModels();\n }\n\n async setModel(modelId: string): Promise<void> {\n return this.connection.setModel(modelId);\n }\n\n async generate(messages: MessageListInput, options?: AgentGenerateOptions): Promise<SubAgentGenerateResult> {\n const prompt = this.getPrompt(messages, options?.instructions);\n const text = await this.connection.prompt(\n prompt,\n (options as { abortSignal?: AbortSignal } | undefined)?.abortSignal,\n );\n const messageList = this.createMessageList(messages, text);\n\n return {\n text,\n response: {\n dbMessages: messageList.get.response.db(),\n },\n toolResults: [],\n finishReason: 'stop',\n runId: options?.runId ?? globalThis.crypto.randomUUID(),\n };\n }\n\n async resumeGenerate(): Promise<SubAgentGenerateResult> {\n throw new Error('AcpAgent does not support resuming suspended generate calls');\n }\n\n async resumeStream(): Promise<SubAgentStreamResult> {\n throw new Error('AcpAgent does not support resuming suspended stream calls');\n }\n\n async stream(messages: MessageListInput, options?: AgentStreamOptions): Promise<SubAgentStreamResult> {\n const runId = options?.runId ?? globalThis.crypto.randomUUID();\n const prompt = this.getPrompt(messages, options?.instructions);\n const signal = (options as { abortSignal?: AbortSignal } | undefined)?.abortSignal;\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n\n let resolveText!: (text: string) => void;\n let rejectText!: (error: unknown) => void;\n const textPromise = new Promise<string>((resolve, reject) => {\n resolveText = resolve;\n rejectText = reject;\n });\n // Callers that only read fullStream never await text; keep its rejection handled.\n textPromise.catch(() => {});\n\n const fullStream = new ReadableStream<ChunkType>({\n start: async controller => {\n const textId = globalThis.crypto.randomUUID();\n const chunks: string[] = [];\n const toolNames = new Map<string, string>();\n const toolResults: AcpToolResult[] = [];\n\n try {\n controller.enqueue({ type: 'text-start', runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });\n\n for await (const event of this.connection.promptStream(prompt, signal)) {\n if (event.type === 'text') {\n chunks.push(event.text);\n controller.enqueue({\n type: 'text-delta',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: { id: textId, text: event.text },\n });\n } else if (event.type === 'session-update') {\n for (const chunk of getMastraChunksFromACPUpdate(event.update, runId, toolNames)) {\n if (chunk.type === 'tool-result') {\n toolResults.push({ payload: chunk.payload });\n }\n controller.enqueue(chunk);\n }\n }\n }\n\n const text = chunks.join('');\n messageList.add([{ role: 'assistant', content: text }], 'response');\n\n controller.enqueue({ type: 'text-end', runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });\n controller.enqueue(createFinishChunk('step-finish', runId));\n controller.enqueue(createFinishChunk('finish', runId));\n await options?.onFinish?.(createOnFinishResult({ text, runId, messageList, toolResults }) as any);\n resolveText(text);\n controller.close();\n } catch (error) {\n rejectText(error);\n try {\n const text = chunks.join('');\n await options?.onFinish?.(createOnFinishResult({ text, runId, messageList, toolResults, error }) as any);\n } finally {\n controller.error(error);\n }\n }\n },\n });\n\n return {\n fullStream,\n text: textPromise,\n messageList,\n toolResults: [],\n runId,\n };\n }\n\n private getPrompt(messages: MessageListInput, instructions?: AgentInstructions): string {\n const prompt = extractText(messages);\n const instructionText = instructions ? extractInstructions(instructions) : '';\n\n if (!instructionText) {\n return prompt;\n }\n\n return `${instructionText}\\n\\n${prompt}`;\n }\n\n private createMessageList(messages: MessageListInput, text: string): MessageList {\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n messageList.add([{ role: 'assistant', content: text }], 'response');\n return messageList;\n }\n}\n\nfunction extractText(messages: MessageListInput): string {\n if (typeof messages === 'string') {\n return messages;\n }\n\n if (Array.isArray(messages) && messages.every(message => typeof message === 'string')) {\n return messages.join('\\n');\n }\n\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n\n return messageList.get.all\n .core()\n .map(message => coreContentToString(message.content))\n .filter(Boolean)\n .join('\\n');\n}\n\nfunction extractInstructions(instructions: AgentInstructions): string {\n if (typeof instructions === 'string') {\n return instructions;\n }\n\n if (Array.isArray(instructions)) {\n return instructions.map(instruction => extractInstructions(instruction)).join('\\n');\n }\n\n return coreContentToString(instructions.content);\n}\n\nfunction getMastraChunksFromACPUpdate(\n update: SessionUpdate,\n runId: string,\n toolNames: Map<string, string>,\n): ChunkType[] {\n switch (update.sessionUpdate) {\n case 'tool_call': {\n const toolName = getToolName(update, toolNames);\n toolNames.set(update.toolCallId, toolName);\n\n return [\n {\n type: 'tool-call',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n args: toRecord(update.rawInput),\n },\n },\n ];\n }\n case 'tool_call_update': {\n const toolName = getToolName(update, toolNames);\n\n if (update.status === 'completed' || update.status === 'failed') {\n return [\n {\n type: 'tool-result',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n result: update.rawOutput ?? update.content ?? { status: update.status, title: update.title },\n isError: update.status === 'failed',\n },\n },\n ];\n }\n\n return [\n {\n type: 'tool-call-delta',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n argsTextDelta: update.title ?? update.status ?? '',\n },\n },\n ];\n }\n default:\n return [];\n }\n}\n\nfunction getToolName(\n update: Extract<SessionUpdate, { sessionUpdate: 'tool_call' | 'tool_call_update' }>,\n toolNames: Map<string, string>,\n): string {\n return update.title ?? toolNames.get(update.toolCallId) ?? update.kind ?? 'acp_tool';\n}\n\nfunction toRecord(value: unknown): Record<string, unknown> {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n\n if (value === undefined) {\n return {};\n }\n\n return { input: value };\n}\n\nfunction createOnFinishResult({\n text,\n runId,\n messageList,\n toolResults,\n error,\n}: {\n text: string;\n runId: string;\n messageList: MessageList;\n toolResults: AcpToolResult[];\n error?: unknown;\n}) {\n const usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n\n return {\n text,\n finishReason: 'stop',\n usage,\n totalUsage: usage,\n warnings: [],\n response: {\n messages: messageList.get.response.aiV5.model(),\n },\n steps: [],\n toolResults,\n runId,\n ...(error === undefined ? {} : { error }),\n };\n}\n\nfunction createFinishChunk(type: 'step-finish' | 'finish', runId: string): ChunkType {\n return {\n type,\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n id: globalThis.crypto.randomUUID(),\n output: {\n steps: [],\n usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n },\n stepResult: {\n reason: 'stop',\n warnings: [],\n isContinued: false,\n },\n metadata: {},\n messages: { nonUser: [], all: [] },\n },\n } as unknown as ChunkType;\n}\n","import { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nexport class ACPToolSession {\n private connection?: ACPConnection;\n\n constructor(private readonly options: CreateACPToolOptions) {}\n\n getConnection(workspace: CreateACPToolOptions['workspace']): ACPConnection {\n if (this.options.persistSession === false) {\n return this.createConnection(workspace);\n }\n\n this.connection ??= this.createConnection(workspace);\n return this.connection;\n }\n\n private createConnection(workspace: CreateACPToolOptions['workspace']): ACPConnection {\n return new ACPConnection({\n ...this.options,\n workspace: workspace ?? this.options.workspace,\n });\n }\n}\n","import { compileSchema } from '@internal/types-builder/compile-zod';\nimport { createTool } from '@mastra/core/tools';\nimport { z } from 'zod/v4';\n\nimport { ACPToolSession } from './session';\nimport type { CreateACPToolOptions } from './types';\n\nexport function createACPTool(options: CreateACPToolOptions) {\n const session = new ACPToolSession(options);\n\n return createTool({\n id: options.id,\n description: options.description,\n inputSchema: compileSchema(\n z.object({\n task: z.string().describe('The task to send to the ACP agent'),\n }),\n ),\n outputSchema: compileSchema(\n z.object({\n output: z.string().describe('The output of the ACP agent'),\n }),\n ),\n suspendSchema: compileSchema(\n z.object({\n permissionRequest: z.object({\n title: z.string().describe('The title of the permission request'),\n options: z.array(\n z.object({\n optionId: z.string().describe('The option id to select'),\n name: z.string().describe('The title of the permission request'),\n }),\n ),\n }),\n }),\n ),\n resumeSchema: compileSchema(\n z.union([\n z.object({\n optionId: z.string().optional().describe('The option id to select'),\n outcome: z.literal('selected').optional().describe('The outcome of the permission request'),\n }),\n z.object({\n outcome: z.literal('cancelled').optional().describe('The outcome of the permission request'),\n }),\n ]),\n ),\n execute: async ({ task }, context) => {\n const workspace = await context?.mastra?.getWorkspace();\n const connection = session.getConnection(workspace);\n const output = await connection.prompt(task, context?.abortSignal);\n\n return { output };\n },\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/connection.ts","../src/agent.ts","../src/session.ts","../src/tool.ts"],"sourcesContent":["import { spawn } from 'node:child_process';\nimport type { ChildProcessWithoutNullStreams } from 'node:child_process';\nimport process from 'node:process';\nimport { Readable, Writable } from 'node:stream';\nimport { ClientSideConnection, ndJsonStream, PROTOCOL_VERSION } from '@agentclientprotocol/sdk';\nimport type {\n Client,\n InitializeRequest,\n ModelInfo,\n NewSessionRequest,\n NewSessionResponse,\n PermissionOption,\n PromptResponse,\n ReadTextFileRequest,\n ReadTextFileResponse,\n RequestPermissionRequest,\n RequestPermissionResponse,\n SessionNotification,\n SessionUpdate,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from '@agentclientprotocol/sdk';\n\nimport { LocalFilesystem, Workspace } from '@mastra/core/workspace';\nimport type { CreateACPToolOptions } from './types';\n\nexport type ACPStreamEvent = { type: 'text'; text: string } | { type: 'session-update'; update: SessionUpdate };\n\ntype PromptState = {\n sessionId: string;\n onEvent?: (event: ACPStreamEvent) => void;\n};\n\nclass ACPClient implements Client {\n constructor(\n private readonly getPromptState: () => PromptState | undefined,\n private readonly workspace: Workspace,\n private readonly onPermissionRequest?: CreateACPToolOptions['onPermissionRequest'],\n ) {}\n\n async sessionUpdate(notification: SessionNotification): Promise<void> {\n const state = this.getPromptState();\n\n if (!state || notification.sessionId !== state.sessionId) {\n return;\n }\n\n const update = notification.update;\n\n if (update.sessionUpdate === 'agent_message_chunk') {\n if (update.content.type === 'text') {\n state.onEvent?.({ type: 'text', text: update.content.text });\n }\n } else {\n state.onEvent?.({ type: 'session-update', update });\n }\n }\n\n async requestPermission(request: RequestPermissionRequest): Promise<RequestPermissionResponse> {\n if (this.onPermissionRequest) {\n return this.onPermissionRequest(request);\n }\n\n const option = request.options[0];\n\n if (!option) {\n return { outcome: { outcome: 'cancelled' } };\n }\n\n return { outcome: selectedPermissionOutcome(option) };\n }\n\n async readTextFile(params: ReadTextFileRequest): Promise<ReadTextFileResponse> {\n let content = await this.workspace.filesystem?.readFile(params.path);\n\n if (!(typeof content === 'string')) {\n const decoder = new TextDecoder('utf-8');\n content = decoder.decode(content);\n }\n\n if (params.line != null || params.limit != null) {\n const lines = content.split('\\n');\n const start = (params.line ?? 1) - 1;\n const end = params.limit != null ? start + params.limit : lines.length;\n return { content: lines.slice(start, end).join('\\n') };\n }\n\n return { content };\n }\n\n async writeTextFile(params: WriteTextFileRequest): Promise<WriteTextFileResponse> {\n await this.workspace.filesystem?.writeFile(params.path, params.content);\n\n return {};\n }\n}\n\nexport class ACPConnection {\n readonly options: CreateACPToolOptions;\n\n private agentProcess?: ChildProcessWithoutNullStreams;\n private connection?: ClientSideConnection;\n private session?: NewSessionResponse;\n private initializePromise?: Promise<void>;\n private currentPrompt?: PromptState;\n private stderr = '';\n\n constructor(options: CreateACPToolOptions) {\n this.options = options;\n }\n\n get sessionId(): string | undefined {\n return this.session?.sessionId;\n }\n\n async getAvailableModels(): Promise<ModelInfo[]> {\n await this.ensureConnected();\n return this.session?.models?.availableModels ?? [];\n }\n\n async setModel(modelId: string): Promise<void> {\n await this.ensureConnected();\n\n const available = this.session?.models?.availableModels;\n\n if (available && !available.some(m => m.modelId === modelId)) {\n const ids = available.map(m => m.modelId).join(', ') || '(none)';\n throw new Error(`Model \"${modelId}\" is not available. Available models: ${ids}`);\n }\n\n await this.connection!.unstable_setSessionModel({\n sessionId: this.session!.sessionId,\n modelId,\n });\n }\n\n async prompt(task: string, signal?: AbortSignal): Promise<string> {\n const parts: string[] = [];\n\n for await (const event of this.promptStream(task, signal)) {\n if (event.type === 'text') {\n parts.push(event.text);\n }\n }\n\n return parts.join('');\n }\n\n async *promptStream(task: string, signal?: AbortSignal): AsyncGenerator<ACPStreamEvent> {\n await this.ensureConnected();\n\n const sessionId = this.session?.sessionId;\n\n if (!this.connection || !sessionId) {\n throw new Error('ACP connection is not initialized');\n }\n\n if (signal?.aborted) {\n await this.cancel();\n throw signal.reason ?? new Error('ACP prompt aborted');\n }\n\n const queue = createAsyncQueue<ACPStreamEvent>();\n const state: PromptState = {\n sessionId,\n onEvent: event => queue.push(event),\n };\n this.currentPrompt = state;\n\n const abortHandler = () => {\n void this.cancel();\n queue.throw(signal?.reason ?? new Error('ACP prompt aborted'));\n };\n\n signal?.addEventListener('abort', abortHandler, { once: true });\n\n const responsePromise = this.connection\n .prompt({\n sessionId,\n prompt: [{ type: 'text', text: task }],\n })\n .then(\n response => {\n try {\n this.throwIfPromptDidNotComplete(response);\n } catch (error) {\n queue.throw(error);\n return;\n }\n queue.close();\n },\n error => {\n queue.throw(this.withStderr(error));\n },\n );\n\n try {\n for await (const chunk of queue) {\n yield chunk;\n }\n\n await responsePromise;\n } catch (error) {\n await responsePromise.catch(() => undefined);\n throw error;\n } finally {\n signal?.removeEventListener('abort', abortHandler);\n if (this.currentPrompt === state) {\n this.currentPrompt = undefined;\n }\n\n if (this.options.persistSession === false) {\n this.disconnect();\n }\n }\n }\n\n async cancel(): Promise<void> {\n const sessionId = this.session?.sessionId;\n\n if (!this.connection || !sessionId) {\n return;\n }\n\n await this.connection.cancel({ sessionId });\n }\n\n disconnect(): void {\n this.connection = undefined;\n this.session = undefined;\n this.initializePromise = undefined;\n this.currentPrompt = undefined;\n\n if (this.agentProcess && !this.agentProcess.killed) {\n this.agentProcess.kill();\n }\n\n this.agentProcess = undefined;\n }\n\n private async ensureConnected(): Promise<void> {\n if (this.connection && this.session) {\n return;\n }\n\n this.initializePromise ??= this.initialize();\n await this.initializePromise;\n }\n\n private async initialize(): Promise<void> {\n this.stderr = '';\n this.agentProcess = spawn(this.options.command, this.options.args ?? [], {\n cwd: this.options.cwd,\n env: { ...process.env, ...this.options.env },\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n // Keep an 'error' listener attached for the lifetime of the process so a\n // failed spawn (e.g. ENOENT) rejects initialization instead of crashing\n // the host process with an unhandled 'error' event.\n const processFailure = new Promise<never>((_, reject) => {\n this.agentProcess!.on('error', error => {\n reject(error instanceof Error ? error : new Error(String(error)));\n });\n this.agentProcess!.on('exit', (code, signal) => {\n reject(new Error(`ACP agent process exited during initialization (code: ${code}, signal: ${signal})`));\n });\n });\n processFailure.catch(() => undefined);\n\n this.agentProcess.stderr.on('data', chunk => {\n this.stderr += String(chunk);\n });\n\n const stream = ndJsonStream(\n Writable.toWeb(this.agentProcess.stdin) as WritableStream<Uint8Array>,\n Readable.toWeb(this.agentProcess.stdout) as ReadableStream<Uint8Array>,\n );\n\n const workspace =\n this.options.workspace ??\n new Workspace({\n filesystem: new LocalFilesystem({ basePath: this.options.cwd ?? process.cwd() }),\n });\n\n try {\n this.connection = new ClientSideConnection(() => {\n const defaultClient = new ACPClient(() => this.currentPrompt, workspace, this.options.onPermissionRequest);\n return this.options.createClient?.(defaultClient) ?? defaultClient;\n }, stream);\n\n await Promise.race([processFailure, this.initializeSession()]);\n } catch (error) {\n this.disconnect();\n throw this.withStderr(error);\n }\n }\n\n private async initializeSession(): Promise<void> {\n await this.connection!.initialize(this.getInitializeRequest());\n\n if (this.options.authMethodId) {\n await this.connection!.authenticate({ methodId: this.options.authMethodId });\n }\n\n this.session = await this.connection!.newSession(this.getNewSessionRequest());\n\n if (this.options.model) {\n const available = this.session.models?.availableModels;\n\n if (available && !available.some(m => m.modelId === this.options.model)) {\n const ids = available.map(m => m.modelId).join(', ') || '(none)';\n throw new Error(`Model \"${this.options.model}\" is not available. Available models: ${ids}`);\n }\n\n await this.connection!.unstable_setSessionModel({\n sessionId: this.session.sessionId,\n modelId: this.options.model,\n });\n }\n }\n\n private getInitializeRequest(): InitializeRequest {\n return {\n protocolVersion: PROTOCOL_VERSION,\n clientCapabilities: {\n fs: { readTextFile: true, writeTextFile: true },\n },\n clientInfo: {\n name: '@mastra/acp',\n version: '0.1.0',\n },\n ...this.options.initialize,\n };\n }\n\n private getNewSessionRequest(): NewSessionRequest {\n return {\n cwd: this.options.cwd ?? process.cwd(),\n mcpServers: [],\n ...this.options.session,\n };\n }\n\n private throwIfPromptDidNotComplete(response: PromptResponse): void {\n if (response.stopReason === 'end_turn') {\n return;\n }\n\n throw new Error(`ACP prompt stopped before completing: ${response.stopReason}`);\n }\n\n private withStderr(error: unknown): Error {\n const stderr = this.stderr.trim();\n\n if (error instanceof Error) {\n if (stderr && !error.message.includes(stderr)) {\n error.message = `${error.message}\\n\\nACP agent stderr:\\n${stderr}`;\n }\n\n return error;\n }\n\n return new Error(stderr ? `${String(error)}\\n\\nACP agent stderr:\\n${stderr}` : String(error));\n }\n}\n\ntype AsyncQueue<T> = AsyncIterable<T> & {\n close: () => void;\n push: (value: T) => void;\n throw: (error: unknown) => void;\n};\n\nfunction createAsyncQueue<T>(): AsyncQueue<T> {\n const values: T[] = [];\n const waiters: Array<{\n resolve: (value: IteratorResult<T>) => void;\n reject: (error: unknown) => void;\n }> = [];\n let closed = false;\n let error: unknown;\n\n const next = (): Promise<IteratorResult<T>> => {\n if (values.length > 0) {\n return Promise.resolve({ value: values.shift()!, done: false });\n }\n\n if (error) {\n return Promise.reject(error);\n }\n\n if (closed) {\n return Promise.resolve({ value: undefined, done: true });\n }\n\n return new Promise((resolve, reject) => {\n waiters.push({ resolve, reject });\n });\n };\n\n return {\n push(value) {\n const waiter = waiters.shift();\n if (waiter) {\n waiter.resolve({ value, done: false });\n return;\n }\n\n values.push(value);\n },\n close() {\n closed = true;\n for (const waiter of waiters.splice(0)) {\n waiter.resolve({ value: undefined, done: true });\n }\n },\n throw(queueError) {\n error = queueError;\n for (const waiter of waiters.splice(0)) {\n waiter.reject(queueError);\n }\n },\n [Symbol.asyncIterator]() {\n return { next };\n },\n };\n}\n\nfunction selectedPermissionOutcome(option: PermissionOption): RequestPermissionResponse['outcome'] {\n return { outcome: 'selected', optionId: option.optionId };\n}\n","import { ReadableStream } from 'node:stream/web';\n\nimport type { ModelInfo, SessionUpdate } from '@agentclientprotocol/sdk';\nimport type {\n AgentGenerateOptions,\n AgentInstructions,\n AgentStreamOptions,\n MastraLanguageModel,\n SubAgent,\n SubAgentGenerateResult,\n SubAgentStreamResult,\n} from '@mastra/core/agent';\nimport { MessageList, coreContentToString } from '@mastra/core/agent/message-list';\nimport type { MessageListInput } from '@mastra/core/agent/message-list';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { ChunkType } from '@mastra/core/stream';\nimport type { DynamicArgument } from '@mastra/core/types';\n\nimport { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nconst CHUNK_FROM_AGENT = 'AGENT' as ChunkType['from'];\ntype AcpToolResult = Extract<NonNullable<SubAgentStreamResult['toolResults']>, unknown[]>[number];\n\nconst model = {\n modelId: 'acp-agent',\n provider: '@mastra/acp',\n specificationVersion: 'v3',\n supportedUrls: {},\n doGenerate: async () => ({\n stream: new ReadableStream({\n start: async controller => {\n controller.close();\n },\n }),\n }),\n doStream: async () => ({\n stream: new ReadableStream({\n start: async controller => {\n controller.close();\n },\n }),\n }),\n} as const satisfies MastraLanguageModel;\n\nexport type AcpAgentOptions = CreateACPToolOptions & {\n name?: string;\n};\n\nexport class AcpAgent<\n TId extends string = string,\n TRequestContext extends Record<string, any> | unknown = unknown,\n> implements SubAgent<TId, TRequestContext> {\n readonly id: TId;\n readonly name: string;\n readonly connection: ACPConnection;\n readonly description: string;\n\n constructor(options: AcpAgentOptions) {\n this.id = options.id as TId;\n this.name = options.name ?? options.id;\n this.description = options.description;\n this.connection = new ACPConnection(options);\n }\n\n __registerMastra(_mastra: Mastra): void {}\n\n getDescription(): string {\n return this.description;\n }\n\n getModel(): ReturnType<SubAgent<TId, TRequestContext>['getModel']> {\n return model;\n }\n\n hasOwnMemory(): boolean {\n return false;\n }\n\n __setMemory(_memory: DynamicArgument<any, any>): void {}\n\n getMemory(): undefined {\n return undefined;\n }\n\n getInstructions(): string {\n return '';\n }\n\n async getAvailableModels(): Promise<ModelInfo[]> {\n return this.connection.getAvailableModels();\n }\n\n async setModel(modelId: string): Promise<void> {\n return this.connection.setModel(modelId);\n }\n\n async generate(messages: MessageListInput, options?: AgentGenerateOptions): Promise<SubAgentGenerateResult> {\n const prompt = this.getPrompt(messages, options?.instructions);\n const text = await this.connection.prompt(\n prompt,\n (options as { abortSignal?: AbortSignal } | undefined)?.abortSignal,\n );\n const messageList = this.createMessageList(messages, text);\n\n return {\n text,\n response: {\n dbMessages: messageList.get.response.db(),\n },\n toolResults: [],\n finishReason: 'stop',\n runId: options?.runId ?? globalThis.crypto.randomUUID(),\n };\n }\n\n async resumeGenerate(): Promise<SubAgentGenerateResult> {\n throw new Error('AcpAgent does not support resuming suspended generate calls');\n }\n\n async resumeStream(): Promise<SubAgentStreamResult> {\n throw new Error('AcpAgent does not support resuming suspended stream calls');\n }\n\n async stream(messages: MessageListInput, options?: AgentStreamOptions): Promise<SubAgentStreamResult> {\n const runId = options?.runId ?? globalThis.crypto.randomUUID();\n const prompt = this.getPrompt(messages, options?.instructions);\n const signal = (options as { abortSignal?: AbortSignal } | undefined)?.abortSignal;\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n\n let resolveText!: (text: string) => void;\n let rejectText!: (error: unknown) => void;\n const textPromise = new Promise<string>((resolve, reject) => {\n resolveText = resolve;\n rejectText = reject;\n });\n // Callers that only read fullStream never await text; keep its rejection handled.\n textPromise.catch(() => {});\n\n const fullStream = new ReadableStream<ChunkType>({\n start: async controller => {\n const textId = globalThis.crypto.randomUUID();\n const chunks: string[] = [];\n const toolNames = new Map<string, string>();\n const toolResults: AcpToolResult[] = [];\n\n try {\n controller.enqueue({ type: 'text-start', runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });\n\n for await (const event of this.connection.promptStream(prompt, signal)) {\n if (event.type === 'text') {\n chunks.push(event.text);\n controller.enqueue({\n type: 'text-delta',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: { id: textId, text: event.text },\n });\n } else if (event.type === 'session-update') {\n for (const chunk of getMastraChunksFromACPUpdate(event.update, runId, toolNames)) {\n if (chunk.type === 'tool-result') {\n toolResults.push({ payload: chunk.payload });\n }\n controller.enqueue(chunk);\n }\n }\n }\n\n const text = chunks.join('');\n messageList.add([{ role: 'assistant', content: text }], 'response');\n\n controller.enqueue({ type: 'text-end', runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });\n controller.enqueue(createFinishChunk('step-finish', runId));\n controller.enqueue(createFinishChunk('finish', runId));\n await options?.onFinish?.(createOnFinishResult({ text, runId, messageList, toolResults }) as any);\n resolveText(text);\n controller.close();\n } catch (error) {\n rejectText(error);\n try {\n const text = chunks.join('');\n await options?.onFinish?.(createOnFinishResult({ text, runId, messageList, toolResults, error }) as any);\n } finally {\n controller.error(error);\n }\n }\n },\n });\n\n return {\n fullStream,\n text: textPromise,\n messageList,\n toolResults: [],\n runId,\n };\n }\n\n private getPrompt(messages: MessageListInput, instructions?: AgentInstructions): string {\n const prompt = extractText(messages);\n const instructionText = instructions ? extractInstructions(instructions) : '';\n\n if (!instructionText) {\n return prompt;\n }\n\n return `${instructionText}\\n\\n${prompt}`;\n }\n\n private createMessageList(messages: MessageListInput, text: string): MessageList {\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n messageList.add([{ role: 'assistant', content: text }], 'response');\n return messageList;\n }\n}\n\nfunction extractText(messages: MessageListInput): string {\n if (typeof messages === 'string') {\n return messages;\n }\n\n if (Array.isArray(messages) && messages.every(message => typeof message === 'string')) {\n return messages.join('\\n');\n }\n\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n\n return messageList.get.all\n .core()\n .map(message => coreContentToString(message.content))\n .filter(Boolean)\n .join('\\n');\n}\n\nfunction extractInstructions(instructions: AgentInstructions): string {\n if (typeof instructions === 'string') {\n return instructions;\n }\n\n if (Array.isArray(instructions)) {\n return instructions.map(instruction => extractInstructions(instruction)).join('\\n');\n }\n\n return coreContentToString(instructions.content);\n}\n\nfunction getMastraChunksFromACPUpdate(\n update: SessionUpdate,\n runId: string,\n toolNames: Map<string, string>,\n): ChunkType[] {\n switch (update.sessionUpdate) {\n case 'tool_call': {\n const toolName = getToolName(update, toolNames);\n toolNames.set(update.toolCallId, toolName);\n\n return [\n {\n type: 'tool-call',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n args: toRecord(update.rawInput),\n },\n },\n ];\n }\n case 'tool_call_update': {\n const toolName = getToolName(update, toolNames);\n\n if (update.status === 'completed' || update.status === 'failed') {\n return [\n {\n type: 'tool-result',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n result: update.rawOutput ?? update.content ?? { status: update.status, title: update.title },\n isError: update.status === 'failed',\n },\n },\n ];\n }\n\n return [\n {\n type: 'tool-call-delta',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n argsTextDelta: update.title ?? update.status ?? '',\n },\n },\n ];\n }\n default:\n return [];\n }\n}\n\nfunction getToolName(\n update: Extract<SessionUpdate, { sessionUpdate: 'tool_call' | 'tool_call_update' }>,\n toolNames: Map<string, string>,\n): string {\n return update.title ?? toolNames.get(update.toolCallId) ?? update.kind ?? 'acp_tool';\n}\n\nfunction toRecord(value: unknown): Record<string, unknown> {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n\n if (value === undefined) {\n return {};\n }\n\n return { input: value };\n}\n\nfunction createOnFinishResult({\n text,\n runId,\n messageList,\n toolResults,\n error,\n}: {\n text: string;\n runId: string;\n messageList: MessageList;\n toolResults: AcpToolResult[];\n error?: unknown;\n}) {\n const usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n\n return {\n text,\n finishReason: 'stop',\n usage,\n totalUsage: usage,\n warnings: [],\n response: {\n messages: messageList.get.response.aiV5.model(),\n },\n steps: [],\n toolResults,\n runId,\n ...(error === undefined ? {} : { error }),\n };\n}\n\nfunction createFinishChunk(type: 'step-finish' | 'finish', runId: string): ChunkType {\n return {\n type,\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n id: globalThis.crypto.randomUUID(),\n output: {\n steps: [],\n usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n },\n stepResult: {\n reason: 'stop',\n warnings: [],\n isContinued: false,\n },\n metadata: {},\n messages: { nonUser: [], all: [] },\n },\n } as unknown as ChunkType;\n}\n","import { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nexport class ACPToolSession {\n private connection?: ACPConnection;\n\n constructor(private readonly options: CreateACPToolOptions) {}\n\n getConnection(workspace: CreateACPToolOptions['workspace']): ACPConnection {\n if (this.options.persistSession === false) {\n return this.createConnection(workspace);\n }\n\n this.connection ??= this.createConnection(workspace);\n return this.connection;\n }\n\n private createConnection(workspace: CreateACPToolOptions['workspace']): ACPConnection {\n return new ACPConnection({\n ...this.options,\n workspace: workspace ?? this.options.workspace,\n });\n }\n}\n","import { compileSchema } from '@internal/types-builder/compile-zod';\nimport { createTool } from '@mastra/core/tools';\nimport { z } from 'zod/v4';\n\nimport { ACPToolSession } from './session';\nimport type { CreateACPToolOptions } from './types';\n\nexport function createACPTool(options: CreateACPToolOptions) {\n const session = new ACPToolSession(options);\n\n return createTool({\n id: options.id,\n description: options.description,\n inputSchema: compileSchema(\n z.object({\n task: z.string().describe('The task to send to the ACP agent'),\n }),\n ),\n outputSchema: compileSchema(\n z.object({\n output: z.string().describe('The output of the ACP agent'),\n }),\n ),\n suspendSchema: compileSchema(\n z.object({\n permissionRequest: z.object({\n title: z.string().describe('The title of the permission request'),\n options: z.array(\n z.object({\n optionId: z.string().describe('The option id to select'),\n name: z.string().describe('The title of the permission request'),\n }),\n ),\n }),\n }),\n ),\n resumeSchema: compileSchema(\n z.union([\n z.object({\n optionId: z.string().optional().describe('The option id to select'),\n outcome: z.literal('selected').optional().describe('The outcome of the permission request'),\n }),\n z.object({\n outcome: z.literal('cancelled').optional().describe('The outcome of the permission request'),\n }),\n ]),\n ),\n execute: async ({ task }, context) => {\n const workspace = await context?.mastra?.getWorkspace();\n const connection = session.getConnection(workspace);\n const output = await connection.prompt(task, context?.abortSignal);\n\n return { output };\n },\n });\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mastra/acp",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.4",
|
|
4
4
|
"description": "ACP package for Mastra",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -25,18 +25,18 @@
|
|
|
25
25
|
"author": "",
|
|
26
26
|
"license": "Apache-2.0",
|
|
27
27
|
"devDependencies": {
|
|
28
|
-
"@types/node": "22.
|
|
29
|
-
"@vitest/coverage-v8": "4.1.
|
|
30
|
-
"@vitest/ui": "4.1.
|
|
31
|
-
"tsdown": "0.
|
|
32
|
-
"tsx": "^4.23.
|
|
28
|
+
"@types/node": "22.19.15",
|
|
29
|
+
"@vitest/coverage-v8": "4.1.12",
|
|
30
|
+
"@vitest/ui": "4.1.12",
|
|
31
|
+
"tsdown": "0.23.1",
|
|
32
|
+
"tsx": "^4.23.15",
|
|
33
33
|
"typescript": "^7.0.2",
|
|
34
|
-
"vitest": "4.1.
|
|
34
|
+
"vitest": "4.1.12",
|
|
35
35
|
"zod": "^4.6.7",
|
|
36
|
-
"@internal/
|
|
37
|
-
"@internal/
|
|
38
|
-
"@
|
|
39
|
-
"@
|
|
36
|
+
"@internal/lint": "0.0.146",
|
|
37
|
+
"@internal/types-builder": "0.0.121",
|
|
38
|
+
"@internal/ai-sdk-v5": "0.0.93",
|
|
39
|
+
"@mastra/core": "1.80.0"
|
|
40
40
|
},
|
|
41
41
|
"homepage": "https://mastra.ai",
|
|
42
42
|
"repository": {
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"node": ">=22.13.0"
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
|
-
"@agentclientprotocol/sdk": "^0.21.
|
|
57
|
+
"@agentclientprotocol/sdk": "^0.21.1"
|
|
58
58
|
},
|
|
59
59
|
"scripts": {
|
|
60
60
|
"build": "pnpm build:lib",
|