stageflow 0.40.0 → 0.44.0

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 (519) hide show
  1. package/README.md +15 -4
  2. package/dist/agent/activity.d.ts +18 -0
  3. package/dist/agent/claudeAdapter.js +7 -0
  4. package/dist/agent/claudeTools.d.ts +27 -18
  5. package/dist/agent/claudeTools.js +54 -15
  6. package/dist/agent/compactionEvents.d.ts +34 -0
  7. package/dist/agent/compactionEvents.js +37 -0
  8. package/dist/agent/openRouterRouting.d.ts +7 -0
  9. package/dist/agent/openRouterRouting.js +23 -0
  10. package/dist/agent/piAdapter.d.ts +6 -0
  11. package/dist/agent/piAdapter.js +128 -27
  12. package/dist/agent/piSettings.d.ts +7 -0
  13. package/dist/agent/piSettings.js +9 -0
  14. package/dist/agent/sandboxPiTools.d.ts +3 -1
  15. package/dist/agent/sandboxPiTools.js +8 -2
  16. package/dist/agent/stageTurnDriver.d.ts +11 -2
  17. package/dist/agent/stageTurnDriver.js +45 -4
  18. package/dist/agent/toolOutputBudget.d.ts +15 -1
  19. package/dist/agent/toolOutputBudget.js +18 -0
  20. package/dist/agent/toolOutputBudgetExtension.d.ts +2 -0
  21. package/dist/agent/toolOutputBudgetExtension.js +40 -3
  22. package/dist/agents/authorChat.d.ts +5 -0
  23. package/dist/agents/authorChat.js +120 -12
  24. package/dist/agents/authorSessionStore.d.ts +38 -0
  25. package/dist/agents/authorSessionStore.js +167 -0
  26. package/dist/agents/chatTurn.d.ts +2 -0
  27. package/dist/agents/chatTurn.js +17 -1
  28. package/dist/agents/errors.d.ts +1 -1
  29. package/dist/agents/errors.js +1 -0
  30. package/dist/agents/evalGate.d.ts +61 -0
  31. package/dist/agents/evalGate.js +103 -0
  32. package/dist/agents/evalSession.d.ts +26 -0
  33. package/dist/agents/evalSession.js +29 -0
  34. package/dist/agents/hostContext.d.ts +4 -1
  35. package/dist/agents/hostContext.js +4 -1
  36. package/dist/agents/runtime/piRuntime.d.ts +6 -2
  37. package/dist/agents/runtime/piRuntime.js +50 -16
  38. package/dist/agents/runtime/types.d.ts +3 -1
  39. package/dist/agents/service.d.ts +27 -2
  40. package/dist/agents/service.js +91 -15
  41. package/dist/agents/sessions.d.ts +8 -0
  42. package/dist/agents/sessions.js +53 -11
  43. package/dist/agents/store.d.ts +14 -3
  44. package/dist/agents/store.js +45 -7
  45. package/dist/agents/toolRisk.d.ts +21 -0
  46. package/dist/agents/toolRisk.js +50 -0
  47. package/dist/cli/doctorCommand.js +26 -0
  48. package/dist/cli/evalCommand.d.ts +20 -0
  49. package/dist/cli/evalCommand.js +720 -0
  50. package/dist/cli/exportAllCommand.js +1 -1
  51. package/dist/cli/hostClient.d.ts +60 -0
  52. package/dist/cli/hostClient.js +71 -0
  53. package/dist/cli/validateOutput.d.ts +2 -2
  54. package/dist/cli/validateOutput.js +2 -2
  55. package/dist/cli.js +10 -0
  56. package/dist/compaction/directives.d.ts +18 -0
  57. package/dist/compaction/directives.js +119 -0
  58. package/dist/compaction/extension.d.ts +20 -0
  59. package/dist/compaction/extension.js +78 -0
  60. package/dist/compaction/mask.d.ts +18 -0
  61. package/dist/compaction/mask.js +155 -0
  62. package/dist/compaction/pin.d.ts +21 -0
  63. package/dist/compaction/pin.js +270 -0
  64. package/dist/compaction/scrub.d.ts +7 -0
  65. package/dist/compaction/scrub.js +26 -0
  66. package/dist/compaction/sessionWiring.d.ts +22 -0
  67. package/dist/compaction/sessionWiring.js +26 -0
  68. package/dist/compaction/summarize.d.ts +79 -0
  69. package/dist/compaction/summarize.js +171 -0
  70. package/dist/compaction/toolPolicy.d.ts +3 -0
  71. package/dist/compaction/toolPolicy.js +33 -0
  72. package/dist/compaction/types.d.ts +45 -0
  73. package/dist/compaction/types.js +7 -0
  74. package/dist/compaction/workingState.d.ts +56 -0
  75. package/dist/compaction/workingState.js +198 -0
  76. package/dist/config/atomicWrite.d.ts +15 -0
  77. package/dist/config/atomicWrite.js +43 -0
  78. package/dist/config/browseCatalog.d.ts +2 -0
  79. package/dist/config/browseCatalog.js +4 -2
  80. package/dist/config/createPipeline.js +2 -0
  81. package/dist/config/createTrigger.js +7 -1
  82. package/dist/config/csv.d.ts +9 -0
  83. package/dist/config/csv.js +81 -0
  84. package/dist/config/datasetAgentCheck.d.ts +18 -0
  85. package/dist/config/datasetAgentCheck.js +109 -0
  86. package/dist/config/datasetCandidates.d.ts +22 -0
  87. package/dist/config/datasetCandidates.js +86 -0
  88. package/dist/config/datasetFromSessions.d.ts +34 -0
  89. package/dist/config/datasetFromSessions.js +105 -0
  90. package/dist/config/datasetHash.d.ts +1 -0
  91. package/dist/config/datasetHash.js +4 -0
  92. package/dist/config/datasetImport.d.ts +21 -0
  93. package/dist/config/datasetImport.js +120 -0
  94. package/dist/config/datasetStageCheck.d.ts +9 -0
  95. package/dist/config/datasetStageCheck.js +17 -0
  96. package/dist/config/datasetTypes.d.ts +27 -0
  97. package/dist/config/datasetTypes.js +1 -0
  98. package/dist/config/ensureCatalogScanRoot.d.ts +4 -1
  99. package/dist/config/ensureCatalogScanRoot.js +8 -6
  100. package/dist/config/evalCatalog.d.ts +22 -0
  101. package/dist/config/evalCatalog.js +95 -0
  102. package/dist/config/evalWriteRoots.d.ts +17 -0
  103. package/dist/config/evalWriteRoots.js +109 -0
  104. package/dist/config/githubTriggerAction.d.ts +8 -0
  105. package/dist/config/githubTriggerAction.js +29 -0
  106. package/dist/config/hostConfig.js +3 -0
  107. package/dist/config/installEvalSample.d.ts +34 -0
  108. package/dist/config/installEvalSample.js +182 -0
  109. package/dist/config/loadDataset.d.ts +16 -0
  110. package/dist/config/loadDataset.js +318 -0
  111. package/dist/config/loadEval.d.ts +32 -0
  112. package/dist/config/loadEval.js +1103 -0
  113. package/dist/config/loadOutcome.d.ts +5 -0
  114. package/dist/config/loadStageflowManifest.js +64 -0
  115. package/dist/config/pipelineNeeds.d.ts +2 -0
  116. package/dist/config/pipelineNeeds.js +16 -3
  117. package/dist/config/pipelineRoute.js +5 -4
  118. package/dist/config/resolveAgentTarget.d.ts +32 -0
  119. package/dist/config/resolveAgentTarget.js +118 -0
  120. package/dist/config/resolveEvalTarget.d.ts +21 -0
  121. package/dist/config/resolveEvalTarget.js +89 -0
  122. package/dist/config/scanCatalogPaths.d.ts +1 -1
  123. package/dist/config/scanCatalogPaths.js +17 -5
  124. package/dist/config/validateCatalog.d.ts +2 -2
  125. package/dist/config/validateCatalog.js +21 -1
  126. package/dist/config/validateEval.d.ts +36 -0
  127. package/dist/config/validateEval.js +446 -0
  128. package/dist/config/writeDataset.d.ts +54 -0
  129. package/dist/config/writeDataset.js +186 -0
  130. package/dist/config/writeEval.d.ts +25 -0
  131. package/dist/config/writeEval.js +398 -0
  132. package/dist/diagnostics/checks.js +1 -1
  133. package/dist/envelope/assertEmittedArtifacts.d.ts +12 -0
  134. package/dist/envelope/assertEmittedArtifacts.js +43 -0
  135. package/dist/envelope/preEmitChecks.d.ts +3 -0
  136. package/dist/evals/agentDiff.d.ts +13 -0
  137. package/dist/evals/agentDiff.js +11 -0
  138. package/dist/evals/canonical.d.ts +3 -0
  139. package/dist/evals/canonical.js +24 -0
  140. package/dist/evals/caseTask.d.ts +3 -0
  141. package/dist/evals/caseTask.js +9 -0
  142. package/dist/evals/compare.d.ts +94 -0
  143. package/dist/evals/compare.js +201 -0
  144. package/dist/evals/constants.d.ts +62 -0
  145. package/dist/evals/constants.js +97 -0
  146. package/dist/evals/engine/FakeEngine.d.ts +33 -0
  147. package/dist/evals/engine/FakeEngine.js +177 -0
  148. package/dist/evals/engine/index.d.ts +9 -0
  149. package/dist/evals/engine/index.js +19 -0
  150. package/dist/evals/engine/promptfoo/PromptfooEngine.d.ts +52 -0
  151. package/dist/evals/engine/promptfoo/PromptfooEngine.js +312 -0
  152. package/dist/evals/engine/promptfoo/errors.d.ts +5 -0
  153. package/dist/evals/engine/promptfoo/errors.js +8 -0
  154. package/dist/evals/engine/promptfoo/generate.d.ts +30 -0
  155. package/dist/evals/engine/promptfoo/generate.js +345 -0
  156. package/dist/evals/engine/promptfoo/guard.d.ts +10 -0
  157. package/dist/evals/engine/promptfoo/guard.js +116 -0
  158. package/dist/evals/engine/promptfoo/install.d.ts +17 -0
  159. package/dist/evals/engine/promptfoo/install.js +73 -0
  160. package/dist/evals/engine/promptfoo/judgeProviders.d.ts +2 -0
  161. package/dist/evals/engine/promptfoo/judgeProviders.js +9 -0
  162. package/dist/evals/engine/promptfoo/judgeServices.d.ts +6 -0
  163. package/dist/evals/engine/promptfoo/judgeServices.js +41 -0
  164. package/dist/evals/engine/promptfoo/locate.d.ts +21 -0
  165. package/dist/evals/engine/promptfoo/locate.js +68 -0
  166. package/dist/evals/engine/promptfoo/nodeVersion.d.ts +7 -0
  167. package/dist/evals/engine/promptfoo/nodeVersion.js +14 -0
  168. package/dist/evals/engine/promptfoo/normalize.d.ts +66 -0
  169. package/dist/evals/engine/promptfoo/normalize.js +261 -0
  170. package/dist/evals/engine/promptfoo/pinned.d.ts +5 -0
  171. package/dist/evals/engine/promptfoo/pinned.js +5 -0
  172. package/dist/evals/engine/promptfoo/rubricPrompt.d.ts +14 -0
  173. package/dist/evals/engine/promptfoo/rubricPrompt.js +105 -0
  174. package/dist/evals/engine/promptfoo/runTokens.d.ts +18 -0
  175. package/dist/evals/engine/promptfoo/runTokens.js +31 -0
  176. package/dist/evals/engine/promptfoo/status.d.ts +13 -0
  177. package/dist/evals/engine/promptfoo/status.js +16 -0
  178. package/dist/evals/estimate.d.ts +56 -0
  179. package/dist/evals/estimate.js +66 -0
  180. package/dist/evals/graders/codeGrader.d.ts +6 -0
  181. package/dist/evals/graders/codeGrader.js +85 -0
  182. package/dist/evals/graders/conversationCheckGrader.d.ts +6 -0
  183. package/dist/evals/graders/conversationCheckGrader.js +62 -0
  184. package/dist/evals/graders/fieldGrader.d.ts +11 -0
  185. package/dist/evals/graders/fieldGrader.js +117 -0
  186. package/dist/evals/graders/goal.d.ts +3 -0
  187. package/dist/evals/graders/goal.js +14 -0
  188. package/dist/evals/graders/index.d.ts +18 -0
  189. package/dist/evals/graders/index.js +34 -0
  190. package/dist/evals/graders/notApplicable.d.ts +5 -0
  191. package/dist/evals/graders/notApplicable.js +9 -0
  192. package/dist/evals/graders/path.d.ts +26 -0
  193. package/dist/evals/graders/path.js +75 -0
  194. package/dist/evals/graders/referenceGrader.d.ts +5 -0
  195. package/dist/evals/graders/referenceGrader.js +59 -0
  196. package/dist/evals/graders/schemaGrader.d.ts +5 -0
  197. package/dist/evals/graders/schemaGrader.js +29 -0
  198. package/dist/evals/graders/subject.d.ts +6 -0
  199. package/dist/evals/graders/subject.js +33 -0
  200. package/dist/evals/graders/toolCallsGrader.d.ts +6 -0
  201. package/dist/evals/graders/toolCallsGrader.js +100 -0
  202. package/dist/evals/graders/transcript.d.ts +12 -0
  203. package/dist/evals/graders/transcript.js +57 -0
  204. package/dist/evals/graders/types.d.ts +20 -0
  205. package/dist/evals/graders/types.js +1 -0
  206. package/dist/evals/judgeProviders.d.ts +16 -0
  207. package/dist/evals/judgeProviders.js +27 -0
  208. package/dist/evals/lineDiff.d.ts +5 -0
  209. package/dist/evals/lineDiff.js +34 -0
  210. package/dist/evals/listStatus.d.ts +31 -0
  211. package/dist/evals/listStatus.js +48 -0
  212. package/dist/evals/manager.d.ts +187 -0
  213. package/dist/evals/manager.js +795 -0
  214. package/dist/evals/plan.d.ts +65 -0
  215. package/dist/evals/plan.js +621 -0
  216. package/dist/evals/planInternalAgent.d.ts +19 -0
  217. package/dist/evals/planInternalAgent.js +205 -0
  218. package/dist/evals/providerKeys.d.ts +1 -0
  219. package/dist/evals/providerKeys.js +21 -0
  220. package/dist/evals/read/agentTargets.d.ts +37 -0
  221. package/dist/evals/read/agentTargets.js +101 -0
  222. package/dist/evals/read/api.d.ts +208 -0
  223. package/dist/evals/read/api.js +363 -0
  224. package/dist/evals/read/compare.d.ts +4 -0
  225. package/dist/evals/read/compare.js +39 -0
  226. package/dist/evals/read/datasets.d.ts +105 -0
  227. package/dist/evals/read/datasets.js +318 -0
  228. package/dist/evals/read/list.d.ts +66 -0
  229. package/dist/evals/read/list.js +182 -0
  230. package/dist/evals/read/results.d.ts +46 -0
  231. package/dist/evals/read/results.js +107 -0
  232. package/dist/evals/read/runs.d.ts +154 -0
  233. package/dist/evals/read/runs.js +295 -0
  234. package/dist/evals/read/suggestions.d.ts +43 -0
  235. package/dist/evals/read/suggestions.js +73 -0
  236. package/dist/evals/runner/FakeAgentBackend.d.ts +40 -0
  237. package/dist/evals/runner/FakeAgentBackend.js +82 -0
  238. package/dist/evals/runner/agentCaseRunner.d.ts +24 -0
  239. package/dist/evals/runner/agentCaseRunner.js +388 -0
  240. package/dist/evals/runner/caseRunner.d.ts +8 -0
  241. package/dist/evals/runner/caseRunner.js +28 -0
  242. package/dist/evals/runner/conversationSubject.d.ts +18 -0
  243. package/dist/evals/runner/conversationSubject.js +123 -0
  244. package/dist/evals/runner/internalAgentCaseRunner.d.ts +6 -0
  245. package/dist/evals/runner/internalAgentCaseRunner.js +250 -0
  246. package/dist/evals/runner/simulatorModel.d.ts +51 -0
  247. package/dist/evals/runner/simulatorModel.js +58 -0
  248. package/dist/evals/runner/simulatorPrompt.d.ts +29 -0
  249. package/dist/evals/runner/simulatorPrompt.js +59 -0
  250. package/dist/evals/runner/stageCaseRunner.d.ts +30 -0
  251. package/dist/evals/runner/stageCaseRunner.js +279 -0
  252. package/dist/evals/runner/userDriver.d.ts +71 -0
  253. package/dist/evals/runner/userDriver.js +104 -0
  254. package/dist/evals/scoring.d.ts +34 -0
  255. package/dist/evals/scoring.js +67 -0
  256. package/dist/evals/snapshot.d.ts +191 -0
  257. package/dist/evals/snapshot.js +70 -0
  258. package/dist/evals/stageDiff.d.ts +8 -0
  259. package/dist/evals/stageDiff.js +48 -0
  260. package/dist/evals/stats.d.ts +95 -0
  261. package/dist/evals/stats.js +220 -0
  262. package/dist/evals/statsAdapter.d.ts +4 -0
  263. package/dist/evals/statsAdapter.js +30 -0
  264. package/dist/evals/statsTypes.d.ts +51 -0
  265. package/dist/evals/statsTypes.js +18 -0
  266. package/dist/evals/storeError.d.ts +5 -0
  267. package/dist/evals/storeError.js +8 -0
  268. package/dist/evals/storeTypes.d.ts +207 -0
  269. package/dist/evals/storeTypes.js +1 -0
  270. package/dist/evals/tTable.d.ts +3 -0
  271. package/dist/evals/tTable.js +15 -0
  272. package/dist/evals/triage/constants.d.ts +26 -0
  273. package/dist/evals/triage/constants.js +33 -0
  274. package/dist/evals/triage/credentials.d.ts +13 -0
  275. package/dist/evals/triage/credentials.js +20 -0
  276. package/dist/evals/triage/jevClassifier.d.ts +14 -0
  277. package/dist/evals/triage/jevClassifier.js +124 -0
  278. package/dist/evals/triage/judgeClassifier.d.ts +10 -0
  279. package/dist/evals/triage/judgeClassifier.js +76 -0
  280. package/dist/evals/triage/prompts.d.ts +16 -0
  281. package/dist/evals/triage/prompts.js +64 -0
  282. package/dist/evals/triage/service.d.ts +79 -0
  283. package/dist/evals/triage/service.js +217 -0
  284. package/dist/evals/triage/stateBuilder.d.ts +19 -0
  285. package/dist/evals/triage/stateBuilder.js +125 -0
  286. package/dist/evals/triage/types.d.ts +60 -0
  287. package/dist/evals/triage/types.js +8 -0
  288. package/dist/evals/types.d.ts +357 -0
  289. package/dist/evals/types.js +4 -0
  290. package/dist/guide/cardContract.d.ts +133 -0
  291. package/dist/guide/cardContract.js +156 -0
  292. package/dist/guide/chat.d.ts +45 -0
  293. package/dist/guide/chat.js +378 -0
  294. package/dist/guide/knowledge/index.d.ts +14 -0
  295. package/dist/guide/knowledge/index.js +109 -0
  296. package/dist/guide/knowledge/topics/agents.d.ts +2 -0
  297. package/dist/guide/knowledge/topics/agents.js +58 -0
  298. package/dist/guide/knowledge/topics/bestPractices.d.ts +2 -0
  299. package/dist/guide/knowledge/topics/bestPractices.js +67 -0
  300. package/dist/guide/knowledge/topics/connections.d.ts +2 -0
  301. package/dist/guide/knowledge/topics/connections.js +66 -0
  302. package/dist/guide/knowledge/topics/consoleMap.d.ts +2 -0
  303. package/dist/guide/knowledge/topics/consoleMap.js +55 -0
  304. package/dist/guide/knowledge/topics/evals.d.ts +2 -0
  305. package/dist/guide/knowledge/topics/evals.js +72 -0
  306. package/dist/guide/knowledge/topics/limitations.d.ts +2 -0
  307. package/dist/guide/knowledge/topics/limitations.js +84 -0
  308. package/dist/guide/knowledge/topics/mcpSkillsBrowser.d.ts +2 -0
  309. package/dist/guide/knowledge/topics/mcpSkillsBrowser.js +57 -0
  310. package/dist/guide/knowledge/topics/memories.d.ts +2 -0
  311. package/dist/guide/knowledge/topics/memories.js +63 -0
  312. package/dist/guide/knowledge/topics/modelsAndProviders.d.ts +2 -0
  313. package/dist/guide/knowledge/topics/modelsAndProviders.js +56 -0
  314. package/dist/guide/knowledge/topics/overview.d.ts +2 -0
  315. package/dist/guide/knowledge/topics/overview.js +56 -0
  316. package/dist/guide/knowledge/topics/pipelines.d.ts +2 -0
  317. package/dist/guide/knowledge/topics/pipelines.js +93 -0
  318. package/dist/guide/knowledge/topics/stages.d.ts +2 -0
  319. package/dist/guide/knowledge/topics/stages.js +54 -0
  320. package/dist/guide/knowledge/topics/tasks.d.ts +2 -0
  321. package/dist/guide/knowledge/topics/tasks.js +52 -0
  322. package/dist/guide/knowledge/topics/triggers.d.ts +2 -0
  323. package/dist/guide/knowledge/topics/triggers.js +68 -0
  324. package/dist/guide/knowledge/topics/troubleshooting.d.ts +2 -0
  325. package/dist/guide/knowledge/topics/troubleshooting.js +85 -0
  326. package/dist/guide/knowledgeTools.d.ts +2 -0
  327. package/dist/guide/knowledgeTools.js +56 -0
  328. package/dist/guide/showUi.d.ts +6 -0
  329. package/dist/guide/showUi.js +546 -0
  330. package/dist/guide/threadStore.d.ts +48 -0
  331. package/dist/guide/threadStore.js +189 -0
  332. package/dist/guide/writeRoot.d.ts +11 -0
  333. package/dist/guide/writeRoot.js +70 -0
  334. package/dist/hosted/translate.js +2 -0
  335. package/dist/mcp/agentTools.js +12 -0
  336. package/dist/mcp/catalogTools.js +18 -20
  337. package/dist/mcp/catalogWriteTools.d.ts +8 -0
  338. package/dist/mcp/catalogWriteTools.js +225 -0
  339. package/dist/mcp/connectionTools.d.ts +3 -0
  340. package/dist/mcp/connectionTools.js +85 -0
  341. package/dist/mcp/controlTools.js +34 -1
  342. package/dist/mcp/deps.d.ts +16 -0
  343. package/dist/mcp/evalTools.d.ts +3 -0
  344. package/dist/mcp/evalTools.js +943 -0
  345. package/dist/mcp/memoryHostTools.d.ts +3 -0
  346. package/dist/mcp/memoryHostTools.js +72 -0
  347. package/dist/mcp/pipelineAuthorTools.js +14 -1
  348. package/dist/mcp/server.js +6 -0
  349. package/dist/mcp/tools.js +8 -0
  350. package/dist/mcp/triggerTools.js +77 -31
  351. package/dist/models/response.d.ts +7 -2
  352. package/dist/models/response.js +6 -1
  353. package/dist/operatorAgent/agentAuthorContext.d.ts +1 -1
  354. package/dist/operatorAgent/agentAuthorContext.js +1 -1
  355. package/dist/operatorAgent/evalGate.d.ts +22 -0
  356. package/dist/operatorAgent/evalGate.js +77 -0
  357. package/dist/operatorAgent/fakeHost.js +10 -2
  358. package/dist/operatorAgent/host.js +18 -2
  359. package/dist/operatorAgent/index.d.ts +1 -0
  360. package/dist/operatorAgent/index.js +1 -0
  361. package/dist/operatorAgent/internalAgents.d.ts +11 -0
  362. package/dist/operatorAgent/internalAgents.js +13 -0
  363. package/dist/operatorAgent/piModel.d.ts +5 -1
  364. package/dist/operatorAgent/piModel.js +32 -14
  365. package/dist/operatorAgent/profiles/agentAuthor.d.ts +3 -1
  366. package/dist/operatorAgent/profiles/agentAuthor.js +201 -32
  367. package/dist/operatorAgent/profiles/agentAuthorPlaybook.d.ts +1 -1
  368. package/dist/operatorAgent/profiles/agentAuthorPlaybook.js +48 -15
  369. package/dist/operatorAgent/profiles/authorReadable.d.ts +2 -0
  370. package/dist/operatorAgent/profiles/authorReadable.js +26 -0
  371. package/dist/operatorAgent/profiles/guideConfirm.d.ts +21 -0
  372. package/dist/operatorAgent/profiles/guideConfirm.js +100 -0
  373. package/dist/operatorAgent/profiles/guideTools.d.ts +7 -0
  374. package/dist/operatorAgent/profiles/guideTools.js +123 -0
  375. package/dist/operatorAgent/profiles/stageflowGuide.d.ts +7 -0
  376. package/dist/operatorAgent/profiles/stageflowGuide.js +132 -0
  377. package/dist/operatorAgent/profiles/workshopAuthor.js +23 -0
  378. package/dist/operatorAgent/profiles/workshopAuthorPlaybook.d.ts +1 -1
  379. package/dist/operatorAgent/profiles/workshopAuthorPlaybook.js +9 -1
  380. package/dist/operatorAgent/profiles/workshopAuthorTools.d.ts +2 -0
  381. package/dist/operatorAgent/profiles/workshopAuthorTools.js +197 -9
  382. package/dist/operatorAgent/types.d.ts +23 -0
  383. package/dist/package-meta.d.ts +1 -1
  384. package/dist/package-meta.js +1 -1
  385. package/dist/runstore/port.d.ts +43 -0
  386. package/dist/runstore/retention.d.ts +2 -1
  387. package/dist/runstore/retention.js +3 -7
  388. package/dist/runstore/runStatusClock.d.ts +17 -0
  389. package/dist/runstore/runStatusClock.js +19 -0
  390. package/dist/runstore/sqlite/SqliteRunStore.d.ts +29 -0
  391. package/dist/runstore/sqlite/SqliteRunStore.js +144 -50
  392. package/dist/runstore/sqlite/evalStore.d.ts +20 -0
  393. package/dist/runstore/sqlite/evalStore.js +541 -0
  394. package/dist/runstore/sqlite/migrations/015-evals.d.ts +12 -0
  395. package/dist/runstore/sqlite/migrations/015-evals.js +157 -0
  396. package/dist/runstore/sqlite/migrations/016-eval-subject-ref.d.ts +12 -0
  397. package/dist/runstore/sqlite/migrations/016-eval-subject-ref.js +20 -0
  398. package/dist/runstore/sqlite/migrations/017-eval-result-suggestions.d.ts +11 -0
  399. package/dist/runstore/sqlite/migrations/017-eval-result-suggestions.js +36 -0
  400. package/dist/runstore/sqlite/migrations/index.js +6 -0
  401. package/dist/runstore/sqlite/suggestionStore.d.ts +14 -0
  402. package/dist/runstore/sqlite/suggestionStore.js +132 -0
  403. package/dist/runstore/workspaceLayout.js +6 -1
  404. package/dist/runtime/artifactDiskInspect.d.ts +14 -0
  405. package/dist/runtime/artifactDiskInspect.js +52 -0
  406. package/dist/runtime/artifactPath.d.ts +24 -0
  407. package/dist/runtime/artifactPath.js +84 -0
  408. package/dist/runtime/completionCheckRunner.js +15 -43
  409. package/dist/runtime/githubPollSource.d.ts +22 -4
  410. package/dist/runtime/githubPollSource.js +93 -8
  411. package/dist/runtime/pipelineRunner.d.ts +2 -1
  412. package/dist/runtime/pipelineRunner.js +2 -0
  413. package/dist/runtime/priorArtifactGrants.d.ts +8 -0
  414. package/dist/runtime/priorArtifactGrants.js +105 -0
  415. package/dist/runtime/runActionEligibility.d.ts +46 -0
  416. package/dist/runtime/runActionEligibility.js +123 -0
  417. package/dist/runtime/runManager.d.ts +6 -2
  418. package/dist/runtime/runManager.js +60 -16
  419. package/dist/runtime/runRetentionSweep.js +2 -2
  420. package/dist/runtime/runRetryCoordinator.d.ts +2 -14
  421. package/dist/runtime/runRetryCoordinator.js +3 -67
  422. package/dist/runtime/sandboxContainer.d.ts +7 -0
  423. package/dist/runtime/sandboxContainer.js +48 -6
  424. package/dist/runtime/sandboxDesk.d.ts +2 -1
  425. package/dist/runtime/sandboxDesk.js +11 -12
  426. package/dist/runtime/stageEnvironment.js +1 -0
  427. package/dist/runtime/stageRoots.d.ts +12 -0
  428. package/dist/runtime/stageSandbox.d.ts +2 -1
  429. package/dist/runtime/stageSandbox.js +18 -2
  430. package/dist/runtime/stageWorker.js +20 -0
  431. package/dist/server/agentAuthorRoutes.js +59 -1
  432. package/dist/server/bootstrap.d.ts +13 -0
  433. package/dist/server/bootstrap.js +69 -0
  434. package/dist/server/controlToken.js +3 -0
  435. package/dist/server/evalInternalRoutes.d.ts +14 -0
  436. package/dist/server/evalInternalRoutes.js +87 -0
  437. package/dist/server/evalRouteContext.d.ts +46 -0
  438. package/dist/server/evalRouteContext.js +43 -0
  439. package/dist/server/evalRoutes.d.ts +5 -0
  440. package/dist/server/evalRoutes.js +1456 -0
  441. package/dist/server/evalTriageRoutes.d.ts +2 -0
  442. package/dist/server/evalTriageRoutes.js +95 -0
  443. package/dist/server/guideRoutes.d.ts +5 -0
  444. package/dist/server/guideRoutes.js +166 -0
  445. package/dist/server/http.d.ts +15 -0
  446. package/dist/server/http.js +67 -3
  447. package/dist/server/internalAgentRoutes.d.ts +6 -0
  448. package/dist/server/internalAgentRoutes.js +12 -0
  449. package/dist/server/mcpHost.js +5 -0
  450. package/dist/toolkit/meta.d.ts +1 -1
  451. package/dist/toolkit/meta.js +53 -0
  452. package/dist/toolkit/profiles.d.ts +5 -0
  453. package/dist/toolkit/profiles.js +13 -1
  454. package/dist/tools/askOperator.js +2 -1
  455. package/dist/tools/emitStageEnvelope.d.ts +17 -16
  456. package/dist/tools/emitStageEnvelope.js +46 -32
  457. package/dist/tools/stageToolNames.d.ts +4 -0
  458. package/dist/tools/stageToolNames.js +4 -0
  459. package/dist/tools/workingState.d.ts +40 -0
  460. package/dist/tools/workingState.js +108 -0
  461. package/dist/tools/writeStageArtifact.d.ts +0 -9
  462. package/dist/tools/writeStageArtifact.js +2 -1
  463. package/dist/types/stageflowManifest.d.ts +6 -0
  464. package/dist/ui/assets/{MarkdownText-D7tYaIFO.js → MarkdownText-S5C_vemc.js} +2 -2
  465. package/dist/ui/assets/adapters-C0l4ruiR.js +17 -0
  466. package/dist/ui/assets/chat-CjnsmvqR.js +2 -0
  467. package/dist/ui/assets/chat-DFDd4UjS.css +2 -0
  468. package/dist/ui/assets/{main-BFo79krC.css → main-Del1GeLf.css} +1 -1
  469. package/dist/ui/assets/main-_yXVqcW9.js +277 -0
  470. package/dist/ui/chat.html +3 -4
  471. package/dist/ui/index.html +3 -4
  472. package/dist/workshop/chatTurn.js +1 -1
  473. package/dist/workshop/workshopPin.d.ts +3 -3
  474. package/dist/workshop/workshopPin.js +16 -15
  475. package/examples/README.md +2 -0
  476. package/examples/compaction-stress/README.md +30 -0
  477. package/examples/compaction-stress/check-run.mjs +53 -0
  478. package/examples/compaction-stress/collect-evidence.yaml +60 -0
  479. package/examples/compaction-stress/compaction-stress.pipeline.yaml +141 -0
  480. package/examples/compaction-stress/compaction-stress.task.yaml +15 -0
  481. package/examples/compaction-stress/generate-evidence.mjs +110 -0
  482. package/examples/compaction-stress/root-cause.yaml +26 -0
  483. package/examples/compaction-stress/stageflow.yaml +9 -0
  484. package/examples/compaction-stress/write-postmortem.yaml +40 -0
  485. package/examples/document-policy-review/README.md +35 -0
  486. package/examples/document-policy-review/agents/compliance.agent.yaml +42 -0
  487. package/examples/document-policy-review/documents/acme-vendor-sow.md +15 -0
  488. package/examples/document-policy-review/documents/support-runbook.md +13 -0
  489. package/examples/document-policy-review/policies/acceptable-use.md +13 -0
  490. package/examples/document-policy-review/policies/data-handling.md +17 -0
  491. package/examples/document-policy-review/policies/vendor-security.md +17 -0
  492. package/examples/evals/README.md +141 -0
  493. package/examples/evals/critique-sample.dataset.jsonl +8 -0
  494. package/examples/evals/critique-sample.eval.yaml +34 -0
  495. package/examples/evals/critique-sample.task.yaml +4 -0
  496. package/examples/evals/eval-sample.pipeline.yaml +35 -0
  497. package/examples/evals/guide-behavior.dataset.jsonl +15 -0
  498. package/examples/evals/guide-behavior.eval.yaml +35 -0
  499. package/examples/evals/guide-depth.dataset.jsonl +35 -0
  500. package/examples/evals/guide-depth.eval.yaml +169 -0
  501. package/examples/evals/support-sample.agent.yaml +20 -0
  502. package/examples/evals/support-sample.dataset.jsonl +6 -0
  503. package/examples/evals/support-sample.eval.yaml +38 -0
  504. package/examples/memory/evals/guide-behavior.dataset.jsonl +15 -0
  505. package/examples/memory/evals/guide-behavior.eval.yaml +35 -0
  506. package/examples/memory/evals/guide-depth.dataset.jsonl +35 -0
  507. package/examples/memory/evals/guide-depth.eval.yaml +169 -0
  508. package/examples/stageflow.yaml +6 -0
  509. package/package.json +1 -1
  510. package/skills/stageflow/SKILL.md +5 -2
  511. package/skills/stageflow/references/control-surface.md +4 -2
  512. package/skills/stageflow/references/evals.md +68 -0
  513. package/skills/stageflow-author/SKILL.md +4 -0
  514. package/skills/stageflow-run/SKILL.md +4 -0
  515. package/dist/ui/assets/AssistantRuntimeProvider-CsiPFhCT.js +0 -9
  516. package/dist/ui/assets/ReadonlyStore-BfXqHykm.js +0 -6
  517. package/dist/ui/assets/chat-BbLukq9W.js +0 -5
  518. package/dist/ui/assets/chat-zIZU_bP1.css +0 -2
  519. package/dist/ui/assets/main-CijYMeM0.js +0 -259
