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,3 +1,5 @@
1
+ import { mkdtemp, rm, writeFile } from "node:fs/promises";
2
+ import { tmpdir } from "node:os";
1
3
  import path from "node:path";
2
4
  import { globalStageflowHome } from "../project/globalHome.js";
3
5
  import { INLINE_PIPELINE_PATH, loadPipelineFromObjectOutcome, loadPipelineOutcome, resolvePipelinePath, } from "./loadPipeline.js";
@@ -12,6 +14,9 @@ import { MCP_CATALOG_FILENAME, StageMcpError, assertMcpAllowlistKnown, loadMcpCa
12
14
  import { loadSecretRegistry } from "../runtime/stageSecrets.js";
13
15
  import { isForeverDeniedSecret } from "../runtime/stageEnvironment.js";
14
16
  import { findMissingMcpCommands } from "../preflight/mcpCommands.js";
17
+ import { ChannelError } from "../channels/errors.js";
18
+ import { ChannelRegistry } from "../channels/registry.js";
19
+ import { validateStageChannels } from "../channels/stageChannels.js";
15
20
  export function relPath(cwd, absPath) {
16
21
  return path.relative(cwd, absPath).replace(/\\/g, "/");
17
22
  }
@@ -122,12 +127,21 @@ function findingCatalog(cwd, absPath, message, code, severity) {
122
127
  category: "catalog",
123
128
  }, severity);
124
129
  }
