stageflow 0.33.0 → 0.36.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 (379) hide show
  1. package/README.md +3 -3
  2. package/dist/agent/adapterSpill.d.ts +14 -0
  3. package/dist/agent/adapterSpill.js +83 -0
  4. package/dist/agent/agentBackend.d.ts +2 -2
  5. package/dist/agent/agentBackend.js +2 -2
  6. package/dist/agent/claudeAdapter.d.ts +13 -2
  7. package/dist/agent/claudeAdapter.js +56 -6
  8. package/dist/agent/cursorProvider.d.ts +3 -0
  9. package/dist/agent/cursorProvider.js +23 -6
  10. package/dist/agent/fakeAgent.d.ts +3 -3
  11. package/dist/agent/piAdapter.d.ts +2 -2
  12. package/dist/agent/piAdapter.js +125 -15
  13. package/dist/agent/piIsolatedMcp.d.ts +1 -0
  14. package/dist/agent/piIsolatedMcp.js +19 -1
  15. package/dist/agent/piIsolatedMcpProbe.d.ts +11 -0
  16. package/dist/agent/piIsolatedMcpProbe.js +20 -0
  17. package/dist/agent/port.d.ts +4 -2
  18. package/dist/agent/providerAuth.js +36 -3
  19. package/dist/agent/{resolveAgentPort.d.ts → resolveStagePort.d.ts} +8 -8
  20. package/dist/agent/{resolveAgentPort.js → resolveStagePort.js} +11 -11
  21. package/dist/agent/stageTurnDriver.d.ts +33 -0
  22. package/dist/agent/stageTurnDriver.js +64 -0
  23. package/dist/agent/toolOutputBudget.d.ts +46 -0
  24. package/dist/agent/toolOutputBudget.js +97 -0
  25. package/dist/agent/toolOutputBudgetExtension.d.ts +22 -0
  26. package/dist/agent/toolOutputBudgetExtension.js +141 -0
  27. package/dist/agent/toolOutputSpill.d.ts +34 -0
  28. package/dist/agent/toolOutputSpill.js +85 -0
  29. package/dist/browser/agentBrowserLiveViewRelay.d.ts +41 -0
  30. package/dist/browser/agentBrowserLiveViewRelay.js +801 -0
  31. package/dist/browser/anchor.d.ts +2 -0
  32. package/dist/browser/anchor.js +2 -1
  33. package/dist/browser/auditSink.d.ts +8 -0
  34. package/dist/browser/browserHost.d.ts +29 -0
  35. package/dist/browser/browserSweep.d.ts +4 -1
  36. package/dist/browser/browserSweep.js +7 -0
  37. package/dist/browser/browserTeardown.d.ts +1 -0
  38. package/dist/browser/browserTeardown.js +32 -2
  39. package/dist/browser/containerBrowserEndpoint.d.ts +11 -0
  40. package/dist/browser/containerBrowserEndpoint.js +57 -0
  41. package/dist/browser/containerBrowserHost.d.ts +24 -0
  42. package/dist/browser/containerBrowserHost.js +147 -0
  43. package/dist/browser/dockerSandboxOrchestrator.d.ts +26 -0
  44. package/dist/browser/dockerSandboxOrchestrator.js +142 -0
  45. package/dist/browser/fakeLiveViewRelay.d.ts +15 -0
  46. package/dist/browser/fakeLiveViewRelay.js +94 -0
  47. package/dist/browser/fakeLiveViewSource.d.ts +6 -0
  48. package/dist/browser/fakeLiveViewSource.js +16 -0
  49. package/dist/browser/fakeRemoteBrowserHost.d.ts +2 -1
  50. package/dist/browser/fakeRemoteBrowserHost.js +2 -1
  51. package/dist/browser/fakeSandboxOrchestrator.d.ts +9 -0
  52. package/dist/browser/fakeSandboxOrchestrator.js +44 -0
  53. package/dist/browser/gateHandoff.d.ts +0 -2
  54. package/dist/browser/gateHandoff.js +5 -11
  55. package/dist/browser/hostCapabilities.d.ts +23 -0
  56. package/dist/browser/hostCapabilities.js +23 -0
  57. package/dist/browser/humanLogin.d.ts +2 -2
  58. package/dist/browser/humanLogin.js +11 -2
  59. package/dist/browser/liveViewPersisted.d.ts +11 -0
  60. package/dist/browser/liveViewPersisted.js +22 -0
  61. package/dist/browser/liveViewRelay.d.ts +76 -0
  62. package/dist/browser/liveViewRelay.js +1 -0
  63. package/dist/browser/liveViewSessions.d.ts +25 -0
  64. package/dist/browser/liveViewSessions.js +139 -0
  65. package/dist/browser/liveViewSource.d.ts +25 -0
  66. package/dist/browser/liveViewSource.js +7 -0
  67. package/dist/browser/liveViewTickets.d.ts +46 -0
  68. package/dist/browser/liveViewTickets.js +122 -0
  69. package/dist/browser/localBrowserHost.d.ts +10 -0
  70. package/dist/browser/localBrowserHost.js +53 -7
  71. package/dist/browser/ownerScope.d.ts +10 -0
  72. package/dist/browser/ownerScope.js +6 -0
  73. package/dist/browser/profileStore.d.ts +5 -2
  74. package/dist/browser/profileStore.js +3 -5
  75. package/dist/browser/sandboxOrchestrator.d.ts +60 -0
  76. package/dist/browser/sandboxOrchestrator.js +8 -0
  77. package/dist/browser/sessionApiSandboxOrchestrator.d.ts +34 -0
  78. package/dist/browser/sessionApiSandboxOrchestrator.js +108 -0
  79. package/dist/browser/stageBrowserEnv.d.ts +7 -0
  80. package/dist/browser/stageBrowserEnv.js +53 -15
  81. package/dist/browser/stageHandoff.d.ts +47 -0
  82. package/dist/browser/stageHandoff.js +101 -0
  83. package/dist/browser/stageProfileLock.d.ts +1 -0
  84. package/dist/browser/stageProfileLock.js +1 -3
  85. package/dist/browser/volumeProfileStore.d.ts +7 -0
  86. package/dist/browser/volumeProfileStore.js +35 -0
  87. package/dist/channels/config.d.ts +11 -0
  88. package/dist/channels/config.js +95 -0
  89. package/dist/channels/configWriter.d.ts +40 -0
  90. package/dist/channels/configWriter.js +148 -0
  91. package/dist/channels/connectionEdits.d.ts +34 -0
  92. package/dist/channels/connectionEdits.js +53 -0
  93. package/dist/channels/errorInfo.d.ts +18 -0
  94. package/dist/channels/errorInfo.js +71 -0
  95. package/dist/channels/errors.d.ts +12 -0
  96. package/dist/channels/errors.js +13 -0
  97. package/dist/channels/health.d.ts +41 -0
  98. package/dist/channels/health.js +99 -0
  99. package/dist/channels/host.d.ts +55 -0
  100. package/dist/channels/host.js +185 -0
  101. package/dist/channels/http.d.ts +31 -0
  102. package/dist/channels/http.js +79 -0
  103. package/dist/channels/index.d.ts +10 -0
  104. package/dist/channels/index.js +9 -0
  105. package/dist/channels/ledger.d.ts +37 -0
  106. package/dist/channels/ledger.js +95 -0
  107. package/dist/channels/providers/agentmail.d.ts +26 -0
  108. package/dist/channels/providers/agentmail.js +81 -0
  109. package/dist/channels/providers/kit.d.ts +40 -0
  110. package/dist/channels/providers/kit.js +78 -0
  111. package/dist/channels/providers/photonImessage.d.ts +45 -0
  112. package/dist/channels/providers/photonImessage.js +152 -0
  113. package/dist/channels/providers/photonWhatsapp.d.ts +49 -0
  114. package/dist/channels/providers/photonWhatsapp.js +146 -0
  115. package/dist/channels/providers/slack.d.ts +25 -0
  116. package/dist/channels/providers/slack.js +101 -0
  117. package/dist/channels/providers/telegram.d.ts +21 -0
  118. package/dist/channels/providers/telegram.js +100 -0
  119. package/dist/channels/providers.d.ts +5 -0
  120. package/dist/channels/providers.js +22 -0
  121. package/dist/channels/registry.d.ts +54 -0
  122. package/dist/channels/registry.js +186 -0
  123. package/dist/channels/secretStore.d.ts +21 -0
  124. package/dist/channels/secretStore.js +75 -0
  125. package/dist/channels/secrets.d.ts +15 -0
  126. package/dist/channels/secrets.js +50 -0
  127. package/dist/channels/service.d.ts +54 -0
  128. package/dist/channels/service.js +307 -0
  129. package/dist/channels/stageChannels.d.ts +45 -0
  130. package/dist/channels/stageChannels.js +110 -0
  131. package/dist/channels/types.d.ts +142 -0
  132. package/dist/channels/types.js +1 -0
  133. package/dist/cli/browserCommand.d.ts +3 -1
  134. package/dist/cli/browserCommand.js +25 -20
  135. package/dist/cli/doctorCommand.js +3 -1
  136. package/dist/cli/resolveCliProjectRoot.d.ts +7 -0
  137. package/dist/cli/resolveCliProjectRoot.js +27 -0
  138. package/dist/cli/runCommand.d.ts +1 -1
  139. package/dist/cli/runCommand.js +59 -17
  140. package/dist/cli/skillsCommand.d.ts +20 -0
  141. package/dist/cli/skillsCommand.js +74 -31
  142. package/dist/cli/validateCommand.d.ts +1 -1
  143. package/dist/cli/validateCommand.js +22 -4
  144. package/dist/cli.js +4 -4
  145. package/dist/config/browseCatalog.d.ts +2 -0
  146. package/dist/config/browseCatalog.js +6 -0
  147. package/dist/config/catalogRelativePath.d.ts +4 -0
  148. package/dist/config/catalogRelativePath.js +37 -9
  149. package/dist/config/createStage.d.ts +1 -0
  150. package/dist/config/createStage.js +11 -2
  151. package/dist/config/createTask.d.ts +30 -0
  152. package/dist/config/createTask.js +161 -0
  153. package/dist/config/createTrigger.d.ts +15 -0
  154. package/dist/config/createTrigger.js +32 -25
  155. package/dist/config/draftPackage.d.ts +42 -0
  156. package/dist/config/draftPackage.js +220 -23
  157. package/dist/config/ensureCatalogScanRoot.d.ts +2 -1
  158. package/dist/config/ensureCatalogScanRoot.js +6 -2
  159. package/dist/config/findTaskInCatalog.d.ts +33 -0
  160. package/dist/config/findTaskInCatalog.js +69 -0
  161. package/dist/config/hostConfig.d.ts +21 -0
  162. package/dist/config/hostConfig.js +114 -1
  163. package/dist/config/importTask.d.ts +19 -0
  164. package/dist/config/importTask.js +133 -0
  165. package/dist/config/installSkillRequest.d.ts +40 -0
  166. package/dist/config/installSkillRequest.js +286 -0
  167. package/dist/config/loadOutcome.d.ts +11 -6
  168. package/dist/config/loadPipeline.js +27 -4
  169. package/dist/config/loadStage.js +17 -0
  170. package/dist/config/loadStageflowManifest.js +4 -1
  171. package/dist/config/loadTask.js +2 -0
  172. package/dist/config/loadTrigger.js +2 -0
  173. package/dist/config/mergePipelineIncludes.d.ts +3 -0
  174. package/dist/config/mergePipelineIncludes.js +30 -0
  175. package/dist/config/normalizePipelineStageEntry.js +10 -1
  176. package/dist/config/pipelineStageKeys.js +1 -0
  177. package/dist/config/printTargetYaml.js +0 -1
  178. package/dist/config/publishDraftPackage.d.ts +5 -1
  179. package/dist/config/publishDraftPackage.js +4 -1
  180. package/dist/config/resolveCatalogRoots.d.ts +4 -1
  181. package/dist/config/resolveCatalogRoots.js +18 -1
  182. package/dist/config/skillUsageIndex.d.ts +6 -0
  183. package/dist/config/skillUsageIndex.js +39 -0
  184. package/dist/config/stageBrowser.js +13 -0
  185. package/dist/config/triggerAdapterStatus.d.ts +11 -0
  186. package/dist/config/triggerAdapterStatus.js +90 -0
  187. package/dist/config/triggerCatalog.d.ts +41 -2
  188. package/dist/config/triggerCatalog.js +107 -15
  189. package/dist/config/updateTask.d.ts +30 -0
  190. package/dist/config/updateTask.js +119 -0
  191. package/dist/config/updateTrigger.d.ts +38 -0
  192. package/dist/config/updateTrigger.js +220 -0
  193. package/dist/config/validateCatalog.d.ts +9 -2
  194. package/dist/config/validateCatalog.js +71 -7
  195. package/dist/config/workshopCatalogFilenames.d.ts +37 -0
  196. package/dist/config/workshopCatalogFilenames.js +125 -0
  197. package/dist/config/workshopCatalogRepair.d.ts +7 -0
  198. package/dist/config/workshopCatalogRepair.js +144 -0
  199. package/dist/config/yamlParsePosition.d.ts +4 -0
  200. package/dist/config/yamlParsePosition.js +9 -0
  201. package/dist/errors/codes.d.ts +1 -1
  202. package/dist/errors/codes.js +1 -0
  203. package/dist/hosted/runtime.d.ts +2 -2
  204. package/dist/hosted/types.d.ts +1 -1
  205. package/dist/hosted/types.js +1 -1
  206. package/dist/index.d.ts +3 -2
  207. package/dist/index.js +2 -1
  208. package/dist/mcp/catalogTools.js +1 -0
  209. package/dist/mcp/getStartedTool.js +15 -6
  210. package/dist/mcp/triggerTools.js +2 -8
  211. package/dist/operatorAgent/agentPort.d.ts +11 -0
  212. package/dist/operatorAgent/agentPort.js +12 -0
  213. package/dist/operatorAgent/index.d.ts +1 -0
  214. package/dist/operatorAgent/index.js +1 -0
  215. package/dist/operatorAgent/piModel.js +26 -6
  216. package/dist/operatorAgent/profiles/workshopAuthorPlaybook.d.ts +1 -1
  217. package/dist/operatorAgent/profiles/workshopAuthorPlaybook.js +4 -2
  218. package/dist/operatorAgent/profiles/workshopAuthorTools.js +103 -16
  219. package/dist/package-meta.d.ts +1 -1
  220. package/dist/package-meta.js +1 -1
  221. package/dist/preflight/channelChecks.d.ts +17 -0
  222. package/dist/preflight/channelChecks.js +106 -0
  223. package/dist/preflight/pipelinePreflight.d.ts +9 -2
  224. package/dist/preflight/pipelinePreflight.js +9 -1
  225. package/dist/project/ensureProjectRootsFromEnv.d.ts +3 -0
  226. package/dist/project/ensureProjectRootsFromEnv.js +22 -0
  227. package/dist/project/globalHome.d.ts +1 -0
  228. package/dist/project/globalHome.js +18 -0
  229. package/dist/project/workspaceCatalog.d.ts +10 -0
  230. package/dist/project/workspaceCatalog.js +91 -0
  231. package/dist/runstore/backup.js +14 -4
  232. package/dist/runstore/port.d.ts +11 -1
  233. package/dist/runstore/restore.js +5 -2
  234. package/dist/runstore/sqlite/SqliteRunStore.d.ts +8 -0
  235. package/dist/runstore/sqlite/SqliteRunStore.js +29 -9
  236. package/dist/runstore/sqlite/migrations/012-trigger-fires.d.ts +7 -0
  237. package/dist/runstore/sqlite/migrations/012-trigger-fires.js +18 -0
  238. package/dist/runstore/sqlite/migrations/index.js +2 -0
  239. package/dist/runstore/stageSnapshot.d.ts +3 -1
  240. package/dist/runstore/stageSnapshot.js +19 -0
  241. package/dist/runstore/workspaceLayout.js +27 -0
  242. package/dist/runstore/writeContainedArtifact.d.ts +1 -0
  243. package/dist/runstore/writeContainedArtifact.js +52 -0
  244. package/dist/runtime/credentialBinding.js +14 -6
  245. package/dist/runtime/emailSource.js +20 -28
  246. package/dist/runtime/githubPollSource.js +20 -28
  247. package/dist/runtime/pipelineRunner.d.ts +4 -4
  248. package/dist/runtime/pipelineRunner.js +3 -1
  249. package/dist/runtime/pipelineScheduler.d.ts +2 -2
  250. package/dist/runtime/pipelineScheduler.js +3 -0
  251. package/dist/runtime/repositoryMaterialize.d.ts +1 -1
  252. package/dist/runtime/resumeReconstruct.d.ts +2 -2
  253. package/dist/runtime/resumeTimedOut.d.ts +2 -2
  254. package/dist/runtime/runManager.d.ts +18 -2
  255. package/dist/runtime/runManager.js +99 -31
  256. package/dist/runtime/runRetryCoordinator.d.ts +2 -2
  257. package/dist/runtime/scheduleSource.js +15 -24
  258. package/dist/runtime/stageAttemptBootstrap.d.ts +2 -2
  259. package/dist/runtime/stageAttemptBootstrap.js +26 -1
  260. package/dist/runtime/stageProcessLauncher.js +33 -3
  261. package/dist/runtime/stageRoots.js +8 -1
  262. package/dist/runtime/stageRunner.d.ts +2 -2
  263. package/dist/runtime/stageRunner.js +8 -2
  264. package/dist/runtime/stageWorker.js +2 -2
  265. package/dist/runtime/triggerPort.d.ts +5 -3
  266. package/dist/runtime/triggerRunner.d.ts +1 -0
  267. package/dist/runtime/triggerRunner.js +27 -20
  268. package/dist/runtime/webhookAccept.d.ts +25 -0
  269. package/dist/runtime/webhookAccept.js +56 -0
  270. package/dist/server/bootstrap.d.ts +10 -2
  271. package/dist/server/bootstrap.js +19 -1
  272. package/dist/server/channelRoutes.d.ts +9 -0
  273. package/dist/server/channelRoutes.js +88 -0
  274. package/dist/server/controlToken.d.ts +1 -1
  275. package/dist/server/controlToken.js +18 -2
  276. package/dist/server/healthSurfaces.d.ts +12 -0
  277. package/dist/server/healthSurfaces.js +27 -6
  278. package/dist/server/http.d.ts +19 -10
  279. package/dist/server/http.js +616 -85
  280. package/dist/server/liveViewPath.d.ts +9 -0
  281. package/dist/server/liveViewPath.js +8 -0
  282. package/dist/server/liveViewRoutes.d.ts +58 -0
  283. package/dist/server/liveViewRoutes.js +565 -0
  284. package/dist/server/mcpHost.d.ts +4 -2
  285. package/dist/server/mcpHost.js +2 -0
  286. package/dist/server/readCatalogFile.d.ts +29 -0
  287. package/dist/server/readCatalogFile.js +215 -0
  288. package/dist/server/triggerRoutes.d.ts +1 -0
  289. package/dist/server/triggerRoutes.js +200 -73
  290. package/dist/tools/sendMessage.d.ts +21 -0
  291. package/dist/tools/sendMessage.js +25 -0
  292. package/dist/tools/writeStageArtifact.d.ts +9 -0
  293. package/dist/tools/writeStageArtifact.js +2 -47
  294. package/dist/types/pipeline.d.ts +5 -2
  295. package/dist/types/stage.d.ts +14 -1
  296. package/dist/types/stageflowManifest.d.ts +1 -1
  297. package/dist/ui/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
  298. package/dist/ui/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
  299. package/dist/ui/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  300. package/dist/ui/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  301. package/dist/ui/assets/geist-mono-cyrillic-ext-wght-normal-X_5orZeX.woff2 +0 -0
  302. package/dist/ui/assets/geist-mono-cyrillic-wght-normal-DiZS0aHC.woff2 +0 -0
  303. package/dist/ui/assets/geist-mono-latin-ext-wght-normal-Bwz-egvJ.woff2 +0 -0
  304. package/dist/ui/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
  305. package/dist/ui/assets/geist-mono-symbols2-wght-normal-CO5SzqOn.woff2 +0 -0
  306. package/dist/ui/assets/geist-mono-vietnamese-wght-normal-DadHysG0.woff2 +0 -0
  307. package/dist/ui/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
  308. package/dist/ui/assets/index-BOhqnPNg.js +260 -0
  309. package/dist/ui/assets/{index-Bv4p1aPK.css → index-Clv4sJpU.css} +1 -1
  310. package/dist/ui/index.html +4 -4
  311. package/dist/workshop/autosave.d.ts +2 -2
  312. package/dist/workshop/autosave.js +4 -6
  313. package/dist/workshop/buildStore.d.ts +2 -0
  314. package/dist/workshop/chatAttachments.d.ts +27 -0
  315. package/dist/workshop/chatAttachments.js +98 -0
  316. package/dist/workshop/chatTurn.d.ts +5 -2
  317. package/dist/workshop/chatTurn.js +22 -18
  318. package/dist/workshop/sessionMutations.d.ts +17 -0
  319. package/dist/workshop/sessionMutations.js +107 -0
  320. package/dist/workshop/sessionStore.d.ts +10 -0
  321. package/dist/workshop/sessionStore.js +52 -0
  322. package/dist/workshop/workshopPin.d.ts +4 -3
  323. package/dist/workshop/workshopPin.js +26 -6
  324. package/dist/workshop/workshopTranscriptTurn.d.ts +8 -0
  325. package/dist/workshop/workshopTranscriptTurn.js +46 -0
  326. package/examples/README.md +1 -1
  327. package/examples/archify-on-pr/README.md +1 -1
  328. package/examples/archify-on-pr/archify-on-pr.pipeline.yaml +0 -1
  329. package/examples/archify-on-pr/author-diagrams.yaml +1 -0
  330. package/examples/channels-smoke/README.md +12 -0
  331. package/examples/channels-smoke/channels-smoke.pipeline.yaml +11 -0
  332. package/examples/channels-smoke/channels-smoke.task.yaml +3 -0
  333. package/examples/channels-smoke/send-email.yaml +32 -0
  334. package/examples/channels-smoke/send-text.yaml +31 -0
  335. package/examples/conditional-fork/branch-a.yaml +1 -1
  336. package/examples/conditional-fork/decide.yaml +2 -1
  337. package/examples/feature-loop/{implement.yaml → feature-implement.yaml} +1 -1
  338. package/examples/feature-loop/feature-loop.pipeline.yaml +10 -10
  339. package/examples/feature-loop/{plan.yaml → feature-plan.yaml} +1 -1
  340. package/examples/feature-loop/{review.yaml → feature-review.yaml} +1 -1
  341. package/examples/feedback-loop/{implement.yaml → feedback-implement.yaml} +1 -1
  342. package/examples/feedback-loop/feedback-loop-wait-human.pipeline.yaml +9 -9
  343. package/examples/feedback-loop/feedback-loop.pipeline.yaml +9 -9
  344. package/examples/feedback-loop/{plan.yaml → feedback-plan.yaml} +1 -1
  345. package/examples/feedback-loop/{review.yaml → feedback-review.yaml} +1 -1
  346. package/examples/generic-fan-in/{research.yaml → fan-in-research.yaml} +1 -1
  347. package/examples/generic-fan-in/generic-fan-in-accepted.pipeline.yaml +3 -3
  348. package/examples/generic-fan-in/generic-fan-in.pipeline.yaml +3 -3
  349. package/examples/hello-world/{research.yaml → hello-research.yaml} +1 -1
  350. package/examples/hello-world/hello.pipeline.yaml +2 -2
  351. package/examples/mcp-hitl-tour/{review.yaml → mcp-hitl-review.yaml} +1 -1
  352. package/examples/mcp-hitl-tour/mcp-hitl-tour.pipeline.yaml +3 -3
  353. package/examples/oss-issue-contribution/oss-explain-fix.yaml +1 -0
  354. package/examples/oss-issue-contribution/oss-explain-issue.yaml +1 -0
  355. package/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml +0 -2
  356. package/examples/stageflow.yaml +6 -0
  357. package/examples/triggers/sample-github-pr.trigger.yaml +12 -0
  358. package/examples/triggers/sample-inbox-email.trigger.yaml +14 -0
  359. package/examples/triggers/sample-manual-hello.trigger.yaml +5 -0
  360. package/examples/triggers/sample-nightly-hello.trigger.yaml +8 -0
  361. package/examples/triggers/sample-signed-webhook.trigger.yaml +11 -0
  362. package/examples/triggers-readiness/README.md +48 -0
  363. package/examples/triggers-readiness/readiness-emit.yaml +18 -0
  364. package/examples/triggers-readiness/readiness.pipeline.yaml +4 -0
  365. package/examples/triggers-readiness/readiness.task.yaml +6 -0
  366. package/examples/triggers-readiness/stageflow.yaml +13 -0
  367. package/examples/triggers-readiness/triggers/readiness-dynamic-manual.trigger.yaml +4 -0
  368. package/examples/triggers-readiness/triggers/readiness-email.trigger.yaml +12 -0
  369. package/examples/triggers-readiness/triggers/readiness-github-pr.trigger.yaml +12 -0
  370. package/examples/triggers-readiness/triggers/readiness-manual.trigger.yaml +5 -0
  371. package/examples/triggers-readiness/triggers/readiness-schedule.trigger.yaml +8 -0
  372. package/examples/triggers-readiness/triggers/readiness-webhook.trigger.yaml +11 -0
  373. package/package.json +8 -3
  374. package/skills/stageflow/references/control-surface.md +1 -1
  375. package/skills/stageflow-author/references/catalog-write-conventions.md +2 -2
  376. package/skills/stageflow-run/SKILL.md +1 -1
  377. package/skills/stageflow-run/references/mcp-call.md +1 -1
  378. package/skills/stageflow-setup/SKILL.md +1 -1
  379. package/dist/ui/assets/index-59cjF0OA.js +0 -133
