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
package/dist/cli.js CHANGED
@@ -5,37 +5,54 @@ import { realpathSync } from "node:fs";
5
5
  import path from "node:path";
6
6
  import { fileURLToPath } from "node:url";
7
7
  import { globalAgentBackendFromManifest, resolveAgentPort } from "./agent/resolveAgentPort.js";
8
+ import { BROWSER_USAGE, runBrowserCommand } from "./cli/browserCommand.js";
8
9
  import { ARTIFACT_USAGE, runArtifactCommand } from "./cli/artifactCommand.js";
9
10
  import { ENVELOPE_USAGE, runEnvelopeCommand, } from "./cli/envelopeCommand.js";
10
11
  import { EXPORT_RUN_USAGE, runExportRunCommand, } from "./cli/exportRunCommand.js";
12
+ import { DEBUG_RUN_USAGE, runDebugRunCommand, } from "./cli/debugRunCommand.js";
13
+ import { BACKUP_USAGE, runBackupCommand, } from "./cli/backupCommand.js";
14
+ import { RESTORE_USAGE, runRestoreCommand, } from "./cli/restoreCommand.js";
15
+ import { EXPORT_ALL_USAGE, runExportAllCommand, } from "./cli/exportAllCommand.js";
11
16
  import { INIT_USAGE, runInitCommand } from "./cli/initCommand.js";
12
17
  import { PROVIDERS_USAGE, runProvidersCommand } from "./cli/providersCommand.js";
13
18
  import { RUN_USAGE, runRunCommand } from "./cli/runCommand.js";
14
19
  import { RUN_STAGE_USAGE, runRunStageCommand } from "./cli/runStageCommand.js";
15
20
  import { RUNS_USAGE, runRunsCommand } from "./cli/runsCommand.js";
21
+ import { TRIGGER_USAGE, runTriggerCommand } from "./cli/triggerCommand.js";
16
22
  import { resolveOperatorCatalog } from "./cli/operatorCatalog.js";
17
23
  import { SKILLS_USAGE, runSkillsCommand } from "./cli/skillsCommand.js";
18
24
  import { VALIDATE_USAGE, runValidateCommand } from "./cli/validateCommand.js";
19
25
  import { GRAPH_USAGE, runGraphCommand } from "./cli/graphCommand.js";
20
26
  import { MIGRATE_YAML_USAGE, runMigrateYamlCommand } from "./cli/migrateYamlCommand.js";
21
- import { createRunStore } from "./runstore/createStore.js";
27
+ import { DOCTOR_USAGE, runDoctorCommand } from "./cli/doctorCommand.js";
22
28
  import { resolveStageflowContext } from "./project/resolveStageflowContext.js";
23
29
  import { exitForOutcome, runStageWorker } from "./runtime/stageWorker.js";
30
+ import { scheduleExitWithDrain } from "./runtime/stageWorkerProtocol.js";
24
31
  import { SF_STAGE_WORKER } from "./runtime/stageWorkerProtocol.js";
25
32
  import { DEFAULT_PORT, startUiServer } from "./server/http.js";
26
33
  import { startMcpServer } from "./server/mcpHost.js";
34
+ import { resolveListenHost } from "./server/listenHost.js";
35
+ import { assertBindAllowed, BindRefusedError, loadControlTokens, } from "./server/controlToken.js";
27
36
  import { resolveMcpStateless } from "./mcp/server.js";
