@mastra/code-sdk 0.0.0-fix-workflow-step-timing-and-parallel-status-20260715180716

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 (468) hide show
  1. package/CHANGELOG.md +285 -0
  2. package/LICENSE.md +30 -0
  3. package/README.md +50 -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 +173 -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 +166 -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 +54 -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 +34 -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 +5 -0
  23. package/dist/acp.js.map +1 -0
  24. package/dist/agents/instructions.d.ts +6 -0
  25. package/dist/agents/instructions.d.ts.map +1 -0
  26. package/dist/agents/instructions.js +41 -0
  27. package/dist/agents/instructions.js.map +1 -0
  28. package/dist/agents/mastracode-gateway.d.ts +67 -0
  29. package/dist/agents/mastracode-gateway.d.ts.map +1 -0
  30. package/dist/agents/mastracode-gateway.js +446 -0
  31. package/dist/agents/mastracode-gateway.js.map +1 -0
  32. package/dist/agents/memory.d.ts +13 -0
  33. package/dist/agents/memory.d.ts.map +1 -0
  34. package/dist/agents/memory.js +107 -0
  35. package/dist/agents/memory.js.map +1 -0
  36. package/dist/agents/model.d.ts +55 -0
  37. package/dist/agents/model.d.ts.map +1 -0
  38. package/dist/agents/model.js +115 -0
  39. package/dist/agents/model.js.map +1 -0
  40. package/dist/agents/modes/build.d.ts +10 -0
  41. package/dist/agents/modes/build.d.ts.map +1 -0
  42. package/dist/agents/modes/build.js +45 -0
  43. package/dist/agents/modes/build.js.map +1 -0
  44. package/dist/agents/modes/explore.d.ts +10 -0
  45. package/dist/agents/modes/explore.d.ts.map +1 -0
  46. package/dist/agents/modes/explore.js +38 -0
  47. package/dist/agents/modes/explore.js.map +1 -0
  48. package/dist/agents/modes/plan.d.ts +6 -0
  49. package/dist/agents/modes/plan.d.ts.map +1 -0
  50. package/dist/agents/modes/plan.js +38 -0
  51. package/dist/agents/modes/plan.js.map +1 -0
  52. package/dist/agents/prompts/agent-instructions.d.ts +20 -0
  53. package/dist/agents/prompts/agent-instructions.d.ts.map +1 -0
  54. package/dist/agents/prompts/agent-instructions.js +82 -0
  55. package/dist/agents/prompts/agent-instructions.js.map +1 -0
  56. package/dist/agents/prompts/build.d.ts +12 -0
  57. package/dist/agents/prompts/build.d.ts.map +1 -0
  58. package/dist/agents/prompts/build.js +73 -0
  59. package/dist/agents/prompts/build.js.map +1 -0
  60. package/dist/agents/prompts/fast.d.ts +5 -0
  61. package/dist/agents/prompts/fast.d.ts.map +1 -0
  62. package/dist/agents/prompts/fast.js +22 -0
  63. package/dist/agents/prompts/fast.js.map +1 -0
  64. package/dist/agents/prompts/index.d.ts +19 -0
  65. package/dist/agents/prompts/index.d.ts.map +1 -0
  66. package/dist/agents/prompts/index.js +57 -0
  67. package/dist/agents/prompts/index.js.map +1 -0
  68. package/dist/agents/prompts/model.d.ts +5 -0
  69. package/dist/agents/prompts/model.d.ts.map +1 -0
  70. package/dist/agents/prompts/model.js +22 -0
  71. package/dist/agents/prompts/model.js.map +1 -0
  72. package/dist/agents/prompts/plan.d.ts +6 -0
  73. package/dist/agents/prompts/plan.d.ts.map +1 -0
  74. package/dist/agents/prompts/plan.js +107 -0
  75. package/dist/agents/prompts/plan.js.map +1 -0
  76. package/dist/agents/prompts/tool-guidance.d.ts +13 -0
  77. package/dist/agents/prompts/tool-guidance.d.ts.map +1 -0
  78. package/dist/agents/prompts/tool-guidance.js +181 -0
  79. package/dist/agents/prompts/tool-guidance.js.map +1 -0
  80. package/dist/agents/sandbox-filesystem.d.ts +89 -0
  81. package/dist/agents/sandbox-filesystem.d.ts.map +1 -0
  82. package/dist/agents/sandbox-filesystem.js +268 -0
  83. package/dist/agents/sandbox-filesystem.js.map +1 -0
  84. package/dist/agents/sandbox-reattach.d.ts +19 -0
  85. package/dist/agents/sandbox-reattach.d.ts.map +1 -0
  86. package/dist/agents/sandbox-reattach.js +17 -0
  87. package/dist/agents/sandbox-reattach.js.map +1 -0
  88. package/dist/agents/thread-caveman-state.d.ts +17 -0
  89. package/dist/agents/thread-caveman-state.d.ts.map +1 -0
  90. package/dist/agents/thread-caveman-state.js +96 -0
  91. package/dist/agents/thread-caveman-state.js.map +1 -0
  92. package/dist/agents/tool-availability.d.ts +10 -0
  93. package/dist/agents/tool-availability.d.ts.map +1 -0
  94. package/dist/agents/tool-availability.js +105 -0
  95. package/dist/agents/tool-availability.js.map +1 -0
  96. package/dist/agents/tools.d.ts +19 -0
  97. package/dist/agents/tools.d.ts.map +1 -0
  98. package/dist/agents/tools.js +145 -0
  99. package/dist/agents/tools.js.map +1 -0
  100. package/dist/agents/workspace.d.ts +22 -0
  101. package/dist/agents/workspace.d.ts.map +1 -0
  102. package/dist/agents/workspace.js +226 -0
  103. package/dist/agents/workspace.js.map +1 -0
  104. package/dist/analytics.d.ts +18 -0
  105. package/dist/analytics.d.ts.map +1 -0
  106. package/dist/analytics.js +152 -0
  107. package/dist/analytics.js.map +1 -0
  108. package/dist/auth/index.d.ts +9 -0
  109. package/dist/auth/index.d.ts.map +1 -0
  110. package/dist/auth/index.js +11 -0
  111. package/dist/auth/index.js.map +1 -0
  112. package/dist/auth/pkce.d.ts +13 -0
  113. package/dist/auth/pkce.d.ts.map +1 -0
  114. package/dist/auth/pkce.js +21 -0
  115. package/dist/auth/pkce.js.map +1 -0
  116. package/dist/auth/providers/anthropic.d.ts +17 -0
  117. package/dist/auth/providers/anthropic.d.ts.map +1 -0
  118. package/dist/auth/providers/anthropic.js +94 -0
  119. package/dist/auth/providers/anthropic.js.map +1 -0
  120. package/dist/auth/providers/github-copilot.d.ts +100 -0
  121. package/dist/auth/providers/github-copilot.d.ts.map +1 -0
  122. package/dist/auth/providers/github-copilot.js +302 -0
  123. package/dist/auth/providers/github-copilot.js.map +1 -0
  124. package/dist/auth/providers/openai-codex.d.ts +95 -0
  125. package/dist/auth/providers/openai-codex.d.ts.map +1 -0
  126. package/dist/auth/providers/openai-codex.js +527 -0
  127. package/dist/auth/providers/openai-codex.js.map +1 -0
  128. package/dist/auth/storage.d.ts +91 -0
  129. package/dist/auth/storage.d.ts.map +1 -0
  130. package/dist/auth/storage.js +187 -0
  131. package/dist/auth/storage.js.map +1 -0
  132. package/dist/auth/types.d.ts +68 -0
  133. package/dist/auth/types.d.ts.map +1 -0
  134. package/dist/auth/types.js +1 -0
  135. package/dist/auth/types.js.map +1 -0
  136. package/dist/clipboard/index.d.ts +26 -0
  137. package/dist/clipboard/index.d.ts.map +1 -0
  138. package/dist/clipboard/index.js +192 -0
  139. package/dist/clipboard/index.js.map +1 -0
  140. package/dist/constants.d.ts +10 -0
  141. package/dist/constants.d.ts.map +1 -0
  142. package/dist/constants.js +23 -0
  143. package/dist/constants.js.map +1 -0
  144. package/dist/error-classification.d.ts +10 -0
  145. package/dist/error-classification.d.ts.map +1 -0
  146. package/dist/error-classification.js +14 -0
  147. package/dist/error-classification.js.map +1 -0
  148. package/dist/evals/context-builder.d.ts +41 -0
  149. package/dist/evals/context-builder.d.ts.map +1 -0
  150. package/dist/evals/context-builder.js +120 -0
  151. package/dist/evals/context-builder.js.map +1 -0
  152. package/dist/evals/index.d.ts +4 -0
  153. package/dist/evals/index.d.ts.map +1 -0
  154. package/dist/evals/index.js +8 -0
  155. package/dist/evals/index.js.map +1 -0
  156. package/dist/evals/scorers/classify-command.d.ts +31 -0
  157. package/dist/evals/scorers/classify-command.d.ts.map +1 -0
  158. package/dist/evals/scorers/classify-command.js +52 -0
  159. package/dist/evals/scorers/classify-command.js.map +1 -0
  160. package/dist/evals/scorers/efficiency.d.ts +44 -0
  161. package/dist/evals/scorers/efficiency.d.ts.map +1 -0
  162. package/dist/evals/scorers/efficiency.js +201 -0
  163. package/dist/evals/scorers/efficiency.js.map +1 -0
  164. package/dist/evals/scorers/extract-tools.d.ts +25 -0
  165. package/dist/evals/scorers/extract-tools.d.ts.map +1 -0
  166. package/dist/evals/scorers/extract-tools.js +56 -0
  167. package/dist/evals/scorers/extract-tools.js.map +1 -0
  168. package/dist/evals/scorers/index.d.ts +3 -0
  169. package/dist/evals/scorers/index.d.ts.map +1 -0
  170. package/dist/evals/scorers/index.js +7 -0
  171. package/dist/evals/scorers/index.js.map +1 -0
  172. package/dist/evals/scorers/outcome.d.ts +49 -0
  173. package/dist/evals/scorers/outcome.d.ts.map +1 -0
  174. package/dist/evals/scorers/outcome.js +238 -0
  175. package/dist/evals/scorers/outcome.js.map +1 -0
  176. package/dist/headless/cli.d.ts +42 -0
  177. package/dist/headless/cli.d.ts.map +1 -0
  178. package/dist/headless/cli.js +196 -0
  179. package/dist/headless/cli.js.map +1 -0
  180. package/dist/headless/flags.d.ts +33 -0
  181. package/dist/headless/flags.d.ts.map +1 -0
  182. package/dist/headless/flags.js +188 -0
  183. package/dist/headless/flags.js.map +1 -0
  184. package/dist/headless/format.d.ts +38 -0
  185. package/dist/headless/format.d.ts.map +1 -0
  186. package/dist/headless/format.js +85 -0
  187. package/dist/headless/format.js.map +1 -0
  188. package/dist/headless/index.d.ts +25 -0
  189. package/dist/headless/index.d.ts.map +1 -0
  190. package/dist/headless/index.js +32 -0
  191. package/dist/headless/index.js.map +1 -0
  192. package/dist/headless/policy.d.ts +17 -0
  193. package/dist/headless/policy.d.ts.map +1 -0
  194. package/dist/headless/policy.js +38 -0
  195. package/dist/headless/policy.js.map +1 -0
  196. package/dist/headless/run-mc.d.ts +7 -0
  197. package/dist/headless/run-mc.d.ts.map +1 -0
  198. package/dist/headless/run-mc.js +296 -0
  199. package/dist/headless/run-mc.js.map +1 -0
  200. package/dist/headless/types.d.ts +134 -0
  201. package/dist/headless/types.d.ts.map +1 -0
  202. package/dist/headless/types.js +9 -0
  203. package/dist/headless/types.js.map +1 -0
  204. package/dist/hooks/config.d.ts +11 -0
  205. package/dist/hooks/config.d.ts.map +1 -0
  206. package/dist/hooks/config.js +78 -0
  207. package/dist/hooks/config.js.map +1 -0
  208. package/dist/hooks/executor.d.ts +13 -0
  209. package/dist/hooks/executor.d.ts.map +1 -0
  210. package/dist/hooks/executor.js +125 -0
  211. package/dist/hooks/executor.js.map +1 -0
  212. package/dist/hooks/index.d.ts +6 -0
  213. package/dist/hooks/index.d.ts.map +1 -0
  214. package/dist/hooks/index.js +16 -0
  215. package/dist/hooks/index.js.map +1 -0
  216. package/dist/hooks/manager.d.ts +47 -0
  217. package/dist/hooks/manager.d.ts.map +1 -0
  218. package/dist/hooks/manager.js +284 -0
  219. package/dist/hooks/manager.js.map +1 -0
  220. package/dist/hooks/types.d.ts +152 -0
  221. package/dist/hooks/types.d.ts.map +1 -0
  222. package/dist/hooks/types.js +7 -0
  223. package/dist/hooks/types.js.map +1 -0
  224. package/dist/index.d.ts +243 -0
  225. package/dist/index.d.ts.map +1 -0
  226. package/dist/index.js +730 -0
  227. package/dist/index.js.map +1 -0
  228. package/dist/ipc/ipc-reporter.d.ts +14 -0
  229. package/dist/ipc/ipc-reporter.d.ts.map +1 -0
  230. package/dist/ipc/ipc-reporter.js +24 -0
  231. package/dist/ipc/ipc-reporter.js.map +1 -0
  232. package/dist/lsp/client.d.ts +56 -0
  233. package/dist/lsp/client.d.ts.map +1 -0
  234. package/dist/lsp/client.js +309 -0
  235. package/dist/lsp/client.js.map +1 -0
  236. package/dist/lsp/index.d.ts +4 -0
  237. package/dist/lsp/index.d.ts.map +1 -0
  238. package/dist/lsp/index.js +9 -0
  239. package/dist/lsp/index.js.map +1 -0
  240. package/dist/lsp/language.d.ts +9 -0
  241. package/dist/lsp/language.d.ts.map +1 -0
  242. package/dist/lsp/language.js +48 -0
  243. package/dist/lsp/language.js.map +1 -0
  244. package/dist/lsp/manager.d.ts +34 -0
  245. package/dist/lsp/manager.d.ts.map +1 -0
  246. package/dist/lsp/manager.js +97 -0
  247. package/dist/lsp/manager.js.map +1 -0
  248. package/dist/lsp/server.d.ts +27 -0
  249. package/dist/lsp/server.d.ts.map +1 -0
  250. package/dist/lsp/server.js +128 -0
  251. package/dist/lsp/server.js.map +1 -0
  252. package/dist/lsp/workspace.d.ts +9 -0
  253. package/dist/lsp/workspace.d.ts.map +1 -0
  254. package/dist/lsp/workspace.js +52 -0
  255. package/dist/lsp/workspace.js.map +1 -0
  256. package/dist/mcp/config.d.ts +34 -0
  257. package/dist/mcp/config.d.ts.map +1 -0
  258. package/dist/mcp/config.js +205 -0
  259. package/dist/mcp/config.js.map +1 -0
  260. package/dist/mcp/index.d.ts +5 -0
  261. package/dist/mcp/index.d.ts.map +1 -0
  262. package/dist/mcp/index.js +10 -0
  263. package/dist/mcp/index.js.map +1 -0
  264. package/dist/mcp/manager.d.ts +49 -0
  265. package/dist/mcp/manager.d.ts.map +1 -0
  266. package/dist/mcp/manager.js +374 -0
  267. package/dist/mcp/manager.js.map +1 -0
  268. package/dist/mcp/types.d.ts +85 -0
  269. package/dist/mcp/types.d.ts.map +1 -0
  270. package/dist/mcp/types.js +1 -0
  271. package/dist/mcp/types.js.map +1 -0
  272. package/dist/onboarding/custom-packs.d.ts +7 -0
  273. package/dist/onboarding/custom-packs.d.ts.map +1 -0
  274. package/dist/onboarding/custom-packs.js +20 -0
  275. package/dist/onboarding/custom-packs.js.map +1 -0
  276. package/dist/onboarding/custom-providers.d.ts +4 -0
  277. package/dist/onboarding/custom-providers.d.ts.map +1 -0
  278. package/dist/onboarding/custom-providers.js +28 -0
  279. package/dist/onboarding/custom-providers.js.map +1 -0
  280. package/dist/onboarding/index.d.ts +5 -0
  281. package/dist/onboarding/index.d.ts.map +1 -0
  282. package/dist/onboarding/index.js +21 -0
  283. package/dist/onboarding/index.js.map +1 -0
  284. package/dist/onboarding/om-settings.d.ts +20 -0
  285. package/dist/onboarding/om-settings.d.ts.map +1 -0
  286. package/dist/onboarding/om-settings.js +26 -0
  287. package/dist/onboarding/om-settings.js.map +1 -0
  288. package/dist/onboarding/packs.d.ts +48 -0
  289. package/dist/onboarding/packs.d.ts.map +1 -0
  290. package/dist/onboarding/packs.js +111 -0
  291. package/dist/onboarding/packs.js.map +1 -0
  292. package/dist/onboarding/settings.d.ts +327 -0
  293. package/dist/onboarding/settings.d.ts.map +1 -0
  294. package/dist/onboarding/settings.js +598 -0
  295. package/dist/onboarding/settings.js.map +1 -0
  296. package/dist/permissions.d.ts +55 -0
  297. package/dist/permissions.d.ts.map +1 -0
  298. package/dist/permissions.js +119 -0
  299. package/dist/permissions.js.map +1 -0
  300. package/dist/plugin.d.ts +81 -0
  301. package/dist/plugin.d.ts.map +1 -0
  302. package/dist/plugin.js +30 -0
  303. package/dist/plugin.js.map +1 -0
  304. package/dist/plugins/dependencies.d.ts +9 -0
  305. package/dist/plugins/dependencies.d.ts.map +1 -0
  306. package/dist/plugins/dependencies.js +111 -0
  307. package/dist/plugins/dependencies.js.map +1 -0
  308. package/dist/plugins/install.d.ts +21 -0
  309. package/dist/plugins/install.d.ts.map +1 -0
  310. package/dist/plugins/install.js +200 -0
  311. package/dist/plugins/install.js.map +1 -0
  312. package/dist/plugins/loader.d.ts +15 -0
  313. package/dist/plugins/loader.d.ts.map +1 -0
  314. package/dist/plugins/loader.js +221 -0
  315. package/dist/plugins/loader.js.map +1 -0
  316. package/dist/plugins/manager.d.ts +60 -0
  317. package/dist/plugins/manager.d.ts.map +1 -0
  318. package/dist/plugins/manager.js +378 -0
  319. package/dist/plugins/manager.js.map +1 -0
  320. package/dist/plugins/manifest.d.ts +14 -0
  321. package/dist/plugins/manifest.d.ts.map +1 -0
  322. package/dist/plugins/manifest.js +75 -0
  323. package/dist/plugins/manifest.js.map +1 -0
  324. package/dist/plugins/package-link.d.ts +3 -0
  325. package/dist/plugins/package-link.d.ts.map +1 -0
  326. package/dist/plugins/package-link.js +77 -0
  327. package/dist/plugins/package-link.js.map +1 -0
  328. package/dist/plugins/paths.d.ts +10 -0
  329. package/dist/plugins/paths.d.ts.map +1 -0
  330. package/dist/plugins/paths.js +26 -0
  331. package/dist/plugins/paths.js.map +1 -0
  332. package/dist/plugins/registry.d.ts +8 -0
  333. package/dist/plugins/registry.d.ts.map +1 -0
  334. package/dist/plugins/registry.js +96 -0
  335. package/dist/plugins/registry.js.map +1 -0
  336. package/dist/plugins/scaffold.d.ts +10 -0
  337. package/dist/plugins/scaffold.d.ts.map +1 -0
  338. package/dist/plugins/scaffold.js +152 -0
  339. package/dist/plugins/scaffold.js.map +1 -0
  340. package/dist/plugins/types.d.ts +45 -0
  341. package/dist/plugins/types.d.ts.map +1 -0
  342. package/dist/plugins/types.js +1 -0
  343. package/dist/plugins/types.js.map +1 -0
  344. package/dist/processors/plan-rejection-abort.d.ts +12 -0
  345. package/dist/processors/plan-rejection-abort.d.ts.map +1 -0
  346. package/dist/processors/plan-rejection-abort.js +53 -0
  347. package/dist/processors/plan-rejection-abort.js.map +1 -0
  348. package/dist/providers/amazon-bedrock-gateway.d.ts +40 -0
  349. package/dist/providers/amazon-bedrock-gateway.d.ts.map +1 -0
  350. package/dist/providers/amazon-bedrock-gateway.js +79 -0
  351. package/dist/providers/amazon-bedrock-gateway.js.map +1 -0
  352. package/dist/providers/amazon-bedrock.d.ts +28 -0
  353. package/dist/providers/amazon-bedrock.d.ts.map +1 -0
  354. package/dist/providers/amazon-bedrock.js +62 -0
  355. package/dist/providers/amazon-bedrock.js.map +1 -0
  356. package/dist/providers/claude-max.d.ts +50 -0
  357. package/dist/providers/claude-max.d.ts.map +1 -0
  358. package/dist/providers/claude-max.js +151 -0
  359. package/dist/providers/claude-max.js.map +1 -0
  360. package/dist/providers/github-copilot.d.ts +58 -0
  361. package/dist/providers/github-copilot.d.ts.map +1 -0
  362. package/dist/providers/github-copilot.js +263 -0
  363. package/dist/providers/github-copilot.js.map +1 -0
  364. package/dist/providers/openai-codex.d.ts +70 -0
  365. package/dist/providers/openai-codex.d.ts.map +1 -0
  366. package/dist/providers/openai-codex.js +291 -0
  367. package/dist/providers/openai-codex.js.map +1 -0
  368. package/dist/schema.d.ts +167 -0
  369. package/dist/schema.d.ts.map +1 -0
  370. package/dist/schema.js +92 -0
  371. package/dist/schema.js.map +1 -0
  372. package/dist/theme-palette.d.ts +17 -0
  373. package/dist/theme-palette.d.ts.map +1 -0
  374. package/dist/theme-palette.js +17 -0
  375. package/dist/theme-palette.js.map +1 -0
  376. package/dist/tool-names.d.ts +73 -0
  377. package/dist/tool-names.d.ts.map +1 -0
  378. package/dist/tool-names.js +43 -0
  379. package/dist/tool-names.js.map +1 -0
  380. package/dist/tools/index.d.ts +6 -0
  381. package/dist/tools/index.d.ts.map +1 -0
  382. package/dist/tools/index.js +9 -0
  383. package/dist/tools/index.js.map +1 -0
  384. package/dist/tools/request-sandbox-access.d.ts +6 -0
  385. package/dist/tools/request-sandbox-access.d.ts.map +1 -0
  386. package/dist/tools/request-sandbox-access.js +88 -0
  387. package/dist/tools/request-sandbox-access.js.map +1 -0
  388. package/dist/tools/utils.d.ts +20 -0
  389. package/dist/tools/utils.d.ts.map +1 -0
  390. package/dist/tools/utils.js +22 -0
  391. package/dist/tools/utils.js.map +1 -0
  392. package/dist/tools/web-search.d.ts +35 -0
  393. package/dist/tools/web-search.d.ts.map +1 -0
  394. package/dist/tools/web-search.js +65 -0
  395. package/dist/tools/web-search.js.map +1 -0
  396. package/dist/utils/binaries.d.ts +7 -0
  397. package/dist/utils/binaries.d.ts.map +1 -0
  398. package/dist/utils/binaries.js +74 -0
  399. package/dist/utils/binaries.js.map +1 -0
  400. package/dist/utils/debug-log.d.ts +12 -0
  401. package/dist/utils/debug-log.d.ts.map +1 -0
  402. package/dist/utils/debug-log.js +55 -0
  403. package/dist/utils/debug-log.js.map +1 -0
  404. package/dist/utils/errors.d.ts +36 -0
  405. package/dist/utils/errors.d.ts.map +1 -0
  406. package/dist/utils/errors.js +207 -0
  407. package/dist/utils/errors.js.map +1 -0
  408. package/dist/utils/gateway-sync.d.ts +26 -0
  409. package/dist/utils/gateway-sync.d.ts.map +1 -0
  410. package/dist/utils/gateway-sync.js +49 -0
  411. package/dist/utils/gateway-sync.js.map +1 -0
  412. package/dist/utils/path-security.d.ts +2 -0
  413. package/dist/utils/path-security.d.ts.map +1 -0
  414. package/dist/utils/path-security.js +9 -0
  415. package/dist/utils/path-security.js.map +1 -0
  416. package/dist/utils/plan-diff.d.ts +25 -0
  417. package/dist/utils/plan-diff.d.ts.map +1 -0
  418. package/dist/utils/plan-diff.js +43 -0
  419. package/dist/utils/plan-diff.js.map +1 -0
  420. package/dist/utils/plans.d.ts +56 -0
  421. package/dist/utils/plans.d.ts.map +1 -0
  422. package/dist/utils/plans.js +99 -0
  423. package/dist/utils/plans.js.map +1 -0
  424. package/dist/utils/project.d.ts +160 -0
  425. package/dist/utils/project.d.ts.map +1 -0
  426. package/dist/utils/project.js +302 -0
  427. package/dist/utils/project.js.map +1 -0
  428. package/dist/utils/signals-pubsub.d.ts +41 -0
  429. package/dist/utils/signals-pubsub.d.ts.map +1 -0
  430. package/dist/utils/signals-pubsub.js +104 -0
  431. package/dist/utils/signals-pubsub.js.map +1 -0
  432. package/dist/utils/slash-command-loader.d.ts +52 -0
  433. package/dist/utils/slash-command-loader.d.ts.map +1 -0
  434. package/dist/utils/slash-command-loader.js +177 -0
  435. package/dist/utils/slash-command-loader.js.map +1 -0
  436. package/dist/utils/slash-command-processor.d.ts +14 -0
  437. package/dist/utils/slash-command-processor.d.ts.map +1 -0
  438. package/dist/utils/slash-command-processor.js +96 -0
  439. package/dist/utils/slash-command-processor.js.map +1 -0
  440. package/dist/utils/stdin-pipe.d.ts +33 -0
  441. package/dist/utils/stdin-pipe.d.ts.map +1 -0
  442. package/dist/utils/stdin-pipe.js +72 -0
  443. package/dist/utils/stdin-pipe.js.map +1 -0
  444. package/dist/utils/storage-factory.d.ts +50 -0
  445. package/dist/utils/storage-factory.d.ts.map +1 -0
  446. package/dist/utils/storage-factory.js +101 -0
  447. package/dist/utils/storage-factory.js.map +1 -0
  448. package/dist/utils/storage-maintenance.d.ts +103 -0
  449. package/dist/utils/storage-maintenance.d.ts.map +1 -0
  450. package/dist/utils/storage-maintenance.js +236 -0
  451. package/dist/utils/storage-maintenance.js.map +1 -0
  452. package/dist/utils/thread-lock.d.ts +26 -0
  453. package/dist/utils/thread-lock.d.ts.map +1 -0
  454. package/dist/utils/thread-lock.js +108 -0
  455. package/dist/utils/thread-lock.js.map +1 -0
  456. package/dist/utils/token-estimator.d.ts +3 -0
  457. package/dist/utils/token-estimator.d.ts.map +1 -0
  458. package/dist/utils/token-estimator.js +21 -0
  459. package/dist/utils/token-estimator.js.map +1 -0
  460. package/dist/utils/update-check.d.ts +52 -0
  461. package/dist/utils/update-check.d.ts.map +1 -0
  462. package/dist/utils/update-check.js +177 -0
  463. package/dist/utils/update-check.js.map +1 -0
  464. package/dist/voice/stt-registry.d.ts +64 -0
  465. package/dist/voice/stt-registry.d.ts.map +1 -0
  466. package/dist/voice/stt-registry.js +126 -0
  467. package/dist/voice/stt-registry.js.map +1 -0
  468. package/package.json +94 -0
