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
@@ -0,0 +1,150 @@
1
+ import { listModelsForContext, listPipelinesForContext, listTasksForContext, } from "./browseCatalog.js";
2
+ import { loadStageflowManifestOutcome, } from "./loadStageflowManifest.js";
3
+ import { findCatalogRoot, isRootReadable, resolveCatalogRoots, } from "./resolveCatalogRoots.js";
4
+ export 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.";
5
+ function listTip(itemsLength, root_errors) {
6
+ if (itemsLength > 0)
7
+ return undefined;
8
+ if (root_errors.some((e) => e.code === "unknown_project_root")) {
9
+ return undefined;
10
+ }
11
+ return EMPTY_CATALOG_LIST_TIP;
12
+ }
13
+ async function catalogContextForRoot(root) {
14
+ const outcome = await loadStageflowManifestOutcome(root.path);
15
+ if (!outcome.ok) {
16
+ return {
17
+ projectRoot: root.path,
18
+ manifest: null,
19
+ manifestStatus: "invalid",
20
+ issues: outcome.issues,
21
+ };
22
+ }
23
+ return {
24
+ projectRoot: root.path,
25
+ manifest: outcome.value,
26
+ manifestStatus: "ok",
27
+ issues: [],
28
+ };
29
+ }
30
+ async function selectRoots(options) {
31
+ const roots = await resolveCatalogRoots(options);
32
+ const root_errors = [];
33
+ if (options.projectRootFilter !== undefined) {
34
+ const match = findCatalogRoot(roots, options.projectRootFilter);
35
+ if (match === undefined) {
36
+ return {
37
+ roots,
38
+ selected: [],
39
+ root_errors: [
40
+ {
41
+ project_root: options.projectRootFilter,
42
+ code: "unknown_project_root",
43
+ message: `Unknown project_root: ${options.projectRootFilter}`,
44
+ },
45
+ ],
46
+ };
47
+ }
48
+ if (!(await isRootReadable(match.path))) {
49
+ return {
50
+ roots,
51
+ selected: [],
52
+ root_errors: [
53
+ {
54
+ project_root: match.project_root,
55
+ code: "catalog_root_unreadable",
56
+ message: `Catalog root is unreadable: ${match.project_root}`,
57
+ },
58
+ ],
59
+ };
60
+ }
61
+ return { roots, selected: [match], root_errors };
62
+ }
63
+ const selected = [];
64
+ for (const root of roots) {
65
+ if (!(await isRootReadable(root.path))) {
66
+ root_errors.push({
67
+ project_root: root.project_root,
68
+ code: "catalog_root_unreadable",
69
+ message: `Catalog root is unreadable: ${root.project_root}`,
70
+ });
71
+ continue;
72
+ }
73
+ selected.push(root);
74
+ }
75
+ return { roots, selected, root_errors };
76
+ }
77
+ function withListTip(result) {
78
+ const tip = listTip(result.items.length, result.root_errors);
79
+ return tip !== undefined ? { ...result, tip } : result;
80
+ }
81
+ export async function listPipelinesMultiProject(options) {
82
+ const { roots, selected, root_errors } = await selectRoots(options);
83
+ const items = [];
84
+ for (const root of selected) {
85
+ try {
86
+ const ctx = await catalogContextForRoot(root);
87
+ const pipelines = await listPipelinesForContext(ctx);
88
+ for (const p of pipelines) {
89
+ items.push({ ...p, project_root: root.project_root });
90
+ }
91
+ }
92
+ catch (err) {
93
+ root_errors.push({
94
+ project_root: root.project_root,
95
+ code: "catalog_root_unreadable",
96
+ message: err instanceof Error ? err.message : String(err),
97
+ });
98
+ }
99
+ }
100
+ return withListTip({ items, root_errors, roots });
101
+ }
102
+ export async function listTasksMultiProject(options) {
103
+ const { roots, selected, root_errors } = await selectRoots(options);
104
+ const items = [];
105
+ for (const root of selected) {
106
+ try {
107
+ const ctx = await catalogContextForRoot(root);
108
+ const tasks = await listTasksForContext(ctx);
109
+ for (const t of tasks) {
110
+ items.push({ ...t, project_root: root.project_root });
111
+ }
112
+ }
113
+ catch (err) {
114
+ root_errors.push({
115
+ project_root: root.project_root,
116
+ code: "catalog_root_unreadable",
117
+ message: err instanceof Error ? err.message : String(err),
118
+ });
119
+ }
120
+ }
121
+ return withListTip({ items, root_errors, roots });
122
+ }
123
+ export async function listModelsMultiProject(options) {
124
+ const { roots, selected, root_errors } = await selectRoots(options);
125
+ const items = [];
126
+ const modelSet = new Set();
127
+ for (const root of selected) {
128
+ try {
129
+ const ctx = await catalogContextForRoot(root);
130
+ const models = await listModelsForContext(ctx);
131
+ for (const id of models) {
132
+ modelSet.add(id);
133
+ items.push({ id, project_root: root.project_root });
134
+ }
135
+ }
136
+ catch (err) {
137
+ root_errors.push({
138
+ project_root: root.project_root,
139
+ code: "catalog_root_unreadable",
140
+ message: err instanceof Error ? err.message : String(err),
141
+ });
142
+ }
143
+ }
144
+ return {
145
+ items,
146
+ models: [...modelSet].sort((a, b) => a.localeCompare(b)),
147
+ root_errors,
148
+ roots,
149
+ };
150
+ }
@@ -7,6 +7,9 @@
7
7
  import path from "node:path";
