stageflow 0.25.0 → 0.30.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 (681) hide show
  1. package/README.md +14 -3
  2. package/builtin-skills/browser/SKILL.md +42 -0
  3. package/dist/a2a/contracts.d.ts +1 -0
  4. package/dist/a2a/contracts.js +1 -0
  5. package/dist/a2a/registry.d.ts +2 -0
  6. package/dist/a2a/registry.js +20 -1
  7. package/dist/a2a/server.d.ts +7 -0
  8. package/dist/a2a/server.js +5 -2
  9. package/dist/a2a/service.d.ts +1 -1
  10. package/dist/a2a/service.js +57 -8
  11. package/dist/a2a/store.d.ts +8 -5
  12. package/dist/a2a/store.js +24 -67
  13. package/dist/agent/activity.d.ts +3 -0
  14. package/dist/agent/bootProviderConfig.d.ts +21 -0
  15. package/dist/agent/bootProviderConfig.js +74 -0
  16. package/dist/agent/claudeAdapter.js +2 -2
  17. package/dist/agent/cursorProvider.d.ts +2 -0
  18. package/dist/agent/cursorProvider.js +30 -5
  19. package/dist/agent/fakeAgent.d.ts +1 -0
  20. package/dist/agent/fakeAgent.js +13 -0
  21. package/dist/agent/piAdapter.d.ts +11 -24
  22. package/dist/agent/piAdapter.js +107 -50
  23. package/dist/agent/piIsolatedMcp.d.ts +2 -0
  24. package/dist/agent/piIsolatedMcp.js +10 -2
  25. package/dist/agent/piSessionFactory.d.ts +38 -0
  26. package/dist/agent/piSessionFactory.js +60 -0
  27. package/dist/agent/port.d.ts +8 -0
  28. package/dist/agent/streamLogRedact.d.ts +7 -1
  29. package/dist/agent/streamLogRedact.js +26 -11
  30. package/dist/browser/anchor.d.ts +27 -0
  31. package/dist/browser/anchor.js +127 -0
  32. package/dist/browser/auditSink.d.ts +38 -0
  33. package/dist/browser/auditSink.js +34 -0
  34. package/dist/browser/browserHost.d.ts +86 -0
  35. package/dist/browser/browserHost.js +7 -0
  36. package/dist/browser/browserSweep.d.ts +14 -0
  37. package/dist/browser/browserSweep.js +54 -0
  38. package/dist/browser/browserTeardown.d.ts +56 -0
  39. package/dist/browser/browserTeardown.js +235 -0
  40. package/dist/browser/fakeRemoteBrowserHost.d.ts +2 -0
  41. package/dist/browser/fakeRemoteBrowserHost.js +34 -0
  42. package/dist/browser/gateHandoff.d.ts +25 -0
  43. package/dist/browser/gateHandoff.js +83 -0
  44. package/dist/browser/humanLogin.d.ts +18 -0
  45. package/dist/browser/humanLogin.js +34 -0
  46. package/dist/browser/keyProvider.d.ts +10 -0
  47. package/dist/browser/keyProvider.js +39 -0
  48. package/dist/browser/localBrowserHost.d.ts +10 -0
  49. package/dist/browser/localBrowserHost.js +152 -0
  50. package/dist/browser/localProfileLock.d.ts +2 -0
  51. package/dist/browser/localProfileLock.js +218 -0
  52. package/dist/browser/localProfileStore.d.ts +5 -0
  53. package/dist/browser/localProfileStore.js +91 -0
  54. package/dist/browser/loginCheck.d.ts +53 -0
  55. package/dist/browser/loginCheck.js +147 -0
  56. package/dist/browser/memoryProfileLock.d.ts +2 -0
  57. package/dist/browser/memoryProfileLock.js +53 -0
  58. package/dist/browser/memoryProfileStore.d.ts +2 -0
  59. package/dist/browser/memoryProfileStore.js +31 -0
  60. package/dist/browser/navigationAudit.d.ts +16 -0
  61. package/dist/browser/navigationAudit.js +53 -0
  62. package/dist/browser/persistedEnv.d.ts +3 -0
  63. package/dist/browser/persistedEnv.js +15 -0
  64. package/dist/browser/profileLock.d.ts +40 -0
  65. package/dist/browser/profileLock.js +10 -0
  66. package/dist/browser/profileStore.d.ts +23 -0
  67. package/dist/browser/profileStore.js +39 -0
  68. package/dist/browser/runLiveness.d.ts +13 -0
  69. package/dist/browser/runLiveness.js +39 -0
  70. package/dist/browser/sitePolicy.d.ts +10 -0
  71. package/dist/browser/sitePolicy.js +61 -0
  72. package/dist/browser/stageBrowserEnv.d.ts +22 -0
  73. package/dist/browser/stageBrowserEnv.js +147 -0
  74. package/dist/browser/stageProfileLock.d.ts +17 -0
  75. package/dist/browser/stageProfileLock.js +39 -0
  76. package/dist/cli/artifactCommand.js +9 -16
  77. package/dist/cli/backupCommand.d.ts +9 -0
  78. package/dist/cli/backupCommand.js +111 -0
  79. package/dist/cli/browserCommand.d.ts +44 -0
  80. package/dist/cli/browserCommand.js +472 -0
  81. package/dist/cli/debugRunCommand.d.ts +10 -0
  82. package/dist/cli/debugRunCommand.js +109 -0
  83. package/dist/cli/doctorCommand.d.ts +32 -0
  84. package/dist/cli/doctorCommand.js +453 -0
  85. package/dist/cli/envelopeCommand.js +9 -2
  86. package/dist/cli/exportAllCommand.d.ts +55 -0
  87. package/dist/cli/exportAllCommand.js +218 -0
  88. package/dist/cli/exportRunCommand.js +23 -21
  89. package/dist/cli/hostClient.d.ts +41 -3
  90. package/dist/cli/hostClient.js +129 -14
  91. package/dist/cli/initCommand.d.ts +1 -0
  92. package/dist/cli/initCommand.js +23 -7
  93. package/dist/cli/initTemplates.d.ts +5 -2
  94. package/dist/cli/initTemplates.js +32 -2
  95. package/dist/cli/resolveSafeOutPath.d.ts +2 -0
  96. package/dist/cli/resolveSafeOutPath.js +40 -0
  97. package/dist/cli/restoreCommand.d.ts +10 -0
  98. package/dist/cli/restoreCommand.js +90 -0
  99. package/dist/cli/runCommand.d.ts +3 -2
  100. package/dist/cli/runCommand.js +93 -11
  101. package/dist/cli/runOutput.d.ts +4 -0
  102. package/dist/cli/runOutput.js +33 -7
  103. package/dist/cli/runStageCommand.d.ts +1 -0
  104. package/dist/cli/runStageCommand.js +44 -25
  105. package/dist/cli/runsCommand.d.ts +1 -1
  106. package/dist/cli/runsCommand.js +168 -10
  107. package/dist/cli/triggerCommand.d.ts +12 -0
  108. package/dist/cli/triggerCommand.js +183 -0
  109. package/dist/cli/validateCommand.d.ts +1 -1
  110. package/dist/cli/validateCommand.js +23 -6
  111. package/dist/cli.js +202 -32
  112. package/dist/config/browseCatalog.d.ts +1 -0
  113. package/dist/config/browseCatalog.js +5 -4
  114. package/dist/config/builtinSkills.d.ts +4 -0
  115. package/dist/config/builtinSkills.js +23 -0
  116. package/dist/config/catalogRelativePath.d.ts +63 -0
  117. package/dist/config/catalogRelativePath.js +126 -0
  118. package/dist/config/configOrigin.d.ts +27 -0
  119. package/dist/config/configOrigin.js +59 -0
  120. package/dist/config/createTrigger.d.ts +27 -0
  121. package/dist/config/createTrigger.js +232 -0
  122. package/dist/config/draftPackage.d.ts +117 -0
  123. package/dist/config/draftPackage.js +550 -0
  124. package/dist/config/ensureCatalogScanRoot.d.ts +16 -0
  125. package/dist/config/ensureCatalogScanRoot.js +73 -0
  126. package/dist/config/hostConfig.d.ts +57 -0
  127. package/dist/config/hostConfig.js +360 -0
  128. package/dist/config/listSkills.d.ts +26 -0
  129. package/dist/config/listSkills.js +206 -5
  130. package/dist/config/loadOutcome.d.ts +7 -1
  131. package/dist/config/loadPipeline.js +39 -2
  132. package/dist/config/loadStage.js +25 -0
  133. package/dist/config/loadStageflowManifest.js +25 -0
  134. package/dist/config/loadTask.d.ts +2 -0
  135. package/dist/config/loadTask.js +57 -18
  136. package/dist/config/loadTrigger.d.ts +9 -0
  137. package/dist/config/loadTrigger.js +120 -0
  138. package/dist/config/materializeStageModels.js +5 -1
  139. package/dist/config/mergePipelineIncludes.d.ts +3 -0
  140. package/dist/config/mergePipelineIncludes.js +19 -0
  141. package/dist/config/migrateYaml.js +6 -11
  142. package/dist/config/multiProjectCatalog.d.ts +32 -0
  143. package/dist/config/multiProjectCatalog.js +150 -0
  144. package/dist/config/normalizePipelineStageEntry.js +27 -1
  145. package/dist/config/parseCompletionContract.js +6 -0
  146. package/dist/config/pipelineStageKeys.js +3 -0
  147. package/dist/config/publishDraftPackage.d.ts +7 -0
  148. package/dist/config/publishDraftPackage.js +25 -0
  149. package/dist/config/resolveCatalogContext.js +1 -1
  150. package/dist/config/resolveCatalogRoots.d.ts +27 -0
  151. package/dist/config/resolveCatalogRoots.js +76 -0
  152. package/dist/config/resolveModel.d.ts +7 -1
  153. package/dist/config/resolveModel.js +11 -1
  154. package/dist/config/resolvePipelineDag.js +1 -1
  155. package/dist/config/resolveStageMcpServers.d.ts +9 -1
  156. package/dist/config/resolveStageMcpServers.js +36 -9
  157. package/dist/config/scanCatalogPaths.d.ts +1 -1
  158. package/dist/config/scanCatalogPaths.js +6 -2
  159. package/dist/config/secretFromEnvOrFile.d.ts +9 -0
  160. package/dist/config/secretFromEnvOrFile.js +34 -0
  161. package/dist/config/seededCatalog.d.ts +11 -0
  162. package/dist/config/seededCatalog.js +29 -0
  163. package/dist/config/stageBrowser.d.ts +12 -0
  164. package/dist/config/stageBrowser.js +118 -0
  165. package/dist/config/toolRequires.d.ts +24 -0
  166. package/dist/config/toolRequires.js +115 -0
  167. package/dist/config/triggerCatalog.d.ts +10 -0
  168. package/dist/config/triggerCatalog.js +37 -0
  169. package/dist/config/validateCatalog.d.ts +17 -3
  170. package/dist/config/validateCatalog.js +223 -3
  171. package/dist/config/validateCompletionContract.js +8 -0
  172. package/dist/diagnostics/checks.d.ts +39 -0
  173. package/dist/diagnostics/checks.js +135 -0
  174. package/dist/envelope/preEmitChecks.d.ts +1 -1
  175. package/dist/envelope/preEmitChecks.js +8 -0
  176. package/dist/errors/codes.d.ts +14 -0
  177. package/dist/errors/codes.js +59 -0
  178. package/dist/git/cache.d.ts +14 -0
  179. package/dist/git/cache.js +150 -0
  180. package/dist/git/credentials.d.ts +9 -0
  181. package/dist/git/credentials.js +88 -0
  182. package/dist/git/errors.d.ts +20 -0
  183. package/dist/git/errors.js +94 -0
  184. package/dist/git/exec.d.ts +16 -0
  185. package/dist/git/exec.js +135 -0
  186. package/dist/git/operations.d.ts +29 -0
  187. package/dist/git/operations.js +153 -0
  188. package/dist/git/version.d.ts +1 -0
  189. package/dist/git/version.js +10 -0
  190. package/dist/logging/audit.d.ts +16 -0
  191. package/dist/logging/audit.js +19 -0
  192. package/dist/logging/commonWords.d.ts +2 -0
  193. package/dist/logging/commonWords.js +13 -0
  194. package/dist/logging/logger.d.ts +49 -0
  195. package/dist/logging/logger.js +193 -0
  196. package/dist/logging/namedSecrets.d.ts +6 -0
  197. package/dist/logging/namedSecrets.js +58 -0
  198. package/dist/logging/redact.d.ts +17 -0
  199. package/dist/logging/redact.js +105 -0
  200. package/dist/mcp/catalogTools.js +492 -81
  201. package/dist/mcp/checkoutTools.d.ts +52 -0
  202. package/dist/mcp/checkoutTools.js +332 -0
  203. package/dist/mcp/controlTools.js +182 -6
  204. package/dist/mcp/deps.d.ts +3 -0
  205. package/dist/mcp/getStartedTool.d.ts +3 -0
  206. package/dist/mcp/getStartedTool.js +62 -0
  207. package/dist/mcp/readArtifact.d.ts +11 -0
  208. package/dist/mcp/readArtifact.js +46 -30
  209. package/dist/mcp/server.js +2 -0
  210. package/dist/mcp/tools.js +6 -0
  211. package/dist/mcp/triggerTools.d.ts +3 -0
  212. package/dist/mcp/triggerTools.js +176 -0
  213. package/dist/net/proxy.d.ts +14 -0
  214. package/dist/net/proxy.js +78 -0
  215. package/dist/operatorAgent/docsRetrieval.d.ts +40 -0
  216. package/dist/operatorAgent/docsRetrieval.js +269 -0
  217. package/dist/operatorAgent/draftContext.d.ts +16 -0
  218. package/dist/operatorAgent/draftContext.js +68 -0
  219. package/dist/operatorAgent/fakeHost.d.ts +39 -0
  220. package/dist/operatorAgent/fakeHost.js +92 -0
  221. package/dist/operatorAgent/host.d.ts +40 -0
  222. package/dist/operatorAgent/host.js +179 -0
  223. package/dist/operatorAgent/index.d.ts +9 -0
  224. package/dist/operatorAgent/index.js +8 -0
  225. package/dist/operatorAgent/piModel.d.ts +80 -0
  226. package/dist/operatorAgent/piModel.js +528 -0
  227. package/dist/operatorAgent/profiles/workshopAuthor.d.ts +23 -0
  228. package/dist/operatorAgent/profiles/workshopAuthor.js +338 -0
  229. package/dist/operatorAgent/profiles/workshopAuthorPlaybook.d.ts +6 -0
  230. package/dist/operatorAgent/profiles/workshopAuthorPlaybook.js +103 -0
  231. package/dist/operatorAgent/profiles/workshopAuthorTools.d.ts +57 -0
  232. package/dist/operatorAgent/profiles/workshopAuthorTools.js +623 -0
  233. package/dist/operatorAgent/proposals.d.ts +32 -0
  234. package/dist/operatorAgent/proposals.js +144 -0
  235. package/dist/operatorAgent/types.d.ts +128 -0
  236. package/dist/operatorAgent/types.js +1 -0
  237. package/dist/package-meta.d.ts +2 -1
  238. package/dist/package-meta.js +2 -1
  239. package/dist/preflight/bash.d.ts +8 -0
  240. package/dist/preflight/bash.js +34 -0
  241. package/dist/preflight/claudeRoot.d.ts +11 -0
  242. package/dist/preflight/claudeRoot.js +23 -0
  243. package/dist/preflight/mcpCommands.d.ts +8 -0
  244. package/dist/preflight/mcpCommands.js +36 -0
  245. package/dist/preflight/pipelinePreflight.d.ts +40 -0
  246. package/dist/preflight/pipelinePreflight.js +192 -0
  247. package/dist/preflight/tls.d.ts +6 -0
  248. package/dist/preflight/tls.js +18 -0
  249. package/dist/preflight/toolchain.d.ts +45 -0
  250. package/dist/preflight/toolchain.js +219 -0
  251. package/dist/project/findManifestRoot.d.ts +3 -0
  252. package/dist/project/findManifestRoot.js +35 -0
  253. package/dist/project/findProjectRoot.js +3 -4
  254. package/dist/project/globalHome.d.ts +7 -0
  255. package/dist/project/globalHome.js +63 -2
  256. package/dist/project/resolveProjectContext.js +2 -2
  257. package/dist/project/resolveStageflowContext.d.ts +7 -0
  258. package/dist/project/resolveStageflowContext.js +46 -30
  259. package/dist/projection/projectRun.d.ts +2 -1
  260. package/dist/projection/projectRun.js +1 -0
  261. package/dist/runstore/assertTmpdir.d.ts +1 -0
  262. package/dist/runstore/assertTmpdir.js +25 -0
  263. package/dist/runstore/backup.d.ts +52 -0
  264. package/dist/runstore/backup.js +292 -0
  265. package/dist/runstore/createStore.d.ts +18 -1
  266. package/dist/runstore/createStore.js +64 -5
  267. package/dist/runstore/debugBundle.d.ts +60 -0
  268. package/dist/runstore/debugBundle.js +143 -0
  269. package/dist/runstore/diskUsage.d.ts +50 -0
  270. package/dist/runstore/diskUsage.js +214 -0
  271. package/dist/runstore/exportRunPayload.d.ts +8 -0
  272. package/dist/runstore/exportRunPayload.js +23 -0
  273. package/dist/runstore/normalizeCatalogPath.d.ts +1 -0
  274. package/dist/runstore/normalizeCatalogPath.js +10 -0
  275. package/dist/runstore/paths.d.ts +5 -0
  276. package/dist/runstore/paths.js +145 -1
  277. package/dist/runstore/port.d.ts +139 -13
  278. package/dist/runstore/port.js +8 -1
  279. package/dist/runstore/restore.d.ts +81 -0
  280. package/dist/runstore/restore.js +355 -0
  281. package/dist/runstore/retention.d.ts +27 -0
  282. package/dist/runstore/retention.js +74 -0
  283. package/dist/runstore/runManifest.d.ts +146 -0
  284. package/dist/runstore/runManifest.js +288 -0
  285. package/dist/runstore/runProjection.d.ts +3 -1
  286. package/dist/runstore/runProjection.js +63 -1
  287. package/dist/runstore/sqlite/SqliteRunStore.d.ts +35 -3
  288. package/dist/runstore/sqlite/SqliteRunStore.js +442 -219
  289. package/dist/runstore/sqlite/applyStorePragmas.d.ts +39 -0
  290. package/dist/runstore/sqlite/applyStorePragmas.js +145 -0
  291. package/dist/runstore/sqlite/migrations/001-baseline.d.ts +7 -0
  292. package/dist/runstore/sqlite/migrations/001-baseline.js +10 -0
  293. package/dist/runstore/sqlite/migrations/002-repository-binding.d.ts +7 -0
  294. package/dist/runstore/sqlite/migrations/002-repository-binding.js +29 -0
  295. package/dist/runstore/sqlite/migrations/003-run-lifecycle.d.ts +7 -0
  296. package/dist/runstore/sqlite/migrations/003-run-lifecycle.js +28 -0
  297. package/dist/runstore/sqlite/migrations/004-auto-resume-count.d.ts +7 -0
  298. package/dist/runstore/sqlite/migrations/004-auto-resume-count.js +19 -0
  299. package/dist/runstore/sqlite/migrations/005-config-origins.d.ts +7 -0
  300. package/dist/runstore/sqlite/migrations/005-config-origins.js +19 -0
  301. package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.d.ts +7 -0
  302. package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.js +28 -0
  303. package/dist/runstore/sqlite/migrations/007-projects-registry.d.ts +7 -0
  304. package/dist/runstore/sqlite/migrations/007-projects-registry.js +31 -0
  305. package/dist/runstore/sqlite/migrations/008-triggers-table.d.ts +7 -0
  306. package/dist/runstore/sqlite/migrations/008-triggers-table.js +19 -0
  307. package/dist/runstore/sqlite/migrations/009-trigger-next-run.d.ts +7 -0
  308. package/dist/runstore/sqlite/migrations/009-trigger-next-run.js +19 -0
  309. package/dist/runstore/sqlite/migrations/010-trigger-adapter-state.d.ts +7 -0
  310. package/dist/runstore/sqlite/migrations/010-trigger-adapter-state.js +17 -0
  311. package/dist/runstore/sqlite/migrations/index.d.ts +21 -0
  312. package/dist/runstore/sqlite/migrations/index.js +78 -0
  313. package/dist/runstore/sqlite/schema.d.ts +20 -1
  314. package/dist/runstore/sqlite/schema.js +277 -1
  315. package/dist/runstore/sqlite/storeOpenError.d.ts +6 -0
  316. package/dist/runstore/sqlite/storeOpenError.js +11 -0
  317. package/dist/runstore/sqlite/storeSchemaError.d.ts +5 -0
  318. package/dist/runstore/sqlite/storeSchemaError.js +8 -0
  319. package/dist/runstore/stageExecution.js +3 -0
  320. package/dist/runstore/storeFilesystem.d.ts +32 -0
  321. package/dist/runstore/storeFilesystem.js +148 -0
  322. package/dist/runstore/trackProjection.js +2 -0
  323. package/dist/runstore/workspaceLayout.d.ts +13 -0
  324. package/dist/runstore/workspaceLayout.js +76 -0
  325. package/dist/runtime/answerResume.d.ts +1 -0
  326. package/dist/runtime/answerResume.js +3 -1
  327. package/dist/runtime/completionCheckRunner.d.ts +15 -1
  328. package/dist/runtime/completionCheckRunner.js +67 -7
  329. package/dist/runtime/containerLimits.d.ts +16 -0
  330. package/dist/runtime/containerLimits.js +84 -0
  331. package/dist/runtime/credentialBinding.d.ts +2 -0
  332. package/dist/runtime/credentialBinding.js +3 -0
  333. package/dist/runtime/credentialMaterialisation.d.ts +28 -0
  334. package/dist/runtime/credentialMaterialisation.js +128 -0
  335. package/dist/runtime/emailSource.d.ts +72 -0
  336. package/dist/runtime/emailSource.js +304 -0
  337. package/dist/runtime/gitCheckoutCapability.js +7 -13
  338. package/dist/runtime/githubPollSource.d.ts +86 -0
  339. package/dist/runtime/githubPollSource.js +284 -0
  340. package/dist/runtime/pipelineRunner.d.ts +40 -1
  341. package/dist/runtime/pipelineRunner.js +181 -17
  342. package/dist/runtime/pipelineScheduler.d.ts +17 -0
  343. package/dist/runtime/pipelineScheduler.js +220 -28
  344. package/dist/runtime/reloadRunCatalog.js +6 -1
  345. package/dist/runtime/repositoryMaterialize.d.ts +47 -0
  346. package/dist/runtime/repositoryMaterialize.js +235 -0
  347. package/dist/runtime/resumeTimedOut.d.ts +1 -1
  348. package/dist/runtime/resumeTimedOut.js +5 -2
  349. package/dist/runtime/runChangeBus.js +9 -0
  350. package/dist/runtime/runDeletion.d.ts +7 -0
  351. package/dist/runtime/runDeletion.js +37 -0
  352. package/dist/runtime/runManager.d.ts +169 -4
  353. package/dist/runtime/runManager.js +1748 -83
  354. package/dist/runtime/runRetentionSweep.d.ts +31 -0
  355. package/dist/runtime/runRetentionSweep.js +328 -0
  356. package/dist/runtime/runRetryCoordinator.d.ts +4 -0
  357. package/dist/runtime/runRetryCoordinator.js +20 -2
  358. package/dist/runtime/runSkills.d.ts +40 -0
  359. package/dist/runtime/runSkills.js +173 -0
  360. package/dist/runtime/scheduleSource.d.ts +38 -0
  361. package/dist/runtime/scheduleSource.js +119 -0
  362. package/dist/runtime/settingsFile.d.ts +5 -0
  363. package/dist/runtime/settingsFile.js +61 -54
  364. package/dist/runtime/stageAttemptBootstrap.d.ts +5 -1
  365. package/dist/runtime/stageAttemptBootstrap.js +250 -27
  366. package/dist/runtime/stageCacheEnv.d.ts +6 -0
  367. package/dist/runtime/stageCacheEnv.js +34 -0
  368. package/dist/runtime/stageConcurrency.d.ts +2 -1
  369. package/dist/runtime/stageConcurrency.js +4 -2
  370. package/dist/runtime/stageEnvironment.d.ts +38 -0
  371. package/dist/runtime/stageEnvironment.js +194 -0
  372. package/dist/runtime/stageHitl.d.ts +1 -0
  373. package/dist/runtime/stageHitl.js +5 -1
  374. package/dist/runtime/stageProcessLauncher.d.ts +20 -0
  375. package/dist/runtime/stageProcessLauncher.js +236 -41
  376. package/dist/runtime/stageRecovery.d.ts +3 -1
  377. package/dist/runtime/stageRecovery.js +19 -4
  378. package/dist/runtime/stageRoots.d.ts +38 -1
  379. package/dist/runtime/stageRoots.js +118 -0
  380. package/dist/runtime/stageRunner.d.ts +6 -0
  381. package/dist/runtime/stageRunner.js +32 -6
  382. package/dist/runtime/stageSecretDecl.d.ts +9 -0
  383. package/dist/runtime/stageSecretDecl.js +102 -0
  384. package/dist/runtime/stageSecrets.d.ts +40 -0
  385. package/dist/runtime/stageSecrets.js +181 -0
  386. package/dist/runtime/stageStreamLog.d.ts +1 -0
  387. package/dist/runtime/stageStreamLog.js +2 -1
  388. package/dist/runtime/stageWorker.d.ts +3 -2
  389. package/dist/runtime/stageWorker.js +58 -10
  390. package/dist/runtime/stageWorkerProtocol.d.ts +5 -0
  391. package/dist/runtime/stageWorkerProtocol.js +8 -0
  392. package/dist/runtime/startPayload.d.ts +32 -0
  393. package/dist/runtime/startPayload.js +59 -0
  394. package/dist/runtime/taskInput.js +14 -5
  395. package/dist/runtime/triggerCatalog.d.ts +6 -0
  396. package/dist/runtime/triggerCatalog.js +24 -0
  397. package/dist/runtime/triggerEventMatch.d.ts +2 -0
  398. package/dist/runtime/triggerEventMatch.js +6 -0
  399. package/dist/runtime/triggerPort.d.ts +14 -0
  400. package/dist/runtime/triggerPort.js +1 -0
  401. package/dist/runtime/triggerRunner.d.ts +17 -0
  402. package/dist/runtime/triggerRunner.js +89 -0
  403. package/dist/runtime/verifiedStageExecution.d.ts +8 -0
  404. package/dist/runtime/verifiedStageExecution.js +16 -1
  405. package/dist/runtime/webhookSignature.d.ts +1 -0
  406. package/dist/runtime/webhookSignature.js +12 -0
  407. package/dist/runtime/workspaceBinding.d.ts +20 -0
  408. package/dist/runtime/workspaceBinding.js +60 -0
  409. package/dist/server/allowedHosts.d.ts +19 -0
  410. package/dist/server/allowedHosts.js +179 -0
  411. package/dist/server/bootstrap.d.ts +42 -2
  412. package/dist/server/bootstrap.js +273 -5
  413. package/dist/server/controlToken.d.ts +47 -0
  414. package/dist/server/controlToken.js +254 -0
  415. package/dist/server/createHttpHost.d.ts +11 -2
  416. package/dist/server/createHttpHost.js +106 -10
  417. package/dist/server/ensureGlobalService.d.ts +5 -1
  418. package/dist/server/ensureGlobalService.js +35 -1
  419. package/dist/server/healthSurfaces.d.ts +6 -0
  420. package/dist/server/healthSurfaces.js +123 -0
  421. package/dist/server/http.d.ts +27 -1
  422. package/dist/server/http.js +2254 -477
  423. package/dist/server/listenHost.d.ts +5 -0
  424. package/dist/server/listenHost.js +56 -0
  425. package/dist/server/mcpHost.d.ts +10 -1
  426. package/dist/server/mcpHost.js +36 -6
  427. package/dist/server/operatorResults.d.ts +2 -2
  428. package/dist/server/operatorResults.js +40 -29
  429. package/dist/server/requestAuthContext.d.ts +12 -0
  430. package/dist/server/requestAuthContext.js +21 -0
  431. package/dist/server/shutdown.d.ts +69 -0
  432. package/dist/server/shutdown.js +219 -0
  433. package/dist/server/triggerRoutes.d.ts +15 -0
  434. package/dist/server/triggerRoutes.js +268 -0
  435. package/dist/tools/askOperator.d.ts +3 -2
  436. package/dist/types/completion.d.ts +3 -0
  437. package/dist/types/pipeline.d.ts +10 -1
  438. package/dist/types/preEmitCheck.d.ts +7 -0
  439. package/dist/types/stage.d.ts +22 -0
  440. package/dist/types/stageflowManifest.d.ts +3 -0
  441. package/dist/types/task.d.ts +8 -0
  442. package/dist/types/trigger.d.ts +18 -0
  443. package/dist/types/trigger.js +1 -0
  444. package/dist/ui/assets/{index-CSsDued1.css → index-Bv4p1aPK.css} +1 -1
  445. package/dist/ui/assets/index-CntB4bZR.js +133 -0
  446. package/dist/ui/index.html +2 -2
  447. package/dist/workshop/autosave.d.ts +58 -0
  448. package/dist/workshop/autosave.js +222 -0
  449. package/dist/workshop/buildStore.d.ts +79 -0
  450. package/dist/workshop/buildStore.js +326 -0
  451. package/dist/workshop/chatTurn.d.ts +232 -0
  452. package/dist/workshop/chatTurn.js +475 -0
  453. package/dist/workshop/modelSettings.d.ts +18 -0
  454. package/dist/workshop/modelSettings.js +44 -0
  455. package/dist/workshop/sessionStore.d.ts +61 -0
  456. package/dist/workshop/sessionStore.js +254 -0
  457. package/dist/workshop/workshopPin.d.ts +72 -0
  458. package/dist/workshop/workshopPin.js +193 -0
  459. package/examples/README.md +99 -0
  460. package/examples/archify-on-pr/README.md +213 -0
  461. package/examples/archify-on-pr/archify-on-pr.pipeline.yaml +19 -0
  462. package/examples/archify-on-pr/archify-on-pr.task.yaml +19 -0
  463. package/examples/archify-on-pr/author-diagrams.yaml +106 -0
  464. package/examples/archify-on-pr/detect-changes.yaml +89 -0
  465. package/examples/browser-session/README.md +77 -0
  466. package/examples/browser-session/browser-session.pipeline.yaml +50 -0
  467. package/examples/browser-session/browser-session.task.yaml +6 -0
  468. package/examples/browser-session/check-login.yaml +22 -0
  469. package/examples/browser-session/fixture-server.mjs +64 -0
  470. package/examples/browser-session/human-login.yaml +31 -0
  471. package/examples/browser-session/merge.yaml +36 -0
  472. package/examples/browser-session/work-a.yaml +41 -0
  473. package/examples/browser-session/work-b.yaml +41 -0
  474. package/examples/ci-validate/README.md +35 -0
  475. package/examples/ci-validate/check.yaml +13 -0
  476. package/examples/ci-validate/ci-demo.pipeline.yaml +4 -0
  477. package/examples/ci-validate/validate.sh +5 -0
  478. package/examples/compliance-review-demo/README.md +125 -0
  479. package/examples/compliance-review-demo/compliance-review-demo.pipeline.yaml +29 -0
  480. package/examples/compliance-review-demo/connect-account.yaml +47 -0
  481. package/examples/compliance-review-demo/map-to-control.yaml +123 -0
  482. package/examples/compliance-review-demo/poll-bucket-config.yaml +103 -0
  483. package/examples/compliance-review-demo/publish-report.yaml +79 -0
  484. package/examples/compliance-review-demo/review-verdict.yaml +122 -0
  485. package/examples/compliance-review-demo/run-compliance-check.yaml +96 -0
  486. package/examples/compliance-review-demo/store-evidence.yaml +143 -0
  487. package/examples/conditional-fork/README.md +89 -0
  488. package/examples/conditional-fork/branch-a.yaml +13 -0
  489. package/examples/conditional-fork/branch-b.yaml +13 -0
  490. package/examples/conditional-fork/decide.yaml +35 -0
  491. package/examples/conditional-fork/fork-demo.pipeline.yaml +20 -0
  492. package/examples/conditional-fork/fork-demo.task.yaml +8 -0
  493. package/examples/context7-mcp/README.md +42 -0
  494. package/examples/context7-mcp/context7-mcp.pipeline.yaml +15 -0
  495. package/examples/context7-mcp/context7-mcp.task.yaml +4 -0
  496. package/examples/context7-mcp/fetch-docs.yaml +52 -0
  497. package/examples/context7-mcp/resolve-library.yaml +31 -0
  498. package/examples/context7-mcp/write-brief.yaml +52 -0
  499. package/examples/feature-loop/README.md +104 -0
  500. package/examples/feature-loop/address-feedback.yaml +148 -0
  501. package/examples/feature-loop/align.yaml +116 -0
  502. package/examples/feature-loop/decompose.yaml +86 -0
  503. package/examples/feature-loop/default-model-hierarchy.task.yaml +58 -0
  504. package/examples/feature-loop/feature-loop.pipeline.yaml +140 -0
  505. package/examples/feature-loop/feature-loop.task.yaml +25 -0
  506. package/examples/feature-loop/implement.yaml +128 -0
  507. package/examples/feature-loop/plan.yaml +111 -0
  508. package/examples/feature-loop/publish.yaml +167 -0
  509. package/examples/feature-loop/review.yaml +146 -0
  510. package/examples/feature-loop/verify.yaml +106 -0
  511. package/examples/feedback-loop/README.md +72 -0
  512. package/examples/feedback-loop/VERIFY.md +208 -0
  513. package/examples/feedback-loop/continue-only.task.yaml +4 -0
  514. package/examples/feedback-loop/exhaust-require-continue.task.yaml +6 -0
  515. package/examples/feedback-loop/exhaust-wait-human.task.yaml +11 -0
  516. package/examples/feedback-loop/feedback-loop-wait-human.pipeline.yaml +23 -0
  517. package/examples/feedback-loop/feedback-loop.pipeline.yaml +23 -0
  518. package/examples/feedback-loop/feedback-loop.task.yaml +4 -0
  519. package/examples/feedback-loop/implement.yaml +14 -0
  520. package/examples/feedback-loop/plan.yaml +14 -0
  521. package/examples/feedback-loop/review.yaml +15 -0
  522. package/examples/feedback-loop/send-back-once.task.yaml +6 -0
  523. package/examples/feedback-loop/submit.yaml +12 -0
  524. package/examples/generic-fan-in/README.md +151 -0
  525. package/examples/generic-fan-in/clarify.yaml +18 -0
  526. package/examples/generic-fan-in/generic-fan-in-accepted.pipeline.yaml +19 -0
  527. package/examples/generic-fan-in/generic-fan-in-accepted.task.yaml +8 -0
  528. package/examples/generic-fan-in/generic-fan-in.pipeline.yaml +18 -0
  529. package/examples/generic-fan-in/generic-fan-in.task.yaml +9 -0
  530. package/examples/generic-fan-in/research.yaml +45 -0
  531. package/examples/generic-fan-in/synthesize.yaml +66 -0
  532. package/examples/generic-fan-in/validation.yaml +45 -0
  533. package/examples/github-release/README.md +78 -0
  534. package/examples/github-release/draft-release-notes.yaml +64 -0
  535. package/examples/github-release/github-release.pipeline.yaml +11 -0
  536. package/examples/github-release/github-release.task.yaml +13 -0
  537. package/examples/github-release/publish-github-release.yaml +64 -0
  538. package/examples/hello-world/README.md +28 -0
  539. package/examples/hello-world/hello.pipeline.yaml +4 -0
  540. package/examples/hello-world/my-task.task.yaml +6 -0
  541. package/examples/hello-world/research.yaml +18 -0
  542. package/examples/mcp-hitl-tour/README.md +113 -0
  543. package/examples/mcp-hitl-tour/draft-angle.yaml +33 -0
  544. package/examples/mcp-hitl-tour/draft-short.yaml +32 -0
  545. package/examples/mcp-hitl-tour/emit-angles.yaml +45 -0
  546. package/examples/mcp-hitl-tour/gather.yaml +31 -0
  547. package/examples/mcp-hitl-tour/intake.yaml +62 -0
  548. package/examples/mcp-hitl-tour/mcp-hitl-tour-exhaust.task.yaml +13 -0
  549. package/examples/mcp-hitl-tour/mcp-hitl-tour.pipeline.yaml +54 -0
  550. package/examples/mcp-hitl-tour/mcp-hitl-tour.task.yaml +16 -0
  551. package/examples/mcp-hitl-tour/polish.yaml +33 -0
  552. package/examples/mcp-hitl-tour/review.yaml +17 -0
  553. package/examples/mcp-hitl-tour/ship.yaml +25 -0
  554. package/examples/oss-issue-contribution/README.md +218 -0
  555. package/examples/oss-issue-contribution/oss-address-review-feedback.yaml +117 -0
  556. package/examples/oss-issue-contribution/oss-approve-contribution.yaml +181 -0
  557. package/examples/oss-issue-contribution/oss-approve-plan.yaml +111 -0
  558. package/examples/oss-issue-contribution/oss-explain-fix.yaml +108 -0
  559. package/examples/oss-issue-contribution/oss-explain-issue.yaml +114 -0
  560. package/examples/oss-issue-contribution/oss-implement-source-fix.yaml +171 -0
  561. package/examples/oss-issue-contribution/oss-investigate-area.yaml +116 -0
  562. package/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml +125 -0
  563. package/examples/oss-issue-contribution/oss-issue-intake.yaml +106 -0
  564. package/examples/oss-issue-contribution/oss-plan-investigation.yaml +112 -0
  565. package/examples/oss-issue-contribution/oss-plan-review.yaml +109 -0
  566. package/examples/oss-issue-contribution/oss-reproduce-issue.yaml +140 -0
  567. package/examples/oss-issue-contribution/oss-review-change.yaml +107 -0
  568. package/examples/oss-issue-contribution/oss-verify-fix.yaml +130 -0
  569. package/examples/oss-issue-contribution/oss-write-regression-test.yaml +135 -0
  570. package/examples/oss-issue-contribution/pi-7629.task.yaml +79 -0
  571. package/examples/oss-issue-contribution/pi-8919.task.yaml +75 -0
  572. package/examples/oss-issue-contribution/pydantic-ai-7971.task.yaml +53 -0
  573. package/examples/oss-quick-fix/README.md +65 -0
  574. package/examples/oss-quick-fix/implement-fix.yaml +84 -0
  575. package/examples/oss-quick-fix/oss-quick-fix.pipeline.yaml +35 -0
  576. package/examples/oss-quick-fix/oss-quick-fix.task.yaml +19 -0
  577. package/examples/oss-quick-fix/ship-fix.yaml +81 -0
  578. package/examples/oss-quick-fix/understand-issue.yaml +67 -0
  579. package/examples/oss-quick-fix/verify-fix.yaml +73 -0
  580. package/examples/plan-review/README.md +37 -0
  581. package/examples/plan-review/plan-review-followup.yaml +13 -0
  582. package/examples/plan-review/plan-review.pipeline.yaml +9 -0
  583. package/examples/plan-review/plan-review.task.yaml +9 -0
  584. package/examples/plan-review/plan-review.yaml +25 -0
  585. package/examples/playwright-mcp/README.md +39 -0
  586. package/examples/playwright-mcp/playwright-mcp.pipeline.yaml +5 -0
  587. package/examples/playwright-mcp/playwright-mcp.task.yaml +4 -0
  588. package/examples/playwright-mcp/screenshot.yaml +40 -0
  589. package/examples/retry-tour/README.md +75 -0
  590. package/examples/retry-tour/retry-tour.pipeline.yaml +122 -0
  591. package/examples/retry-tour/retry-tour.task.yaml +9 -0
  592. package/examples/route-if-tour/README.md +202 -0
  593. package/examples/route-if-tour/route-if-tour.pipeline.yaml +950 -0
  594. package/examples/route-if-tour/route-if-tour.task.yaml +4 -0
  595. package/examples/route-wiring-smoke-test/01-core-routing.pipeline.yaml +168 -0
  596. package/examples/route-wiring-smoke-test/02-on-gating.pipeline.yaml +44 -0
  597. package/examples/route-wiring-smoke-test/03-two-entry-points.pipeline.yaml +28 -0
  598. package/examples/route-wiring-smoke-test/04-entry-false-equivalent-to-omitted.pipeline.yaml +27 -0
  599. package/examples/route-wiring-smoke-test/05-fork-choice.pipeline.yaml +110 -0
  600. package/examples/route-wiring-smoke-test/06-fan-out-fan-in.pipeline.yaml +82 -0
  601. package/examples/route-wiring-smoke-test/07-loop-human-decision.pipeline.yaml +82 -0
  602. package/examples/route-wiring-smoke-test/08-skip-fallback-and-multi-on-gate.pipeline.yaml +77 -0
  603. package/examples/route-wiring-smoke-test/09-multi-loop-targets.pipeline.yaml +102 -0
  604. package/examples/route-wiring-smoke-test/10-uses-dialect-fork.pipeline.yaml +23 -0
  605. package/examples/route-wiring-smoke-test/11-sequential-io-handoff.pipeline.yaml +37 -0
  606. package/examples/route-wiring-smoke-test/12-complex-io-schemas.pipeline.yaml +138 -0
  607. package/examples/route-wiring-smoke-test/13-ref-io-handoff.pipeline.yaml +84 -0
  608. package/examples/route-wiring-smoke-test/14-if-eq-gating.pipeline.yaml +50 -0
  609. package/examples/route-wiring-smoke-test/15-if-all-gated.pipeline.yaml +37 -0
  610. package/examples/route-wiring-smoke-test/16-if-composition.pipeline.yaml +65 -0
  611. package/examples/route-wiring-smoke-test/17-if-join.pipeline.yaml +80 -0
  612. package/examples/route-wiring-smoke-test/README.md +377 -0
  613. package/examples/route-wiring-smoke-test/rejected/01-reject-legacy-needs.pipeline.yaml +26 -0
  614. package/examples/route-wiring-smoke-test/rejected/02-reject-legacy-fork.pipeline.yaml +25 -0
  615. package/examples/route-wiring-smoke-test/rejected/03-reject-legacy-feedback-loop.pipeline.yaml +30 -0
  616. package/examples/route-wiring-smoke-test/rejected/04-reject-missing-entry.pipeline.yaml +24 -0
  617. package/examples/route-wiring-smoke-test/rejected/05-reject-unreachable.pipeline.yaml +35 -0
  618. package/examples/route-wiring-smoke-test/rejected/06-reject-allow-none-without-route-select.pipeline.yaml +37 -0
  619. package/examples/route-wiring-smoke-test/rejected/07-reject-cycle.pipeline.yaml +27 -0
  620. package/examples/route-wiring-smoke-test/rejected/08-reject-loop-non-ancestor.pipeline.yaml +42 -0
  621. package/examples/route-wiring-smoke-test/rejected/09-reject-route-select-leaf.pipeline.yaml +26 -0
  622. package/examples/route-wiring-smoke-test/rejected/12-reject-loop-replay-unsafe.pipeline.yaml +55 -0
  623. package/examples/route-wiring-smoke-test/rejected/13-reject-multiple-loop-entries.pipeline.yaml +51 -0
  624. package/examples/route-wiring-smoke-test/rejected/14-reject-duplicate-stage-id.pipeline.yaml +35 -0
  625. package/examples/route-wiring-smoke-test/rejected/15-reject-unknown-route-target.pipeline.yaml +15 -0
  626. package/examples/route-wiring-smoke-test/rejected/16-reject-malformed-route-item.pipeline.yaml +15 -0
  627. package/examples/route-wiring-smoke-test/rejected/17-reject-io-incompatible.pipeline.yaml +33 -0
  628. package/examples/route-wiring-smoke-test/rejected/18-reject-nested-io.pipeline.yaml +51 -0
  629. package/examples/route-wiring-smoke-test/rejected/19-reject-array-item-io.pipeline.yaml +55 -0
  630. package/examples/route-wiring-smoke-test/rejected/20-reject-closed-io.pipeline.yaml +36 -0
  631. package/examples/route-wiring-smoke-test/rejected/21-reject-ref-io.pipeline.yaml +42 -0
  632. package/examples/route-wiring-smoke-test/rejected/22-reject-if-unknown-field.pipeline.yaml +33 -0
  633. package/examples/route-wiring-smoke-test/rejected/23-reject-if-optional-field.pipeline.yaml +32 -0
  634. package/examples/route-wiring-smoke-test/rejected/24-reject-if-empty-all.pipeline.yaml +31 -0
  635. package/examples/route-wiring-smoke-test/rejected/25-reject-if-gt-on-string.pipeline.yaml +33 -0
  636. package/examples/route-wiring-smoke-test/rejected/26-reject-if-optional-nested.pipeline.yaml +36 -0
  637. package/examples/route-wiring-smoke-test/rejected/27-reject-if-on-loop.pipeline.yaml +63 -0
  638. package/examples/route-wiring-smoke-test/rejected/29-reject-if-on-failed.pipeline.yaml +46 -0
  639. package/examples/route-wiring-smoke-test/smoke-test.task.yaml +4 -0
  640. package/examples/route-wiring-smoke-test/stages/branch-a.yaml +12 -0
  641. package/examples/route-wiring-smoke-test/stages/branch-b.yaml +12 -0
  642. package/examples/route-wiring-smoke-test/stages/decide.yaml +12 -0
  643. package/examples/route-wiring-smoke-test/stages/finish.yaml +12 -0
  644. package/examples/ship-feature/README.md +190 -0
  645. package/examples/ship-feature/feat-address-feedback.yaml +119 -0
  646. package/examples/ship-feature/feat-implement.yaml +180 -0
  647. package/examples/ship-feature/feat-plan.yaml +120 -0
  648. package/examples/ship-feature/feat-review.yaml +109 -0
  649. package/examples/ship-feature/feat-ship.yaml +203 -0
  650. package/examples/ship-feature/ship-feature.pipeline.yaml +44 -0
  651. package/examples/ship-feature/ship-feature.task.yaml +78 -0
  652. package/examples/stage-mcp/README.md +145 -0
  653. package/examples/stage-mcp/echo-mcp.mjs +20 -0
  654. package/examples/stage-mcp/stage-mcp-dead.pipeline.yaml +5 -0
  655. package/examples/stage-mcp/stage-mcp-dead.task.yaml +3 -0
  656. package/examples/stage-mcp/stage-mcp-missing-var.pipeline.yaml +5 -0
  657. package/examples/stage-mcp/stage-mcp-missing-var.task.yaml +3 -0
  658. package/examples/stage-mcp/stage-mcp.pipeline.yaml +5 -0
  659. package/examples/stage-mcp/stage-mcp.task.yaml +4 -0
  660. package/examples/stage-mcp/use-echo.yaml +20 -0
  661. package/examples/stageflow.yaml +51 -0
  662. package/examples/verify-tour/README.md +80 -0
  663. package/examples/verify-tour/verify-tour.pipeline.yaml +162 -0
  664. package/examples/verify-tour/verify-tour.task.yaml +11 -0
  665. package/package.json +9 -1
  666. package/skills/stageflow/SKILL.md +6 -6
  667. package/skills/stageflow/references/control-surface.md +13 -5
  668. package/skills/stageflow/scripts/detect-host.mjs +14 -1
  669. package/skills/stageflow/scripts/detect-host.test.mjs +29 -1
  670. package/skills/stageflow-author/SKILL.md +4 -3
  671. package/skills/stageflow-author/references/catalog-mapping.md +16 -0
  672. package/skills/stageflow-author/references/catalog-write-conventions.md +1 -1
  673. package/skills/stageflow-author/references/stage-prompt-template.md +4 -4
  674. package/skills/stageflow-run/SKILL.md +22 -12
  675. package/skills/stageflow-run/references/mcp-call.md +9 -1
  676. package/skills/stageflow-run/references/task-and-pipeline-selection.md +19 -6
  677. package/skills/stageflow-run/scripts/mcp-call.mjs +46 -6
  678. package/skills/stageflow-run/scripts/mcp-call.test.mjs +64 -0
  679. package/skills/stageflow-session-capture/references/catalog-authoring.md +2 -0
  680. package/skills/stageflow-setup/SKILL.md +51 -8
  681. package/dist/ui/assets/index-Da5EHU6M.js +0 -119