28
- import { PACKAGE_VERSION } from "./package-meta.js";
37
+ import { PACKAGE_VERSION, BUILD_SHA } from "./package-meta.js";
38
+ import { installProxyDispatcher } from "./net/proxy.js";
39
+ import { warnMissingCaPaths } from "./preflight/tls.js";
40
+ import { logger as cliLogger } from "./logging/logger.js";
29
41
  const USAGE = `Usage:
30
42
  sf init
31
- sf run --task <path> --pipeline <path> [--checkout <path>] [--json] [--include stages] [--skip-gates] [--git-sha <sha>] [--ci-pr-url <url>] [--ci-job-url <url>] [--operator-cwd <path>] [--operator-agent-dir <path>]
43
+ sf run --task <path> --pipeline <path> [--checkout <path>] [--repository <owner/repo>] [--ref <ref>] [--json] [--include stages] [--skip-gates] [--git-sha <sha>] [--ci-pr-url <url>] [--ci-job-url <url>] [--operator-cwd <path>] [--operator-agent-dir <path>]
32
44
  sf run-stage (--stage <path> | --stage-inline '<json>') (--task <path> | --task-inline '<json>' | --envelope-ref <runId>:<stageId>[:<attempt>]) [--checkout <path>] [--model <id>] [--blocking] [--timeout-ms <n>] [--json]
33
45
  sf validate [--pipeline <path>] [--task <path>] [--strict] [--json]
46
+ sf doctor [--json] [--pipeline <path>] [--strict]
34
47
  sf graph --pipeline <path> [--json]
35
48
  sf migrate-yaml [path] [--root <path>] [--write] [--json] [--force]
36
49
  sf artifact read --run <runId> --path <relPath> [--out <file>]
37
50
  sf envelope get --run <runId> --stage <stageId> [--json] [--from <sf-run.json>] [--detect-stage <id>] [--format envelope|handoff]
38
51
  sf export-run --run <runId> [--from <sf-run.json>] [--out <file>]
52
+ sf debug-run <runId> [--out <file>]
53
+ sf backup [--out <file>] [--db-only] [--no-credentials] [--include-a2a-artifacts] [--json]
54
+ sf restore <file> [--force] [--json]
55
+ sf export --all [--status <status>] [--since <iso>] [--pipeline <id-or-path>] [--out <file>]
39
56
  sf runs list [--status created|running|succeeded|failed] [--since <iso>] [--pipeline <id-or-path>] [--json]
40
57
  sf runs show --run <runId> [--from <sf-run.json>] [--json]
41
58
  sf runs verify --run <runId> --stage <stageId> [--json]
@@ -46,9 +63,9 @@ const USAGE = `Usage:
46
63
  sf runs retry --run <runId> --stage <stageId> [--json]
47
64
  sf runs resume --run <runId> --stage <stageId> [--json]
48
65
  sf runs abandon --run <runId> --stage <stageId> [--json]
49
- sf runs rerun --run <runId> [--json]
50
- sf ui [--port ${DEFAULT_PORT}] [--mcp-stateless]
51
- sf mcp [--port ${DEFAULT_PORT}] [--mcp-stateless]
66
+ sf runs rerun --run <runId> [--pinned] [--json]
67
+ sf ui [--host <addr>] [--port ${DEFAULT_PORT}] [--no-open] [--mcp-stateless]
68
+ sf mcp [--host <addr>] [--port ${DEFAULT_PORT}] [--mcp-stateless]
52
69
  sf providers list
53
70
  sf providers status [--provider <id>]
54
71
  sf providers detect
