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 +15 -0
- package/dist/acp/agent.d.ts +5 -2
- package/dist/acp/agent.d.ts.map +1 -1
- package/dist/acp/event-mapper.d.ts +2 -2
- package/dist/acp/event-mapper.d.ts.map +1 -1
- package/dist/acp/server.d.ts.map +1 -1
- package/dist/acp-AG6ZSKEK.js +81 -0
- package/dist/acp-AG6ZSKEK.js.map +1 -0
- package/dist/acp-ITZASSOJ.cjs +83 -0
- package/dist/acp-ITZASSOJ.cjs.map +1 -0
- package/dist/acp.cjs +12 -0
- package/dist/acp.cjs.map +1 -0
- package/dist/acp.d.ts +2 -0
- package/dist/acp.d.ts.map +1 -0
- package/dist/acp.js +3 -0
- package/dist/acp.js.map +1 -0
- package/dist/{acp-C6V3COJY.cjs → chunk-DPRNPXVC.cjs} +37 -96
- package/dist/chunk-DPRNPXVC.cjs.map +1 -0
- package/dist/{acp-4JBFAGKY.js → chunk-IU477VVQ.js} +37 -97
- package/dist/chunk-IU477VVQ.js.map +1 -0
- package/dist/{chunk-F4LROBQG.js → chunk-NL34MXF4.js} +8 -10
- package/dist/chunk-NL34MXF4.js.map +1 -0
- package/dist/{chunk-HSLQBDVG.cjs → chunk-Q6HQLLRA.cjs} +8 -10
- package/dist/chunk-Q6HQLLRA.cjs.map +1 -0
- package/dist/cli.cjs +6 -6
- package/dist/cli.js +2 -2
- package/dist/tui/commands/api-keys.d.ts.map +1 -1
- package/dist/tui.cjs +11 -11
- package/dist/tui.js +1 -1
- package/package.json +19 -9
- package/dist/acp-4JBFAGKY.js.map +0 -1
- package/dist/acp-C6V3COJY.cjs.map +0 -1
- package/dist/chunk-F4LROBQG.js.map +0 -1
- package/dist/chunk-HSLQBDVG.cjs.map +0 -1
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
|
package/dist/acp/agent.d.ts
CHANGED
|
@@ -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>;
|
package/dist/acp/agent.d.ts.map
CHANGED
|
@@ -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;
|
|
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 {
|
|
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,
|
|
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,
|
|
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"}
|
package/dist/acp/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/acp/server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,
|
|
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
|
package/dist/acp.cjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"acp.cjs"}
|
package/dist/acp.d.ts
ADDED
|
@@ -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
package/dist/acp.js.map
ADDED
|
@@ -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,
|
|
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,
|
|
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,
|
|
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,
|
|
90
|
+
async function handleToolApproval(state, connection, session, event) {
|
|
94
91
|
if (autoApprove) {
|
|
95
|
-
|
|
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
|
-
|
|
111
|
+
session.respondToToolApproval({ decision });
|
|
115
112
|
} else {
|
|
116
|
-
|
|
113
|
+
session.respondToToolApproval({ decision: "decline" });
|
|
117
114
|
}
|
|
118
115
|
} catch (err) {
|
|
119
116
|
process.stderr.write(`[acp] requestPermission error: ${err}
|
|
120
117
|
`);
|
|
121
|
-
|
|
118
|
+
session.respondToToolApproval({ decision: "decline" });
|
|
122
119
|
}
|
|
123
120
|
}
|
|
124
|
-
async function handleToolSuspended(state, connection,
|
|
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
|
-
|
|
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
|
-
|
|
143
|
+
void session.respondToToolSuspension({ toolCallId, resumeData: { action } });
|
|
147
144
|
} catch {
|
|
148
|
-
|
|
145
|
+
void session.respondToToolSuspension({ toolCallId, resumeData: { action: "rejected" } });
|
|
149
146
|
}
|
|
150
147
|
return;
|
|
151
148
|
}
|
|
152
|
-
|
|
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.
|
|
187
|
-
handleHarnessEvent(event, this.currentPromptState, this.connection, this.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
291
|
+
this.session.abort();
|
|
289
292
|
}
|
|
290
293
|
async setSessionMode(params) {
|
|
291
294
|
const threadId = this.getThreadIdOrThrow(params.sessionId);
|
|
292
|
-
await this.
|
|
293
|
-
this.
|
|
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.
|
|
298
|
-
this.
|
|
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
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
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"]}
|