8
8
  import { loadFailure, loadSuccess } from "./loadOutcome.js";
9
9
  import { parseStageMcp } from "./loadStage.js";
10
+ import { parseStageSecrets } from "../runtime/stageSecretDecl.js";
11
+ import { parseStageBrowser } from "./stageBrowser.js";
12
+ import { parseToolRequires } from "./toolRequires.js";
10
13
  import { legacyAuthoringRejected, presentLegacyKeys } from "./legacyYaml.js";
11
14
  import { compileTargetContract, dialectFromKeys, mixedDialectIssue, } from "./yamlDialect.js";
12
15
  import { BODY_KEYS, isAllowedPipelineStageEntryKey, } from "./pipelineStageKeys.js";
@@ -39,7 +42,12 @@ function extractBodyRaw(raw) {
39
42
  return body;
40
43
  }
41
44
  function hasBodyKey(raw) {
42
- return Object.keys(raw).some((key) => BODY_KEYS.has(key) && key !== "skill" && key !== "mcp");
45
+ return Object.keys(raw).some((key) => BODY_KEYS.has(key) &&
46
+ key !== "skill" &&
47
+ key !== "mcp" &&
48
+ key !== "secrets" &&
49
+ key !== "requires" &&
50
+ key !== "browser");
43
51
  }
