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
@@ -1,4 +1,6 @@
1
- import { parseAgentAuthorDraft, runAgentAuthorTurn, undoAgentAuthorTurn } from "../agents/authorChat.js";
1
+ import { authorSessionForApi, forgetAgentAuthorSession, parseAgentAuthorDraft, runAgentAuthorTurn, undoAgentAuthorTurn, } from "../agents/authorChat.js";
2
+ import { createAuthorSession, deleteAuthorSession, listAuthorDrafts, readAuthorSession, saveAuthorSession, } from "../agents/authorSessionStore.js";
3
+ import { parseWorkshopModel } from "../workshop/modelSettings.js";
2
4
  async function readBody(req) {
3
5
  const chunks = [];
4
6
  let size = 0;
@@ -24,6 +26,60 @@ async function readBody(req) {
24
26
  export async function handleAgentAuthorRoutes(req, method, pathname, projectRoot, host, res, json) {
25
27
  const chat = pathname === "/api/agent-author/chat";
26
28
  const undo = pathname === "/api/agent-author/undo";
29
+ const sessions = pathname === "/api/agent-author/sessions";
30
+ const sessionMatch = /^\/api\/agent-author\/sessions\/([^/]+)$/.exec(pathname);
31
+ if (!chat && !undo && !sessions && !sessionMatch)
32
+ return false;
33
+ if (sessions && method === "POST") {
34
+ const body = await readBody(req);
35
+ if (body.__tooLarge || body.__invalid) {
36
+ json(res, 400, { code: "agent.invalid" });
37
+ return true;
38
+ }
39
+ json(res, 200, createAuthorSession({
40
+ draft: parseAgentAuthorDraft(body.draft),
41
+ ...(parseWorkshopModel(body.model) ? { model: parseWorkshopModel(body.model) } : {}),
42
+ }));
43
+ return true;
44
+ }
45
+ if (sessions && method === "GET") {
46
+ json(res, 200, { drafts: listAuthorDrafts() });
47
+ return true;
48
+ }
49
+ if (sessionMatch && (method === "GET" || method === "PUT" || method === "DELETE")) {
50
+ const sessionId = decodeURIComponent(sessionMatch[1] ?? "");
51
+ try {
52
+ if (method === "GET") {
53
+ json(res, 200, authorSessionForApi(sessionId));
54
+ return true;
55
+ }
56
+ if (method === "DELETE") {
57
+ forgetAgentAuthorSession(sessionId);
58
+ if (!deleteAuthorSession(sessionId)) {
59
+ json(res, 404, { code: "agent.session_not_found" });
60
+ return true;
61
+ }
62
+ json(res, 200, { removed: true });
63
+ return true;
64
+ }
65
+ const body = await readBody(req);
66
+ if (body.__tooLarge || body.__invalid) {
67
+ json(res, 400, { code: "agent.invalid" });
68
+ return true;
69
+ }
70
+ const current = readAuthorSession(sessionId);
71
+ if (!current) {
72
+ json(res, 404, { code: "agent.session_not_found" });
73
+ return true;
74
+ }
75
+ json(res, 200, saveAuthorSession({ ...current, draft: parseAgentAuthorDraft(body.draft) }));
76
+ }
77
+ catch (err) {
78
+ const code = err instanceof Error ? err.message : "agent.internal";
79
+ json(res, code === "agent.session_not_found" ? 404 : 400, { code: code.startsWith("agent.") ? code : "agent.internal" });
80
+ }
81
+ return true;
82
+ }
27
83
  if (!chat && !undo)
28
84
  return false;
29
85
  if (method !== "POST") {
@@ -46,12 +102,14 @@ export async function handleAgentAuthorRoutes(req, method, pathname, projectRoot
46
102
  return true;
47
103
  }
48
104
  const message = typeof body.message === "string" ? body.message : "";
105
+ const model = parseWorkshopModel(body.model);
49
106
  const result = await runAgentAuthorTurn({
50
107
  host,
51
108
  projectRoot,
52
109
  message,
53
110
  ...(typeof body.sessionId === "string" ? { sessionId: body.sessionId } : {}),
54
111
  draft: parseAgentAuthorDraft(body.draft),
112
+ ...(model ? { model } : {}),
55
113
  });
56
114
  json(res, 200, result);
57
115
  }
@@ -7,6 +7,8 @@ import type { RunStore } from "../runstore/port.js";
7
7
  import type { StoreFilesystemClassification } from "../runstore/storeFilesystem.js";
8
8
  import type { StageBrowserSupport } from "../browser/browserHost.js";
9
9
  import { RunManager } from "../runtime/runManager.js";
10
+ import { EvalRunManager } from "../evals/manager.js";
11
+ import type { EvalInternalServices } from "./evalInternalRoutes.js";
10
12
  import { emailHostFor } from "../email/host.js";
11
13
  import { EmailTriggers } from "../email/triggers.js";
12
14
  import { type ChannelService } from "../channels/service.js";
@@ -15,6 +17,7 @@ import { type RunChangeBus } from "../runtime/runChangeBus.js";
15
17
  import { type McpHttpHandler } from "../mcp/server.js";
16
18
  import { type HostConfig } from "../config/hostConfig.js";
17
19
  import { bootProviderConfig } from "../agent/bootProviderConfig.js";
20
+ import type { OperatorAgentHost } from "../operatorAgent/types.js";
18
21
  import { type AgentHostContext } from "../agents/hostContext.js";
19
22
  import type { ConversationBackend } from "../agents/sessions.js";
20
23
  export declare const DEFAULT_GC_INTERVAL_MS: number;
@@ -48,6 +51,12 @@ export type StageflowHostBootstrap = {
48
51
  store?: RunStore;
49
52
  /** Absent when `serveBlocked` — no RunManager lifecycle/resume. */
50
53
  manager?: RunManager;
54
+ /** Eval runs: shared with HTTP routes and MCP. Absent when `manager` is. */
55
+ evalRunManager?: EvalRunManager;
56
+ /** Services for the internal eval callback route; absent when `evalRunManager` is. */
57
+ evalServices?: EvalInternalServices;
58
+ /** Set once the HTTP host is listening so the promptfoo provider knows where to call back. */
59
+ setEvalCallbackBase?: (baseUrl: string) => void;
51
60
  runChangeBus: RunChangeBus;
52
61
  mcpStateless: boolean;
53
62
  providerAuthContext: ProviderAuthContext | undefined;
@@ -70,6 +79,10 @@ export type StageflowHostBootstrap = {
70
79
  memories?: MemoryHost;
71
80
  /** Shared agent store, chat controller, and conversation backend for HTTP/MCP. */
72
81
  agentHost?: AgentHostContext;
82
+ /** Filled when the operator console host is created, so internal-agent evals can open a gated session. */
83
+ operatorHostSlot?: {
84
+ current?: OperatorAgentHost;
85
+ };
73
86
  email?: ReturnType<typeof emailHostFor> & {
74
87
  triggers: EmailTriggers;
75
88
  stop: () => Promise<void>;
@@ -14,6 +14,12 @@ import { assertStoreFilesystemSupported } from "../runstore/storeFilesystem.js";
14
14
  import { assertStoreQuickCheck, isSqliteCorruptError, maybeCheckpointResidualWal, rethrowAsStoreIntegrityFailed, } from "../runstore/sqlite/applyStorePragmas.js";
15
15
  import { consoleStageBrowserSupport } from "../browser/stageBrowserEnv.js";
16
16
  import { RunManager } from "../runtime/runManager.js";
17
+ import { EvalRunManager } from "../evals/manager.js";
18
+ import { createStageCaseRunner } from "../evals/runner/stageCaseRunner.js";
19
+ import { getEngine } from "../evals/engine/index.js";
20
+ import { RunTokenRegistry } from "../evals/engine/promptfoo/runTokens.js";
21
+ import { EVAL_DEFAULT_ENGINE } from "../evals/manager.js";
22
+ import { PACKAGE_VERSION } from "../package-meta.js";
17
23
  import { PI_CODING_AGENT_DIR_ENV } from "../runtime/stageRoots.js";
18
24
  import { ScheduleSource, triggerTickIntervalMsFromEnv, } from "../runtime/scheduleSource.js";
19
25
  import { GithubPollSource, githubPollIntervalMsFromEnv, } from "../runtime/githubPollSource.js";
@@ -32,6 +38,11 @@ import { applyPendingRestoreAtBoot, } from "../runstore/restore.js";
32
38
  import { assertTmpdirUsable } from "../runstore/assertTmpdir.js";
33
39
  import { logger as rootLogger } from "../logging/logger.js";
34
40
  import { getModelCatalog } from "../models/catalog.js";
41
+ import { createAgentCaseRunner } from "../evals/runner/agentCaseRunner.js";
42
+ import { createEvalCaseRunner } from "../evals/runner/caseRunner.js";
43
+ import { createInternalAgentCaseRunner } from "../evals/runner/internalAgentCaseRunner.js";
44
+ import { describeInternalAgents, internalAgentsVisible } from "../operatorAgent/internalAgents.js";
45
+ import { defaultLoadJudgePrices } from "../evals/engine/promptfoo/judgeServices.js";
35
46
  import { createAgentHostContext } from "../agents/hostContext.js";
36
47
  export const DEFAULT_GC_INTERVAL_MS = 60 * 60 * 1000;
37
48
  /** Parse `STAGEFLOW_GC_INTERVAL_MS`; default 1h; `0` disables. */
@@ -257,6 +268,52 @@ export async function bootstrapStageflowHost(options) {
257
268
  await manager.autoResumeInterruptedStages();
258
269
  await manager.resumeStalledSchedules();
259
270
  await manager.reenqueuePersistedQueuedRuns();
271
+ const evalLog = rootLogger.child({ component: "evals" });
272
+ const evalStageRunner = createStageCaseRunner({ manager, store });
273
+ const operatorHostSlot = {};
274
+ const evalAgentRunner = createAgentCaseRunner({
275
+ host: () => agentHost,
276
+ loadPrices: defaultLoadJudgePrices,
277
+ });
278
+ const evalInternalRunner = createInternalAgentCaseRunner({ host: () => operatorHostSlot.current });
279
+ const evalRunner = createEvalCaseRunner({ stage: evalStageRunner, agent: evalAgentRunner, internalAgent: evalInternalRunner });
280
+ const evalTokens = new RunTokenRegistry();
281
+ let evalCallbackBase = "";
282
+ const evalRunManager = new EvalRunManager({
283
+ store,
284
+ stageRunner: evalRunner,
285
+ agents: () => agentHost?.service,
286
+ internalAgents: () => operatorHostSlot.current && internalAgentsVisible()
287
+ ? describeInternalAgents(operatorHostSlot.current).map(({ id, title, playbook, tools }) => ({ id, title, playbook, tools }))
288
+ : [],
289
+ engines: (name, engineOptions) => getEngine(name, name === EVAL_DEFAULT_ENGINE
290
+ ? {
291
+ tokens: evalTokens,
292
+ callbackUrl: () => `${evalCallbackBase}/api/evals/internal/run-case`,
293
+ home: ctx.globalHome,
294
+ ...engineOptions,
295
+ }
296
+ : engineOptions),
297
+ stageflowVersion: PACKAGE_VERSION,
298
+ workDirRoot: path.join(ctx.globalHome, "eval-runs"),
299
+ logger: {
300
+ info: (event, msg) => evalLog.info(event, msg),
301
+ warn: (event, msg) => evalLog.warn(event, msg),
302
+ error: (event, msg) => evalLog.error(event, msg),
303
+ },
304
+ });
305
+ const recoveredEvalRuns = await evalRunManager.recoverOnBoot().catch((err) => {
306
+ evalLog.warn("eval.recover_failed", err instanceof Error ? err.message : String(err));
307
+ return [];
308
+ });
309
+ const evalServices = {
310
+ tokens: evalTokens,
311
+ runner: evalRunner,
312
+ isRunning: (evalRunId) => evalRunManager.isExecuting(evalRunId),
313
+ };
314
+ const setEvalCallbackBase = (baseUrl) => {
315
+ evalCallbackBase = baseUrl.replace(/\/+$/, "");
316
+ };
260
317
  await warnDurableRootDiskIfNeeded(ctx.globalHome, { env });
261
318
  const gcInterval = startPeriodicRunGc(manager, gcIntervalMsFromEnv(env));
262
319
  const stopGcInterval = () => {
@@ -350,11 +407,16 @@ export async function bootstrapStageflowHost(options) {
350
407
  store,
351
408
  agentDir,
352
409
  projectRoot: rootDir,
410
+ channels,
411
+ memories: memoryHostFor(),
412
+ evalRunManager,
353
413
  ...(options.providerAuthContext ? { providerAuthContext: options.providerAuthContext } : {}),
354
414
  ...(providerBoot !== undefined ? { providerBoot } : {}),
355
415
  },
356
416
  })
357
417
  : undefined;
418
+ if (agentHost)
419
+ void evalRunManager.sweepAgentSessions(recoveredEvalRuns);
358
420
  const mcpStateless = resolveMcpStateless({
359
421
  mcpStateless: options.mcpStateless,
360
422
  });
@@ -366,6 +428,9 @@ export async function bootstrapStageflowHost(options) {
366
428
  runChangeBus,
367
429
  providerAuthContext: options.providerAuthContext,
368
430
  projectRoot: rootDir,
431
+ evalRunManager,
432
+ channels,
433
+ memories: memoryHostFor(),
369
434
  ...(agentHost
370
435
  ? {
371
436
  agentService: agentHost.service,
@@ -389,6 +454,9 @@ export async function bootstrapStageflowHost(options) {
389
454
  isGitProject,
390
455
  store,
391
456
  manager,
457
+ evalRunManager,
458
+ evalServices,
459
+ setEvalCallbackBase,
392
460
  runChangeBus,
393
461
  mcpStateless,
394
462
  providerAuthContext: options.providerAuthContext,
@@ -406,5 +474,6 @@ export async function bootstrapStageflowHost(options) {
406
474
  storeFilesystem,
407
475
  workspaceCatalog,
408
476
  ...(agentHost ? { agentHost } : {}),
477
+ operatorHostSlot,
409
478
  };
410
479
  }
@@ -1,6 +1,7 @@
1
1
  import { createHash, timingSafeEqual } from "node:crypto";
2
2
  import { readSecretFromEnvOrFile } from "../config/secretFromEnvOrFile.js";
3
3
  import { isLoopbackHostname } from "./allowedHosts.js";
4
+ import { isEvalInternalPath } from "./evalInternalRoutes.js";
4
5
  import { matchLiveViewRoute } from "./liveViewPath.js";
5
6
  const CONTROL_TOKEN_PREFIX = "STAGEFLOW_CONTROL_TOKEN_";
6
7
  const DEFAULT_CALLER_ID = "default";
@@ -200,6 +201,8 @@ export function requiredScopeFor(method, pathname) {
200
201
  return null;
201
202
  if (isLiveViewRoute(pathname))
202
203
  return null;
204
+ if (isEvalInternalPath(pathname))
205
+ return null;
203
206
  if (pathname === "/api/backup" || pathname.startsWith("/api/backup/")) {
204
207
  return "drive";
205
208
  }
@@ -0,0 +1,14 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import type { RunTokenRegistry } from "../evals/engine/promptfoo/runTokens.js";
3
+ import type { StageCaseRunner } from "../evals/runner/stageCaseRunner.js";
4
+ export declare const EVAL_INTERNAL_RUN_CASE_PATH = "/api/evals/internal/run-case";
5
+ export type EvalInternalServices = {
6
+ tokens: Pick<RunTokenRegistry, "verify">;
7
+ runner: Pick<StageCaseRunner, "runCase">;
8
+ isRunning(evalRunId: string): boolean;
9
+ };
10
+ export type EvalServices = EvalInternalServices | (() => EvalInternalServices | undefined);
11
+ type Json = (res: ServerResponse, status: number, body: unknown) => void;
12
+ export declare function isEvalInternalPath(pathname: string): boolean;
13
+ export declare function handleEvalInternalRoutes(req: IncomingMessage, method: string, pathname: string, services: EvalServices | undefined, res: ServerResponse, json: Json): Promise<boolean>;
14
+ export {};
@@ -0,0 +1,87 @@
1
+ export const EVAL_INTERNAL_RUN_CASE_PATH = "/api/evals/internal/run-case";
2
+ const MAX_BODY_BYTES = 8192;
3
+ export function isEvalInternalPath(pathname) {
4
+ return pathname === EVAL_INTERNAL_RUN_CASE_PATH;
5
+ }
6
+ function resolveServices(services) {
7
+ return typeof services === "function" ? services() : services;
8
+ }
9
+ async function readBody(req) {
10
+ const chunks = [];
11
+ let size = 0;
12
+ for await (const chunk of req) {
13
+ const buffer = typeof chunk === "string" ? Buffer.from(chunk) : chunk;
14
+ size += buffer.length;
15
+ if (size > MAX_BODY_BYTES)
16
+ throw new Error("body too large");
17
+ chunks.push(buffer);
18
+ }
19
+ return JSON.parse(Buffer.concat(chunks).toString("utf8"));
20
+ }
21
+ function parseRequest(body) {
22
+ if (typeof body !== "object" || body === null)
23
+ return undefined;
24
+ const { eval_run_id: evalRunId, case_id: caseId, repeat_index: repeatIndex } = body;
25
+ if (typeof evalRunId !== "string" || evalRunId.length === 0)
26
+ return undefined;
27
+ if (typeof caseId !== "string" || caseId.length === 0)
28
+ return undefined;
29
+ if (typeof repeatIndex !== "number" || !Number.isInteger(repeatIndex) || repeatIndex < 0)
30
+ return undefined;
31
+ return { evalRunId, caseId, repeatIndex };
32
+ }
33
+ function bearerToken(req) {
34
+ const header = req.headers.authorization;
35
+ const match = typeof header === "string" ? /^Bearer ([^\s]+)$/i.exec(header) : null;
36
+ return match?.[1];
37
+ }
38
+ export async function handleEvalInternalRoutes(req, method, pathname, services, res, json) {
39
+ if (!isEvalInternalPath(pathname))
40
+ return false;
41
+ const deps = resolveServices(services);
42
+ if (deps === undefined || method !== "POST") {
43
+ json(res, 404, { error: "Not found" });
44
+ return true;
45
+ }
46
+ const entry = deps.tokens.verify(bearerToken(req));
47
+ if (entry === undefined) {
48
+ json(res, 401, { code: "unauthorized" });
49
+ return true;
50
+ }
51
+ let request;
52
+ try {
53
+ request = parseRequest(await readBody(req));
54
+ }
55
+ catch {
56
+ request = undefined;
57
+ }
58
+ if (request === undefined) {
59
+ json(res, 400, { code: "invalid_request" });
60
+ return true;
61
+ }
62
+ if (request.evalRunId !== entry.evalRunId) {
63
+ json(res, 401, { code: "unauthorized" });
64
+ return true;
65
+ }
66
+ if (!deps.isRunning(request.evalRunId)) {
67
+ json(res, 409, { code: "eval_run_not_running" });
68
+ return true;
69
+ }
70
+ try {
71
+ const { binding } = entry;
72
+ const result = binding.runCase
73
+ ? await binding.runCase(request)
74
+ : binding.plan
75
+ ? await deps.runner.runCase(binding.plan, request)
76
+ : undefined;
77
+ if (result === undefined) {
78
+ json(res, 500, { code: "EVAL_ENGINE_ERROR" });
79
+ return true;
80
+ }
81
+ json(res, 200, result);
82
+ }
83
+ catch {
84
+ json(res, 500, { code: "EVAL_ENGINE_ERROR" });
85
+ }
86
+ return true;
87
+ }
@@ -0,0 +1,46 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import type { SessionsSource } from "../config/datasetFromSessions.js";
3
+ import type { EvalSampleAgents } from "../config/installEvalSample.js";
4
+ import type { EngineStatus } from "../evals/engine/promptfoo/status.js";
5
+ import type { TokenPrice } from "../evals/estimate.js";
6
+ import type { EvalAgentsPort, EvalRunManager } from "../evals/manager.js";
7
+ import { EvalApiError } from "../evals/read/api.js";
8
+ import type { EvalRunRow } from "../evals/storeTypes.js";
9
+ import type { TriageDeps } from "../evals/triage/service.js";
10
+ import type { Logger } from "../logging/logger.js";
11
+ import type { RunStore } from "../runstore/port.js";
12
+ import type { RunManager } from "../runtime/runManager.js";
13
+ export type EvalRoutesDeps = {
14
+ cwd: string;
15
+ store: RunStore;
16
+ manager: RunManager;
17
+ evalRunManager: EvalRunManager | undefined;
18
+ json: (res: ServerResponse, status: number, body: unknown) => void;
19
+ readJsonBody: (req: IncomingMessage) => Promise<unknown>;
20
+ auditLog: Logger;
21
+ engineStatus: () => EngineStatus;
22
+ isKnownModel?: (id: string) => Promise<boolean>;
23
+ sampleSourceDir?: string;
24
+ now?: () => Date;
25
+ /** Lazy view of the agent service; absent or undefined means agents are unavailable on this host. */
26
+ agents?: () => RouteAgents | undefined;
27
+ /** Model prices (USD per million tokens) for the agent cost estimate; unknown models are simply absent. */
28
+ loadPrices?: (modelIds: string[], projectRoot: string) => Promise<Map<string, TokenPrice>>;
29
+ /** Failure sorting: the Host's agent backend (judge classifier) and test seams (fetch, key lookup, base URL). */
30
+ triage?: Omit<TriageDeps, "store">;
31
+ };
32
+ export type Ctx = EvalRoutesDeps & {
33
+ req: IncomingMessage;
34
+ res: ServerResponse;
35
+ url: URL;
36
+ method: string;
37
+ pathname: string;
38
+ evalRunManager: EvalRunManager;
39
+ };
40
+ export type RouteAgents = EvalAgentsPort & SessionsSource & Partial<Pick<EvalSampleAgents, "create" | "setEnabled">>;
41
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
42
+ export declare function bad(message: string, code?: string): EvalApiError;
43
+ export declare function audit(c: Ctx, action: string, outcome: "ok" | "error", target?: string, code?: string): void;
44
+ export declare function readOptionalBody(c: Ctx): Promise<Record<string, unknown>>;
45
+ export declare function optStringArray(body: Record<string, unknown>, key: string): string[] | undefined;
46
+ export declare function runByIdOr404(c: Ctx, id: string): Promise<EvalRunRow>;
@@ -0,0 +1,43 @@
1
+ import { badRequest, runByIdOr404 as runByIdOr404Shared } from "../evals/read/api.js";
2
+ import { writeAudit } from "../logging/audit.js";
3
+ import { callerIdFromRequestAuth, getRequestAuth } from "./requestAuthContext.js";
4
+ export function isRecord(value) {
5
+ return typeof value === "object" && value !== null && !Array.isArray(value);
6
+ }
7
+ export function bad(message, code = "invalid_request") {
8
+ return badRequest(message, code);
9
+ }
10
+ function surface() {
11
+ return getRequestAuth()?.surface ?? "rest";
12
+ }
13
+ export function audit(c, action, outcome, target, code) {
14
+ writeAudit(c.auditLog, {
15
+ caller_id: callerIdFromRequestAuth(),
16
+ surface: surface(),
17
+ action,
18
+ outcome,
19
+ ...(target !== undefined ? { target_run_id: target } : {}),
20
+ ...(code !== undefined ? { error_code: code } : {}),
21
+ });
22
+ }
23
+ export async function readOptionalBody(c) {
24
+ try {
25
+ const body = await c.readJsonBody(c.req);
26
+ return isRecord(body) ? body : {};
27
+ }
28
+ catch {
29
+ return {};
30
+ }
31
+ }
32
+ export function optStringArray(body, key) {
33
+ const value = body[key];
34
+ if (value === undefined)
35
+ return undefined;
36
+ if (!Array.isArray(value) || value.some((v) => typeof v !== "string" || v === "")) {
37
+ throw bad(`"${key}" must be an array of non-empty strings`);
38
+ }
39
+ return value;
40
+ }
41
+ export async function runByIdOr404(c, id) {
42
+ return runByIdOr404Shared(c.store, id);
43
+ }
@@ -0,0 +1,5 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import { type EvalRoutesDeps } from "./evalRouteContext.js";
3
+ export type { EvalRoutesDeps };
4
+ export declare function isEvalRoutePath(pathname: string): boolean;
5
+ export declare function handleEvalRoutes(req: IncomingMessage, res: ServerResponse, deps: EvalRoutesDeps): Promise<boolean>;