@mastra/code-sdk 1.0.3-alpha.0 → 1.1.0-alpha.2

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 +49 -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,145 +1,105 @@
1
- import { createAnthropic } from "@ai-sdk/anthropic";
2
- import { createOpenAI } from "@ai-sdk/openai";
3
- import { createNotificationInboxTool, NotificationsStorage } from "@mastra/core/notifications";
1
+ import { createWebExtractTool, createWebSearchTool, hasTavilyKey } from "../tools/web-search.js";
4
2
  import { MC_TOOLS } from "../tool-names.js";
5
- import { createWebSearchTool, createWebExtractTool, hasTavilyKey, requestSandboxAccessTool } from "../tools/index.js";
6
- class LazyNotificationsStorage extends NotificationsStorage {
7
- constructor(storage) {
8
- super();
9
- this.storage = storage;
10
- }
11
- storage;
12
- async getNotificationsStorage() {
13
- const notifications = await this.storage.getStore("notifications");
14
- if (!notifications) {
15
- throw new Error("notification_inbox requires a notifications storage domain");
16
- }
17
- return notifications;
18
- }
19
- async createNotification(input) {
20
- return (await this.getNotificationsStorage()).createNotification(input);
21
- }
22
- async listNotifications(input) {
23
- return (await this.getNotificationsStorage()).listNotifications(input);
24
- }
25
- async listDueNotifications(input) {
26
- return (await this.getNotificationsStorage()).listDueNotifications(input);
27
- }
28
- async getNotification(input) {
29
- return (await this.getNotificationsStorage()).getNotification(input);
30
- }
31
- async updateNotification(input) {
32
- return (await this.getNotificationsStorage()).updateNotification(input);
33
- }
34
- async dangerouslyClearAll() {
35
- return (await this.getNotificationsStorage()).dangerouslyClearAll();
36
- }
37
- }
3
+ import { requestSandboxAccessTool } from "../tools/request-sandbox-access.js";
4
+ import "../tools/index.js";
5
+ import { createOpenAI } from "@ai-sdk/openai";
6
+ import { createAnthropic } from "@ai-sdk/anthropic";
7
+ import { NotificationsStorage, createNotificationInboxTool } from "@mastra/core/notifications";
8
+ //#region src/agents/tools.ts
9
+ var LazyNotificationsStorage = class extends NotificationsStorage {
10
+ storage;
11
+ constructor(storage) {
12
+ super();
13
+ this.storage = storage;
14
+ }
15
+ async getNotificationsStorage() {
16
+ const notifications = await this.storage.getStore("notifications");
17
+ if (!notifications) throw new Error("notification_inbox requires a notifications storage domain");
18
+ return notifications;
19
+ }
20
+ async createNotification(input) {
21
+ return (await this.getNotificationsStorage()).createNotification(input);
22
+ }
23
+ async listNotifications(input) {
24
+ return (await this.getNotificationsStorage()).listNotifications(input);
25
+ }
26
+ async listDueNotifications(input) {
27
+ return (await this.getNotificationsStorage()).listDueNotifications(input);
28
+ }
29
+ async getNotification(input) {
30
+ return (await this.getNotificationsStorage()).getNotification(input);
31
+ }
32
+ async updateNotification(input) {
33
+ return (await this.getNotificationsStorage()).updateNotification(input);
34
+ }
35
+ async dangerouslyClearAll() {
36
+ return (await this.getNotificationsStorage()).dangerouslyClearAll();
37
+ }
38
+ };
38
39
  function createToolHooks(hookManager, postToolObserver) {
39
- if (!hookManager && !postToolObserver) return void 0;
40
- return {
41
- beforeToolCall: async ({ toolName, input }) => {
42
- if (!hookManager) return;
43
- const preResult = await hookManager.runPreToolUse(toolName, input);
44
- if (!preResult.allowed) {
45
- return {
46
- proceed: false,
47
- output: {
48
- error: preResult.blockReason ?? `Blocked by PreToolUse hook for tool "${toolName}"`
49
- }
50
- };
51
- }
52
- },
53
- afterToolCall: async (context) => {
54
- const { toolName, input, output, error } = context;
55
- if (hookManager) {
56
- const failed = error !== void 0;
57
- await hookManager.runPostToolUse(
58
- toolName,
59
- input,
60
- failed ? { error: error instanceof Error ? error.message : String(error) } : output,
61
- failed
62
- ).catch(() => void 0);
63
- }
64
- await Promise.resolve().then(() => postToolObserver?.(context)).catch((error2) => {
65
- console.warn(`[MastraCode] Post-tool observer failed for ${toolName}.`, error2);
66
- });
67
- }
68
- };
40
+ if (!hookManager && !postToolObserver) return void 0;
41
+ return {
42
+ beforeToolCall: async ({ toolName, input }) => {
43
+ if (!hookManager) return;
44
+ const preResult = await hookManager.runPreToolUse(toolName, input);
45
+ if (!preResult.allowed) return {
46
+ proceed: false,
47
+ output: { error: preResult.blockReason ?? `Blocked by PreToolUse hook for tool "${toolName}"` }
48
+ };
49
+ },
50
+ afterToolCall: async (context) => {
51
+ const { toolName, input, output, error } = context;
52
+ if (hookManager) {
53
+ const failed = error !== void 0;
54
+ await hookManager.runPostToolUse(toolName, input, failed ? { error: error instanceof Error ? error.message : String(error) } : output, failed).catch(() => void 0);
55
+ }
56
+ await Promise.resolve().then(() => postToolObserver?.(context)).catch((error) => {
57
+ console.warn(`[MastraCode] Post-tool observer failed for ${toolName}.`, error);
58
+ });
59
+ }
60
+ };
69
61
  }
