@mastra/acp 0.2.0-alpha.1 → 0.2.1-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -0
- package/dist/docs/SKILL.md +7 -2
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/docs/references/docs-agents-acp.md +23 -160
- package/dist/docs/references/reference-acp-acp-agent.md +228 -0
- package/dist/docs/references/reference-acp-create-acp-tool.md +131 -0
- package/dist/index.cjs +26 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +26 -4
- package/dist/index.js.map +1 -1
- package/dist/session.d.ts +10 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/tool.d.ts.map +1 -1
- package/package.json +6 -6
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# createACPTool()
|
|
2
|
+
|
|
3
|
+
The `createACPTool()` function creates a Mastra tool that sends a `task` string to an Agent Client Protocol (ACP)-compatible coding agent and returns the final ACP response as `output`. Use it when a parent agent should decide when to call the ACP agent as a tool.
|
|
4
|
+
|
|
5
|
+
If you want to register the ACP agent as a Mastra subagent instead, use the [`AcpAgent` class](https://mastra.ai/reference/acp/acp-agent).
|
|
6
|
+
|
|
7
|
+
## Usage example
|
|
8
|
+
|
|
9
|
+
Create a code editing tool and register it on a parent agent:
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
import { createACPTool } from '@mastra/acp'
|
|
13
|
+
import { Agent } from '@mastra/core/agent'
|
|
14
|
+
|
|
15
|
+
const codeAgentTool = createACPTool({
|
|
16
|
+
id: 'code-agent',
|
|
17
|
+
description: 'Use an ACP-compatible coding agent to inspect and edit code',
|
|
18
|
+
command: 'acp-agent',
|
|
19
|
+
args: ['--stdio'],
|
|
20
|
+
cwd: process.cwd(),
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
export const codeSupervisor = new Agent({
|
|
24
|
+
id: 'code-supervisor',
|
|
25
|
+
name: 'Code Supervisor',
|
|
26
|
+
instructions: 'Use the code-agent tool when a task requires repository inspection or code edits.',
|
|
27
|
+
model: 'openai/gpt-5.5',
|
|
28
|
+
tools: {
|
|
29
|
+
codeAgentTool,
|
|
30
|
+
},
|
|
31
|
+
})
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Parameters
|
|
35
|
+
|
|
36
|
+
**id** (`string`): Unique identifier for the Mastra tool.
|
|
37
|
+
|
|
38
|
+
**description** (`string`): Description shown to the model when it can call this tool.
|
|
39
|
+
|
|
40
|
+
**command** (`string`): ACP agent executable to spawn.
|
|
41
|
+
|
|
42
|
+
**args** (`string[]`): Arguments passed to the ACP agent executable. (Default: `[]`)
|
|
43
|
+
|
|
44
|
+
**env** (`Record<string, string>`): Environment variables to merge with the current process environment when spawning the ACP process.
|
|
45
|
+
|
|
46
|
+
**cwd** (`string`): Working directory for the ACP process and ACP session. Also used as the default local filesystem base path. (Default: `process.cwd()`)
|
|
47
|
+
|
|
48
|
+
**session** (`Partial<NewSessionRequest>`): ACP session creation options. Defaults to \`cwd\` or \`process.cwd()\` and an empty MCP server list.
|
|
49
|
+
|
|
50
|
+
**initialize** (`Partial<InitializeRequest>`): ACP initialization options. Defaults to Mastra client information, the current ACP protocol version, and read/write filesystem capabilities.
|
|
51
|
+
|
|
52
|
+
**authMethodId** (`string`): ACP authentication method ID to invoke after initialization and before session creation.
|
|
53
|
+
|
|
54
|
+
**persistSession** (`boolean`): Whether the ACP connection created for a tool execution disconnects after the prompt. Set to \`false\` to stop the process after each prompt completes. (Default: `true`)
|
|
55
|
+
|
|
56
|
+
**onPermissionRequest** (`(request: RequestPermissionRequest) => Promise<RequestPermissionResponse>`): Callback invoked when the ACP agent requests permission. Defaults to selecting the first permission option, or cancelling when no option is available.
|
|
57
|
+
|
|
58
|
+
**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.
|
|
59
|
+
|
|
60
|
+
**model** (`ModelId`): Model ID to select after ACP session creation using the ACP \`session/set\_model\` method.
|
|
61
|
+
|
|
62
|
+
## Input schema
|
|
63
|
+
|
|
64
|
+
**task** (`string`): The task to send to the ACP agent.
|
|
65
|
+
|
|
66
|
+
## Output schema
|
|
67
|
+
|
|
68
|
+
**output** (`string`): The final text output returned by the ACP agent.
|
|
69
|
+
|
|
70
|
+
## Suspend and resume schema
|
|
71
|
+
|
|
72
|
+
`createACPTool()` defines suspend and resume schemas for permission request payloads. Permission decisions are returned through `onPermissionRequest`; by default, `@mastra/acp` selects the first option returned by the ACP agent, or cancels when no option is available.
|
|
73
|
+
|
|
74
|
+
### Suspend payload
|
|
75
|
+
|
|
76
|
+
**permissionRequest** (`{ title: string; options: { optionId: string; name: string }[] }`): Permission request title and selectable options returned by the ACP agent.
|
|
77
|
+
|
|
78
|
+
### Resume payload
|
|
79
|
+
|
|
80
|
+
**optionId** (`string`): Permission option ID to select when resuming with \`outcome: "selected"\`.
|
|
81
|
+
|
|
82
|
+
**outcome** (`"selected" | "cancelled"`): Permission decision used to continue or cancel the ACP request.
|
|
83
|
+
|
|
84
|
+
## Session lifecycle
|
|
85
|
+
|
|
86
|
+
Each tool execution creates an ACP connection, starts the configured `command`, initializes the ACP client, creates an ACP session, and sends the `task` with ACP `session/prompt`.
|
|
87
|
+
|
|
88
|
+
By default, `persistSession` is `true` for the ACP connection created during tool execution. Set `persistSession: false` when the ACP process should stop as soon as that prompt completes.
|
|
89
|
+
|
|
90
|
+
Use [`AcpAgent`](https://mastra.ai/reference/acp/acp-agent) when you need a reusable ACP subagent instance with explicit session lifecycle control across calls.
|
|
91
|
+
|
|
92
|
+
## Permission handling
|
|
93
|
+
|
|
94
|
+
ACP agents may ask the client to choose a permission option before they continue. By default, `@mastra/acp` selects the first option returned by the ACP agent, or cancels when no option is available.
|
|
95
|
+
|
|
96
|
+
Pass `onPermissionRequest` to inspect the request and return your own permission response:
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
import { createACPTool } from '@mastra/acp'
|
|
100
|
+
|
|
101
|
+
export const codeAgentTool = createACPTool({
|
|
102
|
+
id: 'code-agent',
|
|
103
|
+
description: 'Use an ACP-compatible coding agent',
|
|
104
|
+
command: 'acp-agent',
|
|
105
|
+
args: ['--stdio'],
|
|
106
|
+
async onPermissionRequest(request) {
|
|
107
|
+
const allowOption = request.options.find(option => option.name === 'Allow')
|
|
108
|
+
|
|
109
|
+
if (!allowOption) {
|
|
110
|
+
return { outcome: { outcome: 'cancelled' } }
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return {
|
|
114
|
+
outcome: {
|
|
115
|
+
outcome: 'selected',
|
|
116
|
+
optionId: allowOption.optionId,
|
|
117
|
+
},
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
})
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Use this callback to enforce local policy, inspect the permission title, or route the decision to your own approval flow.
|
|
124
|
+
|
|
125
|
+
## Related
|
|
126
|
+
|
|
127
|
+
- [Agent Client Protocol docs](https://mastra.ai/docs/agents/acp)
|
|
128
|
+
- [AcpAgent class reference](https://mastra.ai/reference/acp/acp-agent)
|
|
129
|
+
- [Tool reference](https://mastra.ai/reference/tools/create-tool)
|
|
130
|
+
- [Agent Client Protocol introduction](https://agentclientprotocol.com/overview/introduction)
|
|
131
|
+
- [Agent Client Protocol schema](https://agentclientprotocol.com/protocol/schema)
|
package/dist/index.cjs
CHANGED
|
@@ -604,7 +604,32 @@ function createFinishChunk(type, runId) {
|
|
|
604
604
|
}
|
|
605
605
|
};
|
|
606
606
|
}
|
|
607
|
+
|
|
608
|
+
// src/session.ts
|
|
609
|
+
var ACPToolSession = class {
|
|
610
|
+
constructor(options) {
|
|
611
|
+
this.options = options;
|
|
612
|
+
}
|
|
613
|
+
options;
|
|
614
|
+
connection;
|
|
615
|
+
getConnection(workspace) {
|
|
616
|
+
if (this.options.persistSession === false) {
|
|
617
|
+
return this.createConnection(workspace);
|
|
618
|
+
}
|
|
619
|
+
this.connection ??= this.createConnection(workspace);
|
|
620
|
+
return this.connection;
|
|
621
|
+
}
|
|
622
|
+
createConnection(workspace) {
|
|
623
|
+
return new ACPConnection({
|
|
624
|
+
...this.options,
|
|
625
|
+
workspace: workspace ?? this.options.workspace
|
|
626
|
+
});
|
|
627
|
+
}
|
|
628
|
+
};
|
|
629
|
+
|
|
630
|
+
// src/tool.ts
|
|
607
631
|
function createACPTool(options) {
|
|
632
|
+
const session = new ACPToolSession(options);
|
|
608
633
|
return tools.createTool({
|
|
609
634
|
id: options.id,
|
|
610
635
|
description: options.description,
|
|
@@ -707,10 +732,7 @@ function createACPTool(options) {
|
|
|
707
732
|
},
|
|
708
733
|
execute: async ({ task }, context) => {
|
|
709
734
|
const workspace = await context?.mastra?.getWorkspace();
|
|
710
|
-
const connection =
|
|
711
|
-
...options,
|
|
712
|
-
workspace
|
|
713
|
-
});
|
|
735
|
+
const connection = session.getConnection(workspace);
|
|
714
736
|
const output = await connection.prompt(task, context?.abortSignal);
|
|
715
737
|
return { output };
|
|
716
738
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/connection.ts","../src/agent.ts","../src/tool.ts"],"names":["spawn","process","stream","ndJsonStream","Writable","Readable","workspace","Workspace","LocalFilesystem","ClientSideConnection","PROTOCOL_VERSION","ReadableStream","randomUUID","messageList","MessageList","coreContentToString","createTool"],"mappings":"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","file":"index.cjs","sourcesContent":["import { spawn } from 'node:child_process';\nimport type { ChildProcessWithoutNullStreams } from 'node:child_process';\nimport process from 'node:process';\nimport { Readable, Writable } from 'node:stream';\nimport { ClientSideConnection, ndJsonStream, PROTOCOL_VERSION } from '@agentclientprotocol/sdk';\nimport type {\n Client,\n InitializeRequest,\n ModelInfo,\n NewSessionRequest,\n NewSessionResponse,\n PermissionOption,\n PromptResponse,\n ReadTextFileRequest,\n ReadTextFileResponse,\n RequestPermissionRequest,\n RequestPermissionResponse,\n SessionNotification,\n SessionUpdate,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from '@agentclientprotocol/sdk';\n\nimport { LocalFilesystem, Workspace } from '@mastra/core/workspace';\nimport type { CreateACPToolOptions } from './types';\n\nexport type ACPStreamEvent = { type: 'text'; text: string } | { type: 'session-update'; update: SessionUpdate };\n\ntype PromptState = {\n sessionId: string;\n onEvent?: (event: ACPStreamEvent) => void;\n};\n\nclass ACPClient implements Client {\n constructor(\n private readonly getPromptState: () => PromptState | undefined,\n private readonly workspace: Workspace,\n private readonly onPermissionRequest?: CreateACPToolOptions['onPermissionRequest'],\n ) {}\n\n async sessionUpdate(notification: SessionNotification): Promise<void> {\n const state = this.getPromptState();\n\n if (!state || notification.sessionId !== state.sessionId) {\n return;\n }\n\n const update = notification.update;\n\n if (update.sessionUpdate === 'agent_message_chunk') {\n if (update.content.type === 'text') {\n state.onEvent?.({ type: 'text', text: update.content.text });\n }\n } else {\n state.onEvent?.({ type: 'session-update', update });\n }\n }\n\n async requestPermission(request: RequestPermissionRequest): Promise<RequestPermissionResponse> {\n if (this.onPermissionRequest) {\n return this.onPermissionRequest(request);\n }\n\n const option = request.options[0];\n\n if (!option) {\n return { outcome: { outcome: 'cancelled' } };\n }\n\n return { outcome: selectedPermissionOutcome(option) };\n }\n\n async readTextFile(params: ReadTextFileRequest): Promise<ReadTextFileResponse> {\n let content = await this.workspace.filesystem?.readFile(params.path);\n\n if (!(typeof content === 'string')) {\n const decoder = new TextDecoder('utf-8');\n content = decoder.decode(content);\n }\n\n if (params.line != null || params.limit != null) {\n const lines = content.split('\\n');\n const start = (params.line ?? 1) - 1;\n const end = params.limit != null ? start + params.limit : lines.length;\n return { content: lines.slice(start, end).join('\\n') };\n }\n\n return { content };\n }\n\n async writeTextFile(params: WriteTextFileRequest): Promise<WriteTextFileResponse> {\n await this.workspace.filesystem?.writeFile(params.path, params.content);\n\n return {};\n }\n}\n\nexport class ACPConnection {\n readonly options: CreateACPToolOptions;\n\n private agentProcess?: ChildProcessWithoutNullStreams;\n private connection?: ClientSideConnection;\n private session?: NewSessionResponse;\n private initializePromise?: Promise<void>;\n private currentPrompt?: PromptState;\n private stderr = '';\n\n constructor(options: CreateACPToolOptions) {\n this.options = options;\n }\n\n get sessionId(): string | undefined {\n return this.session?.sessionId;\n }\n\n async getAvailableModels(): Promise<ModelInfo[]> {\n await this.ensureConnected();\n return this.session?.models?.availableModels ?? [];\n }\n\n async setModel(modelId: string): Promise<void> {\n await this.ensureConnected();\n\n const available = this.session?.models?.availableModels;\n\n if (available && !available.some(m => m.modelId === modelId)) {\n const ids = available.map(m => m.modelId).join(', ') || '(none)';\n throw new Error(`Model \"${modelId}\" is not available. Available models: ${ids}`);\n }\n\n await this.connection!.unstable_setSessionModel({\n sessionId: this.session!.sessionId,\n modelId,\n });\n }\n\n async prompt(task: string, signal?: AbortSignal): Promise<string> {\n const parts: string[] = [];\n\n for await (const event of this.promptStream(task, signal)) {\n if (event.type === 'text') {\n parts.push(event.text);\n }\n }\n\n return parts.join('');\n }\n\n async *promptStream(task: string, signal?: AbortSignal): AsyncGenerator<ACPStreamEvent> {\n await this.ensureConnected();\n\n const sessionId = this.session?.sessionId;\n\n if (!this.connection || !sessionId) {\n throw new Error('ACP connection is not initialized');\n }\n\n if (signal?.aborted) {\n await this.cancel();\n throw signal.reason ?? new Error('ACP prompt aborted');\n }\n\n const queue = createAsyncQueue<ACPStreamEvent>();\n const state: PromptState = {\n sessionId,\n onEvent: event => queue.push(event),\n };\n this.currentPrompt = state;\n\n const abortHandler = () => {\n void this.cancel();\n queue.throw(signal?.reason ?? new Error('ACP prompt aborted'));\n };\n\n signal?.addEventListener('abort', abortHandler, { once: true });\n\n const responsePromise = this.connection\n .prompt({\n sessionId,\n prompt: [{ type: 'text', text: task }],\n })\n .then(\n response => {\n this.throwIfPromptDidNotComplete(response);\n queue.close();\n },\n error => {\n queue.throw(this.withStderr(error));\n },\n );\n\n try {\n for await (const chunk of queue) {\n yield chunk;\n }\n\n await responsePromise;\n } catch (error) {\n await responsePromise.catch(() => undefined);\n throw error;\n } finally {\n signal?.removeEventListener('abort', abortHandler);\n if (this.currentPrompt === state) {\n this.currentPrompt = undefined;\n }\n\n if (this.options.persistSession === false) {\n this.disconnect();\n }\n }\n }\n\n async cancel(): Promise<void> {\n const sessionId = this.session?.sessionId;\n\n if (!this.connection || !sessionId) {\n return;\n }\n\n await this.connection.cancel({ sessionId });\n }\n\n disconnect(): void {\n this.connection = undefined;\n this.session = undefined;\n this.initializePromise = undefined;\n this.currentPrompt = undefined;\n\n if (this.agentProcess && !this.agentProcess.killed) {\n this.agentProcess.kill();\n }\n\n this.agentProcess = undefined;\n }\n\n private async ensureConnected(): Promise<void> {\n if (this.connection && this.session) {\n return;\n }\n\n this.initializePromise ??= this.initialize();\n await this.initializePromise;\n }\n\n private async initialize(): Promise<void> {\n this.stderr = '';\n this.agentProcess = spawn(this.options.command, this.options.args ?? [], {\n cwd: this.options.cwd,\n env: { ...process.env, ...this.options.env },\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n this.agentProcess.stderr.on('data', chunk => {\n this.stderr += String(chunk);\n });\n\n const stream = ndJsonStream(\n Writable.toWeb(this.agentProcess.stdin) as WritableStream<Uint8Array>,\n Readable.toWeb(this.agentProcess.stdout) as ReadableStream<Uint8Array>,\n );\n\n const workspace =\n this.options.workspace ??\n new Workspace({\n filesystem: new LocalFilesystem({ basePath: this.options.cwd ?? process.cwd() }),\n });\n\n this.connection = new ClientSideConnection(\n () => new ACPClient(() => this.currentPrompt, workspace, this.options.onPermissionRequest),\n stream,\n );\n\n try {\n await this.connection.initialize(this.getInitializeRequest());\n\n if (this.options.authMethodId) {\n await this.connection.authenticate({ methodId: this.options.authMethodId });\n }\n\n this.session = await this.connection.newSession(this.getNewSessionRequest());\n\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 } catch (error) {\n this.disconnect();\n throw this.withStderr(error);\n }\n }\n\n private getInitializeRequest(): InitializeRequest {\n return {\n protocolVersion: PROTOCOL_VERSION,\n clientCapabilities: {\n fs: { readTextFile: true, writeTextFile: true },\n },\n clientInfo: {\n name: '@mastra/acp',\n version: '0.1.0',\n },\n ...this.options.initialize,\n };\n }\n\n private getNewSessionRequest(): NewSessionRequest {\n return {\n cwd: this.options.cwd ?? process.cwd(),\n mcpServers: [],\n ...this.options.session,\n };\n }\n\n private throwIfPromptDidNotComplete(response: PromptResponse): void {\n if (response.stopReason === 'end_turn') {\n return;\n }\n\n throw new Error(`ACP prompt stopped before completing: ${response.stopReason}`);\n }\n\n private withStderr(error: unknown): Error {\n const stderr = this.stderr.trim();\n\n if (error instanceof Error) {\n if (stderr && !error.message.includes(stderr)) {\n error.message = `${error.message}\\n\\nACP agent stderr:\\n${stderr}`;\n }\n\n return error;\n }\n\n return new Error(stderr ? `${String(error)}\\n\\nACP agent stderr:\\n${stderr}` : String(error));\n }\n}\n\ntype AsyncQueue<T> = AsyncIterable<T> & {\n close: () => void;\n push: (value: T) => void;\n throw: (error: unknown) => void;\n};\n\nfunction createAsyncQueue<T>(): AsyncQueue<T> {\n const values: T[] = [];\n const waiters: Array<{\n resolve: (value: IteratorResult<T>) => void;\n reject: (error: unknown) => void;\n }> = [];\n let closed = false;\n let error: unknown;\n\n const next = (): Promise<IteratorResult<T>> => {\n if (values.length > 0) {\n return Promise.resolve({ value: values.shift()!, done: false });\n }\n\n if (error) {\n return Promise.reject(error);\n }\n\n if (closed) {\n return Promise.resolve({ value: undefined, done: true });\n }\n\n return new Promise((resolve, reject) => {\n waiters.push({ resolve, reject });\n });\n };\n\n return {\n push(value) {\n const waiter = waiters.shift();\n if (waiter) {\n waiter.resolve({ value, done: false });\n return;\n }\n\n values.push(value);\n },\n close() {\n closed = true;\n for (const waiter of waiters.splice(0)) {\n waiter.resolve({ value: undefined, done: true });\n }\n },\n throw(queueError) {\n error = queueError;\n for (const waiter of waiters.splice(0)) {\n waiter.reject(queueError);\n }\n },\n [Symbol.asyncIterator]() {\n return { next };\n },\n };\n}\n\nfunction selectedPermissionOutcome(option: PermissionOption): RequestPermissionResponse['outcome'] {\n return { outcome: 'selected', optionId: option.optionId };\n}\n","import { randomUUID } from 'node:crypto';\nimport { ReadableStream } from 'node:stream/web';\n\nimport type { ModelInfo, SessionUpdate } from '@agentclientprotocol/sdk';\nimport type {\n AgentGenerateOptions,\n AgentInstructions,\n AgentStreamOptions,\n MastraLanguageModel,\n SubAgent,\n SubAgentGenerateResult,\n SubAgentStreamResult,\n} from '@mastra/core/agent';\nimport { MessageList, coreContentToString } from '@mastra/core/agent/message-list';\nimport type { MessageListInput } from '@mastra/core/agent/message-list';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { ChunkType } from '@mastra/core/stream';\nimport type { DynamicArgument } from '@mastra/core/types';\n\nimport { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nconst CHUNK_FROM_AGENT = 'AGENT' as ChunkType['from'];\ntype AcpToolResult = Extract<NonNullable<SubAgentStreamResult['toolResults']>, unknown[]>[number];\n\nconst model = {\n modelId: 'acp-agent',\n provider: '@mastra/acp',\n specificationVersion: 'v3',\n supportedUrls: {},\n doGenerate: async () => ({\n stream: new ReadableStream({\n start: async controller => {\n controller.close();\n },\n }),\n }),\n doStream: async () => ({\n stream: new ReadableStream({\n start: async controller => {\n controller.close();\n },\n }),\n }),\n} as const satisfies MastraLanguageModel;\n\nexport type AcpAgentOptions = CreateACPToolOptions & {\n name?: string;\n};\n\nexport class AcpAgent<\n TId extends string = string,\n TRequestContext extends Record<string, any> | unknown = unknown,\n> implements SubAgent<TId, TRequestContext> {\n readonly id: TId;\n readonly name: string;\n readonly connection: ACPConnection;\n readonly description: string;\n\n constructor(options: AcpAgentOptions) {\n this.id = options.id as TId;\n this.name = options.name ?? options.id;\n this.description = options.description;\n this.connection = new ACPConnection(options);\n }\n\n __registerMastra(_mastra: Mastra): void {}\n\n getDescription(): string {\n return this.description;\n }\n\n getModel(): ReturnType<SubAgent<TId, TRequestContext>['getModel']> {\n return model;\n }\n\n hasOwnMemory(): boolean {\n return false;\n }\n\n __setMemory(_memory: DynamicArgument<any, any>): void {}\n\n getMemory(): undefined {\n return undefined;\n }\n\n getInstructions(): string {\n return '';\n }\n\n async getAvailableModels(): Promise<ModelInfo[]> {\n return this.connection.getAvailableModels();\n }\n\n async setModel(modelId: string): Promise<void> {\n return this.connection.setModel(modelId);\n }\n\n async generate(messages: MessageListInput, options?: AgentGenerateOptions): Promise<SubAgentGenerateResult> {\n const prompt = this.getPrompt(messages, options?.instructions);\n const text = await this.connection.prompt(\n prompt,\n (options as { abortSignal?: AbortSignal } | undefined)?.abortSignal,\n );\n const messageList = this.createMessageList(messages, text);\n\n return {\n text,\n response: {\n dbMessages: messageList.get.response.db(),\n },\n toolResults: [],\n finishReason: 'stop',\n runId: options?.runId ?? randomUUID(),\n };\n }\n\n async resumeGenerate(): Promise<SubAgentGenerateResult> {\n throw new Error('AcpAgent does not support resuming suspended generate calls');\n }\n\n async resumeStream(): Promise<SubAgentStreamResult> {\n throw new Error('AcpAgent does not support resuming suspended stream calls');\n }\n\n async stream(messages: MessageListInput, options?: AgentStreamOptions): Promise<SubAgentStreamResult> {\n const runId = options?.runId ?? randomUUID();\n const prompt = this.getPrompt(messages, options?.instructions);\n const signal = (options as { abortSignal?: AbortSignal } | undefined)?.abortSignal;\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n\n let resolveText!: (text: string) => void;\n let rejectText!: (error: unknown) => void;\n const textPromise = new Promise<string>((resolve, reject) => {\n resolveText = resolve;\n rejectText = reject;\n });\n\n const fullStream = new ReadableStream<ChunkType>({\n start: async controller => {\n const textId = randomUUID();\n const chunks: string[] = [];\n const toolNames = new Map<string, string>();\n const toolResults: AcpToolResult[] = [];\n\n try {\n controller.enqueue({ type: 'text-start', runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });\n\n for await (const event of this.connection.promptStream(prompt, signal)) {\n if (event.type === 'text') {\n chunks.push(event.text);\n controller.enqueue({\n type: 'text-delta',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: { id: textId, text: event.text },\n });\n } else if (event.type === 'session-update') {\n for (const chunk of getMastraChunksFromACPUpdate(event.update, runId, toolNames)) {\n if (chunk.type === 'tool-result') {\n toolResults.push({ payload: chunk.payload });\n }\n controller.enqueue(chunk);\n }\n }\n }\n\n const text = chunks.join('');\n messageList.add([{ role: 'assistant', content: text }], 'response');\n\n controller.enqueue({ type: 'text-end', runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });\n controller.enqueue(createFinishChunk('step-finish', runId));\n controller.enqueue(createFinishChunk('finish', runId));\n await options?.onFinish?.(createOnFinishResult({ text, runId, messageList, toolResults }) as any);\n resolveText(text);\n controller.close();\n } catch (error) {\n const text = chunks.join('');\n await options?.onFinish?.(createOnFinishResult({ text, runId, messageList, toolResults, error }) as any);\n rejectText(error);\n controller.error(error);\n }\n },\n });\n\n return {\n fullStream,\n text: textPromise,\n messageList,\n toolResults: [],\n runId,\n };\n }\n\n private getPrompt(messages: MessageListInput, instructions?: AgentInstructions): string {\n const prompt = extractText(messages);\n const instructionText = instructions ? extractInstructions(instructions) : '';\n\n if (!instructionText) {\n return prompt;\n }\n\n return `${instructionText}\\n\\n${prompt}`;\n }\n\n private createMessageList(messages: MessageListInput, text: string): MessageList {\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n messageList.add([{ role: 'assistant', content: text }], 'response');\n return messageList;\n }\n}\n\nfunction extractText(messages: MessageListInput): string {\n if (typeof messages === 'string') {\n return messages;\n }\n\n if (Array.isArray(messages) && messages.every(message => typeof message === 'string')) {\n return messages.join('\\n');\n }\n\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n\n return messageList.get.all\n .core()\n .map(message => coreContentToString(message.content))\n .filter(Boolean)\n .join('\\n');\n}\n\nfunction extractInstructions(instructions: AgentInstructions): string {\n if (typeof instructions === 'string') {\n return instructions;\n }\n\n if (Array.isArray(instructions)) {\n return instructions.map(instruction => extractInstructions(instruction)).join('\\n');\n }\n\n return coreContentToString(instructions.content);\n}\n\nfunction getMastraChunksFromACPUpdate(\n update: SessionUpdate,\n runId: string,\n toolNames: Map<string, string>,\n): ChunkType[] {\n switch (update.sessionUpdate) {\n case 'tool_call': {\n const toolName = getToolName(update, toolNames);\n toolNames.set(update.toolCallId, toolName);\n\n return [\n {\n type: 'tool-call',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n args: toRecord(update.rawInput),\n },\n },\n ];\n }\n case 'tool_call_update': {\n const toolName = getToolName(update, toolNames);\n\n if (update.status === 'completed' || update.status === 'failed') {\n return [\n {\n type: 'tool-result',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n result: update.rawOutput ?? update.content ?? { status: update.status, title: update.title },\n isError: update.status === 'failed',\n },\n },\n ];\n }\n\n return [\n {\n type: 'tool-call-delta',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n argsTextDelta: update.title ?? update.status ?? '',\n },\n },\n ];\n }\n default:\n return [];\n }\n}\n\nfunction getToolName(\n update: Extract<SessionUpdate, { sessionUpdate: 'tool_call' | 'tool_call_update' }>,\n toolNames: Map<string, string>,\n): string {\n return update.title ?? toolNames.get(update.toolCallId) ?? update.kind ?? 'acp_tool';\n}\n\nfunction toRecord(value: unknown): Record<string, unknown> {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n\n if (value === undefined) {\n return {};\n }\n\n return { input: value };\n}\n\nfunction createOnFinishResult({\n text,\n runId,\n messageList,\n toolResults,\n error,\n}: {\n text: string;\n runId: string;\n messageList: MessageList;\n toolResults: AcpToolResult[];\n error?: unknown;\n}) {\n const usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n\n return {\n text,\n finishReason: 'stop',\n usage,\n totalUsage: usage,\n warnings: [],\n response: {\n messages: messageList.get.response.aiV5.model(),\n },\n steps: [],\n toolResults,\n runId,\n ...(error === undefined ? {} : { error }),\n };\n}\n\nfunction createFinishChunk(type: 'step-finish' | 'finish', runId: string): ChunkType {\n return {\n type,\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n id: randomUUID(),\n output: {\n steps: [],\n usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n },\n stepResult: {\n reason: 'stop',\n warnings: [],\n isContinued: false,\n },\n metadata: {},\n messages: { nonUser: [], all: [] },\n },\n } as unknown as ChunkType;\n}\n","\nimport { createTool } from '@mastra/core/tools';\nimport { z } from 'zod/v4';\n\nimport { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nexport function createACPTool(options: CreateACPToolOptions) {\n return createTool({\n id: options.id,\n description: options.description,\n inputSchema: {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"type\": \"object\",\n \"properties\": {\n \"task\": {\n \"type\": \"string\",\n \"description\": \"The task to send to the ACP agent\"\n }\n },\n \"required\": [\n \"task\"\n ]\n},\n outputSchema: {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"type\": \"object\",\n \"properties\": {\n \"output\": {\n \"type\": \"string\",\n \"description\": \"The output of the ACP agent\"\n }\n },\n \"required\": [\n \"output\"\n ]\n},\n suspendSchema: {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"type\": \"object\",\n \"properties\": {\n \"permissionRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"title\": {\n \"type\": \"string\",\n \"description\": \"The title of the permission request\"\n },\n \"options\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"optionId\": {\n \"type\": \"string\",\n \"description\": \"The option id to select\"\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"The title of the permission request\"\n }\n },\n \"required\": [\n \"optionId\",\n \"name\"\n ]\n }\n }\n },\n \"required\": [\n \"title\",\n \"options\"\n ]\n }\n },\n \"required\": [\n \"permissionRequest\"\n ]\n},\n resumeSchema: {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"anyOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"optionId\": {\n \"description\": \"The option id to select\",\n \"type\": \"string\"\n },\n \"outcome\": {\n \"description\": \"The outcome of the permission request\",\n \"type\": \"string\",\n \"const\": \"selected\"\n }\n }\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"outcome\": {\n \"description\": \"The outcome of the permission request\",\n \"type\": \"string\",\n \"const\": \"cancelled\"\n }\n }\n }\n ]\n},\n execute: async ({ task }, context) => {\n const workspace = await context?.mastra?.getWorkspace();\n const connection = new ACPConnection({\n ...options,\n workspace,\n });\n\n const output = await connection.prompt(task, context?.abortSignal);\n\n return { output };\n },\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/connection.ts","../src/agent.ts","../src/session.ts","../src/tool.ts"],"names":["spawn","process","stream","ndJsonStream","Writable","Readable","workspace","Workspace","LocalFilesystem","ClientSideConnection","PROTOCOL_VERSION","ReadableStream","randomUUID","messageList","MessageList","coreContentToString","createTool"],"mappings":"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","file":"index.cjs","sourcesContent":["import { spawn } from 'node:child_process';\nimport type { ChildProcessWithoutNullStreams } from 'node:child_process';\nimport process from 'node:process';\nimport { Readable, Writable } from 'node:stream';\nimport { ClientSideConnection, ndJsonStream, PROTOCOL_VERSION } from '@agentclientprotocol/sdk';\nimport type {\n Client,\n InitializeRequest,\n ModelInfo,\n NewSessionRequest,\n NewSessionResponse,\n PermissionOption,\n PromptResponse,\n ReadTextFileRequest,\n ReadTextFileResponse,\n RequestPermissionRequest,\n RequestPermissionResponse,\n SessionNotification,\n SessionUpdate,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from '@agentclientprotocol/sdk';\n\nimport { LocalFilesystem, Workspace } from '@mastra/core/workspace';\nimport type { CreateACPToolOptions } from './types';\n\nexport type ACPStreamEvent = { type: 'text'; text: string } | { type: 'session-update'; update: SessionUpdate };\n\ntype PromptState = {\n sessionId: string;\n onEvent?: (event: ACPStreamEvent) => void;\n};\n\nclass ACPClient implements Client {\n constructor(\n private readonly getPromptState: () => PromptState | undefined,\n private readonly workspace: Workspace,\n private readonly onPermissionRequest?: CreateACPToolOptions['onPermissionRequest'],\n ) {}\n\n async sessionUpdate(notification: SessionNotification): Promise<void> {\n const state = this.getPromptState();\n\n if (!state || notification.sessionId !== state.sessionId) {\n return;\n }\n\n const update = notification.update;\n\n if (update.sessionUpdate === 'agent_message_chunk') {\n if (update.content.type === 'text') {\n state.onEvent?.({ type: 'text', text: update.content.text });\n }\n } else {\n state.onEvent?.({ type: 'session-update', update });\n }\n }\n\n async requestPermission(request: RequestPermissionRequest): Promise<RequestPermissionResponse> {\n if (this.onPermissionRequest) {\n return this.onPermissionRequest(request);\n }\n\n const option = request.options[0];\n\n if (!option) {\n return { outcome: { outcome: 'cancelled' } };\n }\n\n return { outcome: selectedPermissionOutcome(option) };\n }\n\n async readTextFile(params: ReadTextFileRequest): Promise<ReadTextFileResponse> {\n let content = await this.workspace.filesystem?.readFile(params.path);\n\n if (!(typeof content === 'string')) {\n const decoder = new TextDecoder('utf-8');\n content = decoder.decode(content);\n }\n\n if (params.line != null || params.limit != null) {\n const lines = content.split('\\n');\n const start = (params.line ?? 1) - 1;\n const end = params.limit != null ? start + params.limit : lines.length;\n return { content: lines.slice(start, end).join('\\n') };\n }\n\n return { content };\n }\n\n async writeTextFile(params: WriteTextFileRequest): Promise<WriteTextFileResponse> {\n await this.workspace.filesystem?.writeFile(params.path, params.content);\n\n return {};\n }\n}\n\nexport class ACPConnection {\n readonly options: CreateACPToolOptions;\n\n private agentProcess?: ChildProcessWithoutNullStreams;\n private connection?: ClientSideConnection;\n private session?: NewSessionResponse;\n private initializePromise?: Promise<void>;\n private currentPrompt?: PromptState;\n private stderr = '';\n\n constructor(options: CreateACPToolOptions) {\n this.options = options;\n }\n\n get sessionId(): string | undefined {\n return this.session?.sessionId;\n }\n\n async getAvailableModels(): Promise<ModelInfo[]> {\n await this.ensureConnected();\n return this.session?.models?.availableModels ?? [];\n }\n\n async setModel(modelId: string): Promise<void> {\n await this.ensureConnected();\n\n const available = this.session?.models?.availableModels;\n\n if (available && !available.some(m => m.modelId === modelId)) {\n const ids = available.map(m => m.modelId).join(', ') || '(none)';\n throw new Error(`Model \"${modelId}\" is not available. Available models: ${ids}`);\n }\n\n await this.connection!.unstable_setSessionModel({\n sessionId: this.session!.sessionId,\n modelId,\n });\n }\n\n async prompt(task: string, signal?: AbortSignal): Promise<string> {\n const parts: string[] = [];\n\n for await (const event of this.promptStream(task, signal)) {\n if (event.type === 'text') {\n parts.push(event.text);\n }\n }\n\n return parts.join('');\n }\n\n async *promptStream(task: string, signal?: AbortSignal): AsyncGenerator<ACPStreamEvent> {\n await this.ensureConnected();\n\n const sessionId = this.session?.sessionId;\n\n if (!this.connection || !sessionId) {\n throw new Error('ACP connection is not initialized');\n }\n\n if (signal?.aborted) {\n await this.cancel();\n throw signal.reason ?? new Error('ACP prompt aborted');\n }\n\n const queue = createAsyncQueue<ACPStreamEvent>();\n const state: PromptState = {\n sessionId,\n onEvent: event => queue.push(event),\n };\n this.currentPrompt = state;\n\n const abortHandler = () => {\n void this.cancel();\n queue.throw(signal?.reason ?? new Error('ACP prompt aborted'));\n };\n\n signal?.addEventListener('abort', abortHandler, { once: true });\n\n const responsePromise = this.connection\n .prompt({\n sessionId,\n prompt: [{ type: 'text', text: task }],\n })\n .then(\n response => {\n this.throwIfPromptDidNotComplete(response);\n queue.close();\n },\n error => {\n queue.throw(this.withStderr(error));\n },\n );\n\n try {\n for await (const chunk of queue) {\n yield chunk;\n }\n\n await responsePromise;\n } catch (error) {\n await responsePromise.catch(() => undefined);\n throw error;\n } finally {\n signal?.removeEventListener('abort', abortHandler);\n if (this.currentPrompt === state) {\n this.currentPrompt = undefined;\n }\n\n if (this.options.persistSession === false) {\n this.disconnect();\n }\n }\n }\n\n async cancel(): Promise<void> {\n const sessionId = this.session?.sessionId;\n\n if (!this.connection || !sessionId) {\n return;\n }\n\n await this.connection.cancel({ sessionId });\n }\n\n disconnect(): void {\n this.connection = undefined;\n this.session = undefined;\n this.initializePromise = undefined;\n this.currentPrompt = undefined;\n\n if (this.agentProcess && !this.agentProcess.killed) {\n this.agentProcess.kill();\n }\n\n this.agentProcess = undefined;\n }\n\n private async ensureConnected(): Promise<void> {\n if (this.connection && this.session) {\n return;\n }\n\n this.initializePromise ??= this.initialize();\n await this.initializePromise;\n }\n\n private async initialize(): Promise<void> {\n this.stderr = '';\n this.agentProcess = spawn(this.options.command, this.options.args ?? [], {\n cwd: this.options.cwd,\n env: { ...process.env, ...this.options.env },\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n this.agentProcess.stderr.on('data', chunk => {\n this.stderr += String(chunk);\n });\n\n const stream = ndJsonStream(\n Writable.toWeb(this.agentProcess.stdin) as WritableStream<Uint8Array>,\n Readable.toWeb(this.agentProcess.stdout) as ReadableStream<Uint8Array>,\n );\n\n const workspace =\n this.options.workspace ??\n new Workspace({\n filesystem: new LocalFilesystem({ basePath: this.options.cwd ?? process.cwd() }),\n });\n\n this.connection = new ClientSideConnection(\n () => new ACPClient(() => this.currentPrompt, workspace, this.options.onPermissionRequest),\n stream,\n );\n\n try {\n await this.connection.initialize(this.getInitializeRequest());\n\n if (this.options.authMethodId) {\n await this.connection.authenticate({ methodId: this.options.authMethodId });\n }\n\n this.session = await this.connection.newSession(this.getNewSessionRequest());\n\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 } catch (error) {\n this.disconnect();\n throw this.withStderr(error);\n }\n }\n\n private getInitializeRequest(): InitializeRequest {\n return {\n protocolVersion: PROTOCOL_VERSION,\n clientCapabilities: {\n fs: { readTextFile: true, writeTextFile: true },\n },\n clientInfo: {\n name: '@mastra/acp',\n version: '0.1.0',\n },\n ...this.options.initialize,\n };\n }\n\n private getNewSessionRequest(): NewSessionRequest {\n return {\n cwd: this.options.cwd ?? process.cwd(),\n mcpServers: [],\n ...this.options.session,\n };\n }\n\n private throwIfPromptDidNotComplete(response: PromptResponse): void {\n if (response.stopReason === 'end_turn') {\n return;\n }\n\n throw new Error(`ACP prompt stopped before completing: ${response.stopReason}`);\n }\n\n private withStderr(error: unknown): Error {\n const stderr = this.stderr.trim();\n\n if (error instanceof Error) {\n if (stderr && !error.message.includes(stderr)) {\n error.message = `${error.message}\\n\\nACP agent stderr:\\n${stderr}`;\n }\n\n return error;\n }\n\n return new Error(stderr ? `${String(error)}\\n\\nACP agent stderr:\\n${stderr}` : String(error));\n }\n}\n\ntype AsyncQueue<T> = AsyncIterable<T> & {\n close: () => void;\n push: (value: T) => void;\n throw: (error: unknown) => void;\n};\n\nfunction createAsyncQueue<T>(): AsyncQueue<T> {\n const values: T[] = [];\n const waiters: Array<{\n resolve: (value: IteratorResult<T>) => void;\n reject: (error: unknown) => void;\n }> = [];\n let closed = false;\n let error: unknown;\n\n const next = (): Promise<IteratorResult<T>> => {\n if (values.length > 0) {\n return Promise.resolve({ value: values.shift()!, done: false });\n }\n\n if (error) {\n return Promise.reject(error);\n }\n\n if (closed) {\n return Promise.resolve({ value: undefined, done: true });\n }\n\n return new Promise((resolve, reject) => {\n waiters.push({ resolve, reject });\n });\n };\n\n return {\n push(value) {\n const waiter = waiters.shift();\n if (waiter) {\n waiter.resolve({ value, done: false });\n return;\n }\n\n values.push(value);\n },\n close() {\n closed = true;\n for (const waiter of waiters.splice(0)) {\n waiter.resolve({ value: undefined, done: true });\n }\n },\n throw(queueError) {\n error = queueError;\n for (const waiter of waiters.splice(0)) {\n waiter.reject(queueError);\n }\n },\n [Symbol.asyncIterator]() {\n return { next };\n },\n };\n}\n\nfunction selectedPermissionOutcome(option: PermissionOption): RequestPermissionResponse['outcome'] {\n return { outcome: 'selected', optionId: option.optionId };\n}\n","import { randomUUID } from 'node:crypto';\nimport { ReadableStream } from 'node:stream/web';\n\nimport type { ModelInfo, SessionUpdate } from '@agentclientprotocol/sdk';\nimport type {\n AgentGenerateOptions,\n AgentInstructions,\n AgentStreamOptions,\n MastraLanguageModel,\n SubAgent,\n SubAgentGenerateResult,\n SubAgentStreamResult,\n} from '@mastra/core/agent';\nimport { MessageList, coreContentToString } from '@mastra/core/agent/message-list';\nimport type { MessageListInput } from '@mastra/core/agent/message-list';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { ChunkType } from '@mastra/core/stream';\nimport type { DynamicArgument } from '@mastra/core/types';\n\nimport { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nconst CHUNK_FROM_AGENT = 'AGENT' as ChunkType['from'];\ntype AcpToolResult = Extract<NonNullable<SubAgentStreamResult['toolResults']>, unknown[]>[number];\n\nconst model = {\n modelId: 'acp-agent',\n provider: '@mastra/acp',\n specificationVersion: 'v3',\n supportedUrls: {},\n doGenerate: async () => ({\n stream: new ReadableStream({\n start: async controller => {\n controller.close();\n },\n }),\n }),\n doStream: async () => ({\n stream: new ReadableStream({\n start: async controller => {\n controller.close();\n },\n }),\n }),\n} as const satisfies MastraLanguageModel;\n\nexport type AcpAgentOptions = CreateACPToolOptions & {\n name?: string;\n};\n\nexport class AcpAgent<\n TId extends string = string,\n TRequestContext extends Record<string, any> | unknown = unknown,\n> implements SubAgent<TId, TRequestContext> {\n readonly id: TId;\n readonly name: string;\n readonly connection: ACPConnection;\n readonly description: string;\n\n constructor(options: AcpAgentOptions) {\n this.id = options.id as TId;\n this.name = options.name ?? options.id;\n this.description = options.description;\n this.connection = new ACPConnection(options);\n }\n\n __registerMastra(_mastra: Mastra): void {}\n\n getDescription(): string {\n return this.description;\n }\n\n getModel(): ReturnType<SubAgent<TId, TRequestContext>['getModel']> {\n return model;\n }\n\n hasOwnMemory(): boolean {\n return false;\n }\n\n __setMemory(_memory: DynamicArgument<any, any>): void {}\n\n getMemory(): undefined {\n return undefined;\n }\n\n getInstructions(): string {\n return '';\n }\n\n async getAvailableModels(): Promise<ModelInfo[]> {\n return this.connection.getAvailableModels();\n }\n\n async setModel(modelId: string): Promise<void> {\n return this.connection.setModel(modelId);\n }\n\n async generate(messages: MessageListInput, options?: AgentGenerateOptions): Promise<SubAgentGenerateResult> {\n const prompt = this.getPrompt(messages, options?.instructions);\n const text = await this.connection.prompt(\n prompt,\n (options as { abortSignal?: AbortSignal } | undefined)?.abortSignal,\n );\n const messageList = this.createMessageList(messages, text);\n\n return {\n text,\n response: {\n dbMessages: messageList.get.response.db(),\n },\n toolResults: [],\n finishReason: 'stop',\n runId: options?.runId ?? randomUUID(),\n };\n }\n\n async resumeGenerate(): Promise<SubAgentGenerateResult> {\n throw new Error('AcpAgent does not support resuming suspended generate calls');\n }\n\n async resumeStream(): Promise<SubAgentStreamResult> {\n throw new Error('AcpAgent does not support resuming suspended stream calls');\n }\n\n async stream(messages: MessageListInput, options?: AgentStreamOptions): Promise<SubAgentStreamResult> {\n const runId = options?.runId ?? randomUUID();\n const prompt = this.getPrompt(messages, options?.instructions);\n const signal = (options as { abortSignal?: AbortSignal } | undefined)?.abortSignal;\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n\n let resolveText!: (text: string) => void;\n let rejectText!: (error: unknown) => void;\n const textPromise = new Promise<string>((resolve, reject) => {\n resolveText = resolve;\n rejectText = reject;\n });\n\n const fullStream = new ReadableStream<ChunkType>({\n start: async controller => {\n const textId = randomUUID();\n const chunks: string[] = [];\n const toolNames = new Map<string, string>();\n const toolResults: AcpToolResult[] = [];\n\n try {\n controller.enqueue({ type: 'text-start', runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });\n\n for await (const event of this.connection.promptStream(prompt, signal)) {\n if (event.type === 'text') {\n chunks.push(event.text);\n controller.enqueue({\n type: 'text-delta',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: { id: textId, text: event.text },\n });\n } else if (event.type === 'session-update') {\n for (const chunk of getMastraChunksFromACPUpdate(event.update, runId, toolNames)) {\n if (chunk.type === 'tool-result') {\n toolResults.push({ payload: chunk.payload });\n }\n controller.enqueue(chunk);\n }\n }\n }\n\n const text = chunks.join('');\n messageList.add([{ role: 'assistant', content: text }], 'response');\n\n controller.enqueue({ type: 'text-end', runId, from: CHUNK_FROM_AGENT, payload: { id: textId } });\n controller.enqueue(createFinishChunk('step-finish', runId));\n controller.enqueue(createFinishChunk('finish', runId));\n await options?.onFinish?.(createOnFinishResult({ text, runId, messageList, toolResults }) as any);\n resolveText(text);\n controller.close();\n } catch (error) {\n const text = chunks.join('');\n await options?.onFinish?.(createOnFinishResult({ text, runId, messageList, toolResults, error }) as any);\n rejectText(error);\n controller.error(error);\n }\n },\n });\n\n return {\n fullStream,\n text: textPromise,\n messageList,\n toolResults: [],\n runId,\n };\n }\n\n private getPrompt(messages: MessageListInput, instructions?: AgentInstructions): string {\n const prompt = extractText(messages);\n const instructionText = instructions ? extractInstructions(instructions) : '';\n\n if (!instructionText) {\n return prompt;\n }\n\n return `${instructionText}\\n\\n${prompt}`;\n }\n\n private createMessageList(messages: MessageListInput, text: string): MessageList {\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n messageList.add([{ role: 'assistant', content: text }], 'response');\n return messageList;\n }\n}\n\nfunction extractText(messages: MessageListInput): string {\n if (typeof messages === 'string') {\n return messages;\n }\n\n if (Array.isArray(messages) && messages.every(message => typeof message === 'string')) {\n return messages.join('\\n');\n }\n\n const messageList = new MessageList();\n messageList.add(messages, 'input');\n\n return messageList.get.all\n .core()\n .map(message => coreContentToString(message.content))\n .filter(Boolean)\n .join('\\n');\n}\n\nfunction extractInstructions(instructions: AgentInstructions): string {\n if (typeof instructions === 'string') {\n return instructions;\n }\n\n if (Array.isArray(instructions)) {\n return instructions.map(instruction => extractInstructions(instruction)).join('\\n');\n }\n\n return coreContentToString(instructions.content);\n}\n\nfunction getMastraChunksFromACPUpdate(\n update: SessionUpdate,\n runId: string,\n toolNames: Map<string, string>,\n): ChunkType[] {\n switch (update.sessionUpdate) {\n case 'tool_call': {\n const toolName = getToolName(update, toolNames);\n toolNames.set(update.toolCallId, toolName);\n\n return [\n {\n type: 'tool-call',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n args: toRecord(update.rawInput),\n },\n },\n ];\n }\n case 'tool_call_update': {\n const toolName = getToolName(update, toolNames);\n\n if (update.status === 'completed' || update.status === 'failed') {\n return [\n {\n type: 'tool-result',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n result: update.rawOutput ?? update.content ?? { status: update.status, title: update.title },\n isError: update.status === 'failed',\n },\n },\n ];\n }\n\n return [\n {\n type: 'tool-call-delta',\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n toolCallId: update.toolCallId,\n toolName,\n argsTextDelta: update.title ?? update.status ?? '',\n },\n },\n ];\n }\n default:\n return [];\n }\n}\n\nfunction getToolName(\n update: Extract<SessionUpdate, { sessionUpdate: 'tool_call' | 'tool_call_update' }>,\n toolNames: Map<string, string>,\n): string {\n return update.title ?? toolNames.get(update.toolCallId) ?? update.kind ?? 'acp_tool';\n}\n\nfunction toRecord(value: unknown): Record<string, unknown> {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n\n if (value === undefined) {\n return {};\n }\n\n return { input: value };\n}\n\nfunction createOnFinishResult({\n text,\n runId,\n messageList,\n toolResults,\n error,\n}: {\n text: string;\n runId: string;\n messageList: MessageList;\n toolResults: AcpToolResult[];\n error?: unknown;\n}) {\n const usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n\n return {\n text,\n finishReason: 'stop',\n usage,\n totalUsage: usage,\n warnings: [],\n response: {\n messages: messageList.get.response.aiV5.model(),\n },\n steps: [],\n toolResults,\n runId,\n ...(error === undefined ? {} : { error }),\n };\n}\n\nfunction createFinishChunk(type: 'step-finish' | 'finish', runId: string): ChunkType {\n return {\n type,\n runId,\n from: CHUNK_FROM_AGENT,\n payload: {\n id: randomUUID(),\n output: {\n steps: [],\n usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n },\n stepResult: {\n reason: 'stop',\n warnings: [],\n isContinued: false,\n },\n metadata: {},\n messages: { nonUser: [], all: [] },\n },\n } as unknown as ChunkType;\n}\n","import { ACPConnection } from './connection';\nimport type { CreateACPToolOptions } from './types';\n\nexport class ACPToolSession {\n private connection?: ACPConnection;\n\n constructor(private readonly options: CreateACPToolOptions) {}\n\n getConnection(workspace: CreateACPToolOptions['workspace']): ACPConnection {\n if (this.options.persistSession === false) {\n return this.createConnection(workspace);\n }\n\n this.connection ??= this.createConnection(workspace);\n return this.connection;\n }\n\n private createConnection(workspace: CreateACPToolOptions['workspace']): ACPConnection {\n return new ACPConnection({\n ...this.options,\n workspace: workspace ?? this.options.workspace,\n });\n }\n}\n","\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: {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"type\": \"object\",\n \"properties\": {\n \"task\": {\n \"type\": \"string\",\n \"description\": \"The task to send to the ACP agent\"\n }\n },\n \"required\": [\n \"task\"\n ]\n},\n outputSchema: {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"type\": \"object\",\n \"properties\": {\n \"output\": {\n \"type\": \"string\",\n \"description\": \"The output of the ACP agent\"\n }\n },\n \"required\": [\n \"output\"\n ]\n},\n suspendSchema: {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"type\": \"object\",\n \"properties\": {\n \"permissionRequest\": {\n \"type\": \"object\",\n \"properties\": {\n \"title\": {\n \"type\": \"string\",\n \"description\": \"The title of the permission request\"\n },\n \"options\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"optionId\": {\n \"type\": \"string\",\n \"description\": \"The option id to select\"\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"The title of the permission request\"\n }\n },\n \"required\": [\n \"optionId\",\n \"name\"\n ]\n }\n }\n },\n \"required\": [\n \"title\",\n \"options\"\n ]\n }\n },\n \"required\": [\n \"permissionRequest\"\n ]\n},\n resumeSchema: {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"anyOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"optionId\": {\n \"description\": \"The option id to select\",\n \"type\": \"string\"\n },\n \"outcome\": {\n \"description\": \"The outcome of the permission request\",\n \"type\": \"string\",\n \"const\": \"selected\"\n }\n }\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"outcome\": {\n \"description\": \"The outcome of the permission request\",\n \"type\": \"string\",\n \"const\": \"cancelled\"\n }\n }\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"]}
|
package/dist/index.js
CHANGED
|
@@ -598,7 +598,32 @@ function createFinishChunk(type, runId) {
|
|
|
598
598
|
}
|
|
599
599
|
};
|
|
600
600
|
}
|
|
601
|
+
|
|
602
|
+
// src/session.ts
|
|
603
|
+
var ACPToolSession = class {
|
|
604
|
+
constructor(options) {
|
|
605
|
+
this.options = options;
|
|
606
|
+
}
|
|
607
|
+
options;
|
|
608
|
+
connection;
|
|
609
|
+
getConnection(workspace) {
|
|
610
|
+
if (this.options.persistSession === false) {
|
|
611
|
+
return this.createConnection(workspace);
|
|
612
|
+
}
|
|
613
|
+
this.connection ??= this.createConnection(workspace);
|
|
614
|
+
return this.connection;
|
|
615
|
+
}
|
|
616
|
+
createConnection(workspace) {
|
|
617
|
+
return new ACPConnection({
|
|
618
|
+
...this.options,
|
|
619
|
+
workspace: workspace ?? this.options.workspace
|
|
620
|
+
});
|
|
621
|
+
}
|
|
622
|
+
};
|
|
623
|
+
|
|
624
|
+
// src/tool.ts
|
|
601
625
|
function createACPTool(options) {
|
|
626
|
+
const session = new ACPToolSession(options);
|
|
602
627
|
return createTool({
|
|
603
628
|
id: options.id,
|
|
604
629
|
description: options.description,
|
|
@@ -701,10 +726,7 @@ function createACPTool(options) {
|
|
|
701
726
|
},
|
|
702
727
|
execute: async ({ task }, context) => {
|
|
703
728
|
const workspace = await context?.mastra?.getWorkspace();
|
|
704
|
-
const connection =
|
|
705
|
-
...options,
|
|
706
|
-
workspace
|
|
707
|
-
});
|
|
729
|
+
const connection = session.getConnection(workspace);
|
|
708
730
|
const output = await connection.prompt(task, context?.abortSignal);
|
|
709
731
|
return { output };
|
|
710
732
|
}
|