44
52
  function readSkill(raw) {
45
53
  if (raw.skill === undefined)
@@ -112,6 +120,21 @@ export function normalizePipelineStageEntries(rawEntries, ctx) {
112
120
  if (!mcpOutcome.ok)
113
121
  return mcpOutcome;
114
122
  const mcp = mcpOutcome.value;
123
+ const secretsOutcome = parseStageSecrets(raw.secrets, `entry at index ${index} in ${declaringPath}`);
124
+ if (!secretsOutcome.ok)
125
+ return secretsOutcome;
126
+ const secrets = secretsOutcome.value;
127
+ const requiresOutcome = parseToolRequires(raw.requires, `stage entry at index ${index} in ${declaringPath}`, {
128
+ code: "stage.invalid_requires",
129
+ category: "stage",
130
+ });
131
+ if (!requiresOutcome.ok)
132
+ return requiresOutcome;
133
+ const requires = requiresOutcome.value;
134
+ const browserOutcome = parseStageBrowser(raw.browser, `entry at index ${index} in ${declaringPath}`, typeof raw.id === "string" ? raw.id : undefined);
135
+ if (!browserOutcome.ok)
136
+ return browserOutcome;
137
+ const browser = browserOutcome.value;
115
138
  if (uses && hasBody) {
116
139
  return loadFailure([
117
140
  {
@@ -339,6 +362,9 @@ export function normalizePipelineStageEntries(rawEntries, ctx) {
339
362
  ...(entryFlag !== undefined ? { entry: entryFlag } : {}),
340
363
  ...(skill !== undefined ? { skill } : {}),
341
364
  ...(mcp !== undefined ? { mcp } : {}),
365
+ ...(secrets !== undefined ? { secrets } : {}),
366
+ ...(requires !== undefined ? { requires } : {}),
367
+ ...(browser !== undefined ? { browser } : {}),
342
368
  ...(cloneCap !== undefined ? { clone_cap: cloneCap } : {}),
343
369
  ...(cloneMode !== undefined ? { clone_mode: cloneMode } : {}),
344
370
  };
@@ -124,6 +124,12 @@ function parseCheck(raw, stageId, index) {
124
124
  return failure(stageId, "completion", `checks[${index}]: unknown key "${unknown}"`);
125
125
  return loadSuccess({ id, type: "payload_schema" });
126
126
  }
127
+ if (raw.type === "browser_login") {
128
+ const unknown = hasOnlyKeys(raw, ["id", "type"]);
129
+ if (unknown)
130
+ return failure(stageId, "completion", `checks[${index}]: unknown key "${unknown}"`);
131
+ return loadSuccess({ id, type: "browser_login" });
132
+ }
127
133
  if (raw.type === "gate") {
128
134
  const unknown = hasOnlyKeys(raw, ["id", "type", "kind"]);
129
135
  if (unknown)
@@ -37,6 +37,9 @@ export const BODY_KEYS = new Set([
37
37
  "timeout_ms",
38
38
  "skill",
39
39
  "mcp",
40
+ "secrets",
41
+ "requires",
42
+ "browser",
40
43
  "io",
41
44
  "verify",
42
45
  ]);
@@ -0,0 +1,7 @@
1
+ import { type CreateDraftPackageInput, type DraftPackageWriteResult } from "./draftPackage.js";
2
+ export type PublishDraftPackageMode = "create" | "overwrite" | "auto";
3
+ export type PublishDraftPackageResult = {
4
+ write: DraftPackageWriteResult;
5
+ catalogChanged: boolean;
6
+ };
7
+ export declare function publishDraftPackage(projectRoot: string, input: CreateDraftPackageInput, mode: PublishDraftPackageMode): Promise<PublishDraftPackageResult>;
@@ -0,0 +1,25 @@
1
+ import { createDraftPackage, overwriteDraftPackage, } from "./draftPackage.js";
2
+ import { ensureCatalogScanRoot } from "./ensureCatalogScanRoot.js";
3
+ export async function publishDraftPackage(projectRoot, input, mode) {
4
+ let write;
5
+ if (mode === "create") {
6
+ write = await createDraftPackage(projectRoot, input);
7
+ }
8
+ else if (mode === "overwrite") {
9
+ write = await overwriteDraftPackage(projectRoot, input);
10
+ }
11
+ else {
12
+ const created = await createDraftPackage(projectRoot, input);
13
+ if (created.ok || created.status !== 409) {
14
+ write = created;
15
+ }
16
+ else {
17
+ write = await overwriteDraftPackage(projectRoot, input);
18
+ }
19
+ }
20
+ if (!write.ok) {
21
+ return { write, catalogChanged: false };
22
+ }
23
+ const catalogChanged = await ensureCatalogScanRoot(projectRoot, input.directory);
24
+ return { write, catalogChanged };
25
+ }
@@ -1,7 +1,7 @@
1
1
  import { resolveStageflowContext, } from "../project/resolveStageflowContext.js";
2
2
  export function catalogContextFromStageflow(ctx) {
3
3
  return {
4
- projectRoot: ctx.isGitProject ? ctx.projectRoot : null,
4
+ projectRoot: ctx.manifestStatus === "not_git" ? null : ctx.projectRoot,
5
5
  manifest: ctx.manifest,
6
6
  manifestStatus: ctx.manifestStatus,
7
7
  issues: ctx.manifestIssues,
@@ -0,0 +1,27 @@
1
+ import type { RunStore } from "../runstore/port.js";
2
+ export type CatalogRootKind = "registered" | "seeded";
3
+ export type CatalogRoot = {
4
+ /** Wire id: absolute path for registered; symbolic id for seeded (e.g. "examples"). */
5
+ project_root: string;
6
+ /** Absolute filesystem path used for browsing. */
7
+ path: string;
8
+ kind: CatalogRootKind;
9
+ read_only: boolean;
10
+ };
11
+ export type ResolveCatalogRootsOptions = {
12
+ store: RunStore;
13
+ /** Unused for catalog membership; retained so call sites may still pass Host cwd. */
14
+ bootCwd?: string;
15
+ /** Optional seeded roots (U10); default none. */
16
+ seededRoots?: Array<{
17
+ id: string;
18
+ path: string;
19
+ }>;
20
+ };
21
+ /**
22
+ * Root set = registered store roots ∪ seeded roots.
23
+ * Wire project_root for seeded is the symbolic id; store/capacity use absolute paths.
24
+ */
25
+ export declare function resolveCatalogRoots(options: ResolveCatalogRootsOptions): Promise<CatalogRoot[]>;
26
+ export declare function isRootReadable(rootPath: string): Promise<boolean>;
27
+ export declare function findCatalogRoot(roots: CatalogRoot[], projectRoot: string): CatalogRoot | undefined;
@@ -0,0 +1,76 @@
1
+ import path from "node:path";
2
+ import { realpathSync, constants } from "node:fs";
3
+ import { access } from "node:fs/promises";
4
+ function realOrResolve(p) {
5
+ const resolved = path.resolve(p);
6
+ try {
7
+ return realpathSync(resolved);
8
+ }
9
+ catch {
10
+ return resolved;
11
+ }
12
+ }
13
+ /**
14
+ * Root set = registered store roots ∪ seeded roots.
15
+ * Wire project_root for seeded is the symbolic id; store/capacity use absolute paths.
16
+ */
17
+ export async function resolveCatalogRoots(options) {
18
+ const roots = [];
19
+ const seenPaths = new Set();
20
+ const seededRoots = options.seededRoots ??
21
+ (await import("./seededCatalog.js")).defaultSeededRoots();
22
+ let registered = [];
23
+ try {
24
+ registered = await options.store.listRegisteredProjects();
25
+ }
26
+ catch {
27
+ registered = [];
28
+ }
29
+ for (const root of registered) {
30
+ const abs = realOrResolve(root);
31
+ if (seenPaths.has(abs))
32
+ continue;
33
+ seenPaths.add(abs);
34
+ roots.push({
35
+ project_root: abs,
36
+ path: abs,
37
+ kind: "registered",
38
+ read_only: false,
39
+ });
40
+ }
41
+ for (const seeded of seededRoots) {
42
+ const abs = realOrResolve(seeded.path);
43
+ if (seenPaths.has(abs))
44
+ continue;
45
+ seenPaths.add(abs);
46
+ roots.push({
47
+ project_root: seeded.id,
48
+ path: abs,
49
+ kind: "seeded",
50
+ read_only: true,
51
+ });
52
+ }
53
+ return roots;
54
+ }
55
+ export async function isRootReadable(rootPath) {
56
+ try {
57
+ await access(rootPath, constants.R_OK);
58
+ return true;
59
+ }
60
+ catch {
61
+ return false;
62
+ }
63
+ }
64
+ export function findCatalogRoot(roots, projectRoot) {
65
+ if (!path.isAbsolute(projectRoot)) {
66
+ return roots.find((r) => r.project_root === projectRoot);
67
+ }
68
+ const normalized = realOrResolve(projectRoot);
69
+ const resolved = path.resolve(projectRoot);
70
+ return roots.find((r) => r.project_root === projectRoot ||
71
+ r.path === projectRoot ||
72
+ r.project_root === resolved ||
73
+ r.path === resolved ||
74
+ r.project_root === normalized ||
75
+ r.path === normalized);
76
+ }
@@ -8,6 +8,12 @@ export type ModelSelection = {
8
8
  /** Stage yaml / inline `model`; overrides pipeline/global. */
9
9
  stage?: string;
10
10
  };
11
+ export type ModelAuthoredTier = "stage" | "pipeline" | "global";
12
+ export type ResolvedModelSelection = {
13
+ model: string;
14
+ tier: ModelAuthoredTier;
15
+ };
16
+ export declare function modelAuthoredTier(selection: ModelSelection): ModelAuthoredTier;
11
17
  /**
12
18
  * stage > pipeline > global. No silent hardcoded fallback — unset is a load error.
13
19
  * Present-but-empty / whitespace follows parseModelField (load failure, not "").
@@ -15,6 +21,6 @@ export type ModelSelection = {
15
21
  export declare function resolveModelOutcome(selection: ModelSelection, ctx: {
16
22
  stageId: string;
17
23
  pipelineId: string;
18
- }): LoadOutcome<string>;
24
+ }): LoadOutcome<ResolvedModelSelection>;
19
25
  /** The global tier's model id from an already-loaded manifest, or undefined when missing/unset. */
20
26
  export declare function globalModelFromManifest(loaded: LoadedManifest | null): string | undefined;
@@ -1,5 +1,12 @@
1
1
  import { loadFailure, loadSuccess } from "./loadOutcome.js";
2
2
  import { parseModelField } from "./modelField.js";
3
+ export function modelAuthoredTier(selection) {
4
+ if (selection.stage !== undefined)
5
+ return "stage";
6
+ if (selection.pipeline !== undefined)
7
+ return "pipeline";
8
+ return "global";
9
+ }
3
10
  /**
4
11
  * stage > pipeline > global. No silent hardcoded fallback — unset is a load error.
5
12
  * Present-but-empty / whitespace follows parseModelField (load failure, not "").
@@ -27,7 +34,10 @@ export function resolveModelOutcome(selection, ctx) {
27
34
  },
28
35
  ]);
29
36
  }
30
- return loadSuccess(parsed.value);
37
+ return loadSuccess({
38
+ model: parsed.value,
39
+ tier: modelAuthoredTier(selection),
40
+ });
31
41
  }
32
42
  /** The global tier's model id from an already-loaded manifest, or undefined when missing/unset. */
33
43
  export function globalModelFromManifest(loaded) {
@@ -18,7 +18,7 @@ function wrapRawStagesForNormalize(rawStages, ctx) {
18
18
  }
19
19
  const id = typeof raw.id === "string" && raw.id ? raw.id : undefined;
20
20
  const hasUses = typeof raw.uses === "string";
21
- const hasBody = Object.keys(raw).some((key) => BODY_KEYS.has(key) && key !== "skill" && key !== "mcp");
21
+ const hasBody = Object.keys(raw).some((key) => BODY_KEYS.has(key) && key !== "skill" && key !== "mcp" && key !== "browser");
22
22
  if (hasUses || hasBody || !id) {
23
23
  return { raw, declaringPath: ctx.path };
24
24
  }
@@ -1,4 +1,4 @@
1
- export type StageMcpErrorCode = "missing_catalog" | "unknown_server" | "reserved_name" | "unresolved_var" | "invalid_config" | "connect_failed";
1
+ export type StageMcpErrorCode = "missing_catalog" | "unknown_server" | "reserved_name" | "unresolved_var" | "invalid_config" | "untrusted_config_origin" | "connect_failed";
2
2
  export declare class StageMcpError extends Error {
3
3
  readonly code: StageMcpErrorCode;
4
4
  constructor(message: string, code: StageMcpErrorCode);
@@ -15,6 +15,7 @@ export type InspectedMcpCatalog = {
15
15
  };
16
16
  export declare function mcpCatalogPath(projectRoot: string): string;
17
17
  export declare function parseMcpCatalog(raw: string, catalogPath?: string): McpCatalogServers;
18
+ export declare function mcpCatalogExists(projectRoot: string): Promise<boolean>;
18
19
  export declare function loadMcpCatalog(projectRoot: string): Promise<InspectedMcpCatalog>;
19
20
  export type ProjectMcpCatalogTransport = "stdio" | "http";
20
21
  export type ProjectMcpCatalogEntry = {
@@ -32,4 +33,11 @@ export declare function resolveStageMcpServers(options: {
32
33
  projectRoot: string;
33
34
  allowlist?: readonly string[];
34
35
  env: NodeJS.ProcessEnv;
36
+ stageId?: string;
37
+ bindingKind?: "repository" | "checkout" | "none";
38
+ trustWorkspaceConfig?: string[];
39
+ /** Host project root used for trust_workspace_config allowlist matching. */
40
+ trustProjectRoot?: string;
41
+ /** When true, .mcp.json is treated as workspace-sourced. */
42
+ workspaceSourced?: boolean;
35
43
  }): Promise<ResolvedMcpServers>;
@@ -51,6 +51,18 @@ export function parseMcpCatalog(raw, catalogPath = MCP_CATALOG_FILENAME) {
51
51
  }
52
52
  return servers;
53
53
  }
54
+ export async function mcpCatalogExists(projectRoot) {
55
+ try {
56
+ await readFile(mcpCatalogPath(projectRoot), "utf8");
57
+ return true;
58
+ }
59
+ catch (err) {
60
+ const code = err.code;
61
+ if (code === "ENOENT")
62
+ return false;
63
+ throw err;
64
+ }
65
+ }
54
66
  export async function loadMcpCatalog(projectRoot) {
55
67
  const catalogPath = mcpCatalogPath(projectRoot);
56
68
  let raw;
@@ -108,7 +120,7 @@ export function assertMcpAllowlistKnown(servers, allowlist) {
108
120
  const INTERPOLATION_TOKEN = /\$\{([^}]*)\}/g;
109
121
  const ENV_VAR_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
110
122
  const ENV_VAR_WITH_DEFAULT = /^([A-Za-z_][A-Za-z0-9_]*):-(.*)$/;
111
- function interpolateString(value, env, serverName) {
123
+ function interpolateString(value, env, serverName, stageId) {
112
124
  return value.replace(INTERPOLATION_TOKEN, (_match, inner) => {
113
125
  const withDefault = ENV_VAR_WITH_DEFAULT.exec(inner);
114
126
  if (withDefault) {
@@ -120,24 +132,27 @@ function interpolateString(value, env, serverName) {
120
132
  if (found !== undefined) {
121
133
  return found;
122
134
  }
123
- throw new StageMcpError(`Unresolved MCP catalog variable "${inner}"`, "unresolved_var");
135
+ const stagePart = stageId !== undefined ? ` (stage "${stageId}")` : "";
136
+ throw new StageMcpError(`Unresolved MCP catalog variable "${inner}" for server "${serverName}"${stagePart}. Declare it in secrets: (use as: env for tokens needed in MCP env) or use \${${inner}:-default}.`, "unresolved_var");
124
137
  }
125
138
  throw new StageMcpError(`MCP catalog server "${serverName}" has an invalid interpolation form`, "invalid_config");
126
139
  });
127
140
  }
128
- function interpolateField(key, value, env, serverName) {
141
+ function interpolateField(key, value, env, serverName, stageId) {
129
142
  if ((key === "command" || key === "url" || key === "cwd") && typeof value === "string") {
130
- return interpolateString(value, env, serverName);
143
+ return interpolateString(value, env, serverName, stageId);
131
144
  }
132
145
  if (key === "args" && Array.isArray(value)) {
133
- return value.map((item) => typeof item === "string" ? interpolateString(item, env, serverName) : item);
146
+ return value.map((item) => typeof item === "string"
147
+ ? interpolateString(item, env, serverName, stageId)
148
+ : item);
134
149
  }
135
150
  if ((key === "env" || key === "headers") && isPlainObject(value)) {
136
151
  const copied = {};
137
152
  for (const [field, fieldValue] of Object.entries(value)) {
138
153
  copied[field] =
139
154
  typeof fieldValue === "string"
140
- ? interpolateString(fieldValue, env, serverName)
155
+ ? interpolateString(fieldValue, env, serverName, stageId)
141
156
  : fieldValue;
142
157
  }
143
158
  return copied;
@@ -185,10 +200,10 @@ function stampSpawnRoot(resolved, projectRoot, serverName) {
185
200
  }
186
201
  return resolved;
187
202
  }
188
- function interpolateServer(entry, env, serverName, projectRoot) {
203
+ function interpolateServer(entry, env, serverName, projectRoot, stageId) {
189
204
  const resolved = {};
190
205
  for (const [key, value] of Object.entries(entry)) {
191
- resolved[key] = interpolateField(key, value, env, serverName);
206
+ resolved[key] = interpolateField(key, value, env, serverName, stageId);
192
207
  }
193
208
  return stampSpawnRoot(resolved, projectRoot, serverName);
194
209
  }
@@ -197,11 +212,23 @@ export async function resolveStageMcpServers(options) {
197
212
  if (allowlist.length === 0) {
198
213
  return {};
199
214
  }
215
+ if (options.workspaceSourced === true) {
216
+ const { decideWorkspaceConfigTrust } = await import("./configOrigin.js");
217
+ const decision = decideWorkspaceConfigTrust({
218
+ bindingKind: options.bindingKind ?? "none",
219
+ projectRoot: options.trustProjectRoot ?? options.projectRoot,
220
+ trustWorkspaceConfig: options.trustWorkspaceConfig,
221
+ source: "workspace",
222
+ });
223
+ if (!decision.allow) {
224
+ throw new StageMcpError(decision.message ?? "untrusted_config_origin", "untrusted_config_origin");
225
+ }
226
+ }
200
227
  const catalog = await loadMcpCatalog(options.projectRoot);
201
228
  assertMcpAllowlistKnown(catalog.servers, allowlist);
202
229
  const resolved = {};
203
230
  for (const name of allowlist) {
204
- resolved[name] = interpolateServer(catalog.servers[name], options.env, name, options.projectRoot);
231
+ resolved[name] = interpolateServer(catalog.servers[name], options.env, name, options.projectRoot, options.stageId);
205
232
  }
206
233
  return resolved;
207
234
  }
@@ -1,4 +1,4 @@
1
1
  import type { LoadedManifest } from "../types/stageflowManifest.js";
2
- export type CatalogPathKind = "pipeline" | "task";
2
+ export type CatalogPathKind = "pipeline" | "task" | "trigger";
3
3
  export declare function isExcluded(repoRelPath: string, exclude: string[] | undefined): boolean;
4
4
  export declare function scanCatalogPaths(manifest: LoadedManifest, kind: CatalogPathKind): Promise<string[]>;
@@ -60,8 +60,12 @@ async function expandCatalogEntry(projectRoot, entry, kind, pattern) {
60
60
  }
61
61
  export async function scanCatalogPaths(manifest, kind) {
62
62
  const { projectRoot, manifest: doc, patterns } = manifest;
63
- const entries = kind === "pipeline" ? doc.catalog.pipelines : doc.catalog.tasks;
64
- const pattern = kind === "pipeline" ? patterns.pipeline : patterns.task;
63
+ const entries = kind === "pipeline"
64
+ ? doc.catalog.pipelines
65
+ : kind === "task"
66
+ ? doc.catalog.tasks
67
+ : (doc.catalog.triggers ?? []);
68
+ const pattern = kind === "pipeline" ? patterns.pipeline : kind === "task" ? patterns.task : patterns.trigger;
65
69
  const exclude = doc.catalog.exclude;
66
70
  const seen = new Set();
67
71
  const resolved = [];
@@ -0,0 +1,9 @@
1
+ export declare class SecretFromEnvError extends Error {
2
+ readonly code = "config_invalid";
3
+ constructor(message: string);
4
+ }
5
+ /**
6
+ * Read a secret from `NAME` or `NAME_FILE`. Both set → error.
7
+ * File values trim exactly one trailing newline (`\n` or `\r\n`).
8
+ */
9
+ export declare function readSecretFromEnvOrFile(env: NodeJS.ProcessEnv, name: string): string | undefined;
@@ -0,0 +1,34 @@
1
+ import { readFileSync } from "node:fs";
2
+ export class SecretFromEnvError extends Error {
3
+ code = "config_invalid";
4
+ constructor(message) {
5
+ super(message);
6
+ this.name = "SecretFromEnvError";
7
+ }
8
+ }
9
+ /**
10
+ * Read a secret from `NAME` or `NAME_FILE`. Both set → error.
11
+ * File values trim exactly one trailing newline (`\n` or `\r\n`).
12
+ */
13
+ export function readSecretFromEnvOrFile(env, name) {
14
+ const fileKey = `${name}_FILE`;
15
+ const plain = env[name];
16
+ const filePath = env[fileKey];
17
+ const hasPlain = plain !== undefined && plain.length > 0;
18
+ const hasFile = filePath !== undefined && filePath.length > 0;
19
+ if (hasPlain && hasFile) {
20
+ throw new SecretFromEnvError(`Set only one of ${name} or ${fileKey}, not both`);
21
+ }
22
+ if (hasFile) {
23
+ try {
24
+ return readFileSync(filePath, "utf8").replace(/\r?\n$/, "");
25
+ }
26
+ catch (err) {
27
+ const detail = err instanceof Error ? err.message : String(err);
28
+ throw new SecretFromEnvError(`Failed to read ${fileKey}=${filePath}: ${detail}`);
29
+ }
30
+ }
31
+ if (hasPlain)
32
+ return plain;
33
+ return undefined;
34
+ }
@@ -0,0 +1,11 @@
1
+ /** Symbolic wire id for the packaged examples catalog root. */
2
+ export declare const SEEDED_EXAMPLES_ID = "examples";
3
+ /**
4
+ * Absolute path to packaged `examples/` when present next to the package root.
5
+ * Does not git-init; callers build CatalogContext with fixed projectRoot + manifest.
6
+ */
7
+ export declare function resolveSeededExamplesPath(fromUrl?: string): string | undefined;
8
+ export declare function defaultSeededRoots(): Array<{
9
+ id: string;
10
+ path: string;
11
+ }>;