@@ -58,6 +75,11 @@ const USAGE = `Usage:
58
75
  sf skills list
59
76
  sf skills install --from-path <dir> [--skill-name <name>]
60
77
  sf skills install --from-zip <url-or-path> [--skill-name <name>] [--checksum sha256:<hex>]
78
+ sf browser profiles [--json]
79
+ sf browser status <name> [--json]
80
+ sf browser check <name> --url <url> --logged-in <glob> [--logged-out <glob>]... [--headless] [--json]
81
+ sf browser login <name> --url <login-url> --logged-in <glob> [--timeout-sec <n>]
82
+ sf browser clear <name> [--yes]
61
83
  sf --version
62
84
  sf -V
63
85
  sf --help
@@ -76,6 +98,8 @@ ${RUN_STAGE_USAGE}
76
98
 
77
99
  ${VALIDATE_USAGE}
78
100
 
101
+ ${DOCTOR_USAGE}
102
+
79
103
  ${GRAPH_USAGE}
80
104
 
81
105
  ${A2A_USAGE}
@@ -88,11 +112,23 @@ ${ENVELOPE_USAGE}
88
112
 
89
113
  ${EXPORT_RUN_USAGE}
90
114
 
115
+ ${DEBUG_RUN_USAGE}
116
+
117
+ ${BACKUP_USAGE}
118
+
119
+ ${RESTORE_USAGE}
120
+
121
+ ${EXPORT_ALL_USAGE}
122
+
91
123
  ${RUNS_USAGE}
92
124
 
125
+ ${TRIGGER_USAGE}
126
+
93
127
  ${PROVIDERS_USAGE}
94
128
 
95
- ${SKILLS_USAGE}`;
129
+ ${SKILLS_USAGE}
130
+
131
+ ${BROWSER_USAGE}`;
96
132
  function parseArgs(argv) {
97
133
  const args = argv.slice(2);
98
134
  if (args.length === 0) {
@@ -103,14 +139,17 @@ function parseArgs(argv) {
103
139
  return { help: true };
104
140
  }
105
141
  if (args[0] === "--version" || args[0] === "-V") {
106
- if (args.length > 1) {
107
- throw new Error(`Unexpected argument: ${args[1]}`);
142
+ const versionJson = args.includes("--json");
143
+ const rest = args.slice(1).filter((a) => a !== "--json");
144
+ if (rest.length > 0) {
145
+ throw new Error(`Unexpected argument: ${rest[0]}`);
108
146
  }
109
- return { help: false, version: true };
147
+ return { help: false, version: true, versionJson };
110
148
  }
111
149
  const command = args[0];
112
150
  if (command === "providers" ||
113
151
  command === "validate" ||
152
+ command === "doctor" ||
114
153
  command === "graph" ||
115
154
  command === "a2a" ||
116
155
  command === "migrate-yaml" ||
@@ -120,8 +159,14 @@ function parseArgs(argv) {
120
159
  command === "artifact" ||
121
160
  command === "envelope" ||
122
161
  command === "export-run" ||
162
+ command === "debug-run" ||
163
+ command === "backup" ||
164
+ command === "restore" ||
165
+ command === "export" ||
123
166
  command === "runs" ||
124
- command === "skills") {
167
+ command === "trigger" ||
168
+ command === "skills" ||
169
+ command === "browser") {
125
170
  return { help: false, command };
126
171
  }
127
172
  if (args.includes("--help") || args.includes("-h")) {
@@ -130,7 +175,11 @@ function parseArgs(argv) {
130
175
  let task;
131
176
  let pipeline;
132
177
  let port;
178
+ let host;
179
+ let noOpen = false;
133
180
  let checkout;
181
+ let repository;
182
+ let ref;
134
183
  let mcpStateless = false;
135
184
  for (let i = 1; i < args.length; i++) {
136
185
  if (args[i] === "--task") {
@@ -146,6 +195,20 @@ function parseArgs(argv) {
146
195
  }
147
196
  checkout = raw;
148
197
  }
198
+ else if (args[i] === "--repository") {
199
+ const raw = args[++i];
200
+ if (raw === undefined || raw.length === 0) {
201
+ throw new Error("Missing value for --repository");
202
+ }
203
+ repository = raw;
204
+ }
205
+ else if (args[i] === "--ref") {
206
+ const raw = args[++i];
207
+ if (raw === undefined || raw.length === 0) {
208
+ throw new Error("Missing value for --ref");
209
+ }
210
+ ref = raw;
211
+ }
149
212
  else if (args[i] === "--port") {
150
213
  const raw = args[++i];
151
214
  port = Number(raw);
@@ -153,11 +216,33 @@ function parseArgs(argv) {
153
216
  throw new Error(`Invalid --port: ${raw}`);
154
217
  }
155
218
  }
219
+ else if (args[i] === "--host") {
220
+ const raw = args[++i];
221
+ if (raw === undefined || raw.length === 0) {
222
+ throw new Error("Missing value for --host");
223
+ }
224
+ host = raw;
225
+ }
226
+ else if (args[i] === "--no-open") {
227
+ noOpen = true;
228
+ }
156
229
  else if (args[i] === "--mcp-stateless") {
157
230
  mcpStateless = true;
158
231
  }
159
232
  }
160
- return { help: false, command, task, pipeline, port, checkout, mcpStateless };
233
+ return {
234
+ help: false,
235
+ command,
236
+ task,
237
+ pipeline,
238
+ port,
239
+ host,
240
+ noOpen,
241
+ checkout,
242
+ repository,
243
+ ref,
244
+ mcpStateless,
245
+ };
161
246
  }
162
247
  export function parseRunStageArgs(argv) {
163
248
  let runId;
@@ -254,6 +339,9 @@ async function handleInternalRunStage(argv) {
254
339
  if (process.env[SF_STAGE_WORKER] !== "1") {
255
340
  process.env[SF_STAGE_WORKER] = "1";
256
341
  }
342
+ installProxyDispatcher(process.env, {
343
+ log: (msg) => cliLogger.info("proxy.dispatcher", msg),
344
+ });
257
345
  const parsed = parseRunStageArgs(argv);
258
346
  const outcome = await runStageWorker({
259
347
  runId: parsed.runId,
@@ -267,29 +355,55 @@ async function handleInternalRunStage(argv) {
267
355
  operatorCatalog: parsed.operatorCatalog,
268
356
  skipGates: parsed.skipGates,
269
357
  });
270
- exitForOutcome(outcome);
358
+ return exitForOutcome(outcome);
271
359
  }
272
360
  function openBrowser(url) {
273
361
  const platform = process.platform;
362
+ let child;
274
363
  if (platform === "darwin") {
275
- spawn("open", [url], { detached: true, stdio: "ignore" }).unref();
364
+ child = spawn("open", [url], { detached: true, stdio: "ignore" });
276
365
  }
277
366
  else if (platform === "win32") {
278
- spawn("cmd", ["/c", "start", "", url], { detached: true, stdio: "ignore" }).unref();
367
+ child = spawn("cmd", ["/c", "start", "", url], { detached: true, stdio: "ignore" });
279
368
  }
280
369
  else {
281
- spawn("xdg-open", [url], { detached: true, stdio: "ignore" }).unref();
370
+ child = spawn("xdg-open", [url], { detached: true, stdio: "ignore" });
282
371
  }
372
+ child.on("error", () => { });
373
+ child.unref();
374
+ }
375
+ function isNoOpenEnabled(flag, env = process.env) {
376
+ if (flag)
377
+ return true;
378
+ const raw = env.STAGEFLOW_NO_OPEN;
379
+ if (raw === undefined || raw.trim() === "")
380
+ return false;
381
+ const normalized = raw.trim().toLowerCase();
382
+ return normalized !== "0" && normalized !== "false";
283
383
  }
284
384
  async function main(argv) {
285
385
  try {
386
+ installProxyDispatcher(process.env, {
387
+ log: (msg) => cliLogger.info("proxy.dispatcher", msg),
388
+ });
389
+ for (const warning of warnMissingCaPaths(process.env)) {
390
+ cliLogger.warn("tls.ca_missing", `${warning.name} points to missing path: ${warning.path}`);
391
+ }
286
392
  const parsed = parseArgs(argv);
287
393
  if (parsed.help) {
288
394
  console.log(USAGE);
289
395
  return argv.slice(2).length === 0 ? 1 : 0;
290
396
  }
291
397
  if (parsed.version) {
292
- console.log(PACKAGE_VERSION);
398
+ if (parsed.versionJson) {
399
+ console.log(JSON.stringify({
400
+ version: PACKAGE_VERSION,
401
+ build_sha: BUILD_SHA,
402
+ }));
403
+ }
404
+ else {
405
+ console.log(PACKAGE_VERSION);
406
+ }
293
407
  return 0;
294
408
  }
295
409
  const ctx = await resolveStageflowContext(process.cwd());
@@ -305,6 +419,9 @@ async function main(argv) {
305
419
  projectRoot: ctx.projectRoot,
306
420
  });
307
421
  }
422
+ if (parsed.command === "doctor") {
423
+ return runDoctorCommand(argv.slice(3), { cwd: ctx.invocationCwd });
424
+ }
308
425
  if (parsed.command === "graph") {
309
426
  return runGraphCommand(argv.slice(3), {
310
427
  cwd: ctx.invocationCwd,
@@ -345,11 +462,35 @@ async function main(argv) {
345
462
  projectRoot: ctx.projectRoot,
346
463
  });
347
464
  }
465
+ if (parsed.command === "debug-run") {
466
+ return runDebugRunCommand(argv.slice(3), {
467
+ cwd: ctx.invocationCwd,
468
+ projectRoot: ctx.projectRoot,
469
+ });
470
+ }
471
+ if (parsed.command === "backup") {
472
+ return runBackupCommand(argv.slice(3), {
473
+ cwd: ctx.invocationCwd,
474
+ });
475
+ }
476
+ if (parsed.command === "restore") {
477
+ return runRestoreCommand(argv.slice(3));
478
+ }
479
+ if (parsed.command === "export") {
480
+ return runExportAllCommand(argv.slice(3), {
481
+ cwd: ctx.invocationCwd,
482
+ });
483
+ }
348
484
  if (parsed.command === "runs") {
349
485
  return runRunsCommand(argv.slice(3), {
350
486
  cwd: ctx.invocationCwd,
351
487
  });
352
488
  }
489
+ if (parsed.command === "trigger") {
490
+ return runTriggerCommand(argv.slice(3), {
491
+ cwd: ctx.invocationCwd,
492
+ });
493
+ }
353
494
  if (parsed.command === "providers") {
354
495
  return runProvidersCommand(argv.slice(3), ctx.invocationCwd);
355
496
  }
@@ -359,41 +500,64 @@ async function main(argv) {
359
500
  projectRoot: ctx.projectRoot,
360
501
  });
361
502
  }
362
- const store = createRunStore({ rootDir: ctx.globalHome });
503
+ if (parsed.command === "browser") {
504
+ return runBrowserCommand(argv.slice(3));
505
+ }
363
506
  const globalAgent = globalAgentBackendFromManifest(ctx.manifest);
364
507
  if (parsed.command === "ui") {
508
+ const listenHost = resolveListenHost({ flag: parsed.host });
509
+ const tokens = loadControlTokens();
510
+ assertBindAllowed(listenHost, tokens);
365
511
  const mcpStateless = resolveMcpStateless({
366
512
  mcpStateless: parsed.mcpStateless,
367
513
  });
368
- const { url, mcpUrl } = await startUiServer({
514
+ const host = await startUiServer({
369
515
  agent: resolveAgentPort({ global: globalAgent }),
370
- store,
371
516
  cwd: ctx.invocationCwd,
372
517
  rootDir: ctx.projectRoot,
373
518
  port: parsed.port,
519
+ host: listenHost,
374
520
  mcpStateless,
521
+ controlTokens: tokens,
375
522
  });
376
- console.log(`Operator console: ${url}`);
377
- console.log(`MCP endpoint: ${mcpUrl}`);
378
- openBrowser(url);
379
- await new Promise(() => undefined);
380
- return 0;
523
+ if (host.store) {
524
+ try {
525
+ await host.store.ensureProject(ctx.projectRoot);
526
+ }
527
+ catch {
528
+ // The console still serves seeded catalogs when this project cannot be registered.
529
+ }
530
+ }
531
+ console.log(`Operator console: ${host.url}`);
532
+ console.log(`MCP endpoint: ${host.mcpUrl}`);
533
+ if (!isNoOpenEnabled(parsed.noOpen)) {
534
+ openBrowser(host.url);
535
+ }
536
+ const outcome = await host.shutdown.whenDrained();
537
+ return outcome.exitCode;
381
538
  }
382
539
  if (parsed.command === "mcp") {
540
+ if (parsed.noOpen) {
541
+ throw new Error("--no-open is only valid with sf ui");
542
+ }
543
+ const listenHost = resolveListenHost({ flag: parsed.host });
544
+ const tokens = loadControlTokens();
545
+ assertBindAllowed(listenHost, tokens);
383
546
  const mcpStateless = resolveMcpStateless({
384
547
  mcpStateless: parsed.mcpStateless,
385
548
  });
386
- const { mcpUrl } = await startMcpServer({
549
+ const host = await startMcpServer({
387
550
  agent: resolveAgentPort({ global: globalAgent }),
388
- store,
389
551
  cwd: ctx.invocationCwd,
390
552
  rootDir: ctx.projectRoot,
391
553
  port: parsed.port,
554
+ host: listenHost,
392
555
  mcpStateless,
556
+ controlTokens: tokens,
393
557
  });
394
- console.log(`MCP endpoint: ${mcpUrl}`);
395
- await new Promise(() => undefined);
396
- return 0;
558
+ console.log(`MCP endpoint: ${host.mcpUrl}`);
559
+ const outcome = await host.shutdown.whenDrained();
560
+ return outcome.exitCode;
397
561
  }
398
562
  if (parsed.command === "internal") {
399
563
  const subArgs = argv.slice(3);
@@ -409,6 +573,10 @@ async function main(argv) {
409
573
  return 1;
410
574
  }
411
575
  catch (err) {
576
+ if (err instanceof BindRefusedError) {
577
+ console.error(err.message);
578
+ return err.exitCode;
579
+ }
412
580
  console.error(err instanceof Error ? err.message : String(err));
413
581
  return 1;
414
582
  }
@@ -433,9 +601,11 @@ function isDirectCliInvocation() {
433
601
  }
434
602
  if (isDirectCliInvocation()) {
435
603
  main(process.argv)
436
- .then((code) => process.exit(code))
604
+ .then((code) => {
605
+ scheduleExitWithDrain(code);
606
+ })
437
607
  .catch((err) => {
438
608
  console.error(err instanceof Error ? err.message : String(err));
439
- process.exit(1);
609
+ scheduleExitWithDrain(1);
440
610
  });
441
611
  }
@@ -37,6 +37,7 @@ export type CatalogBrowseResult = {
37
37
  export type CatalogScanPaths = {
38
38
  pipelinePaths: string[];
39
39
  taskPaths: string[];
40
+ triggerPaths: string[];
40
41
  };
41
42
  export declare function getCatalogScanPaths(ctx: CatalogContext): Promise<CatalogScanPaths | null>;
42
43
  export declare function browseCatalog(invocationCwd: string | StageflowContext): Promise<CatalogBrowseResult>;
@@ -28,7 +28,7 @@ function bakedModels() {
28
28
  return [...BAKED_MODEL_IDS].sort((a, b) => a.localeCompare(b));
29
29
  }
30
30
  function catalogReadyFromStageflow(ctx) {
31
- return ctx.isGitProject && ctx.manifestStatus === "ok" && ctx.manifest !== null;
31
+ return ctx.manifestStatus === "ok" && ctx.manifest !== null;
32
32
  }
33
33
  function catalogReady(ctx) {
34
34
  return ctx.manifestStatus === "ok" && ctx.projectRoot !== null && ctx.manifest !== null;
@@ -37,11 +37,12 @@ export async function getCatalogScanPaths(ctx) {
37
37
  if (!catalogReady(ctx)) {
38
38
  return null;
39
39
  }
40
- const [pipelinePaths, taskPaths] = await Promise.all([
40
+ const [pipelinePaths, taskPaths, triggerPaths] = await Promise.all([
41
41
  scanCatalogPaths(ctx.manifest, "pipeline"),
42
42
  scanCatalogPaths(ctx.manifest, "task"),
43
+ scanCatalogPaths(ctx.manifest, "trigger"),
43
44
  ]);
44
- return { pipelinePaths, taskPaths };
45
+ return { pipelinePaths, taskPaths, triggerPaths };
45
46
  }
46
47
  async function listTasksFromManifest(projectRoot, manifest, warnings) {
47
48
  const filePaths = await scanCatalogPaths(manifest, "task");
@@ -122,7 +123,7 @@ export async function browseCatalog(invocationCwd) {
122
123
  ? await resolveStageflowContext(invocationCwd)
123
124
  : invocationCwd;
124
125
  const base = {
125
- projectRoot: ctx.isGitProject ? ctx.projectRoot : null,
126
+ projectRoot: ctx.manifestStatus === "not_git" ? null : ctx.projectRoot,
126
127
  manifest: ctx.manifest,
127
128
  manifestStatus: ctx.manifestStatus,
128
129
  issues: ctx.manifestIssues,
@@ -0,0 +1,4 @@
1
+ export declare const BROWSER_SKILL_NAME = "browser";
2
+ export declare function isBuiltinSkillName(name: string): boolean;
3
+ /** Absolute SKILL.md of a skill shipped inside the package, if present on disk. */
4
+ export declare function resolveBuiltinSkillFile(name: string, fromUrl?: string): string | undefined;
@@ -0,0 +1,23 @@
1
+ import { existsSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ export const BROWSER_SKILL_NAME = "browser";
5
+ const BUILTIN_SKILL_NAMES = new Set([BROWSER_SKILL_NAME]);
6
+ export function isBuiltinSkillName(name) {
7
+ return BUILTIN_SKILL_NAMES.has(name);
8
+ }
9
+ /** Absolute SKILL.md of a skill shipped inside the package, if present on disk. */
10
+ export function resolveBuiltinSkillFile(name, fromUrl = import.meta.url) {
11
+ if (!isBuiltinSkillName(name))
12
+ return undefined;
13
+ const here = path.dirname(fileURLToPath(fromUrl));
14
+ for (const root of [
15
+ path.resolve(here, "../../builtin-skills"),
16
+ path.resolve(here, "../../../builtin-skills"),
17
+ ]) {
18
+ const file = path.join(root, name, "SKILL.md");
19
+ if (existsSync(file))
20
+ return file;
21
+ }
22
+ return undefined;
23
+ }
@@ -0,0 +1,63 @@
1
+ import type { CatalogRoot, ResolveCatalogRootsOptions } from "./resolveCatalogRoots.js";
2
+ export type CatalogPathErrorCode = "absolute_path_not_allowed" | "path_outside_project_root" | "unknown_project_root" | "catalog_root_read_only";
3
+ export declare class CatalogPathError extends Error {
4
+ readonly code: CatalogPathErrorCode;
5
+ readonly registered_roots: string[];
6
+ constructor(message: string, code: CatalogPathErrorCode, registered_roots: string[]);
7
+ }
8
+ export declare function isInsideProjectRoot(projectRoot: string, candidate: string): boolean;
9
+ export type ResolveCatalogRelativePathInput = {
10
+ /** Caller-supplied path (pipeline, task, etc.). */
11
+ inputPath: string;
12
+ /** Optional wire project_root (symbolic seeded id or absolute). */
13
+ projectRoot?: string;
14
+ roots: CatalogRoot[];
15
+ fieldName?: string;
16
+ };
17
+ export type ResolvedCatalogPath = {
18
+ absolutePath: string;
19
+ root: CatalogRoot;
20
+ relativePath: string;
21
+ };
22
+ /**
23
+ * Network-surface path contract: refuse absolute paths; resolve relative under
24
+ * a selected catalog root; refuse `..` escape via realpath containment.
25
+ */
26
+ export declare function resolveCatalogRelativePath(input: ResolveCatalogRelativePathInput): ResolvedCatalogPath;
27
+ export declare function catalogPathErrorBody(err: CatalogPathError): {
28
+ error: string;
29
+ code: CatalogPathErrorCode;
30
+ registered_roots: string[];
31
+ hint?: string;
32
+ };
33
+ /**
34
+ * Pick the catalog root for start_run / POST /api/runs.
35
+ * Wire project_root (symbolic seeded id or absolute) maps to CatalogRoot.path
36
+ * (absolute store key). When omitted: sole root, or sole non-seeded root;
37
+ * otherwise require explicit — no invent.
38
+ */
39
+ export declare function selectCatalogRootForStart(roots: CatalogRoot[], projectRoot?: string): CatalogRoot;
40
+ /**
41
+ * Shared helper: resolveCatalogRoots → selectCatalogRootForStart.
42
+ * All network-surface start-input call sites use this to avoid the hand-copy sequence.
43
+ */
44
+ export declare function resolveCatalogStartInput(options: ResolveCatalogRootsOptions, projectRoot?: string): Promise<{
45
+ roots: CatalogRoot[];
46
+ wireRoot: CatalogRoot;
47
+ }>;
48
+ /**
49
+ * Like resolveCatalogStartInput but additionally refuses read-only roots.
50
+ * Used by write surfaces (POST /api/stages, POST /api/pipelines).
51
+ */
52
+ export declare function resolveWritableCatalogRoot(options: ResolveCatalogRootsOptions, projectRoot?: string): Promise<{
53
+ roots: CatalogRoot[];
54
+ wireRoot: CatalogRoot;
55
+ }>;
56
+ /**
57
+ * Local CLI control: turn a cwd-resolved filesystem path into a catalog-relative
58
+ * wire path + project_root so the network surface does not see an absolute path.
59
+ */
60
+ export declare function relativizeLocalPathForNetwork(cwd: string, inputPath: string): {
61
+ path: string;
62
+ project_root: string;
63
+ };