mastracode 0.25.0-alpha.2 → 0.25.0-alpha.3

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 CHANGED
@@ -1,5 +1,20 @@
1
1
  # mastracode
2
2
 
3
+ ## 0.25.0-alpha.3
4
+
5
+ ### Patch Changes
6
+
7
+ - Added a public ACP export so workflows can import the ACP agent with `import { MastraCodeAcpAgent } from 'mastracode/acp'`. ([#18367](https://github.com/mastra-ai/mastra/pull/18367))
8
+
9
+ - Fixed ACP server mode so sessions can start, receive prompts, and handle tool approvals after the Harness session changes. ([#18367](https://github.com/mastra-ai/mastra/pull/18367))
10
+
11
+ - Updated dependencies [[`b4a43c7`](https://github.com/mastra-ai/mastra/commit/b4a43c705c961d24c9888690ae84451ca1630197), [`65f255a`](https://github.com/mastra-ai/mastra/commit/65f255a38667beb6ceeadabfa9eb5059bfec8298), [`4a88c6e`](https://github.com/mastra-ai/mastra/commit/4a88c6e2bdce316f8d7551b4ec3449b0b06fc71c), [`87a17ef`](https://github.com/mastra-ai/mastra/commit/87a17efbd725aca6639febdc5e69e2abb3048689), [`e11ff30`](https://github.com/mastra-ai/mastra/commit/e11ff301408bf1731dca2fb7fbfcd8c819500a35), [`9d2c946`](https://github.com/mastra-ai/mastra/commit/9d2c946d0859e90ae4bcec5beeb1da7398d2ad1e), [`f1ec385`](https://github.com/mastra-ai/mastra/commit/f1ec385386f62b1a0847ec5353ae2bb169d1c3d9), [`e14986f`](https://github.com/mastra-ai/mastra/commit/e14986f6e5478d6384d04ff9a7f9a79a46a8b529), [`0be490f`](https://github.com/mastra-ai/mastra/commit/0be490fabb538c5a7de796ea0aff7d04a0bea1f3), [`0be490f`](https://github.com/mastra-ai/mastra/commit/0be490fabb538c5a7de796ea0aff7d04a0bea1f3), [`974f614`](https://github.com/mastra-ai/mastra/commit/974f614e083bd68278536f94453f7b320b86a3c7), [`25d1854`](https://github.com/mastra-ai/mastra/commit/25d18545337e615f3fc573ddbfc0c413157bd148), [`42b13ad`](https://github.com/mastra-ai/mastra/commit/42b13ad9d92a9d72ea6e96a8c87bf83797167eac), [`cff28df`](https://github.com/mastra-ai/mastra/commit/cff28df33476e41c9538cf9dba7fc8013d69ebb1), [`31be1cf`](https://github.com/mastra-ai/mastra/commit/31be1cf5f2a7b5eef12f6123a40653b4d8115c16), [`31be1cf`](https://github.com/mastra-ai/mastra/commit/31be1cf5f2a7b5eef12f6123a40653b4d8115c16)]:
12
+ - @mastra/pg@1.14.1-alpha.0
13
+ - @mastra/core@1.46.0-alpha.3
14
+ - @mastra/libsql@1.14.1-alpha.0
15
+ - @mastra/observability@1.15.1-alpha.0
16
+ - @mastra/memory@1.21.1-alpha.1
17
+
3
18
  ## 0.25.0-alpha.2
4
19
 
5
20
  ### Minor Changes
@@ -1,5 +1,5 @@
1
1
  import type { Agent, AgentSideConnection, InitializeRequest, InitializeResponse, NewSessionRequest, NewSessionResponse, PromptRequest, PromptResponse, CancelNotification, ContentBlock } from '@agentclientprotocol/sdk';
2
- import type { Harness, HarnessMode } from '@mastra/core/harness';
2
+ import type { Harness, HarnessMode, Session } from '@mastra/core/harness';
3
3
  /**
4
4
  * ACP Agent implementation that wraps a mastracode Harness.
5
5
  * Each instance represents one ACP connection from a client.
@@ -7,12 +7,15 @@ import type { Harness, HarnessMode } from '@mastra/core/harness';
7
7
  export declare class MastraCodeAcpAgent implements Agent {
8
8
  private readonly connection;
9
9
  private readonly harness;
10
+ private readonly session;
10
11
  private readonly modes;
12
+ private readonly unsubscribeSessionEvents;
11
13
  private readonly sessionMap;
12
14
  private currentPromptState;
13
15
  private promptMutex;
14
16
  private getThreadIdOrThrow;
15
- constructor(connection: AgentSideConnection, harness: Harness, modes: HarnessMode[]);
17
+ constructor(connection: AgentSideConnection, harness: Harness, session: Session, modes: HarnessMode[]);
18
+ dispose(): void;
16
19
  initialize(_request: InitializeRequest): Promise<InitializeResponse>;
17
20
  authenticate(): Promise<void>;
18
21
  newSession(_request: NewSessionRequest): Promise<NewSessionResponse>;
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/acp/agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,YAAY,EACb,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAIjE;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,KAAK;IAC9C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsB;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IACxD,OAAO,CAAC,kBAAkB,CAA4B;IACtD,OAAO,CAAC,WAAW,CAAoC;IAEvD,OAAO,CAAC,kBAAkB;gBAQd,UAAU,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE;IAW7E,UAAU,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAcpE,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,UAAU,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA0CpE,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAqEvD,MAAM,CAAC,aAAa,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxD,cAAc,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5E,wBAAwB,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAK9F;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,CAY3E;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,GACrD,UAAU,GAAG,WAAW,GAAG,YAAY,GAAG,mBAAmB,GAAG,SAAS,CAW3E"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/acp/agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,YAAY,EACb,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAI1E;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,KAAK;IAC9C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsB;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAa;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IACxD,OAAO,CAAC,kBAAkB,CAA4B;IACtD,OAAO,CAAC,WAAW,CAAoC;IAEvD,OAAO,CAAC,kBAAkB;gBAQd,UAAU,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE;IAYrG,OAAO,IAAI,IAAI;IAIT,UAAU,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAcpE,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,UAAU,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA0CpE,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAsEvD,MAAM,CAAC,aAAa,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxD,cAAc,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5E,wBAAwB,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAK9F;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,CAY3E;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,GACrD,UAAU,GAAG,WAAW,GAAG,YAAY,GAAG,mBAAmB,GAAG,SAAS,CAW3E"}
@@ -1,5 +1,5 @@
1
1
  import type { AgentSideConnection } from '@agentclientprotocol/sdk';
2
- import type { Harness, HarnessEvent, TokenUsage } from '@mastra/core/harness';
2
+ import type { HarnessEvent, Session, TokenUsage } from '@mastra/core/harness';
3
3
  /**
4
4
  * Enable or disable automatic tool approval (set via --dangerous-auto-approve CLI flag).
5
5
  */
@@ -18,5 +18,5 @@ export interface PromptState {
18
18
  * via the provided connection. Returns null for events that don't produce
19
19
  * a session update.
20
20
  */
21
- export declare function handleHarnessEvent(event: HarnessEvent, state: PromptState | null, connection: AgentSideConnection, harness: Harness): void;
21
+ export declare function handleHarnessEvent(event: HarnessEvent, state: PromptState | null, connection: AgentSideConnection, session: Session): void;
22
22
  //# sourceMappingURL=event-mapper.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"event-mapper.d.ts","sourceRoot":"","sources":["../../src/acp/event-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiD,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACnH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAI9E;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAEnD;AA4BD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,KAAK,IAAI,CAAC;CAC3E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,WAAW,GAAG,IAAI,EACzB,UAAU,EAAE,mBAAmB,EAC/B,OAAO,EAAE,OAAO,GACf,IAAI,CAyEN"}
1
+ {"version":3,"file":"event-mapper.d.ts","sourceRoot":"","sources":["../../src/acp/event-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiD,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACnH,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAI9E;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAEnD;AA4BD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,KAAK,IAAI,CAAC;CAC3E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,WAAW,GAAG,IAAI,EACzB,UAAU,EAAE,mBAAmB,EAC/B,OAAO,EAAE,OAAO,GACf,IAAI,CAyEN"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/acp/server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGjE;;;GAGG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,WAAW,EAAE,EACpB,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CAiBf"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/acp/server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAW,MAAM,sBAAsB,CAAC;AAG1E;;;GAGG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,WAAW,EAAE,EACpB,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
@@ -0,0 +1,81 @@
1
+ import { createMastraCode } from './chunk-TZBT6UPD.js';
2
+ import { releaseAllThreadLocks } from './chunk-ONKJTRKR.js';
3
+ import { setAutoApprove, MastraCodeAcpAgent } from './chunk-IU477VVQ.js';
4
+ import { Readable, Writable } from 'stream';
5
+ import { ndJsonStream, AgentSideConnection } from '@agentclientprotocol/sdk';
6
+
7
+ async function runAcpServer(harness, modes, cleanup) {
8
+ const input = Readable.toWeb(process.stdin);
9
+ const output = Writable.toWeb(process.stdout);
10
+ const stream = ndJsonStream(output, input);
11
+ let session;
12
+ let agent;
13
+ try {
14
+ session = await harness.createSession();
15
+ const activeSession = session;
16
+ const connection = new AgentSideConnection((conn) => {
17
+ agent = new MastraCodeAcpAgent(conn, harness, activeSession, modes);
18
+ return agent;
19
+ }, stream);
20
+ await connection.closed;
21
+ } finally {
22
+ agent?.dispose();
23
+ session?.thread.detachFromCurrent();
24
+ await session?.thread.clearAndReleaseLock();
25
+ if (cleanup) {
26
+ await cleanup();
27
+ }
28
+ }
29
+ }
30
+
31
+ // src/acp/index.ts
32
+ async function acpMain(options) {
33
+ if (options?.dangerousAutoApprove) {
34
+ setAutoApprove(true);
35
+ }
36
+ const originalConsoleLog = console.log;
37
+ console.log = (...args) => {
38
+ process.stderr.write(args.map(String).join(" ") + "\n");
39
+ };
40
+ let result;
41
+ try {
42
+ result = await createMastraCode({
43
+ unixSocketPubSub: false,
44
+ disableMcp: false,
45
+ disableHooks: false
46
+ });
47
+ const { harness, mcpManager, signalsPubSub } = result;
48
+ const modes = [
49
+ { id: "build", name: "Build" },
50
+ { id: "plan", name: "Plan" },
51
+ { id: "fast", name: "Fast" }
52
+ ];
53
+ const cleanup = async () => {
54
+ releaseAllThreadLocks();
55
+ const closeSignalsPubSub = signalsPubSub?.close;
56
+ await Promise.allSettled([
57
+ mcpManager?.disconnect(),
58
+ harness?.getMastra()?.stopWorkers(),
59
+ harness?.stopHeartbeats(),
60
+ closeSignalsPubSub?.()
61
+ ]);
62
+ console.log = originalConsoleLog;
63
+ };
64
+ const handleSignal = async () => {
65
+ await cleanup();
66
+ process.exit(0);
67
+ };
68
+ process.on("SIGINT", handleSignal);
69
+ process.on("SIGTERM", handleSignal);
70
+ await runAcpServer(harness, modes, cleanup);
71
+ } catch (error) {
72
+ process.stderr.write(`[acp] Fatal error: ${error}
73
+ `);
74
+ console.log = originalConsoleLog;
75
+ process.exit(1);
76
+ }
77
+ }
78
+
79
+ export { acpMain };
80
+ //# sourceMappingURL=acp-AG6ZSKEK.js.map
81
+ //# sourceMappingURL=acp-AG6ZSKEK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/acp/server.ts","../src/acp/index.ts"],"names":[],"mappings":"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","file":"acp-AG6ZSKEK.js","sourcesContent":["import { Readable, Writable } from 'node:stream';\nimport { AgentSideConnection, ndJsonStream } from '@agentclientprotocol/sdk';\nimport type { Harness, HarnessMode, Session } from '@mastra/core/harness';\nimport { MastraCodeAcpAgent } from './agent.js';\n\n/**\n * Run the ACP server over stdio.\n * This sets up the JSON-RPC stream and keeps the process alive until the client disconnects.\n */\nexport async function runAcpServer(\n harness: Harness,\n modes: HarnessMode[],\n cleanup?: () => Promise<void>,\n): Promise<void> {\n // Create the ndJSON stream from stdin/stdout\n const input = Readable.toWeb(process.stdin) as ReadableStream<Uint8Array>;\n const output = Writable.toWeb(process.stdout) as WritableStream<Uint8Array>;\n const stream = ndJsonStream(output, input);\n let session: Session | undefined;\n let agent: MastraCodeAcpAgent | undefined;\n\n // Handle cleanup on disconnect (success or error)\n try {\n session = await harness.createSession();\n const activeSession = session;\n\n // Create the agent-side connection\n const connection = new AgentSideConnection(conn => {\n agent = new MastraCodeAcpAgent(conn, harness, activeSession, modes);\n return agent;\n }, stream);\n\n await connection.closed;\n } finally {\n agent?.dispose();\n session?.thread.detachFromCurrent();\n await session?.thread.clearAndReleaseLock();\n if (cleanup) {\n await cleanup();\n }\n }\n}\n","import type { HarnessMode } from '@mastra/core/harness';\n\nimport { createMastraCode } from '../index.js';\nimport { releaseAllThreadLocks } from '../utils/thread-lock.js';\nimport { setAutoApprove } from './event-mapper.js';\nimport { runAcpServer } from './server.js';\n\n/**\n * Entry point for ACP server mode.\n * Initializes mastracode and runs the ACP protocol over stdio.\n */\nexport async function acpMain(options?: { dangerousAutoApprove?: boolean }): Promise<void> {\n if (options?.dangerousAutoApprove) {\n setAutoApprove(true);\n }\n // Redirect console.log to stderr to avoid polluting the JSON-RPC stream on stdout.\n // eslint-disable-next-line no-console\n const originalConsoleLog = console.log;\n // eslint-disable-next-line no-console\n console.log = (...args: unknown[]) => {\n process.stderr.write(args.map(String).join(' ') + '\\n');\n };\n\n let result: Awaited<ReturnType<typeof createMastraCode>> | undefined;\n\n try {\n result = await createMastraCode({\n unixSocketPubSub: false,\n disableMcp: false,\n disableHooks: false,\n });\n\n const { harness, mcpManager, signalsPubSub } = result;\n\n // Default modes (same as createMastraCode defaults)\n const modes: HarnessMode[] = [\n { id: 'build', name: 'Build' },\n { id: 'plan', name: 'Plan' },\n { id: 'fast', name: 'Fast' },\n ];\n\n // Cleanup function (mirrors main.ts asyncCleanup)\n const cleanup = async () => {\n releaseAllThreadLocks();\n const closeSignalsPubSub = (signalsPubSub as { close?: () => Promise<void> | void } | undefined)?.close;\n await Promise.allSettled([\n mcpManager?.disconnect(),\n harness?.getMastra()?.stopWorkers(),\n harness?.stopHeartbeats(),\n closeSignalsPubSub?.(),\n ]);\n\n // Restore console.log\n // eslint-disable-next-line no-console\n console.log = originalConsoleLog;\n };\n\n // Handle signals\n const handleSignal = async () => {\n await cleanup();\n process.exit(0);\n };\n\n process.on('SIGINT', handleSignal);\n process.on('SIGTERM', handleSignal);\n\n await runAcpServer(harness, modes, cleanup);\n } catch (error) {\n process.stderr.write(`[acp] Fatal error: ${error}\\n`);\n // eslint-disable-next-line no-console\n console.log = originalConsoleLog;\n process.exit(1);\n }\n}\n"]}
@@ -0,0 +1,83 @@
1
+ 'use strict';
2
+
3
+ var chunkXBRRTTRT_cjs = require('./chunk-XBRRTTRT.cjs');
4
+ var chunkIK6NZ3MB_cjs = require('./chunk-IK6NZ3MB.cjs');
5
+ var chunkDPRNPXVC_cjs = require('./chunk-DPRNPXVC.cjs');
6
+ var stream = require('stream');
7
+ var sdk = require('@agentclientprotocol/sdk');
8
+
9
+ async function runAcpServer(harness, modes, cleanup) {
10
+ const input = stream.Readable.toWeb(process.stdin);
11
+ const output = stream.Writable.toWeb(process.stdout);
12
+ const stream$1 = sdk.ndJsonStream(output, input);
13
+ let session;
14
+ let agent;
15
+ try {
16
+ session = await harness.createSession();
17
+ const activeSession = session;
18
+ const connection = new sdk.AgentSideConnection((conn) => {
19
+ agent = new chunkDPRNPXVC_cjs.MastraCodeAcpAgent(conn, harness, activeSession, modes);
20
+ return agent;
21
+ }, stream$1);
22
+ await connection.closed;
23
+ } finally {
24
+ agent?.dispose();
25
+ session?.thread.detachFromCurrent();
26
+ await session?.thread.clearAndReleaseLock();
27
+ if (cleanup) {
28
+ await cleanup();
29
+ }
30
+ }
31
+ }
32
+
33
+ // src/acp/index.ts
34
+ async function acpMain(options) {
35
+ if (options?.dangerousAutoApprove) {
36
+ chunkDPRNPXVC_cjs.setAutoApprove(true);
37
+ }
38
+ const originalConsoleLog = console.log;
39
+ console.log = (...args) => {
40
+ process.stderr.write(args.map(String).join(" ") + "\n");
41
+ };
42
+ let result;
43
+ try {
44
+ result = await chunkXBRRTTRT_cjs.createMastraCode({
45
+ unixSocketPubSub: false,
46
+ disableMcp: false,
47
+ disableHooks: false
48
+ });
49
+ const { harness, mcpManager, signalsPubSub } = result;
50
+ const modes = [
51
+ { id: "build", name: "Build" },
52
+ { id: "plan", name: "Plan" },
53
+ { id: "fast", name: "Fast" }
54
+ ];
55
+ const cleanup = async () => {
56
+ chunkIK6NZ3MB_cjs.releaseAllThreadLocks();
57
+ const closeSignalsPubSub = signalsPubSub?.close;
58
+ await Promise.allSettled([
59
+ mcpManager?.disconnect(),
60
+ harness?.getMastra()?.stopWorkers(),
61
+ harness?.stopHeartbeats(),
62
+ closeSignalsPubSub?.()
63
+ ]);
64
+ console.log = originalConsoleLog;
65
+ };
66
+ const handleSignal = async () => {
67
+ await cleanup();
68
+ process.exit(0);
69
+ };
70
+ process.on("SIGINT", handleSignal);
71
+ process.on("SIGTERM", handleSignal);
72
+ await runAcpServer(harness, modes, cleanup);
73
+ } catch (error) {
74
+ process.stderr.write(`[acp] Fatal error: ${error}
75
+ `);
76
+ console.log = originalConsoleLog;
77
+ process.exit(1);
78
+ }
79
+ }
80
+
81
+ exports.acpMain = acpMain;
82
+ //# sourceMappingURL=acp-ITZASSOJ.cjs.map
83
+ //# sourceMappingURL=acp-ITZASSOJ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/acp/server.ts","../src/acp/index.ts"],"names":["Readable","Writable","stream","ndJsonStream","AgentSideConnection","MastraCodeAcpAgent","setAutoApprove","createMastraCode","releaseAllThreadLocks"],"mappings":"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","file":"acp-ITZASSOJ.cjs","sourcesContent":["import { Readable, Writable } from 'node:stream';\nimport { AgentSideConnection, ndJsonStream } from '@agentclientprotocol/sdk';\nimport type { Harness, HarnessMode, Session } from '@mastra/core/harness';\nimport { MastraCodeAcpAgent } from './agent.js';\n\n/**\n * Run the ACP server over stdio.\n * This sets up the JSON-RPC stream and keeps the process alive until the client disconnects.\n */\nexport async function runAcpServer(\n harness: Harness,\n modes: HarnessMode[],\n cleanup?: () => Promise<void>,\n): Promise<void> {\n // Create the ndJSON stream from stdin/stdout\n const input = Readable.toWeb(process.stdin) as ReadableStream<Uint8Array>;\n const output = Writable.toWeb(process.stdout) as WritableStream<Uint8Array>;\n const stream = ndJsonStream(output, input);\n let session: Session | undefined;\n let agent: MastraCodeAcpAgent | undefined;\n\n // Handle cleanup on disconnect (success or error)\n try {\n session = await harness.createSession();\n const activeSession = session;\n\n // Create the agent-side connection\n const connection = new AgentSideConnection(conn => {\n agent = new MastraCodeAcpAgent(conn, harness, activeSession, modes);\n return agent;\n }, stream);\n\n await connection.closed;\n } finally {\n agent?.dispose();\n session?.thread.detachFromCurrent();\n await session?.thread.clearAndReleaseLock();\n if (cleanup) {\n await cleanup();\n }\n }\n}\n","import type { HarnessMode } from '@mastra/core/harness';\n\nimport { createMastraCode } from '../index.js';\nimport { releaseAllThreadLocks } from '../utils/thread-lock.js';\nimport { setAutoApprove } from './event-mapper.js';\nimport { runAcpServer } from './server.js';\n\n/**\n * Entry point for ACP server mode.\n * Initializes mastracode and runs the ACP protocol over stdio.\n */\nexport async function acpMain(options?: { dangerousAutoApprove?: boolean }): Promise<void> {\n if (options?.dangerousAutoApprove) {\n setAutoApprove(true);\n }\n // Redirect console.log to stderr to avoid polluting the JSON-RPC stream on stdout.\n // eslint-disable-next-line no-console\n const originalConsoleLog = console.log;\n // eslint-disable-next-line no-console\n console.log = (...args: unknown[]) => {\n process.stderr.write(args.map(String).join(' ') + '\\n');\n };\n\n let result: Awaited<ReturnType<typeof createMastraCode>> | undefined;\n\n try {\n result = await createMastraCode({\n unixSocketPubSub: false,\n disableMcp: false,\n disableHooks: false,\n });\n\n const { harness, mcpManager, signalsPubSub } = result;\n\n // Default modes (same as createMastraCode defaults)\n const modes: HarnessMode[] = [\n { id: 'build', name: 'Build' },\n { id: 'plan', name: 'Plan' },\n { id: 'fast', name: 'Fast' },\n ];\n\n // Cleanup function (mirrors main.ts asyncCleanup)\n const cleanup = async () => {\n releaseAllThreadLocks();\n const closeSignalsPubSub = (signalsPubSub as { close?: () => Promise<void> | void } | undefined)?.close;\n await Promise.allSettled([\n mcpManager?.disconnect(),\n harness?.getMastra()?.stopWorkers(),\n harness?.stopHeartbeats(),\n closeSignalsPubSub?.(),\n ]);\n\n // Restore console.log\n // eslint-disable-next-line no-console\n console.log = originalConsoleLog;\n };\n\n // Handle signals\n const handleSignal = async () => {\n await cleanup();\n process.exit(0);\n };\n\n process.on('SIGINT', handleSignal);\n process.on('SIGTERM', handleSignal);\n\n await runAcpServer(harness, modes, cleanup);\n } catch (error) {\n process.stderr.write(`[acp] Fatal error: ${error}\\n`);\n // eslint-disable-next-line no-console\n console.log = originalConsoleLog;\n process.exit(1);\n }\n}\n"]}
package/dist/acp.cjs ADDED
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ var chunkDPRNPXVC_cjs = require('./chunk-DPRNPXVC.cjs');
4
+
5
+
6
+
7
+ Object.defineProperty(exports, "MastraCodeAcpAgent", {
8
+ enumerable: true,
9
+ get: function () { return chunkDPRNPXVC_cjs.MastraCodeAcpAgent; }
10
+ });
11
+ //# sourceMappingURL=acp.cjs.map
12
+ //# sourceMappingURL=acp.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"acp.cjs"}
package/dist/acp.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export { MastraCodeAcpAgent } from './acp/agent.js';
2
+ //# sourceMappingURL=acp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp.d.ts","sourceRoot":"","sources":["../src/acp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/acp.js ADDED
@@ -0,0 +1,3 @@
1
+ export { MastraCodeAcpAgent } from './chunk-IU477VVQ.js';
2
+ //# sourceMappingURL=acp.js.map
3
+ //# sourceMappingURL=acp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"acp.js"}
@@ -1,8 +1,5 @@
1
1
  'use strict';
2
2
 
3
- var chunkXBRRTTRT_cjs = require('./chunk-XBRRTTRT.cjs');
4
- var chunkIK6NZ3MB_cjs = require('./chunk-IK6NZ3MB.cjs');
5
- var stream = require('stream');
6
3
  var sdk = require('@agentclientprotocol/sdk');
7
4
 
8
5
  // src/acp/event-mapper.ts
@@ -24,7 +21,7 @@ function mapToolKind(toolName) {
24
21
  if (name.includes("think") || name.includes("reason")) return "think";
25
22
  return "other";
26
23
  }
27
- function handleHarnessEvent(event, state, connection, harness) {
24
+ function handleHarnessEvent(event, state, connection, session) {
28
25
  if (!state) return;
29
26
  switch (event.type) {
30
27
  case "agent_start":
@@ -65,13 +62,13 @@ function handleHarnessEvent(event, state, connection, harness) {
65
62
  });
66
63
  break;
67
64
  case "tool_approval_required":
68
- void handleToolApproval(state, connection, harness, event).catch((err) => {
65
+ void handleToolApproval(state, connection, session, event).catch((err) => {
69
66
  process.stderr.write(`[acp] handleToolApproval error: ${err}
70
67
  `);
71
68
  });
72
69
  break;
73
70
  case "tool_suspended":
74
- void handleToolSuspended(state, connection, harness, event).catch((err) => {
71
+ void handleToolSuspended(state, connection, session, event).catch((err) => {
75
72
  process.stderr.write(`[acp] handleToolSuspended error: ${err}
76
73
  `);
77
74
  });
@@ -90,9 +87,9 @@ function sendUpdate(connection, sessionId, update) {
90
87
  `);
91
88
  });
92
89
  }
93
- async function handleToolApproval(state, connection, harness, event) {
90
+ async function handleToolApproval(state, connection, session, event) {
94
91
  if (autoApprove) {
95
- harness.session.respondToToolApproval({ decision: "approve" });
92
+ session.respondToToolApproval({ decision: "approve" });
96
93
  return;
97
94
  }
98
95
  const req = {
@@ -111,20 +108,20 @@ async function handleToolApproval(state, connection, harness, event) {
111
108
  const resp = await connection.requestPermission(req);
112
109
  if (resp.outcome.outcome === "selected") {
113
110
  const decision = resp.outcome.optionId === "approve" ? "approve" : "decline";
114
- harness.session.respondToToolApproval({ decision });
111
+ session.respondToToolApproval({ decision });
115
112
  } else {
116
- harness.session.respondToToolApproval({ decision: "decline" });
113
+ session.respondToToolApproval({ decision: "decline" });
117
114
  }
118
115
  } catch (err) {
119
116
  process.stderr.write(`[acp] requestPermission error: ${err}
120
117
  `);
121
- harness.session.respondToToolApproval({ decision: "decline" });
118
+ session.respondToToolApproval({ decision: "decline" });
122
119
  }
123
120
  }
124
- async function handleToolSuspended(state, connection, harness, event) {
121
+ async function handleToolSuspended(state, connection, session, event) {
125
122
  const { toolCallId, toolName, args, suspendPayload } = event;
126
123
  if (toolName === "request_access" || suspendPayload?.kind === "sandbox_access_request") {
127
- harness.respondToToolSuspension({ toolCallId, resumeData: "Yes" });
124
+ void session.respondToToolSuspension({ toolCallId, resumeData: "Yes" });
128
125
  return;
129
126
  }
130
127
  if (toolName === "submit_plan") {
@@ -143,13 +140,13 @@ async function handleToolSuspended(state, connection, harness, event) {
143
140
  try {
144
141
  const resp = await connection.requestPermission(req);
145
142
  const action = resp.outcome.outcome === "selected" && resp.outcome.optionId === "approve" ? "approved" : "rejected";
146
- harness.respondToToolSuspension({ toolCallId, resumeData: { action } });
143
+ void session.respondToToolSuspension({ toolCallId, resumeData: { action } });
147
144
  } catch {
148
- harness.respondToToolSuspension({ toolCallId, resumeData: { action: "rejected" } });
145
+ void session.respondToToolSuspension({ toolCallId, resumeData: { action: "rejected" } });
149
146
  }
150
147
  return;
151
148
  }
152
- harness.respondToToolSuspension({
149
+ void session.respondToToolSuspension({
153
150
  toolCallId,
154
151
  resumeData: "Proceed with your best judgment. Do not ask further questions."
155
152
  });
@@ -167,7 +164,9 @@ function accumulateUsage(target, usage) {
167
164
  var MastraCodeAcpAgent = class {
168
165
  connection;
169
166
  harness;
167
+ session;
170
168
  modes;
169
+ unsubscribeSessionEvents;
171
170
  sessionMap = /* @__PURE__ */ new Map();
172
171
  // sessionId -> threadId
173
172
  currentPromptState = null;
@@ -179,14 +178,18 @@ var MastraCodeAcpAgent = class {
179
178
  }
180
179
  return threadId;
181
180
  }
182
- constructor(connection, harness, modes) {
181
+ constructor(connection, harness, session, modes) {
183
182
  this.connection = connection;
184
183
  this.harness = harness;
184
+ this.session = session;
185
185
  this.modes = modes;
186
- this.harness.subscribe((event) => {
187
- handleHarnessEvent(event, this.currentPromptState, this.connection, this.harness);
186
+ this.unsubscribeSessionEvents = this.session.subscribe((event) => {
187
+ handleHarnessEvent(event, this.currentPromptState, this.connection, this.session);
188
188
  });
189
189
  }
190
+ dispose() {
191
+ this.unsubscribeSessionEvents();
192
+ }
190
193
  async initialize(_request) {
191
194
  return {
192
195
  protocolVersion: sdk.PROTOCOL_VERSION,
@@ -203,19 +206,19 @@ var MastraCodeAcpAgent = class {
203
206
  async authenticate() {
204
207
  }
205
208
  async newSession(_request) {
206
- const thread = await this.harness.createThread();
209
+ const thread = await this.session.thread.create();
207
210
  const sessionId = thread.id;
208
211
  this.sessionMap.set(sessionId, thread.id);
209
- await this.harness.switchThread({ threadId: thread.id });
212
+ await this.session.thread.switch({ threadId: thread.id });
210
213
  const availableModes = this.modes.map((m) => ({
211
214
  id: m.id,
212
215
  name: m.name ?? m.id
213
216
  }));
214
- const currentModeId = this.harness.session.mode.get();
217
+ const currentModeId = this.session.mode.get();
215
218
  let models;
216
219
  try {
217
220
  const availableModels = await this.harness.listAvailableModels();
218
- const currentModelId = this.harness.session.model.get();
221
+ const currentModelId = this.session.model.get();
219
222
  models = {
220
223
  currentModelId: currentModelId ?? "",
221
224
  availableModels: availableModels.map((m) => ({
@@ -238,7 +241,6 @@ var MastraCodeAcpAgent = class {
238
241
  const { sessionId, prompt: contentBlocks } = request;
239
242
  const text = extractTextFromContentBlocks(contentBlocks);
240
243
  const threadId = this.getThreadIdOrThrow(sessionId);
241
- await this.harness.switchThread({ threadId });
242
244
  const prevMutex = this.promptMutex;
243
245
  let resolveMutex;
244
246
  this.promptMutex = new Promise((resolve) => {
@@ -246,6 +248,7 @@ var MastraCodeAcpAgent = class {
246
248
  });
247
249
  await prevMutex;
248
250
  try {
251
+ await this.session.thread.switch({ threadId });
249
252
  const result = new Promise((resolve) => {
250
253
  const usage2 = {
251
254
  promptTokens: 0,
@@ -263,7 +266,7 @@ var MastraCodeAcpAgent = class {
263
266
  };
264
267
  });
265
268
  try {
266
- await this.harness.sendMessage({ content: text });
269
+ await this.session.sendMessage({ content: text });
267
270
  } catch (error) {
268
271
  this.currentPromptState = null;
269
272
  throw error;
@@ -285,17 +288,17 @@ var MastraCodeAcpAgent = class {
285
288
  }
286
289
  }
287
290
  async cancel(_notification) {
288
- this.harness.abort();
291
+ this.session.abort();
289
292
  }
290
293
  async setSessionMode(params) {
291
294
  const threadId = this.getThreadIdOrThrow(params.sessionId);
292
- await this.harness.switchThread({ threadId });
293
- this.harness.session.mode.set({ modeId: params.modeId });
295
+ await this.session.thread.switch({ threadId });
296
+ this.session.mode.set({ modeId: params.modeId });
294
297
  }
295
298
  async unstable_setSessionModel(params) {
296
299
  const threadId = this.getThreadIdOrThrow(params.sessionId);
297
- await this.harness.switchThread({ threadId });
298
- this.harness.session.model.set({ modelId: params.modelId });
300
+ await this.session.thread.switch({ threadId });
301
+ this.session.model.set({ modelId: params.modelId });
299
302
  }
300
303
  };
301
304
  function extractTextFromContentBlocks(blocks) {
@@ -324,69 +327,7 @@ function mapStopReason(reason) {
324
327
  }
325
328
  }
326
329
 
327
- // src/acp/server.ts
328
- async function runAcpServer(harness, modes, cleanup) {
329
- const input = stream.Readable.toWeb(process.stdin);
330
- const output = stream.Writable.toWeb(process.stdout);
331
- const stream$1 = sdk.ndJsonStream(output, input);
332
- const connection = new sdk.AgentSideConnection((conn) => new MastraCodeAcpAgent(conn, harness, modes), stream$1);
333
- try {
334
- await connection.closed;
335
- } finally {
336
- if (cleanup) {
337
- await cleanup();
338
- }
339
- }
340
- }
341
-
342
- // src/acp/index.ts
343
- async function acpMain(options) {
344
- if (options?.dangerousAutoApprove) {
345
- setAutoApprove(true);
346
- }
347
- const originalConsoleLog = console.log;
348
- console.log = (...args) => {
349
- process.stderr.write(args.map(String).join(" ") + "\n");
350
- };
351
- let result;
352
- try {
353
- result = await chunkXBRRTTRT_cjs.createMastraCode({
354
- unixSocketPubSub: false,
355
- disableMcp: false,
356
- disableHooks: false
357
- });
358
- const { harness, mcpManager, signalsPubSub } = result;
359
- const modes = [
360
- { id: "build", name: "Build" },
361
- { id: "plan", name: "Plan" },
362
- { id: "fast", name: "Fast" }
363
- ];
364
- const cleanup = async () => {
365
- chunkIK6NZ3MB_cjs.releaseAllThreadLocks();
366
- const closeSignalsPubSub = signalsPubSub?.close;
367
- await Promise.allSettled([
368
- mcpManager?.disconnect(),
369
- harness?.getMastra()?.stopWorkers(),
370
- harness?.stopHeartbeats(),
371
- closeSignalsPubSub?.()
372
- ]);
373
- console.log = originalConsoleLog;
374
- };
375
- const handleSignal = async () => {
376
- await cleanup();
377
- process.exit(0);
378
- };
379
- process.on("SIGINT", handleSignal);
380
- process.on("SIGTERM", handleSignal);
381
- await runAcpServer(harness, modes, cleanup);
382
- } catch (error) {
383
- process.stderr.write(`[acp] Fatal error: ${error}
384
- `);
385
- console.log = originalConsoleLog;
386
- process.exit(1);
387
- }
388
- }
389
-
390
- exports.acpMain = acpMain;
391
- //# sourceMappingURL=acp-C6V3COJY.cjs.map
392
- //# sourceMappingURL=acp-C6V3COJY.cjs.map
330
+ exports.MastraCodeAcpAgent = MastraCodeAcpAgent;
331
+ exports.setAutoApprove = setAutoApprove;
332
+ //# sourceMappingURL=chunk-DPRNPXVC.cjs.map
333
+ //# sourceMappingURL=chunk-DPRNPXVC.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/acp/event-mapper.ts","../src/acp/agent.ts"],"names":["PROTOCOL_VERSION","usage","reason"],"mappings":"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","file":"chunk-DPRNPXVC.cjs","sourcesContent":["import type { SessionNotification, RequestPermissionRequest, AgentSideConnection } from '@agentclientprotocol/sdk';\nimport type { HarnessEvent, Session, TokenUsage } from '@mastra/core/harness';\n\nlet autoApprove = false;\n\n/**\n * Enable or disable automatic tool approval (set via --dangerous-auto-approve CLI flag).\n */\nexport function setAutoApprove(value: boolean): void {\n autoApprove = value;\n}\n\n/**\n * Map a mastracode tool name to an ACP ToolKind.\n */\nfunction mapToolKind(\n toolName: string,\n): 'read' | 'edit' | 'delete' | 'move' | 'search' | 'execute' | 'think' | 'fetch' | 'other' {\n const name = toolName.toLowerCase();\n if (name.includes('edit') || name.includes('write') || name.includes('replace') || name.includes('patch'))\n return 'edit';\n if (name.includes('read') || name.includes('view') || name.includes('list') || name.includes('find')) return 'read';\n if (name.includes('delete') || name.includes('remove')) return 'delete';\n if (name.includes('search') || name.includes('grep') || name.includes('query')) return 'search';\n if (name.includes('execute') || name.includes('run') || name.includes('command') || name.includes('shell'))\n return 'execute';\n if (\n name.includes('fetch') ||\n name.includes('curl') ||\n name.includes('http') ||\n name.includes('browse') ||\n name.includes('navigate')\n )\n return 'fetch';\n if (name.includes('think') || name.includes('reason')) return 'think';\n return 'other';\n}\n\n/**\n * Accumulated state for an active prompt turn.\n */\nexport interface PromptState {\n sessionId: string;\n lastTextLength: number;\n usage: TokenUsage;\n resolve: (reason: 'complete' | 'aborted' | 'error' | 'suspended') => void;\n}\n\n/**\n * Translate a HarnessEvent into an ACP SessionNotification and send it\n * via the provided connection. Returns null for events that don't produce\n * a session update.\n */\nexport function handleHarnessEvent(\n event: HarnessEvent,\n state: PromptState | null,\n connection: AgentSideConnection,\n session: Session,\n): void {\n if (!state) return;\n\n switch (event.type) {\n case 'agent_start':\n state.lastTextLength = 0;\n break;\n\n case 'message_update': {\n if (event.message.role !== 'assistant') break;\n const fullText = event.message.content\n .filter((c): c is { type: 'text'; text: string } => c.type === 'text')\n .map(p => p.text)\n .join('');\n if (fullText.length > state.lastTextLength) {\n const delta = fullText.slice(state.lastTextLength);\n state.lastTextLength = fullText.length;\n sendUpdate(connection, state.sessionId, {\n sessionUpdate: 'agent_message_chunk',\n content: { type: 'text', text: delta },\n });\n }\n break;\n }\n\n case 'message_end':\n state.lastTextLength = 0;\n break;\n\n case 'tool_start':\n sendUpdate(connection, state.sessionId, {\n sessionUpdate: 'tool_call',\n toolCallId: event.toolCallId,\n title: event.toolName,\n kind: mapToolKind(event.toolName),\n status: 'in_progress',\n rawInput: JSON.stringify(event.args),\n });\n break;\n\n case 'tool_end':\n sendUpdate(connection, state.sessionId, {\n sessionUpdate: 'tool_call_update',\n toolCallId: event.toolCallId,\n status: event.isError ? 'failed' : 'completed',\n rawOutput: typeof event.result === 'string' ? event.result : JSON.stringify(event.result),\n });\n break;\n\n case 'tool_approval_required':\n void handleToolApproval(state, connection, session, event).catch(err => {\n process.stderr.write(`[acp] handleToolApproval error: ${err}\\n`);\n });\n break;\n\n case 'tool_suspended':\n void handleToolSuspended(state, connection, session, event).catch(err => {\n process.stderr.write(`[acp] handleToolSuspended error: ${err}\\n`);\n });\n break;\n\n case 'usage_update':\n accumulateUsage(state.usage, event.usage);\n break;\n\n case 'agent_end':\n state.resolve(event.reason ?? 'complete');\n break;\n\n // Ignored in v1: om_*, subagent_*, workspace_*, task_updated, etc.\n default:\n break;\n }\n}\n\nfunction sendUpdate(connection: AgentSideConnection, sessionId: string, update: SessionNotification['update']): void {\n connection.sessionUpdate({ sessionId, update }).catch(err => {\n process.stderr.write(`[acp] sessionUpdate error: ${err}\\n`);\n });\n}\n\nasync function handleToolApproval(\n state: PromptState,\n connection: AgentSideConnection,\n session: Session,\n event: Extract<HarnessEvent, { type: 'tool_approval_required' }>,\n): Promise<void> {\n // Auto-approve if --dangerous-auto-approve flag is set\n if (autoApprove) {\n session.respondToToolApproval({ decision: 'approve' });\n return;\n }\n\n const req: RequestPermissionRequest = {\n sessionId: state.sessionId,\n toolCall: {\n toolCallId: event.toolCallId,\n title: event.toolName,\n rawInput: JSON.stringify(event.args),\n },\n options: [\n { optionId: 'approve', name: 'Allow', kind: 'allow_once' },\n { optionId: 'reject', name: 'Reject', kind: 'reject_once' },\n ],\n };\n\n try {\n const resp = await connection.requestPermission(req);\n if (resp.outcome.outcome === 'selected') {\n const decision = resp.outcome.optionId === 'approve' ? 'approve' : 'decline';\n session.respondToToolApproval({ decision });\n } else {\n session.respondToToolApproval({ decision: 'decline' });\n }\n } catch (err) {\n process.stderr.write(`[acp] requestPermission error: ${err}\\n`);\n session.respondToToolApproval({ decision: 'decline' });\n }\n}\n\nasync function handleToolSuspended(\n state: PromptState,\n connection: AgentSideConnection,\n session: Session,\n event: Extract<HarnessEvent, { type: 'tool_suspended' }>,\n): Promise<void> {\n const { toolCallId, toolName, args, suspendPayload } = event;\n\n // Auto-resolve certain suspensions (mirrors headless.ts autoResolve)\n if (toolName === 'request_access' || (suspendPayload as any)?.kind === 'sandbox_access_request') {\n void session.respondToToolSuspension({ toolCallId, resumeData: 'Yes' });\n return;\n }\n\n if (toolName === 'submit_plan') {\n // Request permission for plan approval\n const req: RequestPermissionRequest = {\n sessionId: state.sessionId,\n toolCall: {\n toolCallId,\n title: toolName,\n rawInput: JSON.stringify(args),\n },\n options: [\n { optionId: 'approve', name: 'Approve Plan', kind: 'allow_once' },\n { optionId: 'reject', name: 'Reject Plan', kind: 'reject_once' },\n ],\n };\n\n try {\n const resp = await connection.requestPermission(req);\n const action =\n resp.outcome.outcome === 'selected' && resp.outcome.optionId === 'approve' ? 'approved' : 'rejected';\n void session.respondToToolSuspension({ toolCallId, resumeData: { action } });\n } catch {\n void session.respondToToolSuspension({ toolCallId, resumeData: { action: 'rejected' } });\n }\n return;\n }\n\n // For ask_user and other suspensions, auto-resolve\n void session.respondToToolSuspension({\n toolCallId,\n resumeData: 'Proceed with your best judgment. Do not ask further questions.',\n });\n}\n\nfunction accumulateUsage(target: TokenUsage, usage: TokenUsage): void {\n target.promptTokens += usage.promptTokens;\n target.completionTokens += usage.completionTokens;\n target.totalTokens += usage.totalTokens;\n if (usage.reasoningTokens) target.reasoningTokens = (target.reasoningTokens ?? 0) + usage.reasoningTokens;\n if (usage.cachedInputTokens) target.cachedInputTokens = (target.cachedInputTokens ?? 0) + usage.cachedInputTokens;\n if (usage.cacheCreationInputTokens) {\n target.cacheCreationInputTokens = (target.cacheCreationInputTokens ?? 0) + usage.cacheCreationInputTokens;\n }\n}\n","import type {\n Agent,\n AgentSideConnection,\n InitializeRequest,\n InitializeResponse,\n NewSessionRequest,\n NewSessionResponse,\n PromptRequest,\n PromptResponse,\n CancelNotification,\n ContentBlock,\n} from '@agentclientprotocol/sdk';\nimport { PROTOCOL_VERSION } from '@agentclientprotocol/sdk';\nimport type { Harness, HarnessMode, Session } from '@mastra/core/harness';\nimport { handleHarnessEvent } from './event-mapper.js';\nimport type { PromptState } from './event-mapper.js';\n\n/**\n * ACP Agent implementation that wraps a mastracode Harness.\n * Each instance represents one ACP connection from a client.\n */\nexport class MastraCodeAcpAgent implements Agent {\n private readonly connection: AgentSideConnection;\n private readonly harness: Harness;\n private readonly session: Session;\n private readonly modes: HarnessMode[];\n private readonly unsubscribeSessionEvents: () => void;\n private readonly sessionMap = new Map<string, string>(); // sessionId -> threadId\n private currentPromptState: PromptState | null = null;\n private promptMutex: Promise<void> = Promise.resolve();\n\n private getThreadIdOrThrow(sessionId: string): string {\n const threadId = this.sessionMap.get(sessionId);\n if (!threadId) {\n throw new Error(`Unknown ACP sessionId: ${sessionId}`);\n }\n return threadId;\n }\n\n constructor(connection: AgentSideConnection, harness: Harness, session: Session, modes: HarnessMode[]) {\n this.connection = connection;\n this.harness = harness;\n this.session = session;\n this.modes = modes;\n\n // Register persistent event listener\n this.unsubscribeSessionEvents = this.session.subscribe(event => {\n handleHarnessEvent(event, this.currentPromptState, this.connection, this.session);\n });\n }\n\n dispose(): void {\n this.unsubscribeSessionEvents();\n }\n\n async initialize(_request: InitializeRequest): Promise<InitializeResponse> {\n return {\n protocolVersion: PROTOCOL_VERSION,\n agentInfo: {\n name: 'mastracode',\n title: 'Mastra Code',\n version: '0.1.0',\n },\n agentCapabilities: {\n loadSession: false,\n },\n };\n }\n\n async authenticate(): Promise<void> {\n // No-op: mastracode handles its own auth\n }\n\n async newSession(_request: NewSessionRequest): Promise<NewSessionResponse> {\n const thread = await this.session.thread.create();\n const sessionId = thread.id;\n this.sessionMap.set(sessionId, thread.id);\n\n // Switch to the new thread\n await this.session.thread.switch({ threadId: thread.id });\n\n // Build modes list from constructor param\n const availableModes = this.modes.map((m: HarnessMode) => ({\n id: m.id,\n name: m.name ?? m.id,\n }));\n\n const currentModeId = this.session.mode.get();\n\n // Build models list (best-effort)\n let models: NewSessionResponse['models'];\n try {\n const availableModels = await this.harness.listAvailableModels();\n const currentModelId = this.session.model.get();\n models = {\n currentModelId: currentModelId ?? '',\n availableModels: availableModels.map(m => ({\n modelId: m.id,\n name: m.modelName,\n })),\n };\n } catch {\n // Model listing may fail if no providers are configured\n }\n\n return {\n sessionId,\n modes: {\n currentModeId,\n availableModes,\n },\n models,\n };\n }\n\n async prompt(request: PromptRequest): Promise<PromptResponse> {\n const { sessionId, prompt: contentBlocks } = request;\n\n // Extract text from content blocks\n const text = extractTextFromContentBlocks(contentBlocks);\n\n const threadId = this.getThreadIdOrThrow(sessionId);\n\n // Serialize prompts via mutex\n const prevMutex = this.promptMutex;\n let resolveMutex: () => void;\n this.promptMutex = new Promise<void>(resolve => {\n resolveMutex = resolve;\n });\n\n await prevMutex;\n\n try {\n // Ensure we're on the right thread while prompts are serialized\n await this.session.thread.switch({ threadId });\n\n // Create prompt state that will be resolved when agent_end fires\n const result = new Promise<{\n reason: 'complete' | 'aborted' | 'error' | 'suspended';\n usage: PromptState['usage'];\n }>(resolve => {\n const usage: PromptState['usage'] = {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n };\n\n this.currentPromptState = {\n sessionId,\n lastTextLength: 0,\n usage,\n resolve: reason => {\n resolve({ reason, usage });\n this.currentPromptState = null;\n },\n };\n });\n\n // Send the message to the session\n try {\n await this.session.sendMessage({ content: text });\n } catch (error) {\n this.currentPromptState = null;\n throw error;\n }\n\n // Wait for agent_end to resolve\n const { reason, usage } = await result;\n\n return {\n stopReason: mapStopReason(reason),\n usage: {\n inputTokens: usage.promptTokens,\n outputTokens: usage.completionTokens,\n totalTokens: usage.totalTokens,\n thoughtTokens: usage.reasoningTokens,\n cachedReadTokens: usage.cachedInputTokens,\n cachedWriteTokens: usage.cacheCreationInputTokens,\n },\n };\n } finally {\n resolveMutex!();\n }\n }\n\n async cancel(_notification: CancelNotification): Promise<void> {\n this.session.abort();\n }\n\n async setSessionMode(params: { sessionId: string; modeId: string }): Promise<void> {\n const threadId = this.getThreadIdOrThrow(params.sessionId);\n await this.session.thread.switch({ threadId });\n this.session.mode.set({ modeId: params.modeId });\n }\n\n async unstable_setSessionModel(params: { sessionId: string; modelId: string }): Promise<void> {\n const threadId = this.getThreadIdOrThrow(params.sessionId);\n await this.session.thread.switch({ threadId });\n this.session.model.set({ modelId: params.modelId });\n }\n}\n\nexport function extractTextFromContentBlocks(blocks: ContentBlock[]): string {\n const parts: string[] = [];\n for (const block of blocks) {\n if (block.type === 'text') {\n parts.push(block.text);\n } else if (block.type === 'resource_link') {\n parts.push(`[resource: ${block.uri}]`);\n } else if (block.type === 'resource') {\n parts.push(`[resource: ${block.resource.uri}]`);\n }\n }\n return parts.join('\\n');\n}\n\nexport function mapStopReason(\n reason: 'complete' | 'aborted' | 'error' | 'suspended',\n): 'end_turn' | 'cancelled' | 'max_tokens' | 'max_turn_requests' | 'refusal' {\n switch (reason) {\n case 'complete':\n return 'end_turn';\n case 'aborted':\n return 'cancelled';\n case 'error':\n return 'end_turn';\n case 'suspended':\n return 'end_turn';\n }\n}\n"]}