@@ -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,201 @@
1
+ import { createScorer, filterRun } from "@mastra/core/evals";
2
+ import { extractToolCalls } from "./extract-tools.js";
3
+ const WEIGHTS = {
4
+ redundancy: 0.35,
5
+ turnCount: 0.3,
6
+ retryEfficiency: 0.2,
7
+ readBeforeEdit: 0.15
8
+ };
9
+ const THRESHOLDS = {
10
+ /** Redundancy ratio below this is considered acceptable (no penalty). */
11
+ redundancyAcceptableRate: 0.05,
12
+ /** Penalty multiplier applied to redundancy ratio above the acceptable rate. */
13
+ redundancyPenaltyMultiplier: 3,
14
+ /** Turns at or below this is considered normal (score 1.0). */
15
+ turnCountNormalMax: 8,
16
+ /** Penalty per turn beyond the normal maximum (for turns 9–15). */
17
+ turnCountPenaltyPerTurn: 0.04,
18
+ /** Penalty per turn beyond 15. */
19
+ turnCountExtendedPenaltyPerTurn: 0.03,
20
+ /** Number of consecutive failures before a retry chain is "excessive". */
21
+ retryExcessiveThreshold: 3,
22
+ /** Tools considered "edit" tools that should be preceded by a read. */
23
+ editTools: ["string_replace_lsp", "ast_smart_edit"],
24
+ /** Tools that satisfy read-before-edit (only `view` truly reads a specific file). */
25
+ readTools: ["view"],
26
+ /** Tools whose repeated identical calls are intentional (idempotent reads). */
27
+ redundancyWhitelist: ["view", "search_content", "find_files", "lsp_inspect", "web_search", "web_extract"],
28
+ /** Minimum tool calls required to produce a meaningful score. */
29
+ minToolCalls: 2
30
+ };
31
+ function countAssistantTurns(messages) {
32
+ return messages.filter((m) => m.role === "assistant").length;
33
+ }
34
+ function scoreRedundancy(calls) {
35
+ if (calls.length < 2) return { score: 1, ratio: 0, detail: "Too few calls" };
36
+ const mutationCalls = calls.filter((c) => !THRESHOLDS.redundancyWhitelist.includes(c.toolName));
37
+ if (mutationCalls.length < 2) return { score: 1, ratio: 0, detail: "No mutation tools to check" };
38
+ const fingerprints = /* @__PURE__ */ new Map();
39
+ for (const call of mutationCalls) {
40
+ const fp = `${call.toolName}:${JSON.stringify(call.args)}`;
41
+ const existing = fingerprints.get(fp) ?? { count: 0, successCount: 0 };
42
+ existing.count++;
43
+ if (!call.isError) existing.successCount++;
44
+ fingerprints.set(fp, existing);
45
+ }
46
+ let redundantCount = 0;
47
+ for (const { successCount } of fingerprints.values()) {
48
+ if (successCount > 1) redundantCount += successCount - 1;
49
+ }
50
+ const ratio = redundantCount / mutationCalls.length;
51
+ const acceptable = THRESHOLDS.redundancyAcceptableRate;
52
+ const score = ratio <= acceptable ? 1 : Math.max(0, 1 - (ratio - acceptable) * THRESHOLDS.redundancyPenaltyMultiplier);
53
+ return {
54
+ score,
55
+ ratio,
56
+ detail: `${redundantCount}/${mutationCalls.length} redundant mutations (${(ratio * 100).toFixed(0)}%)`
57
+ };
58
+ }
59
+ function scoreTurnCount(turns) {
60
+ const normalMax = THRESHOLDS.turnCountNormalMax;
61
+ const penaltyPerTurn = THRESHOLDS.turnCountPenaltyPerTurn;
62
+ const extendedPenalty = THRESHOLDS.turnCountExtendedPenaltyPerTurn;
63
+ if (turns <= 1) return { score: 1, detail: `${turns} turn` };
64
+ if (turns <= normalMax) return { score: 1, detail: `${turns} turns (within normal range)` };
65
+ if (turns <= 15) {
66
+ const score2 = 1 - (turns - normalMax) * penaltyPerTurn;
67
+ return { score: score2, detail: `${turns} turns (slightly extended)` };
68
+ }
69
+ const midPenalty = (15 - normalMax) * penaltyPerTurn;
70
+ const score = Math.max(0, 1 - midPenalty - (turns - 15) * extendedPenalty);
71
+ return { score, detail: `${turns} turns (extended session)` };
72
+ }
73
+ function scoreRetryEfficiency(calls) {
74
+ if (calls.length < 2) return { score: 1, detail: "Too few calls" };
75
+ const groupKey = (call) => {
76
+ const path = String(call.args.path ?? call.args.command ?? "");
77
+ return `${call.toolName}:${path}`;
78
+ };
79
+ const byGroup = /* @__PURE__ */ new Map();
80
+ for (const call of calls) {
81
+ const key = groupKey(call);
82
+ const arr = byGroup.get(key) ?? [];
83
+ arr.push(call);
84
+ byGroup.set(key, arr);
85
+ }
86
+ let totalRetryChains = 0;
87
+ let excessiveRetries = 0;
88
+ const threshold = THRESHOLDS.retryExcessiveThreshold;
89
+ for (const [, toolCalls] of byGroup) {
90
+ let consecutiveFailures = 0;
91
+ for (const call of toolCalls) {
92
+ if (call.isError) {
93
+ consecutiveFailures++;
94
+ } else {
95
+ if (consecutiveFailures > 0) {
96
+ totalRetryChains++;
97
+ if (consecutiveFailures >= threshold) excessiveRetries++;
98
+ }
99
+ consecutiveFailures = 0;
100
+ }
101
+ }
102
+ if (consecutiveFailures > 0) {
103
+ totalRetryChains++;
104
+ if (consecutiveFailures >= threshold) excessiveRetries++;
105
+ }
106
+ }
107
+ if (totalRetryChains === 0) return { score: 1, detail: "No retry chains" };
108
+ if (excessiveRetries === 0) return { score: 0.9, detail: `${totalRetryChains} retry chain(s), all resolved quickly` };
109
+ const score = Math.max(0, 0.8 - excessiveRetries * 0.2);
110
+ return {
111
+ score,
112
+ detail: `${excessiveRetries} excessive retry chain(s) (${threshold}+ failures before success)`
113
+ };
114
+ }
115
+ function scoreReadBeforeEdit(calls) {
116
+ const editTools = THRESHOLDS.editTools;
117
+ const readTools = THRESHOLDS.readTools;
118
+ const edits = calls.filter((c) => editTools.includes(c.toolName));
119
+ if (edits.length === 0) return { score: 1, detail: "No edits to check" };
120
+ const readPaths = /* @__PURE__ */ new Set();
121
+ let compliant = 0;
122
+ let total = 0;
123
+ for (const call of calls) {
124
+ const rawPath = String(call.args.path ?? "");
125
+ if (!rawPath) continue;
126
+ if (readTools.includes(call.toolName)) {
127
+ readPaths.add(rawPath);
128
+ } else if (editTools.includes(call.toolName)) {
129
+ total++;
130
+ if (hasReadPath(readPaths, rawPath)) {
131
+ compliant++;
132
+ }
133
+ }
134
+ }
135
+ if (total === 0) return { score: 1, detail: "No path-targeted edits" };
136
+ const ratio = compliant / total;
137
+ const violations = total - compliant;
138
+ if (violations === 0) return { score: 1, detail: `All ${total} edits had prior reads` };
139
+ return { score: ratio, detail: `${violations}/${total} edits without prior read` };
140
+ }
141
+ function hasReadPath(readPaths, editPath) {
142
+ if (readPaths.has(editPath)) return true;
143
+ for (const rp of readPaths) {
144
+ if (rp.endsWith(`/${editPath}`) || editPath.endsWith(`/${rp}`)) return true;
145
+ }
146
+ return false;
147
+ }
148
+ function createEfficiencyScorer() {
149
+ return createScorer({
150
+ id: "mastracode-efficiency",
151
+ name: "MastraCode Efficiency",
152
+ description: "Measures coding session efficiency: redundancy, turn count, retry patterns, read-before-edit. 30% sampled.",
153
+ type: "agent",
154
+ prepareRun: filterRun({ partTypes: ["tool-invocation", "text"] })
155
+ }).preprocess(async ({ run }) => {
156
+ const messages = run.output ?? [];
157
+ const calls = extractToolCalls(messages);
158
+ const turns = countAssistantTurns(messages);
159
+ if (calls.length < THRESHOLDS.minToolCalls) {
160
+ return { empty: true, totalCalls: calls.length, totalTurns: turns };
161
+ }
162
+ const redundancy = scoreRedundancy(calls);
163
+ const turnCount = scoreTurnCount(turns);
164
+ const retryEfficiency = scoreRetryEfficiency(calls);
165
+ const readBeforeEdit = scoreReadBeforeEdit(calls);
166
+ return {
167
+ empty: false,
168
+ redundancy,
169
+ turnCount,
170
+ retryEfficiency,
171
+ readBeforeEdit,
172
+ totalCalls: calls.length,
173
+ totalTurns: turns
174
+ };
175
+ }).generateScore(({ results }) => {
176
+ const p = results.preprocessStepResult;
177
+ if (p.empty) return 0;
178
+ const score = p.redundancy.score * WEIGHTS.redundancy + p.turnCount.score * WEIGHTS.turnCount + p.retryEfficiency.score * WEIGHTS.retryEfficiency + p.readBeforeEdit.score * WEIGHTS.readBeforeEdit;
179
+ return Math.round(score * 100) / 100;
180
+ }).generateReason(({ results, score }) => {
181
+ const p = results.preprocessStepResult;
182
+ if (p.empty) {
183
+ return `Score: 0 (${p.totalCalls} tool calls \u2014 below minimum threshold for scoring)`;
184
+ }
185
+ const pct = (w) => `${(w * 100).toFixed(0)}%`;
186
+ const parts = [`Score: ${score} (${p.totalCalls} calls, ${p.totalTurns} turns)`];
187
+ parts.push(`Redundancy (${pct(WEIGHTS.redundancy)}): ${p.redundancy.detail} [${p.redundancy.score}]`);
188
+ parts.push(`Turn count (${pct(WEIGHTS.turnCount)}): ${p.turnCount.detail} [${p.turnCount.score}]`);
189
+ parts.push(
190
+ `Retry efficiency (${pct(WEIGHTS.retryEfficiency)}): ${p.retryEfficiency.detail} [${p.retryEfficiency.score}]`
191
+ );
192
+ parts.push(
193
+ `Read-before-edit (${pct(WEIGHTS.readBeforeEdit)}): ${p.readBeforeEdit.detail} [${p.readBeforeEdit.score}]`
194
+ );
195
+ return parts.join("\n");
196
+ });
197
+ }
198
+ export {
199
+ createEfficiencyScorer
200
+ };
201
+ //# sourceMappingURL=efficiency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"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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","names":["score"]}
@@ -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,56 @@
1
+ function isToolInvocationPart(part) {
2
+ return "type" in part && part.type === "tool-invocation" && "toolInvocation" in part;
3
+ }
4
+ function isCompleted(inv) {
5
+ return inv.state === "result" || inv.state === "error" || inv.state === "output-error" || inv.state === "output-denied";
6
+ }
7
+ function isErrorState(inv) {
8
+ return inv.state === "error" || inv.state === "output-error" || inv.state === "output-denied";
9
+ }
10
+ function extractToolCalls(messages) {
11
+ const results = [];
12
+ const seenToolCallIds = /* @__PURE__ */ new Set();
13
+ let index = 0;
14
+ for (const msg of messages) {
15
+ if (!msg.content) continue;
16
+ for (const part of msg.content.parts ?? []) {
17
+ if (isToolInvocationPart(part)) {
18
+ const inv = part.toolInvocation;
19
+ if (isCompleted(inv)) {
20
+ const toolCallId = "toolCallId" in inv ? inv.toolCallId : void 0;
21
+ if (toolCallId) seenToolCallIds.add(toolCallId);
22
+ results.push({
23
+ toolCallId,
24
+ toolName: inv.toolName ?? "",
25
+ args: inv.args ?? {},
26
+ result: inv.result,
27
+ isError: isErrorState(inv),
28
+ index: index++
29
+ });
30
+ }
31
+ }
32
+ }
33
+ if (msg.content.toolInvocations) {
34
+ for (const inv of msg.content.toolInvocations) {
35
+ if (inv.state === "result") {
36
+ const toolCallId = "toolCallId" in inv ? inv.toolCallId : void 0;
37
+ if (toolCallId && seenToolCallIds.has(toolCallId)) continue;
38
+ if (toolCallId) seenToolCallIds.add(toolCallId);
39
+ results.push({
40
+ toolCallId,
41
+ toolName: inv.toolName ?? "",
42
+ args: inv.args ?? {},
43
+ result: inv.result,
44
+ isError: false,
45
+ index: index++
46
+ });
47
+ }
48
+ }
49
+ }
50
+ }
51
+ return results;
52
+ }
53
+ export {
54
+ extractToolCalls
55
+ };
56
+ //# sourceMappingURL=extract-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"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;AACA,SAAO,UAAU,QAAQ,KAAK,SAAS,qBAAqB,oBAAoB;AAClF;AAEA,SAAS,YAAY,KAAiC;AACpD,SACE,IAAI,UAAU,YAAY,IAAI,UAAU,WAAW,IAAI,UAAU,kBAAkB,IAAI,UAAU;AAErG;AAEA,SAAS,aAAa,KAAiC;AACrD,SAAO,IAAI,UAAU,WAAW,IAAI,UAAU,kBAAkB,IAAI,UAAU;AAChF;AASO,SAAS,iBAAiB,UAAkD;AACjF,QAAM,UAA+B,CAAC;AACtC,QAAM,kBAAkB,oBAAI,IAAY;AACxC,MAAI,QAAQ;AAEZ,aAAW,OAAO,UAAU;AAC1B,QAAI,CAAC,IAAI,QAAS;AAGlB,eAAW,QAAQ,IAAI,QAAQ,SAAS,CAAC,GAAG;AAC1C,UAAI,qBAAqB,IAAI,GAAG;AAC9B,cAAM,MAAM,KAAK;AACjB,YAAI,YAAY,GAAG,GAAG;AACpB,gBAAM,aAAa,gBAAgB,MAAO,IAAI,aAAwB;AACtE,cAAI,WAAY,iBAAgB,IAAI,UAAU;AAE9C,kBAAQ,KAAK;AAAA,YACX;AAAA,YACA,UAAU,IAAI,YAAY;AAAA,YAC1B,MAAO,IAAI,QAAQ,CAAC;AAAA,YACpB,QAAQ,IAAI;AAAA,YACZ,SAAS,aAAa,GAAG;AAAA,YACzB,OAAO;AAAA,UACT,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAIA,QAAI,IAAI,QAAQ,iBAAiB;AAC/B,iBAAW,OAAO,IAAI,QAAQ,iBAAiB;AAC7C,YAAI,IAAI,UAAU,UAAU;AAE1B,gBAAM,aAAa,gBAAgB,MAAM,IAAI,aAAa;AAC1D,cAAI,cAAc,gBAAgB,IAAI,UAAU,EAAG;AACnD,cAAI,WAAY,iBAAgB,IAAI,UAAU;AAE9C,kBAAQ,KAAK;AAAA,YACX;AAAA,YACA,UAAU,IAAI,YAAY;AAAA,YAC1B,MAAO,IAAI,QAAQ,CAAC;AAAA,YACpB,QAAQ,IAAI;AAAA,YACZ,SAAS;AAAA,YACT,OAAO;AAAA,UACT,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
@@ -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,7 @@
1
+ import { createOutcomeScorer } from "./outcome.js";
2
+ import { createEfficiencyScorer } from "./efficiency.js";
3
+ export {
4
+ createEfficiencyScorer,
5
+ createOutcomeScorer
6
+ };
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/evals/scorers/index.ts"],"sourcesContent":["export { createOutcomeScorer } from './outcome.js';\nexport { createEfficiencyScorer } from './efficiency.js';\n"],"mappings":"AAAA,SAAS,2BAA2B;AACpC,SAAS,8BAA8B;","names":[]}
@@ -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"}