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,45 @@
1
+ /**
2
+ * Shared contracts for Stageflow's built-in compaction (docs/plans/compaction-strategy.md).
3
+ * Pure data types only: the layers (mask, pin, state, summary, guards) import from here.
4
+ */
5
+ export type PinnedFactKind = "id" | "number" | "timestamp" | "url" | "path" | "error" | "other";
6
+ /** A value copied verbatim out of a message so a summary cannot lose or reword it. */
7
+ export type PinnedFact = {
8
+ kind: PinnedFactKind;
9
+ /** The exact text, e.g. "INC-4471", "48211", "2026-03-14T05:52:03Z". */
10
+ value: string;
11
+ /** A short verbatim snippet around the value (single line, capped), for orientation. */
12
+ context: string;
13
+ /** Position in the message list the facts were extracted from, and the tool when from a tool result. */
14
+ source: {
15
+ messageIndex: number;
16
+ toolName?: string;
17
+ };
18
+ };
19
+ /** A tool result replaced by a placeholder in the model's context. */
20
+ export type ClearedResult = {
21
+ toolName: string;
22
+ toolCallId: string;
23
+ /** Where the full output can be read again (a file path or a tool + args hint). */
24
+ recoverHint: string;
25
+ bytes: number;
26
+ /** One line describing what the result was, for the recovery index. */
27
+ descriptor: string;
28
+ };
29
+ export type WorkingStateKind = "fact" | "decision" | "progress" | "todo" | "blocker";
30
+ /** One keyed entry in the model's working state (the `working_state` tool). */
31
+ export type WorkingStateEntry = {
32
+ key: string;
33
+ kind: WorkingStateKind;
34
+ value: string;
35
+ updatedAt: string;
36
+ };
37
+ export declare const WORKING_STATE_TOOL_NAME = "working_state";
38
+ /** Everything the compaction summary is built from, besides the model-written part. */
39
+ export type CompactionSections = {
40
+ pinned: readonly PinnedFact[];
41
+ cleared: readonly ClearedResult[];
42
+ state: readonly WorkingStateEntry[];
43
+ };
44
+ /** Bumped whenever the focus prompt or section layout changes (like RUBRIC_PROMPT_VERSION). */
45
+ export declare const COMPACTION_PROMPT_VERSION = 1;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Shared contracts for Stageflow's built-in compaction (docs/plans/compaction-strategy.md).
3
+ * Pure data types only: the layers (mask, pin, state, summary, guards) import from here.
4
+ */
5
+ export const WORKING_STATE_TOOL_NAME = "working_state";
6
+ /** Bumped whenever the focus prompt or section layout changes (like RUBRIC_PROMPT_VERSION). */
7
+ export const COMPACTION_PROMPT_VERSION = 1;
@@ -0,0 +1,56 @@
1
+ import type { WorkingStateEntry, WorkingStateKind } from "./types.js";
2
+ export declare const WORKING_STATE_CUSTOM_TYPE = "stageflow.working_state";
3
+ export declare const WORKING_STATE_KINDS: readonly WorkingStateKind[];
4
+ export declare const WORKING_STATE_MAX_KEY = 80;
5
+ export declare const WORKING_STATE_MAX_VALUE = 600;
6
+ export declare const WORKING_STATE_MAX_ENTRIES = 60;
7
+ export declare const WORKING_STATE_DEFAULT_RENDER_CHARS = 6000;
8
+ export declare const WORKING_STATE_GUIDANCE = "Older messages and tool results are trimmed automatically as the conversation grows, so keep your own working state with the working_state tool. As soon as you learn or decide something you will need later, record it: exact values and identifiers (fact), choices and their reasons (decision), what is done (progress), what remains (todo) and what is stuck (blocker). Keep each entry to one or two short lines, update an existing key instead of adding a duplicate, and delete entries that no longer matter. Never store secrets or credentials in it.";
9
+ export type WorkingStateEvent = {
10
+ op: "set";
11
+ key: string;
12
+ kind: WorkingStateKind;
13
+ value: string;
14
+ at: string;
15
+ } | {
16
+ op: "delete";
17
+ key: string;
18
+ at: string;
19
+ };
20
+ export type WorkingStateSetResult = {
21
+ ok: true;
22
+ dropped: string[];
23
+ replaced: boolean;
24
+ redacted: boolean;
25
+ entry: WorkingStateEntry;
26
+ } | {
27
+ ok: false;
28
+ error: string;
29
+ };
30
+ export type WorkingStateInput = {
31
+ key: string;
32
+ kind: WorkingStateKind;
33
+ value: string;
34
+ updatedAt?: string;
35
+ };
36
+ export declare class WorkingStateStore {
37
+ private readonly entries;
38
+ get size(): number;
39
+ set(input: WorkingStateInput): WorkingStateSetResult;
40
+ delete(key: string): boolean;
41
+ list(): WorkingStateEntry[];
42
+ apply(event: WorkingStateEvent): void;
43
+ load(events: readonly WorkingStateEvent[]): void;
44
+ render(maxChars?: number): string;
45
+ private oldestOfKind;
46
+ }
47
+ export declare function reduceWorkingState(events: readonly WorkingStateEvent[]): WorkingStateStore;
48
+ type SessionEntryLike = {
49
+ type?: unknown;
50
+ customType?: unknown;
51
+ data?: unknown;
52
+ };
53
+ export declare function workingStateEventsFromEntries(entries: readonly SessionEntryLike[]): WorkingStateEvent[];
54
+ export declare function restoreWorkingState(entries: readonly SessionEntryLike[]): WorkingStateStore;
55
+ export declare function getWorkingStateSections(entries: readonly SessionEntryLike[]): WorkingStateEntry[];
56
+ export {};
@@ -0,0 +1,198 @@
1
+ import { scrubSecrets } from "./scrub.js";
2
+ export const WORKING_STATE_CUSTOM_TYPE = "stageflow.working_state";
3
+ export const WORKING_STATE_KINDS = [
4
+ "fact",
5
+ "decision",
6
+ "progress",
7
+ "todo",
8
+ "blocker",
9
+ ];
10
+ export const WORKING_STATE_MAX_KEY = 80;
11
+ export const WORKING_STATE_MAX_VALUE = 600;
12
+ export const WORKING_STATE_MAX_ENTRIES = 60;
13
+ export const WORKING_STATE_DEFAULT_RENDER_CHARS = 6000;
14
+ export const WORKING_STATE_GUIDANCE = "Older messages and tool results are trimmed automatically as the conversation grows, so keep your own working state with the working_state tool. As soon as you learn or decide something you will need later, record it: exact values and identifiers (fact), choices and their reasons (decision), what is done (progress), what remains (todo) and what is stuck (blocker). Keep each entry to one or two short lines, update an existing key instead of adding a duplicate, and delete entries that no longer matter. Never store secrets or credentials in it.";
15
+ const RENDER_ORDER = [
16
+ "blocker",
17
+ "todo",
18
+ "decision",
19
+ "fact",
20
+ "progress",
21
+ ];
22
+ const EVICTION_ORDER = [
23
+ "progress",
24
+ "fact",
25
+ "decision",
26
+ "todo",
27
+ "blocker",
28
+ ];
29
+ const HEADINGS = {
30
+ blocker: "Blockers",
31
+ todo: "Todo",
32
+ decision: "Decisions",
33
+ fact: "Facts",
34
+ progress: "Progress",
35
+ };
36
+ function isKind(value) {
37
+ return (typeof value === "string" &&
38
+ WORKING_STATE_KINDS.includes(value));
39
+ }
40
+ function oneLine(text) {
41
+ return text.replace(/\s+/g, " ").trim();
42
+ }
43
+ export class WorkingStateStore {
44
+ entries = new Map();
45
+ get size() {
46
+ return this.entries.size;
47
+ }
48
+ set(input) {
49
+ if (!isKind(input.kind)) {
50
+ return {
51
+ ok: false,
52
+ error: `kind must be one of ${WORKING_STATE_KINDS.join(", ")}`,
53
+ };
54
+ }
55
+ const rawKey = oneLine(String(input.key ?? ""));
56
+ const rawValue = oneLine(String(input.value ?? ""));
57
+ const key = oneLine(scrubSecrets(rawKey));
58
+ const value = oneLine(scrubSecrets(rawValue));
59
+ const redacted = key !== rawKey || value !== rawValue;
60
+ if (key.length === 0)
61
+ return { ok: false, error: "key is required" };
62
+ if (key.length > WORKING_STATE_MAX_KEY) {
63
+ return {
64
+ ok: false,
65
+ error: `key is ${key.length} chars; max ${WORKING_STATE_MAX_KEY}`,
66
+ };
67
+ }
68
+ if (value.length === 0)
69
+ return { ok: false, error: "value is required" };
70
+ if (value.length > WORKING_STATE_MAX_VALUE) {
71
+ return {
72
+ ok: false,
73
+ error: `value is ${value.length} chars; max ${WORKING_STATE_MAX_VALUE}. Shorten it.`,
74
+ };
75
+ }
76
+ const replaced = this.entries.delete(key);
77
+ const dropped = [];
78
+ while (this.entries.size >= WORKING_STATE_MAX_ENTRIES) {
79
+ const victim = this.oldestOfKind("progress");
80
+ if (victim === undefined) {
81
+ return {
82
+ ok: false,
83
+ error: `working state is full (${WORKING_STATE_MAX_ENTRIES} entries, none are progress). Delete entries first.`,
84
+ };
85
+ }
86
+ this.entries.delete(victim);
87
+ dropped.push(victim);
88
+ }
89
+ const entry = {
90
+ key,
91
+ kind: input.kind,
92
+ value,
93
+ updatedAt: input.updatedAt ?? new Date().toISOString(),
94
+ };
95
+ this.entries.set(key, entry);
96
+ return { ok: true, dropped, replaced, redacted, entry };
97
+ }
98
+ delete(key) {
99
+ const raw = oneLine(String(key ?? ""));
100
+ return this.entries.delete(raw) || this.entries.delete(oneLine(scrubSecrets(raw)));
101
+ }
102
+ list() {
103
+ return [...this.entries.values()];
104
+ }
105
+ apply(event) {
106
+ if (event.op === "set") {
107
+ this.set({
108
+ key: event.key,
109
+ kind: event.kind,
110
+ value: event.value,
111
+ updatedAt: event.at,
112
+ });
113
+ }
114
+ else if (event.op === "delete") {
115
+ this.delete(event.key);
116
+ }
117
+ }
118
+ load(events) {
119
+ this.entries.clear();
120
+ for (const event of events)
121
+ this.apply(event);
122
+ }
123
+ render(maxChars = WORKING_STATE_DEFAULT_RENDER_CHARS) {
124
+ const all = this.list();
125
+ if (all.length === 0)
126
+ return "";
127
+ const keep = new Set(all);
128
+ let omitted = 0;
129
+ const build = () => {
130
+ const lines = ["## Working state"];
131
+ for (const kind of RENDER_ORDER) {
132
+ const group = all.filter((e) => keep.has(e) && e.kind === kind);
133
+ if (group.length === 0)
134
+ continue;
135
+ lines.push("", `### ${HEADINGS[kind]}`);
136
+ for (const e of group)
137
+ lines.push(`- ${e.key}: ${e.value}`);
138
+ }
139
+ if (omitted > 0) {
140
+ lines.push("", `(${omitted} older entries omitted for space)`);
141
+ }
142
+ return lines.join("\n");
143
+ };
144
+ let text = build();
145
+ for (const kind of EVICTION_ORDER) {
146
+ for (const e of all) {
147
+ if (text.length <= maxChars)
148
+ return text;
149
+ if (e.kind !== kind)
150
+ continue;
151
+ keep.delete(e);
152
+ omitted += 1;
153
+ text = build();
154
+ }
155
+ }
156
+ return text.length <= maxChars ? text : text.slice(0, Math.max(0, maxChars));
157
+ }
158
+ oldestOfKind(kind) {
159
+ for (const e of this.entries.values()) {
160
+ if (e.kind === kind)
161
+ return e.key;
162
+ }
163
+ return undefined;
164
+ }
165
+ }
166
+ export function reduceWorkingState(events) {
167
+ const store = new WorkingStateStore();
168
+ for (const event of events)
169
+ store.apply(event);
170
+ return store;
171
+ }
172
+ function isEvent(data) {
173
+ if (data === null || typeof data !== "object")
174
+ return false;
175
+ const d = data;
176
+ if (typeof d.key !== "string")
177
+ return false;
178
+ if (d.op === "delete")
179
+ return true;
180
+ return d.op === "set" && isKind(d.kind) && typeof d.value === "string";
181
+ }
182
+ export function workingStateEventsFromEntries(entries) {
183
+ const events = [];
184
+ for (const entry of entries) {
185
+ if (entry.type === "custom" &&
186
+ entry.customType === WORKING_STATE_CUSTOM_TYPE &&
187
+ isEvent(entry.data)) {
188
+ events.push(entry.data);
189
+ }
190
+ }
191
+ return events;
192
+ }
193
+ export function restoreWorkingState(entries) {
194
+ return reduceWorkingState(workingStateEventsFromEntries(entries));
195
+ }
196
+ export function getWorkingStateSections(entries) {
197
+ return restoreWorkingState(entries).list();
198
+ }
@@ -0,0 +1,15 @@
1
+ import type { ValidationFinding } from "./validateCatalog.js";
2
+ export type EvalsWriteErrorCode = "EVAL_EXISTS" | "EVAL_NOT_FOUND" | "EVAL_INVALID" | "EVAL_DEFINITION_ID_MISMATCH" | "DATASET_EXISTS" | "DATASET_NOT_FOUND" | "DATASET_INVALID" | "DATASET_READ_ONLY" | "DATASET_CASE_OP_INVALID" | "DATASET_NAME_INVALID" | "SAMPLE_EXISTS" | "SAMPLE_SOURCE_MISSING" | "SAMPLE_NO_DEFAULT_MODEL" | "SAMPLE_AGENTS_UNAVAILABLE";
3
+ export declare class EvalsWriteError extends Error {
4
+ readonly code: EvalsWriteErrorCode;
5
+ readonly findings: ValidationFinding[];
6
+ constructor(code: EvalsWriteErrorCode, message: string, findings?: ValidationFinding[]);
7
+ }
8
+ export declare class FileChangedError extends Error {
9
+ readonly code: "FILE_CHANGED";
10
+ readonly currentHash: string;
11
+ constructor(currentHash: string);
12
+ }
13
+ export declare function contentHash(bytes: string | Uint8Array): string;
14
+ export declare function assertBaseHash(filePath: string, baseHash: string): Promise<string>;
15
+ export declare function writeFileAtomic(filePath: string, text: string): Promise<void>;
@@ -0,0 +1,43 @@
1
+ import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { sha256Hex } from "../evals/canonical.js";
4
+ export class EvalsWriteError extends Error {
5
+ code;
6
+ findings;
7
+ constructor(code, message, findings = []) {
8
+ super(message);
9
+ this.name = "EvalsWriteError";
10
+ this.code = code;
11
+ this.findings = findings;
12
+ }
13
+ }
14
+ export class FileChangedError extends Error {
15
+ code = "FILE_CHANGED";
16
+ currentHash;
17
+ constructor(currentHash) {
18
+ super("The file changed on disk since it was loaded");
19
+ this.name = "FileChangedError";
20
+ this.currentHash = currentHash;
21
+ }
22
+ }
23
+ export function contentHash(bytes) {
24
+ return sha256Hex(bytes);
25
+ }
26
+ export async function assertBaseHash(filePath, baseHash) {
27
+ const current = contentHash(await readFile(filePath));
28
+ if (current !== baseHash)
29
+ throw new FileChangedError(current);
30
+ return current;
31
+ }
32
+ export async function writeFileAtomic(filePath, text) {
33
+ await mkdir(path.dirname(filePath), { recursive: true });
34
+ const tmp = `${filePath}.tmp-${process.pid}`;
35
+ try {
36
+ await writeFile(tmp, text, "utf8");
37
+ await rename(tmp, filePath);
38
+ }
39
+ catch (err) {
40
+ await rm(tmp, { force: true });
41
+ throw err;
42
+ }
43
+ }
@@ -40,6 +40,8 @@ export type CatalogScanPaths = {
40
40
  pipelinePaths: string[];
41
41
  taskPaths: string[];
42
42
  triggerPaths: string[];
43
+ evalPaths: string[];
44
+ datasetPaths: string[];
43
45
  };