@@ -12,6 +12,8 @@ import { recoveryRequiresCompletionIssue } from "./parseCompletionContract.js";
12
12
  import { validateCompletionContractForStage } from "./validateCompletionContract.js";
13
13
  import { applyCloneChains } from "./cloneChain.js";
14
14
  import { collectRouteIfSchemaIssues, collectRouteIfIllegalCombos, collectRouteAllGatedWarnings, } from "./routeIf.js";
15
+ import { mergeToolRequires } from "./toolRequires.js";
16
+ import { withBrowserRequires } from "./stageBrowser.js";
15
17
  function schemaCompileIssue(stageId, field, err, pipelineId) {
16
18
  const message = err instanceof Error ? err.message : String(err);
17
19
  if (err instanceof UnresolvedSchemaRefError) {
@@ -128,7 +130,7 @@ export async function loadPipelineFromObject(raw, options = {}) {
128
130
  }
129
131
  async function buildLoadedPipelineFromMerge(merge, options) {
130
132
  const { projectRoot, requireIo, pipelinePath } = options;
131
- const { entries: rawEntries, pipelineId, agent: pipelineAgent, model: pipelineModel, schemas: pipelineSchemas, warnings: mergeWarnings, } = merge;
133
+ const { entries: rawEntries, pipelineId, agent: pipelineAgent, model: pipelineModel, schemas: pipelineSchemas, requires: pipelineRequires, warnings: mergeWarnings, } = merge;
132
134
  const ctx = { pipelineId, path: pipelinePath };
133
135
  const warnings = [...mergeWarnings];
134
136
  const normalizeOutcome = normalizePipelineStageEntries(rawEntries, ctx);
@@ -181,7 +183,23 @@ async function buildLoadedPipelineFromMerge(merge, options) {
181
183
  if (!inlineOutcome.ok) {
182
184
  return loadFailure(inlineOutcome.issues);
183
185
  }
184
- stages.push(inlineOutcome.value);
186
+ let stage = inlineOutcome.value;
187
+ if (entry.requires !== undefined) {
188
+ const merged = mergeToolRequires([stage.requires, entry.requires], { pipelineId, label: `stage "${entry.id}"` });
189
+ if (!merged.ok)
190
+ return loadFailure(merged.issues);
191
+ stage = { ...stage, requires: merged.value };
192
+ }
193
+ const inlineRequires = withBrowserRequires(stage, {
194
+ pipelineId,
195
+ stageId: entry.id,
196
+ });
197
+ if (!inlineRequires.ok)
198
+ return loadFailure(inlineRequires.issues);
199
+ if (inlineRequires.value !== undefined) {
200
+ stage = { ...stage, requires: inlineRequires.value };
201
+ }
202
+ stages.push(stage);
185
203
  stageSources[stageId] = { kind: "inline" };
186
204
  continue;
187
205
  }
@@ -229,10 +247,25 @@ async function buildLoadedPipelineFromMerge(merge, options) {
229
247
  },
230
248
  ]);
231
249
  }
