mastracode 0.25.0-alpha.1 → 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.
Files changed (44) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/acp/agent.d.ts +35 -0
  3. package/dist/acp/agent.d.ts.map +1 -0
  4. package/dist/acp/event-mapper.d.ts +22 -0
  5. package/dist/acp/event-mapper.d.ts.map +1 -0
  6. package/dist/acp/index.d.ts +8 -0
  7. package/dist/acp/index.d.ts.map +1 -0
  8. package/dist/acp/server.d.ts +7 -0
  9. package/dist/acp/server.d.ts.map +1 -0
  10. package/dist/acp-AG6ZSKEK.js +81 -0
  11. package/dist/acp-AG6ZSKEK.js.map +1 -0
  12. package/dist/acp-ITZASSOJ.cjs +83 -0
  13. package/dist/acp-ITZASSOJ.cjs.map +1 -0
  14. package/dist/acp.cjs +12 -0
  15. package/dist/acp.cjs.map +1 -0
  16. package/dist/acp.d.ts +2 -0
  17. package/dist/acp.d.ts.map +1 -0
  18. package/dist/acp.js +3 -0
  19. package/dist/acp.js.map +1 -0
  20. package/dist/chunk-DPRNPXVC.cjs +333 -0
  21. package/dist/chunk-DPRNPXVC.cjs.map +1 -0
  22. package/dist/chunk-IU477VVQ.js +330 -0
  23. package/dist/chunk-IU477VVQ.js.map +1 -0
  24. package/dist/{chunk-LVUN372D.js → chunk-NL34MXF4.js} +44 -36
  25. package/dist/chunk-NL34MXF4.js.map +1 -0
  26. package/dist/{chunk-FIU7XNEA.cjs → chunk-Q6HQLLRA.cjs} +44 -36
  27. package/dist/chunk-Q6HQLLRA.cjs.map +1 -0
  28. package/dist/cli.cjs +10 -6
  29. package/dist/cli.cjs.map +1 -1
  30. package/dist/cli.js +6 -2
  31. package/dist/cli.js.map +1 -1
  32. package/dist/tui/commands/api-keys.d.ts.map +1 -1
  33. package/dist/tui/handlers/prompts.d.ts.map +1 -1
  34. package/dist/tui/mastra-tui.d.ts.map +1 -1
  35. package/dist/tui/render-messages.d.ts +1 -0
  36. package/dist/tui/render-messages.d.ts.map +1 -1
  37. package/dist/tui/setup.d.ts.map +1 -1
  38. package/dist/tui/state.d.ts +9 -2
  39. package/dist/tui/state.d.ts.map +1 -1
  40. package/dist/tui.cjs +11 -11
  41. package/dist/tui.js +1 -1
  42. package/package.json +20 -9
  43. package/dist/chunk-FIU7XNEA.cjs.map +0 -1
  44. package/dist/chunk-LVUN372D.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,43 @@
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
+
18
+ ## 0.25.0-alpha.2
19
+
20
+ ### Minor Changes
21
+
22
+ - Added ACP server mode for `mastracode`. ([#18231](https://github.com/mastra-ai/mastra/pull/18231))
23
+
24
+ You can now connect ACP-compatible editors and clients to `mastracode` over stdio. This lets clients start sessions, send prompts, and receive streamed responses.
25
+
26
+ **Example**
27
+
28
+ ```bash
29
+ mastracode --acp
30
+ ```
31
+
32
+ ### Patch Changes
33
+
34
+ - Fixed Mastra Code steering display so messages wait for runtime acceptance, blocked inputs are shown as blocked instead of chat, abort cleanup removes pending steering without duplicating output, and plan approvals continue correctly in same-mode and cross-mode flows. ([#18183](https://github.com/mastra-ai/mastra/pull/18183))
35
+
36
+ - Fixed thread loading in worktrees to only show threads explicitly tagged for the current worktree path, preventing threads from other worktrees or the main repo from being incorrectly loaded on startup ([#18332](https://github.com/mastra-ai/mastra/pull/18332))
37
+
38
+ - Updated dependencies [[`6a1428a`](https://github.com/mastra-ai/mastra/commit/6a1428a23133fc070fc6c1caa08d28f3ba4fe5ff), [`7f51548`](https://github.com/mastra-ai/mastra/commit/7f515481213780be7047cef00640b9d35f3d545c)]:
39
+ - @mastra/core@1.46.0-alpha.2
40
+
3
41
  ## 0.25.0-alpha.1
4
42
 
5
43
  ### Patch Changes
@@ -0,0 +1,35 @@
1
+ import type { Agent, AgentSideConnection, InitializeRequest, InitializeResponse, NewSessionRequest, NewSessionResponse, PromptRequest, PromptResponse, CancelNotification, ContentBlock } from '@agentclientprotocol/sdk';
2
+ import type { Harness, HarnessMode, Session } from '@mastra/core/harness';
3
+ /**
4
+ * ACP Agent implementation that wraps a mastracode Harness.
5
+ * Each instance represents one ACP connection from a client.
6
+ */
7
+ export declare class MastraCodeAcpAgent implements Agent {
8
+ private readonly connection;
9
+ private readonly harness;
10
+ private readonly session;
11
+ private readonly modes;
12
+ private readonly unsubscribeSessionEvents;
13
+ private readonly sessionMap;
14
+ private currentPromptState;
15
+ private promptMutex;
16
+ private getThreadIdOrThrow;
17
+ constructor(connection: AgentSideConnection, harness: Harness, session: Session, modes: HarnessMode[]);
18
+ dispose(): void;
19
+ initialize(_request: InitializeRequest): Promise<InitializeResponse>;
20
+ authenticate(): Promise<void>;
21
+ newSession(_request: NewSessionRequest): Promise<NewSessionResponse>;
22
+ prompt(request: PromptRequest): Promise<PromptResponse>;
23
+ cancel(_notification: CancelNotification): Promise<void>;
24
+ setSessionMode(params: {
25
+ sessionId: string;
26
+ modeId: string;
27
+ }): Promise<void>;
28
+ unstable_setSessionModel(params: {
29
+ sessionId: string;
30
+ modelId: string;
31
+ }): Promise<void>;
32
+ }
33
+ export declare function extractTextFromContentBlocks(blocks: ContentBlock[]): string;
34
+ export declare function mapStopReason(reason: 'complete' | 'aborted' | 'error' | 'suspended'): 'end_turn' | 'cancelled' | 'max_tokens' | 'max_turn_requests' | 'refusal';
35
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +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,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"}
@@ -0,0 +1,22 @@
1
+ import type { AgentSideConnection } from '@agentclientprotocol/sdk';
2
+ import type { HarnessEvent, Session, TokenUsage } from '@mastra/core/harness';
3
+ /**
4
+ * Enable or disable automatic tool approval (set via --dangerous-auto-approve CLI flag).
5
+ */
6
+ export declare function setAutoApprove(value: boolean): void;
7
+ /**
8
+ * Accumulated state for an active prompt turn.
9
+ */
10
+ export interface PromptState {
11
+ sessionId: string;
12
+ lastTextLength: number;
13
+ usage: TokenUsage;
14
+ resolve: (reason: 'complete' | 'aborted' | 'error' | 'suspended') => void;
15
+ }
16
+ /**
17
+ * Translate a HarnessEvent into an ACP SessionNotification and send it
18
+ * via the provided connection. Returns null for events that don't produce
19
+ * a session update.
20
+ */
21
+ export declare function handleHarnessEvent(event: HarnessEvent, state: PromptState | null, connection: AgentSideConnection, session: Session): void;
22
+ //# sourceMappingURL=event-mapper.d.ts.map
@@ -0,0 +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,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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Entry point for ACP server mode.
3
+ * Initializes mastracode and runs the ACP protocol over stdio.
4
+ */
5
+ export declare function acpMain(options?: {
6
+ dangerousAutoApprove?: boolean;
7
+ }): Promise<void>;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/acp/index.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,wBAAsB,OAAO,CAAC,OAAO,CAAC,EAAE;IAAE,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8DzF"}
@@ -0,0 +1,7 @@
1
+ import type { Harness, HarnessMode } from '@mastra/core/harness';
2
+ /**
3
+ * Run the ACP server over stdio.
4
+ * This sets up the JSON-RPC stream and keeps the process alive until the client disconnects.
5
+ */
6
+ export declare function runAcpServer(harness: Harness, modes: HarnessMode[], cleanup?: () => Promise<void>): Promise<void>;
7
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
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"}