70
62
  function createDynamicTools(mcpManager, extraTools, disabledTools, storage, pluginTools) {
71
- return function getDynamicTools({
72
- requestContext
73
- }) {
74
- const ctx = requestContext.get("controller");
75
- const state = ctx?.getState();
76
- const modelId = ctx?.session?.modelId;
77
- const isAnthropicModel = modelId?.startsWith("anthropic/");
78
- const isOpenAIModel = modelId?.startsWith("openai/");
79
- const tools = {
80
- request_access: requestSandboxAccessTool
81
- };
82
- if (storage) {
83
- tools[MC_TOOLS.NOTIFICATION_INBOX] = createNotificationInboxTool({
84
- storage: new LazyNotificationsStorage(storage)
85
- });
86
- }
87
- if (hasTavilyKey()) {
88
- tools.web_search = createWebSearchTool();
89
- tools.web_extract = createWebExtractTool();
90
- } else if (isAnthropicModel) {
91
- const anthropic = createAnthropic({});
92
- tools.web_search = anthropic.tools.webSearch_20250305();
93
- } else if (isOpenAIModel) {
94
- const openai = createOpenAI({});
95
- tools.web_search = openai.tools.webSearch();
96
- }
97
- if (mcpManager) {
98
- const mcpTools = mcpManager.getTools();
99
- Object.assign(tools, mcpTools);
100
- }
101
- const finish = (resolvedExtra) => {
102
- if (resolvedExtra) {
103
- for (const [name, tool] of Object.entries(resolvedExtra)) {
104
- if (tool && !(name in tools)) {
105
- tools[name] = tool;
106
- }
107
- }
108
- }
109
- if (pluginTools) {
110
- for (const [name, tool] of Object.entries(pluginTools)) {
111
- if (!(name in tools)) {
112
- tools[name] = tool;
113
- }
114
- }
115
- }
116
- if (disabledTools?.length) {
117
- for (const toolName of disabledTools) {
118
- delete tools[toolName];
119
- }
120
- }
121
- const permissionRules = state?.permissionRules;
122
- if (permissionRules?.tools) {
123
- for (const [name, policy] of Object.entries(permissionRules.tools)) {
124
- if (policy === "deny") {
125
- delete tools[name];
126
- }
127
- }
128
- }
129
- return tools;
130
- };
131
- if (typeof extraTools === "function") {
132
- const resolved = extraTools({ requestContext });
133
- if (resolved && typeof resolved.then === "function") {
134
- return Promise.resolve(resolved).then(finish);
135
- }
136
- return finish(resolved);
137
- }
138
- return finish(extraTools);
139
- };
63
+ return function getDynamicTools({ requestContext }) {
64
+ const ctx = requestContext.get("controller");
65
+ const state = ctx?.getState();
66
+ const modelId = ctx?.session?.modelId;
67
+ const isAnthropicModel = modelId?.startsWith("anthropic/");
68
+ const isOpenAIModel = modelId?.startsWith("openai/");
69
+ const tools = { request_access: requestSandboxAccessTool };
70
+ if (storage) tools[MC_TOOLS.NOTIFICATION_INBOX] = createNotificationInboxTool({ storage: new LazyNotificationsStorage(storage) });
71
+ if (hasTavilyKey()) {
72
+ tools.web_search = createWebSearchTool();
73
+ tools.web_extract = createWebExtractTool();
74
+ } else if (isAnthropicModel) tools.web_search = createAnthropic({}).tools.webSearch_20250305();
75
+ else if (isOpenAIModel) tools.web_search = createOpenAI({}).tools.webSearch();
76
+ if (mcpManager) {
77
+ const mcpTools = mcpManager.getTools();
78
+ Object.assign(tools, mcpTools);
79
+ }
80
+ const finish = (resolvedExtra) => {
81
+ if (resolvedExtra) {
82
+ for (const [name, tool] of Object.entries(resolvedExtra)) if (tool && !(name in tools)) tools[name] = tool;
83
+ }
84
+ if (pluginTools) {
85
+ for (const [name, tool] of Object.entries(pluginTools)) if (!(name in tools)) tools[name] = tool;
86
+ }
87
+ if (disabledTools?.length) for (const toolName of disabledTools) delete tools[toolName];
88
+ const permissionRules = state?.permissionRules;
89
+ if (permissionRules?.tools) {
90
+ for (const [name, policy] of Object.entries(permissionRules.tools)) if (policy === "deny") delete tools[name];
91
+ }
92
+ return tools;
93
+ };
94
+ if (typeof extraTools === "function") {
95
+ const resolved = extraTools({ requestContext });
96
+ if (resolved && typeof resolved.then === "function") return Promise.resolve(resolved).then(finish);
97
+ return finish(resolved);
98
+ }
99
+ return finish(extraTools);
100
+ };
140
101
  }