@@ -1,10 +1,6 @@
1
- import path from "node:path";
2
1
  import { ImapFlow } from "imapflow";
3
- import { getCatalogScanPaths } from "../config/browseCatalog.js";
4
- import { loadTriggerOutcome } from "../config/loadTrigger.js";
5
- import { catalogContextFromStageflow } from "../config/resolveCatalogContext.js";
2
+ import { listCatalogTriggerMatches, triggerStoreId, } from "../config/triggerCatalog.js";
6
3
  import { readSecretFromEnvOrFile } from "../config/secretFromEnvOrFile.js";
7
- import { resolveStageflowContext } from "../project/resolveStageflowContext.js";
8
4
  import { matchesEventFilter } from "./triggerEventMatch.js";
9
5
  export const DEFAULT_EMAIL_RECONNECT_BASE_DELAY_MS = 1_000;
10
6
  export const DEFAULT_EMAIL_RECONNECT_MAX_DELAY_MS = 30_000;
@@ -122,20 +118,17 @@ export class EmailSource {
122
118
  }
123
119
  async start(onFire) {
124
120
  this.stopped = false;
125
- const ctx = catalogContextFromStageflow(await resolveStageflowContext(this.cwd));
126
- const scanPaths = await getCatalogScanPaths(ctx);
127
- if (!scanPaths)
128
- return;
129
- const projectRoot = ctx.projectRoot ?? undefined;
130
- const groups = await this.discover(scanPaths.triggerPaths);
121
+ const catalogTriggers = await listCatalogTriggerMatches({
122
+ store: this.store,
123
+ bootCwd: this.cwd,
124
+ sourceRootsOnly: true,
125
+ });
126
+ const groups = this.discover(catalogTriggers);
131
127
  for (const [mailboxKey, group] of groups) {
132
128
  for (const match of group.matches) {
133
- const definitionRef = projectRoot !== undefined
134
- ? path.relative(projectRoot, match.path).replace(/\\/g, "/")
135
- : match.path;
136
129
  await this.store.upsertTrigger({
137
- id: match.definition.id,
138
- definitionRef,
130
+ id: triggerStoreId(match.project_root, match.definition.id),
131
+ definitionRef: match.definition_ref,
139
132
  enabled: true,
140
133
  });
141
134
  }
@@ -161,13 +154,10 @@ export class EmailSource {
161
154
  }
162
155
  this.connections.clear();
163
156
  }
164
- async discover(triggerPaths) {
157
+ discover(catalogTriggers) {
165
158
  const groups = new Map();
166
- for (const triggerPath of triggerPaths) {
167
- const outcome = await loadTriggerOutcome(triggerPath);
168
- if (!outcome.ok)
169
- continue;
170
- const definition = outcome.value;
159
+ for (const match of catalogTriggers) {
160
+ const definition = match.definition;
171
161
  if (definition.kind !== "event" || !definition.enabled)
172
162
  continue;
173
163
  const source = definition.event?.source;
@@ -181,7 +171,7 @@ export class EmailSource {
181
171
  }
182
172
  const mailboxKey = mailboxKeyFor(config);
183
173
  const group = groups.get(mailboxKey) ?? { config, matches: [] };
184
- group.matches.push({ path: triggerPath, definition });
174
+ group.matches.push(match);
185
175
  groups.set(mailboxKey, group);
186
176
  }
187
177
  return groups;
@@ -274,20 +264,22 @@ export class EmailSource {
274
264
  date: message.date,
275
265
  text: message.text,
276
266
  };
277
- for (const { definition } of conn.group.matches) {
267
+ for (const match of conn.group.matches) {
268
+ const { definition } = match;
278
269
  if (!matchesEventFilter(definition.event?.match, summary))
279
270
  continue;
280
- await this.fireSafely(conn.onFire, definition, message, summary);
271
+ await this.fireSafely(conn.onFire, match, message, summary);
281
272
  }
282
273
  }
283
274
  if (maxUid > sinceUid) {
284
275
  await this.store.setTriggerAdapterState(mailboxKey, "uid", String(maxUid));
285
276
  }
286
277
  }
287
- async fireSafely(onFire, definition, message, summary) {
278
+ async fireSafely(onFire, match, message, summary) {
279
+ const definition = match.definition;
288
280
  try {
289
281
  if (definition.task !== undefined) {
290
- await onFire({ triggerId: definition.id });
282
+ await onFire({ triggerId: definition.id, project_root: match.project_root });
291
283
  return;
292
284
  }
293
285
  const task = {
@@ -295,7 +287,7 @@ export class EmailSource {
295
287
  goal: `Handle email: ${message.subject}`,
296
288
  input: summary,
297
289
  };
298
- await onFire({ triggerId: definition.id, task });
290
+ await onFire({ triggerId: definition.id, project_root: match.project_root, task });
299
291
  }
300
292
  catch (err) {
301
293
  this.logError(`email: firing trigger "${definition.id}" failed: ${errMsg(err)}`);
@@ -1,10 +1,6 @@
1
- import path from "node:path";
2
1
  import { Octokit } from "octokit";
3
- import { getCatalogScanPaths } from "../config/browseCatalog.js";
4
- import { loadTriggerOutcome } from "../config/loadTrigger.js";
5
- import { catalogContextFromStageflow } from "../config/resolveCatalogContext.js";
2
+ import { listCatalogTriggerMatches, triggerStoreId, } from "../config/triggerCatalog.js";
6
3
  import { readSecretFromEnvOrFile } from "../config/secretFromEnvOrFile.js";
7
- import { resolveStageflowContext } from "../project/resolveStageflowContext.js";
8
4
  import { matchesEventFilter } from "./triggerEventMatch.js";
9
5
  export const DEFAULT_GITHUB_POLL_INTERVAL_MS = 60_000;
10
6
  export const DEFAULT_GITHUB_TOKEN_SECRET = "GITHUB_TOKEN";
@@ -166,33 +162,27 @@ export class GithubPollSource {
166
162
  * instead of waiting on real interval timers.
167
163
  */
168
164
  async tick(onFire) {
169
- const ctx = catalogContextFromStageflow(await resolveStageflowContext(this.cwd));
170
- const scanPaths = await getCatalogScanPaths(ctx);
171
- if (!scanPaths)
172
- return;
173
- const projectRoot = ctx.projectRoot ?? undefined;
174
- const groups = await this.discover(scanPaths.triggerPaths);
165
+ const catalogTriggers = await listCatalogTriggerMatches({
166
+ store: this.store,
167
+ bootCwd: this.cwd,
168
+ sourceRootsOnly: true,
169
+ });
170
+ const groups = this.discover(catalogTriggers);
175
171
  for (const [repo, matches] of groups) {
176
172
  for (const match of matches) {
177
- const definitionRef = projectRoot !== undefined
178
- ? path.relative(projectRoot, match.path).replace(/\\/g, "/")
179
- : match.path;
180
173
  await this.store.upsertTrigger({
181
- id: match.definition.id,
182
- definitionRef,
174
+ id: triggerStoreId(match.project_root, match.definition.id),
175
+ definitionRef: match.definition_ref,
183
176
  enabled: true,
184
177
  });
185
178
  }
186
179
  await this.pollRepo(repo, matches, onFire);
187
180
  }
188
181
  }
189
- async discover(triggerPaths) {
182
+ discover(catalogTriggers) {
190
183
  const groups = new Map();
191
- for (const triggerPath of triggerPaths) {
192
- const outcome = await loadTriggerOutcome(triggerPath);
193
- if (!outcome.ok)
194
- continue;
195
- const definition = outcome.value;
184
+ for (const match of catalogTriggers) {
185
+ const definition = match.definition;
196
186
  if (definition.kind !== "event" || !definition.enabled)
197
187
  continue;
198
188
  const source = definition.event?.source;
@@ -205,7 +195,7 @@ export class GithubPollSource {
205
195
  continue;
206
196
  }
207
197
  const list = groups.get(repo) ?? [];
208
- list.push({ path: triggerPath, definition });
198
+ list.push(match);
209
199
  groups.set(repo, list);
210
200
  }
211
201
  return groups;
@@ -256,18 +246,20 @@ export class GithubPollSource {
256
246
  const newItems = response.items.filter((item) => isNewerThanCursor(item, cursor)).reverse();
257
247
  for (const item of newItems) {
258
248
  const summary = normalizeGithubItem(item, repo);
259
- for (const { definition } of matches) {
249
+ for (const match of matches) {
250
+ const { definition } = match;
260
251
  if (!matchesEventFilter(definition.event?.match, summary))
261
252
  continue;
262
- await this.fireSafely(onFire, definition, summary);
253
+ await this.fireSafely(onFire, match, summary);
263
254
  }
264
255
  }
265
256
  await this.store.setTriggerAdapterState(adapterId, "cursor", JSON.stringify({ updatedAt: newest.updated_at, number: newest.number }));
266
257
  }
267
- async fireSafely(onFire, definition, summary) {
258
+ async fireSafely(onFire, match, summary) {
259
+ const definition = match.definition;
268
260
  try {
269
261
  if (definition.task !== undefined) {
270
- await onFire({ triggerId: definition.id });
262
+ await onFire({ triggerId: definition.id, project_root: match.project_root });
271
263
  return;
272
264
  }
273
265
  const task = {
@@ -275,7 +267,7 @@ export class GithubPollSource {
275
267
  goal: `Handle PR #${summary.number}: ${summary.title}`,
276
268
  input: summary,
277
269
  };
278
- await onFire({ triggerId: definition.id, task });
270
+ await onFire({ triggerId: definition.id, project_root: match.project_root, task });
279
271
  }
280
272
  catch (err) {
281
273
  this.logError(`github poll: firing trigger "${definition.id}" failed: ${err instanceof Error ? err.message : String(err)}`);
@@ -1,5 +1,5 @@
1
1
  import type { RunSubmission } from "../runstore/submission.js";
2
- import type { AgentPort } from "../agent/port.js";
2
+ import type { StagePort } from "../agent/port.js";
3
3
  import { type ValidationFinding } from "../config/validateCatalog.js";
4
4
  import type { RunStore } from "../runstore/port.js";
5
5
  import type { StageEnvelope } from "../types/envelope.js";
@@ -54,7 +54,7 @@ export type PreparedPipeline = {
54
54
  workspaceDir: string;
55
55
  created?: boolean;
56
56
  };
57
- agent: AgentPort;
57
+ agent: StagePort;
58
58
  store: RunStore;
59
59
  cwd: string;
60
60
  projectRoot: string;
@@ -81,7 +81,7 @@ export type ExecuteStagesOptions = {
81
81
  };
82
82
  export declare function executeStages(prepared: PreparedPipeline, options?: ExecuteStagesOptions): Promise<PipelineRunResult>;
83
83
  export declare function runPipeline(options: {
84
- agent: AgentPort;
84
+ agent: StagePort;
85
85
  store: RunStore;
86
86
  taskPath?: string;
87
87
  taskYaml?: string;
@@ -101,7 +101,7 @@ export declare function runPipeline(options: {
101
101
  export declare function startPipeline(options: {
102
102
  dispatchKey?: string;
103
103
  submission?: RunSubmission;
104
- agent: AgentPort;
104
+ agent: StagePort;
105
105
  store: RunStore;
106
106
  taskPath?: string;
107
107
  taskYaml?: string;
@@ -13,6 +13,7 @@ import { checkTaskEntryInput } from "./taskInput.js";
13
13
  import { pipelinePersistenceForStart } from "./startPayload.js";
14
14
  import { materializeRunSkills, } from "./runSkills.js";
15
15
  import { preflightFailureCode, runPipelinePreflight, } from "../preflight/pipelinePreflight.js";
16
+ import { channelFailureSummary } from "../preflight/channelChecks.js";
16
17
  import { networkError } from "../errors/codes.js";
17
18
  import { newRunId } from "../runstore/paths.js";
18
19
  import { bindingFromFields, buildInitialRunManifest, collectDeclaredSecretValues, finaliseStoredRunManifest, } from "../runstore/runManifest.js";
@@ -24,7 +25,8 @@ export class PipelinePreflightError extends Error {
24
25
  code;
25
26
  preflight;
26
27
  constructor(code, preflight) {
27
- super(`Pipeline preflight failed: ${code}`);
28
+ const detail = code === "channel_check_failed" ? channelFailureSummary(preflight.checks) : undefined;
29
+ super(`Pipeline preflight failed: ${code}${detail ? `: ${detail}` : ""}`);
28
30
  this.name = "PipelinePreflightError";
29
31
  this.code = code;
30
32
  this.preflight = preflight;
@@ -1,4 +1,4 @@
1
- import type { AgentPort } from "../agent/port.js";
1
+ import type { StagePort } from "../agent/port.js";
2
2
  import type { RunPipelineDagSnapshot, RunStore, StageSnapshot } from "../runstore/port.js";
3
3
  import type { StageBrowserSupport } from "../browser/browserHost.js";
4
4
  import type { StageEnvelope } from "../types/envelope.js";
@@ -17,7 +17,7 @@ type SchedulerPreparedPipeline = {
17
17
  runId: string;
18
18
  workspaceDir: string;
19
19
  };
20
- agent: AgentPort;
20
+ agent: StagePort;
21
21
  store: RunStore;
22
22
  cwd: string;
23
23
  projectRoot?: string;
@@ -2,6 +2,7 @@ import { normalizeForkChoice } from "../envelope/forkChoice.js";
2
2
  import { refreshRunDiskUsage } from "../runstore/diskUsage.js";
3
3
  import { buildPipelineDagSnapshotFromLoaded } from "../runstore/pipelineDagSnapshot.js";
4
4
  import { defaultStageBrowserSupport, resolveStageBrowserEnv, } from "../browser/stageBrowserEnv.js";
5
+ import { runOwnerScope } from "../browser/ownerScope.js";
5
6
  import { teardownRunBrowsers, teardownStageBrowser, } from "../browser/browserTeardown.js";
6
7
  import { isHumanLoginStage } from "../browser/humanLogin.js";
7
8
  import { createRunLiveness } from "../browser/runLiveness.js";
@@ -856,6 +857,7 @@ export async function runPipelineDag(options) {
856
857
  let acquired;
857
858
  try {
858
859
  acquired = await acquireStageProfile(prepared.browser ?? defaultStageBrowserSupport(), {
860
+ scope: runOwnerScope(prepared.browser ?? defaultStageBrowserSupport(), { runId: run.runId }),
859
861
  profile,
860
862
  owner: { runId: run.runId, stageId },
861
863
  isRunLive: createRunLiveness(store),
@@ -944,6 +946,7 @@ export async function runPipelineDag(options) {
944
946
  browserEnv = await resolveStageBrowserEnv(prepared.browser ?? defaultStageBrowserSupport(), {
945
947
  runId: run.runId,
946
948
  stageId,
949
+ scope: runOwnerScope(prepared.browser ?? defaultStageBrowserSupport(), { runId: run.runId }),
947
950
  runDir: run.workspaceDir,
948
951
  browser: stage.browser,
949
952
  attempt,
@@ -1,7 +1,7 @@
1
1
  import type { RunMeta, RunStore } from "../runstore/port.js";
2
2
  import type { TaskFile } from "../types/task.js";
3
3
  import type { WorkspaceBinding } from "./workspaceBinding.js";
4
- export type StartFailureCode = "busy_capacity" | "busy_checkout" | "busy_caller_quota" | "repository_auth_failed" | "repository_not_found" | "ref_not_found" | "repository_fetch_failed" | "worktree_create_failed" | "git_missing" | "insufficient_disk" | "disk_check_failed" | "pinned_sha_unavailable" | "invalid_run_branch" | "task.binding_conflict" | "task.repository_ref_required" | "task.ref_without_repository" | "task.repository_invalid" | "task.invalid_shape" | "task.load_error" | "trigger.task_override_not_allowed" | "trigger.task_required" | "start.token_rejected" | "inline_pipeline_too_large" | "skills_invalid_name" | "skills_invalid_path" | "skills_missing_skill_md" | "skills_payload_too_large" | "missing_tool" | "tool_version_mismatch" | "unknown_version" | "secret_unavailable" | "unresolved_var" | "shutting_down" | "autostart_disabled" | "ensure_project_not_allowed" | "claude_as_root";
4
+ export type StartFailureCode = "busy_capacity" | "busy_checkout" | "busy_caller_quota" | "repository_auth_failed" | "repository_not_found" | "ref_not_found" | "repository_fetch_failed" | "worktree_create_failed" | "git_missing" | "insufficient_disk" | "disk_check_failed" | "pinned_sha_unavailable" | "invalid_run_branch" | "task.binding_conflict" | "task.repository_ref_required" | "task.ref_without_repository" | "task.repository_invalid" | "task.invalid_shape" | "task.load_error" | "trigger.task_override_not_allowed" | "trigger.task_required" | "start.token_rejected" | "inline_pipeline_too_large" | "skills_invalid_name" | "skills_invalid_path" | "skills_missing_skill_md" | "skills_payload_too_large" | "missing_tool" | "tool_version_mismatch" | "unknown_version" | "secret_unavailable" | "channel_check_failed" | "unresolved_var" | "shutting_down" | "autostart_disabled" | "ensure_project_not_allowed" | "claude_as_root";
5
5
  export type MaterializedBinding = {
6
6
  runId: string;
7
7
  checkoutRoot?: string;
@@ -1,4 +1,4 @@
1
- import type { AgentPort, OpaqueAnswer } from "../agent/port.js";
1
+ import type { StagePort, OpaqueAnswer } from "../agent/port.js";
2
2
  import type { RunStore, RunMeta } from "../runstore/port.js";
3
3
  import type { LoadedPipeline } from "../types/pipeline.js";
4
4
  import type { TaskFile } from "../types/task.js";
@@ -10,7 +10,7 @@ export type PreparedResumeContext = {
10
10
  runId: string;
11
11
  stageId: string;
12
12
  opaqueAnswer: OpaqueAnswer;
13
- agent: AgentPort;
13
+ agent: StagePort;
14
14
  store: RunStore;
15
15
  hitl: StageHitlController;
16
16
  executionMode: StageExecutionMode;
@@ -1,4 +1,4 @@
1
- import type { AgentPort } from "../agent/port.js";
1
+ import type { StagePort } from "../agent/port.js";
2
2
  import type { RunStore } from "../runstore/port.js";
3
3
  import type { StageExecutionMode } from "./stageConcurrency.js";
4
4
  import type { StageProcessLauncher } from "./stageProcessLauncher.js";
@@ -7,7 +7,7 @@ import { type OperatorCatalog } from "./stageAttemptBootstrap.js";
7
7
  export type ResumeTimedOutContext = {
8
8
  runId: string;
9
9
  stageId: string;
10
- agent: AgentPort;
10
+ agent: StagePort;
11
11
  store: RunStore;
12
12
  hitl: StageHitlController;
13
13
  executionMode: StageExecutionMode;
@@ -1,5 +1,5 @@
1
1
  import { type RunSubmission } from "../runstore/submission.js";
2
- import type { AgentPort, OpaqueAnswer } from "../agent/port.js";
2
+ import type { StagePort, OpaqueAnswer } from "../agent/port.js";
3
3
  import type { InlinePipelineDefinition } from "../types/pipeline.js";
4
4
  import { type DiskBreakdown, type FreeSpaceReader } from "../runstore/diskUsage.js";
5
5
  import { type RunStore } from "../runstore/port.js";
@@ -155,6 +155,9 @@ export declare class RunManager {
155
155
  private readonly queuedDone;
156
156
  private admissionDrainInFlight;
157
157
  private readonly resumeInFlight;
158
+ private readonly gateClosedListeners;
159
+ private readonly beforeBrowserTeardownListeners;
160
+ private readonly shutdownListeners;
158
161
  private readonly retryInFlight;
159
162
  private readonly retryStartOwner;
160
163
  private readonly retryStartWaiters;
@@ -176,7 +179,7 @@ export declare class RunManager {
176
179
  private readonly isGitProject;
177
180
  private acceptingWork;
178
181
  constructor(options: {
179
- agent: AgentPort;
182
+ agent: StagePort;
180
183
  store: RunStore;
181
184
  cwd?: string;
182
185
  projectRoot?: string;
@@ -239,6 +242,7 @@ export declare class RunManager {
239
242
  hasActiveWorker(runId: string, stageId: string): boolean;
240
243
  sweepBrowserSessions(): Promise<{
241
244
  closed: string[];
245
+ released: string[];
242
246
  }>;
243
247
  reconcileOrphanedStages(): Promise<{
244
248
  reconciled: Array<{
@@ -267,6 +271,18 @@ export declare class RunManager {
267
271
  }>>;
268
272
  /** Rebuild in-memory admission queue from persisted `queued` rows (R27). */
269
273
  reenqueuePersistedQueuedRuns(): Promise<void>;
274
+ /** Called when a stage's gate stops accepting operator input (answered, abandoned) or a run is cancelled (no stage id). */
275
+ onGateClosed(listener: (runId: string, stageId?: string) => void): () => void;
276
+ /** Awaited (bounded by the browser support) before a stage's or run's browser is torn down; stageId absent means the whole run. */
277
+ beforeBrowserTeardown(listener: (input: {
278
+ runId: string;
279
+ stageId?: string;
280
+ }) => Promise<void> | void): () => void;
281
+ /** Called once the Host stops accepting work (drain start). */
282
+ onShutdown(listener: () => void): () => void;
283
+ private browserSupport;
284
+ private browserOption;
285
+ private notifyGateClosed;
270
286
  abandonStage(runId: string, stageId: string): Promise<AbandonStageResult>;
271
287
  cancelRun(runId: string, reason: string): Promise<CancelRunResult>;
272
288
  setA2aStore(store: A2aStore): void;