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,279 @@
1
+ import path from "node:path";
2
+ import { isStageTimeoutReason } from "../../agent/stageTimeout.js";
3
+ import { loadPipelineOutcome } from "../../config/loadPipeline.js";
4
+ import { readYamlObject } from "../../config/readYamlObject.js";
5
+ import { projectRunForMcp } from "../../mcp/projectRun.js";
6
+ import { isWaitingProjection } from "../../mcp/waitRun.js";
7
+ import { PipelineValidationError } from "../../runtime/pipelineValidationError.js";
8
+ import { caseToTask } from "../caseTask.js";
9
+ export const EVAL_STAGE_TIMEOUT_GRACE_MS = 60_000;
10
+ export const EVAL_STAGE_DEFAULT_TIMEOUT_MS = 30 * 60_000;
11
+ export const EVAL_RUNNER_POLL_INTERVAL_MS = 250;
12
+ export const EVAL_RUNNER_BUSY_BACKOFF_MS = { initial: 1_000, max: 5_000 };
13
+ class EngineError extends Error {
14
+ }
15
+ function sleep(ms, signal) {
16
+ return new Promise((resolve) => {
17
+ if (signal.aborted) {
18
+ resolve();
19
+ return;
20
+ }
21
+ const finish = () => {
22
+ clearTimeout(timer);
23
+ signal.removeEventListener("abort", finish);
24
+ resolve();
25
+ };
26
+ const timer = setTimeout(finish, ms);
27
+ signal.addEventListener("abort", finish, { once: true });
28
+ });
29
+ }
30
+ async function readStageBody(plan) {
31
+ const { target, projectRoot } = plan;
32
+ if (target.kind !== "stage")
33
+ throw new EngineError("Not a stage target");
34
+ const abs = (rel) => path.resolve(projectRoot, rel);
35
+ let body;
36
+ let stageId;
37
+ if (target.file !== undefined) {
38
+ body = await readYamlObject(abs(target.file));
39
+ stageId = typeof body.id === "string" ? body.id : undefined;
40
+ }
41
+ else if (target.pipelinePath !== undefined && target.stageId !== undefined) {
42
+ stageId = target.stageId;
43
+ const pipelineAbs = abs(target.pipelinePath);
44
+ const loaded = await loadPipelineOutcome(pipelineAbs, { cwd: projectRoot, projectRoot, requireIo: false });
45
+ if (!loaded.ok)
46
+ throw new EngineError(`Target pipeline ${target.pipelinePath} does not load`);
47
+ const source = loaded.value.stageSources?.[stageId];
48
+ if (source?.kind === "file") {
49
+ body = await readYamlObject(source.path);
50
+ }
51
+ else {
52
+ const raw = await readYamlObject(pipelineAbs);
53
+ const entries = Array.isArray(raw.stages) ? raw.stages : [];
54
+ const entry = entries.find((e) => typeof e === "object" && e !== null && e.id === stageId);
55
+ if (entry !== undefined) {
56
+ const { needs: _needs, route: _route, route_if: _routeIf, entry: _entry, ...rest } = entry;
57
+ body = rest;
58
+ }
59
+ }
60
+ }
61
+ if (body === undefined || stageId === undefined) {
62
+ throw new EngineError("Target stage could not be read");
63
+ }
64
+ return { body: { ...body, id: stageId }, stageId };
65
+ }
66
+ function sumTokens(usage) {
67
+ let tokensIn = 0;
68
+ let tokensOut = 0;
69
+ for (const model of Object.values(usage?.models ?? {})) {
70
+ tokensIn += model.inputTokens;
71
+ tokensOut += model.outputTokens;
72
+ }
73
+ return { tokensIn, tokensOut };
74
+ }
75
+ function failure(code, message, extra = {}) {
76
+ return {
77
+ ok: false,
78
+ code,
79
+ message,
80
+ ...(extra.stageRunId !== undefined ? { stageRunId: extra.stageRunId } : {}),
81
+ ...(extra.latencyMs !== undefined ? { latencyMs: extra.latencyMs } : {}),
82
+ ...(extra.costUsd !== undefined ? { costUsd: extra.costUsd } : {}),
83
+ };
84
+ }
85
+ export function createStageCaseRunner(deps) {
86
+ const { manager, store } = deps;
87
+ const pollMs = deps.pollIntervalMs ?? EVAL_RUNNER_POLL_INTERVAL_MS;
88
+ const backoff = deps.busyBackoffMs ?? EVAL_RUNNER_BUSY_BACKOFF_MS;
89
+ const graceMs = deps.timeoutGraceMs ?? EVAL_STAGE_TIMEOUT_GRACE_MS;
90
+ const defaultTimeoutMs = deps.defaultTimeoutMs ?? EVAL_STAGE_DEFAULT_TIMEOUT_MS;
91
+ const states = new Map();
92
+ const stateFor = (evalRunId) => {
93
+ let state = states.get(evalRunId);
94
+ if (state === undefined) {
95
+ state = { active: new Map(), stops: new Map(), spend: 0, cancelled: false, abort: new AbortController() };
96
+ states.set(evalRunId, state);
97
+ }
98
+ return state;
99
+ };
100
+ async function cancelStageRun(state, runId, reason) {
101
+ if (!state.stops.has(runId))
102
+ state.stops.set(runId, reason);
103
+ await manager.cancelRun(runId, `eval_${reason}`).catch(() => undefined);
104
+ }
105
+ async function startWithRetry(state, input) {
106
+ let delay = backoff.initial;
107
+ for (;;) {
108
+ const started = await manager.startRun(input);
109
+ if (started.ok || started.code !== "busy_capacity" || state.cancelled)
110
+ return started;
111
+ await sleep(delay, state.abort.signal);
112
+ if (state.cancelled)
113
+ return started;
114
+ delay = Math.min(delay * 2, backoff.max);
115
+ }
116
+ }
117
+ async function awaitRun(state, runId, done, timeoutMs) {
118
+ let stop = false;
119
+ const wakeUp = new AbortController();
120
+ let timer;
121
+ const settled = done.then(() => "done", () => "done");
122
+ const timedOut = new Promise((resolve) => {
123
+ timer = setTimeout(() => resolve("timeout"), timeoutMs);
124
+ });
125
+ const waiting = (async () => {
126
+ while (!stop) {
127
+ await sleep(pollMs, wakeUp.signal);
128
+ if (stop)
129
+ break;
130
+ try {
131
+ const detail = await store.readRun(runId);
132
+ if (detail.status === "running" && isWaitingProjection(projectRunForMcp(detail)))
133
+ return "waiting";
134
+ }
135
+ catch {
136
+ /* run row not readable yet; retry on next tick */
137
+ }
138
+ }
139
+ return "stopped";
140
+ })();
141
+ try {
142
+ const wake = await Promise.race([settled, timedOut, waiting]);
143
+ if (wake === "waiting")
144
+ await cancelStageRun(state, runId, "needs_input");
145
+ else if (wake === "timeout")
146
+ await cancelStageRun(state, runId, "timeout");
147
+ await settled;
148
+ }
149
+ finally {
150
+ stop = true;
151
+ wakeUp.abort();
152
+ if (timer !== undefined)
153
+ clearTimeout(timer);
154
+ }
155
+ }
156
+ async function collect(state, runId, stageId, fallbackLatencyMs) {
157
+ const detail = await store.readRun(runId);
158
+ const stage = detail.stages.find((s) => s.stage_id === stageId) ?? detail.stages[0];
159
+ const costUsd = stage?.cost_usd ?? stage?.usage?.costUsd ?? detail.total_cost_usd ?? 0;
160
+ let latencyMs = fallbackLatencyMs;
161
+ try {
162
+ const executions = await store.listStageExecutions(runId, stage?.stage_id ?? stageId);
163
+ const latest = executions[executions.length - 1];
164
+ if (latest?.started_at !== undefined && latest.finished_at !== undefined) {
165
+ latencyMs = Math.max(0, Date.parse(latest.finished_at) - Date.parse(latest.started_at));
166
+ }
167
+ }
168
+ catch {
169
+ /* keep wall-clock fallback */
170
+ }
171
+ const extra = { stageRunId: runId, latencyMs, costUsd };
172
+ state.spend += costUsd;
173
+ if (detail.status === "cancelled") {
174
+ const reason = state.stops.get(runId) ?? "cancelled";
175
+ if (reason === "needs_input") {
176
+ return failure("EVAL_STAGE_NEEDS_INPUT", "Stage stopped to ask the operator for input", extra);
177
+ }
178
+ if (reason === "timeout") {
179
+ return failure("EVAL_STAGE_TIMEOUT", "Stage exceeded the eval safety timeout", extra);
180
+ }
181
+ return failure("EVAL_CANCELLED", "Eval run was cancelled", extra);
182
+ }
183
+ if (detail.status === "failed") {
184
+ const reason = detail.failed_reason ?? "Stage failed";
185
+ return failure(isStageTimeoutReason(reason) ? "EVAL_STAGE_TIMEOUT" : "EVAL_STAGE_FAILED", reason, extra);
186
+ }
187
+ if (detail.status !== "succeeded") {
188
+ return failure("EVAL_ENGINE_ERROR", `Stage run ended in unexpected state "${detail.status}"`, extra);
189
+ }
190
+ const envelope = stage?.envelope;
191
+ if (!envelope)
192
+ return failure("EVAL_ENGINE_ERROR", "Stage run finished without an envelope", extra);
193
+ const output = {
194
+ kind: "envelope",
195
+ status: envelope.status === "success" ? "success" : "failure",
196
+ summary: envelope.summary,
197
+ ...(envelope.payload !== undefined ? { payload: envelope.payload } : {}),
198
+ artifacts: envelope.artifacts ?? [],
199
+ };
200
+ const { tokensIn, tokensOut } = sumTokens(stage?.usage);
201
+ return { ok: true, stageRunId: runId, output, latencyMs, costUsd, tokensIn, tokensOut };
202
+ }
203
+ async function runCase(plan, req) {
204
+ const state = stateFor(req.evalRunId);
205
+ if (state.cancelled)
206
+ return failure("EVAL_CANCELLED", "Eval run was cancelled");
207
+ if (state.spend >= plan.maxCostUsd) {
208
+ return failure("EVAL_BUDGET_EXCEEDED", `Eval spend reached the $${plan.maxCostUsd} limit`);
209
+ }
210
+ const planCase = plan.cases.find((c) => c.id === req.caseId);
211
+ if (planCase === undefined)
212
+ return failure("EVAL_ENGINE_ERROR", `Case "${req.caseId}" is not in the plan`);
213
+ let stageBody;
214
+ try {
215
+ stageBody = await readStageBody(plan);
216
+ }
217
+ catch (err) {
218
+ return failure("EVAL_ENGINE_ERROR", err instanceof Error ? err.message : "Target stage could not be read");
219
+ }
220
+ const { body, stageId } = stageBody;
221
+ const pipeline = {
222
+ id: `standalone-${stageId}`,
223
+ stages: [{ ...body, model: plan.modelOverride ?? plan.stageModel }],
224
+ };
225
+ const task = caseToTask(plan, planCase, req.evalRunId, req.repeatIndex);
226
+ const startedAt = Date.now();
227
+ let started;
228
+ try {
229
+ started = await startWithRetry(state, { pipeline, task, projectRoot: plan.projectRoot, origin: "eval" });
230
+ }
231
+ catch (err) {
232
+ if (err instanceof PipelineValidationError) {
233
+ const first = err.result.findings.find((f) => f.severity === "error") ?? err.result.findings[0];
234
+ return failure("EVAL_ENGINE_ERROR", first?.message ?? "Stage validation failed");
235
+ }
236
+ return failure("EVAL_ENGINE_ERROR", err instanceof Error ? err.message : "Stage run could not start");
237
+ }
238
+ if (!started.ok) {
239
+ if (state.cancelled)
240
+ return failure("EVAL_CANCELLED", "Eval run was cancelled");
241
+ return failure("EVAL_ENGINE_ERROR", started.reason);
242
+ }
243
+ const { runId, done } = started;
244
+ state.active.set(runId, { done });
245
+ try {
246
+ if (state.cancelled)
247
+ await cancelStageRun(state, runId, "cancelled");
248
+ const declared = typeof body.timeout_ms === "number" ? body.timeout_ms : undefined;
249
+ const timeoutMs = declared !== undefined ? declared + graceMs : defaultTimeoutMs;
250
+ await awaitRun(state, runId, done, timeoutMs);
251
+ return await collect(state, runId, stageId, Date.now() - startedAt);
252
+ }
253
+ catch (err) {
254
+ return failure("EVAL_ENGINE_ERROR", err instanceof Error ? err.message : "Stage run failed", {
255
+ stageRunId: runId,
256
+ });
257
+ }
258
+ finally {
259
+ state.active.delete(runId);
260
+ state.stops.delete(runId);
261
+ }
262
+ }
263
+ return {
264
+ runCase,
265
+ async cancelAll(evalRunId) {
266
+ const state = stateFor(evalRunId);
267
+ state.cancelled = true;
268
+ state.abort.abort();
269
+ await Promise.all([...state.active.entries()].map(async ([runId, entry]) => {
270
+ await cancelStageRun(state, runId, "cancelled");
271
+ await Promise.resolve(entry.done).catch(() => undefined);
272
+ }));
273
+ },
274
+ spend: (evalRunId) => states.get(evalRunId)?.spend ?? 0,
275
+ addSpend(evalRunId, usd) {
276
+ stateFor(evalRunId).spend += usd;
277
+ },
278
+ };
279
+ }
@@ -0,0 +1,71 @@
1
+ import { type DriverUsage, type SimulatorModel } from "./simulatorModel.js";
2
+ export type { DriverUsage };
3
+ export type DriverMode = "script" | "simulated";
4
+ export type DriverScenario = {
5
+ mode?: DriverMode;
6
+ script?: readonly string[];
7
+ opening?: string;
8
+ persona?: string;
9
+ goal?: string;
10
+ facts?: readonly string[];
11
+ };
12
+ export type DriverContext = {
13
+ turn: number;
14
+ transcript: Array<{
15
+ role: "user" | "assistant";
16
+ text: string;
17
+ }>;
18
+ signal: AbortSignal;
19
+ };
20
+ export type DriverEndReason = "script_end" | "resolved" | "abandoned" | "no_progress" | "empty_message";
21
+ export type DriverStep = {
22
+ kind: "message";
23
+ text: string;
24
+ endAfter?: "resolved" | "abandoned";
25
+ usage?: DriverUsage;
26
+ } | {
27
+ kind: "end";
28
+ reason: DriverEndReason;
29
+ usage?: DriverUsage;
30
+ };
31
+ export interface UserDriver {
32
+ next(ctx: DriverContext): Promise<DriverStep>;
33
+ }
34
+ export declare class DriverScenarioError extends Error {
35
+ readonly code = "EVAL_INVALID";
36
+ constructor(message: string);
37
+ }
38
+ export declare const SCRIPT_LIMITS: {
39
+ readonly minMessages: 1;
40
+ readonly maxMessages: 40;
41
+ };
42
+ export declare class ScriptDriver implements UserDriver {
43
+ private readonly script;
44
+ constructor(script: readonly string[]);
45
+ next(ctx: DriverContext): Promise<DriverStep>;
46
+ }
47
+ export declare function parseSimulatorReply(raw: string): {
48
+ text: string;
49
+ end?: "resolved" | "abandoned";
50
+ };
51
+ export declare class SimulatedUser implements UserDriver {
52
+ private readonly scenario;
53
+ private readonly model;
54
+ private readonly maxHistoryTurns;
55
+ private readonly maxMessageChars;
56
+ constructor(options: {
57
+ scenario: DriverScenario;
58
+ model: SimulatorModel;
59
+ maxHistoryTurns?: number;
60
+ maxMessageChars?: number;
61
+ });
62
+ next(ctx: DriverContext): Promise<DriverStep>;
63
+ }
64
+ export type DriverDeps = {
65
+ simulatorModel?: SimulatorModel;
66
+ limits?: {
67
+ maxHistoryTurns?: number;
68
+ maxMessageChars?: number;
69
+ };
70
+ };
71
+ export declare function createDriver(mode: DriverMode, scenario: DriverScenario, deps?: DriverDeps): UserDriver;
@@ -0,0 +1,104 @@
1
+ import { SimulatorError } from "./simulatorModel.js";
2
+ import { renderSimulatorPrompt, SIMULATOR_LIMITS } from "./simulatorPrompt.js";
3
+ export class DriverScenarioError extends Error {
4
+ code = "EVAL_INVALID";
5
+ constructor(message) {
6
+ super(message);
7
+ this.name = "DriverScenarioError";
8
+ }
9
+ }
10
+ export const SCRIPT_LIMITS = { minMessages: 1, maxMessages: 40 };
11
+ export class ScriptDriver {
12
+ script;
13
+ constructor(script) {
14
+ this.script = script;
15
+ }
16
+ async next(ctx) {
17
+ const text = this.script[ctx.turn - 1];
18
+ return text === undefined ? { kind: "end", reason: "script_end" } : { kind: "message", text };
19
+ }
20
+ }
21
+ const END_MARKER = /\[\[END:(resolved|abandoned)\]\]/g;
22
+ const LAST_LINE_MARKER = /^\[\[END:(resolved|abandoned)\]\]$/;
23
+ export function parseSimulatorReply(raw) {
24
+ const lines = raw.trim().split(/\r?\n/);
25
+ let end;
26
+ const last = lines[lines.length - 1]?.trim() ?? "";
27
+ const match = LAST_LINE_MARKER.exec(last);
28
+ if (match) {
29
+ end = match[1];
30
+ lines.pop();
31
+ }
32
+ const text = lines.join("\n").replace(END_MARKER, "").trim();
33
+ return end === undefined ? { text } : { text, end };
34
+ }
35
+ export class SimulatedUser {
36
+ scenario;
37
+ model;
38
+ maxHistoryTurns;
39
+ maxMessageChars;
40
+ constructor(options) {
41
+ const { opening, persona, goal } = options.scenario;
42
+ if (!opening || !persona || !goal) {
43
+ throw new DriverScenarioError("A simulated scenario needs opening, persona and goal.");
44
+ }
45
+ this.scenario = { opening, persona, goal, facts: options.scenario.facts ?? [] };
46
+ this.model = options.model;
47
+ this.maxHistoryTurns = options.maxHistoryTurns ?? SIMULATOR_LIMITS.maxHistoryTurns;
48
+ this.maxMessageChars = options.maxMessageChars ?? SIMULATOR_LIMITS.maxMessageChars;
49
+ }
50
+ async next(ctx) {
51
+ if (ctx.turn <= 1)
52
+ return { kind: "message", text: this.scenario.opening };
53
+ const { system, user } = renderSimulatorPrompt({
54
+ persona: this.scenario.persona,
55
+ goal: this.scenario.goal,
56
+ facts: this.scenario.facts,
57
+ transcript: ctx.transcript,
58
+ limits: { maxHistoryTurns: this.maxHistoryTurns, maxMessageChars: this.maxMessageChars },
59
+ });
60
+ let reply;
61
+ try {
62
+ reply = await this.model.complete({ system, user, signal: ctx.signal });
63
+ }
64
+ catch (error) {
65
+ if (ctx.signal.aborted || error instanceof SimulatorError)
66
+ throw error;
67
+ throw new SimulatorError();
68
+ }
69
+ const usage = reply.usage;
70
+ const parsed = parseSimulatorReply(reply.text);
71
+ const text = parsed.text.length > SIMULATOR_LIMITS.maxReplyChars ? parsed.text.slice(0, SIMULATOR_LIMITS.maxReplyChars) : parsed.text;
72
+ const withUsage = usage === undefined ? {} : { usage };
73
+ if (text.length === 0) {
74
+ return parsed.end === undefined
75
+ ? { kind: "end", reason: "empty_message", ...withUsage }
76
+ : { kind: "end", reason: parsed.end, ...withUsage };
77
+ }
78
+ const previous = [...ctx.transcript].reverse().find((entry) => entry.role === "user")?.text;
79
+ if (previous !== undefined && previous.trim().toLowerCase() === text.trim().toLowerCase()) {
80
+ return { kind: "end", reason: "no_progress", ...withUsage };
81
+ }
82
+ return parsed.end === undefined
83
+ ? { kind: "message", text, ...withUsage }
84
+ : { kind: "message", text, endAfter: parsed.end, ...withUsage };
85
+ }
86
+ }
87
+ export function createDriver(mode, scenario, deps = {}) {
88
+ if (mode === "script") {
89
+ const script = scenario.script;
90
+ if (!Array.isArray(script) || script.length < SCRIPT_LIMITS.minMessages || script.length > SCRIPT_LIMITS.maxMessages) {
91
+ throw new DriverScenarioError(`A scripted scenario needs ${SCRIPT_LIMITS.minMessages}-${SCRIPT_LIMITS.maxMessages} messages.`);
92
+ }
93
+ if (script.some((message) => typeof message !== "string" || message.trim().length === 0)) {
94
+ throw new DriverScenarioError("A scripted scenario cannot contain an empty message.");
95
+ }
96
+ return new ScriptDriver(script);
97
+ }
98
+ if (mode === "simulated") {
99
+ if (deps.simulatorModel === undefined)
100
+ throw new DriverScenarioError("A simulated scenario needs a simulator model.");
101
+ return new SimulatedUser({ scenario, model: deps.simulatorModel, ...deps.limits });
102
+ }
103
+ throw new DriverScenarioError(`Unknown conversation mode "${String(mode)}".`);
104
+ }
@@ -0,0 +1,34 @@
1
+ import type { BudgetWarning, GradeStatus, ResultStatus, RunBudget } from "./statsTypes.js";
2
+ export interface ScoringGrader {
3
+ id: string;
4
+ type?: string;
5
+ weight: number;
6
+ mustPass: boolean;
7
+ scale?: "pass_fail" | "1_to_5";
8
+ passAt?: number;
9
+ }
10
+ export interface ScoringGrade {
11
+ graderId: string;
12
+ status: GradeStatus;
13
+ passed: 0 | 1 | boolean | null;
14
+ score: number | null;
15
+ rawValue?: number | null;
16
+ }
17
+ export interface ScoreResultInput {
18
+ graders: ScoringGrader[];
19
+ grades: ScoringGrade[];
20
+ passThreshold: number;
21
+ status: ResultStatus;
22
+ latencyMs: number | null;
23
+ costUsd: number | null;
24
+ budget?: RunBudget | null;
25
+ }
26
+ export interface ScoreResultOutput {
27
+ score: number | null;
28
+ passed: boolean;
29
+ hasGraderErrors: boolean;
30
+ budgetWarnings: BudgetWarning[];
31
+ }
32
+ export declare function normalizeOneToFive(raw: number): number;
33
+ export declare function graderPassed(grader: ScoringGrader, grade: Pick<ScoringGrade, "passed" | "score" | "rawValue">, passThreshold: number): boolean;
34
+ export declare function scoreResult(input: ScoreResultInput): ScoreResultOutput;
@@ -0,0 +1,67 @@
1
+ const EPS = 1e-9;
2
+ export function normalizeOneToFive(raw) {
3
+ return (raw - 1) / 4;
4
+ }
5
+ export function graderPassed(grader, grade, passThreshold) {
6
+ if (grade.passed !== null && grade.passed !== undefined)
7
+ return Boolean(grade.passed);
8
+ const score = grade.score ?? 0;
9
+ if (grader.type === "reference")
10
+ return score + EPS >= (grader.passAt ?? 1);
11
+ if (grader.type === "rubric" && grader.scale === "1_to_5") {
12
+ return (grade.rawValue ?? 0) + EPS >= (grader.passAt ?? 4);
13
+ }
14
+ if (grader.type === "code")
15
+ return score + EPS >= passThreshold;
16
+ return score + EPS >= 1;
17
+ }
18
+ function budgetWarnings(latencyMs, costUsd, budget) {
19
+ const warnings = [];
20
+ if (budget?.latencyMs != null && latencyMs != null && latencyMs > budget.latencyMs) {
21
+ warnings.push("latency");
22
+ }
23
+ if (budget?.costUsd != null && costUsd != null && costUsd > budget.costUsd) {
24
+ warnings.push("cost");
25
+ }
26
+ return warnings;
27
+ }
28
+ export function scoreResult(input) {
29
+ const warnings = budgetWarnings(input.latencyMs, input.costUsd, input.budget);
30
+ if (input.status !== "completed") {
31
+ return { score: null, passed: false, hasGraderErrors: false, budgetWarnings: warnings };
32
+ }
33
+ const gradeById = new Map();
34
+ for (const grade of input.grades)
35
+ gradeById.set(grade.graderId, grade);
36
+ let mustPassFailed = false;
37
+ let hasGraderErrors = false;
38
+ let weightedSum = 0;
39
+ let weightTotal = 0;
40
+ for (const grader of input.graders) {
41
+ const grade = gradeById.get(grader.id);
42
+ if (grader.mustPass) {
43
+ if (!grade) {
44
+ mustPassFailed = true;
45
+ }
46
+ else if (grade.status === "error") {
47
+ mustPassFailed = true;
48
+ hasGraderErrors = true;
49
+ }
50
+ else if (!graderPassed(grader, grade, input.passThreshold)) {
51
+ mustPassFailed = true;
52
+ }
53
+ continue;
54
+ }
55
+ if (!grade)
56
+ continue;
57
+ if (grade.status === "error") {
58
+ hasGraderErrors = true;
59
+ continue;
60
+ }
61
+ weightedSum += grader.weight * (grade.score ?? 0);
62
+ weightTotal += grader.weight;
63
+ }
64
+ const score = weightTotal > 0 ? weightedSum / weightTotal : mustPassFailed ? 0 : 1;
65
+ const passed = !mustPassFailed && score + EPS >= input.passThreshold;
66
+ return { score, passed, hasGraderErrors, budgetWarnings: warnings };
67
+ }