@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.
Files changed (258) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/dist/acp/agent.js +155 -167
  3. package/dist/acp/agent.js.map +1 -1
  4. package/dist/acp/event-mapper.js +193 -168
  5. package/dist/acp/event-mapper.js.map +1 -1
  6. package/dist/acp/index.js +60 -49
  7. package/dist/acp/index.js.map +1 -1
  8. package/dist/acp/server.js +31 -30
  9. package/dist/acp/server.js.map +1 -1
  10. package/dist/acp.js +1 -4
  11. package/dist/agents/credential-resolver.js +40 -29
  12. package/dist/agents/credential-resolver.js.map +1 -1
  13. package/dist/agents/custom-provider-source.js +16 -9
  14. package/dist/agents/custom-provider-source.js.map +1 -1
  15. package/dist/agents/instructions.js +27 -36
  16. package/dist/agents/instructions.js.map +1 -1
  17. package/dist/agents/mastracode-gateway.js +355 -428
  18. package/dist/agents/mastracode-gateway.js.map +1 -1
  19. package/dist/agents/memory.js +87 -78
  20. package/dist/agents/memory.js.map +1 -1
  21. package/dist/agents/model.js +114 -119
  22. package/dist/agents/model.js.map +1 -1
  23. package/dist/agents/modes/build.js +12 -13
  24. package/dist/agents/modes/build.js.map +1 -1
  25. package/dist/agents/modes/explore.js +14 -13
  26. package/dist/agents/modes/explore.js.map +1 -1
  27. package/dist/agents/modes/plan.js +14 -15
  28. package/dist/agents/modes/plan.js.map +1 -1
  29. package/dist/agents/prompts/agent-instructions.js +78 -69
  30. package/dist/agents/prompts/agent-instructions.js.map +1 -1
  31. package/dist/agents/prompts/build.js +19 -16
  32. package/dist/agents/prompts/build.js.map +1 -1
  33. package/dist/agents/prompts/fast.js +8 -4
  34. package/dist/agents/prompts/fast.js.map +1 -1
  35. package/dist/agents/prompts/index.js +48 -47
  36. package/dist/agents/prompts/index.js.map +1 -1
  37. package/dist/agents/prompts/model.js +6 -5
  38. package/dist/agents/prompts/model.js.map +1 -1
  39. package/dist/agents/prompts/plan.js +20 -16
  40. package/dist/agents/prompts/plan.js.map +1 -1
  41. package/dist/agents/prompts/tool-guidance.js +77 -109
  42. package/dist/agents/prompts/tool-guidance.js.map +1 -1
  43. package/dist/agents/sandbox-filesystem.js +245 -259
  44. package/dist/agents/sandbox-filesystem.js.map +1 -1
  45. package/dist/agents/sandbox-reattach.js +9 -11
  46. package/dist/agents/sandbox-reattach.js.map +1 -1
  47. package/dist/agents/thread-caveman-state.js +92 -81
  48. package/dist/agents/thread-caveman-state.js.map +1 -1
  49. package/dist/agents/tool-availability.js +62 -80
  50. package/dist/agents/tool-availability.js.map +1 -1
  51. package/dist/agents/tools.js +99 -139
  52. package/dist/agents/tools.js.map +1 -1
  53. package/dist/agents/workspace.js +232 -225
  54. package/dist/agents/workspace.js.map +1 -1
  55. package/dist/analytics.js +139 -128
  56. package/dist/analytics.js.map +1 -1
  57. package/dist/auth/authorization-input.js +39 -25
  58. package/dist/auth/authorization-input.js.map +1 -1
  59. package/dist/auth/device-code.js +112 -80
  60. package/dist/auth/device-code.js.map +1 -1
  61. package/dist/auth/index.js +2 -9
  62. package/dist/auth/pkce.js +27 -16
  63. package/dist/auth/pkce.js.map +1 -1
  64. package/dist/auth/providers/anthropic.js +107 -93
  65. package/dist/auth/providers/anthropic.js.map +1 -1
  66. package/dist/auth/providers/github-copilot.js +304 -293
  67. package/dist/auth/providers/github-copilot.js.map +1 -1
  68. package/dist/auth/providers/openai-codex.js +442 -460
  69. package/dist/auth/providers/openai-codex.js.map +1 -1
  70. package/dist/auth/providers/xai.js +179 -145
  71. package/dist/auth/providers/xai.js.map +1 -1
  72. package/dist/auth/storage.js +182 -175
  73. package/dist/auth/storage.js.map +1 -1
  74. package/dist/auth/types.js +1 -1
  75. package/dist/clipboard/index.js +206 -172
  76. package/dist/clipboard/index.js.map +1 -1
  77. package/dist/constants.js +11 -16
  78. package/dist/constants.js.map +1 -1
  79. package/dist/error-classification.js +19 -11
  80. package/dist/error-classification.js.map +1 -1
  81. package/dist/evals/context-builder.js +145 -104
  82. package/dist/evals/context-builder.js.map +1 -1
  83. package/dist/evals/index.js +4 -7
  84. package/dist/evals/scorers/classify-command.js +62 -41
  85. package/dist/evals/scorers/classify-command.js.map +1 -1
  86. package/dist/evals/scorers/efficiency.js +239 -181
  87. package/dist/evals/scorers/efficiency.js.map +1 -1
  88. package/dist/evals/scorers/extract-tools.js +51 -47
  89. package/dist/evals/scorers/extract-tools.js.map +1 -1
  90. package/dist/evals/scorers/index.js +1 -5
  91. package/dist/evals/scorers/outcome.js +321 -212
  92. package/dist/evals/scorers/outcome.js.map +1 -1
  93. package/dist/goal-manager.js +266 -261
  94. package/dist/goal-manager.js.map +1 -1
  95. package/dist/goal-signal.js +14 -13
  96. package/dist/goal-signal.js.map +1 -1
  97. package/dist/headless/cli.js +153 -154
  98. package/dist/headless/cli.js.map +1 -1
  99. package/dist/headless/flags.js +180 -178
  100. package/dist/headless/flags.js.map +1 -1
  101. package/dist/headless/format.js +72 -71
  102. package/dist/headless/format.js.map +1 -1
  103. package/dist/headless/index.js +5 -31
  104. package/dist/headless/policy.js +35 -31
  105. package/dist/headless/policy.js.map +1 -1
  106. package/dist/headless/run-mc.js +332 -334
  107. package/dist/headless/run-mc.js.map +1 -1
  108. package/dist/headless/types.js +16 -7
  109. package/dist/headless/types.js.map +1 -1
  110. package/dist/hooks/config.js +56 -61
  111. package/dist/hooks/config.js.map +1 -1
  112. package/dist/hooks/executor.js +118 -116
  113. package/dist/hooks/executor.js.map +1 -1
  114. package/dist/hooks/index.js +4 -15
  115. package/dist/hooks/manager.js +221 -280
  116. package/dist/hooks/manager.js.map +1 -1
  117. package/dist/hooks/types.js +5 -4
  118. package/dist/hooks/types.js.map +1 -1
  119. package/dist/index.d.ts.map +1 -1
  120. package/dist/index.js +632 -712
  121. package/dist/index.js.map +1 -1
  122. package/dist/ipc/ipc-reporter.js +19 -22
  123. package/dist/ipc/ipc-reporter.js.map +1 -1
  124. package/dist/lsp/client.js +248 -306
  125. package/dist/lsp/client.js.map +1 -1
  126. package/dist/lsp/index.js +1 -6
  127. package/dist/lsp/language.js +39 -43
  128. package/dist/lsp/language.js.map +1 -1
  129. package/dist/lsp/manager.js +78 -93
  130. package/dist/lsp/manager.js.map +1 -1
  131. package/dist/lsp/server.js +151 -120
  132. package/dist/lsp/server.js.map +1 -1
  133. package/dist/lsp/workspace.js +50 -47
  134. package/dist/lsp/workspace.js.map +1 -1
  135. package/dist/mcp/config.js +210 -199
  136. package/dist/mcp/config.js.map +1 -1
  137. package/dist/mcp/index.js +2 -9
  138. package/dist/mcp/manager.js +482 -475
  139. package/dist/mcp/manager.js.map +1 -1
  140. package/dist/mcp/types.js +1 -1
  141. package/dist/onboarding/custom-packs.js +14 -17
  142. package/dist/onboarding/custom-packs.js.map +1 -1
  143. package/dist/onboarding/custom-providers.js +22 -20
  144. package/dist/onboarding/custom-providers.js.map +1 -1
  145. package/dist/onboarding/index.d.ts +1 -1
  146. package/dist/onboarding/index.d.ts.map +1 -1
  147. package/dist/onboarding/index.js +3 -21
  148. package/dist/onboarding/om-settings.d.ts +5 -0
  149. package/dist/onboarding/om-settings.d.ts.map +1 -1
  150. package/dist/onboarding/om-settings.js +41 -20
  151. package/dist/onboarding/om-settings.js.map +1 -1
  152. package/dist/onboarding/packs.d.ts +4 -6
  153. package/dist/onboarding/packs.d.ts.map +1 -1
  154. package/dist/onboarding/packs.js +154 -105
  155. package/dist/onboarding/packs.js.map +1 -1
  156. package/dist/onboarding/settings.js +575 -517
  157. package/dist/onboarding/settings.js.map +1 -1
  158. package/dist/permissions.js +112 -99
  159. package/dist/permissions.js.map +1 -1
  160. package/dist/plugin.js +21 -23
  161. package/dist/plugin.js.map +1 -1
  162. package/dist/plugins/dependencies.js +64 -87
  163. package/dist/plugins/dependencies.js.map +1 -1
  164. package/dist/plugins/install.js +159 -169
  165. package/dist/plugins/install.js.map +1 -1
  166. package/dist/plugins/loader.js +170 -185
  167. package/dist/plugins/loader.js.map +1 -1
  168. package/dist/plugins/manager.js +374 -380
  169. package/dist/plugins/manager.js.map +1 -1
  170. package/dist/plugins/manifest.js +38 -63
  171. package/dist/plugins/manifest.js.map +1 -1
  172. package/dist/plugins/package-link.js +48 -64
  173. package/dist/plugins/package-link.js.map +1 -1
  174. package/dist/plugins/paths.js +18 -19
  175. package/dist/plugins/paths.js.map +1 -1
  176. package/dist/plugins/registry.js +97 -81
  177. package/dist/plugins/registry.js.map +1 -1
  178. package/dist/plugins/scaffold.js +62 -98
  179. package/dist/plugins/scaffold.js.map +1 -1
  180. package/dist/plugins/types.js +1 -1
  181. package/dist/processors/plan-rejection-abort.js +45 -44
  182. package/dist/processors/plan-rejection-abort.js.map +1 -1
  183. package/dist/providers/amazon-bedrock-gateway.js +134 -125
  184. package/dist/providers/amazon-bedrock-gateway.js.map +1 -1
  185. package/dist/providers/amazon-bedrock.js +68 -47
  186. package/dist/providers/amazon-bedrock.js.map +1 -1
  187. package/dist/providers/claude-max.js +153 -133
  188. package/dist/providers/claude-max.js.map +1 -1
  189. package/dist/providers/github-copilot.js +232 -230
  190. package/dist/providers/github-copilot.js.map +1 -1
  191. package/dist/providers/openai-codex.js +271 -260
  192. package/dist/providers/openai-codex.js.map +1 -1
  193. package/dist/providers/xai.js +57 -50
  194. package/dist/providers/xai.js.map +1 -1
  195. package/dist/schema.js +91 -89
  196. package/dist/schema.js.map +1 -1
  197. package/dist/theme-palette.js +18 -14
  198. package/dist/theme-palette.js.map +1 -1
  199. package/dist/tool-names.js +46 -37
  200. package/dist/tool-names.js.map +1 -1
  201. package/dist/tools/index.js +2 -8
  202. package/dist/tools/request-sandbox-access.js +71 -80
  203. package/dist/tools/request-sandbox-access.js.map +1 -1
  204. package/dist/tools/utils.js +26 -16
  205. package/dist/tools/utils.js.map +1 -1
  206. package/dist/tools/web-search.js +51 -55
  207. package/dist/tools/web-search.js.map +1 -1
  208. package/dist/utils/binaries.js +65 -61
  209. package/dist/utils/binaries.js.map +1 -1
  210. package/dist/utils/debug-log.js +51 -47
  211. package/dist/utils/debug-log.js.map +1 -1
  212. package/dist/utils/errors.js +157 -192
  213. package/dist/utils/errors.js.map +1 -1
  214. package/dist/utils/gateway-sync.js +49 -37
  215. package/dist/utils/gateway-sync.js.map +1 -1
  216. package/dist/utils/path-security.js +7 -6
  217. package/dist/utils/path-security.js.map +1 -1
  218. package/dist/utils/plan-diff.js +58 -39
  219. package/dist/utils/plan-diff.js.map +1 -1
  220. package/dist/utils/plans.js +92 -74
  221. package/dist/utils/plans.js.map +1 -1
  222. package/dist/utils/project.js +318 -256
  223. package/dist/utils/project.js.map +1 -1
  224. package/dist/utils/signals-pubsub.js +117 -99
  225. package/dist/utils/signals-pubsub.js.map +1 -1
  226. package/dist/utils/slash-command-loader.js +118 -154
  227. package/dist/utils/slash-command-loader.js.map +1 -1
  228. package/dist/utils/slash-command-processor.js +92 -83
  229. package/dist/utils/slash-command-processor.js.map +1 -1
  230. package/dist/utils/stdin-pipe.js +87 -63
  231. package/dist/utils/stdin-pipe.js.map +1 -1
  232. package/dist/utils/storage-factory.js +104 -84
  233. package/dist/utils/storage-factory.js.map +1 -1
  234. package/dist/utils/storage-maintenance.js +249 -211
  235. package/dist/utils/storage-maintenance.js.map +1 -1
  236. package/dist/utils/thread-lock.js +96 -92
  237. package/dist/utils/thread-lock.js.map +1 -1
  238. package/dist/utils/token-estimator.js +12 -12
  239. package/dist/utils/token-estimator.js.map +1 -1
  240. package/dist/utils/update-check.d.ts +1 -1
  241. package/dist/utils/update-check.js +341 -259
  242. package/dist/utils/update-check.js.map +1 -1
  243. package/dist/voice/stt-registry.js +131 -113
  244. package/dist/voice/stt-registry.js.map +1 -1
  245. package/package.json +11 -11
  246. package/dist/acp.js.map +0 -1
  247. package/dist/auth/index.js.map +0 -1
  248. package/dist/auth/types.js.map +0 -1
  249. package/dist/evals/index.js.map +0 -1
  250. package/dist/evals/scorers/index.js.map +0 -1
  251. package/dist/headless/index.js.map +0 -1
  252. package/dist/hooks/index.js.map +0 -1
  253. package/dist/lsp/index.js.map +0 -1
  254. package/dist/mcp/index.js.map +0 -1
  255. package/dist/mcp/types.js.map +0 -1
  256. package/dist/onboarding/index.js.map +0 -1
  257. package/dist/plugins/types.js.map +0 -1
  258. package/dist/tools/index.js.map +0 -1