250
+ let stageRequires = stageOutcome.value.requires;
251
+ if (entry.requires !== undefined) {
252
+ const merged = mergeToolRequires([stageRequires, entry.requires], { pipelineId, label: `stage "${entry.id}"` });
253
+ if (!merged.ok)
254
+ return loadFailure(merged.issues);
255
+ stageRequires = merged.value;
256
+ }
257
+ const browser = entry.browser ?? stageOutcome.value.browser;
258
+ const fileRequires = withBrowserRequires({ browser, requires: stageRequires }, { pipelineId, stageId: entry.id });
259
+ if (!fileRequires.ok)
260
+ return loadFailure(fileRequires.issues);
261
+ stageRequires = fileRequires.value;
232
262
  const stage = {
233
263
  ...stageOutcome.value,
264
+ ...(browser !== undefined ? { browser } : {}),
234
265
  ...(entry.skill !== undefined ? { skill: entry.skill } : {}),
235
266
  ...(entry.mcp !== undefined ? { mcp: entry.mcp } : {}),
267
+ ...(entry.secrets !== undefined ? { secrets: entry.secrets } : {}),
268
+ ...(stageRequires !== undefined ? { requires: stageRequires } : {}),
236
269
  };
237
270
  stages.push(stage);
238
271
  stageSources[stageId] = { kind: "file", path: entry.body.absolutePath };
