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
package/README.md CHANGED
@@ -10,6 +10,15 @@ Open-source runtime for **configurable multi-stage agent workflows** with typed
10
10
  [![GitHub issues](https://img.shields.io/github/issues/tejasghutukade/stageflow)](https://github.com/tejasghutukade/stageflow/issues)
11
11
  [![CI](https://img.shields.io/github/actions/workflow/status/tejasghutukade/stageflow/ci.yml?branch=main)](https://github.com/tejasghutukade/stageflow/actions/workflows/ci.yml)
12
12
 
13
+ <p align="center">
14
+ <a href="https://github.com/tejasghutukade/stageflow/releases/download/media/stageflow-demo.mp4"><img src="https://github.com/tejasghutukade/stageflow/releases/download/media/stageflow-demo.gif" alt="Stageflow demo: a pipeline runs, pauses at a human gate, resumes, and finishes in the operator console" width="800"></a>
15
+ </p>
16
+
17
+ <p align="center">
18
+ <a href="https://github.com/tejasghutukade/stageflow/releases/download/media/stageflow-demo.mp4">Watch the 76s demo (MP4)</a> ·
19
+ <a href="https://github.com/tejasghutukade/stageflow/releases/download/media/stageflow-demo-long.mp4">Full walkthrough (3 min)</a>
20
+ </p>
21
+
13
22
  Author pipeline-owned YAML in your project. Stageflow schedules each stage in a fresh agent session, moves context through explicit envelopes and artifacts, and persists run state under `.stageflow/`. [Pi](https://github.com/badlogic/pi-mono) is the current agent execution backend. Bins: **`sf`** and **`stageflow`**.
14
23
 
15
24
  ## Why Stageflow?
@@ -35,6 +44,7 @@ The same pipeline runs three ways without rewriting anything:
35
44
  - **Verified stage execution** — after-phase `verify` checks with durable evidence, plus `on_verify_fail` repair or manual operator recovery ([guide](docs/verified-stage-execution.md))
36
45
  - **HITL gates** — operator questions in the console; CI exits `2` when a run is waiting
37
46
  - **Agents** — project-owned, revisioned agents (`agents/*.agent.yaml`) with granted tools, ask-first approvals, traces, channels, schedules and a public web chat page ([guide](docs/agents.md))
47
+ - **Evals** — check a stage or an agent against a dataset: graders, repeats, honest statistics, compare two runs, and sort failures into what to fix ([guide](docs/evals.md))
38
48
  - **Operator console** — an Inbox for gates and agent approvals, pipeline runs, agents and their sessions, connections, MCP servers and settings at `http://127.0.0.1:3847` ([guide](docs/operator-console.md))
39
49
  - **MCP endpoint** — Streamable HTTP at `/mcp` when `sf ui` or `sf mcp` is running
40
50
  - **MCP servers for agents and stages** — add servers, secrets and OAuth sign-in from Settings → Project MCP, or in the project `.mcp.json` ([guide](docs/mcp-servers.md))
@@ -57,14 +67,14 @@ See [Architecture](docs/architecture.md) for component boundaries, execution flo
57
67
 
58
68
  ### Docker (recommended)
59
69
 
60
- Run Stageflow from the published image. It is [`ghcr.io/tejasghutukade/stageflow`](https://github.com/tejasghutukade/stageflow/pkgs/container/stageflow). `0.39` is the current minor tag (`0.39.0` is that exact release).
70
+ Run Stageflow from the published image. It is [`ghcr.io/tejasghutukade/stageflow`](https://github.com/tejasghutukade/stageflow/pkgs/container/stageflow). `0.42` is the current minor tag (`0.42.0` is that exact release).
61
71
 
62
72
  ```bash
63
73
  docker run --rm --name stageflow \
64
74
  -e STAGEFLOW_ALLOW_UNAUTHENTICATED_BIND=1 \
65
75
  -p 127.0.0.1:3847:3847 \
66
76
  -v stageflow-data:/data \
67
- ghcr.io/tejasghutukade/stageflow:0.39 \
77
+ ghcr.io/tejasghutukade/stageflow:0.42 \
68
78
  sf ui
69
79
  ```
70
80
 
@@ -81,7 +91,7 @@ docker run --rm --name stageflow \
81
91
  -p 127.0.0.1:3847:3847 \
82
92
  -v stageflow-data:/data \
83
93
  -v "$PWD":/project \
84
- ghcr.io/tejasghutukade/stageflow:0.39 \
94
+ ghcr.io/tejasghutukade/stageflow:0.42 \
85
95
  sf ui
86
96
  ```
87
97
 
@@ -288,7 +298,7 @@ Full docs: **[tejasghutukade.github.io/stageflow](https://tejasghutukade.github.
288
298
  | [docs/hosted.md](docs/hosted.md) | Embed Stageflow from another application and receive ordered run events |
289
299
  | [docs/quickstart.md](docs/quickstart.md) | Expanded quick start |
290
300
  | [docs/yaml-catalog.md](docs/yaml-catalog.md) | Pipelines, stages, tasks schema |
291
- | [docs/cli-reference.md](docs/cli-reference.md) | `sf init`, `sf run`, `sf run-stage`, `sf graph`, `sf validate`, `sf ui`, `sf mcp`, `sf envelope`, `sf export-run`, `sf artifact`, `sf skills`, `sf providers` |
301
+ | [docs/cli-reference.md](docs/cli-reference.md) | `sf init`, `sf run`, `sf run-stage`, `sf graph`, `sf validate`, `sf ui`, `sf mcp`, `sf envelope`, `sf export-run`, `sf artifact`, `sf skills`, `sf providers`, `sf eval` |
292
302
  | [docs/envelopes.md](docs/envelopes.md) | Handoff envelope contract |
293
303
  | [docs/verified-stage-execution.md](docs/verified-stage-execution.md) | After-phase `verify`, evidence, and `on_verify_fail` repair / manual recovery |
294
304
  | [docs/hitl.md](docs/hitl.md) | Gate kinds, `--skip-gates`, exit code `2` |
@@ -298,6 +308,7 @@ Full docs: **[tejasghutukade.github.io/stageflow](https://tejasghutukade.github.
298
308
  | [docs/providers.md](docs/providers.md) | Pi providers, `sf providers` |
299
309
  | [docs/docker.md](docs/docker.md) | Docker Compose local try, image pull/run, backup, self-hosting |
300
310
  | [docs/operator-console.md](docs/operator-console.md) | Console navigation, command palette, shortcuts and routes; one page per area ([Inbox](docs/console-inbox.md), [Runs](docs/console-runs.md), [Agents](docs/console-agents.md), [Connections](docs/console-connections.md), [Settings](docs/console-settings.md)) |
311
+ | [docs/evals.md](docs/evals.md) | Evals for stages and agents: datasets, graders, runs, compare, failure sorting, the engine |
301
312
  | [docs/agents.md](docs/agents.md) | Agents: definition, runtime, approvals, channels, schedules, web chat |
302
313
  | [docs/mcp-servers.md](docs/mcp-servers.md) | Add MCP servers, secrets and OAuth; use them from agents and stages |
303
314
  | [docs/channels.md](docs/channels.md) | Connections and communication channels |
@@ -43,6 +43,24 @@ export type StageActivityEvent = {
43
43
  event: "message";
44
44
  role: string;
45
45
  text?: string;
46
+ } | {
47
+ event: "context_usage";
48
+ /** Estimated tokens in the model's context after the latest response. */
49
+ tokens: number;
50
+ contextWindow: number;
51
+ /** Whole-number share of the window, 0-100. */
52
+ percent: number;
53
+ } | {
54
+ event: "context_compacted";
55
+ reason: "manual" | "threshold" | "overflow";
56
+ tokensBefore: number;
57
+ /** Best estimate after compaction; null if unknown. */
58
+ tokensAfter: number | null;
59
+ summaryChars: number;
60
+ costUsd: number;
61
+ willRetry: boolean;
62
+ aborted: boolean;
63
+ error?: string;
46
64
  } | {
47
65
  event: "operator_prompt";
48
66
  prompt: AskOperatorPrompt;
@@ -225,7 +225,13 @@ async function runTurn(input, model, markerPath, promptText, resumeSessionId, us
225
225
  preEmitCheckOptions: {
226
226
  checks: input.stage.pre_emit_checks,
227
227
  readQaTrail: input.readQaTrail,
228
+ artifactPresence: {
229
+ runWorkspaceDir: input.roots.runWorkspaceDir,
230
+ stageId: runtimeStageId(input),
231
+ attempt: input.roots.attempt ?? 1,
232
+ },
228
233
  },
234
+ feedbackLoopEmitContext: input.feedbackLoopEmitContext,
229
235
  writeStageArtifact: {
230
236
  runWorkspaceDir: input.roots.runWorkspaceDir,
231
237
  stageId: runtimeStageId(input),
@@ -255,6 +261,7 @@ async function runTurn(input, model, markerPath, promptText, resumeSessionId, us
255
261
  model,
256
262
  systemPrompt: { type: "custom", prompt: input.stage.system_prompt },
257
263
  settingSources: [],
264
+ settings: { autoCompactEnabled: true },
258
265
  tools: CLAUDE_BUILTIN_TOOLS,
259
266
  mcpServers: { [STAGEFLOW_MCP_SERVER_NAME]: mcpServer, ...passedServers },
260
267
  permissionMode: "bypassPermissions",
@@ -30,6 +30,7 @@ import { type EmitCapture } from "../tools/emitStageEnvelope.js";
30
30
  import { type WriteStageArtifactOptions } from "../tools/writeStageArtifact.js";
31
31
  import { type AskOperatorKind, type AskOperatorPrompt } from "../tools/askOperator.js";
32
32
  import type { CloneEmitContext, ForkEmitContext } from "../types/forkChoice.js";
33
+ import type { FeedbackLoopConfig } from "../types/pipeline.js";
33
34
  import type { PreEmitCheckOptions } from "../envelope/preEmitChecks.js";
34
35
  import { execInSandboxContainer as defaultExecInSandboxContainer } from "../runtime/sandboxContainer.js";
35
36
  export declare const STAGEFLOW_MCP_SERVER_NAME = "stageflow";
@@ -43,35 +44,42 @@ export declare const SANDBOX_EDIT_TOOL_NAME = "mcp__stageflow__sandbox_edit";
43
44
  export type AskOperatorCapture = {
44
45
  prompt?: AskOperatorPrompt;
45
46
  };
46
- /**
47
- * Exported so a parity test can assert this stays field-for-field aligned
48
- * with `tools/emitStageEnvelope.ts`'s typebox schema — the two are hand
49
- * written against the same envelope shape with no shared source, so
50
- * nothing else catches one drifting from the other.
51
- *
52
- * Field presence mirrors the typebox schema's own conditionality:
53
- * `fork_choice` is required (not just present) when the stage has a fork
54
- * to route.
55
- */
56
47
  export declare function buildEmitStageEnvelopeShape(options: {
57
48
  forkEmitContext?: ForkEmitContext;
58
49
  cloneEmitContext?: CloneEmitContext;
59
- }): {
60
- status: z.ZodEnum<{
61
- failure: "failure";
62
- success: "success";
63
- }>;
50
+ payloadSchema?: unknown;
51
+ feedbackLoopEmitContext?: FeedbackLoopConfig;
52
+ }): z.ZodDiscriminatedUnion<[z.ZodObject<{
64
53
  summary: z.ZodString;
65
54
  artifacts: z.ZodArray<z.ZodString>;
66
- payload: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
55
+ checklist_attestations: z.ZodOptional<z.ZodArray<z.ZodObject<{
56
+ check_id: z.ZodString;
57
+ items: z.ZodArray<z.ZodString>;
58
+ }, z.core.$strict>>>;
59
+ stage_id: z.ZodOptional<z.ZodString>;
60
+ notes: z.ZodOptional<z.ZodString>;
61
+ status: z.ZodLiteral<"success">;
62
+ payload: z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
67
63
  fork_choice: z.ZodArray<z.ZodString> | z.ZodOptional<z.ZodArray<z.ZodString>>;
64
+ feedback_loop?: z.ZodDiscriminatedUnion<[z.ZodObject<{
65
+ action: z.ZodLiteral<"continue">;
66
+ }, z.core.$strict>, z.ZodObject<{
67
+ action: z.ZodLiteral<"send_back">;
68
+ target: z.ZodLiteral<string>;
69
+ }, z.core.$strict>], "action"> | undefined;
70
+ }, z.core.$strict>, z.ZodObject<{
71
+ summary: z.ZodString;
72
+ artifacts: z.ZodArray<z.ZodString>;
68
73
  checklist_attestations: z.ZodOptional<z.ZodArray<z.ZodObject<{
69
74
  check_id: z.ZodString;
70
75
  items: z.ZodArray<z.ZodString>;
71
- }, z.core.$strip>>>;
76
+ }, z.core.$strict>>>;
72
77
  stage_id: z.ZodOptional<z.ZodString>;
73
78
  notes: z.ZodOptional<z.ZodString>;
74
- };
79
+ fork_choice: z.ZodOptional<z.ZodArray<z.ZodString>>;
80
+ status: z.ZodLiteral<"failure">;
81
+ payload: z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
82
+ }, z.core.$strict>], "status">;
75
83
  /** Exported for the same parity-test reason as `emitStageEnvelopeShape` above. */
76
84
  export declare const writeStageArtifactShape: {
77
85
  path: z.ZodString;
@@ -89,6 +97,7 @@ export declare function buildStageflowMcpServer(options: {
89
97
  forkEmitContext?: ForkEmitContext;
90
98
  cloneEmitContext?: CloneEmitContext;
91
99
  preEmitCheckOptions?: PreEmitCheckOptions;
100
+ feedbackLoopEmitContext?: FeedbackLoopConfig;
92
101
  writeStageArtifact: WriteStageArtifactOptions;
93
102
  askOperator?: {
94
103
  capture: AskOperatorCapture;
@@ -49,24 +49,61 @@ export const SANDBOX_EDIT_TOOL_NAME = `mcp__${STAGEFLOW_MCP_SERVER_NAME}__sandbo
49
49
  * `fork_choice` is required (not just present) when the stage has a fork
50
50
  * to route.
51
51
  */
52
+ function feedbackLoopShape(context) {
53
+ return z.discriminatedUnion("action", [
54
+ z.strictObject({ action: z.literal("continue") }),
55
+ z.strictObject({
56
+ action: z.literal("send_back"),
57
+ target: z.literal(context.target),
58
+ }),
59
+ ]);
60
+ }
61
+ function payloadShape(payloadSchema, required) {
62
+ const base = payloadSchema === undefined
63
+ ? z.record(z.string(), z.unknown())
64
+ : z.fromJSONSchema(payloadSchema);
65
+ return required ? base : base.optional();
66
+ }
52
67
  export function buildEmitStageEnvelopeShape(options) {
53
- return {
54
- status: z.enum(["success", "failure"]),
68
+ const forkRequired = options.forkEmitContext !== undefined && options.feedbackLoopEmitContext === undefined;
69
+ const attestations = z
70
+ .array(z.strictObject({
71
+ check_id: z.string().min(1),
72
+ items: z.array(z.string()),
73
+ }))
74
+ .optional();
75
+ const shared = {
55
76
  summary: z.string().min(1),
56
77
  artifacts: z.array(z.string()),
57
- payload: z.record(z.string(), z.unknown()).optional(),
58
- fork_choice: options.forkEmitContext !== undefined
59
- ? z.array(z.string())
60
- : z.array(z.string()).optional(),
61
- checklist_attestations: z
62
- .array(z.object({
63
- check_id: z.string().min(1),
64
- items: z.array(z.string()),
65
- }))
66
- .optional(),
78
+ checklist_attestations: attestations,
67
79
  stage_id: z.string().optional(),
68
80
  notes: z.string().optional(),
81
+ fork_choice: z.array(z.string()).optional(),
69
82
  };
83
+ return z.discriminatedUnion("status", [
84
+ z.strictObject({
85
+ status: z.literal("success"),
86
+ ...shared,
87
+ payload: payloadShape(options.payloadSchema, options.payloadSchema !== undefined),
88
+ fork_choice: forkRequired ? z.array(z.string()) : z.array(z.string()).optional(),
89
+ ...(options.feedbackLoopEmitContext !== undefined
90
+ ? { feedback_loop: feedbackLoopShape(options.feedbackLoopEmitContext) }
91
+ : {}),
92
+ }),
93
+ z.strictObject({
94
+ status: z.literal("failure"),
95
+ ...shared,
96
+ payload: payloadShape(options.payloadSchema, false),
97
+ }),
98
+ ]);
99
+ }
100
+ function asClaudeObjectSchema(schema) {
101
+ const json = z.toJSONSchema(schema);
102
+ delete json.$schema;
103
+ const target = schema;
104
+ target._zod.def.type = "object";
105
+ target._zod.toJSONSchema = () => json;
106
+ return schema;
70
107
  }
71
108
  /** Exported for the same parity-test reason as `emitStageEnvelopeShape` above. */
72
109
  export const writeStageArtifactShape = {
@@ -207,12 +244,14 @@ function buildSandboxEditTool(options) {
207
244
  });
208
245
  }
209
246
  export function buildStageflowMcpServer(options) {
210
- const emitDef = createEmitStageEnvelopeTool(options.capture, options.payloadSchema, options.forkEmitContext, options.cloneEmitContext, options.preEmitCheckOptions);
247
+ const emitDef = createEmitStageEnvelopeTool(options.capture, options.payloadSchema, options.forkEmitContext, options.cloneEmitContext, options.preEmitCheckOptions, options.feedbackLoopEmitContext);
211
248
  const artifactDef = createWriteStageArtifactTool(options.writeStageArtifact);
212
- const emitTool = tool(emitDef.name, emitDef.description, buildEmitStageEnvelopeShape({
249
+ const emitTool = tool(emitDef.name, emitDef.description, asClaudeObjectSchema(buildEmitStageEnvelopeShape({
213
250
  forkEmitContext: options.forkEmitContext,
214
251
  cloneEmitContext: options.cloneEmitContext,
215
- }), async (args) => toCallToolResult(await emitDef.execute("claude-tool-call", args)));
252
+ payloadSchema: options.payloadSchema,
253
+ feedbackLoopEmitContext: options.feedbackLoopEmitContext,
254
+ })), async (args) => toCallToolResult(await emitDef.execute("claude-tool-call", args)));
216
255
  const artifactTool = tool(artifactDef.name, artifactDef.description, writeStageArtifactShape, async (args) => toCallToolResult(await artifactDef.execute("claude-tool-call", args)));
217
256
  const tools = [emitTool, artifactTool];
218
257
  if (options.askOperator) {
@@ -0,0 +1,34 @@
1
+ import type { StageActivityEvent } from "./activity.js";
2
+ import { type StageUsage } from "../types/usage.js";
3
+ export type CompactionEndSessionEvent = {
4
+ type: "compaction_end";
5
+ reason: "manual" | "threshold" | "overflow";
6
+ result?: {
7
+ summary?: string;
8
+ tokensBefore?: number;
9
+ estimatedTokensAfter?: number;
10
+ usage?: CompactionUsage;
11
+ };
12
+ aborted?: boolean;
13
+ willRetry?: boolean;
14
+ errorMessage?: string;
15
+ };
16
+ export type CompactionUsage = {
17
+ input?: number;
18
+ output?: number;
19
+ cacheRead?: number;
20
+ cacheWrite?: number;
21
+ cost?: {
22
+ total?: number;
23
+ };
24
+ };
25
+ export type CompactionCost = {
26
+ inputTokens: number;
27
+ outputTokens: number;
28
+ costUsd: number;
29
+ };
30
+ export declare function compactionUsageCost(event: CompactionEndSessionEvent): CompactionCost;
31
+ export declare function compactionActivityEvent(event: CompactionEndSessionEvent, tokensAfter: number | null): Extract<StageActivityEvent, {
32
+ event: "context_compacted";
33
+ }>;
34
+ export declare function addCompactionUsage(usage: StageUsage, model: string | undefined, event: CompactionEndSessionEvent): void;
@@ -0,0 +1,37 @@
1
+ import { redactSecrets } from "./streamLogRedact.js";
2
+ import { addModelUsage } from "../types/usage.js";
3
+ export function compactionUsageCost(event) {
4
+ const u = event.result?.usage;
5
+ return {
6
+ inputTokens: Number.isFinite(u?.input) ? u.input : 0,
7
+ outputTokens: Number.isFinite(u?.output) ? u.output : 0,
8
+ costUsd: Number.isFinite(u?.cost?.total) ? u.cost.total : 0,
9
+ };
10
+ }
11
+ export function compactionActivityEvent(event, tokensAfter) {
12
+ const result = event.result;
13
+ return {
14
+ event: "context_compacted",
15
+ reason: event.reason,
16
+ tokensBefore: result?.tokensBefore ?? 0,
17
+ tokensAfter: tokensAfter ?? result?.estimatedTokensAfter ?? null,
18
+ summaryChars: result?.summary?.length ?? 0,
19
+ costUsd: compactionUsageCost(event).costUsd,
20
+ willRetry: event.willRetry ?? false,
21
+ aborted: event.aborted ?? false,
22
+ ...(event.errorMessage ? { error: redactSecrets(event.errorMessage) } : {}),
23
+ };
24
+ }
25
+ export function addCompactionUsage(usage, model, event) {
26
+ const u = event.result?.usage;
27
+ if (!u)
28
+ return;
29
+ const finite = (n) => (typeof n === "number" && Number.isFinite(n) ? n : 0);
30
+ addModelUsage(usage, model ?? "unknown", {
31
+ inputTokens: finite(u.input),
32
+ outputTokens: finite(u.output),
33
+ cacheReadInputTokens: finite(u.cacheRead),
34
+ cacheCreationInputTokens: finite(u.cacheWrite),
35
+ costUsd: finite(u.cost?.total),
36
+ });
37
+ }
@@ -0,0 +1,7 @@
1
+ import type { ExtensionFactory } from "@earendil-works/pi-coding-agent";
2
+ /**
3
+ * OpenRouter load-balances a model across providers, and providers differ in tool-call support. On any
4
+ * request that carries tools, ask OpenRouter to skip providers that cannot honour them. Routing the Host
5
+ * set in models.json (`openRouterRouting`) wins over this default.
6
+ */
7
+ export declare function createOpenRouterRoutingExtension(): ExtensionFactory;
@@ -0,0 +1,23 @@
1
+ function isOpenRouter(model) {
2
+ return model?.provider === "openrouter" || (typeof model?.baseUrl === "string" && model.baseUrl.includes("openrouter.ai"));
3
+ }
4
+ /**
5
+ * OpenRouter load-balances a model across providers, and providers differ in tool-call support. On any
6
+ * request that carries tools, ask OpenRouter to skip providers that cannot honour them. Routing the Host
7
+ * set in models.json (`openRouterRouting`) wins over this default.
8
+ */
9
+ export function createOpenRouterRoutingExtension() {
10
+ return (pi) => {
11
+ pi.on("before_provider_request", (event, ctx) => {
12
+ const payload = event.payload;
13
+ if (payload === null || typeof payload !== "object")
14
+ return undefined;
15
+ if (!Array.isArray(payload.tools) || payload.tools.length === 0)
16
+ return undefined;
17
+ if (!isOpenRouter(ctx.model))
18
+ return undefined;
19
+ const existing = payload.provider !== null && typeof payload.provider === "object" ? payload.provider : {};
20
+ return { ...payload, provider: { require_parameters: true, ...existing } };
21
+ });
22
+ };
23
+ }
@@ -75,6 +75,12 @@ export type RouteSessionEventToProgressOptions = {
75
75
  */
76
76
  export declare function routeSessionEventToProgress(event: Record<string, unknown>, options: RouteSessionEventToProgressOptions): void;
77
77
  export declare function composeStageUserPrompt(input: StageRunInput, emitToolName: string, emitHintOverride?: string, artifactToolName?: string): string;
78
+ /**
79
+ * Pi stages carry the whole assignment (task, prior envelopes, envelope
80
+ * contract, guidance) in the system prompt: compaction never summarizes it.
81
+ */
82
+ export declare function composeStagePiSystemPrompt(input: StageRunInput, emitToolName: string, emitHintOverride?: string, artifactToolName?: string): string;
83
+ export declare function composeStagePiKickoffPrompt(input: StageRunInput): string;
78
84
  export declare function composeFeedbackResumePrompt(input: StageRunInput): string;
79
85
  export declare function mcpToolMetadataMissing(loader: DefaultResourceLoader): boolean;
80
86
  export declare function collectMcpExtensionToolNames(loader: DefaultResourceLoader): {