44
46
  export declare function getCatalogScanPaths(ctx: CatalogContext): Promise<CatalogScanPaths | null>;
45
47
  export declare function browseCatalog(invocationCwd: string | StageflowContext): Promise<CatalogBrowseResult>;
@@ -35,12 +35,14 @@ export async function getCatalogScanPaths(ctx) {
35
35
  if (!catalogReady(ctx)) {
36
36
  return null;
37
37
  }
38
- const [pipelinePaths, taskPaths, triggerPaths] = await Promise.all([
38
+ const [pipelinePaths, taskPaths, triggerPaths, evalPaths, datasetPaths] = await Promise.all([
39
39
  scanCatalogPaths(ctx.manifest, "pipeline"),
40
40
  scanCatalogPaths(ctx.manifest, "task"),
41
41
  scanCatalogPaths(ctx.manifest, "trigger"),
42
+ scanCatalogPaths(ctx.manifest, "eval"),
43
+ scanCatalogPaths(ctx.manifest, "dataset"),
42
44
  ]);
43
- return { pipelinePaths, taskPaths, triggerPaths };
45
+ return { pipelinePaths, taskPaths, triggerPaths, evalPaths, datasetPaths };
44
46
  }
45
47
  async function listTasksFromManifest(projectRoot, manifest, warnings) {
46
48
  const filePaths = await scanCatalogPaths(manifest, "task");
@@ -1,5 +1,6 @@
1
1
  import { access, mkdir, readdir, unlink, writeFile } from "node:fs/promises";
2
2
  import path from "node:path";
3
+ import { ensureCatalogScanRoot } from "./ensureCatalogScanRoot.js";
3
4
  import { invertPredecessorEdgesToRoute, invertRouteToPredecessorEdges, parsePipelineNeeds, toPipelineNeeds, } from "./pipelineNeeds.js";
4
5
  import { STAGE_ID_PATTERN } from "./createStage.js";
5
6
  import { inferIdFromUsesPath, normalizePipelineStageEntries, toWiringRefs, } from "./normalizePipelineStageEntry.js";
@@ -548,6 +549,7 @@ export async function createPipeline(projectRoot, input) {
548
549
  error: errorFinding?.message ?? "Pipeline validation failed",
549
550
  };
550
551
  }
552
+ await ensureCatalogScanRoot(projectRoot, path.relative(projectRoot, pipelineDirectory));
551
553
  const loadOutcome = await loadPipelineOutcome(relPath, { cwd: projectRoot });
552
554
  if (!loadOutcome.ok) {
553
555
  await unlink(filePath).catch(() => { });
@@ -6,6 +6,7 @@ import { STAGE_ID_PATTERN } from "./createStage.js";
6
6
  import { getCatalogScanPaths } from "./browseCatalog.js";
7
7
  import { catalogContextFromStageflow } from "./resolveCatalogContext.js";
8
8
  import { resolveStageflowContext } from "../project/resolveStageflowContext.js";
9
+ import { githubMatchActionError } from "./githubTriggerAction.js";
9
10
  import { loadTriggerOutcome } from "./loadTrigger.js";
10
11
  import { collectPipelineIdsFromPaths, collectTaskIdsFromPaths } from "./validateCatalog.js";
11
12
  import { findCatalogPathById } from "../runtime/triggerCatalog.js";
@@ -56,11 +57,16 @@ export function parseEventField(raw) {
56
57
  if (raw.config !== undefined && !isPlainObject(raw.config)) {
57
58
  return { ok: false, message: "event.config must be an object" };
58
59
  }
60
+ const match = isPlainObject(raw.match) ? raw.match : undefined;
61
+ const actionError = githubMatchActionError(raw.source, match);
62
+ if (actionError !== undefined) {
63
+ return { ok: false, message: actionError };
64
+ }
59
65
  return {
60
66
  ok: true,
61
67
  value: {
62
68
  source: raw.source,
63
- ...(isPlainObject(raw.match) ? { match: raw.match } : {}),
69
+ ...(match !== undefined ? { match } : {}),
64
70
  ...(isPlainObject(raw.config) ? { config: raw.config } : {}),
65
71
  },
66
72
  };
@@ -0,0 +1,9 @@
1
+ export declare class CsvParseError extends Error {
2
+ readonly record: number;
3
+ constructor(message: string, record: number);
4
+ }
5
+ export type ParseCsvOptions = {
6
+ delimiter?: string;
7
+ };
8
+ /** RFC 4180 parser. Returns raw records; blank lines are kept as `[""]`. */
9
+ export declare function parseCsv(text: string, options?: ParseCsvOptions): string[][];
@@ -0,0 +1,81 @@
1
+ export class CsvParseError extends Error {
2
+ record;
3
+ constructor(message, record) {
4
+ super(message);
5
+ this.name = "CsvParseError";
6
+ this.record = record;
7
+ }
8
+ }
9
+ /** RFC 4180 parser. Returns raw records; blank lines are kept as `[""]`. */
10
+ export function parseCsv(text, options = {}) {
11
+ const delimiter = options.delimiter ?? ",";
12
+ if (delimiter.length !== 1 || delimiter === '"' || delimiter === "\n" || delimiter === "\r") {
13
+ throw new Error(`Invalid CSV delimiter: ${JSON.stringify(delimiter)}`);
14
+ }
15
+ const src = text.charCodeAt(0) === 0xfeff ? text.slice(1) : text;
16
+ const records = [];
17
+ let record = [];
18
+ let field = "";
19
+ let inQuotes = false;
20
+ let fieldStarted = false;
21
+ let i = 0;
22
+ const endField = () => {
23
+ record.push(field);
24
+ field = "";
25
+ fieldStarted = false;
26
+ };
27
+ const endRecord = () => {
28
+ endField();
29
+ records.push(record);
30
+ record = [];
31
+ };
32
+ while (i < src.length) {
33
+ const ch = src[i];
34
+ if (inQuotes) {
35
+ if (ch === '"') {
36
+ if (src[i + 1] === '"') {
37
+ field += '"';
38
+ i += 2;
39
+ continue;
40
+ }
41
+ inQuotes = false;
42
+ i += 1;
43
+ const next = src[i];
44
+ if (next !== undefined && next !== delimiter && next !== "\n" && next !== "\r") {
45
+ throw new CsvParseError(`unexpected character after closing quote in row ${records.length + 1}`, records.length + 1);
46
+ }
47
+ continue;
48
+ }
49
+ field += ch;
50
+ i += 1;
51
+ continue;
52
+ }
53
+ if (ch === '"') {
54
+ if (fieldStarted) {
55
+ throw new CsvParseError(`unexpected quote inside unquoted field in row ${records.length + 1}`, records.length + 1);
56
+ }
57
+ inQuotes = true;
58
+ fieldStarted = true;
59
+ i += 1;
60
+ }
61
+ else if (ch === delimiter) {
62
+ endField();
63
+ i += 1;
64
+ }
65
+ else if (ch === "\n" || ch === "\r") {
66
+ endRecord();
67
+ i += ch === "\r" && src[i + 1] === "\n" ? 2 : 1;
68
+ }
69
+ else {
70
+ field += ch;
71
+ fieldStarted = true;
72
+ i += 1;
73
+ }
74
+ }
75
+ if (inQuotes) {
76
+ throw new CsvParseError(`unterminated quoted field in row ${records.length + 1}`, records.length + 1);
77
+ }
78
+ if (fieldStarted || field !== "" || record.length > 0)
79
+ endRecord();
80
+ return records;
81
+ }
@@ -0,0 +1,18 @@
1
+ import type { ConversationMode } from "../evals/types.js";
2
+ export type DatasetAgentNote = {
3
+ code: "dataset.scenario_unknown_field" | "dataset.expected_invalid";
4
+ message: string;
5
+ };
6
+ export type DatasetAgentCheckResult = {
7
+ caseId: string;
8
+ valid: boolean;
9
+ message?: string;
10
+ notes: DatasetAgentNote[];
11
+ };
12
+ export declare function checkDatasetAgainstAgent(cases: ReadonlyArray<{
13
+ id: string;
14
+ input: Record<string, unknown>;
15
+ expected?: unknown;
16
+ }>, conversation?: {
17
+ mode?: ConversationMode;
18
+ }): DatasetAgentCheckResult[];
@@ -0,0 +1,109 @@
1
+ const INPUT_KEYS = ["mode", "script", "opening", "persona", "goal", "facts", "tool_mocks"];
2
+ const MOCK_MAX_BYTES = 20 * 1024;
3
+ function isPlainObject(value) {
4
+ return typeof value === "object" && value !== null && !Array.isArray(value);
5
+ }
6
+ function boundedString(value, min, max) {
7
+ return typeof value === "string" && value.length >= min && value.length <= max;
8
+ }
9
+ function stringList(value, maxItems, maxLength) {
10
+ return (Array.isArray(value) &&
11
+ value.length <= maxItems &&
12
+ value.every((item) => typeof item === "string" && (maxLength === undefined || item.length <= maxLength)));
13
+ }
14
+ function toolMocksProblem(mocks) {
15
+ if (!isPlainObject(mocks))
16
+ return "scenario tool_mocks must be an object";
17
+ const entries = Object.entries(mocks);
18
+ if (entries.length > 50)
19
+ return "scenario tool_mocks has more than 50 entries";
20
+ for (const [tool, mock] of entries) {
21
+ if (tool.length < 1 || tool.length > 128 || /\s/.test(tool)) {
22
+ return `scenario tool_mocks key ${JSON.stringify(tool)} must be 1-128 characters with no whitespace`;
23
+ }
24
+ if (!isPlainObject(mock))
25
+ return `scenario tool_mocks "${tool}" must be an object`;
26
+ const hasResult = "result" in mock;
27
+ const hasError = "error" in mock;
28
+ if (hasResult === hasError || Object.keys(mock).length !== 1) {
29
+ return `scenario tool_mocks "${tool}" must have exactly one of result or error`;
30
+ }
31
+ if (hasError && !boundedString(mock.error, 0, 1000)) {
32
+ return `scenario tool_mocks "${tool}" error must be text of at most 1000 characters`;
33
+ }
34
+ if (Buffer.byteLength(JSON.stringify(mock) ?? "", "utf8") > MOCK_MAX_BYTES) {
35
+ return `scenario tool_mocks "${tool}" is larger than 20 KB`;
36
+ }
37
+ }
38
+ return undefined;
39
+ }
40
+ function scenarioProblem(input, defaultMode) {
41
+ let mode = defaultMode;
42
+ if (input.mode !== undefined) {
43
+ if (input.mode !== "script" && input.mode !== "simulated") {
44
+ return `scenario mode must be "script" or "simulated"`;
45
+ }
46
+ mode = input.mode;
47
+ }
48
+ if (mode === "script") {
49
+ const { script } = input;
50
+ if (!Array.isArray(script) ||
51
+ script.length < 1 ||
52
+ script.length > 40 ||
53
+ !script.every((item) => boundedString(item, 1, 4000))) {
54
+ return "scenario script must be 1-40 messages of 1-4000 characters (script mode)";
55
+ }
56
+ }
57
+ else {
58
+ if (!boundedString(input.opening, 1, 2000)) {
59
+ return "scenario opening must be a message of 1-2000 characters (simulated mode)";
60
+ }
61
+ if (!boundedString(input.persona, 1, 1000)) {
62
+ return "scenario persona must be 1-1000 characters (simulated mode)";
63
+ }
64
+ if (!boundedString(input.goal, 1, 1000)) {
65
+ return "scenario goal must be 1-1000 characters (simulated mode)";
66
+ }
67
+ if (input.facts !== undefined && !stringList(input.facts, 30, 300)) {
68
+ return "scenario facts must be at most 30 strings of at most 300 characters";
69
+ }
70
+ }
71
+ if (input.tool_mocks !== undefined)
72
+ return toolMocksProblem(input.tool_mocks);
73
+ return undefined;
74
+ }
75
+ function expectedNotes(caseId, expected) {
76
+ if (!isPlainObject(expected))
77
+ return [];
78
+ const notes = [];
79
+ const note = (message) => {
80
+ notes.push({ code: "dataset.expected_invalid", message: `case ${caseId}: ${message}` });
81
+ };
82
+ if (expected.outcome !== undefined && !boundedString(expected.outcome, 0, 500)) {
83
+ note("expected.outcome must be a string of at most 500 characters");
84
+ }
85
+ for (const key of ["tools", "forbidden_tools"]) {
86
+ if (expected[key] !== undefined && !stringList(expected[key], 50)) {
87
+ note(`expected.${key} must be an array of at most 50 strings`);
88
+ }
89
+ }
90
+ return notes;
91
+ }
92
+ export function checkDatasetAgainstAgent(cases, conversation = {}) {
93
+ const defaultMode = conversation.mode ?? "script";
94
+ return cases.map((c) => {
95
+ const notes = [];
96
+ const unknown = Object.keys(c.input).filter((key) => !INPUT_KEYS.includes(key));
97
+ if (unknown.length > 0) {
98
+ notes.push({
99
+ code: "dataset.scenario_unknown_field",
100
+ message: `case ${c.id}: scenario has unknown field(s): ${unknown.join(", ")}`,
101
+ });
102
+ }
103
+ notes.push(...expectedNotes(c.id, c.expected));
104
+ const problem = scenarioProblem(c.input, defaultMode);
105
+ return problem === undefined
106
+ ? { caseId: c.id, valid: true, notes }
107
+ : { caseId: c.id, valid: false, message: problem, notes };
108
+ });
109
+ }