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,8 +1,10 @@
1
1
  import path from "node:path";
2
+ import { Type } from "typebox";
2
3
  import { peekDefaultModel } from "../../models/catalog.js";
3
4
  import { parse as parseYaml } from "yaml";
4
5
  import { CatalogPathError, resolveDefaultWriteRoot, } from "../../config/catalogRelativePath.js";
5
6
  import { defaultWorkshopPackageDirectory } from "../../config/ensureCatalogScanRoot.js";
7
+ import { canonicalizeNeedTerminalState } from "../../config/pipelineNeeds.js";
6
8
  import { publishDraftPackage } from "../../config/publishDraftPackage.js";
7
9
  import { globalStageflowHome } from "../../project/globalHome.js";
8
10
  import { emptyDraftPackage, isWorkshopDraftContext, readDraftFromContext, withDraft, } from "../draftContext.js";
@@ -34,6 +36,9 @@ export const WORKSHOP_AUTHOR_TOOL_NAMES = [
34
36
  "retrieve_docs",
35
37
  ];
36
38
  export const WORKSHOP_FORBIDDEN_AGENT_TOOLS = ["bash", "write", "edit"];
39
+ const closed = { additionalProperties: false };
40
+ const jsonObject = Type.Record(Type.String(), Type.Unknown());
41
+ const emptyParams = Type.Object({}, closed);
37
42
  const REQUIRED_IO = {
38
43
  io: {
39
44
  input: { schema: { type: "object" } },
@@ -82,6 +87,9 @@ function stringArg(args, key) {
82
87
  const value = args[key];
83
88
  return typeof value === "string" && value.trim() ? value.trim() : undefined;
84
89
  }
90
+ function isStringList(value) {
91
+ return Array.isArray(value) && value.every((item) => typeof item === "string");
92
+ }
85
93
  function applyMutation(ctx, summary, nextDraft) {
86
94
  const current = readDraftFromContext(ctx.getContext());
87
95
  const proposal = {
@@ -174,6 +182,52 @@ async function resolveSaveWriteTarget(ctx, options) {
174
182
  await store.close();
175
183
  }
176
184
  }
185
+ function normalizeRouteOnField(on) {
186
+ if (Array.isArray(on)) {
187
+ return on.map((item) => canonicalizeNeedTerminalState(item) ?? item);
188
+ }
189
+ const one = canonicalizeNeedTerminalState(on);
190
+ return one ?? on;
191
+ }
192
+ function normalizeRouteEntries(route) {
193
+ if (!Array.isArray(route))
194
+ return route;
195
+ return route.map((entry) => {
196
+ if (!entry || typeof entry !== "object" || Array.isArray(entry))
197
+ return entry;
198
+ const rec = entry;
199
+ if (rec.on === undefined)
200
+ return entry;
201
+ return { ...rec, on: normalizeRouteOnField(rec.on) };
202
+ });
203
+ }
204
+ function isInlinePipelineStageBody(stage) {
205
+ return stage.system_prompt !== undefined || stage.uses === undefined;
206
+ }
207
+ function normalizePipelineStagesRouteOn(stages, options) {
208
+ const next = stages.map((stage) => {
209
+ if (!stage || typeof stage !== "object")
210
+ return stage;
211
+ let out = { ...stage };
212
+ if (Array.isArray(out.route)) {
213
+ out = {
214
+ ...out,
215
+ route: normalizeRouteEntries(out.route),
216
+ };
217
+ }
218
+ if (isInlinePipelineStageBody(out) && out.io === undefined) {
219
+ out = { ...out, ...REQUIRED_IO };
220
+ }
221
+ return out;
222
+ });
223
+ if (options?.ensureEntry &&
224
+ next.length > 0 &&
225
+ !next.some((stage) => stage?.entry === true)) {
226
+ const first = next[0];
227
+ next[0] = { ...first, entry: true };
228
+ }
229
+ return next;
230
+ }
177
231
  export function buildCreateStageDraft(draft, args) {
178
232
  const existingIds = new Set(draft.pipeline.stages.map((s) => (typeof s.id === "string" ? s.id : "")));
179
233
  let stageId = stringArg(args, "id") ??
@@ -211,7 +265,7 @@ export function buildCreateStageDraft(draft, args) {
211
265
  ...(entry ? { entry: true } : {}),
212
266
  };
213
267
  if (Array.isArray(args.route)) {
214
- pipelineEntry.route = args.route;
268
+ pipelineEntry.route = normalizeRouteEntries(args.route);
215
269
  }
216
270
  const nextDraft = {
217
271
  ...draft,
@@ -244,7 +298,7 @@ export function buildEditStageDraft(draft, args) {
244
298
  if (typeof args.entry === "boolean")
245
299
  next.entry = args.entry;
246
300
  if (Array.isArray(args.route))
247
- next.route = args.route;
301
+ next.route = normalizeRouteEntries(args.route);
248
302
  if (stringArg(args, "uses"))
249
303
  next.uses = stringArg(args, "uses");
250
304
  return next;
@@ -317,7 +371,16 @@ export function buildCreatePipelineDraft(draft, args) {
317
371
  ok: true,
318
372
  nextDraft: {
319
373
  ...draft,
320
- pipeline: { ...pipeline, id: pipeline.id.trim() },
374
+ pipeline: {
375
+ ...pipeline,
376
+ id: pipeline.id.trim(),
377
+ model: typeof pipeline.model === "string" && pipeline.model.trim()
378
+ ? pipeline.model
379
+ : stringArg(args, "model") ?? peekDefaultModel(),
380
+ stages: normalizePipelineStagesRouteOn(pipeline.stages, {
381
+ ensureEntry: true,
382
+ }),
383
+ },
321
384
  ...(Array.isArray(args.stages)
322
385
  ? { stages: args.stages }
323
386
  : {}),
@@ -331,15 +394,51 @@ export function buildCreatePipelineDraft(draft, args) {
331
394
  pipeline: {
332
395
  ...draft.pipeline,
333
396
  id,
334
- ...(stringArg(args, "model") ? { model: stringArg(args, "model") } : {}),
397
+ model: stringArg(args, "model") ?? peekDefaultModel(),
335
398
  ...(args.agent !== undefined ? { agent: args.agent } : {}),
336
399
  ...(Array.isArray(args.stages)
337
- ? { stages: args.stages }
400
+ ? {
401
+ stages: normalizePipelineStagesRouteOn(args.stages, { ensureEntry: true }),
402
+ }
338
403
  : {}),
339
404
  },
340
405
  },
341
406
  };
342
407
  }
408
+ function normalizeDraftStagePath(stagePath) {
409
+ return stagePath.replace(/\\/g, "/").replace(/^\.\//, "");
410
+ }
411
+ function stageWiringMatchesArtifact(stage, artifact) {
412
+ const id = typeof stage.id === "string" ? stage.id : "";
413
+ const uses = typeof stage.uses === "string" ? stage.uses : "";
414
+ const bodyId = typeof artifact.body.id === "string" ? artifact.body.id : "";
415
+ return ((uses.length > 0 &&
416
+ normalizeDraftStagePath(artifact.path) ===
417
+ normalizeDraftStagePath(uses)) ||
418
+ (id.length > 0 && bodyId === id));
419
+ }
420
+ /** Refuse stages wiring that diverges from draft.stages bodies (no silent prune). */
421
+ export function validateEditPipelineStagesWiring(draft, nextStages) {
422
+ const artifacts = draft.stages ?? [];
423
+ for (const stage of nextStages) {
424
+ const matched = artifacts.some((artifact) => stageWiringMatchesArtifact(stage, artifact));
425
+ if (!matched) {
426
+ const label = (typeof stage.id === "string" && stage.id) ||
427
+ (typeof stage.uses === "string" && stage.uses) ||
428
+ "(unnamed)";
429
+ return `edit_pipeline stages wiring references "${label}" without a matching stage body — use create_stage / edit_stage to add or change stage files`;
430
+ }
431
+ }
432
+ for (const artifact of artifacts) {
433
+ const stillWired = nextStages.some((stage) => stageWiringMatchesArtifact(stage, artifact));
434
+ if (!stillWired) {
435
+ const label = (typeof artifact.body.id === "string" && artifact.body.id) ||
436
+ artifact.path;
437
+ return `edit_pipeline stages wiring drops stage body "${label}" — use create_stage / edit_stage to change stage files; wiring-only remove is refused`;
438
+ }
439
+ }
440
+ return null;
441
+ }
343
442
  export function buildEditPipelineDraft(draft, args) {
344
443
  const patch = isPlainObject(args.patch) ? args.patch : args;
345
444
  const nextPipeline = {
@@ -352,12 +451,30 @@ export function buildEditPipelineDraft(draft, args) {
352
451
  if (patch.agent !== undefined)
353
452
  nextPipeline.agent = patch.agent;
354
453
  if (Array.isArray(patch.stages)) {
355
- nextPipeline.stages = patch.stages;
454
+ const nextStages = normalizePipelineStagesRouteOn(patch.stages);
455
+ const wiringError = validateEditPipelineStagesWiring(draft, nextStages);
456
+ if (wiringError)
457
+ return { ok: false, error: wiringError };
458
+ nextPipeline.stages = nextStages;
356
459
  }
357
460
  if (patch.schemas !== undefined)
358
461
  nextPipeline.schemas = patch.schemas;
359
462
  if (patch.requires !== undefined)
360
463
  nextPipeline.requires = patch.requires;
464
+ if (isStringList(patch.memories)) {
465
+ if (patch.memories.length === 0)
466
+ delete nextPipeline.memories;
467
+ else
468
+ nextPipeline.memories = patch.memories;
469
+ }
470
+ if (patch.channels !== undefined) {
471
+ if (Array.isArray(patch.channels) && patch.channels.length === 0) {
472
+ delete nextPipeline.channels;
473
+ }
474
+ else {
475
+ nextPipeline.channels = patch.channels;
476
+ }
477
+ }
361
478
  return {
362
479
  ok: true,
363
480
  nextDraft: { ...draft, pipeline: nextPipeline },
@@ -428,6 +545,7 @@ export function createWorkshopBuildTools() {
428
545
  const listBuildsTool = {
429
546
  name: "list_builds",
430
547
  description: "List the same workshop rows as the studio picker (open builds and unbound disk pipelines). Each row includes catalogListed (whether Tasks/Pipelines would list that pipeline path). Does not create a build. Works when no build is focused.",
548
+ parameters: emptyParams,
431
549
  async handler(_args, ctx) {
432
550
  const live = liveWorkshopBinding(ctx);
433
551
  if (!live) {
@@ -458,7 +576,14 @@ export function createWorkshopBuildTools() {
458
576
  };
459
577
  const focusBuildTool = {
460
578
  name: "focus_build",
461
- description: "Move this chat onto a build by id, or onto an unbound disk pipeline by projectRoot and relativePath. A failed open returns the error, creates nothing, and leaves the pointer unchanged.",
579
+ description: "Move this chat onto a build by id, or onto an unbound disk pipeline by projectRoot and relativePath. Mid-turn, the mutation pin moves with the focus so studio and draft tools stay on the same build. A failed open returns the error, creates nothing, and leaves the pointer unchanged.",
580
+ parameters: Type.Union([
581
+ Type.Object({ id: Type.String({ minLength: 1 }) }, closed),
582
+ Type.Object({
583
+ projectRoot: Type.String({ minLength: 1 }),
584
+ relativePath: Type.String({ minLength: 1 }),
585
+ }, closed),
586
+ ]),
462
587
  async handler(args, ctx) {
463
588
  const live = liveWorkshopBinding(ctx);
464
589
  if (!live) {
@@ -530,7 +655,8 @@ export function createWorkshopBuildTools() {
530
655
  };
531
656
  const createBuildTool = {
532
657
  name: "create_build",
533
- description: "Persist a new untitled build and focus it, including when another build is already focused. No build id argument.",
658
+ description: "Persist a new untitled build and focus it when none is pinned. When a build is already pinned, returns that build without creating another. No build id argument.",
659
+ parameters: emptyParams,
534
660
  async handler(_args, ctx) {
535
661
  const live = liveWorkshopBinding(ctx);
536
662
  if (!live) {
@@ -551,6 +677,13 @@ export function createWorkshopAuthorMutatingTools() {
551
677
  const createPipelineTool = {
552
678
  name: "create_pipeline",
553
679
  description: "Create or replace the draft pipeline (id, optional model/stages). Mutates the in-memory draft immediately.",
680
+ parameters: Type.Object({
681
+ id: Type.String({ minLength: 1 }),
682
+ model: Type.Optional(Type.String()),
683
+ agent: Type.Optional(Type.Unknown()),
684
+ stages: Type.Optional(Type.Array(jsonObject)),
685
+ pipeline: Type.Optional(jsonObject),
686
+ }, closed),
554
687
  handler(args, ctx) {
555
688
  const built = buildCreatePipelineDraft(readDraftFromContext(ctx.getContext()), args);
556
689
  if (!built.ok)
@@ -561,7 +694,18 @@ export function createWorkshopAuthorMutatingTools() {
561
694
  };
562
695
  const editPipelineTool = {
563
696
  name: "edit_pipeline",
564
- description: "Edit pipeline fields on the current draft (id, model, stages wiring, etc.). Mutates immediately.",
697
+ description: "Edit pipeline fields on the current draft (id, model, stages wiring, etc.). Stages wiring must match existing stage bodies — use create_stage / edit_stage to add or remove stages. Mutates immediately.",
698
+ parameters: Type.Object({
699
+ id: Type.Optional(Type.String()),
700
+ model: Type.Optional(Type.String()),
701
+ agent: Type.Optional(Type.Unknown()),
702
+ stages: Type.Optional(Type.Array(jsonObject)),
703
+ schemas: Type.Optional(Type.Unknown()),
704
+ requires: Type.Optional(Type.Unknown()),
705
+ memories: Type.Optional(Type.Array(Type.String())),
706
+ channels: Type.Optional(Type.Unknown()),
707
+ patch: Type.Optional(jsonObject),
708
+ }, closed),
565
709
  handler(args, ctx) {
566
710
  const built = buildEditPipelineDraft(readDraftFromContext(ctx.getContext()), args);
567
711
  if (!built.ok)
@@ -573,6 +717,18 @@ export function createWorkshopAuthorMutatingTools() {
573
717
  const createStageTool = {
574
718
  name: "create_stage",
575
719
  description: "Add a file-backed stage to the draft (uses: ./id.yaml + stage body with io). Mutates immediately; Accept confirms, Reject soft-undos.",
720
+ parameters: Type.Object({
721
+ id: Type.Optional(Type.String()),
722
+ summary: Type.Optional(Type.String()),
723
+ label: Type.Optional(Type.String()),
724
+ uses: Type.Optional(Type.String()),
725
+ body: Type.Optional(jsonObject),
726
+ system_prompt: Type.Optional(Type.String()),
727
+ model: Type.Optional(Type.String()),
728
+ io: Type.Optional(jsonObject),
729
+ entry: Type.Optional(Type.Boolean()),
730
+ route: Type.Optional(Type.Array(Type.Unknown())),
731
+ }, closed),
576
732
  handler(args, ctx) {
577
733
  const built = buildCreateStageDraft(readDraftFromContext(ctx.getContext()), args);
578
734
  if (!built.ok)
@@ -584,6 +740,18 @@ export function createWorkshopAuthorMutatingTools() {
584
740
  const editStageTool = {
585
741
  name: "edit_stage",
586
742
  description: "Edit an existing draft stage by id (body fields and/or pipeline entry route/entry/uses). Mutates immediately.",
743
+ parameters: Type.Object({
744
+ id: Type.String({ minLength: 1 }),
745
+ patch: Type.Optional(jsonObject),
746
+ body: Type.Optional(jsonObject),
747
+ pipeline_entry: Type.Optional(jsonObject),
748
+ entry: Type.Optional(Type.Boolean()),
749
+ route: Type.Optional(Type.Array(Type.Unknown())),
750
+ uses: Type.Optional(Type.String()),
751
+ system_prompt: Type.Optional(Type.String()),
752
+ model: Type.Optional(Type.String()),
753
+ io: Type.Optional(jsonObject),
754
+ }, closed),
587
755
  handler(args, ctx) {
588
756
  const built = buildEditStageDraft(readDraftFromContext(ctx.getContext()), args);
589
757
  if (!built.ok)
@@ -595,6 +763,13 @@ export function createWorkshopAuthorMutatingTools() {
595
763
  const createTaskTool = {
596
764
  name: "create_task",
597
765
  description: "Create or replace the optional task (id + goal) on the draft. Mutates immediately.",
766
+ parameters: Type.Object({
767
+ id: Type.Optional(Type.String()),
768
+ goal: Type.Optional(Type.String()),
769
+ summary: Type.Optional(Type.String()),
770
+ filename: Type.Optional(Type.String()),
771
+ body: Type.Optional(jsonObject),
772
+ }, closed),
598
773
  handler(args, ctx) {
599
774
  const built = buildCreateTaskDraft(readDraftFromContext(ctx.getContext()), args);
600
775
  if (!built.ok)
@@ -606,6 +781,13 @@ export function createWorkshopAuthorMutatingTools() {
606
781
  const editTaskTool = {
607
782
  name: "edit_task",
608
783
  description: "Edit the draft task fields (id, goal, body). Mutates immediately.",
784
+ parameters: Type.Object({
785
+ id: Type.Optional(Type.String()),
786
+ goal: Type.Optional(Type.String()),
787
+ filename: Type.Optional(Type.String()),
788
+ patch: Type.Optional(jsonObject),
789
+ body: Type.Optional(jsonObject),
790
+ }, closed),
609
791
  handler(args, ctx) {
610
792
  const built = buildEditTaskDraft(readDraftFromContext(ctx.getContext()), args);
611
793
  if (!built.ok)
@@ -627,6 +809,12 @@ export function createSaveTool(options = {}) {
627
809
  return {
628
810
  name: "save",
629
811
  description: "Validate-then-write the draft via catalog facades (createDraftPackage / overwriteDraftPackage). When directory is omitted, writes under workshop/<pipeline-id> on registered catalogs (or <pipeline-id> on the workspace catalog). The host adds registered workshop paths to stageflow.yaml so Run can see them. Pass directory only when the operator names a folder. Soft undo does not reverse disk. Prefer mode auto; set allowInvalid only when the operator explicitly requests saving invalid YAML. Do not pass projectRoot — the host binds it.",
812
+ parameters: Type.Object({
813
+ directory: Type.Optional(Type.String()),
814
+ pipelineFilename: Type.Optional(Type.String()),
815
+ mode: Type.Optional(Type.Union([Type.Literal("auto"), Type.Literal("create"), Type.Literal("overwrite")])),
816
+ allowInvalid: Type.Optional(Type.Boolean()),
817
+ }, closed),
630
818
  async handler(args, ctx) {
631
819
  const writeTarget = await resolveSaveWriteTarget(ctx, options);
632
820
  if (!writeTarget.ok) {
@@ -1,3 +1,4 @@
1
+ import type { TSchema } from "typebox";
1
2
  import type { DraftPackage } from "../config/draftPackage.js";
2
3
  import type { ValidationResult } from "../config/validateCatalog.js";
3
4
  import type { AcceptProposalResult, ProposalArtifactDiff, UndoMutationResult } from "./proposals.js";
@@ -10,6 +11,7 @@ export type OperatorAgentToolHandler = (args: Record<string, unknown>, ctx: Oper
10
11
  export type OperatorAgentTool = {
11
12
  name: string;
12
13
  description: string;
14
+ parameters: TSchema;
13
15
  handler: OperatorAgentToolHandler;
14
16
  };
15
17
  export type OperatorAgentToolContext = {
@@ -17,6 +19,14 @@ export type OperatorAgentToolContext = {
17
19
  setContext(next: unknown): void;
18
20
  /** Apply mutation immediately and record an undo receipt. */
19
21
  emitProposal(proposal: OperatorAgentProposal): void;
22
+ /**
23
+ * Set only on an eval session. Returning a result skips the tool handler.
24
+ * Returning null lets the handler run. Absent on Workshop, author and Guide sessions.
25
+ */
26
+ evalGate?: {
27
+ decide(name: string, args: Record<string, unknown>): OperatorAgentToolResult | null;
28
+ observe(name: string, result: OperatorAgentToolResult): void;
29
+ };
20
30
  };
21
31
  export type OperatorAgentProposal = {
22
32
  /** Mutation id (Accept confirms; Reject / undoMutation soft-undos). */
@@ -72,6 +82,10 @@ export type WorkshopToolActivityUpdate = {
72
82
  draft?: DraftPackage;
73
83
  /** Build the turn is editing. Absent when the chat is unlinked. */
74
84
  buildId?: string;
85
+ /** Tool arguments, on `running`. */
86
+ args?: Record<string, unknown>;
87
+ /** Tool result `content`, on `complete`. */
88
+ result?: unknown;
75
89
  };
76
90
  export type OperatorAgentSession = {
77
91
  readonly profileId: string;
@@ -111,6 +125,15 @@ export type OperatorAgentHost = {
111
125
  profileId: string;
112
126
  context: unknown;
113
127
  }): OperatorAgentSession;
128
+ /**
129
+ * A session whose tools pass through `gate` before they run. The gate is required:
130
+ * an eval session with no gate is refused.
131
+ */
132
+ openEvalSession(input: {
133
+ profileId: string;
134
+ context: unknown;
135
+ gate: NonNullable<OperatorAgentToolContext["evalGate"]>;
136
+ }): OperatorAgentSession;
114
137
  };
115
138
  export type WorkshopDraftContext = {
116
139
  draft: DraftPackage;
@@ -1,3 +1,3 @@
1
1
  export declare const PACKAGE_NAME = "stageflow";
2
- export declare const PACKAGE_VERSION = "0.40.0";
2
+ export declare const PACKAGE_VERSION = "0.44.0";
3
3
  export declare const BUILD_SHA: string;
@@ -1,3 +1,3 @@
1
1
  export const PACKAGE_NAME = "stageflow";
2
- export const PACKAGE_VERSION = "0.40.0";
2
+ export const PACKAGE_VERSION = "0.44.0";
3
3
  export const BUILD_SHA = process.env.STAGEFLOW_BUILD_SHA ?? "unknown";
@@ -1,4 +1,5 @@
1
1
  import type { StageLogLine } from "../agent/activity.js";
2
+ import type { EvalTargetKind } from "../evals/constants.js";
2
3
  import type { ConfigOriginRecord } from "../config/configOrigin.js";
3
4
  import type { RunSubmission, RunSubmissionRecord } from "./submission.js";
4
5
  import type { AskOperatorPrompt } from "../tools/askOperator.js";
@@ -8,6 +9,9 @@ import type { CompletionCheck } from "../types/completion.js";
8
9
  import type { StageGateKind } from "../types/stage.js";
9
10
  import type { StageUsage } from "../types/usage.js";
10
11
  import type { OverviewRunRow } from "./overviewSummary.js";
12
+ import type { CreateEvalRunInput, EvalCaseInput, EvalCaseRow, EvalGraderVersionInput, EvalResultInput, EvalResultWithGrades, EvalReviewPatch, EvalReviewRow, EvalRunPage, EvalRunProgress, EvalRunRow, FinishEvalRunInput, ListEvalRunsQuery } from "../evals/storeTypes.js";
13
+ import type { SuggestionStatus } from "../evals/triage/constants.js";
14
+ import type { SuggestionInput, SuggestionRow } from "../evals/triage/types.js";
11
15
  export type { ConfigOriginRecord };
12
16
  export type RunStatus = "created" | "queued" | "running" | "succeeded" | "failed" | "cancelled";
13
17
  export type RunPipelineDagSnapshot = ResolvedPipelineDag & {
@@ -40,6 +44,7 @@ export type PipelineTrackProjection = {
40
44
  nodes: PipelineTrackNode[];
41
45
  edges: PipelineTrackEdge[];
42
46
  };
47
+ export type RunOrigin = "eval";
43
48
  export type RunMeta = {
44
49
  run_id: string;
45
50
  pipeline_id: string;
@@ -69,6 +74,8 @@ export type RunMeta = {
69
74
  config_origins?: ConfigOriginRecord[];
70
75
  pipeline_source?: "inline" | "path";
71
76
  caller_id?: string;
77
+ /** `eval` for stage runs started by an eval run; absent for normal runs. */
78
+ origin?: RunOrigin;
72
79
  run_manifest?: unknown;
73
80
  skip_gates?: boolean;
74
81
  /**
@@ -372,6 +379,7 @@ export type CreateRunInput = {
372
379
  */
373
380
  inlinePipeline?: InlinePipelineDefinition;
374
381
  callerId?: string;
382
+ origin?: RunOrigin;
375
383
  runManifest?: unknown;
376
384
  skipGates?: boolean;
377
385
  };
@@ -382,6 +390,8 @@ export type ListRunsFilter = {
382
390
  /** Match pipeline_id or pipeline_path */
383
391
  pipeline?: string;
384
392
  caller_id?: string;
393
+ /** Default (undefined) hides eval stage runs; `"any"` includes them; `"eval"` returns only them. */
394
+ origin?: RunOrigin | "any";
385
395
  };
386
396
  /**
387
397
  * Persistence port for pipeline run state.
@@ -466,6 +476,39 @@ export interface RunStore {
466
476
  listRuns(filter?: ListRunsFilter): Promise<RunSummary[]>;
467
477
  /** One light row per run created at or after `since` (ISO), newest first, with summed stage cost. No stages are loaded. */
468
478
  listRunOverviewRows(since: string): Promise<OverviewRunRow[]>;
479
+ createEvalRun(input: CreateEvalRunInput): Promise<EvalRunRow>;
480
+ insertEvalCases(evalRunId: string, cases: EvalCaseInput[]): Promise<void>;
481
+ /** Result row and its grade rows in one transaction; replaces any earlier grades for the same result. */
482
+ upsertEvalResult(result: EvalResultInput): Promise<void>;
483
+ updateEvalRunProgress(evalRunId: string, progress: EvalRunProgress): Promise<void>;
484
+ finishEvalRun(evalRunId: string, input: FinishEvalRunInput): Promise<void>;
485
+ getEvalRun(evalRunId: string): Promise<EvalRunRow | null>;
486
+ getEvalRunByNumber(projectRoot: string, evalId: string, runNumber: number): Promise<EvalRunRow | null>;
487
+ listEvalRuns(query: ListEvalRunsQuery): Promise<EvalRunPage>;
488
+ listEvalResults(evalRunId: string): Promise<EvalResultWithGrades[]>;
489
+ getEvalResultsForCase(evalRunId: string, caseId: string): Promise<EvalResultWithGrades[]>;
490
+ getEvalCases(evalRunId: string): Promise<EvalCaseRow[]>;
491
+ /** `tags` replaces the tag set and is accepted only for results with `passed = 0`. */
492
+ putEvalReview(evalRunId: string, caseId: string, repeatIndex: number, patch: EvalReviewPatch): Promise<EvalReviewRow>;
493
+ getEvalReviews(evalRunId: string): Promise<EvalReviewRow[]>;
494
+ /** The eval's failure-type vocabulary, most recently used first. */
495
+ listFailureTypes(projectRoot: string, evalId: string): Promise<string[]>;
496
+ /** Inserts unseen grader hashes with the next ordinal per grader id; returns grader id to ordinal. */
497
+ recordGraderVersions(projectRoot: string, evalId: string, graders: EvalGraderVersionInput[]): Promise<Record<string, number>>;
498
+ /** Deletes the eval run and its rows; returns the stage run ids it started so the caller can delete those runs. */
499
+ deleteEvalRun(evalRunId: string): Promise<string[]>;
500
+ /** Distinct non-null result subject refs (stage run ids or agent session ids) when the run's target kind matches. */
501
+ listEvalSubjectRefs(evalRunId: string, targetKind: EvalTargetKind): Promise<string[]>;
502
+ /** Inserts or replaces pending suggestions (accepted and dismissed are kept); returns the rows written. */
503
+ upsertEvalSuggestions(evalRunId: string, inputs: SuggestionInput[]): Promise<SuggestionRow[]>;
504
+ listEvalSuggestions(evalRunId: string, status?: SuggestionStatus): Promise<SuggestionRow[]>;
505
+ /** Pending only; returns how many changed. */
506
+ dismissEvalSuggestions(evalRunId: string, ids: string[]): Promise<number>;
507
+ /** Pending only; adds the failure type and `bucket:` tags through the review write path. */
508
+ acceptEvalSuggestions(evalRunId: string, ids: string[]): Promise<{
509
+ accepted: number;
510
+ tagged: number;
511
+ }>;
469
512
  /** Idempotent upsert; returns the realpath/resolve-normalized absolute key. */
470
513
  ensureProject(absPath: string): Promise<string>;
471
514
  /** Absolute roots from the durable projects registry. */
@@ -1,4 +1,5 @@
1
1
  import type { RunMeta, RunStatus } from "./port.js";
2
+ import { type RunClockTerminalStatus } from "./runStatusClock.js";
2
3
  export type RetentionDecision = "none" | "slim" | "purge";
3
4
  export type StatusRetentionWindow = {
4
5
  slimMs: number;
@@ -24,4 +25,4 @@ export declare function slimArtifactMaxBytesFromEnv(env?: NodeJS.ProcessEnv): nu
24
25
  * Already-slimmed rows past SLIM but not PURGE return `"none"` (R18).
25
26
  */
26
27
  export declare function retentionDecision(row: RetentionRow, now: Date, windows?: RetentionWindows): RetentionDecision;
27
- export declare function isTerminalRunStatus(status: RunStatus | undefined): status is "succeeded" | "failed" | "cancelled";
28
+ export declare function isTerminalRunStatus(status: RunStatus | undefined): status is RunClockTerminalStatus;
@@ -1,3 +1,4 @@
1
+ import { isRunClockTerminal, } from "./runStatusClock.js";
1
2
  export const DAY_MS = 24 * 60 * 60 * 1000;
2
3
  /** Defaults: succeeded 3d/30d; failed and cancelled 30d/90d (R30 / AE6). */
3
4
  export const DEFAULT_RETENTION_WINDOWS = {
@@ -7,11 +8,6 @@ export const DEFAULT_RETENTION_WINDOWS = {
7
8
  };
8
9
  export const DEFAULT_BARE_CACHE_TTL_MS = 30 * DAY_MS;
9
10
  export const DEFAULT_SLIM_ARTIFACT_MAX_BYTES = 1024 * 1024;
10
- const TERMINAL = new Set([
11
- "succeeded",
12
- "failed",
13
- "cancelled",
14
- ]);
15
11
  function parsePositiveMs(raw) {
16
12
  if (raw === undefined)
17
13
  return undefined;
@@ -52,7 +48,7 @@ export function slimArtifactMaxBytesFromEnv(env = process.env) {
52
48
  */
53
49
  export function retentionDecision(row, now, windows = DEFAULT_RETENTION_WINDOWS) {
54
50
  const status = row.status;
55
- if (status === undefined || !TERMINAL.has(status))
51
+ if (!isRunClockTerminal(status))
56
52
  return "none";
57
53
  if (row.finished_at === undefined || row.finished_at === "")
58
54
  return "none";
@@ -70,5 +66,5 @@ export function retentionDecision(row, now, windows = DEFAULT_RETENTION_WINDOWS)
70
66
  return "none";
71
67
  }
72
68
  export function isTerminalRunStatus(status) {
73
- return status !== undefined && TERMINAL.has(status);
69
+ return isRunClockTerminal(status);
74
70
  }
@@ -0,0 +1,17 @@
1
+ export declare const RUN_CLOCK_TERMINAL_STATUSES: readonly ["succeeded", "failed", "cancelled"];
2
+ export type RunClockTerminalStatus = (typeof RUN_CLOCK_TERMINAL_STATUSES)[number];
3
+ export type RunClockStatus = "created" | "queued" | "running" | RunClockTerminalStatus;
4
+ export declare function isRunClockTerminal(status: string | undefined): status is RunClockTerminalStatus;
5
+ export type FinishedAtDecision = {
6
+ action: "stamp";
7
+ finishedAt: string;
8
+ } | {
9
+ action: "keep";
10
+ } | {
11
+ action: "clear";
12
+ };
13
+ export declare function nextFinishedAt(input: {
14
+ nextStatus: RunClockStatus;
15
+ currentFinishedAt: string | null | undefined;
16
+ now: string;
17
+ }): FinishedAtDecision;
@@ -0,0 +1,19 @@
1
+ export const RUN_CLOCK_TERMINAL_STATUSES = [
2
+ "succeeded",
3
+ "failed",
4
+ "cancelled",
5
+ ];
6
+ const TERMINAL = new Set(RUN_CLOCK_TERMINAL_STATUSES);
7
+ export function isRunClockTerminal(status) {
8
+ return status !== undefined && TERMINAL.has(status);
9
+ }
10
+ export function nextFinishedAt(input) {
11
+ if (isRunClockTerminal(input.nextStatus)) {
12
+ if (input.currentFinishedAt != null &&
13
+ input.currentFinishedAt !== "") {
14
+ return { action: "keep" };
15
+ }
16
+ return { action: "stamp", finishedAt: input.now };
17
+ }
18
+ return { action: "clear" };
19
+ }
@@ -1,7 +1,11 @@
1
1
  import Database from "better-sqlite3";
2
+ import type { CreateEvalRunInput, EvalCaseInput, EvalCaseRow, EvalGraderVersionInput, EvalResultInput, EvalResultWithGrades, EvalReviewPatch, EvalReviewRow, EvalRunPage, EvalRunProgress, EvalRunRow, FinishEvalRunInput, ListEvalRunsQuery } from "../../evals/storeTypes.js";
3
+ import type { EvalTargetKind } from "../../evals/constants.js";
2
4
  import type { StageEnvelope } from "../../types/envelope.js";
3
5
  import type { StageLogLine } from "../../agent/activity.js";
4
6
  import { type CreateFeedbackLoopInput, type CreateFeedbackReplayInput, type CreateFeedbackReplayStagePassInput, type CreateForkGenerationInput, type CreateRunInput, type CreatedRun, type FeedbackLoopPatch, type FeedbackLoopRecord, type FeedbackLoopState, type FeedbackReplayPatch, type FeedbackReplayRecord, type FeedbackReplayStagePassPatch, type FeedbackReplayStagePassRecord, type ForkGenerationPatch, type ForkGenerationRecord, type ListRunsFilter, type RunDetail, type RunMeta, type RunPipelineDagSnapshot, type RunStatus, type RunStore, type RunSummary, type StageExecution, type StageExecutionPatch, type StageLogEvent, type TriggerRecord, type UpsertTriggerInput, type VerificationCheckResult, type VerificationCheckResultPatch, type ConfigOriginRecord } from "../port.js";
7
+ import type { SuggestionStatus } from "../../evals/triage/constants.js";
8
+ import type { SuggestionInput, SuggestionRow } from "../../evals/triage/types.js";
5
9
  import type { OverviewRunRow } from "../overviewSummary.js";
6
10
  import { type RunSubmissionRecord } from "../submission.js";
7
11
  type SqliteRunStoreOpenerMode = "assert" | "migrate";
@@ -28,6 +32,7 @@ export declare class SqliteRunStore implements RunStore {
28
32
  findRunByDispatchKey(dispatchKey: string): Promise<CreatedRun | undefined>;
29
33
  private readSubmission;
30
34
  getRunBySubmission(key: string): Promise<RunSubmissionRecord | null>;
35
+ private applyRunStatusUpdate;
31
36
  updateRunStatus(runId: string, status: RunStatus): Promise<void>;
32
37
  tryUpdateRunStatus(runId: string, status: RunStatus, expectedStatus: RunStatus): Promise<boolean>;
33
38
  patchRunWorkspaceBinding(runId: string, patch: {
@@ -78,6 +83,30 @@ export declare class SqliteRunStore implements RunStore {
78
83
  listStageEvents(runId: string, stageId: string, attempt?: number): Promise<StageLogEvent[]>;
79
84
  listRuns(filter?: ListRunsFilter): Promise<RunSummary[]>;
80
85
  listRunOverviewRows(since: string): Promise<OverviewRunRow[]>;
86
+ createEvalRun(input: CreateEvalRunInput): Promise<EvalRunRow>;
87
+ insertEvalCases(evalRunId: string, cases: EvalCaseInput[]): Promise<void>;
88
+ upsertEvalResult(result: EvalResultInput): Promise<void>;
89
+ updateEvalRunProgress(evalRunId: string, progress: EvalRunProgress): Promise<void>;
90
+ finishEvalRun(evalRunId: string, input: FinishEvalRunInput): Promise<void>;
91
+ getEvalRun(evalRunId: string): Promise<EvalRunRow | null>;
92
+ getEvalRunByNumber(projectRoot: string, evalId: string, runNumber: number): Promise<EvalRunRow | null>;
93
+ listEvalRuns(query: ListEvalRunsQuery): Promise<EvalRunPage>;
94
+ listEvalResults(evalRunId: string): Promise<EvalResultWithGrades[]>;
95
+ getEvalResultsForCase(evalRunId: string, caseId: string): Promise<EvalResultWithGrades[]>;
96
+ getEvalCases(evalRunId: string): Promise<EvalCaseRow[]>;
97
+ putEvalReview(evalRunId: string, caseId: string, repeatIndex: number, patch: EvalReviewPatch): Promise<EvalReviewRow>;
98
+ getEvalReviews(evalRunId: string): Promise<EvalReviewRow[]>;
99
+ listFailureTypes(projectRoot: string, evalId: string): Promise<string[]>;
100
+ recordGraderVersions(projectRoot: string, evalId: string, graders: EvalGraderVersionInput[]): Promise<Record<string, number>>;
101
+ listEvalSubjectRefs(evalRunId: string, targetKind: EvalTargetKind): Promise<string[]>;
102
+ upsertEvalSuggestions(evalRunId: string, inputs: SuggestionInput[]): Promise<SuggestionRow[]>;
103
+ listEvalSuggestions(evalRunId: string, status?: SuggestionStatus): Promise<SuggestionRow[]>;
104
+ dismissEvalSuggestions(evalRunId: string, ids: string[]): Promise<number>;
105
+ acceptEvalSuggestions(evalRunId: string, ids: string[]): Promise<{
106
+ accepted: number;
107
+ tagged: number;
108
+ }>;
109
+ deleteEvalRun(evalRunId: string): Promise<string[]>;
81
110
  ensureProject(absPath: string): Promise<string>;
82
111
  listRegisteredProjects(): Promise<string[]>;
83
112
  upsertTrigger(input: UpsertTriggerInput): Promise<TriggerRecord>;