@@ -282,7 +315,11 @@ async function buildLoadedPipelineFromMerge(merge, options) {
282
315
  ...(pipelineAgent !== undefined ? { agent: pipelineAgent } : {}),
283
316
  ...(pipelineModel !== undefined ? { model: pipelineModel } : {}),
284
317
  ...(pipelineSchemas !== undefined ? { schemas: pipelineSchemas } : {}),
318
+ ...(pipelineRequires !== undefined ? { requires: pipelineRequires } : {}),
285
319
  };
320
+ const effectiveRequires = mergeToolRequires([pipelineRequires, ...loadedStages.map((s) => s.requires)], { pipelineId });
321
+ if (!effectiveRequires.ok)
322
+ return loadFailure(effectiveRequires.issues);
286
323
  const nodeById = new Map(dag.nodes.map((node) => [node.id, node]));
287
324
  for (const [stageId, after] of fileAfterById) {
288
325
  const node = nodeById.get(stageId);
@@ -7,6 +7,9 @@ import { parseModelField } from "./modelField.js";
7
7
  import { allowLegacyYamlAuthoring, dialectWarningForDocument, legacyAuthoringRejected, presentLegacyKeys, } from "./legacyYaml.js";
8
8
  import { parsePreEmitChecks } from "./parsePreEmitChecks.js";
9
9
  import { readYamlObject } from "./readYamlObject.js";
10
+ import { parseStageSecrets } from "../runtime/stageSecretDecl.js";
11
+ import { parseToolRequires } from "./toolRequires.js";
12
+ import { parseStageBrowser } from "./stageBrowser.js";
10
13
  import { classifyYamlDocument, compileTargetContract, dialectFromKeys, mixedDialectIssue, STAGE_FILE_WIRING_KEYS, } from "./yamlDialect.js";
11
14
  const afterCompletionByStage = new WeakMap();
12
15
  /** After-phase IR from target `verify` (`when` includes after). Stamped onto DAG `completion`. */
@@ -348,6 +351,28 @@ function parseStageFields(raw, label, entryId, deferSchemaRefs, requireIo, compi
348
351
  if (mcpOutcome.value !== undefined) {
349
352
  stage.mcp = mcpOutcome.value;
350
353
  }
354
+ const secretsOutcome = parseStageSecrets(raw.secrets, label, entryId);
355
+ if (!secretsOutcome.ok)
356
+ return secretsOutcome;
357
+ if (secretsOutcome.value !== undefined) {
358
+ stage.secrets = secretsOutcome.value;
359
+ }
360
+ const requiresOutcome = parseToolRequires(raw.requires, `stage ${label}`, {
361
+ code: "stage.invalid_requires",
362
+ category: "stage",
363
+ stageId: entryId,
364
+ });
365
+ if (!requiresOutcome.ok)
366
+ return requiresOutcome;
367
+ if (requiresOutcome.value !== undefined) {
368
+ stage.requires = requiresOutcome.value;
369
+ }
370
+ const browserOutcome = parseStageBrowser(raw.browser, label, entryId);
371
+ if (!browserOutcome.ok)
372
+ return browserOutcome;
373
+ if (browserOutcome.value !== undefined) {
374
+ stage.browser = browserOutcome.value;
375
+ }
351
376
  const agentField = parseAgentField(raw.agent);
352
377
  if (!agentField.ok) {
353
378
  return loadFailure([
@@ -6,6 +6,7 @@ import { loadFailure, loadSuccess } from "./loadOutcome.js";
6
6
  import { parseModelField } from "./modelField.js";
7
7
  const DEFAULT_PIPELINE_PATTERN = "*.pipeline.yaml";
8
8
  const DEFAULT_TASK_PATTERN = "*.task.yaml";
9
+ const DEFAULT_TRIGGER_PATTERN = "*.trigger.yaml";
9
10
  export function manifestPathForProject(projectRoot) {
10
11
  return path.join(projectRoot, "stageflow.yaml");
11
12
  }
@@ -39,6 +40,7 @@ function parsePatterns(raw, issues) {
39
40
  const defaults = {
40
41
  pipeline: DEFAULT_PIPELINE_PATTERN,
41
42
  task: DEFAULT_TASK_PATTERN,
43
+ trigger: DEFAULT_TRIGGER_PATTERN,
42
44
  };
43
45
  if (raw === undefined || raw === null) {
44
46
  return defaults;
@@ -58,15 +60,24 @@ function parsePatterns(raw, issues) {
58
60
  : typeof record.task === "string" && record.task.trim().length > 0
59
61
  ? record.task.trim()
60
62
  : null;
63
+ const trigger = record.trigger === undefined
64
+ ? defaults.trigger
65
+ : typeof record.trigger === "string" && record.trigger.trim().length > 0
66
+ ? record.trigger.trim()
67
+ : null;
61
68
  if (pipeline === null) {
62
69
  issues.push(catalogIssue("catalog.manifest_invalid", "catalog.patterns.pipeline must be a string"));
63
70
  }
64
71
  if (task === null) {
65
72
  issues.push(catalogIssue("catalog.manifest_invalid", "catalog.patterns.task must be a string"));
66
73
  }
74
+ if (trigger === null) {
75
+ issues.push(catalogIssue("catalog.manifest_invalid", "catalog.patterns.trigger must be a string"));
76
+ }
67
77
  return {
68
78
  pipeline: pipeline ?? defaults.pipeline,
69
79
  task: task ?? defaults.task,
80
+ trigger: trigger ?? defaults.trigger,
70
81
  };
71
82
  }
72
83
  export function parseStageflowManifestOutcome(yamlText, manifestPath, projectRoot) {
@@ -109,6 +120,14 @@ export function parseStageflowManifestOutcome(yamlText, manifestPath, projectRoo
109
120
  exclude = parsed;
110
121
  }
111
122
  }
123
+ const triggersRaw = catalogRecord.triggers;
124
+ let triggers;
125
+ if (triggersRaw !== undefined) {
126
+ const parsed = parseStringArray(triggersRaw, "triggers", issues);
127
+ if (parsed !== null) {
128
+ triggers = parsed;
129
+ }
130
+ }
112
131
  const patterns = parsePatterns(catalogRecord.patterns, issues);
113
132
  let agent;
114
133
  const agentField = parseAgentField(record.agent);
@@ -136,6 +155,9 @@ export function parseStageflowManifestOutcome(yamlText, manifestPath, projectRoo
136
155
  if (exclude !== undefined) {
137
156
  catalog.exclude = exclude;
138
157
  }
158
+ if (triggers !== undefined) {
159
+ catalog.triggers = triggers;
160
+ }
139
161
  if (catalogRecord.patterns !== undefined) {
140
162
  catalog.patterns = {};
141
163
  if (typeof catalogRecord.patterns.pipeline === "string") {
@@ -144,6 +166,9 @@ export function parseStageflowManifestOutcome(yamlText, manifestPath, projectRoo
144
166
  if (typeof catalogRecord.patterns.task === "string") {
145
167
  catalog.patterns.task = patterns.task;
146
168
  }
169
+ if (typeof catalogRecord.patterns.trigger === "string") {
170
+ catalog.patterns.trigger = patterns.trigger;
171
+ }
147
172
  }
148
173
  const manifest = {
149
174
  version: 1,
@@ -1,5 +1,7 @@
1
1
  import type { TaskFile } from "../types/task.js";
2
2
  import { type LoadOutcome } from "./loadOutcome.js";
3
+ /** Structural TaskFile shape only — does not enforce workspace binding XOR. */
4
+ export declare function coerceTaskFile(raw: unknown): TaskFile | undefined;
3
5
  export declare function parseTaskFile(raw: unknown, source?: string): LoadOutcome<TaskFile>;
4
6
  export declare function loadTaskFromYamlOutcome(yamlText: string, source?: string): LoadOutcome<TaskFile>;
5
7
  export declare function loadTaskOutcome(filePath: string): Promise<LoadOutcome<TaskFile>>;
@@ -1,12 +1,60 @@
1
1
  import { readFile } from "node:fs/promises";
2
2
  import { parse as parseYaml } from "yaml";
3
+ import { resolveWorkspaceBinding } from "../runtime/workspaceBinding.js";
3
4
  import { loadFailure, loadSuccess } from "./loadOutcome.js";
4
5
  function isPlainObject(value) {
5
6
  return typeof value === "object" && value !== null && !Array.isArray(value);
6
7
  }
7
- export function parseTaskFile(raw, source = "task") {
8
+ function parseGitIdentity(raw) {
9
+ if (!isPlainObject(raw))
10
+ return undefined;
11
+ const identity = {};
12
+ if (typeof raw.name === "string")
13
+ identity.name = raw.name;
14
+ if (typeof raw.email === "string")
15
+ identity.email = raw.email;
16
+ return identity;
17
+ }
18
+ /** Structural TaskFile shape only — does not enforce workspace binding XOR. */
19
+ export function coerceTaskFile(raw) {
8
20
  const record = raw;
9
21
  if (typeof record?.id !== "string" || typeof record?.goal !== "string") {
22
+ return undefined;
23
+ }
24
+ if (record.input !== undefined && !isPlainObject(record.input)) {
25
+ return undefined;
26
+ }
27
+ return {
28
+ id: record.id,
29
+ goal: record.goal,
30
+ context: typeof record.context === "string" ? record.context : undefined,
31
+ constraints: typeof record.constraints === "string" ? record.constraints : undefined,
32
+ checkout: typeof record.checkout === "string" ? record.checkout : undefined,
33
+ ...(typeof record.repository === "string" ? { repository: record.repository } : {}),
34
+ ...(typeof record.ref === "string" ? { ref: record.ref } : {}),
35
+ ...(typeof record.run_branch_template === "string"
36
+ ? { run_branch_template: record.run_branch_template }
37
+ : {}),
38
+ ...(isPlainObject(record.git_identity)
39
+ ? { git_identity: parseGitIdentity(record.git_identity) }
40
+ : {}),
41
+ ...(record.input !== undefined ? { input: record.input } : {}),
42
+ };
43
+ }
44
+ export function parseTaskFile(raw, source = "task") {
45
+ const record = raw;
46
+ const task = coerceTaskFile(raw);
47
+ if (task === undefined) {
48
+ if (typeof record?.id === "string" && typeof record?.goal === "string") {
49
+ return loadFailure([
50
+ {
51
+ code: "task.invalid_shape",
52
+ message: `Invalid ${source}: input must be an object`,
53
+ category: "task",
54
+ taskId: record.id,
55
+ },
56
+ ]);
57
+ }
10
58
  return loadFailure([
11
59
  {
12
60
  code: "task.invalid_shape",
@@ -16,24 +64,15 @@ export function parseTaskFile(raw, source = "task") {
16
64
  },
17
65
  ]);
18
66
  }
19
- if (record.input !== undefined && !isPlainObject(record.input)) {
20
- return loadFailure([
21
- {
22
- code: "task.invalid_shape",
23
- message: `Invalid ${source}: input must be an object`,
24
- category: "task",
25
- taskId: record.id,
26
- },
27
- ]);
67
+ const binding = resolveWorkspaceBinding(task);
68
+ if (!binding.ok) {
69
+ return loadFailure(binding.issues.map((issue) => {
70
+ if (issue.category !== "task")
71
+ return issue;
72
+ return { ...issue, taskId: task.id };
73
+ }));
28
74
  }
29
- return loadSuccess({
30
- id: record.id,
31
- goal: record.goal,
32
- context: typeof record.context === "string" ? record.context : undefined,
33
- constraints: typeof record.constraints === "string" ? record.constraints : undefined,
34
- checkout: typeof record.checkout === "string" ? record.checkout : undefined,
35
- ...(record.input !== undefined ? { input: record.input } : {}),
36
- });
75
+ return loadSuccess(task);
37
76
  }
38
77
  export function loadTaskFromYamlOutcome(yamlText, source = "task yaml") {
39
78
  let raw;
@@ -0,0 +1,9 @@
1
+ import type { TriggerFile } from "../types/trigger.js";
2
+ import { type LoadOutcome } from "./loadOutcome.js";
3
+ /** Structural TriggerFile shape only. */
4
+ export declare function coerceTriggerFile(raw: unknown): TriggerFile | undefined;
5
+ export declare function parseTriggerFile(raw: unknown, source?: string): LoadOutcome<TriggerFile>;
6
+ export declare function loadTriggerFromYamlOutcome(yamlText: string, source?: string): LoadOutcome<TriggerFile>;
7
+ export declare function loadTriggerOutcome(filePath: string): Promise<LoadOutcome<TriggerFile>>;
8
+ export declare function loadTriggerFromYaml(yamlText: string, source?: string): TriggerFile;
9
+ export declare function loadTrigger(filePath: string): Promise<TriggerFile>;
@@ -0,0 +1,120 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { parse as parseYaml } from "yaml";
3
+ import { loadFailure, loadSuccess } from "./loadOutcome.js";
4
+ function isPlainObject(value) {
5
+ return typeof value === "object" && value !== null && !Array.isArray(value);
6
+ }
7
+ function parseSchedule(raw) {
8
+ if (!isPlainObject(raw) || typeof raw.cron !== "string")
9
+ return undefined;
10
+ return {
11
+ cron: raw.cron,
12
+ ...(typeof raw.timezone === "string" ? { timezone: raw.timezone } : {}),
13
+ };
14
+ }
15
+ function parseEvent(raw) {
16
+ if (!isPlainObject(raw) || typeof raw.source !== "string")
17
+ return undefined;
18
+ return {
19
+ source: raw.source,
20
+ ...(isPlainObject(raw.match) ? { match: raw.match } : {}),
21
+ ...(isPlainObject(raw.config) ? { config: raw.config } : {}),
22
+ };
23
+ }
24
+ /** Structural TriggerFile shape only. */
25
+ export function coerceTriggerFile(raw) {
26
+ const record = raw;
27
+ if (typeof record?.id !== "string" ||
28
+ typeof record?.pipeline !== "string" ||
29
+ typeof record?.enabled !== "boolean") {
30
+ return undefined;
31
+ }
32
+ if (record.task !== undefined && typeof record.task !== "string") {
33
+ return undefined;
34
+ }
35
+ if (record.kind !== "manual" && record.kind !== "schedule" && record.kind !== "event") {
36
+ return undefined;
37
+ }
38
+ let schedule;
39
+ if (record.schedule !== undefined) {
40
+ schedule = parseSchedule(record.schedule);
41
+ if (schedule === undefined)
42
+ return undefined;
43
+ }
44
+ let event;
45
+ if (record.event !== undefined) {
46
+ event = parseEvent(record.event);
47
+ if (event === undefined)
48
+ return undefined;
49
+ }
50
+ return {
51
+ id: record.id,
52
+ pipeline: record.pipeline,
53
+ kind: record.kind,
54
+ enabled: record.enabled,
55
+ ...(typeof record.task === "string" ? { task: record.task } : {}),
56
+ ...(schedule !== undefined ? { schedule } : {}),
57
+ ...(event !== undefined ? { event } : {}),
58
+ };
59
+ }
60
+ export function parseTriggerFile(raw, source = "trigger") {
61
+ const record = raw;
62
+ const trigger = coerceTriggerFile(raw);
63
+ if (trigger === undefined) {
64
+ return loadFailure([
65
+ {
66
+ code: "trigger.invalid_shape",
67
+ message: `Invalid ${source}: id, pipeline, kind, and enabled are required`,
68
+ category: "trigger",
69
+ triggerId: typeof record?.id === "string" ? record.id : undefined,
70
+ },
71
+ ]);
72
+ }
73
+ return loadSuccess(trigger);
74
+ }
75
+ export function loadTriggerFromYamlOutcome(yamlText, source = "trigger yaml") {
76
+ let raw;
77
+ try {
78
+ raw = parseYaml(yamlText);
79
+ }
80
+ catch (err) {
81
+ const message = err instanceof Error ? err.message : String(err);
82
+ return loadFailure([
83
+ {
84
+ code: "trigger.load_error",
85
+ message,
86
+ category: "trigger",
87
+ },
88
+ ]);
89
+ }
90
+ return parseTriggerFile(raw, source);
91
+ }
92
+ export async function loadTriggerOutcome(filePath) {
93
+ let yamlText;
94
+ try {
95
+ yamlText = await readFile(filePath, "utf8");
96
+ }
97
+ catch (err) {
98
+ const message = err instanceof Error ? err.message : String(err);
99
+ return loadFailure([
100
+ {
101
+ code: "trigger.load_error",
102
+ message,
103
+ category: "trigger",
104
+ },
105
+ ]);
106
+ }
107
+ return loadTriggerFromYamlOutcome(yamlText, `trigger file ${filePath}`);
108
+ }
109
+ export function loadTriggerFromYaml(yamlText, source = "trigger yaml") {
110
+ const outcome = loadTriggerFromYamlOutcome(yamlText, source);
111
+ if (!outcome.ok)
112
+ throw new Error(outcome.issues[0].message);
113
+ return outcome.value;
114
+ }
115
+ export async function loadTrigger(filePath) {
116
+ const outcome = await loadTriggerOutcome(filePath);
117
+ if (!outcome.ok)
118
+ throw new Error(outcome.issues[0].message);
119
+ return outcome.value;
120
+ }
@@ -29,7 +29,11 @@ export async function materializeStageModels(stages, options) {
29
29
  if (!modelOutcome.ok) {
30
30
  return loadFailure(modelOutcome.issues);
31
31
  }
32
- materialized.push({ ...stage, model: modelOutcome.value });
32
+ materialized.push({
33
+ ...stage,
34
+ model: modelOutcome.value.model,
35
+ model_tier: modelOutcome.value.tier,
36
+ });
33
37
  }
34
38
  return loadSuccess(materialized);
35
39
  }
@@ -1,6 +1,7 @@
1
1
  import type { PayloadSchemaMap } from "../envelope/payloadSchema.js";
2
2
  import type { InlinePipelineDefinition } from "../types/pipeline.js";
3
3
  import { type LoadIssue, type LoadOutcome } from "./loadOutcome.js";
4
+ import { type ToolRequirement } from "./toolRequires.js";
4
5
  export type RawMergedEntry = {
5
6
  raw: unknown;
6
7
  declaringPath: string;
@@ -11,6 +12,7 @@ export declare function mergePipelineStages(rootPath: string): Promise<LoadOutco
11
12
  agent?: string;
12
13
  model?: string;
13
14
  schemas?: PayloadSchemaMap;
15
+ requires?: ToolRequirement[];
14
16
  warnings: LoadIssue[];
15
17
  }>>;
16
18
  /** Synthetic `declaringPath` for stage entries with no backing file. */
@@ -21,5 +23,6 @@ export declare function mergeInlinePipelineStages(raw: InlinePipelineDefinition)
21
23
  agent?: string;
22
24
  model?: string;
23
25
  schemas?: PayloadSchemaMap;
26
+ requires?: ToolRequirement[];
24
27
  warnings: LoadIssue[];
25
28
  }>>;
@@ -4,6 +4,7 @@ import { loadFailure, loadSuccess } from "./loadOutcome.js";
4
4
  import { allowLegacyYamlAuthoring, dialectWarningForDocument, legacyAuthoringRejected, presentLegacyKeys, } from "./legacyYaml.js";
5
5
  import { parseModelField } from "./modelField.js";
6
6
  import { readYamlObject } from "./readYamlObject.js";
7
+ import { parseToolRequires } from "./toolRequires.js";
7
8
  import { classifyYamlDocument, collectDocumentKeys, mixedDialectIssue, } from "./yamlDialect.js";
8
9
  function isPlainObject(value) {
9
10
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -177,6 +178,14 @@ export async function mergePipelineStages(rootPath) {
177
178
  if (!schemasOutcome.ok)
178
179
  return schemasOutcome;
179
180
  const schemas = schemasOutcome.value;
181
+ const requiresOutcome = parseToolRequires(raw.requires, `pipeline ${absRoot}`, {
182
+ code: "pipeline.invalid_requires",
183
+ category: "pipeline",
184
+ pipelineId,
185
+ });
186
+ if (!requiresOutcome.ok)
187
+ return requiresOutcome;
188
+ const requires = requiresOutcome.value;
180
189
  const idLocations = new Map();
181
190
  const entries = [];
182
191
  const warnings = [];
@@ -198,6 +207,7 @@ export async function mergePipelineStages(rootPath) {
198
207
  ...(agent !== undefined ? { agent } : {}),
199
208
  ...(model !== undefined ? { model } : {}),
200
209
  ...(schemas !== undefined ? { schemas } : {}),
210
+ ...(requires !== undefined ? { requires } : {}),
201
211
  warnings,
202
212
  });
203
213
  }
@@ -252,6 +262,14 @@ export async function mergeInlinePipelineStages(raw) {
252
262
  if (!schemasOutcome.ok)
253
263
  return schemasOutcome;
254
264
  const schemas = schemasOutcome.value;
265
+ const requiresOutcome = parseToolRequires(raw.requires, `inline pipeline ${pipelineId}`, {
266
+ code: "pipeline.invalid_requires",
267
+ category: "pipeline",
268
+ pipelineId,
269
+ });
270
+ if (!requiresOutcome.ok)
271
+ return requiresOutcome;
272
+ const requires = requiresOutcome.value;
255
273
  const entries = [];
256
274
  for (let index = 0; index < raw.stages.length; index++) {
257
275
  const entry = raw.stages[index];
@@ -273,6 +291,7 @@ export async function mergeInlinePipelineStages(raw) {
273
291
  ...(agent !== undefined ? { agent } : {}),
274
292
  ...(model !== undefined ? { model } : {}),
275
293
  ...(schemas !== undefined ? { schemas } : {}),
294
+ ...(requires !== undefined ? { requires } : {}),
276
295
  warnings: [],
277
296
  });
278
297
  }
@@ -1,7 +1,8 @@
1
- import { execFileSync } from "node:child_process";
2
1
  import { randomBytes } from "node:crypto";
3
2
  import { readdir, readFile, rename, stat, unlink, writeFile } from "node:fs/promises";
4
3
  import path from "node:path";
4
+ import { runGitSync } from "../git/exec.js";
5
+ import { statusPorcelain } from "../git/operations.js";
5
6
  import { loadPipelineOutcome } from "./loadPipeline.js";
6
7
  import { afterCompletionForStage, loadStageOutcome } from "./loadStage.js";
7
8
  import { withLegacyYamlAllowedAsync } from "./legacyYaml.js";
@@ -104,11 +105,10 @@ function verifyFingerprint(items) {
104
105
  }
105
106
  function gitToplevel(cwd) {
106
107
  try {
107
- return execFileSync("git", ["rev-parse", "--show-toplevel"], {
108
+ return runGitSync({
108
109
  cwd,
109
- encoding: "utf8",
110
- stdio: ["ignore", "pipe", "ignore"],
111
- }).trim();
110
+ args: ["rev-parse", "--show-toplevel"],
111
+ }).stdout.trim();
112
112
  }
113
113
  catch {
114
114
  return null;
@@ -119,12 +119,7 @@ export function fileDirtyVsHead(absPath) {
119
119
  if (top === null)
120
120
  return true;
121
121
  try {
122
- const status = execFileSync("git", ["status", "--porcelain", "--", absPath], {
123
- cwd: top,
124
- encoding: "utf8",
125
- stdio: ["ignore", "pipe", "ignore"],
126
- });
127
- return status.trim().length > 0;
122
+ return statusPorcelain(top, absPath).trim().length > 0;
128
123
  }
129
124
  catch {
130
125
  return true;
@@ -0,0 +1,32 @@
1
+ import { type PipelineListing, type TaskListing } from "./browseCatalog.js";
2
+ import { type CatalogRoot, type ResolveCatalogRootsOptions } from "./resolveCatalogRoots.js";
3
+ export type CatalogRootError = {
4
+ project_root: string;
5
+ code: "catalog_root_unreadable" | "unknown_project_root";
6
+ message: string;
7
+ };
8
+ export type MultiProjectListResult<T> = {
9
+ items: T[];
10
+ root_errors: CatalogRootError[];
11
+ roots: CatalogRoot[];
12
+ tip?: string;
13
+ };
14
+ export declare const EMPTY_CATALOG_LIST_TIP = "No catalog entries listed. Register a project root (POST /api/projects or local sf run / ensure), ensure stageflow.yaml exists at that root, then retry list_pipelines / list_tasks. Packaged examples use project_root \"examples\" when present. Git is not required for discovery.";
15
+ export declare function listPipelinesMultiProject(options: ResolveCatalogRootsOptions & {
16
+ projectRootFilter?: string;
17
+ }): Promise<MultiProjectListResult<PipelineListing & {
18
+ project_root: string;
19
+ }>>;
20
+ export declare function listTasksMultiProject(options: ResolveCatalogRootsOptions & {
21
+ projectRootFilter?: string;
22
+ }): Promise<MultiProjectListResult<TaskListing & {
23
+ project_root: string;
24
+ }>>;
25
+ export declare function listModelsMultiProject(options: ResolveCatalogRootsOptions & {
26
+ projectRootFilter?: string;
27
+ }): Promise<MultiProjectListResult<{
28
+ id: string;
29
+ project_root: string;
30
+ }> & {
31
+ models: string[];
32
+ }>;