@mastra/code-sdk 0.0.0-esbuild-bundle-worker-20260807173433

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 (491) hide show
  1. package/CHANGELOG.md +1349 -0
  2. package/LICENSE.md +30 -0
  3. package/README.md +70 -0
  4. package/dist/acp/agent.d.ts +35 -0
  5. package/dist/acp/agent.d.ts.map +1 -0
  6. package/dist/acp/agent.js +161 -0
  7. package/dist/acp/agent.js.map +1 -0
  8. package/dist/acp/event-mapper.d.ts +22 -0
  9. package/dist/acp/event-mapper.d.ts.map +1 -0
  10. package/dist/acp/event-mapper.js +214 -0
  11. package/dist/acp/event-mapper.js.map +1 -0
  12. package/dist/acp/index.d.ts +8 -0
  13. package/dist/acp/index.d.ts.map +1 -0
  14. package/dist/acp/index.js +65 -0
  15. package/dist/acp/index.js.map +1 -0
  16. package/dist/acp/server.d.ts +7 -0
  17. package/dist/acp/server.d.ts.map +1 -0
  18. package/dist/acp/server.js +35 -0
  19. package/dist/acp/server.js.map +1 -0
  20. package/dist/acp.d.ts +2 -0
  21. package/dist/acp.d.ts.map +1 -0
  22. package/dist/acp.js +2 -0
  23. package/dist/agents/credential-resolver.d.ts +51 -0
  24. package/dist/agents/credential-resolver.d.ts.map +1 -0
  25. package/dist/agents/credential-resolver.js +52 -0
  26. package/dist/agents/credential-resolver.js.map +1 -0
  27. package/dist/agents/custom-provider-source.d.ts +35 -0
  28. package/dist/agents/custom-provider-source.d.ts.map +1 -0
  29. package/dist/agents/custom-provider-source.js +25 -0
  30. package/dist/agents/custom-provider-source.js.map +1 -0
  31. package/dist/agents/instructions.d.ts +6 -0
  32. package/dist/agents/instructions.d.ts.map +1 -0
  33. package/dist/agents/instructions.js +32 -0
  34. package/dist/agents/instructions.js.map +1 -0
  35. package/dist/agents/mastracode-gateway.d.ts +74 -0
  36. package/dist/agents/mastracode-gateway.d.ts.map +1 -0
  37. package/dist/agents/mastracode-gateway.js +400 -0
  38. package/dist/agents/mastracode-gateway.js.map +1 -0
  39. package/dist/agents/memory.d.ts +13 -0
  40. package/dist/agents/memory.d.ts.map +1 -0
  41. package/dist/agents/memory.js +116 -0
  42. package/dist/agents/memory.js.map +1 -0
  43. package/dist/agents/model.d.ts +59 -0
  44. package/dist/agents/model.d.ts.map +1 -0
  45. package/dist/agents/model.js +132 -0
  46. package/dist/agents/model.js.map +1 -0
  47. package/dist/agents/modes/build.d.ts +10 -0
  48. package/dist/agents/modes/build.d.ts.map +1 -0
  49. package/dist/agents/modes/build.js +44 -0
  50. package/dist/agents/modes/build.js.map +1 -0
  51. package/dist/agents/modes/explore.d.ts +10 -0
  52. package/dist/agents/modes/explore.d.ts.map +1 -0
  53. package/dist/agents/modes/explore.js +39 -0
  54. package/dist/agents/modes/explore.js.map +1 -0
  55. package/dist/agents/modes/plan.d.ts +6 -0
  56. package/dist/agents/modes/plan.d.ts.map +1 -0
  57. package/dist/agents/modes/plan.js +37 -0
  58. package/dist/agents/modes/plan.js.map +1 -0
  59. package/dist/agents/prompts/agent-instructions.d.ts +61 -0
  60. package/dist/agents/prompts/agent-instructions.d.ts.map +1 -0
  61. package/dist/agents/prompts/agent-instructions.js +201 -0
  62. package/dist/agents/prompts/agent-instructions.js.map +1 -0
  63. package/dist/agents/prompts/build.d.ts +12 -0
  64. package/dist/agents/prompts/build.d.ts.map +1 -0
  65. package/dist/agents/prompts/build.js +76 -0
  66. package/dist/agents/prompts/build.js.map +1 -0
  67. package/dist/agents/prompts/fast.d.ts +5 -0
  68. package/dist/agents/prompts/fast.d.ts.map +1 -0
  69. package/dist/agents/prompts/fast.js +26 -0
  70. package/dist/agents/prompts/fast.js.map +1 -0
  71. package/dist/agents/prompts/index.d.ts +19 -0
  72. package/dist/agents/prompts/index.d.ts.map +1 -0
  73. package/dist/agents/prompts/index.js +65 -0
  74. package/dist/agents/prompts/index.js.map +1 -0
  75. package/dist/agents/prompts/model.d.ts +5 -0
  76. package/dist/agents/prompts/model.d.ts.map +1 -0
  77. package/dist/agents/prompts/model.js +23 -0
  78. package/dist/agents/prompts/model.js.map +1 -0
  79. package/dist/agents/prompts/plan.d.ts +6 -0
  80. package/dist/agents/prompts/plan.d.ts.map +1 -0
  81. package/dist/agents/prompts/plan.js +111 -0
  82. package/dist/agents/prompts/plan.js.map +1 -0
  83. package/dist/agents/prompts/tool-guidance.d.ts +13 -0
  84. package/dist/agents/prompts/tool-guidance.d.ts.map +1 -0
  85. package/dist/agents/prompts/tool-guidance.js +149 -0
  86. package/dist/agents/prompts/tool-guidance.js.map +1 -0
  87. package/dist/agents/sandbox-filesystem.d.ts +99 -0
  88. package/dist/agents/sandbox-filesystem.d.ts.map +1 -0
  89. package/dist/agents/sandbox-filesystem.js +328 -0
  90. package/dist/agents/sandbox-filesystem.js.map +1 -0
  91. package/dist/agents/sandbox-reattach.d.ts +19 -0
  92. package/dist/agents/sandbox-reattach.d.ts.map +1 -0
  93. package/dist/agents/sandbox-reattach.js +15 -0
  94. package/dist/agents/sandbox-reattach.js.map +1 -0
  95. package/dist/agents/thread-caveman-state.d.ts +17 -0
  96. package/dist/agents/thread-caveman-state.d.ts.map +1 -0
  97. package/dist/agents/thread-caveman-state.js +107 -0
  98. package/dist/agents/thread-caveman-state.js.map +1 -0
  99. package/dist/agents/tool-availability.d.ts +10 -0
  100. package/dist/agents/tool-availability.d.ts.map +1 -0
  101. package/dist/agents/tool-availability.js +87 -0
  102. package/dist/agents/tool-availability.js.map +1 -0
  103. package/dist/agents/tools.d.ts +19 -0
  104. package/dist/agents/tools.d.ts.map +1 -0
  105. package/dist/agents/tools.js +105 -0
  106. package/dist/agents/tools.js.map +1 -0
  107. package/dist/agents/workspace.d.ts +32 -0
  108. package/dist/agents/workspace.d.ts.map +1 -0
  109. package/dist/agents/workspace.js +251 -0
  110. package/dist/agents/workspace.js.map +1 -0
  111. package/dist/analytics.d.ts +18 -0
  112. package/dist/analytics.d.ts.map +1 -0
  113. package/dist/analytics.js +163 -0
  114. package/dist/analytics.js.map +1 -0
  115. package/dist/auth/authorization-input.d.ts +16 -0
  116. package/dist/auth/authorization-input.d.ts.map +1 -0
  117. package/dist/auth/authorization-input.js +42 -0
  118. package/dist/auth/authorization-input.js.map +1 -0
  119. package/dist/auth/device-code.d.ts +93 -0
  120. package/dist/auth/device-code.d.ts.map +1 -0
  121. package/dist/auth/device-code.js +129 -0
  122. package/dist/auth/device-code.js.map +1 -0
  123. package/dist/auth/index.d.ts +10 -0
  124. package/dist/auth/index.d.ts.map +1 -0
  125. package/dist/auth/index.js +6 -0
  126. package/dist/auth/pkce.d.ts +13 -0
  127. package/dist/auth/pkce.d.ts.map +1 -0
  128. package/dist/auth/pkce.js +32 -0
  129. package/dist/auth/pkce.js.map +1 -0
  130. package/dist/auth/providers/anthropic.d.ts +40 -0
  131. package/dist/auth/providers/anthropic.d.ts.map +1 -0
  132. package/dist/auth/providers/anthropic.js +126 -0
  133. package/dist/auth/providers/anthropic.js.map +1 -0
  134. package/dist/auth/providers/github-copilot.d.ts +154 -0
  135. package/dist/auth/providers/github-copilot.d.ts.map +1 -0
  136. package/dist/auth/providers/github-copilot.js +340 -0
  137. package/dist/auth/providers/github-copilot.js.map +1 -0
  138. package/dist/auth/providers/openai-codex.d.ts +139 -0
  139. package/dist/auth/providers/openai-codex.d.ts.map +1 -0
  140. package/dist/auth/providers/openai-codex.js +519 -0
  141. package/dist/auth/providers/openai-codex.js.map +1 -0
  142. package/dist/auth/providers/xai.d.ts +64 -0
  143. package/dist/auth/providers/xai.d.ts.map +1 -0
  144. package/dist/auth/providers/xai.js +205 -0
  145. package/dist/auth/providers/xai.js.map +1 -0
  146. package/dist/auth/storage.d.ts +91 -0
  147. package/dist/auth/storage.d.ts.map +1 -0
  148. package/dist/auth/storage.js +197 -0
  149. package/dist/auth/storage.js.map +1 -0
  150. package/dist/auth/types.d.ts +89 -0
  151. package/dist/auth/types.d.ts.map +1 -0
  152. package/dist/auth/types.js +1 -0
  153. package/dist/clipboard/index.d.ts +26 -0
  154. package/dist/clipboard/index.d.ts.map +1 -0
  155. package/dist/clipboard/index.js +226 -0
  156. package/dist/clipboard/index.js.map +1 -0
  157. package/dist/constants.d.ts +10 -0
  158. package/dist/constants.d.ts.map +1 -0
  159. package/dist/constants.js +18 -0
  160. package/dist/constants.js.map +1 -0
  161. package/dist/error-classification.d.ts +10 -0
  162. package/dist/error-classification.d.ts.map +1 -0
  163. package/dist/error-classification.js +22 -0
  164. package/dist/error-classification.js.map +1 -0
  165. package/dist/evals/context-builder.d.ts +41 -0
  166. package/dist/evals/context-builder.d.ts.map +1 -0
  167. package/dist/evals/context-builder.js +161 -0
  168. package/dist/evals/context-builder.js.map +1 -0
  169. package/dist/evals/index.d.ts +4 -0
  170. package/dist/evals/index.d.ts.map +1 -0
  171. package/dist/evals/index.js +5 -0
  172. package/dist/evals/scorers/classify-command.d.ts +31 -0
  173. package/dist/evals/scorers/classify-command.d.ts.map +1 -0
  174. package/dist/evals/scorers/classify-command.js +73 -0
  175. package/dist/evals/scorers/classify-command.js.map +1 -0
  176. package/dist/evals/scorers/efficiency.d.ts +44 -0
  177. package/dist/evals/scorers/efficiency.d.ts.map +1 -0
  178. package/dist/evals/scorers/efficiency.js +259 -0
  179. package/dist/evals/scorers/efficiency.js.map +1 -0
  180. package/dist/evals/scorers/extract-tools.d.ts +25 -0
  181. package/dist/evals/scorers/extract-tools.d.ts.map +1 -0
  182. package/dist/evals/scorers/extract-tools.js +60 -0
  183. package/dist/evals/scorers/extract-tools.js.map +1 -0
  184. package/dist/evals/scorers/index.d.ts +3 -0
  185. package/dist/evals/scorers/index.d.ts.map +1 -0
  186. package/dist/evals/scorers/index.js +3 -0
  187. package/dist/evals/scorers/outcome.d.ts +49 -0
  188. package/dist/evals/scorers/outcome.d.ts.map +1 -0
  189. package/dist/evals/scorers/outcome.js +347 -0
  190. package/dist/evals/scorers/outcome.js.map +1 -0
  191. package/dist/goal-manager.d.ts +78 -0
  192. package/dist/goal-manager.d.ts.map +1 -0
  193. package/dist/goal-manager.js +273 -0
  194. package/dist/goal-manager.js.map +1 -0
  195. package/dist/goal-signal.d.ts +14 -0
  196. package/dist/goal-signal.d.ts.map +1 -0
  197. package/dist/goal-signal.js +17 -0
  198. package/dist/goal-signal.js.map +1 -0
  199. package/dist/headless/cli.d.ts +42 -0
  200. package/dist/headless/cli.d.ts.map +1 -0
  201. package/dist/headless/cli.js +195 -0
  202. package/dist/headless/cli.js.map +1 -0
  203. package/dist/headless/flags.d.ts +33 -0
  204. package/dist/headless/flags.d.ts.map +1 -0
  205. package/dist/headless/flags.js +190 -0
  206. package/dist/headless/flags.js.map +1 -0
  207. package/dist/headless/format.d.ts +38 -0
  208. package/dist/headless/format.d.ts.map +1 -0
  209. package/dist/headless/format.js +89 -0
  210. package/dist/headless/format.js.map +1 -0
  211. package/dist/headless/index.d.ts +25 -0
  212. package/dist/headless/index.d.ts.map +1 -0
  213. package/dist/headless/index.js +6 -0
  214. package/dist/headless/policy.d.ts +17 -0
  215. package/dist/headless/policy.d.ts.map +1 -0
  216. package/dist/headless/policy.js +42 -0
  217. package/dist/headless/policy.js.map +1 -0
  218. package/dist/headless/run-mc.d.ts +7 -0
  219. package/dist/headless/run-mc.d.ts.map +1 -0
  220. package/dist/headless/run-mc.js +346 -0
  221. package/dist/headless/run-mc.js.map +1 -0
  222. package/dist/headless/types.d.ts +158 -0
  223. package/dist/headless/types.d.ts.map +1 -0
  224. package/dist/headless/types.js +18 -0
  225. package/dist/headless/types.js.map +1 -0
  226. package/dist/hooks/config.d.ts +11 -0
  227. package/dist/hooks/config.d.ts.map +1 -0
  228. package/dist/hooks/config.js +73 -0
  229. package/dist/hooks/config.js.map +1 -0
  230. package/dist/hooks/executor.d.ts +13 -0
  231. package/dist/hooks/executor.d.ts.map +1 -0
  232. package/dist/hooks/executor.js +128 -0
  233. package/dist/hooks/executor.js.map +1 -0
  234. package/dist/hooks/index.d.ts +6 -0
  235. package/dist/hooks/index.d.ts.map +1 -0
  236. package/dist/hooks/index.js +5 -0
  237. package/dist/hooks/manager.d.ts +47 -0
  238. package/dist/hooks/manager.d.ts.map +1 -0
  239. package/dist/hooks/manager.js +225 -0
  240. package/dist/hooks/manager.js.map +1 -0
  241. package/dist/hooks/types.d.ts +152 -0
  242. package/dist/hooks/types.d.ts.map +1 -0
  243. package/dist/hooks/types.js +8 -0
  244. package/dist/hooks/types.js.map +1 -0
  245. package/dist/index.d.ts +258 -0
  246. package/dist/index.d.ts.map +1 -0
  247. package/dist/index.js +740 -0
  248. package/dist/index.js.map +1 -0
  249. package/dist/ipc/ipc-reporter.d.ts +14 -0
  250. package/dist/ipc/ipc-reporter.d.ts.map +1 -0
  251. package/dist/ipc/ipc-reporter.js +21 -0
  252. package/dist/ipc/ipc-reporter.js.map +1 -0
  253. package/dist/lsp/client.d.ts +56 -0
  254. package/dist/lsp/client.d.ts.map +1 -0
  255. package/dist/lsp/client.js +251 -0
  256. package/dist/lsp/client.js.map +1 -0
  257. package/dist/lsp/index.d.ts +4 -0
  258. package/dist/lsp/index.d.ts.map +1 -0
  259. package/dist/lsp/index.js +4 -0
  260. package/dist/lsp/language.d.ts +9 -0
  261. package/dist/lsp/language.d.ts.map +1 -0
  262. package/dist/lsp/language.js +44 -0
  263. package/dist/lsp/language.js.map +1 -0
  264. package/dist/lsp/manager.d.ts +34 -0
  265. package/dist/lsp/manager.d.ts.map +1 -0
  266. package/dist/lsp/manager.js +82 -0
  267. package/dist/lsp/manager.js.map +1 -0
  268. package/dist/lsp/server.d.ts +27 -0
  269. package/dist/lsp/server.d.ts.map +1 -0
  270. package/dist/lsp/server.js +159 -0
  271. package/dist/lsp/server.js.map +1 -0
  272. package/dist/lsp/workspace.d.ts +9 -0
  273. package/dist/lsp/workspace.d.ts.map +1 -0
  274. package/dist/lsp/workspace.js +55 -0
  275. package/dist/lsp/workspace.js.map +1 -0
  276. package/dist/mcp/config.d.ts +54 -0
  277. package/dist/mcp/config.d.ts.map +1 -0
  278. package/dist/mcp/config.js +240 -0
  279. package/dist/mcp/config.js.map +1 -0
  280. package/dist/mcp/index.d.ts +5 -0
  281. package/dist/mcp/index.d.ts.map +1 -0
  282. package/dist/mcp/index.js +3 -0
  283. package/dist/mcp/manager.d.ts +98 -0
  284. package/dist/mcp/manager.d.ts.map +1 -0
  285. package/dist/mcp/manager.js +612 -0
  286. package/dist/mcp/manager.js.map +1 -0
  287. package/dist/mcp/state.d.ts +33 -0
  288. package/dist/mcp/state.d.ts.map +1 -0
  289. package/dist/mcp/state.js +88 -0
  290. package/dist/mcp/state.js.map +1 -0
  291. package/dist/mcp/types.d.ts +120 -0
  292. package/dist/mcp/types.d.ts.map +1 -0
  293. package/dist/mcp/types.js +1 -0
  294. package/dist/onboarding/custom-packs.d.ts +7 -0
  295. package/dist/onboarding/custom-packs.d.ts.map +1 -0
  296. package/dist/onboarding/custom-packs.js +17 -0
  297. package/dist/onboarding/custom-packs.js.map +1 -0
  298. package/dist/onboarding/custom-providers.d.ts +4 -0
  299. package/dist/onboarding/custom-providers.d.ts.map +1 -0
  300. package/dist/onboarding/custom-providers.js +30 -0
  301. package/dist/onboarding/custom-providers.js.map +1 -0
  302. package/dist/onboarding/index.d.ts +5 -0
  303. package/dist/onboarding/index.d.ts.map +1 -0
  304. package/dist/onboarding/index.js +3 -0
  305. package/dist/onboarding/om-settings.d.ts +25 -0
  306. package/dist/onboarding/om-settings.d.ts.map +1 -0
  307. package/dist/onboarding/om-settings.js +47 -0
  308. package/dist/onboarding/om-settings.js.map +1 -0
  309. package/dist/onboarding/packs.d.ts +46 -0
  310. package/dist/onboarding/packs.d.ts.map +1 -0
  311. package/dist/onboarding/packs.js +160 -0
  312. package/dist/onboarding/packs.js.map +1 -0
  313. package/dist/onboarding/settings.d.ts +338 -0
  314. package/dist/onboarding/settings.d.ts.map +1 -0
  315. package/dist/onboarding/settings.js +673 -0
  316. package/dist/onboarding/settings.js.map +1 -0
  317. package/dist/permissions.d.ts +55 -0
  318. package/dist/permissions.d.ts.map +1 -0
  319. package/dist/permissions.js +132 -0
  320. package/dist/permissions.js.map +1 -0
  321. package/dist/plugin.d.ts +81 -0
  322. package/dist/plugin.d.ts.map +1 -0
  323. package/dist/plugin.js +28 -0
  324. package/dist/plugin.js.map +1 -0
  325. package/dist/plugins/dependencies.d.ts +9 -0
  326. package/dist/plugins/dependencies.d.ts.map +1 -0
  327. package/dist/plugins/dependencies.js +88 -0
  328. package/dist/plugins/dependencies.js.map +1 -0
  329. package/dist/plugins/install.d.ts +21 -0
  330. package/dist/plugins/install.d.ts.map +1 -0
  331. package/dist/plugins/install.js +190 -0
  332. package/dist/plugins/install.js.map +1 -0
  333. package/dist/plugins/loader.d.ts +15 -0
  334. package/dist/plugins/loader.d.ts.map +1 -0
  335. package/dist/plugins/loader.js +206 -0
  336. package/dist/plugins/loader.js.map +1 -0
  337. package/dist/plugins/manager.d.ts +64 -0
  338. package/dist/plugins/manager.d.ts.map +1 -0
  339. package/dist/plugins/manager.js +384 -0
  340. package/dist/plugins/manager.js.map +1 -0
  341. package/dist/plugins/manifest.d.ts +14 -0
  342. package/dist/plugins/manifest.d.ts.map +1 -0
  343. package/dist/plugins/manifest.js +50 -0
  344. package/dist/plugins/manifest.js.map +1 -0
  345. package/dist/plugins/package-link.d.ts +3 -0
  346. package/dist/plugins/package-link.d.ts.map +1 -0
  347. package/dist/plugins/package-link.js +61 -0
  348. package/dist/plugins/package-link.js.map +1 -0
  349. package/dist/plugins/paths.d.ts +10 -0
  350. package/dist/plugins/paths.d.ts.map +1 -0
  351. package/dist/plugins/paths.js +25 -0
  352. package/dist/plugins/paths.js.map +1 -0
  353. package/dist/plugins/registry.d.ts +8 -0
  354. package/dist/plugins/registry.d.ts.map +1 -0
  355. package/dist/plugins/registry.js +112 -0
  356. package/dist/plugins/registry.js.map +1 -0
  357. package/dist/plugins/scaffold.d.ts +10 -0
  358. package/dist/plugins/scaffold.d.ts.map +1 -0
  359. package/dist/plugins/scaffold.js +116 -0
  360. package/dist/plugins/scaffold.js.map +1 -0
  361. package/dist/plugins/types.d.ts +45 -0
  362. package/dist/plugins/types.d.ts.map +1 -0
  363. package/dist/plugins/types.js +1 -0
  364. package/dist/processors/plan-rejection-abort.d.ts +12 -0
  365. package/dist/processors/plan-rejection-abort.d.ts.map +1 -0
  366. package/dist/processors/plan-rejection-abort.js +54 -0
  367. package/dist/processors/plan-rejection-abort.js.map +1 -0
  368. package/dist/providers/amazon-bedrock-gateway.d.ts +47 -0
  369. package/dist/providers/amazon-bedrock-gateway.d.ts.map +1 -0
  370. package/dist/providers/amazon-bedrock-gateway.js +152 -0
  371. package/dist/providers/amazon-bedrock-gateway.js.map +1 -0
  372. package/dist/providers/amazon-bedrock.d.ts +28 -0
  373. package/dist/providers/amazon-bedrock.d.ts.map +1 -0
  374. package/dist/providers/amazon-bedrock.js +83 -0
  375. package/dist/providers/amazon-bedrock.js.map +1 -0
  376. package/dist/providers/claude-max.d.ts +52 -0
  377. package/dist/providers/claude-max.d.ts.map +1 -0
  378. package/dist/providers/claude-max.js +171 -0
  379. package/dist/providers/claude-max.js.map +1 -0
  380. package/dist/providers/github-copilot.d.ts +60 -0
  381. package/dist/providers/github-copilot.d.ts.map +1 -0
  382. package/dist/providers/github-copilot.js +265 -0
  383. package/dist/providers/github-copilot.js.map +1 -0
  384. package/dist/providers/openai-codex.d.ts +72 -0
  385. package/dist/providers/openai-codex.d.ts.map +1 -0
  386. package/dist/providers/openai-codex.js +302 -0
  387. package/dist/providers/openai-codex.js.map +1 -0
  388. package/dist/providers/xai.d.ts +33 -0
  389. package/dist/providers/xai.d.ts.map +1 -0
  390. package/dist/providers/xai.js +70 -0
  391. package/dist/providers/xai.js.map +1 -0
  392. package/dist/schema.d.ts +192 -0
  393. package/dist/schema.d.ts.map +1 -0
  394. package/dist/schema.js +98 -0
  395. package/dist/schema.js.map +1 -0
  396. package/dist/theme-palette.d.ts +17 -0
  397. package/dist/theme-palette.d.ts.map +1 -0
  398. package/dist/theme-palette.js +21 -0
  399. package/dist/theme-palette.js.map +1 -0
  400. package/dist/tool-names.d.ts +73 -0
  401. package/dist/tool-names.d.ts.map +1 -0
  402. package/dist/tool-names.js +52 -0
  403. package/dist/tool-names.js.map +1 -0
  404. package/dist/tools/index.d.ts +6 -0
  405. package/dist/tools/index.d.ts.map +1 -0
  406. package/dist/tools/index.js +3 -0
  407. package/dist/tools/request-sandbox-access.d.ts +6 -0
  408. package/dist/tools/request-sandbox-access.d.ts.map +1 -0
  409. package/dist/tools/request-sandbox-access.js +79 -0
  410. package/dist/tools/request-sandbox-access.js.map +1 -0
  411. package/dist/tools/utils.d.ts +20 -0
  412. package/dist/tools/utils.d.ts.map +1 -0
  413. package/dist/tools/utils.js +32 -0
  414. package/dist/tools/utils.js.map +1 -0
  415. package/dist/tools/web-search.d.ts +35 -0
  416. package/dist/tools/web-search.d.ts.map +1 -0
  417. package/dist/tools/web-search.js +61 -0
  418. package/dist/tools/web-search.js.map +1 -0
  419. package/dist/utils/binaries.d.ts +7 -0
  420. package/dist/utils/binaries.d.ts.map +1 -0
  421. package/dist/utils/binaries.js +78 -0
  422. package/dist/utils/binaries.js.map +1 -0
  423. package/dist/utils/debug-log.d.ts +12 -0
  424. package/dist/utils/debug-log.d.ts.map +1 -0
  425. package/dist/utils/debug-log.js +59 -0
  426. package/dist/utils/debug-log.js.map +1 -0
  427. package/dist/utils/errors.d.ts +36 -0
  428. package/dist/utils/errors.d.ts.map +1 -0
  429. package/dist/utils/errors.js +172 -0
  430. package/dist/utils/errors.js.map +1 -0
  431. package/dist/utils/gateway-sync.d.ts +26 -0
  432. package/dist/utils/gateway-sync.d.ts.map +1 -0
  433. package/dist/utils/gateway-sync.js +61 -0
  434. package/dist/utils/gateway-sync.js.map +1 -0
  435. package/dist/utils/path-security.d.ts +2 -0
  436. package/dist/utils/path-security.d.ts.map +1 -0
  437. package/dist/utils/path-security.js +10 -0
  438. package/dist/utils/path-security.js.map +1 -0
  439. package/dist/utils/plan-diff.d.ts +25 -0
  440. package/dist/utils/plan-diff.d.ts.map +1 -0
  441. package/dist/utils/plan-diff.js +62 -0
  442. package/dist/utils/plan-diff.js.map +1 -0
  443. package/dist/utils/plans.d.ts +56 -0
  444. package/dist/utils/plans.d.ts.map +1 -0
  445. package/dist/utils/plans.js +117 -0
  446. package/dist/utils/plans.js.map +1 -0
  447. package/dist/utils/project.d.ts +160 -0
  448. package/dist/utils/project.d.ts.map +1 -0
  449. package/dist/utils/project.js +364 -0
  450. package/dist/utils/project.js.map +1 -0
  451. package/dist/utils/signals-pubsub.d.ts +41 -0
  452. package/dist/utils/signals-pubsub.d.ts.map +1 -0
  453. package/dist/utils/signals-pubsub.js +122 -0
  454. package/dist/utils/signals-pubsub.js.map +1 -0
  455. package/dist/utils/slash-command-loader.d.ts +52 -0
  456. package/dist/utils/slash-command-loader.d.ts.map +1 -0
  457. package/dist/utils/slash-command-loader.js +141 -0
  458. package/dist/utils/slash-command-loader.js.map +1 -0
  459. package/dist/utils/slash-command-processor.d.ts +14 -0
  460. package/dist/utils/slash-command-processor.d.ts.map +1 -0
  461. package/dist/utils/slash-command-processor.js +105 -0
  462. package/dist/utils/slash-command-processor.js.map +1 -0
  463. package/dist/utils/stdin-pipe.d.ts +33 -0
  464. package/dist/utils/stdin-pipe.d.ts.map +1 -0
  465. package/dist/utils/stdin-pipe.js +96 -0
  466. package/dist/utils/stdin-pipe.js.map +1 -0
  467. package/dist/utils/storage-factory.d.ts +50 -0
  468. package/dist/utils/storage-factory.d.ts.map +1 -0
  469. package/dist/utils/storage-factory.js +121 -0
  470. package/dist/utils/storage-factory.js.map +1 -0
  471. package/dist/utils/storage-maintenance.d.ts +103 -0
  472. package/dist/utils/storage-maintenance.d.ts.map +1 -0
  473. package/dist/utils/storage-maintenance.js +274 -0
  474. package/dist/utils/storage-maintenance.js.map +1 -0
  475. package/dist/utils/thread-lock.d.ts +26 -0
  476. package/dist/utils/thread-lock.d.ts.map +1 -0
  477. package/dist/utils/thread-lock.js +112 -0
  478. package/dist/utils/thread-lock.js.map +1 -0
  479. package/dist/utils/token-estimator.d.ts +3 -0
  480. package/dist/utils/token-estimator.d.ts.map +1 -0
  481. package/dist/utils/token-estimator.js +21 -0
  482. package/dist/utils/token-estimator.js.map +1 -0
  483. package/dist/utils/update-check.d.ts +101 -0
  484. package/dist/utils/update-check.d.ts.map +1 -0
  485. package/dist/utils/update-check.js +383 -0
  486. package/dist/utils/update-check.js.map +1 -0
  487. package/dist/voice/stt-registry.d.ts +64 -0
  488. package/dist/voice/stt-registry.d.ts.map +1 -0
  489. package/dist/voice/stt-registry.js +144 -0
  490. package/dist/voice/stt-registry.js.map +1 -0
  491. package/package.json +96 -0