130
+ function withIssueLocation(finding, issue) {
131
+ if (issue.line === undefined && issue.column === undefined)
132
+ return finding;
133
+ return {
134
+ ...finding,
135
+ ...(issue.line !== undefined ? { line: issue.line } : {}),
136
+ ...(issue.column !== undefined ? { column: issue.column } : {}),
137
+ };
138
+ }
125
139
  export function findingsFromLoadIssues(cwd, absPath, issues) {
126
140
  return issues.flatMap((issue) => {
127
141
  if (issue.category === "pipeline") {
128
142
  if (issue.code === "pipeline.model_applies" || issue.code === "pipeline.route_all_gated") {
129
143
  return [
130
- baseFinding({
144
+ withIssueLocation(baseFinding({
131
145
  cwd,
132
146
  absPath,
133
147
  message: issue.message,
@@ -135,26 +149,26 @@ export function findingsFromLoadIssues(cwd, absPath, issues) {
135
149
  category: "pipeline",
136
150
  pipelineId: issue.pipelineId,
137
151
  stageId: issue.stageId,
138
- }, "warning"),
152
+ }, "warning"), issue),
139
153
  ];
140
154
  }
141
155
  return [
142
- findingPipelineError(cwd, absPath, issue.message, issue.code, issue.pipelineId, issue.stageId),
156
+ withIssueLocation(findingPipelineError(cwd, absPath, issue.message, issue.code, issue.pipelineId, issue.stageId), issue),
143
157
  ];
144
158
  }
145
159
  if (issue.category === "stage") {
146
160
  return [
147
- findingStageError(cwd, absPath, issue.message, issue.code, issue.stageId),
161
+ withIssueLocation(findingStageError(cwd, absPath, issue.message, issue.code, issue.stageId), issue),
148
162
  ];
149
163
  }
150
164
  if (issue.category === "task") {
151
165
  return [
152
- findingTaskError(cwd, absPath, issue.message, issue.code),
166
+ withIssueLocation(findingTaskError(cwd, absPath, issue.message, issue.code), issue),
153
167
  ];
154
168
  }
155
169
  if (issue.category === "trigger") {
156
170
  return [
157
- findingTriggerError(cwd, absPath, issue.message, issue.code),
171
+ withIssueLocation(findingTriggerError(cwd, absPath, issue.message, issue.code), issue),
158
172
  ];
159
173
  }
160
174
  if (issue.category === "catalog") {
@@ -164,7 +178,7 @@ export function findingsFromLoadIssues(cwd, absPath, issues) {
164
178
  code === "catalog.legacy_yaml"
165
179
  ? "warning"
166
180
  : "error";
167
- return [findingCatalog(cwd, absPath, issue.message, code, severity)];
181
+ return [withIssueLocation(findingCatalog(cwd, absPath, issue.message, code, severity), issue)];
168
182
  }
169
183
  return [];
170
184
  });
@@ -245,6 +259,23 @@ function collectMcpAllowlistNames(loaded) {
245
259
  }
246
260
  return [...names];
247
261
  }
262
+ function findingsForStageChannels(cwd, pipelinePath, loaded, projectRoot, providers) {
263
+ const users = loaded.stages.filter((stage) => (stage.channels?.length ?? 0) > 0);
264
+ if (users.length === 0)
265
+ return [];
266
+ let registry;
267
+ try {
268
+ registry = new ChannelRegistry({ cwd: projectRoot, providers });
269
+ }
270
+ catch (error) {
271
+ const code = error instanceof ChannelError ? error.code : "CHANNEL_INVALID_INPUT";
272
+ const field = error instanceof ChannelError && error.detail?.connectionId
273
+ ? ` (connection "${error.detail.connectionId}"${error.detail.field ? `, field "${error.detail.field}"` : ""})`
274
+ : "";
275
+ return users.map((stage) => findingStageError(cwd, pipelinePath, `connections.yaml could not be loaded: ${code}${field}`, "stage.channel_unavailable", stage.id));
276
+ }
277
+ return users.flatMap((stage) => validateStageChannels(registry, stage).map((issue) => findingStageError(cwd, pipelinePath, issue.message, "stage.channel_unavailable", issue.stageId)));
278
+ }
248
279
  function findingsForStageSecrets(cwd, pipelinePath, loaded) {
249
280
  const registry = loadSecretRegistry(process.env);
250
281
  const findings = [];
@@ -427,6 +458,7 @@ async function runPipelineValidation(nameOrPath, options) {
427
458
  }
428
459
  findings.push(...(await findingsForStageMcpCatalog(cwd, outcome.value)));
429
460
  findings.push(...findingsForStageSecrets(cwd, pipelinePath, outcome.value));
461
+ findings.push(...findingsForStageChannels(cwd, pipelinePath, outcome.value, projectRoot, options.channelProviders));
430
462
  findings.push(...findingsForStageflowHomeAbsolutePaths(cwd, outcome.value));
431
463
  if (validateStages && outcome.value.stageSources) {
432
464
  for (const source of Object.values(outcome.value.stageSources)) {
@@ -450,6 +482,7 @@ export async function validatePipeline(nameOrPath, options = {}) {
450
482
  cwd,
451
483
  projectRoot,
452
484
  validateStages,
485
+ channelProviders: options.channelProviders,
453
486
  });
454
487
  return buildValidationResult("pipeline", core.findings, strict);
455
488
  }
@@ -461,6 +494,7 @@ export async function loadPipelineValidated(nameOrPath, options = {}) {
461
494
  cwd,
462
495
  projectRoot,
463
496
  validateStages,
497
+ channelProviders: options.channelProviders,
464
498
  });
465
499
  if (core.ok) {
466
500
  return { ok: true, loaded: core.loaded, findings: core.findings };
@@ -615,6 +649,30 @@ async function validateSingleTask(invocationCwd, taskArg) {
615
649
  }
616
650
  return [];
617
651
  }
652
+ async function validateSingleStage(invocationCwd, stageArg, stageContent) {
653
+ const ctx = await resolveCatalogContext(invocationCwd);
654
+ const relCwd = ctx.projectRoot ?? invocationCwd;
655
+ const stagePath = path.resolve(invocationCwd, stageArg);
656
+ if (stageContent === undefined) {
657
+ return validateStageFile(relCwd, stagePath);
658
+ }
659
+ const tmpDir = await mkdtemp(path.join(tmpdir(), "sf-stage-validate-"));
660
+ const tmpPath = path.join(tmpDir, path.basename(stagePath));
661
+ try {
662
+ await writeFile(tmpPath, stageContent, "utf8");
663
+ const findings = await validateStageFile(relCwd, tmpPath);
664
+ const displayPath = relPath(relCwd, stagePath);
665
+ const tmpRel = relPath(relCwd, tmpPath);
666
+ return findings.map((finding) => finding.path === tmpRel ||
667
+ finding.path === tmpPath ||
668
+ finding.path.includes(tmpDir)
669
+ ? { ...finding, path: displayPath }
670
+ : finding);
671
+ }
672
+ finally {
673
+ await rm(tmpDir, { recursive: true, force: true });
674
+ }
675
+ }
618
676
  async function validateSingleTrigger(invocationCwd, triggerArg) {
619
677
  const ctx = await resolveCatalogContext(invocationCwd);
620
678
  const relCwd = ctx.projectRoot ?? invocationCwd;
@@ -647,6 +705,9 @@ export async function validateCatalog(options) {
647
705
  if (options.scope === "trigger" && !options.trigger) {
648
706
  throw new Error("validateCatalog: trigger is required when scope is \"trigger\"");
649
707
  }
708
+ if (options.scope === "stage" && !options.stage) {
709
+ throw new Error("validateCatalog: stage is required when scope is \"stage\"");
710
+ }
650
711
  const allFindings = [];
651
712
  if (options.scope === "pipeline") {
652
713
  return validatePipeline(options.pipeline, {
@@ -662,6 +723,9 @@ export async function validateCatalog(options) {
662
723
  else if (options.scope === "trigger") {
663
724
  allFindings.push(...(await validateSingleTrigger(cwd, options.trigger)));
664
725
  }
726
+ else if (options.scope === "stage") {
727
+ allFindings.push(...(await validateSingleStage(cwd, options.stage, options.stageContent)));
728
+ }
665
729
  else {
666
730
  allFindings.push(...(await validateManifestAll(cwd)));
667
731
  }
@@ -0,0 +1,37 @@
1
+ export declare function normalizePipelineCatalogFilename(pipelineId: string, filename?: string | null): string;
2
+ export declare function taskIdFromDraftTask(task: {
3
+ filename?: string;
4
+ body?: Record<string, unknown>;
5
+ }): string;
6
+ export declare function normalizeTaskCatalogFilename(taskId: string, filename?: string | null): string;
7
+ export type DraftTaskArtifact = {
8
+ filename: string;
9
+ body: Record<string, unknown>;
10
+ };
11
+ export type DraftPackageFilenames = {
12
+ pipeline: {
13
+ id: string;
14
+ };
15
+ task?: DraftTaskArtifact;
16
+ };
17
+ export type CatalogYamlKind = "pipeline" | "task" | "other";
18
+ export declare function classifyCatalogYamlDocument(raw: Record<string, unknown>): CatalogYamlKind;
19
+ export declare function legacyBareCatalogFilenames(entityId: string): string[];
20
+ export declare function isMisnamedCatalogBasename(basename: string): boolean;
21
+ export declare function canonicalCatalogBasenameForDocument(raw: Record<string, unknown>, sourceBasename?: string): string | null;
22
+ export type WorkshopCatalogRepairMove = {
23
+ from: string;
24
+ to: string;
25
+ };
26
+ export type WorkshopCatalogRepairResult = {
27
+ renamed: WorkshopCatalogRepairMove[];
28
+ removed: string[];
29
+ };
30
+ export declare function reconcileWorkshopCatalogFilenames(pipelineId: string, taskId?: string | null, canonicalPipelineBasename?: string, canonicalTaskBasename?: string | null): {
31
+ renameCandidates: WorkshopCatalogRepairMove[];
32
+ removeCandidates: string[];
33
+ };
34
+ export declare function normalizeDraftCatalogFilenames<T extends DraftPackageFilenames>(draft: T, pipelineFilename?: string | null): {
35
+ draft: T;
36
+ pipelineFilename: string;
37
+ };
@@ -0,0 +1,125 @@
1
+ const PIPELINE_SUFFIX = ".pipeline.yaml";
2
+ const TASK_SUFFIX = ".task.yaml";
3
+ function basenameOnly(name) {
4
+ const trimmed = name.trim();
5
+ const parts = trimmed.split(/[\\/]/);
6
+ return parts[parts.length - 1]?.trim() || trimmed;
7
+ }
8
+ export function normalizePipelineCatalogFilename(pipelineId, filename) {
9
+ const id = pipelineId.trim() || "untitled";
10
+ const base = filename?.trim() ? basenameOnly(filename) : "";
11
+ if (base.endsWith(PIPELINE_SUFFIX)) {
12
+ const stem = base.slice(0, -PIPELINE_SUFFIX.length);
13
+ if (stem === id)
14
+ return base;
15
+ }
16
+ return `${id}${PIPELINE_SUFFIX}`;
17
+ }
18
+ export function taskIdFromDraftTask(task) {
19
+ const bodyId = task.body?.id;
20
+ if (typeof bodyId === "string" && bodyId.trim())
21
+ return bodyId.trim();
22
+ const base = task.filename?.trim() ? basenameOnly(task.filename) : "";
23
+ if (!base)
24
+ return "task";
25
+ return (base
26
+ .replace(/\.task\.ya?ml$/i, "")
27
+ .replace(/\.ya?ml$/i, "")
28
+ .trim() || "task");
29
+ }
30
+ export function normalizeTaskCatalogFilename(taskId, filename) {
31
+ const id = taskId.trim() || "task";
32
+ const base = filename?.trim() ? basenameOnly(filename) : "";
33
+ if (base.endsWith(TASK_SUFFIX)) {
34
+ const stem = base.slice(0, -TASK_SUFFIX.length);
35
+ if (stem === id)
36
+ return base;
37
+ }
38
+ return `${id}${TASK_SUFFIX}`;
39
+ }
40
+ const CATALOG_KIND_SUFFIX_PATTERN = /\.(pipeline|task|trigger)\.ya?ml$/i;
41
+ const BARE_YAML_PATTERN = /\.ya?ml$/i;
42
+ export function classifyCatalogYamlDocument(raw) {
43
+ if (Array.isArray(raw.stages))
44
+ return "pipeline";
45
+ if (typeof raw.goal === "string" || typeof raw.pipeline === "string") {
46
+ return "task";
47
+ }
48
+ return "other";
49
+ }
50
+ export function legacyBareCatalogFilenames(entityId) {
51
+ const id = entityId.trim();
52
+ if (!id)
53
+ return [];
54
+ return [`${id}.yaml`, `${id}.yml`];
55
+ }
56
+ export function isMisnamedCatalogBasename(basename) {
57
+ const name = basename.trim();
58
+ if (!BARE_YAML_PATTERN.test(name))
59
+ return false;
60
+ if (!CATALOG_KIND_SUFFIX_PATTERN.test(name))
61
+ return true;
62
+ return /\.(pipeline|task)\.yml$/i.test(name);
63
+ }
64
+ export function canonicalCatalogBasenameForDocument(raw, sourceBasename) {
65
+ const kind = classifyCatalogYamlDocument(raw);
66
+ const id = raw.id;
67
+ if (typeof id !== "string" || !id.trim())
68
+ return null;
69
+ if (kind === "pipeline")
70
+ return normalizePipelineCatalogFilename(id);
71
+ if (kind === "task")
72
+ return normalizeTaskCatalogFilename(id);
73
+ if (sourceBasename && CATALOG_KIND_SUFFIX_PATTERN.test(sourceBasename)) {
74
+ const stem = sourceBasename.replace(/\.ya?ml$/i, "");
75
+ const kindSuffix = stem.match(/\.(pipeline|task|trigger)$/i)?.[1]?.toLowerCase();
76
+ if (kindSuffix === "pipeline") {
77
+ return normalizePipelineCatalogFilename(id);
78
+ }
79
+ if (kindSuffix === "task") {
80
+ return normalizeTaskCatalogFilename(id);
81
+ }
82
+ }
83
+ return null;
84
+ }
85
+ export function reconcileWorkshopCatalogFilenames(pipelineId, taskId, canonicalPipelineBasename, canonicalTaskBasename) {
86
+ const renameCandidates = [];
87
+ const removeCandidates = [];
88
+ const pipelineCanonical = canonicalPipelineBasename?.trim() ||
89
+ normalizePipelineCatalogFilename(pipelineId);
90
+ const taskCanonical = taskId?.trim()
91
+ ? canonicalTaskBasename?.trim() ||
92
+ normalizeTaskCatalogFilename(taskId)
93
+ : null;
94
+ for (const legacy of legacyBareCatalogFilenames(pipelineId)) {
95
+ if (legacy === pipelineCanonical)
96
+ continue;
97
+ removeCandidates.push(legacy);
98
+ }
99
+ if (taskId?.trim()) {
100
+ for (const legacy of legacyBareCatalogFilenames(taskId)) {
101
+ if (legacy === taskCanonical || legacy === pipelineCanonical)
102
+ continue;
103
+ removeCandidates.push(legacy);
104
+ }
105
+ }
106
+ return { renameCandidates, removeCandidates };
107
+ }
108
+ export function normalizeDraftCatalogFilenames(draft, pipelineFilename) {
109
+ const pipelineFilenameOut = normalizePipelineCatalogFilename(draft.pipeline.id, pipelineFilename);
110
+ if (!draft.task) {
111
+ return { draft, pipelineFilename: pipelineFilenameOut };
112
+ }
113
+ const taskId = taskIdFromDraftTask(draft.task);
114
+ const taskFilename = normalizeTaskCatalogFilename(taskId, draft.task.filename);
115
+ if (taskFilename === draft.task.filename) {
116
+ return { draft, pipelineFilename: pipelineFilenameOut };
117
+ }
118
+ return {
119
+ draft: {
120
+ ...draft,
121
+ task: { ...draft.task, filename: taskFilename },
122
+ },
123
+ pipelineFilename: pipelineFilenameOut,
124
+ };
125
+ }
@@ -0,0 +1,7 @@
1
+ import { type WorkshopCatalogRepairResult } from "./workshopCatalogFilenames.js";
2
+ export declare function repairMisnamedWorkshopCatalogFiles(packageDirectory: string): Promise<WorkshopCatalogRepairResult>;
3
+ export declare function reconcileWorkshopCatalogPackageDir(packageDirectory: string, pipelineId: string, taskId?: string | null, options?: {
4
+ pipelineBasename?: string;
5
+ taskBasename?: string | null;
6
+ }): Promise<WorkshopCatalogRepairResult>;
7
+ export declare function repairWorkshopCatalogTree(projectRoot: string, relativeDirectories: string[]): Promise<WorkshopCatalogRepairResult>;
@@ -0,0 +1,144 @@
1
+ import { readdir, rename, rm, stat } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { readYamlObject } from "./readYamlObject.js";
4
+ import { canonicalCatalogBasenameForDocument, isMisnamedCatalogBasename, legacyBareCatalogFilenames, normalizePipelineCatalogFilename, normalizeTaskCatalogFilename, reconcileWorkshopCatalogFilenames, } from "./workshopCatalogFilenames.js";
5
+ async function fileExists(absPath) {
6
+ try {
7
+ await stat(absPath);
8
+ return true;
9
+ }
10
+ catch {
11
+ return false;
12
+ }
13
+ }
14
+ async function renameIfNeeded(fromAbs, toAbs, renamed) {
15
+ if (fromAbs === toAbs)
16
+ return;
17
+ if (!(await fileExists(fromAbs)))
18
+ return;
19
+ if (await fileExists(toAbs)) {
20
+ await rm(fromAbs, { force: true });
21
+ return;
22
+ }
23
+ await rename(fromAbs, toAbs);
24
+ renamed.push({
25
+ from: path.basename(fromAbs),
26
+ to: path.basename(toAbs),
27
+ });
28
+ }
29
+ export async function repairMisnamedWorkshopCatalogFiles(packageDirectory) {
30
+ const renamed = [];
31
+ const removed = [];
32
+ let entries;
33
+ try {
34
+ entries = await readdir(packageDirectory);
35
+ }
36
+ catch {
37
+ return { renamed, removed };
38
+ }
39
+ for (const entry of entries) {
40
+ if (!isMisnamedCatalogBasename(entry))
41
+ continue;
42
+ const absPath = path.join(packageDirectory, entry);
43
+ let raw;
44
+ try {
45
+ raw = await readYamlObject(absPath);
46
+ }
47
+ catch {
48
+ continue;
49
+ }
50
+ const canonical = canonicalCatalogBasenameForDocument(raw, entry);
51
+ if (!canonical || canonical === entry)
52
+ continue;
53
+ const targetAbs = path.join(packageDirectory, canonical);
54
+ await renameIfNeeded(absPath, targetAbs, renamed);
55
+ }
56
+ return { renamed, removed };
57
+ }
58
+ export async function reconcileWorkshopCatalogPackageDir(packageDirectory, pipelineId, taskId, options) {
59
+ const result = await repairMisnamedWorkshopCatalogFiles(packageDirectory);
60
+ const pipelineBasename = options?.pipelineBasename?.trim() ||
61
+ normalizePipelineCatalogFilename(pipelineId);
62
+ const taskBasename = taskId?.trim()
63
+ ? options?.taskBasename?.trim() ||
64
+ normalizeTaskCatalogFilename(taskId)
65
+ : null;
66
+ for (const legacy of legacyBareCatalogFilenames(pipelineId)) {
67
+ if (legacy === pipelineBasename)
68
+ continue;
69
+ const legacyAbs = path.join(packageDirectory, legacy);
70
+ const canonicalAbs = path.join(packageDirectory, pipelineBasename);
71
+ if (!(await fileExists(legacyAbs)))
72
+ continue;
73
+ if (!(await fileExists(canonicalAbs))) {
74
+ let raw;
75
+ try {
76
+ raw = await readYamlObject(legacyAbs);
77
+ }
78
+ catch {
79
+ continue;
80
+ }
81
+ if (canonicalCatalogBasenameForDocument(raw) === pipelineBasename) {
82
+ await renameIfNeeded(legacyAbs, canonicalAbs, result.renamed);
83
+ continue;
84
+ }
85
+ }
86
+ if (await fileExists(canonicalAbs)) {
87
+ await rm(legacyAbs, { force: true });
88
+ result.removed.push(legacy);
89
+ }
90
+ }
91
+ if (taskId?.trim() && taskBasename) {
92
+ for (const legacy of legacyBareCatalogFilenames(taskId)) {
93
+ if (legacy === taskBasename || legacy === pipelineBasename)
94
+ continue;
95
+ const legacyAbs = path.join(packageDirectory, legacy);
96
+ const canonicalAbs = path.join(packageDirectory, taskBasename);
97
+ if (!(await fileExists(legacyAbs)))
98
+ continue;
99
+ if (!(await fileExists(canonicalAbs))) {
100
+ let raw;
101
+ try {
102
+ raw = await readYamlObject(legacyAbs);
103
+ }
104
+ catch {
105
+ continue;
106
+ }
107
+ if (canonicalCatalogBasenameForDocument(raw) === taskBasename) {
108
+ await renameIfNeeded(legacyAbs, canonicalAbs, result.renamed);
109
+ continue;
110
+ }
111
+ }
112
+ if (await fileExists(canonicalAbs)) {
113
+ await rm(legacyAbs, { force: true });
114
+ result.removed.push(legacy);
115
+ }
116
+ }
117
+ }
118
+ const { removeCandidates } = reconcileWorkshopCatalogFilenames(pipelineId, taskId, pipelineBasename, taskBasename);
119
+ for (const legacy of removeCandidates) {
120
+ const legacyAbs = path.join(packageDirectory, legacy);
121
+ const canonicalAbs = path.join(packageDirectory, pipelineBasename);
122
+ if (!(await fileExists(legacyAbs)))
123
+ continue;
124
+ if (legacyAbs === canonicalAbs)
125
+ continue;
126
+ if (taskBasename && legacy === taskBasename)
127
+ continue;
128
+ if (!(await fileExists(canonicalAbs)))
129
+ continue;
130
+ await rm(legacyAbs, { force: true });
131
+ result.removed.push(legacy);
132
+ }
133
+ return result;
134
+ }
135
+ export async function repairWorkshopCatalogTree(projectRoot, relativeDirectories) {
136
+ const merged = { renamed: [], removed: [] };
137
+ for (const rel of relativeDirectories) {
138
+ const dir = path.resolve(projectRoot, rel);
139
+ const part = await repairMisnamedWorkshopCatalogFiles(dir);
140
+ merged.renamed.push(...part.renamed);
141
+ merged.removed.push(...part.removed);
142
+ }
143
+ return merged;
144
+ }
@@ -0,0 +1,4 @@
1
+ export declare function yamlParsePosition(err: unknown): {
2
+ line: number;
3
+ column: number;
4
+ } | undefined;
@@ -0,0 +1,9 @@
1
+ import { YAMLParseError } from "yaml";
2
+ export function yamlParsePosition(err) {
3
+ if (!(err instanceof YAMLParseError))
4
+ return undefined;
5
+ const pos = err.linePos?.[0];
6
+ if (!pos)
7
+ return undefined;
8
+ return { line: pos.line, column: pos.col };
9
+ }
@@ -4,7 +4,7 @@ export declare const BUSY_CHECKOUT: "busy_checkout";
4
4
  /** Per-caller concurrency quota: queued when under global capacity; reject when queue full. */
5
5
  export declare const BUSY_CALLER_QUOTA: "busy_caller_quota";
6
6
  export declare const ABORTED: "aborted";
7
- export declare const NETWORK_ERROR_CODES: readonly ["busy_capacity", "busy_checkout", "busy_caller_quota", "aborted", "unknown_project_root", "absolute_path_not_allowed", "path_outside_project_root", "catalog_root_unreadable", "ensure_project_not_allowed", "config_invalid", "config_unknown_key", "provider_not_configured", "a2a_configuration_error", "untrusted_config_origin", "command_not_on_path", "missing_tool", "tool_version_mismatch", "unknown_version", "secret_unavailable", "not_ready", "internal_error", "retry_in_progress", "hitl_not_retriable", "run_not_retryable", "stage_not_failed", "manual_recovery_required", "run_not_found", "stage_not_found", "artifact_not_found", "artifact_path_denied", "envelope_not_found", "insufficient_disk", "disk_check_failed", "shutting_down", "start.token_rejected", "inline_pipeline_too_large", "skills_invalid_name", "skills_invalid_path", "skills_missing_skill_md", "skills_payload_too_large", "pinned_sha_unavailable", "store_integrity_failed", "store_unsupported_filesystem", "tmpdir_unusable", "backup_insufficient_disk"];
7
+ export declare const NETWORK_ERROR_CODES: readonly ["busy_capacity", "busy_checkout", "busy_caller_quota", "aborted", "unknown_project_root", "absolute_path_not_allowed", "path_outside_project_root", "catalog_root_unreadable", "ensure_project_not_allowed", "config_invalid", "config_unknown_key", "provider_not_configured", "a2a_configuration_error", "untrusted_config_origin", "command_not_on_path", "missing_tool", "tool_version_mismatch", "unknown_version", "secret_unavailable", "channel_check_failed", "not_ready", "internal_error", "retry_in_progress", "hitl_not_retriable", "run_not_retryable", "stage_not_failed", "manual_recovery_required", "run_not_found", "stage_not_found", "artifact_not_found", "artifact_path_denied", "envelope_not_found", "insufficient_disk", "disk_check_failed", "shutting_down", "start.token_rejected", "inline_pipeline_too_large", "skills_invalid_name", "skills_invalid_path", "skills_missing_skill_md", "skills_payload_too_large", "pinned_sha_unavailable", "store_integrity_failed", "store_unsupported_filesystem", "tmpdir_unusable", "backup_insufficient_disk"];
8
8
  export type NetworkErrorCode = (typeof NETWORK_ERROR_CODES)[number] | string;
9
9
  export type NetworkErrorBody = {
10
10
  code: NetworkErrorCode;
@@ -24,6 +24,7 @@ export const NETWORK_ERROR_CODES = [
24
24
  "tool_version_mismatch",
25
25
  "unknown_version",
26
26
  "secret_unavailable",
27
+ "channel_check_failed",
27
28
  "not_ready",
28
29
  "internal_error",
29
30
  "retry_in_progress",
@@ -1,11 +1,11 @@
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 HostedEventSink, type HostedPipelineInput, type HostedPipelineResult } from "./types.js";
4
4
  export type HostedRuntime = {
5
5
  run(input: HostedPipelineInput): Promise<HostedPipelineResult>;
6
6
  };
7
7
  export declare function createHostedRuntime(dependencies: {
8
- agent: AgentPort;
8
+ agent: StagePort;
9
9
  localStore: RunStore;
10
10
  eventSink: HostedEventSink;
11
11
  eventDeliveryTimeoutMs?: number;
@@ -7,7 +7,7 @@ export declare const HOSTED_DELIVERY_ATTEMPTS = 2;
7
7
  export declare const DEFAULT_EVENT_DELIVERY_TIMEOUT_MS = 10000;
8
8
  /**
9
9
  * After cancellation or timeout, Core waits at most this long for in-flight
10
- * stage work to stop. `AgentPort` handles must stop inside `close()`.
10
+ * stage work to stop. `StagePort` handles must stop inside `close()`.
11
11
  */
12
12
  export declare const HOSTED_CANCEL_GRACE_MS = 5000;
13
13
  export type HostedRunContext = {
@@ -5,6 +5,6 @@ export const HOSTED_DELIVERY_ATTEMPTS = 2;
5
5
  export const DEFAULT_EVENT_DELIVERY_TIMEOUT_MS = 10_000;
6
6
  /**
7
7
  * After cancellation or timeout, Core waits at most this long for in-flight
8
- * stage work to stop. `AgentPort` handles must stop inside `close()`.
8
+ * stage work to stop. `StagePort` handles must stop inside `close()`.
9
9
  */
10
10
  export const HOSTED_CANCEL_GRACE_MS = 5_000;
package/dist/index.d.ts CHANGED
@@ -5,8 +5,9 @@ export { resolveStageflowContext, projectContextFromStageflow, type StageflowCon
5
5
  export { PACKAGE_NAME, PACKAGE_VERSION } from "./package-meta.js";
6
6
  export type { StageEnvelope } from "./types/envelope.js";
7
7
  export { assertRequiredEnvelope, isAdvancingEnvelope, } from "./envelope/check.js";
8
- export type { AgentPort, StageHandle, StageHandleEvent, StageRunInput, StageRunResult, } from "./agent/port.js";
9
- export { createPiAgentPort } from "./agent/resolveAgentPort.js";
8
+ export type { StagePort, StageHandle, StageHandleEvent, StageRunInput, StageRunResult, } from "./agent/port.js";
9
+ export { createPiStagePort } from "./agent/resolveStagePort.js";
10
+ export { createPiAgentPort, resolveAgentPort, type AgentPort, } from "./operatorAgent/agentPort.js";
10
11
  export { configurePiProviderApiKey } from "./agent/providerAuth.js";
11
12
  export type { StageActivityEvent, StageLogLine } from "./agent/activity.js";
12
13
  export type { StageRoots } from "./runtime/stageRoots.js";
package/dist/index.js CHANGED
@@ -4,7 +4,8 @@ export { resolveProjectContext, legacyProjectContext, } from "./project/resolveP
4
4
  export { resolveStageflowContext, projectContextFromStageflow, } from "./project/resolveStageflowContext.js";
5
5
  export { PACKAGE_NAME, PACKAGE_VERSION } from "./package-meta.js";
6
6
  export { assertRequiredEnvelope, isAdvancingEnvelope, } from "./envelope/check.js";
7
- export { createPiAgentPort } from "./agent/resolveAgentPort.js";
7
+ export { createPiStagePort } from "./agent/resolveStagePort.js";
8
+ export { createPiAgentPort, resolveAgentPort, } from "./operatorAgent/agentPort.js";
8
9
  export { configurePiProviderApiKey } from "./agent/providerAuth.js";
9
10
  export { runPipeline, startPipeline } from "./runtime/pipelineRunner.js";
10
11
  export { createHostedRuntime, } from "./hosted/runtime.js";
@@ -63,6 +63,7 @@ const inlinePipelineSchema = z
63
63
  model: z.unknown().optional(),
64
64
  schemas: z.unknown().optional(),
65
65
  requires: z.unknown().optional(),
66
+ channels: z.unknown().optional(),
66
67
  })
67
68
  .strict();
68
69
  const startRunSchema = z
@@ -29,9 +29,12 @@ export function registerGetStartedTool(server, deps) {
29
29
  task_count: tasks.items.filter((t) => t.project_root === root.project_root)
30
30
  .length,
31
31
  }));
32
- const firstRoot = catalog_roots.find((r) => r.kind === "seeded") ?? catalog_roots[0];
33
- const samplePipeline = pipelines.items.find((p) => p.project_root === firstRoot?.project_root);
34
- const sampleTask = tasks.items.find((t) => t.project_root === firstRoot?.project_root);
32
+ const authoringRoot = catalog_roots.find((r) => r.kind === "workspace" && r.read_only !== true) ??
33
+ catalog_roots.find((r) => r.kind === "registered") ??
34
+ catalog_roots[0];
35
+ const browseRoot = catalog_roots.find((r) => r.kind === "seeded") ?? authoringRoot;
36
+ const samplePipeline = pipelines.items.find((p) => p.project_root === browseRoot?.project_root);
37
+ const sampleTask = tasks.items.find((t) => t.project_root === browseRoot?.project_root);
35
38
  return textResult({
36
39
  host: { version: PACKAGE_VERSION },
37
40
  providers: deps.providerAuthContext
@@ -42,16 +45,22 @@ export function registerGetStartedTool(server, deps) {
42
45
  next_steps: [
43
46
  {
44
47
  tool: "list_pipelines",
45
- args: firstRoot ? { project_root: firstRoot.project_root } : {},
48
+ args: authoringRoot
49
+ ? { project_root: authoringRoot.project_root }
50
+ : {},
46
51
  },
47
52
  {
48
53
  tool: "list_tasks",
49
- args: firstRoot ? { project_root: firstRoot.project_root } : {},
54
+ args: authoringRoot
55
+ ? { project_root: authoringRoot.project_root }
56
+ : {},
50
57
  },
51
58
  {
52
59
  tool: "start_run",
53
60
  args: {
54
- ...(firstRoot ? { project_root: firstRoot.project_root } : {}),
61
+ ...(authoringRoot
62
+ ? { project_root: authoringRoot.project_root }
63
+ : {}),
55
64
  pipeline: samplePipeline?.path ?? "pipelines/demo.pipeline.yaml",
56
65
  task_path: sampleTask?.path ?? "tasks/demo.task.yaml",
57
66
  },