@mastra/code-sdk 0.0.0-mastracode-cloud-20260706153555

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 (456) hide show
  1. package/CHANGELOG.md +22 -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 +65 -0
  29. package/dist/agents/mastracode-gateway.d.ts.map +1 -0
  30. package/dist/agents/mastracode-gateway.js +442 -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 +18 -0
  97. package/dist/agents/tools.d.ts.map +1 -0
  98. package/dist/agents/tools.js +126 -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 +194 -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 +241 -0
  225. package/dist/index.d.ts.map +1 -0
  226. package/dist/index.js +712 -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 +323 -0
  293. package/dist/onboarding/settings.d.ts.map +1 -0
  294. package/dist/onboarding/settings.js +594 -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/install.d.ts +20 -0
  305. package/dist/plugins/install.d.ts.map +1 -0
  306. package/dist/plugins/install.js +179 -0
  307. package/dist/plugins/install.js.map +1 -0
  308. package/dist/plugins/loader.d.ts +15 -0
  309. package/dist/plugins/loader.d.ts.map +1 -0
  310. package/dist/plugins/loader.js +221 -0
  311. package/dist/plugins/loader.js.map +1 -0
  312. package/dist/plugins/manager.d.ts +60 -0
  313. package/dist/plugins/manager.d.ts.map +1 -0
  314. package/dist/plugins/manager.js +369 -0
  315. package/dist/plugins/manager.js.map +1 -0
  316. package/dist/plugins/manifest.d.ts +14 -0
  317. package/dist/plugins/manifest.d.ts.map +1 -0
  318. package/dist/plugins/manifest.js +75 -0
  319. package/dist/plugins/manifest.js.map +1 -0
  320. package/dist/plugins/package-link.d.ts +2 -0
  321. package/dist/plugins/package-link.d.ts.map +1 -0
  322. package/dist/plugins/package-link.js +20 -0
  323. package/dist/plugins/package-link.js.map +1 -0
  324. package/dist/plugins/paths.d.ts +10 -0
  325. package/dist/plugins/paths.d.ts.map +1 -0
  326. package/dist/plugins/paths.js +26 -0
  327. package/dist/plugins/paths.js.map +1 -0
  328. package/dist/plugins/registry.d.ts +8 -0
  329. package/dist/plugins/registry.d.ts.map +1 -0
  330. package/dist/plugins/registry.js +96 -0
  331. package/dist/plugins/registry.js.map +1 -0
  332. package/dist/plugins/scaffold.d.ts +10 -0
  333. package/dist/plugins/scaffold.d.ts.map +1 -0
  334. package/dist/plugins/scaffold.js +152 -0
  335. package/dist/plugins/scaffold.js.map +1 -0
  336. package/dist/plugins/types.d.ts +45 -0
  337. package/dist/plugins/types.d.ts.map +1 -0
  338. package/dist/plugins/types.js +1 -0
  339. package/dist/plugins/types.js.map +1 -0
  340. package/dist/processors/plan-rejection-abort.d.ts +12 -0
  341. package/dist/processors/plan-rejection-abort.d.ts.map +1 -0
  342. package/dist/processors/plan-rejection-abort.js +53 -0
  343. package/dist/processors/plan-rejection-abort.js.map +1 -0
  344. package/dist/providers/amazon-bedrock-gateway.d.ts +40 -0
  345. package/dist/providers/amazon-bedrock-gateway.d.ts.map +1 -0
  346. package/dist/providers/amazon-bedrock-gateway.js +79 -0
  347. package/dist/providers/amazon-bedrock-gateway.js.map +1 -0
  348. package/dist/providers/amazon-bedrock.d.ts +28 -0
  349. package/dist/providers/amazon-bedrock.d.ts.map +1 -0
  350. package/dist/providers/amazon-bedrock.js +62 -0
  351. package/dist/providers/amazon-bedrock.js.map +1 -0
  352. package/dist/providers/claude-max.d.ts +50 -0
  353. package/dist/providers/claude-max.d.ts.map +1 -0
  354. package/dist/providers/claude-max.js +151 -0
  355. package/dist/providers/claude-max.js.map +1 -0
  356. package/dist/providers/github-copilot.d.ts +58 -0
  357. package/dist/providers/github-copilot.d.ts.map +1 -0
  358. package/dist/providers/github-copilot.js +263 -0
  359. package/dist/providers/github-copilot.js.map +1 -0
  360. package/dist/providers/openai-codex.d.ts +70 -0
  361. package/dist/providers/openai-codex.d.ts.map +1 -0
  362. package/dist/providers/openai-codex.js +291 -0
  363. package/dist/providers/openai-codex.js.map +1 -0
  364. package/dist/schema.d.ts +167 -0
  365. package/dist/schema.d.ts.map +1 -0
  366. package/dist/schema.js +92 -0
  367. package/dist/schema.js.map +1 -0
  368. package/dist/theme-palette.d.ts +17 -0
  369. package/dist/theme-palette.d.ts.map +1 -0
  370. package/dist/theme-palette.js +17 -0
  371. package/dist/theme-palette.js.map +1 -0
  372. package/dist/tool-names.d.ts +73 -0
  373. package/dist/tool-names.d.ts.map +1 -0
  374. package/dist/tool-names.js +43 -0
  375. package/dist/tool-names.js.map +1 -0
  376. package/dist/tools/index.d.ts +6 -0
  377. package/dist/tools/index.d.ts.map +1 -0
  378. package/dist/tools/index.js +9 -0
  379. package/dist/tools/index.js.map +1 -0
  380. package/dist/tools/request-sandbox-access.d.ts +6 -0
  381. package/dist/tools/request-sandbox-access.d.ts.map +1 -0
  382. package/dist/tools/request-sandbox-access.js +88 -0
  383. package/dist/tools/request-sandbox-access.js.map +1 -0
  384. package/dist/tools/utils.d.ts +20 -0
  385. package/dist/tools/utils.d.ts.map +1 -0
  386. package/dist/tools/utils.js +22 -0
  387. package/dist/tools/utils.js.map +1 -0
  388. package/dist/tools/web-search.d.ts +35 -0
  389. package/dist/tools/web-search.d.ts.map +1 -0
  390. package/dist/tools/web-search.js +65 -0
  391. package/dist/tools/web-search.js.map +1 -0
  392. package/dist/utils/binaries.d.ts +7 -0
  393. package/dist/utils/binaries.d.ts.map +1 -0
  394. package/dist/utils/binaries.js +74 -0
  395. package/dist/utils/binaries.js.map +1 -0
  396. package/dist/utils/debug-log.d.ts +12 -0
  397. package/dist/utils/debug-log.d.ts.map +1 -0
  398. package/dist/utils/debug-log.js +55 -0
  399. package/dist/utils/debug-log.js.map +1 -0
  400. package/dist/utils/errors.d.ts +36 -0
  401. package/dist/utils/errors.d.ts.map +1 -0
  402. package/dist/utils/errors.js +207 -0
  403. package/dist/utils/errors.js.map +1 -0
  404. package/dist/utils/gateway-sync.d.ts +26 -0
  405. package/dist/utils/gateway-sync.d.ts.map +1 -0
  406. package/dist/utils/gateway-sync.js +49 -0
  407. package/dist/utils/gateway-sync.js.map +1 -0
  408. package/dist/utils/plan-diff.d.ts +25 -0
  409. package/dist/utils/plan-diff.d.ts.map +1 -0
  410. package/dist/utils/plan-diff.js +43 -0
  411. package/dist/utils/plan-diff.js.map +1 -0
  412. package/dist/utils/plans.d.ts +56 -0
  413. package/dist/utils/plans.d.ts.map +1 -0
  414. package/dist/utils/plans.js +99 -0
  415. package/dist/utils/plans.js.map +1 -0
  416. package/dist/utils/project.d.ts +161 -0
  417. package/dist/utils/project.d.ts.map +1 -0
  418. package/dist/utils/project.js +302 -0
  419. package/dist/utils/project.js.map +1 -0
  420. package/dist/utils/signals-pubsub.d.ts +41 -0
  421. package/dist/utils/signals-pubsub.d.ts.map +1 -0
  422. package/dist/utils/signals-pubsub.js +104 -0
  423. package/dist/utils/signals-pubsub.js.map +1 -0
  424. package/dist/utils/slash-command-loader.d.ts +48 -0
  425. package/dist/utils/slash-command-loader.d.ts.map +1 -0
  426. package/dist/utils/slash-command-loader.js +155 -0
  427. package/dist/utils/slash-command-loader.js.map +1 -0
  428. package/dist/utils/slash-command-processor.d.ts +14 -0
  429. package/dist/utils/slash-command-processor.d.ts.map +1 -0
  430. package/dist/utils/slash-command-processor.js +96 -0
  431. package/dist/utils/slash-command-processor.js.map +1 -0
  432. package/dist/utils/stdin-pipe.d.ts +33 -0
  433. package/dist/utils/stdin-pipe.d.ts.map +1 -0
  434. package/dist/utils/stdin-pipe.js +72 -0
  435. package/dist/utils/stdin-pipe.js.map +1 -0
  436. package/dist/utils/storage-factory.d.ts +50 -0
  437. package/dist/utils/storage-factory.d.ts.map +1 -0
  438. package/dist/utils/storage-factory.js +98 -0
  439. package/dist/utils/storage-factory.js.map +1 -0
  440. package/dist/utils/thread-lock.d.ts +26 -0
  441. package/dist/utils/thread-lock.d.ts.map +1 -0
  442. package/dist/utils/thread-lock.js +108 -0
  443. package/dist/utils/thread-lock.js.map +1 -0
  444. package/dist/utils/token-estimator.d.ts +3 -0
  445. package/dist/utils/token-estimator.d.ts.map +1 -0
  446. package/dist/utils/token-estimator.js +21 -0
  447. package/dist/utils/token-estimator.js.map +1 -0
  448. package/dist/utils/update-check.d.ts +52 -0
  449. package/dist/utils/update-check.d.ts.map +1 -0
  450. package/dist/utils/update-check.js +177 -0
  451. package/dist/utils/update-check.js.map +1 -0
  452. package/dist/voice/stt-registry.d.ts +64 -0
  453. package/dist/voice/stt-registry.d.ts.map +1 -0
  454. package/dist/voice/stt-registry.js +126 -0
  455. package/dist/voice/stt-registry.js.map +1 -0
  456. package/package.json +92 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants.ts"],"sourcesContent":["import * as path from 'node:path';\n\n// Default config directory name used for all project-level and global config paths.\nexport const DEFAULT_CONFIG_DIR = '.mastracode';\n\n/**\n * Validate that a configDirName is a safe single directory name.\n * Rejects absolute paths, path separators, and traversal components.\n */\nexport function validateConfigDirName(configDirName: string): void {\n if (configDirName.trim().length === 0) {\n throw new Error('configDirName must be a non-empty directory name');\n }\n\n if (\n path.isAbsolute(configDirName) ||\n configDirName.includes('/') ||\n configDirName.includes('\\\\') ||\n configDirName === '..' ||\n configDirName === '.'\n ) {\n throw new Error(\n `configDirName must be a single directory name without path separators or traversal components, got: \"${configDirName}\"`,\n );\n }\n}\n\n// Default OM model - using gemini-2.5-flash for efficiency\nexport const DEFAULT_OM_MODEL_ID = process.env.DEFAULT_OM_MODEL_ID ?? 'google/gemini-2.5-flash';\n\n// Default OM thresholds — per-thread overrides are loaded from thread metadata\nexport const DEFAULT_OBS_THRESHOLD = 30_000;\nexport const DEFAULT_REF_THRESHOLD = 40_000;\n"],"mappings":"AAAA,YAAY,UAAU;AAGf,MAAM,qBAAqB;AAM3B,SAAS,sBAAsB,eAA6B;AACjE,MAAI,cAAc,KAAK,EAAE,WAAW,GAAG;AACrC,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AAEA,MACE,KAAK,WAAW,aAAa,KAC7B,cAAc,SAAS,GAAG,KAC1B,cAAc,SAAS,IAAI,KAC3B,kBAAkB,QAClB,kBAAkB,KAClB;AACA,UAAM,IAAI;AAAA,MACR,wGAAwG,aAAa;AAAA,IACvH;AAAA,EACF;AACF;AAGO,MAAM,sBAAsB,QAAQ,IAAI,uBAAuB;AAG/D,MAAM,wBAAwB;AAC9B,MAAM,wBAAwB;","names":[]}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Checks whether an error is an ERR_STREAM_DESTROYED error, which is a