@@ -0,0 +1,73 @@
1
+ //#region src/evals/scorers/classify-command.ts
2
+ /**
3
+ * Shared command classification utilities for scoring.
4
+ *
5
+ * Used by both live scorers (outcome.ts) and offline scorers (outcome-match.ts)
6
+ * to consistently identify build, test, and other command types.
7
+ */
8
+ /**
9
+ * Check if a command string is a build/typecheck command.
10
+ * Handles compound commands (e.g. `pnpm build && pnpm test`) by checking each segment.
11
+ */
12
+ function isBuildCommand(command) {
13
+ return command.split(/\s*(?:&&|\|\||;)\s*/).some((seg) => {
14
+ const trimmed = seg.trim();
15
+ if (!/\b(tsc|typecheck|type-check|build)\b/.test(trimmed)) return false;
16
+ const primaryVerb = trimmed.replace(/^(?:pnpm|npm|yarn|npx|bunx?|turbo)\s+(?:run\s+)?/, "").split(/\s/)[0] ?? "";
17
+ return !/^(test|vitest|jest|mocha|pytest)$/.test(primaryVerb);
18
+ });
19
+ }
20
+ /**
21
+ * Check if a command string is a test command.
22
+ */
23
+ function isTestCommand(command) {
24
+ return /\b(test|vitest|jest|mocha|pytest|spec)\b/.test(command);
25
+ }
26
+ /**
27
+ * Extract exit code from an `execute_command` result.
28
+ * Only trusts explicit exitCode/code fields — no heuristic fallbacks.
29
+ */
30
+ function getExitCode(result) {
31
+ if (result == null) return null;
32
+ if (typeof result === "string") {
33
+ const exitMatch = result.match(/exit(?:ed)?\s+(?:with\s+)?(?:code\s+)?(\d+)/i);
34
+ if (exitMatch) return parseInt(exitMatch[1], 10);
35
+ return null;
36
+ }
37
+ if (typeof result === "object") {
38
+ const obj = result;
39
+ if ("exitCode" in obj && typeof obj.exitCode === "number") return obj.exitCode;
40
+ if ("code" in obj && typeof obj.code === "number") return obj.code;
41
+ }
42
+ return null;
43
+ }
44
+ /**
45
+ * Determine if a tool call result indicates success (exit code 0, no explicit error).
46
+ * Works with both structured result objects and string results.
47
+ */
48
+ function isSuccessResult(result, error) {
49
+ if (error) return false;
50
+ if (!result) return false;
51
+ if (typeof result === "object") {
52
+ const obj = result;
53
+ const exitCode = obj.exitCode ?? obj.code;
54
+ if (typeof exitCode === "number") return exitCode === 0;
55
+ }
56
+ if (typeof result === "string") {
57
+ const exitMatch = result.match(/exit(?:ed)?\s+(?:with\s+)?(?:code\s+)?(\d+)/i);
58
+ if (exitMatch) return exitMatch[1] === "0";
59
+ }
60
+ return false;
61
+ }
62
+ /**
63
+ * Match a file path from tool output against an expected path.
64
+ * Supports exact match and suffix match (e.g. "src/foo.ts" matches "/abs/path/src/foo.ts").
65
+ */
66
+ function matchFilePath(actual, expected) {
67
+ if (actual === expected) return true;
68
+ return actual.endsWith(`/${expected}`) || expected.endsWith(`/${actual}`);
69
+ }
70
+ //#endregion
71
+ export { getExitCode, isBuildCommand, isSuccessResult, isTestCommand, matchFilePath };
72
+
73
+ //# sourceMappingURL=classify-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify-command.js","names":[],"sources":["../../../src/evals/scorers/classify-command.ts"],"sourcesContent":["/**\n * Shared command classification utilities for scoring.\n *\n * Used by both live scorers (outcome.ts) and offline scorers (outcome-match.ts)\n * to consistently identify build, test, and other command types.\n */\n\n/**\n * Check if a command string is a build/typecheck command.\n * Handles compound commands (e.g. `pnpm build && pnpm test`) by checking each segment.\n */\nexport function isBuildCommand(command: string): boolean {\n const segments = command.split(/\\s*(?:&&|\\|\\||;)\\s*/);\n return segments.some(seg => {\n const trimmed = seg.trim();\n if (!/\\b(tsc|typecheck|type-check|build)\\b/.test(trimmed)) return false;\n // Don't reject if \"test\" only appears as a substring (e.g. \"build-test-output\").\n // Only reject if a test runner is the primary verb of this segment.\n const primaryVerb = trimmed.replace(/^(?:pnpm|npm|yarn|npx|bunx?|turbo)\\s+(?:run\\s+)?/, '').split(/\\s/)[0] ?? '';\n return !/^(test|vitest|jest|mocha|pytest)$/.test(primaryVerb);\n });\n}\n\n/**\n * Check if a command string is a test command.\n */\nexport function isTestCommand(command: string): boolean {\n return /\\b(test|vitest|jest|mocha|pytest|spec)\\b/.test(command);\n}\n\n/**\n * Extract exit code from an `execute_command` result.\n * Only trusts explicit exitCode/code fields — no heuristic fallbacks.\n */\nexport function getExitCode(result: unknown): number | null {\n if (result == null) return null;\n\n if (typeof result === 'string') {\n const exitMatch = result.match(/exit(?:ed)?\\s+(?:with\\s+)?(?:code\\s+)?(\\d+)/i);\n if (exitMatch) return parseInt(exitMatch[1]!, 10);\n return null;\n }\n\n if (typeof result === 'object') {\n const obj = result as Record<string, unknown>;\n if ('exitCode' in obj && typeof obj.exitCode === 'number') return obj.exitCode;\n if ('code' in obj && typeof obj.code === 'number') return obj.code;\n }\n\n return null;\n}\n\n/**\n * Determine if a tool call result indicates success (exit code 0, no explicit error).\n * Works with both structured result objects and string results.\n */\nexport function isSuccessResult(result: unknown, error?: unknown): boolean {\n if (error) return false;\n if (!result) return false;\n\n if (typeof result === 'object') {\n const obj = result as Record<string, unknown>;\n const exitCode = (obj.exitCode as number | undefined) ?? (obj.code as number | undefined);\n if (typeof exitCode === 'number') return exitCode === 0;\n }\n\n if (typeof result === 'string') {\n const exitMatch = result.match(/exit(?:ed)?\\s+(?:with\\s+)?(?:code\\s+)?(\\d+)/i);\n if (exitMatch) return exitMatch[1] === '0';\n }\n\n // No explicit exit code — can't determine\n return false;\n}\n\n/**\n * Match a file path from tool output against an expected path.\n * Supports exact match and suffix match (e.g. \"src/foo.ts\" matches \"/abs/path/src/foo.ts\").\n */\nexport function matchFilePath(actual: string, expected: string): boolean {\n if (actual === expected) return true;\n return actual.endsWith(`/${expected}`) || expected.endsWith(`/${actual}`);\n}\n"],"mappings":";;;;;;;;;;;AAWA,SAAgB,eAAe,SAA0B;CAEvD,OADiB,QAAQ,MAAM,qBACjB,CAAC,CAAC,MAAK,QAAO;EAC1B,MAAM,UAAU,IAAI,KAAK;EACzB,IAAI,CAAC,uCAAuC,KAAK,OAAO,GAAG,OAAO;EAGlE,MAAM,cAAc,QAAQ,QAAQ,oDAAoD,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM;EAC9G,OAAO,CAAC,oCAAoC,KAAK,WAAW;CAC9D,CAAC;AACH;;;;AAKA,SAAgB,cAAc,SAA0B;CACtD,OAAO,2CAA2C,KAAK,OAAO;AAChE;;;;;AAMA,SAAgB,YAAY,QAAgC;CAC1D,IAAI,UAAU,MAAM,OAAO;CAE3B,IAAI,OAAO,WAAW,UAAU;EAC9B,MAAM,YAAY,OAAO,MAAM,8CAA8C;EAC7E,IAAI,WAAW,OAAO,SAAS,UAAU,IAAK,EAAE;EAChD,OAAO;CACT;CAEA,IAAI,OAAO,WAAW,UAAU;EAC9B,MAAM,MAAM;EACZ,IAAI,cAAc,OAAO,OAAO,IAAI,aAAa,UAAU,OAAO,IAAI;EACtE,IAAI,UAAU,OAAO,OAAO,IAAI,SAAS,UAAU,OAAO,IAAI;CAChE;CAEA,OAAO;AACT;;;;;AAMA,SAAgB,gBAAgB,QAAiB,OAA0B;CACzE,IAAI,OAAO,OAAO;CAClB,IAAI,CAAC,QAAQ,OAAO;CAEpB,IAAI,OAAO,WAAW,UAAU;EAC9B,MAAM,MAAM;EACZ,MAAM,WAAY,IAAI,YAAoC,IAAI;EAC9D,IAAI,OAAO,aAAa,UAAU,OAAO,aAAa;CACxD;CAEA,IAAI,OAAO,WAAW,UAAU;EAC9B,MAAM,YAAY,OAAO,MAAM,8CAA8C;EAC7E,IAAI,WAAW,OAAO,UAAU,OAAO;CACzC;CAGA,OAAO;AACT;;;;;AAMA,SAAgB,cAAc,QAAgB,UAA2B;CACvE,IAAI,WAAW,UAAU,OAAO;CAChC,OAAO,OAAO,SAAS,IAAI,UAAU,KAAK,SAAS,SAAS,IAAI,QAAQ;AAC1E"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * MastraCode Efficiency Scorer (Code-based, Agent type, 30% sampling)
3
+ *
4
+ * Measures how efficiently the agent completes work through quantitative ratios.
5
+ * Unlike the Outcome Scorer (which checks *what* happened), this checks
6
+ * *how much work* it took.
7
+ *
8
+ * This scorer produces a score from 0-1 but also exposes raw metrics in the
9
+ * reason text for trend analysis. The score represents "how cleanly did the
10
+ * agent work?" — not whether it got the right answer.
11
+ *
12
+ * Sampled at 30% because it's slightly more expensive (analyzes message sequences).
13
+ */
14
+ export declare function createEfficiencyScorer(): import("@mastra/core/evals").MastraScorer<"mastracode-efficiency", import("@mastra/core/evals").ScorerRunInputForAgent, import("@mastra/core/evals").ScorerRunOutputForAgent, Record<"preprocessStepResult", {
15
+ empty: true;
16
+ totalCalls: number;
17
+ totalTurns: number;
18
+ redundancy?: undefined;
19
+ turnCount?: undefined;
20
+ retryEfficiency?: undefined;
21
+ readBeforeEdit?: undefined;
22
+ } | {
23
+ empty: false;
24
+ redundancy: {
25
+ score: number;
26
+ ratio: number;
27
+ detail: string;
28
+ };
29
+ turnCount: {
30
+ score: number;
31
+ detail: string;
32
+ };
33
+ retryEfficiency: {
34
+ score: number;
35
+ detail: string;
36
+ };
37
+ readBeforeEdit: {
38
+ score: number;
39
+ detail: string;
40
+ };
41
+ totalCalls: number;
42
+ totalTurns: number;
43
+ }> & Record<"generateScoreStepResult", number> & Record<"generateReasonStepResult", string>>;
44
+ //# sourceMappingURL=efficiency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"efficiency.d.ts","sourceRoot":"","sources":["../../../src/evals/scorers/efficiency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAsOH,wBAAgB,sBAAsB;;;;;;;;;;;eA7JyB,MAAM;eAAS,MAAM;gBAAU,MAAM;;;eAqCnD,MAAM;gBAAU,MAAM;;;eAqBH,MAAM;gBAAU,MAAM;;;eAuDvB,MAAM;gBAAU,MAAM;;;;6FA8GxF"}
@@ -0,0 +1,259 @@
1
+ import { extractToolCalls } from "./extract-tools.js";
2
+ import { createScorer, filterRun } from "@mastra/core/evals";
3
+ //#region src/evals/scorers/efficiency.ts
4
+ /**
5
+ * Dimension weights (must sum to 1.0).
6
+ *
7
+ * - redundancy: Duplicate mutation tool calls with identical args.
8
+ * - turnCount: Total assistant turns to complete the task.
9
+ * - retryEfficiency: How quickly the agent recovers from tool failures.
10
+ * - readBeforeEdit: Whether files are read before being edited.
11
+ */
12
+ const WEIGHTS = {
13
+ redundancy: .35,
14
+ turnCount: .3,
15
+ retryEfficiency: .2,
16
+ readBeforeEdit: .15
17
+ };
18
+ /**
19
+ * Scoring thresholds and multipliers.
20
+ */
21
+ const THRESHOLDS = {
22
+ /** Redundancy ratio below this is considered acceptable (no penalty). */
23
+ redundancyAcceptableRate: .05,
24
+ /** Penalty multiplier applied to redundancy ratio above the acceptable rate. */
25
+ redundancyPenaltyMultiplier: 3,
26
+ /** Turns at or below this is considered normal (score 1.0). */
27
+ turnCountNormalMax: 8,
28
+ /** Penalty per turn beyond the normal maximum (for turns 9–15). */
29
+ turnCountPenaltyPerTurn: .04,
30
+ /** Penalty per turn beyond 15. */
31
+ turnCountExtendedPenaltyPerTurn: .03,
32
+ /** Number of consecutive failures before a retry chain is "excessive". */
33
+ retryExcessiveThreshold: 3,
34
+ /** Tools considered "edit" tools that should be preceded by a read. */
35
+ editTools: ["string_replace_lsp", "ast_smart_edit"],
36
+ /** Tools that satisfy read-before-edit (only `view` truly reads a specific file). */
37
+ readTools: ["view"],
38
+ /** Tools whose repeated identical calls are intentional (idempotent reads). */
39
+ redundancyWhitelist: [
40
+ "view",
41
+ "search_content",
42
+ "find_files",
43
+ "lsp_inspect",
44
+ "web_search",
45
+ "web_extract"
46
+ ],
47
+ /** Minimum tool calls required to produce a meaningful score. */
48
+ minToolCalls: 2
49
+ };
50
+ /**
51
+ * Count assistant turns (messages with role === 'assistant').
52
+ */
53
+ function countAssistantTurns(messages) {
54
+ return messages.filter((m) => m.role === "assistant").length;
55
+ }
56
+ /**
57
+ * Calculate redundant call ratio.
58
+ * Only counts mutation/action tools as redundant — reads are whitelisted.
59
+ */
60
+ function scoreRedundancy(calls) {
61
+ if (calls.length < 2) return {
62
+ score: 1,
63
+ ratio: 0,
64
+ detail: "Too few calls"
65
+ };
66
+ const mutationCalls = calls.filter((c) => !THRESHOLDS.redundancyWhitelist.includes(c.toolName));
67
+ if (mutationCalls.length < 2) return {
68
+ score: 1,
69
+ ratio: 0,
70
+ detail: "No mutation tools to check"
71
+ };
72
+ const fingerprints = /* @__PURE__ */ new Map();
73
+ for (const call of mutationCalls) {
74
+ const fp = `${call.toolName}:${JSON.stringify(call.args)}`;
75
+ const existing = fingerprints.get(fp) ?? {
76
+ count: 0,
77
+ successCount: 0
78
+ };
79
+ existing.count++;
80
+ if (!call.isError) existing.successCount++;
81
+ fingerprints.set(fp, existing);
82
+ }
83
+ let redundantCount = 0;
84
+ for (const { successCount } of fingerprints.values()) if (successCount > 1) redundantCount += successCount - 1;
85
+ const ratio = redundantCount / mutationCalls.length;
86
+ const acceptable = THRESHOLDS.redundancyAcceptableRate;
87
+ return {
88
+ score: ratio <= acceptable ? 1 : Math.max(0, 1 - (ratio - acceptable) * THRESHOLDS.redundancyPenaltyMultiplier),
89
+ ratio,
90
+ detail: `${redundantCount}/${mutationCalls.length} redundant mutations (${(ratio * 100).toFixed(0)}%)`
91
+ };
92
+ }
93
+ /**
94
+ * Score turn count efficiency.
95
+ * Fewer turns to accomplish the task = more efficient.
96
+ */
97
+ function scoreTurnCount(turns) {
98
+ const normalMax = THRESHOLDS.turnCountNormalMax;
99
+ const penaltyPerTurn = THRESHOLDS.turnCountPenaltyPerTurn;
100
+ const extendedPenalty = THRESHOLDS.turnCountExtendedPenaltyPerTurn;
101
+ if (turns <= 1) return {
102
+ score: 1,
103
+ detail: `${turns} turn`
104
+ };
105
+ if (turns <= normalMax) return {
106
+ score: 1,
107
+ detail: `${turns} turns (within normal range)`
108
+ };
109
+ if (turns <= 15) return {
110
+ score: 1 - (turns - normalMax) * penaltyPerTurn,
111
+ detail: `${turns} turns (slightly extended)`
112
+ };
113
+ const midPenalty = (15 - normalMax) * penaltyPerTurn;
114
+ return {
115
+ score: Math.max(0, 1 - midPenalty - (turns - 15) * extendedPenalty),
116
+ detail: `${turns} turns (extended session)`
117
+ };
118
+ }
119
+ /**
120
+ * Score failed-then-succeeded ratio.
121
+ * Groups retry chains by tool name + target file path for more accurate detection.
122
+ */
123
+ function scoreRetryEfficiency(calls) {
124
+ if (calls.length < 2) return {
125
+ score: 1,
126
+ detail: "Too few calls"
127
+ };
128
+ const groupKey = (call) => {
129
+ const path = String(call.args.path ?? call.args.command ?? "");
130
+ return `${call.toolName}:${path}`;
131
+ };
132
+ const byGroup = /* @__PURE__ */ new Map();
133
+ for (const call of calls) {
134
+ const key = groupKey(call);
135
+ const arr = byGroup.get(key) ?? [];
136
+ arr.push(call);
137
+ byGroup.set(key, arr);
138
+ }
139
+ let totalRetryChains = 0;
140
+ let excessiveRetries = 0;
141
+ const threshold = THRESHOLDS.retryExcessiveThreshold;
142
+ for (const [, toolCalls] of byGroup) {
143
+ let consecutiveFailures = 0;
144
+ for (const call of toolCalls) if (call.isError) consecutiveFailures++;
145
+ else {
146
+ if (consecutiveFailures > 0) {
147
+ totalRetryChains++;
148
+ if (consecutiveFailures >= threshold) excessiveRetries++;
149
+ }
150
+ consecutiveFailures = 0;
151
+ }
152
+ if (consecutiveFailures > 0) {
153
+ totalRetryChains++;
154
+ if (consecutiveFailures >= threshold) excessiveRetries++;
155
+ }
156
+ }
157
+ if (totalRetryChains === 0) return {
158
+ score: 1,
159
+ detail: "No retry chains"
160
+ };
161
+ if (excessiveRetries === 0) return {
162
+ score: .9,
163
+ detail: `${totalRetryChains} retry chain(s), all resolved quickly`
164
+ };
165
+ return {
166
+ score: Math.max(0, .8 - excessiveRetries * .2),
167
+ detail: `${excessiveRetries} excessive retry chain(s) (${threshold}+ failures before success)`
168
+ };
169
+ }
170
+ /**
171
+ * Score read-before-edit compliance.
172
+ * Only `view` satisfies a read — search/find don't provide specific file content.
173
+ */
174
+ function scoreReadBeforeEdit(calls) {
175
+ const editTools = THRESHOLDS.editTools;
176
+ const readTools = THRESHOLDS.readTools;
177
+ if (calls.filter((c) => editTools.includes(c.toolName)).length === 0) return {
178
+ score: 1,
179
+ detail: "No edits to check"
180
+ };
181
+ const readPaths = /* @__PURE__ */ new Set();
182
+ let compliant = 0;
183
+ let total = 0;
184
+ for (const call of calls) {
185
+ const rawPath = String(call.args.path ?? "");
186
+ if (!rawPath) continue;
187
+ if (readTools.includes(call.toolName)) readPaths.add(rawPath);
188
+ else if (editTools.includes(call.toolName)) {
189
+ total++;
190
+ if (hasReadPath(readPaths, rawPath)) compliant++;
191
+ }
192
+ }
193
+ if (total === 0) return {
194
+ score: 1,
195
+ detail: "No path-targeted edits"
196
+ };
197
+ const ratio = compliant / total;
198
+ const violations = total - compliant;
199
+ if (violations === 0) return {
200
+ score: 1,
201
+ detail: `All ${total} edits had prior reads`
202
+ };
203
+ return {
204
+ score: ratio,
205
+ detail: `${violations}/${total} edits without prior read`
206
+ };
207
+ }
208
+ /** Check if any read path matches the edit path, using suffix matching for mixed abs/relative paths. */
209
+ function hasReadPath(readPaths, editPath) {
210
+ if (readPaths.has(editPath)) return true;
211
+ for (const rp of readPaths) if (rp.endsWith(`/${editPath}`) || editPath.endsWith(`/${rp}`)) return true;
212
+ return false;
213
+ }
214
+ function createEfficiencyScorer() {
215
+ return createScorer({
216
+ id: "mastracode-efficiency",
217
+ name: "MastraCode Efficiency",
218
+ description: "Measures coding session efficiency: redundancy, turn count, retry patterns, read-before-edit. 30% sampled.",
219
+ type: "agent",
220
+ prepareRun: filterRun({ partTypes: ["tool-invocation", "text"] })
221
+ }).preprocess(async ({ run }) => {
222
+ const messages = run.output ?? [];
223
+ const calls = extractToolCalls(messages);
224
+ const turns = countAssistantTurns(messages);
225
+ if (calls.length < THRESHOLDS.minToolCalls) return {
226
+ empty: true,
227
+ totalCalls: calls.length,
228
+ totalTurns: turns
229
+ };
230
+ return {
231
+ empty: false,
232
+ redundancy: scoreRedundancy(calls),
233
+ turnCount: scoreTurnCount(turns),
234
+ retryEfficiency: scoreRetryEfficiency(calls),
235
+ readBeforeEdit: scoreReadBeforeEdit(calls),
236
+ totalCalls: calls.length,
237
+ totalTurns: turns
238
+ };
239
+ }).generateScore(({ results }) => {
240
+ const p = results.preprocessStepResult;
241
+ if (p.empty) return 0;
242
+ const score = p.redundancy.score * WEIGHTS.redundancy + p.turnCount.score * WEIGHTS.turnCount + p.retryEfficiency.score * WEIGHTS.retryEfficiency + p.readBeforeEdit.score * WEIGHTS.readBeforeEdit;
243
+ return Math.round(score * 100) / 100;
244
+ }).generateReason(({ results, score }) => {
245
+ const p = results.preprocessStepResult;
246
+ if (p.empty) return `Score: 0 (${p.totalCalls} tool calls — below minimum threshold for scoring)`;
247
+ const pct = (w) => `${(w * 100).toFixed(0)}%`;
248
+ const parts = [`Score: ${score} (${p.totalCalls} calls, ${p.totalTurns} turns)`];
249
+ parts.push(`Redundancy (${pct(WEIGHTS.redundancy)}): ${p.redundancy.detail} [${p.redundancy.score}]`);
250
+ parts.push(`Turn count (${pct(WEIGHTS.turnCount)}): ${p.turnCount.detail} [${p.turnCount.score}]`);
251
+ parts.push(`Retry efficiency (${pct(WEIGHTS.retryEfficiency)}): ${p.retryEfficiency.detail} [${p.retryEfficiency.score}]`);
252
+ parts.push(`Read-before-edit (${pct(WEIGHTS.readBeforeEdit)}): ${p.readBeforeEdit.detail} [${p.readBeforeEdit.score}]`);
253
+ return parts.join("\n");
254
+ });
255
+ }
256
+ //#endregion
257
+ export { createEfficiencyScorer };
258
+
259
+ //# sourceMappingURL=efficiency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"efficiency.js","names":[],"sources":["../../../src/evals/scorers/efficiency.ts"],"sourcesContent":["/**\n * MastraCode Efficiency Scorer (Code-based, Agent type, 30% sampling)\n *\n * Measures how efficiently the agent completes work through quantitative ratios.\n * Unlike the Outcome Scorer (which checks *what* happened), this checks\n * *how much work* it took.\n *\n * This scorer produces a score from 0-1 but also exposes raw metrics in the\n * reason text for trend analysis. The score represents \"how cleanly did the\n * agent work?\" — not whether it got the right answer.\n *\n * Sampled at 30% because it's slightly more expensive (analyzes message sequences).\n */\n\nimport type { MastraDBMessage } from '@mastra/core/agent';\nimport { createScorer, filterRun } from '@mastra/core/evals';\n\nimport type { ExtractedToolCall } from './extract-tools.js';\nimport { extractToolCalls } from './extract-tools.js';\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// CONFIGURATION — Adjust weights and thresholds here\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n/**\n * Dimension weights (must sum to 1.0).\n *\n * - redundancy: Duplicate mutation tool calls with identical args.\n * - turnCount: Total assistant turns to complete the task.\n * - retryEfficiency: How quickly the agent recovers from tool failures.\n * - readBeforeEdit: Whether files are read before being edited.\n */\nconst WEIGHTS = {\n redundancy: 0.35,\n turnCount: 0.3,\n retryEfficiency: 0.2,\n readBeforeEdit: 0.15,\n} as const;\n\n/**\n * Scoring thresholds and multipliers.\n */\nconst THRESHOLDS = {\n /** Redundancy ratio below this is considered acceptable (no penalty). */\n redundancyAcceptableRate: 0.05,\n\n /** Penalty multiplier applied to redundancy ratio above the acceptable rate. */\n redundancyPenaltyMultiplier: 3,\n\n /** Turns at or below this is considered normal (score 1.0). */\n turnCountNormalMax: 8,\n\n /** Penalty per turn beyond the normal maximum (for turns 9–15). */\n turnCountPenaltyPerTurn: 0.04,\n\n /** Penalty per turn beyond 15. */\n turnCountExtendedPenaltyPerTurn: 0.03,\n\n /** Number of consecutive failures before a retry chain is \"excessive\". */\n retryExcessiveThreshold: 3,\n\n /** Tools considered \"edit\" tools that should be preceded by a read. */\n editTools: ['string_replace_lsp', 'ast_smart_edit'] as string[],\n\n /** Tools that satisfy read-before-edit (only `view` truly reads a specific file). */\n readTools: ['view'] as string[],\n\n /** Tools whose repeated identical calls are intentional (idempotent reads). */\n redundancyWhitelist: ['view', 'search_content', 'find_files', 'lsp_inspect', 'web_search', 'web_extract'] as string[],\n\n /** Minimum tool calls required to produce a meaningful score. */\n minToolCalls: 2,\n} as const;\n\n/**\n * Count assistant turns (messages with role === 'assistant').\n */\nfunction countAssistantTurns(messages: MastraDBMessage[]): number {\n return messages.filter(m => m.role === 'assistant').length;\n}\n\n/**\n * Calculate redundant call ratio.\n * Only counts mutation/action tools as redundant — reads are whitelisted.\n */\nfunction scoreRedundancy(calls: ExtractedToolCall[]): { score: number; ratio: number; detail: string } {\n if (calls.length < 2) return { score: 1, ratio: 0, detail: 'Too few calls' };\n\n // Only consider non-whitelisted (mutation) tools for redundancy\n const mutationCalls = calls.filter(c => !THRESHOLDS.redundancyWhitelist.includes(c.toolName));\n if (mutationCalls.length < 2) return { score: 1, ratio: 0, detail: 'No mutation tools to check' };\n\n const fingerprints = new Map<string, { count: number; successCount: number }>();\n for (const call of mutationCalls) {\n const fp = `${call.toolName}:${JSON.stringify(call.args)}`;\n const existing = fingerprints.get(fp) ?? { count: 0, successCount: 0 };\n existing.count++;\n if (!call.isError) existing.successCount++;\n fingerprints.set(fp, existing);\n }\n\n // Only count as redundant if the same successful call happened multiple times\n let redundantCount = 0;\n for (const { successCount } of fingerprints.values()) {\n if (successCount > 1) redundantCount += successCount - 1;\n }\n\n const ratio = redundantCount / mutationCalls.length;\n const acceptable = THRESHOLDS.redundancyAcceptableRate;\n const score =\n ratio <= acceptable ? 1 : Math.max(0, 1 - (ratio - acceptable) * THRESHOLDS.redundancyPenaltyMultiplier);\n return {\n score,\n ratio,\n detail: `${redundantCount}/${mutationCalls.length} redundant mutations (${(ratio * 100).toFixed(0)}%)`,\n };\n}\n\n/**\n * Score turn count efficiency.\n * Fewer turns to accomplish the task = more efficient.\n */\nfunction scoreTurnCount(turns: number): { score: number; detail: string } {\n const normalMax = THRESHOLDS.turnCountNormalMax;\n const penaltyPerTurn = THRESHOLDS.turnCountPenaltyPerTurn;\n const extendedPenalty = THRESHOLDS.turnCountExtendedPenaltyPerTurn;\n\n if (turns <= 1) return { score: 1, detail: `${turns} turn` };\n if (turns <= normalMax) return { score: 1, detail: `${turns} turns (within normal range)` };\n if (turns <= 15) {\n const score = 1 - (turns - normalMax) * penaltyPerTurn;\n return { score, detail: `${turns} turns (slightly extended)` };\n }\n\n const midPenalty = (15 - normalMax) * penaltyPerTurn;\n const score = Math.max(0, 1 - midPenalty - (turns - 15) * extendedPenalty);\n return { score, detail: `${turns} turns (extended session)` };\n}\n\n/**\n * Score failed-then-succeeded ratio.\n * Groups retry chains by tool name + target file path for more accurate detection.\n */\nfunction scoreRetryEfficiency(calls: ExtractedToolCall[]): { score: number; detail: string } {\n if (calls.length < 2) return { score: 1, detail: 'Too few calls' };\n\n // Group calls by tool name + target file path (if available)\n const groupKey = (call: ExtractedToolCall): string => {\n const path = String(call.args.path ?? call.args.command ?? '');\n return `${call.toolName}:${path}`;\n };\n\n const byGroup = new Map<string, ExtractedToolCall[]>();\n for (const call of calls) {\n const key = groupKey(call);\n const arr = byGroup.get(key) ?? [];\n arr.push(call);\n byGroup.set(key, arr);\n }\n\n let totalRetryChains = 0;\n let excessiveRetries = 0;\n const threshold = THRESHOLDS.retryExcessiveThreshold;\n\n for (const [, toolCalls] of byGroup) {\n let consecutiveFailures = 0;\n for (const call of toolCalls) {\n if (call.isError) {\n consecutiveFailures++;\n } else {\n if (consecutiveFailures > 0) {\n totalRetryChains++;\n if (consecutiveFailures >= threshold) excessiveRetries++;\n }\n consecutiveFailures = 0;\n }\n }\n // Count unrecovered retry chains (failures at end of group with no success)\n if (consecutiveFailures > 0) {\n totalRetryChains++;\n if (consecutiveFailures >= threshold) excessiveRetries++;\n }\n }\n\n if (totalRetryChains === 0) return { score: 1, detail: 'No retry chains' };\n if (excessiveRetries === 0) return { score: 0.9, detail: `${totalRetryChains} retry chain(s), all resolved quickly` };\n\n const score = Math.max(0, 0.8 - excessiveRetries * 0.2);\n return {\n score,\n detail: `${excessiveRetries} excessive retry chain(s) (${threshold}+ failures before success)`,\n };\n}\n\n/**\n * Score read-before-edit compliance.\n * Only `view` satisfies a read — search/find don't provide specific file content.\n */\nfunction scoreReadBeforeEdit(calls: ExtractedToolCall[]): { score: number; detail: string } {\n const editTools = THRESHOLDS.editTools;\n const readTools = THRESHOLDS.readTools;\n\n const edits = calls.filter(c => editTools.includes(c.toolName));\n if (edits.length === 0) return { score: 1, detail: 'No edits to check' };\n\n // Build set of files that were read before each edit.\n // Use suffix-normalized paths so that \"/abs/path/src/foo.ts\" and \"src/foo.ts\" match.\n const readPaths = new Set<string>();\n let compliant = 0;\n let total = 0;\n\n for (const call of calls) {\n const rawPath = String(call.args.path ?? '');\n if (!rawPath) continue;\n\n if (readTools.includes(call.toolName)) {\n readPaths.add(rawPath);\n } else if (editTools.includes(call.toolName)) {\n total++;\n if (hasReadPath(readPaths, rawPath)) {\n compliant++;\n }\n }\n }\n\n if (total === 0) return { score: 1, detail: 'No path-targeted edits' };\n\n const ratio = compliant / total;\n const violations = total - compliant;\n if (violations === 0) return { score: 1, detail: `All ${total} edits had prior reads` };\n return { score: ratio, detail: `${violations}/${total} edits without prior read` };\n}\n\n/** Check if any read path matches the edit path, using suffix matching for mixed abs/relative paths. */\nfunction hasReadPath(readPaths: Set<string>, editPath: string): boolean {\n if (readPaths.has(editPath)) return true;\n for (const rp of readPaths) {\n if (rp.endsWith(`/${editPath}`) || editPath.endsWith(`/${rp}`)) return true;\n }\n return false;\n}\n\nexport function createEfficiencyScorer() {\n return createScorer({\n id: 'mastracode-efficiency',\n name: 'MastraCode Efficiency',\n description:\n 'Measures coding session efficiency: redundancy, turn count, retry patterns, read-before-edit. 30% sampled.',\n type: 'agent',\n prepareRun: filterRun({ partTypes: ['tool-invocation', 'text'] }),\n })\n .preprocess(async ({ run }) => {\n const messages = (run.output ?? []) as MastraDBMessage[];\n const calls = extractToolCalls(messages);\n const turns = countAssistantTurns(messages);\n\n // H1: Empty sessions → score 0\n if (calls.length < THRESHOLDS.minToolCalls) {\n return { empty: true as const, totalCalls: calls.length, totalTurns: turns };\n }\n\n const redundancy = scoreRedundancy(calls);\n const turnCount = scoreTurnCount(turns);\n const retryEfficiency = scoreRetryEfficiency(calls);\n const readBeforeEdit = scoreReadBeforeEdit(calls);\n\n return {\n empty: false as const,\n redundancy,\n turnCount,\n retryEfficiency,\n readBeforeEdit,\n totalCalls: calls.length,\n totalTurns: turns,\n };\n })\n .generateScore(({ results }) => {\n const p = results.preprocessStepResult;\n if (p.empty) return 0;\n\n const score =\n p.redundancy.score * WEIGHTS.redundancy +\n p.turnCount.score * WEIGHTS.turnCount +\n p.retryEfficiency.score * WEIGHTS.retryEfficiency +\n p.readBeforeEdit.score * WEIGHTS.readBeforeEdit;\n\n return Math.round(score * 100) / 100;\n })\n .generateReason(({ results, score }) => {\n const p = results.preprocessStepResult;\n if (p.empty) {\n return `Score: 0 (${p.totalCalls} tool calls — below minimum threshold for scoring)`;\n }\n\n const pct = (w: number) => `${(w * 100).toFixed(0)}%`;\n const parts: string[] = [`Score: ${score} (${p.totalCalls} calls, ${p.totalTurns} turns)`];\n\n parts.push(`Redundancy (${pct(WEIGHTS.redundancy)}): ${p.redundancy.detail} [${p.redundancy.score}]`);\n parts.push(`Turn count (${pct(WEIGHTS.turnCount)}): ${p.turnCount.detail} [${p.turnCount.score}]`);\n parts.push(\n `Retry efficiency (${pct(WEIGHTS.retryEfficiency)}): ${p.retryEfficiency.detail} [${p.retryEfficiency.score}]`,\n );\n parts.push(\n `Read-before-edit (${pct(WEIGHTS.readBeforeEdit)}): ${p.readBeforeEdit.detail} [${p.readBeforeEdit.score}]`,\n );\n\n return parts.join('\\n');\n });\n}\n"],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Shared tool invocation extraction from MastraDBMessages.
3
+ *
4
+ * Used by both the Outcome and Efficiency scorers to extract completed
5
+ * tool calls from message content, handling both the `parts` array (primary)
6
+ * and the legacy `toolInvocations` array.
7
+ */
8
+ import type { MastraDBMessage } from '@mastra/core/agent';
9
+ export type ExtractedToolCall = {
10
+ toolCallId?: string;
11
+ toolName: string;
12
+ args: Record<string, unknown>;
13
+ result: unknown;
14
+ isError: boolean;
15
+ index: number;
16
+ };
17
+ /**
18
+ * Extract completed tool invocations from MastraDBMessages.
19
+ *
20
+ * Handles both:
21
+ * - `content.parts` (primary format, MastraToolInvocationPart)
22
+ * - `content.toolInvocations` (legacy format, AI SDK ToolInvocation[])
23
+ */
24
+ export declare function extractToolCalls(messages: MastraDBMessage[]): ExtractedToolCall[];
25
+ //# sourceMappingURL=extract-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-tools.d.ts","sourceRoot":"","sources":["../../../src/evals/scorers/extract-tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAmBF;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,iBAAiB,EAAE,CAoDjF"}
@@ -0,0 +1,60 @@
1
+ //#region src/evals/scorers/extract-tools.ts
2
+ function isToolInvocationPart(part) {
3
+ return "type" in part && part.type === "tool-invocation" && "toolInvocation" in part;
4
+ }
5
+ function isCompleted(inv) {
6
+ return inv.state === "result" || inv.state === "error" || inv.state === "output-error" || inv.state === "output-denied";
7
+ }
8
+ function isErrorState(inv) {
9
+ return inv.state === "error" || inv.state === "output-error" || inv.state === "output-denied";
10
+ }
11
+ /**
12
+ * Extract completed tool invocations from MastraDBMessages.
13
+ *
14
+ * Handles both:
15
+ * - `content.parts` (primary format, MastraToolInvocationPart)
16
+ * - `content.toolInvocations` (legacy format, AI SDK ToolInvocation[])
17
+ */
18
+ function extractToolCalls(messages) {
19
+ const results = [];
20
+ const seenToolCallIds = /* @__PURE__ */ new Set();
21
+ let index = 0;
22
+ for (const msg of messages) {
23
+ if (!msg.content) continue;
24
+ for (const part of msg.content.parts ?? []) if (isToolInvocationPart(part)) {
25
+ const inv = part.toolInvocation;
26
+ if (isCompleted(inv)) {
27
+ const toolCallId = "toolCallId" in inv ? inv.toolCallId : void 0;
28
+ if (toolCallId) seenToolCallIds.add(toolCallId);
29
+ results.push({
30
+ toolCallId,
31
+ toolName: inv.toolName ?? "",
32
+ args: inv.args ?? {},
33
+ result: inv.result,
34
+ isError: isErrorState(inv),
35
+ index: index++
36
+ });
37
+ }
38
+ }
39
+ if (msg.content.toolInvocations) {
40
+ for (const inv of msg.content.toolInvocations) if (inv.state === "result") {
41
+ const toolCallId = "toolCallId" in inv ? inv.toolCallId : void 0;
42
+ if (toolCallId && seenToolCallIds.has(toolCallId)) continue;
43
+ if (toolCallId) seenToolCallIds.add(toolCallId);
44
+ results.push({
45
+ toolCallId,
46
+ toolName: inv.toolName ?? "",
47
+ args: inv.args ?? {},
48
+ result: inv.result,
49
+ isError: false,
50
+ index: index++
51
+ });
52
+ }
53
+ }
54
+ }
55
+ return results;
56
+ }
57
+ //#endregion
58
+ export { extractToolCalls };
59
+
60
+ //# sourceMappingURL=extract-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-tools.js","names":[],"sources":["../../../src/evals/scorers/extract-tools.ts"],"sourcesContent":["/**\n * Shared tool invocation extraction from MastraDBMessages.\n *\n * Used by both the Outcome and Efficiency scorers to extract completed\n * tool calls from message content, handling both the `parts` array (primary)\n * and the legacy `toolInvocations` array.\n */\n\nimport type { MastraDBMessage } from '@mastra/core/agent';\nimport type { MastraMessagePart, MastraToolInvocation } from '@mastra/core/agent/message-list';\n\nexport type ExtractedToolCall = {\n toolCallId?: string;\n toolName: string;\n args: Record<string, unknown>;\n result: unknown;\n isError: boolean;\n index: number;\n};\n\nfunction isToolInvocationPart(part: MastraMessagePart): part is MastraMessagePart & {\n type: 'tool-invocation';\n toolInvocation: MastraToolInvocation;\n} {\n return 'type' in part && part.type === 'tool-invocation' && 'toolInvocation' in part;\n}\n\nfunction isCompleted(inv: { state: string }): boolean {\n return (\n inv.state === 'result' || inv.state === 'error' || inv.state === 'output-error' || inv.state === 'output-denied'\n );\n}\n\nfunction isErrorState(inv: { state: string }): boolean {\n return inv.state === 'error' || inv.state === 'output-error' || inv.state === 'output-denied';\n}\n\n/**\n * Extract completed tool invocations from MastraDBMessages.\n *\n * Handles both:\n * - `content.parts` (primary format, MastraToolInvocationPart)\n * - `content.toolInvocations` (legacy format, AI SDK ToolInvocation[])\n */\nexport function extractToolCalls(messages: MastraDBMessage[]): ExtractedToolCall[] {\n const results: ExtractedToolCall[] = [];\n const seenToolCallIds = new Set<string>();\n let index = 0;\n\n for (const msg of messages) {\n if (!msg.content) continue;\n\n // Primary format: parts array with tool-invocation parts\n for (const part of msg.content.parts ?? []) {\n if (isToolInvocationPart(part)) {\n const inv = part.toolInvocation;\n if (isCompleted(inv)) {\n const toolCallId = 'toolCallId' in inv ? (inv.toolCallId as string) : undefined;\n if (toolCallId) seenToolCallIds.add(toolCallId);\n\n results.push({\n toolCallId,\n toolName: inv.toolName ?? '',\n args: (inv.args ?? {}) as Record<string, unknown>,\n result: inv.result,\n isError: isErrorState(inv),\n index: index++,\n });\n }\n }\n }\n\n // Legacy format: toolInvocations array (AI SDK ToolInvocation)\n // Only states here are 'partial-call' | 'call' | 'result' — no error state.\n if (msg.content.toolInvocations) {\n for (const inv of msg.content.toolInvocations) {\n if (inv.state === 'result') {\n // Skip if we already extracted this from parts (deduplicate by toolCallId)\n const toolCallId = 'toolCallId' in inv ? inv.toolCallId : undefined;\n if (toolCallId && seenToolCallIds.has(toolCallId)) continue;\n if (toolCallId) seenToolCallIds.add(toolCallId);\n\n results.push({\n toolCallId,\n toolName: inv.toolName ?? '',\n args: (inv.args ?? {}) as Record<string, unknown>,\n result: inv.result,\n isError: false,\n index: index++,\n });\n }\n }\n }\n }\n\n return results;\n}\n"],"mappings":";AAoBA,SAAS,qBAAqB,MAG5B;CACA,OAAO,UAAU,QAAQ,KAAK,SAAS,qBAAqB,oBAAoB;AAClF;AAEA,SAAS,YAAY,KAAiC;CACpD,OACE,IAAI,UAAU,YAAY,IAAI,UAAU,WAAW,IAAI,UAAU,kBAAkB,IAAI,UAAU;AAErG;AAEA,SAAS,aAAa,KAAiC;CACrD,OAAO,IAAI,UAAU,WAAW,IAAI,UAAU,kBAAkB,IAAI,UAAU;AAChF;;;;;;;;AASA,SAAgB,iBAAiB,UAAkD;CACjF,MAAM,UAA+B,CAAC;CACtC,MAAM,kCAAkB,IAAI,IAAY;CACxC,IAAI,QAAQ;CAEZ,KAAK,MAAM,OAAO,UAAU;EAC1B,IAAI,CAAC,IAAI,SAAS;EAGlB,KAAK,MAAM,QAAQ,IAAI,QAAQ,SAAS,CAAC,GACvC,IAAI,qBAAqB,IAAI,GAAG;GAC9B,MAAM,MAAM,KAAK;GACjB,IAAI,YAAY,GAAG,GAAG;IACpB,MAAM,aAAa,gBAAgB,MAAO,IAAI,aAAwB,KAAA;IACtE,IAAI,YAAY,gBAAgB,IAAI,UAAU;IAE9C,QAAQ,KAAK;KACX;KACA,UAAU,IAAI,YAAY;KAC1B,MAAO,IAAI,QAAQ,CAAC;KACpB,QAAQ,IAAI;KACZ,SAAS,aAAa,GAAG;KACzB,OAAO;IACT,CAAC;GACH;EACF;EAKF,IAAI,IAAI,QAAQ,iBACT;QAAA,MAAM,OAAO,IAAI,QAAQ,iBAC5B,IAAI,IAAI,UAAU,UAAU;IAE1B,MAAM,aAAa,gBAAgB,MAAM,IAAI,aAAa,KAAA;IAC1D,IAAI,cAAc,gBAAgB,IAAI,UAAU,GAAG;IACnD,IAAI,YAAY,gBAAgB,IAAI,UAAU;IAE9C,QAAQ,KAAK;KACX;KACA,UAAU,IAAI,YAAY;KAC1B,MAAO,IAAI,QAAQ,CAAC;KACpB,QAAQ,IAAI;KACZ,SAAS;KACT,OAAO;IACT,CAAC;GACH;;CAGN;CAEA,OAAO;AACT"}
@@ -0,0 +1,3 @@
1
+ export { createOutcomeScorer } from './outcome.js';
2
+ export { createEfficiencyScorer } from './efficiency.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/evals/scorers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { createOutcomeScorer } from "./outcome.js";
2
+ import { createEfficiencyScorer } from "./efficiency.js";
3
+ export { createEfficiencyScorer, createOutcomeScorer };
@@ -0,0 +1,49 @@
1
+ /**
2
+ * MastraCode Outcome Scorer (Code-based, Agent type, always-on)
3
+ *
4
+ * Grades the objective outcome of a coding session by checking hard facts:
5
+ * - Did the build/typecheck pass?
6
+ * - Did tests pass?
7
+ * - What was the tool error rate?
8
+ * - Did the agent get stuck in a loop?
9
+ * - Was there a regression (build passed earlier, failed later)?
10
+ * - Did the agent use ask_user unnecessarily? (autonomy)
11
+ *
12
+ * This scorer is always-on (no sampling) because it's cheap — it only
13
+ * reads exit codes and error states from tool results already in the messages.
14
+ *
15
+ * Scoring philosophy (from Anthropic's eval guidance):
16
+ * "Grade outcomes, not paths" — we check what happened, not how.
17
+ * Partial credit: a session that passes build but fails tests scores
18
+ * higher than one that fails build entirely.
19
+ *
20
+ * Dimensions that don't apply to a session (e.g. build for a docs-only task)
21
+ * are excluded from the weighted average, so sessions aren't penalized for
22
+ * irrelevant criteria.
23
+ */
24
+ type DimensionResult = {
25
+ score: number;
26
+ detail: string;
27
+ applicable: boolean;
28
+ };
29
+ export declare function createOutcomeScorer(): import("@mastra/core/evals").MastraScorer<"mastracode-outcome", import("@mastra/core/evals").ScorerRunInputForAgent, import("@mastra/core/evals").ScorerRunOutputForAgent, Record<"preprocessStepResult", {
30
+ empty: true;
31
+ build: DimensionResult;
32
+ tests: DimensionResult;
33
+ toolErrors: DimensionResult;
34
+ loops: DimensionResult;
35
+ regression: DimensionResult;
36
+ autonomy: DimensionResult;
37
+ totalCalls: number;
38
+ } | {
39
+ empty: false;
40
+ build: DimensionResult;
41
+ tests: DimensionResult;
42
+ toolErrors: DimensionResult;
43
+ loops: DimensionResult;
44
+ regression: DimensionResult;
45
+ autonomy: DimensionResult;
46
+ totalCalls: number;
47
+ }> & Record<"generateScoreStepResult", number> & Record<"generateReasonStepResult", string>>;
48
+ export {};
49
+ //# sourceMappingURL=outcome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outcome.d.ts","sourceRoot":"","sources":["../../../src/evals/scorers/outcome.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAsDH,KAAK,eAAe,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC;AAuN9E,wBAAgB,mBAAmB;;;;;;;;;;;;;;;;;;6FAkFlC"}