@mastra/code-sdk 1.0.3-alpha.1 → 1.1.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 +45 -0
- package/dist/acp/agent.js +155 -167
- package/dist/acp/agent.js.map +1 -1
- package/dist/acp/event-mapper.js +193 -168
- package/dist/acp/event-mapper.js.map +1 -1
- package/dist/acp/index.js +60 -49
- package/dist/acp/index.js.map +1 -1
- package/dist/acp/server.js +31 -30
- package/dist/acp/server.js.map +1 -1
- package/dist/acp.js +1 -4
- package/dist/agents/credential-resolver.js +40 -29
- package/dist/agents/credential-resolver.js.map +1 -1
- package/dist/agents/custom-provider-source.js +16 -9
- package/dist/agents/custom-provider-source.js.map +1 -1
- package/dist/agents/instructions.js +27 -36
- package/dist/agents/instructions.js.map +1 -1
- package/dist/agents/mastracode-gateway.js +355 -428
- package/dist/agents/mastracode-gateway.js.map +1 -1
- package/dist/agents/memory.js +87 -78
- package/dist/agents/memory.js.map +1 -1
- package/dist/agents/model.js +114 -119
- package/dist/agents/model.js.map +1 -1
- package/dist/agents/modes/build.js +12 -13
- package/dist/agents/modes/build.js.map +1 -1
- package/dist/agents/modes/explore.js +14 -13
- package/dist/agents/modes/explore.js.map +1 -1
- package/dist/agents/modes/plan.js +14 -15
- package/dist/agents/modes/plan.js.map +1 -1
- package/dist/agents/prompts/agent-instructions.js +78 -69
- package/dist/agents/prompts/agent-instructions.js.map +1 -1
- package/dist/agents/prompts/build.js +19 -16
- package/dist/agents/prompts/build.js.map +1 -1
- package/dist/agents/prompts/fast.js +8 -4
- package/dist/agents/prompts/fast.js.map +1 -1
- package/dist/agents/prompts/index.js +48 -47
- package/dist/agents/prompts/index.js.map +1 -1
- package/dist/agents/prompts/model.js +6 -5
- package/dist/agents/prompts/model.js.map +1 -1
- package/dist/agents/prompts/plan.js +20 -16
- package/dist/agents/prompts/plan.js.map +1 -1
- package/dist/agents/prompts/tool-guidance.js +77 -109
- package/dist/agents/prompts/tool-guidance.js.map +1 -1
- package/dist/agents/sandbox-filesystem.js +245 -259
- package/dist/agents/sandbox-filesystem.js.map +1 -1
- package/dist/agents/sandbox-reattach.js +9 -11
- package/dist/agents/sandbox-reattach.js.map +1 -1
- package/dist/agents/thread-caveman-state.js +92 -81
- package/dist/agents/thread-caveman-state.js.map +1 -1
- package/dist/agents/tool-availability.js +62 -80
- package/dist/agents/tool-availability.js.map +1 -1
- package/dist/agents/tools.js +99 -139
- package/dist/agents/tools.js.map +1 -1
- package/dist/agents/workspace.js +232 -225
- package/dist/agents/workspace.js.map +1 -1
- package/dist/analytics.js +139 -128
- package/dist/analytics.js.map +1 -1
- package/dist/auth/authorization-input.js +39 -25
- package/dist/auth/authorization-input.js.map +1 -1
- package/dist/auth/device-code.js +112 -80
- package/dist/auth/device-code.js.map +1 -1
- package/dist/auth/index.js +2 -9
- package/dist/auth/pkce.js +27 -16
- package/dist/auth/pkce.js.map +1 -1
- package/dist/auth/providers/anthropic.js +107 -93
- package/dist/auth/providers/anthropic.js.map +1 -1
- package/dist/auth/providers/github-copilot.js +304 -293
- package/dist/auth/providers/github-copilot.js.map +1 -1
- package/dist/auth/providers/openai-codex.js +442 -460
- package/dist/auth/providers/openai-codex.js.map +1 -1
- package/dist/auth/providers/xai.js +179 -145
- package/dist/auth/providers/xai.js.map +1 -1
- package/dist/auth/storage.js +182 -175
- package/dist/auth/storage.js.map +1 -1
- package/dist/auth/types.js +1 -1
- package/dist/clipboard/index.js +206 -172
- package/dist/clipboard/index.js.map +1 -1
- package/dist/constants.js +11 -16
- package/dist/constants.js.map +1 -1
- package/dist/error-classification.js +19 -11
- package/dist/error-classification.js.map +1 -1
- package/dist/evals/context-builder.js +145 -104
- package/dist/evals/context-builder.js.map +1 -1
- package/dist/evals/index.js +4 -7
- package/dist/evals/scorers/classify-command.js +62 -41
- package/dist/evals/scorers/classify-command.js.map +1 -1
- package/dist/evals/scorers/efficiency.js +239 -181
- package/dist/evals/scorers/efficiency.js.map +1 -1
- package/dist/evals/scorers/extract-tools.js +51 -47
- package/dist/evals/scorers/extract-tools.js.map +1 -1
- package/dist/evals/scorers/index.js +1 -5
- package/dist/evals/scorers/outcome.js +321 -212
- package/dist/evals/scorers/outcome.js.map +1 -1
- package/dist/goal-manager.js +266 -261
- package/dist/goal-manager.js.map +1 -1
- package/dist/goal-signal.js +14 -13
- package/dist/goal-signal.js.map +1 -1
- package/dist/headless/cli.js +153 -154
- package/dist/headless/cli.js.map +1 -1
- package/dist/headless/flags.js +180 -178
- package/dist/headless/flags.js.map +1 -1
- package/dist/headless/format.js +72 -71
- package/dist/headless/format.js.map +1 -1
- package/dist/headless/index.js +5 -31
- package/dist/headless/policy.js +35 -31
- package/dist/headless/policy.js.map +1 -1
- package/dist/headless/run-mc.js +332 -334
- package/dist/headless/run-mc.js.map +1 -1
- package/dist/headless/types.js +16 -7
- package/dist/headless/types.js.map +1 -1
- package/dist/hooks/config.js +56 -61
- package/dist/hooks/config.js.map +1 -1
- package/dist/hooks/executor.js +118 -116
- package/dist/hooks/executor.js.map +1 -1
- package/dist/hooks/index.js +4 -15
- package/dist/hooks/manager.js +221 -280
- package/dist/hooks/manager.js.map +1 -1
- package/dist/hooks/types.js +5 -4
- package/dist/hooks/types.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +632 -712
- package/dist/index.js.map +1 -1
- package/dist/ipc/ipc-reporter.js +19 -22
- package/dist/ipc/ipc-reporter.js.map +1 -1
- package/dist/lsp/client.js +248 -306
- package/dist/lsp/client.js.map +1 -1
- package/dist/lsp/index.js +1 -6
- package/dist/lsp/language.js +39 -43
- package/dist/lsp/language.js.map +1 -1
- package/dist/lsp/manager.js +78 -93
- package/dist/lsp/manager.js.map +1 -1
- package/dist/lsp/server.js +151 -120
- package/dist/lsp/server.js.map +1 -1
- package/dist/lsp/workspace.js +50 -47
- package/dist/lsp/workspace.js.map +1 -1
- package/dist/mcp/config.js +210 -199
- package/dist/mcp/config.js.map +1 -1
- package/dist/mcp/index.js +2 -9
- package/dist/mcp/manager.js +482 -475
- package/dist/mcp/manager.js.map +1 -1
- package/dist/mcp/types.js +1 -1
- package/dist/onboarding/custom-packs.js +14 -17
- package/dist/onboarding/custom-packs.js.map +1 -1
- package/dist/onboarding/custom-providers.js +22 -20
- package/dist/onboarding/custom-providers.js.map +1 -1
- package/dist/onboarding/index.d.ts +1 -1
- package/dist/onboarding/index.d.ts.map +1 -1
- package/dist/onboarding/index.js +3 -21
- package/dist/onboarding/om-settings.d.ts +5 -0
- package/dist/onboarding/om-settings.d.ts.map +1 -1
- package/dist/onboarding/om-settings.js +41 -20
- package/dist/onboarding/om-settings.js.map +1 -1
- package/dist/onboarding/packs.d.ts +4 -6
- package/dist/onboarding/packs.d.ts.map +1 -1
- package/dist/onboarding/packs.js +154 -105
- package/dist/onboarding/packs.js.map +1 -1
- package/dist/onboarding/settings.js +575 -517
- package/dist/onboarding/settings.js.map +1 -1
- package/dist/permissions.js +112 -99
- package/dist/permissions.js.map +1 -1
- package/dist/plugin.js +21 -23
- package/dist/plugin.js.map +1 -1
- package/dist/plugins/dependencies.js +64 -87
- package/dist/plugins/dependencies.js.map +1 -1
- package/dist/plugins/install.js +159 -169
- package/dist/plugins/install.js.map +1 -1
- package/dist/plugins/loader.js +170 -185
- package/dist/plugins/loader.js.map +1 -1
- package/dist/plugins/manager.js +374 -380
- package/dist/plugins/manager.js.map +1 -1
- package/dist/plugins/manifest.js +38 -63
- package/dist/plugins/manifest.js.map +1 -1
- package/dist/plugins/package-link.js +48 -64
- package/dist/plugins/package-link.js.map +1 -1
- package/dist/plugins/paths.js +18 -19
- package/dist/plugins/paths.js.map +1 -1
- package/dist/plugins/registry.js +97 -81
- package/dist/plugins/registry.js.map +1 -1
- package/dist/plugins/scaffold.js +62 -98
- package/dist/plugins/scaffold.js.map +1 -1
- package/dist/plugins/types.js +1 -1
- package/dist/processors/plan-rejection-abort.js +45 -44
- package/dist/processors/plan-rejection-abort.js.map +1 -1
- package/dist/providers/amazon-bedrock-gateway.js +134 -125
- package/dist/providers/amazon-bedrock-gateway.js.map +1 -1
- package/dist/providers/amazon-bedrock.js +68 -47
- package/dist/providers/amazon-bedrock.js.map +1 -1
- package/dist/providers/claude-max.js +153 -133
- package/dist/providers/claude-max.js.map +1 -1
- package/dist/providers/github-copilot.js +232 -230
- package/dist/providers/github-copilot.js.map +1 -1
- package/dist/providers/openai-codex.js +271 -260
- package/dist/providers/openai-codex.js.map +1 -1
- package/dist/providers/xai.js +57 -50
- package/dist/providers/xai.js.map +1 -1
- package/dist/schema.js +91 -89
- package/dist/schema.js.map +1 -1
- package/dist/theme-palette.js +18 -14
- package/dist/theme-palette.js.map +1 -1
- package/dist/tool-names.js +46 -37
- package/dist/tool-names.js.map +1 -1
- package/dist/tools/index.js +2 -8
- package/dist/tools/request-sandbox-access.js +71 -80
- package/dist/tools/request-sandbox-access.js.map +1 -1
- package/dist/tools/utils.js +26 -16
- package/dist/tools/utils.js.map +1 -1
- package/dist/tools/web-search.js +51 -55
- package/dist/tools/web-search.js.map +1 -1
- package/dist/utils/binaries.js +65 -61
- package/dist/utils/binaries.js.map +1 -1
- package/dist/utils/debug-log.js +51 -47
- package/dist/utils/debug-log.js.map +1 -1
- package/dist/utils/errors.js +157 -192
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/gateway-sync.js +49 -37
- package/dist/utils/gateway-sync.js.map +1 -1
- package/dist/utils/path-security.js +7 -6
- package/dist/utils/path-security.js.map +1 -1
- package/dist/utils/plan-diff.js +58 -39
- package/dist/utils/plan-diff.js.map +1 -1
- package/dist/utils/plans.js +92 -74
- package/dist/utils/plans.js.map +1 -1
- package/dist/utils/project.js +318 -256
- package/dist/utils/project.js.map +1 -1
- package/dist/utils/signals-pubsub.js +117 -99
- package/dist/utils/signals-pubsub.js.map +1 -1
- package/dist/utils/slash-command-loader.js +118 -154
- package/dist/utils/slash-command-loader.js.map +1 -1
- package/dist/utils/slash-command-processor.js +92 -83
- package/dist/utils/slash-command-processor.js.map +1 -1
- package/dist/utils/stdin-pipe.js +87 -63
- package/dist/utils/stdin-pipe.js.map +1 -1
- package/dist/utils/storage-factory.js +104 -84
- package/dist/utils/storage-factory.js.map +1 -1
- package/dist/utils/storage-maintenance.js +249 -211
- package/dist/utils/storage-maintenance.js.map +1 -1
- package/dist/utils/thread-lock.js +96 -92
- package/dist/utils/thread-lock.js.map +1 -1
- package/dist/utils/token-estimator.js +12 -12
- package/dist/utils/token-estimator.js.map +1 -1
- package/dist/utils/update-check.d.ts +1 -1
- package/dist/utils/update-check.js +341 -259
- package/dist/utils/update-check.js.map +1 -1
- package/dist/voice/stt-registry.js +131 -113
- package/dist/voice/stt-registry.js.map +1 -1
- package/package.json +11 -11
- package/dist/acp.js.map +0 -1
- package/dist/auth/index.js.map +0 -1
- package/dist/auth/types.js.map +0 -1
- package/dist/evals/index.js.map +0 -1
- package/dist/evals/scorers/index.js.map +0 -1
- package/dist/headless/index.js.map +0 -1
- package/dist/hooks/index.js.map +0 -1
- package/dist/lsp/index.js.map +0 -1
- package/dist/mcp/index.js.map +0 -1
- package/dist/mcp/types.js.map +0 -1
- package/dist/onboarding/index.js.map +0 -1
- package/dist/plugins/types.js.map +0 -1
- package/dist/tools/index.js.map +0 -1
package/dist/acp/event-mapper.js
CHANGED
|
@@ -1,189 +1,214 @@
|
|
|
1
1
|
import { mastraDBMessageToSignal } from "@mastra/core/signals";
|
|
2
|
+
//#region src/acp/event-mapper.ts
|
|
3
|
+
/** Concatenate the text of all `text` parts on a DB-native assistant message. */
|
|
2
4
|
function getMessageText(message) {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
5
|
+
const content = message.content;
|
|
6
|
+
if (typeof content === "string" || !content?.parts) return "";
|
|
7
|
+
return content.parts.filter((part) => part.type === "text").map((part) => part.text).join("");
|
|
6
8
|
}
|
|
7
9
|
function getSignalText(message) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
const contents = mastraDBMessageToSignal(message).contents;
|
|
11
|
+
if (typeof contents === "string") return contents;
|
|
12
|
+
if (!Array.isArray(contents)) return "";
|
|
13
|
+
return contents.filter((part) => part.type === "text").map((part) => part.text).join("\n");
|
|
12
14
|
}
|
|
13
15
|
let autoApprove = false;
|
|
16
|
+
/**
|
|
17
|
+
* Enable or disable automatic tool approval (set via --dangerous-auto-approve CLI flag).
|
|
18
|
+
*/
|
|
14
19
|
function setAutoApprove(value) {
|
|
15
|
-
|
|
20
|
+
autoApprove = value;
|
|
16
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Map a mastracode tool name to an ACP ToolKind.
|
|
24
|
+
*/
|
|
17
25
|
function mapToolKind(toolName) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
return "fetch";
|
|
28
|
-
if (name.includes("think") || name.includes("reason")) return "think";
|
|
29
|
-
return "other";
|
|
26
|
+
const name = toolName.toLowerCase();
|
|
27
|
+
if (name.includes("edit") || name.includes("write") || name.includes("replace") || name.includes("patch")) return "edit";
|
|
28
|
+
if (name.includes("read") || name.includes("view") || name.includes("list") || name.includes("find")) return "read";
|
|
29
|
+
if (name.includes("delete") || name.includes("remove")) return "delete";
|
|
30
|
+
if (name.includes("search") || name.includes("grep") || name.includes("query")) return "search";
|
|
31
|
+
if (name.includes("execute") || name.includes("run") || name.includes("command") || name.includes("shell")) return "execute";
|
|
32
|
+
if (name.includes("fetch") || name.includes("curl") || name.includes("http") || name.includes("browse") || name.includes("navigate")) return "fetch";
|
|
33
|
+
if (name.includes("think") || name.includes("reason")) return "think";
|
|
34
|
+
return "other";
|
|
30
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Translate an AgentControllerEvent into an ACP SessionNotification and send it
|
|
38
|
+
* via the provided connection. Returns null for events that don't produce
|
|
39
|
+
* a session update.
|
|
40
|
+
*/
|
|
31
41
|
function handleAgentControllerEvent(event, state, connection, session) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
42
|
+
if (!state) return;
|
|
43
|
+
switch (event.type) {
|
|
44
|
+
case "agent_start":
|
|
45
|
+
state.lastTextLength = 0;
|
|
46
|
+
break;
|
|
47
|
+
case "message_start": {
|
|
48
|
+
if (event.message.role !== "signal") break;
|
|
49
|
+
const text = getSignalText(event.message);
|
|
50
|
+
if (text) sendUpdate(connection, state.sessionId, {
|
|
51
|
+
sessionUpdate: "agent_message_chunk",
|
|
52
|
+
content: {
|
|
53
|
+
type: "text",
|
|
54
|
+
text
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
case "message_update": {
|
|
60
|
+
if (event.message.role !== "assistant") break;
|
|
61
|
+
const fullText = getMessageText(event.message);
|
|
62
|
+
if (fullText.length > state.lastTextLength) {
|
|
63
|
+
const delta = fullText.slice(state.lastTextLength);
|
|
64
|
+
state.lastTextLength = fullText.length;
|
|
65
|
+
sendUpdate(connection, state.sessionId, {
|
|
66
|
+
sessionUpdate: "agent_message_chunk",
|
|
67
|
+
content: {
|
|
68
|
+
type: "text",
|
|
69
|
+
text: delta
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
case "message_end":
|
|
76
|
+
if (event.message.role === "assistant") state.lastTextLength = 0;
|
|
77
|
+
break;
|
|
78
|
+
case "tool_start":
|
|
79
|
+
sendUpdate(connection, state.sessionId, {
|
|
80
|
+
sessionUpdate: "tool_call",
|
|
81
|
+
toolCallId: event.toolCallId,
|
|
82
|
+
title: event.toolName,
|
|
83
|
+
kind: mapToolKind(event.toolName),
|
|
84
|
+
status: "in_progress",
|
|
85
|
+
rawInput: JSON.stringify(event.args)
|
|
86
|
+
});
|
|
87
|
+
break;
|
|
88
|
+
case "tool_end":
|
|
89
|
+
sendUpdate(connection, state.sessionId, {
|
|
90
|
+
sessionUpdate: "tool_call_update",
|
|
91
|
+
toolCallId: event.toolCallId,
|
|
92
|
+
status: event.isError ? "failed" : "completed",
|
|
93
|
+
rawOutput: typeof event.result === "string" ? event.result : JSON.stringify(event.result)
|
|
94
|
+
});
|
|
95
|
+
break;
|
|
96
|
+
case "tool_approval_required":
|
|
97
|
+
handleToolApproval(state, connection, session, event).catch((err) => {
|
|
98
|
+
process.stderr.write(`[acp] handleToolApproval error: ${err}\n`);
|
|
99
|
+
});
|
|
100
|
+
break;
|
|
101
|
+
case "tool_suspended":
|
|
102
|
+
handleToolSuspended(state, connection, session, event).catch((err) => {
|
|
103
|
+
process.stderr.write(`[acp] handleToolSuspended error: ${err}\n`);
|
|
104
|
+
});
|
|
105
|
+
break;
|
|
106
|
+
case "usage_update":
|
|
107
|
+
accumulateUsage(state.usage, event.usage);
|
|
108
|
+
break;
|
|
109
|
+
case "agent_end":
|
|
110
|
+
state.resolve(event.reason ?? "complete");
|
|
111
|
+
break;
|
|
112
|
+
default: break;
|
|
113
|
+
}
|
|
104
114
|
}
|
|
105
115
|
function sendUpdate(connection, sessionId, update) {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
116
|
+
connection.sessionUpdate({
|
|
117
|
+
sessionId,
|
|
118
|
+
update
|
|
119
|
+
}).catch((err) => {
|
|
120
|
+
process.stderr.write(`[acp] sessionUpdate error: ${err}\n`);
|
|
121
|
+
});
|
|
110
122
|
}
|
|
111
123
|
async function handleToolApproval(state, connection, session, event) {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
124
|
+
if (autoApprove) {
|
|
125
|
+
session.respondToToolApproval({ decision: "approve" });
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const req = {
|
|
129
|
+
sessionId: state.sessionId,
|
|
130
|
+
toolCall: {
|
|
131
|
+
toolCallId: event.toolCallId,
|
|
132
|
+
title: event.toolName,
|
|
133
|
+
rawInput: JSON.stringify(event.args)
|
|
134
|
+
},
|
|
135
|
+
options: [{
|
|
136
|
+
optionId: "approve",
|
|
137
|
+
name: "Allow",
|
|
138
|
+
kind: "allow_once"
|
|
139
|
+
}, {
|
|
140
|
+
optionId: "reject",
|
|
141
|
+
name: "Reject",
|
|
142
|
+
kind: "reject_once"
|
|
143
|
+
}]
|
|
144
|
+
};
|
|
145
|
+
try {
|
|
146
|
+
const resp = await connection.requestPermission(req);
|
|
147
|
+
if (resp.outcome.outcome === "selected") {
|
|
148
|
+
const decision = resp.outcome.optionId === "approve" ? "approve" : "decline";
|
|
149
|
+
session.respondToToolApproval({ decision });
|
|
150
|
+
} else session.respondToToolApproval({ decision: "decline" });
|
|
151
|
+
} catch (err) {
|
|
152
|
+
process.stderr.write(`[acp] requestPermission error: ${err}\n`);
|
|
153
|
+
session.respondToToolApproval({ decision: "decline" });
|
|
154
|
+
}
|
|
141
155
|
}
|
|
142
156
|
async function handleToolSuspended(state, connection, session, event) {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
157
|
+
const { toolCallId, toolName, args, suspendPayload } = event;
|
|
158
|
+
if (toolName === "request_access" || suspendPayload?.kind === "sandbox_access_request") {
|
|
159
|
+
session.respondToToolSuspension({
|
|
160
|
+
toolCallId,
|
|
161
|
+
resumeData: "Yes"
|
|
162
|
+
});
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (toolName === "submit_plan") {
|
|
166
|
+
const req = {
|
|
167
|
+
sessionId: state.sessionId,
|
|
168
|
+
toolCall: {
|
|
169
|
+
toolCallId,
|
|
170
|
+
title: toolName,
|
|
171
|
+
rawInput: JSON.stringify(args)
|
|
172
|
+
},
|
|
173
|
+
options: [{
|
|
174
|
+
optionId: "approve",
|
|
175
|
+
name: "Approve Plan",
|
|
176
|
+
kind: "allow_once"
|
|
177
|
+
}, {
|
|
178
|
+
optionId: "reject",
|
|
179
|
+
name: "Reject Plan",
|
|
180
|
+
kind: "reject_once"
|
|
181
|
+
}]
|
|
182
|
+
};
|
|
183
|
+
try {
|
|
184
|
+
const resp = await connection.requestPermission(req);
|
|
185
|
+
const action = resp.outcome.outcome === "selected" && resp.outcome.optionId === "approve" ? "approved" : "rejected";
|
|
186
|
+
session.respondToToolSuspension({
|
|
187
|
+
toolCallId,
|
|
188
|
+
resumeData: { action }
|
|
189
|
+
});
|
|
190
|
+
} catch {
|
|
191
|
+
session.respondToToolSuspension({
|
|
192
|
+
toolCallId,
|
|
193
|
+
resumeData: { action: "rejected" }
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
session.respondToToolSuspension({
|
|
199
|
+
toolCallId,
|
|
200
|
+
resumeData: "Proceed with your best judgment. Do not ask further questions."
|
|
201
|
+
});
|
|
174
202
|
}
|
|
175
203
|
function accumulateUsage(target, usage) {
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
target.cacheCreationInputTokens = (target.cacheCreationInputTokens ?? 0) + usage.cacheCreationInputTokens;
|
|
183
|
-
}
|
|
204
|
+
target.promptTokens += usage.promptTokens;
|
|
205
|
+
target.completionTokens += usage.completionTokens;
|
|
206
|
+
target.totalTokens += usage.totalTokens;
|
|
207
|
+
if (usage.reasoningTokens) target.reasoningTokens = (target.reasoningTokens ?? 0) + usage.reasoningTokens;
|
|
208
|
+
if (usage.cachedInputTokens) target.cachedInputTokens = (target.cachedInputTokens ?? 0) + usage.cachedInputTokens;
|
|
209
|
+
if (usage.cacheCreationInputTokens) target.cacheCreationInputTokens = (target.cacheCreationInputTokens ?? 0) + usage.cacheCreationInputTokens;
|
|
184
210
|
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
};
|
|
211
|
+
//#endregion
|
|
212
|
+
export { handleAgentControllerEvent, setAutoApprove };
|
|
213
|
+
|
|
189
214
|
//# sourceMappingURL=event-mapper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/acp/event-mapper.ts"],"sourcesContent":["import type { SessionNotification, RequestPermissionRequest, AgentSideConnection } from '@agentclientprotocol/sdk';\nimport type { AgentControllerEvent, MastraDBMessage, Session, TokenUsage } from '@mastra/core/agent-controller';\nimport { mastraDBMessageToSignal } from '@mastra/core/signals';\n\n/** Concatenate the text of all `text` parts on a DB-native assistant message. */\nfunction getMessageText(message: MastraDBMessage): string {\n const content = message.content;\n if (typeof content === 'string' || !content?.parts) return '';\n return content.parts\n .filter((part): part is Extract<(typeof content.parts)[number], { type: 'text' }> => part.type === 'text')\n .map(part => part.text)\n .join('');\n}\n\nfunction getSignalText(message: MastraDBMessage): string {\n const contents = mastraDBMessageToSignal(message).contents;\n if (typeof contents === 'string') return contents;\n if (!Array.isArray(contents)) return '';\n return contents\n .filter((part): part is Extract<(typeof contents)[number], { type: 'text' }> => part.type === 'text')\n .map(part => part.text)\n .join('\\n');\n}\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 an AgentControllerEvent 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 handleAgentControllerEvent(\n event: AgentControllerEvent,\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_start': {\n if (event.message.role !== 'signal') break;\n const text = getSignalText(event.message);\n if (text) {\n sendUpdate(connection, state.sessionId, {\n sessionUpdate: 'agent_message_chunk',\n content: { type: 'text', text },\n });\n }\n break;\n }\n\n case 'message_update': {\n if (event.message.role !== 'assistant') break;\n const fullText = getMessageText(event.message);\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 if (event.message.role === 'assistant') 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<AgentControllerEvent, { 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<AgentControllerEvent, { 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"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"file":"event-mapper.js","names":[],"sources":["../../src/acp/event-mapper.ts"],"sourcesContent":["import type { SessionNotification, RequestPermissionRequest, AgentSideConnection } from '@agentclientprotocol/sdk';\nimport type { AgentControllerEvent, MastraDBMessage, Session, TokenUsage } from '@mastra/core/agent-controller';\nimport { mastraDBMessageToSignal } from '@mastra/core/signals';\n\n/** Concatenate the text of all `text` parts on a DB-native assistant message. */\nfunction getMessageText(message: MastraDBMessage): string {\n const content = message.content;\n if (typeof content === 'string' || !content?.parts) return '';\n return content.parts\n .filter((part): part is Extract<(typeof content.parts)[number], { type: 'text' }> => part.type === 'text')\n .map(part => part.text)\n .join('');\n}\n\nfunction getSignalText(message: MastraDBMessage): string {\n const contents = mastraDBMessageToSignal(message).contents;\n if (typeof contents === 'string') return contents;\n if (!Array.isArray(contents)) return '';\n return contents\n .filter((part): part is Extract<(typeof contents)[number], { type: 'text' }> => part.type === 'text')\n .map(part => part.text)\n .join('\\n');\n}\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 an AgentControllerEvent 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 handleAgentControllerEvent(\n event: AgentControllerEvent,\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_start': {\n if (event.message.role !== 'signal') break;\n const text = getSignalText(event.message);\n if (text) {\n sendUpdate(connection, state.sessionId, {\n sessionUpdate: 'agent_message_chunk',\n content: { type: 'text', text },\n });\n }\n break;\n }\n\n case 'message_update': {\n if (event.message.role !== 'assistant') break;\n const fullText = getMessageText(event.message);\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 if (event.message.role === 'assistant') 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<AgentControllerEvent, { 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<AgentControllerEvent, { 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"],"mappings":"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"}
|
package/dist/acp/index.js
CHANGED
|
@@ -1,54 +1,65 @@
|
|
|
1
|
-
import { createMastraCode } from "../index.js";
|
|
2
|
-
import { releaseAllThreadLocks } from "../utils/thread-lock.js";
|
|
3
1
|
import { setAutoApprove } from "./event-mapper.js";
|
|
2
|
+
import { releaseAllThreadLocks } from "../utils/thread-lock.js";
|
|
3
|
+
import { createMastraCode } from "../index.js";
|
|
4
4
|
import { runAcpServer } from "./server.js";
|
|
5
|
+
//#region src/acp/index.ts
|
|
6
|
+
/**
|
|
7
|
+
* Entry point for ACP server mode.
|
|
8
|
+
* Initializes mastracode and runs the ACP protocol over stdio.
|
|
9
|
+
*/
|
|
5
10
|
async function acpMain(options) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
11
|
+
if (options?.dangerousAutoApprove) setAutoApprove(true);
|
|
12
|
+
const originalConsoleLog = console.log;
|
|
13
|
+
console.log = (...args) => {
|
|
14
|
+
process.stderr.write(args.map(String).join(" ") + "\n");
|
|
15
|
+
};
|
|
16
|
+
let result;
|
|
17
|
+
try {
|
|
18
|
+
result = await createMastraCode({
|
|
19
|
+
unixSocketPubSub: false,
|
|
20
|
+
disableMcp: false,
|
|
21
|
+
disableHooks: false
|
|
22
|
+
});
|
|
23
|
+
const { controller, mcpManager, signalsPubSub } = result;
|
|
24
|
+
const modes = [
|
|
25
|
+
{
|
|
26
|
+
id: "build",
|
|
27
|
+
name: "Build"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: "plan",
|
|
31
|
+
name: "Plan"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
id: "fast",
|
|
35
|
+
name: "Fast"
|
|
36
|
+
}
|
|
37
|
+
];
|
|
38
|
+
const cleanup = async () => {
|
|
39
|
+
releaseAllThreadLocks();
|
|
40
|
+
const closeSignalsPubSub = signalsPubSub?.close;
|
|
41
|
+
await Promise.allSettled([
|
|
42
|
+
mcpManager?.disconnect(),
|
|
43
|
+
controller?.getMastra()?.stopWorkers(),
|
|
44
|
+
controller?.stopIntervals(),
|
|
45
|
+
closeSignalsPubSub?.()
|
|
46
|
+
]);
|
|
47
|
+
console.log = originalConsoleLog;
|
|
48
|
+
};
|
|
49
|
+
const handleSignal = async () => {
|
|
50
|
+
await cleanup();
|
|
51
|
+
process.exit(0);
|
|
52
|
+
};
|
|
53
|
+
process.on("SIGINT", handleSignal);
|
|
54
|
+
process.on("SIGTERM", handleSignal);
|
|
55
|
+
await runAcpServer(controller, modes, cleanup);
|
|
56
|
+
} catch (error) {
|
|
57
|
+
process.stderr.write(`[acp] Fatal error: ${error}\n`);
|
|
58
|
+
console.log = originalConsoleLog;
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
50
61
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
62
|
+
//#endregion
|
|
63
|
+
export { acpMain };
|
|
64
|
+
|
|
54
65
|
//# sourceMappingURL=index.js.map
|
package/dist/acp/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/acp/index.ts"],"sourcesContent":["import type { AgentControllerMode } from '@mastra/core/agent-controller';\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 { controller, mcpManager, signalsPubSub } = result;\n\n // Default modes (same as createMastraCode defaults)\n const modes: AgentControllerMode[] = [\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 controller?.getMastra()?.stopWorkers(),\n controller?.stopIntervals(),\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(controller, 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"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/acp/index.ts"],"sourcesContent":["import type { AgentControllerMode } from '@mastra/core/agent-controller';\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 { controller, mcpManager, signalsPubSub } = result;\n\n // Default modes (same as createMastraCode defaults)\n const modes: AgentControllerMode[] = [\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 controller?.getMastra()?.stopWorkers(),\n controller?.stopIntervals(),\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(controller, 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"],"mappings":";;;;;;;;;AAWA,eAAsB,QAAQ,SAA6D;CACzF,IAAI,SAAS,sBACX,eAAe,IAAI;CAIrB,MAAM,qBAAqB,QAAQ;CAEnC,QAAQ,OAAO,GAAG,SAAoB;EACpC,QAAQ,OAAO,MAAM,KAAK,IAAI,MAAM,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI;CACxD;CAEA,IAAI;CAEJ,IAAI;EACF,SAAS,MAAM,iBAAiB;GAC9B,kBAAkB;GAClB,YAAY;GACZ,cAAc;EAChB,CAAC;EAED,MAAM,EAAE,YAAY,YAAY,kBAAkB;EAGlD,MAAM,QAA+B;GACnC;IAAE,IAAI;IAAS,MAAM;GAAQ;GAC7B;IAAE,IAAI;IAAQ,MAAM;GAAO;GAC3B;IAAE,IAAI;IAAQ,MAAM;GAAO;EAC7B;EAGA,MAAM,UAAU,YAAY;GAC1B,sBAAsB;GACtB,MAAM,qBAAsB,eAAsE;GAClG,MAAM,QAAQ,WAAW;IACvB,YAAY,WAAW;IACvB,YAAY,UAAU,CAAC,EAAE,YAAY;IACrC,YAAY,cAAc;IAC1B,qBAAqB;GACvB,CAAC;GAID,QAAQ,MAAM;EAChB;EAGA,MAAM,eAAe,YAAY;GAC/B,MAAM,QAAQ;GACd,QAAQ,KAAK,CAAC;EAChB;EAEA,QAAQ,GAAG,UAAU,YAAY;EACjC,QAAQ,GAAG,WAAW,YAAY;EAElC,MAAM,aAAa,YAAY,OAAO,OAAO;CAC/C,SAAS,OAAO;EACd,QAAQ,OAAO,MAAM,sBAAsB,MAAM,GAAG;EAEpD,QAAQ,MAAM;EACd,QAAQ,KAAK,CAAC;CAChB;AACF"}
|