@@ -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
- const content = message.content;
4
- if (typeof content === "string" || !content?.parts) return "";
5
- return content.parts.filter((part) => part.type === "text").map((part) => part.text).join("");
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
- const contents = mastraDBMessageToSignal(message).contents;
9
- if (typeof contents === "string") return contents;
10
- if (!Array.isArray(contents)) return "";
11
- return contents.filter((part) => part.type === "text").map((part) => part.text).join("\n");
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
- autoApprove = value;
20
+ autoApprove = value;
16
21
  }
22
+ /**
23
+ * Map a mastracode tool name to an ACP ToolKind.
24
+ */
17
25
  function mapToolKind(toolName) {
18
- const name = toolName.toLowerCase();
19
- if (name.includes("edit") || name.includes("write") || name.includes("replace") || name.includes("patch"))
20
- return "edit";
21
- if (name.includes("read") || name.includes("view") || name.includes("list") || name.includes("find")) return "read";
22
- if (name.includes("delete") || name.includes("remove")) return "delete";
23
- if (name.includes("search") || name.includes("grep") || name.includes("query")) return "search";
24
- if (name.includes("execute") || name.includes("run") || name.includes("command") || name.includes("shell"))
25
- return "execute";
26
- if (name.includes("fetch") || name.includes("curl") || name.includes("http") || name.includes("browse") || name.includes("navigate"))
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
- if (!state) return;
33
- switch (event.type) {
34
- case "agent_start":
35
- state.lastTextLength = 0;
36
- break;
37
- case "message_start": {
38
- if (event.message.role !== "signal") break;
39
- const text = getSignalText(event.message);
40
- if (text) {
41
- sendUpdate(connection, state.sessionId, {
42
- sessionUpdate: "agent_message_chunk",
43
- content: { type: "text", text }
44
- });
45
- }
46
- break;
47
- }
48
- case "message_update": {
49
- if (event.message.role !== "assistant") break;
50
- const fullText = getMessageText(event.message);
51
- if (fullText.length > state.lastTextLength) {
52
- const delta = fullText.slice(state.lastTextLength);
53
- state.lastTextLength = fullText.length;
54
- sendUpdate(connection, state.sessionId, {
55
- sessionUpdate: "agent_message_chunk",
56
- content: { type: "text", text: delta }
57
- });
58
- }
59
- break;
60
- }
61
- case "message_end":
62
- if (event.message.role === "assistant") state.lastTextLength = 0;
63
- break;
64
- case "tool_start":
65
- sendUpdate(connection, state.sessionId, {
66
- sessionUpdate: "tool_call",
67
- toolCallId: event.toolCallId,
68
- title: event.toolName,
69
- kind: mapToolKind(event.toolName),
70
- status: "in_progress",
71
- rawInput: JSON.stringify(event.args)
72
- });
73
- break;
74
- case "tool_end":
75
- sendUpdate(connection, state.sessionId, {
76
- sessionUpdate: "tool_call_update",
77
- toolCallId: event.toolCallId,
78
- status: event.isError ? "failed" : "completed",
79
- rawOutput: typeof event.result === "string" ? event.result : JSON.stringify(event.result)
80
- });
81
- break;
82
- case "tool_approval_required":
83
- void handleToolApproval(state, connection, session, event).catch((err) => {
84
- process.stderr.write(`[acp] handleToolApproval error: ${err}
85
- `);
86
- });
87
- break;
88
- case "tool_suspended":
89
- void handleToolSuspended(state, connection, session, event).catch((err) => {
90
- process.stderr.write(`[acp] handleToolSuspended error: ${err}
91
- `);
92
- });
93
- break;
94
- case "usage_update":
95
- accumulateUsage(state.usage, event.usage);
96
- break;
97
- case "agent_end":
98
- state.resolve(event.reason ?? "complete");
99
- break;
100
- // Ignored in v1: om_*, subagent_*, workspace_*, task_updated, etc.
101
- default:
102
- break;
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
- connection.sessionUpdate({ sessionId, update }).catch((err) => {
107
- process.stderr.write(`[acp] sessionUpdate error: ${err}
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
- if (autoApprove) {
113
- session.respondToToolApproval({ decision: "approve" });
114
- return;
115
- }
116
- const req = {
117
- sessionId: state.sessionId,
118
- toolCall: {
119
- toolCallId: event.toolCallId,
120
- title: event.toolName,
121
- rawInput: JSON.stringify(event.args)
122
- },
123
- options: [
124
- { optionId: "approve", name: "Allow", kind: "allow_once" },
125
- { optionId: "reject", name: "Reject", kind: "reject_once" }
126
- ]
127
- };
128
- try {
129
- const resp = await connection.requestPermission(req);
130
- if (resp.outcome.outcome === "selected") {
131
- const decision = resp.outcome.optionId === "approve" ? "approve" : "decline";
132
- session.respondToToolApproval({ decision });
133
- } else {
134
- session.respondToToolApproval({ decision: "decline" });
135
- }
136
- } catch (err) {
137
- process.stderr.write(`[acp] requestPermission error: ${err}
138
- `);
139
- session.respondToToolApproval({ decision: "decline" });
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
- const { toolCallId, toolName, args, suspendPayload } = event;
144
- if (toolName === "request_access" || suspendPayload?.kind === "sandbox_access_request") {
145
- void session.respondToToolSuspension({ toolCallId, resumeData: "Yes" });
146
- return;
147
- }
148
- if (toolName === "submit_plan") {
149
- const req = {
150
- sessionId: state.sessionId,
151
- toolCall: {
152
- toolCallId,
153
- title: toolName,
154
- rawInput: JSON.stringify(args)
155
- },
156
- options: [
157
- { optionId: "approve", name: "Approve Plan", kind: "allow_once" },
158
- { optionId: "reject", name: "Reject Plan", kind: "reject_once" }
159
- ]
160
- };
161
- try {
162
- const resp = await connection.requestPermission(req);
163
- const action = resp.outcome.outcome === "selected" && resp.outcome.optionId === "approve" ? "approved" : "rejected";
164
- void session.respondToToolSuspension({ toolCallId, resumeData: { action } });
165
- } catch {
166
- void session.respondToToolSuspension({ toolCallId, resumeData: { action: "rejected" } });
167
- }
168
- return;
169
- }
170
- void session.respondToToolSuspension({
171
- toolCallId,
172
- resumeData: "Proceed with your best judgment. Do not ask further questions."
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
- target.promptTokens += usage.promptTokens;
177
- target.completionTokens += usage.completionTokens;
178
- target.totalTokens += usage.totalTokens;
179
- if (usage.reasoningTokens) target.reasoningTokens = (target.reasoningTokens ?? 0) + usage.reasoningTokens;
180
- if (usage.cachedInputTokens) target.cachedInputTokens = (target.cachedInputTokens ?? 0) + usage.cachedInputTokens;
181
- if (usage.cacheCreationInputTokens) {
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
- export {
186
- handleAgentControllerEvent,
187
- setAutoApprove
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
- if (options?.dangerousAutoApprove) {
7
- setAutoApprove(true);
8
- }
9
- const originalConsoleLog = console.log;
10
- console.log = (...args) => {
11
- process.stderr.write(args.map(String).join(" ") + "\n");
12
- };
13
- let result;
14
- try {
15
- result = await createMastraCode({
16
- unixSocketPubSub: false,
17
- disableMcp: false,
18
- disableHooks: false
19
- });
20
- const { controller, mcpManager, signalsPubSub } = result;
21
- const modes = [
22
- { id: "build", name: "Build" },
23
- { id: "plan", name: "Plan" },
24
- { id: "fast", name: "Fast" }
25
- ];
26
- const cleanup = async () => {
27
- releaseAllThreadLocks();
28
- const closeSignalsPubSub = signalsPubSub?.close;
29
- await Promise.allSettled([
30
- mcpManager?.disconnect(),
31
- controller?.getMastra()?.stopWorkers(),
32
- controller?.stopIntervals(),
33
- closeSignalsPubSub?.()
34
- ]);
35
- console.log = originalConsoleLog;
36
- };
37
- const handleSignal = async () => {
38
- await cleanup();
39
- process.exit(0);
40
- };
41
- process.on("SIGINT", handleSignal);
42
- process.on("SIGTERM", handleSignal);
43
- await runAcpServer(controller, modes, cleanup);
44
- } catch (error) {
45
- process.stderr.write(`[acp] Fatal error: ${error}
46
- `);
47
- console.log = originalConsoleLog;
48
- process.exit(1);
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
- export {
52
- acpMain
53
- };
62
+ //#endregion
63
+ export { acpMain };
64
+
54
65
  //# sourceMappingURL=index.js.map
@@ -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":"AAEA,SAAS,wBAAwB;AACjC,SAAS,6BAA6B;AACtC,SAAS,sBAAsB;AAC/B,SAAS,oBAAoB;AAM7B,eAAsB,QAAQ,SAA6D;AACzF,MAAI,SAAS,sBAAsB;AACjC,mBAAe,IAAI;AAAA,EACrB;AAGA,QAAM,qBAAqB,QAAQ;AAEnC,UAAQ,MAAM,IAAI,SAAoB;AACpC,YAAQ,OAAO,MAAM,KAAK,IAAI,MAAM,EAAE,KAAK,GAAG,IAAI,IAAI;AAAA,EACxD;AAEA,MAAI;AAEJ,MAAI;AACF,aAAS,MAAM,iBAAiB;AAAA,MAC9B,kBAAkB;AAAA,MAClB,YAAY;AAAA,MACZ,cAAc;AAAA,IAChB,CAAC;AAED,UAAM,EAAE,YAAY,YAAY,cAAc,IAAI;AAGlD,UAAM,QAA+B;AAAA,MACnC,EAAE,IAAI,SAAS,MAAM,QAAQ;AAAA,MAC7B,EAAE,IAAI,QAAQ,MAAM,OAAO;AAAA,MAC3B,EAAE,IAAI,QAAQ,MAAM,OAAO;AAAA,IAC7B;AAGA,UAAM,UAAU,YAAY;AAC1B,4BAAsB;AACtB,YAAM,qBAAsB,eAAsE;AAClG,YAAM,QAAQ,WAAW;AAAA,QACvB,YAAY,WAAW;AAAA,QACvB,YAAY,UAAU,GAAG,YAAY;AAAA,QACrC,YAAY,cAAc;AAAA,QAC1B,qBAAqB;AAAA,MACvB,CAAC;AAID,cAAQ,MAAM;AAAA,IAChB;AAGA,UAAM,eAAe,YAAY;AAC/B,YAAM,QAAQ;AACd,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,YAAQ,GAAG,UAAU,YAAY;AACjC,YAAQ,GAAG,WAAW,YAAY;AAElC,UAAM,aAAa,YAAY,OAAO,OAAO;AAAA,EAC/C,SAAS,OAAO;AACd,YAAQ,OAAO,MAAM,sBAAsB,KAAK;AAAA,CAAI;AAEpD,YAAQ,MAAM;AACd,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;","names":[]}
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"}