141
- export {
142
- createDynamicTools,
143
- createToolHooks
144
- };
102
+ //#endregion
103
+ export { createDynamicTools, createToolHooks };
104
+
145
105
  //# sourceMappingURL=tools.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/agents/tools.ts"],"sourcesContent":["import { createAnthropic } from '@ai-sdk/anthropic';\nimport { createOpenAI } from '@ai-sdk/openai';\nimport type { AgentControllerRequestContext } from '@mastra/core/agent-controller';\nimport { createNotificationInboxTool, NotificationsStorage } from '@mastra/core/notifications';\nimport type {\n CreateNotificationInput,\n ListDueNotificationsInput,\n ListNotificationsInput,\n UpdateNotificationInput,\n} from '@mastra/core/notifications';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { MastraCompositeStore } from '@mastra/core/storage';\nimport type { ToolAfterHookContext, ToolHooks } from '@mastra/core/tools';\nimport type { HookManager } from '../hooks/index.js';\nimport type { McpManager } from '../mcp/index.js';\nimport type { MastraCodeComposedState } from '../schema.js';\nimport { MC_TOOLS } from '../tool-names.js';\nimport { createWebSearchTool, createWebExtractTool, hasTavilyKey, requestSandboxAccessTool } from '../tools/index.js';\n\n/** Minimal shape for tools passed to createDynamicTools. */\nexport type ToolLike = {\n execute?: (...args: any[]) => Promise<unknown> | unknown;\n} & Record<string, any>;\n\nclass LazyNotificationsStorage extends NotificationsStorage {\n constructor(private readonly storage: MastraCompositeStore) {\n super();\n }\n\n private async getNotificationsStorage(): Promise<NotificationsStorage> {\n const notifications = await this.storage.getStore('notifications');\n if (!notifications) {\n throw new Error('notification_inbox requires a notifications storage domain');\n }\n return notifications;\n }\n\n async createNotification(input: CreateNotificationInput) {\n return (await this.getNotificationsStorage()).createNotification(input);\n }\n\n async listNotifications(input: ListNotificationsInput) {\n return (await this.getNotificationsStorage()).listNotifications(input);\n }\n\n async listDueNotifications(input: ListDueNotificationsInput) {\n return (await this.getNotificationsStorage()).listDueNotifications(input);\n }\n\n async getNotification(input: { threadId: string; id: string }) {\n return (await this.getNotificationsStorage()).getNotification(input);\n }\n\n async updateNotification(input: UpdateNotificationInput) {\n return (await this.getNotificationsStorage()).updateNotification(input);\n }\n\n async dangerouslyClearAll() {\n return (await this.getNotificationsStorage()).dangerouslyClearAll();\n }\n}\n\nexport type PostToolObserver = (context: ToolAfterHookContext) => void | Promise<void>;\n\nexport function createToolHooks(hookManager?: HookManager, postToolObserver?: PostToolObserver): ToolHooks | undefined {\n if (!hookManager && !postToolObserver) return undefined;\n\n return {\n beforeToolCall: async ({ toolName, input }) => {\n if (!hookManager) return;\n const preResult = await hookManager.runPreToolUse(toolName, input);\n if (!preResult.allowed) {\n return {\n proceed: false as const,\n output: {\n error: preResult.blockReason ?? `Blocked by PreToolUse hook for tool \"${toolName}\"`,\n },\n };\n }\n },\n afterToolCall: async context => {\n const { toolName, input, output, error } = context;\n if (hookManager) {\n const failed = error !== undefined;\n await hookManager\n .runPostToolUse(\n toolName,\n input,\n failed ? { error: error instanceof Error ? error.message : String(error) } : output,\n failed,\n )\n .catch(() => undefined);\n }\n await Promise.resolve()\n .then(() => postToolObserver?.(context))\n .catch(error => {\n console.warn(`[MastraCode] Post-tool observer failed for ${toolName}.`, error);\n });\n },\n };\n}\n\ntype DynamicToolProvider =\n | Record<string, ToolLike | undefined>\n | ((ctx: {\n requestContext: RequestContext;\n }) => Record<string, ToolLike | undefined> | Promise<Record<string, ToolLike | undefined>>);\n\nexport function createDynamicTools(\n mcpManager?: McpManager,\n extraTools?: DynamicToolProvider,\n disabledTools?: string[],\n storage?: MastraCompositeStore,\n pluginTools?: Record<string, ToolLike>,\n) {\n return function getDynamicTools({\n requestContext,\n }: {\n requestContext: RequestContext;\n }): Record<string, ToolLike> | Promise<Record<string, ToolLike>> {\n const ctx = requestContext.get('controller') as AgentControllerRequestContext<MastraCodeComposedState> | undefined;\n const state = ctx?.getState();\n\n const modelId = ctx?.session?.modelId;\n const isAnthropicModel = modelId?.startsWith('anthropic/');\n const isOpenAIModel = modelId?.startsWith('openai/');\n\n // Filesystem, grep, glob, edit, write, execute_command, and process\n // management tools are now provided by the workspace (see workspace.ts).\n // Only tools without a workspace equivalent remain here.\n const tools: Record<string, ToolLike> = {\n request_access: requestSandboxAccessTool,\n };\n\n if (storage) {\n tools[MC_TOOLS.NOTIFICATION_INBOX] = createNotificationInboxTool({\n storage: new LazyNotificationsStorage(storage),\n });\n }\n\n if (hasTavilyKey()) {\n tools.web_search = createWebSearchTool();\n tools.web_extract = createWebExtractTool();\n } else if (isAnthropicModel) {\n const anthropic = createAnthropic({});\n tools.web_search = anthropic.tools.webSearch_20250305();\n } else if (isOpenAIModel) {\n const openai = createOpenAI({});\n tools.web_search = openai.tools.webSearch();\n }\n\n if (mcpManager) {\n const mcpTools = mcpManager.getTools();\n Object.assign(tools, mcpTools);\n }\n\n const finish = (resolvedExtra: Record<string, ToolLike | undefined> | undefined) => {\n if (resolvedExtra) {\n for (const [name, tool] of Object.entries(resolvedExtra)) {\n if (tool && !(name in tools)) {\n tools[name] = tool;\n }\n }\n }\n\n if (pluginTools) {\n for (const [name, tool] of Object.entries(pluginTools)) {\n if (!(name in tools)) {\n tools[name] = tool;\n }\n }\n }\n\n // Remove tools explicitly disabled via config so the model never sees them.\n if (disabledTools?.length) {\n for (const toolName of disabledTools) {\n delete tools[toolName];\n }\n }\n\n // Remove tools that have a per-tool 'deny' policy so the model never sees them.\n const permissionRules = state?.permissionRules;\n if (permissionRules?.tools) {\n for (const [name, policy] of Object.entries(permissionRules.tools)) {\n if (policy === 'deny') {\n delete tools[name];\n }\n }\n }\n\n return tools;\n };\n\n if (typeof extraTools === 'function') {\n const resolved = extraTools({ requestContext });\n // Stay synchronous for sync providers; only go async when the provider does.\n if (resolved && typeof (resolved as PromiseLike<unknown>).then === 'function') {\n return Promise.resolve(resolved).then(finish);\n }\n return finish(resolved as Record<string, ToolLike | undefined>);\n }\n\n return finish(extraTools);\n };\n}\n"],"mappings":"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","names":["error"]}