3
+ * non-fatal condition that occurs when code writes to a stream after it
4
+ * has been closed (e.g., client disconnect, cancelled LLM stream, LSP
5
+ * shutdown, killed subprocess).
6
+ *
7
+ * Walks the `.cause` chain up to a depth limit.
8
+ */
9
+ export declare function isStreamDestroyedError(err: unknown, depth?: number): boolean;
10
+ //# sourceMappingURL=error-classification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-classification.d.ts","sourceRoot":"","sources":["../src/error-classification.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,SAAI,GAAG,OAAO,CASvE"}
@@ -0,0 +1,14 @@
1
+ function isStreamDestroyedError(err, depth = 0) {
2
+ if (!err || depth > 5) return false;
3
+ const e = err;
4
+ if (e.code === "ERR_STREAM_DESTROYED") return true;
5
+ if (typeof e.message === "string" && e.message.includes("stream was destroyed")) return true;
6
+ if (e.cause && isStreamDestroyedError(e.cause, depth + 1)) return true;
7
+ if (Array.isArray(e.errors) && e.errors.some((inner) => isStreamDestroyedError(inner, depth + 1)))
8
+ return true;
9
+ return false;
10
+ }
11
+ export {
12
+ isStreamDestroyedError
13
+ };
14
+ //# sourceMappingURL=error-classification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/error-classification.ts"],"sourcesContent":["/**\n * Checks whether an error is an ERR_STREAM_DESTROYED error, which is a\n * non-fatal condition that occurs when code writes to a stream after it\n * has been closed (e.g., client disconnect, cancelled LLM stream, LSP\n * shutdown, killed subprocess).\n *\n * Walks the `.cause` chain up to a depth limit.\n */\nexport function isStreamDestroyedError(err: unknown, depth = 0): boolean {\n if (!err || depth > 5) return false;\n const e = err as any;\n if (e.code === 'ERR_STREAM_DESTROYED') return true;\n if (typeof e.message === 'string' && e.message.includes('stream was destroyed')) return true;\n if (e.cause && isStreamDestroyedError(e.cause, depth + 1)) return true;\n if (Array.isArray(e.errors) && e.errors.some((inner: unknown) => isStreamDestroyedError(inner, depth + 1)))\n return true;\n return false;\n}\n"],"mappings":"AAQO,SAAS,uBAAuB,KAAc,QAAQ,GAAY;AACvE,MAAI,CAAC,OAAO,QAAQ,EAAG,QAAO;AAC9B,QAAM,IAAI;AACV,MAAI,EAAE,SAAS,uBAAwB,QAAO;AAC9C,MAAI,OAAO,EAAE,YAAY,YAAY,EAAE,QAAQ,SAAS,sBAAsB,EAAG,QAAO;AACxF,MAAI,EAAE,SAAS,uBAAuB,EAAE,OAAO,QAAQ,CAAC,EAAG,QAAO;AAClE,MAAI,MAAM,QAAQ,EAAE,MAAM,KAAK,EAAE,OAAO,KAAK,CAAC,UAAmB,uBAAuB,OAAO,QAAQ,CAAC,CAAC;AACvG,WAAO;AACT,SAAO;AACT;","names":[]}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Eval Context Builder for MastraCode
3
+ *
4
+ * Converts AgentController session data into scorer-compatible format.
5
+ * Supports both agent-type scorers (ScorerRunInputForAgent) and
6
+ * trajectory scorers (Trajectory).
7
+ */
8
+ import type { AgentController, Session } from '@mastra/core/agent-controller';
9
+ import type { ScorerRunInputForAgent, ScorerRunOutputForAgent, Trajectory } from '@mastra/core/evals';
10
+ export type MastraCodeEvalContext = {
11
+ /** Scorer-compatible agent input (messages, system prompt, etc.) */
12
+ agentInput: ScorerRunInputForAgent;
13
+ /** Scorer-compatible agent output (response messages) */
14
+ agentOutput: ScorerRunOutputForAgent;
15
+ /** Execution trajectory extracted from trace spans */
16
+ trajectory: Trajectory | undefined;
17
+ /** Request context with session metadata */
18
+ requestContext: Record<string, unknown>;
19
+ /** The thread ID this context was built from */
20
+ threadId: string;
21
+ /** The trace ID for observability linkage */
22
+ traceId: string | undefined;
23
+ };
24
+ export type BuildContextOptions = {
25
+ /** AgentController instance to extract data from */
26
+ controller: AgentController<any>;
27
+ /** Session whose state/model/thread is being evaluated */
28
+ session: Session<any>;
29
+ /** Thread ID to build context for (defaults to current thread) */
30
+ threadId?: string;
31
+ /** Limit messages to the last N turns (user+assistant pairs). Undefined = all messages */
32
+ lastNTurns?: number;
33
+ };
34
+ /**
35
+ * Build an evaluation context from a AgentController session.
36
+ *
37
+ * This extracts messages from storage, builds trajectory from trace spans,
38
+ * and packages everything into the format scorers expect.
39
+ */
40
+ export declare function buildEvalContext(options: BuildContextOptions): Promise<MastraCodeEvalContext>;
41
+ //# sourceMappingURL=context-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-builder.d.ts","sourceRoot":"","sources":["../../src/evals/context-builder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAE9E,OAAO,KAAK,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAItG,MAAM,MAAM,qBAAqB,GAAG;IAClC,oEAAoE;IACpE,UAAU,EAAE,sBAAsB,CAAC;IACnC,yDAAyD;IACzD,WAAW,EAAE,uBAAuB,CAAC;IACrC,sDAAsD;IACtD,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC;IACnC,4CAA4C;IAC5C,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,oDAAoD;IACpD,UAAU,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;IACjC,0DAA0D;IAC1D,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACtB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0FAA0F;IAC1F,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAoCnG"}
@@ -0,0 +1,120 @@
1
+ import { extractTrajectoryFromTrace } from "@mastra/core/evals";
2
+ async function buildEvalContext(options) {
3
+ const { controller, session, lastNTurns } = options;
4
+ const threadId = options.threadId ?? session.thread.getId();
5
+ if (!threadId) {
6
+ throw new Error("No thread ID available. Start a session before building eval context.");
7
+ }
8
+ const mastra = controller.getMastra();
9
+ const storage = mastra?.getStorage();
10
+ const rawMessages = await getRawMessages(storage, threadId, lastNTurns);
11
+ const { inputMessages, systemMessages, outputMessages } = categorizeMessages(rawMessages);
12
+ const { trajectory, traceId } = await extractSessionTrajectory(storage, threadId);
13
+ const requestContext = buildRequestContext(session, threadId);
14
+ return {
15
+ agentInput: {
16
+ inputMessages,
17
+ rememberedMessages: [],
18
+ // AgentController doesn't separate these; memory recall is transparent
19
+ systemMessages,
20
+ taggedSystemMessages: {}
21
+ },
22
+ agentOutput: outputMessages,
23
+ trajectory,
24
+ requestContext,
25
+ threadId,
26
+ traceId
27
+ };
28
+ }
29
+ async function getRawMessages(storage, threadId, lastNTurns) {
30
+ if (!storage) return [];
31
+ const memoryStore = await storage.getStore("memory");
32
+ if (!memoryStore) return [];
33
+ const result = await memoryStore.listMessages({
34
+ threadId,
35
+ perPage: false
36
+ });
37
+ let messages = result.messages;
38
+ if (lastNTurns !== void 0 && lastNTurns > 0) {
39
+ messages = trimToLastNTurns(messages, lastNTurns);
40
+ }
41
+ return messages;
42
+ }
43
+ function trimToLastNTurns(messages, turns) {
44
+ let turnCount = 0;
45
+ let cutoffIndex = 0;
46
+ for (let i = messages.length - 1; i >= 0; i--) {
47
+ if (messages[i].role === "user") {
48
+ turnCount++;
49
+ if (turnCount === turns) {
50
+ cutoffIndex = i;
51
+ break;
52
+ }
53
+ }
54
+ }
55
+ return messages.slice(cutoffIndex);
56
+ }
57
+ function categorizeMessages(messages) {
58
+ const inputMessages = [];
59
+ const systemMessages = [];
60
+ const outputMessages = [];
61
+ for (const msg of messages) {
62
+ switch (msg.role) {
63
+ case "user":
64
+ inputMessages.push(msg);
65
+ break;
66
+ case "system":
67
+ systemMessages.push({
68
+ role: "system",
69
+ content: extractTextContent(msg)
70
+ });
71
+ break;
72
+ case "assistant":
73
+ outputMessages.push(msg);
74
+ break;
75
+ }
76
+ }
77
+ return { inputMessages, systemMessages, outputMessages };
78
+ }
79
+ function extractTextContent(msg) {
80
+ if (!msg.content?.parts) return "";
81
+ return msg.content.parts.filter((p) => p.type === "text" && "text" in p).map((p) => p.text).join("\n");
82
+ }
83
+ async function extractSessionTrajectory(storage, threadId) {
84
+ if (!storage) return { trajectory: void 0, traceId: void 0 };
85
+ try {
86
+ const observabilityStore = await storage.getStore("observability");
87
+ if (!observabilityStore) return { trajectory: void 0, traceId: void 0 };
88
+ const result = await observabilityStore.listTraces({
89
+ filters: { threadId },
90
+ pagination: { page: 0, perPage: 1 },
91
+ orderBy: { field: "startedAt", direction: "DESC" }
92
+ });
93
+ if (!result?.spans?.length) return { trajectory: void 0, traceId: void 0 };
94
+ const traceId = result.spans[0].traceId;
95
+ const trace = await observabilityStore.getTrace({ traceId });
96
+ if (!trace?.spans?.length) return { trajectory: void 0, traceId };
97
+ const trajectory = extractTrajectoryFromTrace(trace.spans);
98
+ return { trajectory, traceId };
99
+ } catch {
100
+ return { trajectory: void 0, traceId: void 0 };
101
+ }
102
+ }
103
+ function buildRequestContext(session, threadId) {
104
+ const state = session.state.get();
105
+ return {
106
+ threadId,
107
+ mode: state.currentMode ?? state.mode,
108
+ modelId: session.model.get(),
109
+ projectPath: state.projectPath,
110
+ projectName: state.projectName,
111
+ gitBranch: state.gitBranch,
112
+ thinkingLevel: state.thinkingLevel,
113
+ yolo: state.yolo,
114
+ smartEditing: state.smartEditing
115
+ };
116
+ }
117
+ export {
118
+ buildEvalContext
119
+ };
120
+ //# sourceMappingURL=context-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/evals/context-builder.ts"],"sourcesContent":["/**\n * Eval Context Builder for MastraCode\n *\n * Converts AgentController session data into scorer-compatible format.\n * Supports both agent-type scorers (ScorerRunInputForAgent) and\n * trajectory scorers (Trajectory).\n */\n\nimport type { MastraDBMessage } from '@mastra/core/agent';\nimport type { AgentController, Session } from '@mastra/core/agent-controller';\nimport { extractTrajectoryFromTrace } from '@mastra/core/evals';\nimport type { ScorerRunInputForAgent, ScorerRunOutputForAgent, Trajectory } from '@mastra/core/evals';\nimport type { CoreMessage, CoreSystemMessage } from '@mastra/core/llm';\nimport type { MastraCompositeStore } from '@mastra/core/storage';\n\nexport type MastraCodeEvalContext = {\n /** Scorer-compatible agent input (messages, system prompt, etc.) */\n agentInput: ScorerRunInputForAgent;\n /** Scorer-compatible agent output (response messages) */\n agentOutput: ScorerRunOutputForAgent;\n /** Execution trajectory extracted from trace spans */\n trajectory: Trajectory | undefined;\n /** Request context with session metadata */\n requestContext: Record<string, unknown>;\n /** The thread ID this context was built from */\n threadId: string;\n /** The trace ID for observability linkage */\n traceId: string | undefined;\n};\n\nexport type BuildContextOptions = {\n /** AgentController instance to extract data from */\n controller: AgentController<any>;\n /** Session whose state/model/thread is being evaluated */\n session: Session<any>;\n /** Thread ID to build context for (defaults to current thread) */\n threadId?: string;\n /** Limit messages to the last N turns (user+assistant pairs). Undefined = all messages */\n lastNTurns?: number;\n};\n\n/**\n * Build an evaluation context from a AgentController session.\n *\n * This extracts messages from storage, builds trajectory from trace spans,\n * and packages everything into the format scorers expect.\n */\nexport async function buildEvalContext(options: BuildContextOptions): Promise<MastraCodeEvalContext> {\n const { controller, session, lastNTurns } = options;\n const threadId = options.threadId ?? session.thread.getId();\n\n if (!threadId) {\n throw new Error('No thread ID available. Start a session before building eval context.');\n }\n\n const mastra = controller.getMastra();\n const storage = mastra?.getStorage();\n\n // 1. Get raw MastraDB messages from memory storage\n const rawMessages = await getRawMessages(storage, threadId, lastNTurns);\n\n // 2. Split messages into input/output categories\n const { inputMessages, systemMessages, outputMessages } = categorizeMessages(rawMessages);\n\n // 3. Extract trajectory from observability traces\n const { trajectory, traceId } = await extractSessionTrajectory(storage, threadId);\n\n // 4. Build request context from AgentController state\n const requestContext = buildRequestContext(session, threadId);\n\n return {\n agentInput: {\n inputMessages,\n rememberedMessages: [], // AgentController doesn't separate these; memory recall is transparent\n systemMessages,\n taggedSystemMessages: {},\n },\n agentOutput: outputMessages,\n trajectory,\n requestContext,\n threadId,\n traceId,\n };\n}\n\n/**\n * Fetch raw MastraDBMessage[] from memory storage for a thread.\n */\nasync function getRawMessages(\n storage: MastraCompositeStore | undefined,\n threadId: string,\n lastNTurns?: number,\n): Promise<MastraDBMessage[]> {\n if (!storage) return [];\n\n const memoryStore = await storage.getStore('memory');\n if (!memoryStore) return [];\n\n const result = await memoryStore.listMessages({\n threadId,\n perPage: false,\n });\n\n let messages = result.messages;\n\n if (lastNTurns !== undefined && lastNTurns > 0) {\n messages = trimToLastNTurns(messages, lastNTurns);\n }\n\n return messages;\n}\n\n/**\n * Trim messages to the last N user-assistant turn pairs.\n */\nfunction trimToLastNTurns(messages: MastraDBMessage[], turns: number): MastraDBMessage[] {\n // Walk backward, counting user messages as turn boundaries.\n // When we find the Nth user message, slice from there to include\n // that turn and everything after it.\n let turnCount = 0;\n let cutoffIndex = 0;\n\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i]!.role === 'user') {\n turnCount++;\n if (turnCount === turns) {\n cutoffIndex = i;\n break;\n }\n }\n }\n\n return messages.slice(cutoffIndex);\n}\n\n/**\n * Categorize messages into input (user), system, and output (assistant) groups.\n */\nfunction categorizeMessages(messages: MastraDBMessage[]): {\n inputMessages: MastraDBMessage[];\n systemMessages: CoreMessage[];\n outputMessages: MastraDBMessage[];\n} {\n const inputMessages: MastraDBMessage[] = [];\n const systemMessages: CoreSystemMessage[] = [];\n const outputMessages: MastraDBMessage[] = [];\n\n for (const msg of messages) {\n switch (msg.role) {\n case 'user':\n inputMessages.push(msg);\n break;\n case 'system':\n systemMessages.push({\n role: 'system',\n content: extractTextContent(msg),\n });\n break;\n case 'assistant':\n outputMessages.push(msg);\n break;\n }\n }\n\n return { inputMessages, systemMessages, outputMessages };\n}\n\n/**\n * Extract plain text content from a MastraDBMessage.\n */\nfunction extractTextContent(msg: MastraDBMessage): string {\n if (!msg.content?.parts) return '';\n\n return msg.content.parts\n .filter((p): p is { type: 'text'; text: string } => p.type === 'text' && 'text' in p)\n .map(p => p.text)\n .join('\\n');\n}\n\n/**\n * Extract trajectory from trace spans in observability storage.\n * Looks up traces by threadId metadata.\n */\nasync function extractSessionTrajectory(\n storage: MastraCompositeStore | undefined,\n threadId: string,\n): Promise<{ trajectory: Trajectory | undefined; traceId: string | undefined }> {\n if (!storage) return { trajectory: undefined, traceId: undefined };\n\n try {\n const observabilityStore = await storage.getStore('observability');\n if (!observabilityStore) return { trajectory: undefined, traceId: undefined };\n\n // Find traces associated with this thread\n const result = await observabilityStore.listTraces({\n filters: { threadId },\n pagination: { page: 0, perPage: 1 },\n orderBy: { field: 'startedAt', direction: 'DESC' },\n });\n\n if (!result?.spans?.length) return { trajectory: undefined, traceId: undefined };\n\n const traceId = result.spans[0]!.traceId;\n const trace = await observabilityStore.getTrace({ traceId });\n\n if (!trace?.spans?.length) return { trajectory: undefined, traceId };\n\n const trajectory = extractTrajectoryFromTrace(trace.spans);\n return { trajectory, traceId };\n } catch {\n // Trace extraction is best-effort\n return { trajectory: undefined, traceId: undefined };\n }\n}\n\n/**\n * Build request context from AgentController state for scorer evaluation.\n */\nfunction buildRequestContext(session: Session<any>, threadId: string): Record<string, unknown> {\n const state = session.state.get() as Record<string, unknown>;\n\n return {\n threadId,\n mode: state.currentMode ?? state.mode,\n modelId: session.model.get(),\n projectPath: state.projectPath,\n projectName: state.projectName,\n gitBranch: state.gitBranch,\n thinkingLevel: state.thinkingLevel,\n yolo: state.yolo,\n smartEditing: state.smartEditing,\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,4 @@
1
+ export { buildEvalContext } from './context-builder.js';
2
+ export type { MastraCodeEvalContext, BuildContextOptions } from './context-builder.js';
3
+ export { createOutcomeScorer, createEfficiencyScorer } from './scorers/index.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/evals/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,YAAY,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { buildEvalContext } from "./context-builder.js";
2
+ import { createOutcomeScorer, createEfficiencyScorer } from "./scorers/index.js";
3
+ export {
4
+ buildEvalContext,
5
+ createEfficiencyScorer,
6
+ createOutcomeScorer
7
+ };
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/evals/index.ts"],"sourcesContent":["export { buildEvalContext } from './context-builder.js';\nexport type { MastraCodeEvalContext, BuildContextOptions } from './context-builder.js';\nexport { createOutcomeScorer, createEfficiencyScorer } from './scorers/index.js';\n"],"mappings":"AAAA,SAAS,wBAAwB;AAEjC,SAAS,qBAAqB,8BAA8B;","names":[]}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Shared command classification utilities for scoring.
3
+ *
4
+ * Used by both live scorers (outcome.ts) and offline scorers (outcome-match.ts)
5
+ * to consistently identify build, test, and other command types.
6
+ */
7
+ /**
8
+ * Check if a command string is a build/typecheck command.
9
+ * Handles compound commands (e.g. `pnpm build && pnpm test`) by checking each segment.
10
+ */
11
+ export declare function isBuildCommand(command: string): boolean;
12
+ /**
13
+ * Check if a command string is a test command.
14
+ */
15
+ export declare function isTestCommand(command: string): boolean;
16
+ /**
17
+ * Extract exit code from an `execute_command` result.
18
+ * Only trusts explicit exitCode/code fields — no heuristic fallbacks.
19
+ */
20
+ export declare function getExitCode(result: unknown): number | null;
21
+ /**
22
+ * Determine if a tool call result indicates success (exit code 0, no explicit error).
23
+ * Works with both structured result objects and string results.
24
+ */
25
+ export declare function isSuccessResult(result: unknown, error?: unknown): boolean;
26
+ /**
27
+ * Match a file path from tool output against an expected path.
28
+ * Supports exact match and suffix match (e.g. "src/foo.ts" matches "/abs/path/src/foo.ts").
29
+ */
30
+ export declare function matchFilePath(actual: string, expected: string): boolean;
31
+ //# sourceMappingURL=classify-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify-command.d.ts","sourceRoot":"","sources":["../../../src/evals/scorers/classify-command.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAUvD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAgB1D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAiBzE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGvE"}
@@ -0,0 +1,52 @@
1
+ function isBuildCommand(command) {
2
+ const segments = command.split(/\s*(?:&&|\|\||;)\s*/);
3
+ return segments.some((seg) => {
4
+ const trimmed = seg.trim();
5
+ if (!/\b(tsc|typecheck|type-check|build)\b/.test(trimmed)) return false;
6
+ const primaryVerb = trimmed.replace(/^(?:pnpm|npm|yarn|npx|bunx?|turbo)\s+(?:run\s+)?/, "").split(/\s/)[0] ?? "";
7
+ return !/^(test|vitest|jest|mocha|pytest)$/.test(primaryVerb);
8
+ });
9
+ }
10
+ function isTestCommand(command) {
11
+ return /\b(test|vitest|jest|mocha|pytest|spec)\b/.test(command);
12
+ }
13
+ function getExitCode(result) {
14
+ if (result == null) return null;
15
+ if (typeof result === "string") {
16
+ const exitMatch = result.match(/exit(?:ed)?\s+(?:with\s+)?(?:code\s+)?(\d+)/i);
17
+ if (exitMatch) return parseInt(exitMatch[1], 10);
18
+ return null;
19
+ }
20
+ if (typeof result === "object") {
21
+ const obj = result;
22
+ if ("exitCode" in obj && typeof obj.exitCode === "number") return obj.exitCode;
23
+ if ("code" in obj && typeof obj.code === "number") return obj.code;
24
+ }
25
+ return null;
26
+ }
27
+ function isSuccessResult(result, error) {
28
+ if (error) return false;
29
+ if (!result) return false;
30
+ if (typeof result === "object") {
31
+ const obj = result;
32
+ const exitCode = obj.exitCode ?? obj.code;
33
+ if (typeof exitCode === "number") return exitCode === 0;
34
+ }
35
+ if (typeof result === "string") {
36
+ const exitMatch = result.match(/exit(?:ed)?\s+(?:with\s+)?(?:code\s+)?(\d+)/i);
37
+ if (exitMatch) return exitMatch[1] === "0";
38
+ }
39
+ return false;
40
+ }
41
+ function matchFilePath(actual, expected) {
42
+ if (actual === expected) return true;
43
+ return actual.endsWith(`/${expected}`) || expected.endsWith(`/${actual}`);
44
+ }
45
+ export {
46
+ getExitCode,
47
+ isBuildCommand,
48
+ isSuccessResult,
49
+ isTestCommand,
50
+ matchFilePath
51
+ };
52
+ //# sourceMappingURL=classify-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"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":"AAWO,SAAS,eAAe,SAA0B;AACvD,QAAM,WAAW,QAAQ,MAAM,qBAAqB;AACpD,SAAO,SAAS,KAAK,SAAO;AAC1B,UAAM,UAAU,IAAI,KAAK;AACzB,QAAI,CAAC,uCAAuC,KAAK,OAAO,EAAG,QAAO;AAGlE,UAAM,cAAc,QAAQ,QAAQ,oDAAoD,EAAE,EAAE,MAAM,IAAI,EAAE,CAAC,KAAK;AAC9G,WAAO,CAAC,oCAAoC,KAAK,WAAW;AAAA,EAC9D,CAAC;AACH;AAKO,SAAS,cAAc,SAA0B;AACtD,SAAO,2CAA2C,KAAK,OAAO;AAChE;AAMO,SAAS,YAAY,QAAgC;AAC1D,MAAI,UAAU,KAAM,QAAO;AAE3B,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,YAAY,OAAO,MAAM,8CAA8C;AAC7E,QAAI,UAAW,QAAO,SAAS,UAAU,CAAC,GAAI,EAAE;AAChD,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,MAAM;AACZ,QAAI,cAAc,OAAO,OAAO,IAAI,aAAa,SAAU,QAAO,IAAI;AACtE,QAAI,UAAU,OAAO,OAAO,IAAI,SAAS,SAAU,QAAO,IAAI;AAAA,EAChE;AAEA,SAAO;AACT;AAMO,SAAS,gBAAgB,QAAiB,OAA0B;AACzE,MAAI,MAAO,QAAO;AAClB,MAAI,CAAC,OAAQ,QAAO;AAEpB,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,MAAM;AACZ,UAAM,WAAY,IAAI,YAAoC,IAAI;AAC9D,QAAI,OAAO,aAAa,SAAU,QAAO,aAAa;AAAA,EACxD;AAEA,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,YAAY,OAAO,MAAM,8CAA8C;AAC7E,QAAI,UAAW,QAAO,UAAU,CAAC,MAAM;AAAA,EACzC;AAGA,SAAO;AACT;AAMO,SAAS,cAAc,QAAgB,UAA2B;AACvE,MAAI,WAAW,SAAU,QAAO;AAChC,SAAO,OAAO,SAAS,IAAI,QAAQ,EAAE,KAAK,SAAS,SAAS,IAAI,MAAM,EAAE;AAC1E;","names":[]}
@@ -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":"AAeA,SAAS,cAAc,iBAAiB;AAGxC,SAAS,wBAAwB;AAcjC,MAAM,UAAU;AAAA,EACd,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,gBAAgB;AAClB;AAKA,MAAM,aAAa;AAAA;AAAA,EAEjB,0BAA0B;AAAA;AAAA,EAG1B,6BAA6B;AAAA;AAAA,EAG7B,oBAAoB;AAAA;AAAA,EAGpB,yBAAyB;AAAA;AAAA,EAGzB,iCAAiC;AAAA;AAAA,EAGjC,yBAAyB;AAAA;AAAA,EAGzB,WAAW,CAAC,sBAAsB,gBAAgB;AAAA;AAAA,EAGlD,WAAW,CAAC,MAAM;AAAA;AAAA,EAGlB,qBAAqB,CAAC,QAAQ,kBAAkB,cAAc,eAAe,cAAc,aAAa;AAAA;AAAA,EAGxG,cAAc;AAChB;AAKA,SAAS,oBAAoB,UAAqC;AAChE,SAAO,SAAS,OAAO,OAAK,EAAE,SAAS,WAAW,EAAE;AACtD;AAMA,SAAS,gBAAgB,OAA8E;AACrG,MAAI,MAAM,SAAS,EAAG,QAAO,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,gBAAgB;AAG3E,QAAM,gBAAgB,MAAM,OAAO,OAAK,CAAC,WAAW,oBAAoB,SAAS,EAAE,QAAQ,CAAC;AAC5F,MAAI,cAAc,SAAS,EAAG,QAAO,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,6BAA6B;AAEhG,QAAM,eAAe,oBAAI,IAAqD;AAC9E,aAAW,QAAQ,eAAe;AAChC,UAAM,KAAK,GAAG,KAAK,QAAQ,IAAI,KAAK,UAAU,KAAK,IAAI,CAAC;AACxD,UAAM,WAAW,aAAa,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,cAAc,EAAE;AACrE,aAAS;AACT,QAAI,CAAC,KAAK,QAAS,UAAS;AAC5B,iBAAa,IAAI,IAAI,QAAQ;AAAA,EAC/B;AAGA,MAAI,iBAAiB;AACrB,aAAW,EAAE,aAAa,KAAK,aAAa,OAAO,GAAG;AACpD,QAAI,eAAe,EAAG,mBAAkB,eAAe;AAAA,EACzD;AAEA,QAAM,QAAQ,iBAAiB,cAAc;AAC7C,QAAM,aAAa,WAAW;AAC9B,QAAM,QACJ,SAAS,aAAa,IAAI,KAAK,IAAI,GAAG,KAAK,QAAQ,cAAc,WAAW,2BAA2B;AACzG,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,QAAQ,GAAG,cAAc,IAAI,cAAc,MAAM,0BAA0B,QAAQ,KAAK,QAAQ,CAAC,CAAC;AAAA,EACpG;AACF;AAMA,SAAS,eAAe,OAAkD;AACxE,QAAM,YAAY,WAAW;AAC7B,QAAM,iBAAiB,WAAW;AAClC,QAAM,kBAAkB,WAAW;AAEnC,MAAI,SAAS,EAAG,QAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,QAAQ;AAC3D,MAAI,SAAS,UAAW,QAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,+BAA+B;AAC1F,MAAI,SAAS,IAAI;AACf,UAAMA,SAAQ,KAAK,QAAQ,aAAa;AACxC,WAAO,EAAE,OAAAA,QAAO,QAAQ,GAAG,KAAK,6BAA6B;AAAA,EAC/D;AAEA,QAAM,cAAc,KAAK,aAAa;AACtC,QAAM,QAAQ,KAAK,IAAI,GAAG,IAAI,cAAc,QAAQ,MAAM,eAAe;AACzE,SAAO,EAAE,OAAO,QAAQ,GAAG,KAAK,4BAA4B;AAC9D;AAMA,SAAS,qBAAqB,OAA+D;AAC3F,MAAI,MAAM,SAAS,EAAG,QAAO,EAAE,OAAO,GAAG,QAAQ,gBAAgB;AAGjE,QAAM,WAAW,CAAC,SAAoC;AACpD,UAAM,OAAO,OAAO,KAAK,KAAK,QAAQ,KAAK,KAAK,WAAW,EAAE;AAC7D,WAAO,GAAG,KAAK,QAAQ,IAAI,IAAI;AAAA,EACjC;AAEA,QAAM,UAAU,oBAAI,IAAiC;AACrD,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,SAAS,IAAI;AACzB,UAAM,MAAM,QAAQ,IAAI,GAAG,KAAK,CAAC;AACjC,QAAI,KAAK,IAAI;AACb,YAAQ,IAAI,KAAK,GAAG;AAAA,EACtB;AAEA,MAAI,mBAAmB;AACvB,MAAI,mBAAmB;AACvB,QAAM,YAAY,WAAW;AAE7B,aAAW,CAAC,EAAE,SAAS,KAAK,SAAS;AACnC,QAAI,sBAAsB;AAC1B,eAAW,QAAQ,WAAW;AAC5B,UAAI,KAAK,SAAS;AAChB;AAAA,MACF,OAAO;AACL,YAAI,sBAAsB,GAAG;AAC3B;AACA,cAAI,uBAAuB,UAAW;AAAA,QACxC;AACA,8BAAsB;AAAA,MACxB;AAAA,IACF;AAEA,QAAI,sBAAsB,GAAG;AAC3B;AACA,UAAI,uBAAuB,UAAW;AAAA,IACxC;AAAA,EACF;AAEA,MAAI,qBAAqB,EAAG,QAAO,EAAE,OAAO,GAAG,QAAQ,kBAAkB;AACzE,MAAI,qBAAqB,EAAG,QAAO,EAAE,OAAO,KAAK,QAAQ,GAAG,gBAAgB,wCAAwC;AAEpH,QAAM,QAAQ,KAAK,IAAI,GAAG,MAAM,mBAAmB,GAAG;AACtD,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,GAAG,gBAAgB,8BAA8B,SAAS;AAAA,EACpE;AACF;AAMA,SAAS,oBAAoB,OAA+D;AAC1F,QAAM,YAAY,WAAW;AAC7B,QAAM,YAAY,WAAW;AAE7B,QAAM,QAAQ,MAAM,OAAO,OAAK,UAAU,SAAS,EAAE,QAAQ,CAAC;AAC9D,MAAI,MAAM,WAAW,EAAG,QAAO,EAAE,OAAO,GAAG,QAAQ,oBAAoB;AAIvE,QAAM,YAAY,oBAAI,IAAY;AAClC,MAAI,YAAY;AAChB,MAAI,QAAQ;AAEZ,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC3C,QAAI,CAAC,QAAS;AAEd,QAAI,UAAU,SAAS,KAAK,QAAQ,GAAG;AACrC,gBAAU,IAAI,OAAO;AAAA,IACvB,WAAW,UAAU,SAAS,KAAK,QAAQ,GAAG;AAC5C;AACA,UAAI,YAAY,WAAW,OAAO,GAAG;AACnC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,UAAU,EAAG,QAAO,EAAE,OAAO,GAAG,QAAQ,yBAAyB;AAErE,QAAM,QAAQ,YAAY;AAC1B,QAAM,aAAa,QAAQ;AAC3B,MAAI,eAAe,EAAG,QAAO,EAAE,OAAO,GAAG,QAAQ,OAAO,KAAK,yBAAyB;AACtF,SAAO,EAAE,OAAO,OAAO,QAAQ,GAAG,UAAU,IAAI,KAAK,4BAA4B;AACnF;AAGA,SAAS,YAAY,WAAwB,UAA2B;AACtE,MAAI,UAAU,IAAI,QAAQ,EAAG,QAAO;AACpC,aAAW,MAAM,WAAW;AAC1B,QAAI,GAAG,SAAS,IAAI,QAAQ,EAAE,KAAK,SAAS,SAAS,IAAI,EAAE,EAAE,EAAG,QAAO;AAAA,EACzE;AACA,SAAO;AACT;AAEO,SAAS,yBAAyB;AACvC,SAAO,aAAa;AAAA,IAClB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,IACF,MAAM;AAAA,IACN,YAAY,UAAU,EAAE,WAAW,CAAC,mBAAmB,MAAM,EAAE,CAAC;AAAA,EAClE,CAAC,EACE,WAAW,OAAO,EAAE,IAAI,MAAM;AAC7B,UAAM,WAAY,IAAI,UAAU,CAAC;AACjC,UAAM,QAAQ,iBAAiB,QAAQ;AACvC,UAAM,QAAQ,oBAAoB,QAAQ;AAG1C,QAAI,MAAM,SAAS,WAAW,cAAc;AAC1C,aAAO,EAAE,OAAO,MAAe,YAAY,MAAM,QAAQ,YAAY,MAAM;AAAA,IAC7E;AAEA,UAAM,aAAa,gBAAgB,KAAK;AACxC,UAAM,YAAY,eAAe,KAAK;AACtC,UAAM,kBAAkB,qBAAqB,KAAK;AAClD,UAAM,iBAAiB,oBAAoB,KAAK;AAEhD,WAAO;AAAA,MACL,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,MAAM;AAAA,MAClB,YAAY;AAAA,IACd;AAAA,EACF,CAAC,EACA,cAAc,CAAC,EAAE,QAAQ,MAAM;AAC9B,UAAM,IAAI,QAAQ;AAClB,QAAI,EAAE,MAAO,QAAO;AAEpB,UAAM,QACJ,EAAE,WAAW,QAAQ,QAAQ,aAC7B,EAAE,UAAU,QAAQ,QAAQ,YAC5B,EAAE,gBAAgB,QAAQ,QAAQ,kBAClC,EAAE,eAAe,QAAQ,QAAQ;AAEnC,WAAO,KAAK,MAAM,QAAQ,GAAG,IAAI;AAAA,EACnC,CAAC,EACA,eAAe,CAAC,EAAE,SAAS,MAAM,MAAM;AACtC,UAAM,IAAI,QAAQ;AAClB,QAAI,EAAE,OAAO;AACX,aAAO,aAAa,EAAE,UAAU;AAAA,IAClC;AAEA,UAAM,MAAM,CAAC,MAAc,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC;AAClD,UAAM,QAAkB,CAAC,UAAU,KAAK,KAAK,EAAE,UAAU,WAAW,EAAE,UAAU,SAAS;AAEzF,UAAM,KAAK,eAAe,IAAI,QAAQ,UAAU,CAAC,MAAM,EAAE,WAAW,MAAM,KAAK,EAAE,WAAW,KAAK,GAAG;AACpG,UAAM,KAAK,eAAe,IAAI,QAAQ,SAAS,CAAC,MAAM,EAAE,UAAU,MAAM,KAAK,EAAE,UAAU,KAAK,GAAG;AACjG,UAAM;AAAA,MACJ,qBAAqB,IAAI,QAAQ,eAAe,CAAC,MAAM,EAAE,gBAAgB,MAAM,KAAK,EAAE,gBAAgB,KAAK;AAAA,IAC7G;AACA,UAAM;AAAA,MACJ,qBAAqB,IAAI,QAAQ,cAAc,CAAC,MAAM,EAAE,eAAe,MAAM,KAAK,EAAE,eAAe,KAAK;AAAA,IAC1G;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB,CAAC;AACL;","names":["score"]}