@@ -0,0 +1,363 @@
1
+ import { readFile, stat } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { contentHash } from "../../config/atomicWrite.js";
4
+ import { resolveDefaultWriteRoot, resolveCatalogStartInput, } from "../../config/catalogRelativePath.js";
5
+ import { listDatasetFiles, loadEvalCatalog } from "../../config/evalCatalog.js";
6
+ import { resolveCatalogRoots, } from "../../config/resolveCatalogRoots.js";
7
+ import { loadDatasetFile } from "../../config/loadDataset.js";
8
+ import { evalStem, findDatasetFile, findEvalFile, manifestForWrite } from "../../config/evalWriteRoots.js";
9
+ import { resolveEvalTarget } from "../../config/resolveEvalTarget.js";
10
+ import { parseEvalOutcome, resolveEvalPaths } from "../../config/loadEval.js";
11
+ import { evalFindingsFromIssues } from "../../config/validateEval.js";
12
+ import { EVAL_RUN_STATUSES } from "../constants.js";
13
+ import { PINNED_PROMPTFOO_VERSION } from "../engine/promptfoo/pinned.js";
14
+ import { buildEvalPlan } from "../plan.js";
15
+ import { liveAgentOf } from "./agentTargets.js";
16
+ import { buildEvalListItems, costLastSevenDays } from "./list.js";
17
+ import { resultKey } from "../statsTypes.js";
18
+ import { regressionBanner } from "../listStatus.js";
19
+ import { buildResultRows, RESULT_ROW_STATUSES } from "./results.js";
20
+ import { activeRunOf, completedRunsNewestFirst, resultToWire, runHeadline } from "./runs.js";
21
+ import { suggestionFor } from "./suggestions.js";
22
+ export const DEFAULT_LIMIT = 50;
23
+ export const MAX_LIMIT = 200;
24
+ export const ENGINE_NAME = "promptfoo";
25
+ export class EvalApiError extends Error {
26
+ status;
27
+ code;
28
+ extra;
29
+ constructor(status, code, message, extra = {}) {
30
+ super(message);
31
+ this.status = status;
32
+ this.code = code;
33
+ this.extra = extra;
34
+ this.name = "EvalApiError";
35
+ }
36
+ }
37
+ export function rel(projectRoot, abs) {
38
+ return path.relative(projectRoot, abs).split(path.sep).join("/");
39
+ }
40
+ export function badRequest(message, code = "invalid_request") {
41
+ return new EvalApiError(400, code, message);
42
+ }
43
+ export function engineCheck(status) {
44
+ if (!status.nodeOk) {
45
+ throw new EvalApiError(503, "EVAL_NODE_TOO_OLD", `Evals need a newer Node.js; found ${status.node}`);
46
+ }
47
+ if (!status.installed) {
48
+ throw new EvalApiError(503, "EVAL_ENGINE_UNAVAILABLE", `The eval engine is not installed. Run \`${status.installCommand}\`.`);
49
+ }
50
+ }
51
+ export async function findEvalOr404(projectRoot, id) {
52
+ const ref = await findEvalFile(projectRoot, id);
53
+ if (ref === undefined)
54
+ throw new EvalApiError(404, "EVAL_NOT_FOUND", `Eval not found: ${id}`);
55
+ return ref;
56
+ }
57
+ export async function runByIdOr404(store, id) {
58
+ const row = await store.getEvalRun(id);
59
+ if (row === null)
60
+ throw new EvalApiError(404, "EVAL_RUN_NOT_FOUND", `Eval run not found: ${id}`);
61
+ return row;
62
+ }
63
+ export function encodeOffset(offset) {
64
+ return Buffer.from(JSON.stringify({ offset }), "utf8").toString("base64url");
65
+ }
66
+ export function decodeOffset(cursor) {
67
+ if (cursor === null || cursor === undefined || cursor === "")
68
+ return 0;
69
+ try {
70
+ const parsed = JSON.parse(Buffer.from(cursor, "base64url").toString("utf8"));
71
+ if (typeof parsed.offset === "number" && Number.isInteger(parsed.offset) && parsed.offset >= 0)
72
+ return parsed.offset;
73
+ }
74
+ catch {
75
+ // fall through to the error below
76
+ }
77
+ throw badRequest("Invalid cursor", "invalid_cursor");
78
+ }
79
+ export async function buildEvalDetail(input) {
80
+ const { store, projectRoot, absPath } = input;
81
+ const manifest = await manifestForWrite(projectRoot);
82
+ const entries = await loadEvalCatalog(manifest, input.isKnownModel ? { isKnownModel: input.isKnownModel } : {});
83
+ const entry = entries.find((e) => path.resolve(e.absPath) === path.resolve(absPath));
84
+ const bytes = await readFile(absPath);
85
+ const id = entry?.outcome.ok ? entry.outcome.value.id : evalStem(path.basename(absPath));
86
+ let runsCount = 0;
87
+ let cursor;
88
+ do {
89
+ const page = await store.listEvalRuns({ projectRoot, evalId: id, limit: MAX_LIMIT, ...(cursor ? { cursor } : {}) });
90
+ runsCount += page.items.length;
91
+ cursor = page.nextCursor ?? undefined;
92
+ } while (cursor !== undefined);
93
+ const last = (await completedRunsNewestFirst(store, projectRoot, id, 1))[0];
94
+ let targetModel = null;
95
+ let agent;
96
+ if (entry?.outcome.ok) {
97
+ const file = entry.outcome.value.file;
98
+ if (file.target.kind === "agent") {
99
+ agent = await liveAgentOf(input.agents, projectRoot, file.target.agent);
100
+ targetModel = file.defaults?.model ?? agent?.model ?? null;
101
+ }
102
+ else if (file.target.kind === "internal_agent") {
103
+ targetModel = file.defaults?.model ?? null;
104
+ }
105
+ else {
106
+ const target = await resolveEvalTarget(file, entry.outcome.value.path, projectRoot);
107
+ if (target.ok)
108
+ targetModel = target.value.modelResolved;
109
+ }
110
+ }
111
+ return {
112
+ id,
113
+ path: rel(projectRoot, absPath),
114
+ file_hash: contentHash(bytes),
115
+ definition: entry?.outcome.ok ? entry.outcome.value.file : null,
116
+ yaml: bytes.toString("utf8"),
117
+ findings: entry?.findings ?? [],
118
+ runs_count: runsCount,
119
+ active_run: await activeRunOf(store, projectRoot, id),
120
+ last_run: last ? runHeadline(last) : null,
121
+ target_model: targetModel,
122
+ judge_default: entry?.outcome.ok ? (entry.outcome.value.file.defaults?.judge ?? null) : null,
123
+ ...(agent !== undefined ? { agent } : {}),
124
+ };
125
+ }
126
+ export async function planFindings(input) {
127
+ const built = await buildEvalPlan({
128
+ projectRoot: input.projectRoot,
129
+ evalPath: input.evalPath,
130
+ evalText: input.evalText,
131
+ ...(input.datasetCases !== undefined ? { datasetCases: input.datasetCases } : {}),
132
+ evalRunId: "er_validate",
133
+ engine: { name: ENGINE_NAME, version: PINNED_PROMPTFOO_VERSION, nodeVersion: process.versions.node },
134
+ ...(input.isKnownModel ? { isKnownModel: input.isKnownModel } : {}),
135
+ ...(input.agents ? { agents: input.agents } : {}),
136
+ ...(input.internalAgents ? { internalAgents: input.internalAgents } : {}),
137
+ });
138
+ return { ok: built.ok, findings: built.findings };
139
+ }
140
+ export async function validateEvalText(input) {
141
+ const { projectRoot, evalAbs, derived } = input;
142
+ const parsed = parseEvalOutcome(derived, evalAbs, projectRoot);
143
+ const checked = await planFindings({
144
+ projectRoot,
145
+ evalPath: evalAbs,
146
+ evalText: derived,
147
+ ...(input.datasetCases !== undefined ? { datasetCases: input.datasetCases } : {}),
148
+ ...(input.isKnownModel ? { isKnownModel: input.isKnownModel } : {}),
149
+ ...(input.agents ? { agents: input.agents } : {}),
150
+ ...(input.internalAgents ? { internalAgents: input.internalAgents } : {}),
151
+ });
152
+ const findings = checked.findings.length > 0 || parsed.ok
153
+ ? checked.findings
154
+ : evalFindingsFromIssues(rel(projectRoot, evalAbs), parsed.issues);
155
+ return { findings, parsed };
156
+ }
157
+ export async function listEvalRunsPage(store, input) {
158
+ const { projectRoot, evalId, status, stageRunId, subjectRef, limit, cursor } = input;
159
+ if (status !== undefined && !EVAL_RUN_STATUSES.includes(status)) {
160
+ throw badRequest(`"status" must be one of ${EVAL_RUN_STATUSES.join(", ")}`);
161
+ }
162
+ let page;
163
+ try {
164
+ page = await store.listEvalRuns({
165
+ ...(projectRoot !== undefined ? { projectRoot } : {}),
166
+ ...(evalId !== undefined ? { evalId } : {}),
167
+ ...(status !== undefined ? { status: status } : {}),
168
+ ...(stageRunId !== undefined ? { stageRunId } : {}),
169
+ ...(subjectRef !== undefined ? { subjectRef } : {}),
170
+ limit,
171
+ ...(cursor !== undefined ? { cursor } : {}),
172
+ });
173
+ }
174
+ catch (err) {
175
+ if (cursor !== undefined && err instanceof SyntaxError)
176
+ throw badRequest("Invalid cursor", "invalid_cursor");
177
+ throw err;
178
+ }
179
+ const items = await Promise.all(page.items.map(async (row) => {
180
+ const headline = {
181
+ ...runHeadline(row),
182
+ created_at: row.createdAt,
183
+ started_at: row.startedAt,
184
+ results_total: row.resultsTotal,
185
+ project_root: input.wireRootOf?.(row.projectRoot) ?? row.projectRoot,
186
+ };
187
+ if (stageRunId === undefined && subjectRef === undefined)
188
+ return headline;
189
+ const match = (await store.listEvalResults(row.evalRunId)).find((r) => stageRunId !== undefined ? r.stageRunId === stageRunId : r.subjectRef === subjectRef);
190
+ return {
191
+ ...headline,
192
+ ...(match ? { result: { case_id: match.caseId, repeat_index: match.repeatIndex } } : {}),
193
+ };
194
+ }));
195
+ return { items, next_cursor: page.nextCursor };
196
+ }
197
+ export async function buildResultsPage(store, id, input) {
198
+ const row = await runByIdOr404(store, id);
199
+ const { status, grader, q, tag, limit } = input;
200
+ if (status !== undefined && !RESULT_ROW_STATUSES.includes(status)) {
201
+ throw badRequest(`"status" must be one of ${RESULT_ROW_STATUSES.join(", ")}`);
202
+ }
203
+ const offset = decodeOffset(input.cursor);
204
+ const [cases, results, reviews] = await Promise.all([
205
+ store.getEvalCases(row.evalRunId),
206
+ store.listEvalResults(row.evalRunId),
207
+ store.getEvalReviews(row.evalRunId),
208
+ ]);
209
+ const { rows, counts } = buildResultRows({
210
+ targetKind: row.targetKind,
211
+ cases,
212
+ results,
213
+ reviews,
214
+ filter: {
215
+ ...(status !== undefined ? { status: status } : {}),
216
+ ...(grader !== undefined ? { grader } : {}),
217
+ ...(q !== undefined ? { q } : {}),
218
+ ...(tag !== undefined ? { tag } : {}),
219
+ },
220
+ });
221
+ const page = rows.slice(offset, offset + limit);
222
+ return {
223
+ items: page,
224
+ next_cursor: offset + limit < rows.length ? encodeOffset(offset + limit) : null,
225
+ counts,
226
+ };
227
+ }
228
+ export async function buildResultDetail(store, id, caseId) {
229
+ const row = await runByIdOr404(store, id);
230
+ const [cases, results, reviews, suggestions] = await Promise.all([
231
+ store.getEvalCases(row.evalRunId),
232
+ store.getEvalResultsForCase(row.evalRunId, caseId),
233
+ store.getEvalReviews(row.evalRunId),
234
+ store.listEvalSuggestions(row.evalRunId),
235
+ ]);
236
+ const caseRow = cases.find((x) => x.caseId === caseId);
237
+ if (!caseRow || results.length === 0) {
238
+ throw new EvalApiError(404, "EVAL_RUN_NOT_FOUND", `Eval result not found: ${id}/${caseId}`);
239
+ }
240
+ const reviewByKey = new Map(reviews.map((r) => [resultKey(r.caseId, r.repeatIndex), r]));
241
+ return {
242
+ case: { ...caseRow.case, position: caseRow.position },
243
+ repeats: [...results]
244
+ .sort((a, b) => a.repeatIndex - b.repeatIndex)
245
+ .map((r) => ({
246
+ ...resultToWire(r, reviewByKey.get(resultKey(r.caseId, r.repeatIndex)), row.targetKind === "agent" ? (row.targetRef.agent_id ?? "") : undefined),
247
+ suggestion: suggestionFor(suggestions, r.caseId, r.repeatIndex),
248
+ })),
249
+ };
250
+ }
251
+ async function exists(abs) {
252
+ try {
253
+ await stat(abs);
254
+ return true;
255
+ }
256
+ catch {
257
+ return false;
258
+ }
259
+ }
260
+ export async function loadEvalListItems(input) {
261
+ const { store, projectRoot } = input;
262
+ const wireRoot = input.wireRoot ?? projectRoot;
263
+ const manifest = await manifestForWrite(projectRoot);
264
+ const counts = new Map();
265
+ const entries = await loadEvalCatalog(manifest, {
266
+ ...(input.isKnownModel ? { isKnownModel: input.isKnownModel } : {}),
267
+ datasetReportFor: async (loaded) => {
268
+ const { datasetPath } = resolveEvalPaths(loaded.file, loaded.path);
269
+ if (!(await exists(datasetPath)))
270
+ return undefined;
271
+ const report = await loadDatasetFile(datasetPath, { root: projectRoot });
272
+ counts.set(datasetPath, report.cases.length);
273
+ return report;
274
+ },
275
+ });
276
+ const built = await buildEvalListItems({
277
+ store,
278
+ projectRoot,
279
+ entries,
280
+ datasetCases: (abs) => counts.get(abs) ?? 0,
281
+ ...(input.agents ? { agents: input.agents } : {}),
282
+ });
283
+ const items = built.items.map((item) => ({ ...item, project_root: wireRoot }));
284
+ return { items, banner: built.banner, bannerInputs: built.bannerInputs, manifest };
285
+ }
286
+ export async function evalScopeRoots(options, wire) {
287
+ if (wire !== undefined)
288
+ return [(await resolveCatalogStartInput(options, wire)).wireRoot];
289
+ const roots = await resolveCatalogRoots(options);
290
+ return roots.filter((r) => !r.read_only && r.available !== false);
291
+ }
292
+ export async function wireRootOf(options) {
293
+ const roots = await resolveCatalogRoots(options);
294
+ return (projectRoot) => roots.find((r) => r.path === projectRoot)?.project_root ?? projectRoot;
295
+ }
296
+ export async function loadAggregatedEvalList(input) {
297
+ const roots = await evalScopeRoots(input.options, input.wire);
298
+ const groups = [];
299
+ const bannerInputs = [];
300
+ let datasets = 0;
301
+ let cost = 0;
302
+ for (const root of roots) {
303
+ const loaded = await loadEvalListItems({
304
+ store: input.options.store,
305
+ projectRoot: root.path,
306
+ wireRoot: root.project_root,
307
+ ...(input.isKnownModel ? { isKnownModel: input.isKnownModel } : {}),
308
+ ...(input.agents ? { agents: input.agents } : {}),
309
+ });
310
+ groups.push({ root, items: loaded.items });
311
+ bannerInputs.push(...loaded.bannerInputs);
312
+ datasets += (await listDatasetFiles(loaded.manifest)).length;
313
+ cost += await costLastSevenDays(input.options.store, root.path, input.now);
314
+ }
315
+ return {
316
+ groups,
317
+ items: groups.flatMap((g) => g.items),
318
+ banner: regressionBanner(bannerInputs),
319
+ datasets,
320
+ cost,
321
+ };
322
+ }
323
+ function ambiguous(code, noun, id, roots) {
324
+ return new EvalApiError(409, code, `${noun} "${id}" exists in more than one project; pass project_root`, { project_roots: roots });
325
+ }
326
+ async function locate(options, wire, write, find, fail, missing) {
327
+ const notFound = () => new EvalApiError(404, fail.notFoundCode, `${fail.noun} not found: ${fail.id}`);
328
+ if (wire !== undefined) {
329
+ const root = write
330
+ ? (await resolveDefaultWriteRoot(options, wire)).wireRoot
331
+ : (await resolveCatalogStartInput(options, wire)).wireRoot;
332
+ const ref = await find(root.path);
333
+ if (ref === undefined && missing === "throw")
334
+ throw notFound();
335
+ return { root, ref };
336
+ }
337
+ const matches = [];
338
+ for (const root of await evalScopeRoots(options, undefined)) {
339
+ const ref = await find(root.path);
340
+ if (ref !== undefined)
341
+ matches.push({ root, ref });
342
+ }
343
+ if (matches.length > 1) {
344
+ throw ambiguous(fail.ambiguousCode, fail.noun, fail.id, matches.map((m) => m.root.project_root));
345
+ }
346
+ if (matches[0] !== undefined)
347
+ return matches[0];
348
+ if (missing === "throw")
349
+ throw notFound();
350
+ return { root: (await resolveDefaultWriteRoot(options)).wireRoot, ref: undefined };
351
+ }
352
+ export async function locateEval(options, wire, id, write = false) {
353
+ const { root, ref } = await locate(options, wire, write, (projectRoot) => findEvalFile(projectRoot, id), { ambiguousCode: "EVAL_AMBIGUOUS", notFoundCode: "EVAL_NOT_FOUND", noun: "Eval", id }, "throw");
354
+ return { root, projectRoot: root.path, ref: ref };
355
+ }
356
+ export async function locateEvalRoot(options, wire, id) {
357
+ const { root } = await locate(options, wire, false, (projectRoot) => findEvalFile(projectRoot, id), { ambiguousCode: "EVAL_AMBIGUOUS", notFoundCode: "EVAL_NOT_FOUND", noun: "Eval", id }, "default");
358
+ return root;
359
+ }
360
+ export async function locateDataset(options, wire, id, opts) {
361
+ const { root, ref } = await locate(options, wire, opts.write, (projectRoot) => findDatasetFile(projectRoot, id), { ambiguousCode: "DATASET_AMBIGUOUS", notFoundCode: "DATASET_NOT_FOUND", noun: "Dataset", id }, opts.missing);
362
+ return { root, projectRoot: root.path, ref };
363
+ }
@@ -0,0 +1,4 @@
1
+ import { type CompareResult } from "../compare.js";
2
+ import type { EvalRunRow } from "../storeTypes.js";
3
+ import { type ReadStore } from "./runs.js";
4
+ export declare function buildCompare(store: ReadStore, a: EvalRunRow, b: EvalRunRow): Promise<CompareResult>;
@@ -0,0 +1,39 @@
1
+ import { compareRuns } from "../compare.js";
2
+ import { toGradeRecords, toResultRecord } from "../statsAdapter.js";
3
+ import { graderRefsOf } from "./runs.js";
4
+ async function compareInput(store, row) {
5
+ const results = await store.listEvalResults(row.evalRunId);
6
+ const target = row.config
7
+ .target;
8
+ const isAgent = row.targetKind === "agent";
9
+ const definition = isAgent ? undefined : target?.stage_definition;
10
+ const agentDefinition = isAgent ? target?.definition : undefined;
11
+ const plain = (v) => (typeof v === "object" && v !== null && !Array.isArray(v) ? v : null);
12
+ return {
13
+ targetKind: row.targetKind === "agent" ? "agent" : "stage",
14
+ ...(isAgent
15
+ ? {
16
+ agentId: row.targetRef.agent_id ?? null,
17
+ agentRevision: typeof target?.revision === "number" ? target.revision : null,
18
+ agentDefinition: plain(agentDefinition),
19
+ }
20
+ : {}),
21
+ evalId: row.evalId,
22
+ runNumber: row.runNumber,
23
+ datasetHash: row.datasetHash,
24
+ stageVersionHash: row.targetVersionHash,
25
+ stageDefinition: typeof definition === "object" && definition !== null && !Array.isArray(definition)
26
+ ? definition
27
+ : null,
28
+ configComponents: row.configComponents,
29
+ results: results.map(toResultRecord),
30
+ grades: results.flatMap(toGradeRecords),
31
+ graders: graderRefsOf(row),
32
+ repeats: row.repeats,
33
+ passThreshold: row.passThreshold,
34
+ };
35
+ }
36
+ export async function buildCompare(store, a, b) {
37
+ const [left, right] = await Promise.all([compareInput(store, a), compareInput(store, b)]);
38
+ return compareRuns(left, right);
39
+ }
@@ -0,0 +1,105 @@
1
+ import { type UploadMapping, type UploadPreviewRow } from "../../config/datasetImport.js";
2
+ import type { DatasetCase, DatasetFormat, DatasetLoadResult } from "../../config/datasetTypes.js";
3
+ import type { ValidationFinding } from "../../config/validateCatalog.js";
4
+ import type { AgentCatalogPort } from "../../config/resolveAgentTarget.js";
5
+ import type { ConversationMode } from "../types.js";
6
+ export type InputField = {
7
+ name: string;
8
+ required: boolean;
9
+ type?: string;
10
+ };
11
+ export type DatasetTarget = {
12
+ pipeline_path?: string;
13
+ stage_id?: string;
14
+ file?: string;
15
+ agent_id?: string;
16
+ };
17
+ /** What an agent eval reads from a dataset: the effective conversation mode decides which scenario keys are required. */
18
+ export type AgentDatasetUse = {
19
+ mode: ConversationMode;
20
+ };
21
+ export declare function agentInputFields(mode: ConversationMode): InputField[];
22
+ /** The upload mapping targets an agent dataset cannot take from a column: scripts and tool mocks are JSON or JSONL only. */
23
+ export declare const AGENT_UNSUPPORTED_MAPPING_TARGETS: readonly ["input.script", "input.tool_mocks"];
24
+ export type DatasetListItem = {
25
+ project_root: string;
26
+ id: string;
27
+ path: string;
28
+ format: DatasetFormat | null;
29
+ cases: number;
30
+ hash: string;
31
+ editable: boolean;
32
+ used_by: string[];
33
+ findings_count: number;
34
+ };
35
+ export type DatasetQuery = {
36
+ offset: number;
37
+ limit: number;
38
+ tag?: string;
39
+ q?: string;
40
+ filter: "all" | "invalid" | "tagged";
41
+ };
42
+ export type DatasetDetail = {
43
+ id: string;
44
+ path: string;
45
+ format: DatasetFormat | null;
46
+ hash: string;
47
+ editable: boolean;
48
+ cases_total: number;
49
+ invalid_total: number;
50
+ tagged_total: number;
51
+ matched_total: number;
52
+ tags: Record<string, number>;
53
+ input_fields: InputField[];
54
+ cases: Array<DatasetCase & {
55
+ input_check: {
56
+ valid: boolean;
57
+ message?: string;
58
+ } | null;
59
+ }>;
60
+ findings: ValidationFinding[];
61
+ used_by: string[];
62
+ };
63
+ export declare function inputFieldsOf(schema: unknown): InputField[];
64
+ export type ResolvedDatasetTarget = {
65
+ inputSchema: unknown;
66
+ stageId: string | undefined;
67
+ pipelineAbsPath: string | undefined;
68
+ agentId?: string;
69
+ };
70
+ export declare function resolveDatasetTarget(projectRoot: string, target: DatasetTarget, agents?: AgentCatalogPort): Promise<{
71
+ ok: true;
72
+ value: ResolvedDatasetTarget;
73
+ } | {
74
+ ok: false;
75
+ message: string;
76
+ }>;
77
+ export declare function buildDatasetDetail(input: {
78
+ id: string;
79
+ loaded: DatasetLoadResult;
80
+ inputSchema: unknown;
81
+ hasEval: boolean;
82
+ usedBy: string[];
83
+ query: DatasetQuery;
84
+ agent?: AgentDatasetUse;
85
+ }): DatasetDetail;
86
+ export type PreviewInput = {
87
+ format: DatasetFormat;
88
+ content: string;
89
+ delimiter?: string;
90
+ mapping?: UploadMapping;
91
+ inputSchema?: unknown;
92
+ existingIds?: readonly string[];
93
+ /** Agent dataset: rows are checked as scenarios, in this mode unless the row maps `input.mode`. */
94
+ agent?: AgentDatasetUse;
95
+ };
96
+ export type PreviewResult = {
97
+ columns?: string[];
98
+ rows: UploadPreviewRow[];
99
+ findings: ValidationFinding[];
100
+ counts: {
101
+ ready: number;
102
+ skipped: number;
103
+ };
104
+ };
105
+ export declare function previewUpload(input: PreviewInput): PreviewResult;