1
+ {"version":3,"file":"tools.js","names":[],"sources":["../../src/agents/tools.ts"],"sourcesContent":["import { createAnthropic } from '@ai-sdk/anthropic';\nimport { createOpenAI } from '@ai-sdk/openai';\nimport type { AgentControllerRequestContext } from '@mastra/core/agent-controller';\nimport { createNotificationInboxTool, NotificationsStorage } from '@mastra/core/notifications';\nimport type {\n CreateNotificationInput,\n ListDueNotificationsInput,\n ListNotificationsInput,\n UpdateNotificationInput,\n} from '@mastra/core/notifications';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { MastraCompositeStore } from '@mastra/core/storage';\nimport type { ToolAfterHookContext, ToolHooks } from '@mastra/core/tools';\nimport type { HookManager } from '../hooks/index.js';\nimport type { McpManager } from '../mcp/index.js';\nimport type { MastraCodeComposedState } from '../schema.js';\nimport { MC_TOOLS } from '../tool-names.js';\nimport { createWebSearchTool, createWebExtractTool, hasTavilyKey, requestSandboxAccessTool } from '../tools/index.js';\n\n/** Minimal shape for tools passed to createDynamicTools. */\nexport type ToolLike = {\n execute?: (...args: any[]) => Promise<unknown> | unknown;\n} & Record<string, any>;\n\nclass LazyNotificationsStorage extends NotificationsStorage {\n constructor(private readonly storage: MastraCompositeStore) {\n super();\n }\n\n private async getNotificationsStorage(): Promise<NotificationsStorage> {\n const notifications = await this.storage.getStore('notifications');\n if (!notifications) {\n throw new Error('notification_inbox requires a notifications storage domain');\n }\n return notifications;\n }\n\n async createNotification(input: CreateNotificationInput) {\n return (await this.getNotificationsStorage()).createNotification(input);\n }\n\n async listNotifications(input: ListNotificationsInput) {\n return (await this.getNotificationsStorage()).listNotifications(input);\n }\n\n async listDueNotifications(input: ListDueNotificationsInput) {\n return (await this.getNotificationsStorage()).listDueNotifications(input);\n }\n\n async getNotification(input: { threadId: string; id: string }) {\n return (await this.getNotificationsStorage()).getNotification(input);\n }\n\n async updateNotification(input: UpdateNotificationInput) {\n return (await this.getNotificationsStorage()).updateNotification(input);\n }\n\n async dangerouslyClearAll() {\n return (await this.getNotificationsStorage()).dangerouslyClearAll();\n }\n}\n\nexport type PostToolObserver = (context: ToolAfterHookContext) => void | Promise<void>;\n\nexport function createToolHooks(hookManager?: HookManager, postToolObserver?: PostToolObserver): ToolHooks | undefined {\n if (!hookManager && !postToolObserver) return undefined;\n\n return {\n beforeToolCall: async ({ toolName, input }) => {\n if (!hookManager) return;\n const preResult = await hookManager.runPreToolUse(toolName, input);\n if (!preResult.allowed) {\n return {\n proceed: false as const,\n output: {\n error: preResult.blockReason ?? `Blocked by PreToolUse hook for tool \"${toolName}\"`,\n },\n };\n }\n },\n afterToolCall: async context => {\n const { toolName, input, output, error } = context;\n if (hookManager) {\n const failed = error !== undefined;\n await hookManager\n .runPostToolUse(\n toolName,\n input,\n failed ? { error: error instanceof Error ? error.message : String(error) } : output,\n failed,\n )\n .catch(() => undefined);\n }\n await Promise.resolve()\n .then(() => postToolObserver?.(context))\n .catch(error => {\n console.warn(`[MastraCode] Post-tool observer failed for ${toolName}.`, error);\n });\n },\n };\n}\n\ntype DynamicToolProvider =\n | Record<string, ToolLike | undefined>\n | ((ctx: {\n requestContext: RequestContext;\n }) => Record<string, ToolLike | undefined> | Promise<Record<string, ToolLike | undefined>>);\n\nexport function createDynamicTools(\n mcpManager?: McpManager,\n extraTools?: DynamicToolProvider,\n disabledTools?: string[],\n storage?: MastraCompositeStore,\n pluginTools?: Record<string, ToolLike>,\n) {\n return function getDynamicTools({\n requestContext,\n }: {\n requestContext: RequestContext;\n }): Record<string, ToolLike> | Promise<Record<string, ToolLike>> {\n const ctx = requestContext.get('controller') as AgentControllerRequestContext<MastraCodeComposedState> | undefined;\n const state = ctx?.getState();\n\n const modelId = ctx?.session?.modelId;\n const isAnthropicModel = modelId?.startsWith('anthropic/');\n const isOpenAIModel = modelId?.startsWith('openai/');\n\n // Filesystem, grep, glob, edit, write, execute_command, and process\n // management tools are now provided by the workspace (see workspace.ts).\n // Only tools without a workspace equivalent remain here.\n const tools: Record<string, ToolLike> = {\n request_access: requestSandboxAccessTool,\n };\n\n if (storage) {\n tools[MC_TOOLS.NOTIFICATION_INBOX] = createNotificationInboxTool({\n storage: new LazyNotificationsStorage(storage),\n });\n }\n\n if (hasTavilyKey()) {\n tools.web_search = createWebSearchTool();\n tools.web_extract = createWebExtractTool();\n } else if (isAnthropicModel) {\n const anthropic = createAnthropic({});\n tools.web_search = anthropic.tools.webSearch_20250305();\n } else if (isOpenAIModel) {\n const openai = createOpenAI({});\n tools.web_search = openai.tools.webSearch();\n }\n\n if (mcpManager) {\n const mcpTools = mcpManager.getTools();\n Object.assign(tools, mcpTools);\n }\n\n const finish = (resolvedExtra: Record<string, ToolLike | undefined> | undefined) => {\n if (resolvedExtra) {\n for (const [name, tool] of Object.entries(resolvedExtra)) {\n if (tool && !(name in tools)) {\n tools[name] = tool;\n }\n }\n }\n\n if (pluginTools) {\n for (const [name, tool] of Object.entries(pluginTools)) {\n if (!(name in tools)) {\n tools[name] = tool;\n }\n }\n }\n\n // Remove tools explicitly disabled via config so the model never sees them.\n if (disabledTools?.length) {\n for (const toolName of disabledTools) {\n delete tools[toolName];\n }\n }\n\n // Remove tools that have a per-tool 'deny' policy so the model never sees them.\n const permissionRules = state?.permissionRules;\n if (permissionRules?.tools) {\n for (const [name, policy] of Object.entries(permissionRules.tools)) {\n if (policy === 'deny') {\n delete tools[name];\n }\n }\n }\n\n return tools;\n };\n\n if (typeof extraTools === 'function') {\n const resolved = extraTools({ requestContext });\n // Stay synchronous for sync providers; only go async when the provider does.\n if (resolved && typeof (resolved as PromiseLike<unknown>).then === 'function') {\n return Promise.resolve(resolved).then(finish);\n }\n return finish(resolved as Record<string, ToolLike | undefined>);\n }\n\n return finish(extraTools);\n };\n}\n"],"mappings":"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"}