stageflow 0.42.0 → 0.46.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 (315) hide show
  1. package/README.md +12 -3
  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 +1 -0
  23. package/dist/agents/authorChat.js +7 -0
  24. package/dist/agents/authorSessionStore.d.ts +3 -0
  25. package/dist/agents/authorSessionStore.js +17 -2
  26. package/dist/agents/evalGate.js +1 -0
  27. package/dist/agents/hostContext.d.ts +1 -1
  28. package/dist/agents/runtime/piRuntime.d.ts +5 -1
  29. package/dist/agents/runtime/piRuntime.js +46 -12
  30. package/dist/agents/service.js +3 -2
  31. package/dist/agents/sessions.js +3 -1
  32. package/dist/cli/evalCommand.d.ts +1 -1
  33. package/dist/cli/evalCommand.js +39 -2
  34. package/dist/cli/hostClient.d.ts +6 -0
  35. package/dist/cli/hostClient.js +4 -0
  36. package/dist/compaction/directives.d.ts +18 -0
  37. package/dist/compaction/directives.js +119 -0
  38. package/dist/compaction/extension.d.ts +20 -0
  39. package/dist/compaction/extension.js +78 -0
  40. package/dist/compaction/mask.d.ts +18 -0
  41. package/dist/compaction/mask.js +155 -0
  42. package/dist/compaction/pin.d.ts +21 -0
  43. package/dist/compaction/pin.js +270 -0
  44. package/dist/compaction/scrub.d.ts +7 -0
  45. package/dist/compaction/scrub.js +26 -0
  46. package/dist/compaction/sessionWiring.d.ts +22 -0
  47. package/dist/compaction/sessionWiring.js +26 -0
  48. package/dist/compaction/summarize.d.ts +79 -0
  49. package/dist/compaction/summarize.js +171 -0
  50. package/dist/compaction/toolPolicy.d.ts +3 -0
  51. package/dist/compaction/toolPolicy.js +33 -0
  52. package/dist/compaction/types.d.ts +45 -0
  53. package/dist/compaction/types.js +7 -0
  54. package/dist/compaction/workingState.d.ts +56 -0
  55. package/dist/compaction/workingState.js +198 -0
  56. package/dist/config/createPipeline.js +2 -0
  57. package/dist/config/createTrigger.js +7 -1
  58. package/dist/config/ensureCatalogScanRoot.d.ts +2 -0
  59. package/dist/config/ensureCatalogScanRoot.js +6 -0
  60. package/dist/config/evalCatalog.js +30 -2
  61. package/dist/config/githubTriggerAction.d.ts +8 -0
  62. package/dist/config/githubTriggerAction.js +29 -0
  63. package/dist/config/hostConfig.js +2 -0
  64. package/dist/config/loadEval.d.ts +3 -1
  65. package/dist/config/loadEval.js +96 -10
  66. package/dist/config/pipelineNeeds.d.ts +2 -0
  67. package/dist/config/pipelineNeeds.js +16 -3
  68. package/dist/config/pipelineRoute.js +5 -4
  69. package/dist/config/validateCatalog.d.ts +1 -1
  70. package/dist/config/validateCatalog.js +12 -0
  71. package/dist/config/validateEval.js +60 -3
  72. package/dist/config/writeEval.js +2 -2
  73. package/dist/envelope/assertEmittedArtifacts.d.ts +12 -0
  74. package/dist/envelope/assertEmittedArtifacts.js +43 -0
  75. package/dist/envelope/preEmitChecks.d.ts +3 -0
  76. package/dist/evals/calibration.d.ts +21 -0
  77. package/dist/evals/calibration.js +69 -0
  78. package/dist/evals/calibrationSuggest.d.ts +29 -0
  79. package/dist/evals/calibrationSuggest.js +72 -0
  80. package/dist/evals/calibrator.d.ts +46 -0
  81. package/dist/evals/calibrator.js +148 -0
  82. package/dist/evals/compare.d.ts +1 -1
  83. package/dist/evals/compare.js +3 -0
  84. package/dist/evals/constants.d.ts +7 -3
  85. package/dist/evals/constants.js +7 -1
  86. package/dist/evals/engine/FakeEngine.d.ts +2 -1
  87. package/dist/evals/engine/FakeEngine.js +9 -3
  88. package/dist/evals/engine/promptfoo/PromptfooEngine.d.ts +1 -1
  89. package/dist/evals/engine/promptfoo/PromptfooEngine.js +4 -2
  90. package/dist/evals/engine/promptfoo/generate.d.ts +3 -1
  91. package/dist/evals/engine/promptfoo/generate.js +43 -23
  92. package/dist/evals/engine/promptfoo/judgeProviders.js +2 -1
  93. package/dist/evals/engine/promptfoo/normalize.d.ts +4 -1
  94. package/dist/evals/engine/promptfoo/normalize.js +16 -3
  95. package/dist/evals/engine/promptfoo/rubricPrompt.d.ts +3 -1
  96. package/dist/evals/engine/promptfoo/rubricPrompt.js +15 -5
  97. package/dist/evals/errors.d.ts +7 -0
  98. package/dist/evals/errors.js +10 -0
  99. package/dist/evals/judgeProviders.d.ts +6 -0
  100. package/dist/evals/judgeProviders.js +14 -0
  101. package/dist/evals/judged.d.ts +7 -0
  102. package/dist/evals/judged.js +7 -0
  103. package/dist/evals/manager.d.ts +27 -8
  104. package/dist/evals/manager.js +73 -12
  105. package/dist/evals/plan.d.ts +10 -1
  106. package/dist/evals/plan.js +33 -13
  107. package/dist/evals/planInternalAgent.d.ts +19 -0
  108. package/dist/evals/planInternalAgent.js +201 -0
  109. package/dist/evals/read/api.d.ts +18 -0
  110. package/dist/evals/read/api.js +10 -1
  111. package/dist/evals/read/labelQueue.d.ts +45 -0
  112. package/dist/evals/read/labelQueue.js +83 -0
  113. package/dist/evals/read/list.js +10 -1
  114. package/dist/evals/read/runs.d.ts +5 -0
  115. package/dist/evals/read/runs.js +7 -1
  116. package/dist/evals/runner/caseRunner.d.ts +2 -1
  117. package/dist/evals/runner/caseRunner.js +16 -5
  118. package/dist/evals/runner/internalAgentCaseRunner.d.ts +6 -0
  119. package/dist/evals/runner/internalAgentCaseRunner.js +250 -0
  120. package/dist/evals/snapshot.d.ts +10 -2
  121. package/dist/evals/snapshot.js +8 -3
  122. package/dist/evals/stats.d.ts +40 -0
  123. package/dist/evals/stats.js +69 -0
  124. package/dist/evals/storeTypes.d.ts +42 -0
  125. package/dist/evals/types.d.ts +25 -2
  126. package/dist/evals/types.js +4 -1
  127. package/dist/evals/votes.d.ts +10 -0
  128. package/dist/evals/votes.js +60 -0
  129. package/dist/guide/cardContract.d.ts +133 -0
  130. package/dist/guide/cardContract.js +156 -0
  131. package/dist/guide/chat.d.ts +45 -0
  132. package/dist/guide/chat.js +378 -0
  133. package/dist/guide/knowledge/index.d.ts +14 -0
  134. package/dist/guide/knowledge/index.js +109 -0
  135. package/dist/guide/knowledge/topics/agents.d.ts +2 -0
  136. package/dist/guide/knowledge/topics/agents.js +58 -0
  137. package/dist/guide/knowledge/topics/bestPractices.d.ts +2 -0
  138. package/dist/guide/knowledge/topics/bestPractices.js +67 -0
  139. package/dist/guide/knowledge/topics/connections.d.ts +2 -0
  140. package/dist/guide/knowledge/topics/connections.js +66 -0
  141. package/dist/guide/knowledge/topics/consoleMap.d.ts +2 -0
  142. package/dist/guide/knowledge/topics/consoleMap.js +55 -0
  143. package/dist/guide/knowledge/topics/evals.d.ts +2 -0
  144. package/dist/guide/knowledge/topics/evals.js +72 -0
  145. package/dist/guide/knowledge/topics/limitations.d.ts +2 -0
  146. package/dist/guide/knowledge/topics/limitations.js +84 -0
  147. package/dist/guide/knowledge/topics/mcpSkillsBrowser.d.ts +2 -0
  148. package/dist/guide/knowledge/topics/mcpSkillsBrowser.js +57 -0
  149. package/dist/guide/knowledge/topics/memories.d.ts +2 -0
  150. package/dist/guide/knowledge/topics/memories.js +63 -0
  151. package/dist/guide/knowledge/topics/modelsAndProviders.d.ts +2 -0
  152. package/dist/guide/knowledge/topics/modelsAndProviders.js +56 -0
  153. package/dist/guide/knowledge/topics/overview.d.ts +2 -0
  154. package/dist/guide/knowledge/topics/overview.js +56 -0
  155. package/dist/guide/knowledge/topics/pipelines.d.ts +2 -0
  156. package/dist/guide/knowledge/topics/pipelines.js +93 -0
  157. package/dist/guide/knowledge/topics/stages.d.ts +2 -0
  158. package/dist/guide/knowledge/topics/stages.js +54 -0
  159. package/dist/guide/knowledge/topics/tasks.d.ts +2 -0
  160. package/dist/guide/knowledge/topics/tasks.js +52 -0
  161. package/dist/guide/knowledge/topics/triggers.d.ts +2 -0
  162. package/dist/guide/knowledge/topics/triggers.js +68 -0
  163. package/dist/guide/knowledge/topics/troubleshooting.d.ts +2 -0
  164. package/dist/guide/knowledge/topics/troubleshooting.js +85 -0
  165. package/dist/guide/knowledgeTools.d.ts +2 -0
  166. package/dist/guide/knowledgeTools.js +56 -0
  167. package/dist/guide/showUi.d.ts +6 -0
  168. package/dist/guide/showUi.js +546 -0
  169. package/dist/guide/threadStore.d.ts +48 -0
  170. package/dist/guide/threadStore.js +189 -0
  171. package/dist/guide/writeRoot.d.ts +11 -0
  172. package/dist/guide/writeRoot.js +70 -0
  173. package/dist/hosted/translate.js +2 -0
  174. package/dist/mcp/agentTools.js +12 -0
  175. package/dist/mcp/catalogTools.js +18 -20
  176. package/dist/mcp/catalogWriteTools.d.ts +8 -0
  177. package/dist/mcp/catalogWriteTools.js +225 -0
  178. package/dist/mcp/connectionTools.d.ts +3 -0
  179. package/dist/mcp/connectionTools.js +85 -0
  180. package/dist/mcp/controlTools.js +34 -1
  181. package/dist/mcp/deps.d.ts +9 -0
  182. package/dist/mcp/evalTools.js +723 -21
  183. package/dist/mcp/memoryHostTools.d.ts +3 -0
  184. package/dist/mcp/memoryHostTools.js +72 -0
  185. package/dist/mcp/pipelineAuthorTools.js +14 -1
  186. package/dist/mcp/server.js +5 -0
  187. package/dist/mcp/tools.js +6 -0
  188. package/dist/mcp/triggerTools.js +77 -31
  189. package/dist/operatorAgent/evalGate.d.ts +22 -0
  190. package/dist/operatorAgent/evalGate.js +77 -0
  191. package/dist/operatorAgent/fakeHost.js +10 -2
  192. package/dist/operatorAgent/host.js +18 -2
  193. package/dist/operatorAgent/index.d.ts +1 -0
  194. package/dist/operatorAgent/index.js +1 -0
  195. package/dist/operatorAgent/internalAgents.d.ts +11 -0
  196. package/dist/operatorAgent/internalAgents.js +13 -0
  197. package/dist/operatorAgent/piModel.d.ts +5 -1
  198. package/dist/operatorAgent/piModel.js +15 -10
  199. package/dist/operatorAgent/profiles/agentAuthor.js +66 -22
  200. package/dist/operatorAgent/profiles/agentAuthorPlaybook.d.ts +1 -1
  201. package/dist/operatorAgent/profiles/agentAuthorPlaybook.js +1 -1
  202. package/dist/operatorAgent/profiles/guideConfirm.d.ts +21 -0
  203. package/dist/operatorAgent/profiles/guideConfirm.js +100 -0
  204. package/dist/operatorAgent/profiles/guideTools.d.ts +7 -0
  205. package/dist/operatorAgent/profiles/guideTools.js +123 -0
  206. package/dist/operatorAgent/profiles/stageflowGuide.d.ts +7 -0
  207. package/dist/operatorAgent/profiles/stageflowGuide.js +133 -0
  208. package/dist/operatorAgent/profiles/workshopAuthor.js +23 -0
  209. package/dist/operatorAgent/profiles/workshopAuthorPlaybook.d.ts +1 -1
  210. package/dist/operatorAgent/profiles/workshopAuthorPlaybook.js +9 -1
  211. package/dist/operatorAgent/profiles/workshopAuthorTools.d.ts +2 -0
  212. package/dist/operatorAgent/profiles/workshopAuthorTools.js +197 -9
  213. package/dist/operatorAgent/types.d.ts +23 -0
  214. package/dist/package-meta.d.ts +1 -1
  215. package/dist/package-meta.js +1 -1
  216. package/dist/runstore/port.d.ts +13 -1
  217. package/dist/runstore/retention.d.ts +2 -1
  218. package/dist/runstore/retention.js +3 -7
  219. package/dist/runstore/runStatusClock.d.ts +17 -0
  220. package/dist/runstore/runStatusClock.js +19 -0
  221. package/dist/runstore/sqlite/SqliteRunStore.d.ts +11 -1
  222. package/dist/runstore/sqlite/SqliteRunStore.js +70 -45
  223. package/dist/runstore/sqlite/calibrationStore.d.ts +10 -0
  224. package/dist/runstore/sqlite/calibrationStore.js +106 -0
  225. package/dist/runstore/sqlite/evalStore.d.ts +5 -0
  226. package/dist/runstore/sqlite/evalStore.js +7 -0
  227. package/dist/runstore/sqlite/migrations/018-eval-grader-labels.d.ts +11 -0
  228. package/dist/runstore/sqlite/migrations/018-eval-grader-labels.js +43 -0
  229. package/dist/runstore/sqlite/migrations/index.js +2 -0
  230. package/dist/runstore/workspaceLayout.js +6 -1
  231. package/dist/runtime/artifactDiskInspect.d.ts +14 -0
  232. package/dist/runtime/artifactDiskInspect.js +52 -0
  233. package/dist/runtime/artifactPath.d.ts +24 -0
  234. package/dist/runtime/artifactPath.js +84 -0
  235. package/dist/runtime/completionCheckRunner.js +15 -43
  236. package/dist/runtime/githubPollSource.d.ts +22 -4
  237. package/dist/runtime/githubPollSource.js +93 -8
  238. package/dist/runtime/priorArtifactGrants.d.ts +8 -0
  239. package/dist/runtime/priorArtifactGrants.js +105 -0
  240. package/dist/runtime/runActionEligibility.d.ts +46 -0
  241. package/dist/runtime/runActionEligibility.js +123 -0
  242. package/dist/runtime/runManager.d.ts +4 -1
  243. package/dist/runtime/runManager.js +52 -10
  244. package/dist/runtime/runRetryCoordinator.d.ts +2 -14
  245. package/dist/runtime/runRetryCoordinator.js +3 -67
  246. package/dist/runtime/sandboxContainer.d.ts +7 -0
  247. package/dist/runtime/sandboxContainer.js +48 -6
  248. package/dist/runtime/sandboxDesk.d.ts +2 -1
  249. package/dist/runtime/sandboxDesk.js +11 -12
  250. package/dist/runtime/stageEnvironment.js +1 -0
  251. package/dist/runtime/stageRoots.d.ts +12 -0
  252. package/dist/runtime/stageSandbox.d.ts +2 -1
  253. package/dist/runtime/stageSandbox.js +18 -2
  254. package/dist/runtime/stageWorker.js +20 -0
  255. package/dist/server/agentAuthorRoutes.js +12 -3
  256. package/dist/server/bootstrap.d.ts +5 -0
  257. package/dist/server/bootstrap.js +14 -1
  258. package/dist/server/evalRoutes.js +251 -12
  259. package/dist/server/guideRoutes.d.ts +5 -0
  260. package/dist/server/guideRoutes.js +166 -0
  261. package/dist/server/http.d.ts +10 -0
  262. package/dist/server/http.js +35 -1
  263. package/dist/server/internalAgentRoutes.d.ts +6 -0
  264. package/dist/server/internalAgentRoutes.js +12 -0
  265. package/dist/server/mcpHost.js +2 -0
  266. package/dist/toolkit/meta.d.ts +1 -1
  267. package/dist/toolkit/meta.js +41 -1
  268. package/dist/toolkit/profiles.d.ts +5 -0
  269. package/dist/toolkit/profiles.js +12 -0
  270. package/dist/tools/askOperator.js +2 -1
  271. package/dist/tools/emitStageEnvelope.d.ts +17 -16
  272. package/dist/tools/emitStageEnvelope.js +46 -32
  273. package/dist/tools/stageToolNames.d.ts +4 -0
  274. package/dist/tools/stageToolNames.js +4 -0
  275. package/dist/tools/workingState.d.ts +40 -0
  276. package/dist/tools/workingState.js +108 -0
  277. package/dist/tools/writeStageArtifact.d.ts +0 -9
  278. package/dist/tools/writeStageArtifact.js +2 -1
  279. package/dist/ui/assets/{MarkdownText-BTrOqu5J.js → MarkdownText-BS2BBbCx.js} +2 -2
  280. package/dist/ui/assets/adapters-DPD-cAsy.js +17 -0
  281. package/dist/ui/assets/chat-BD1-VTT6.js +2 -0
  282. package/dist/ui/assets/chat-DXnQv9st.css +2 -0
  283. package/dist/ui/assets/main-AX5XNLtX.js +278 -0
  284. package/dist/ui/assets/{main-CHlmTNJe.css → main-CFX0_n8J.css} +1 -1
  285. package/dist/ui/chat.html +3 -4
  286. package/dist/ui/index.html +3 -4
  287. package/dist/workshop/chatTurn.js +1 -1
  288. package/dist/workshop/workshopPin.d.ts +3 -3
  289. package/dist/workshop/workshopPin.js +16 -15
  290. package/examples/compaction-stress/README.md +30 -0
  291. package/examples/compaction-stress/check-run.mjs +53 -0
  292. package/examples/compaction-stress/collect-evidence.yaml +60 -0
  293. package/examples/compaction-stress/compaction-stress.pipeline.yaml +141 -0
  294. package/examples/compaction-stress/compaction-stress.task.yaml +15 -0
  295. package/examples/compaction-stress/generate-evidence.mjs +110 -0
  296. package/examples/compaction-stress/root-cause.yaml +26 -0
  297. package/examples/compaction-stress/stageflow.yaml +9 -0
  298. package/examples/compaction-stress/write-postmortem.yaml +40 -0
  299. package/examples/evals/README.md +18 -0
  300. package/examples/evals/guide-behavior.dataset.jsonl +15 -0
  301. package/examples/evals/guide-behavior.eval.yaml +35 -0
  302. package/examples/evals/guide-depth.dataset.jsonl +35 -0
  303. package/examples/evals/guide-depth.eval.yaml +169 -0
  304. package/examples/memory/evals/guide-behavior.dataset.jsonl +15 -0
  305. package/examples/memory/evals/guide-behavior.eval.yaml +35 -0
  306. package/examples/memory/evals/guide-depth.dataset.jsonl +35 -0
  307. package/examples/memory/evals/guide-depth.eval.yaml +169 -0
  308. package/package.json +1 -1
  309. package/skills/stageflow/references/control-surface.md +1 -1
  310. package/skills/stageflow/references/evals.md +1 -0
  311. package/dist/ui/assets/AssistantRuntimeProvider-qIX1xNoH.js +0 -9
  312. package/dist/ui/assets/ReadonlyStore-BfXqHykm.js +0 -6
  313. package/dist/ui/assets/chat-Df_wCpak.js +0 -5
  314. package/dist/ui/assets/chat-P7KQznHm.css +0 -2
  315. package/dist/ui/assets/main-CvVfxmMd.js +0 -271
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?
@@ -58,14 +67,14 @@ See [Architecture](docs/architecture.md) for component boundaries, execution flo
58
67
 
59
68
  ### Docker (recommended)
60
69
 
61
- 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).
62
71
 
63
72
  ```bash
64
73
  docker run --rm --name stageflow \
65
74
  -e STAGEFLOW_ALLOW_UNAUTHENTICATED_BIND=1 \
66
75
  -p 127.0.0.1:3847:3847 \
67
76
  -v stageflow-data:/data \
68
- ghcr.io/tejasghutukade/stageflow:0.39 \
77
+ ghcr.io/tejasghutukade/stageflow:0.42 \
69
78
  sf ui
70
79
  ```
71
80
 
@@ -82,7 +91,7 @@ docker run --rm --name stageflow \
82
91
  -p 127.0.0.1:3847:3847 \
83
92
  -v stageflow-data:/data \
84
93
  -v "$PWD":/project \
85
- ghcr.io/tejasghutukade/stageflow:0.39 \
94
+ ghcr.io/tejasghutukade/stageflow:0.42 \
86
95
  sf ui
87
96
  ```
88
97
 
@@ -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): {