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
@@ -2,18 +2,48 @@ export const STAGEFLOW_YAML = `version: 1
2
2
  catalog:
3
3
  pipelines:
4
4
  - pipelines
5
+ - workshop
5
6
  tasks:
6
7
  - tasks
8
+ - workshop
7
9
  patterns:
8
10
  pipeline: "*.pipeline.yaml"
9
11
  task: "*.task.yaml"
10
12
  `;
11
- export const HELLO_PIPELINE_YAML = `id: hello
12
- model: anthropic/claude-sonnet-4-5
13
+ export const LOUD_MODEL_PLACEHOLDER = "CHANGE_ME/<provider-model>";
14
+ const PROVIDER_DEFAULT_MODELS = {
15
+ anthropic: "anthropic/claude-sonnet-4-5",
16
+ openrouter: "openrouter/auto",
17
+ cursor: "cursor/auto",
18
+ };
19
+ export function resolveInitDefaultModel(configuredProviderIds) {
20
+ const ids = [
21
+ ...new Set(configuredProviderIds
22
+ .map((id) => id.trim().toLowerCase())
23
+ .filter((id) => id.length > 0)),
24
+ ].sort((a, b) => a.localeCompare(b));
25
+ if (ids.length === 1) {
26
+ const id = ids[0];
27
+ return PROVIDER_DEFAULT_MODELS[id] ?? `CHANGE_ME/${id}-model`;
28
+ }
29
+ return LOUD_MODEL_PLACEHOLDER;
30
+ }
31
+ export function helloPipelineYaml(model) {
32
+ return `id: hello
13
33
  stages:
14
34
  - id: hello
35
+ model: "${model}"
15
36
  system_prompt: Say hello and emit a success envelope.
37
+ io:
38
+ input:
39
+ schema:
40
+ type: object
41
+ output:
42
+ schema:
43
+ type: object
16
44
  `;
45
+ }
46
+ export const HELLO_PIPELINE_YAML = helloPipelineYaml("anthropic/claude-sonnet-4-5");
17
47
  export const HELLO_TASK_YAML = `id: hello
18
48
  goal: Run the hello pipeline scaffold.
19
49
  `;
@@ -0,0 +1,2 @@
1
+ /** Resolve `--out` under cwd, realpath-normalizing both sides before containment. */
2
+ export declare function resolveSafeOutPath(outPath: string, cwd: string): string;
@@ -0,0 +1,40 @@
1
+ import { realpathSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { isInsideDir } from "../runstore/workspaceLayout.js";
4
+ function resolveEffectiveRealPathSync(candidatePath) {
5
+ try {
6
+ return realpathSync(candidatePath);
7
+ }
8
+ catch {
9
+ const missing = [];
10
+ let current = candidatePath;
11
+ while (true) {
12
+ missing.unshift(path.basename(current));
13
+ const parent = path.dirname(current);
14
+ if (parent === current) {
15
+ return path.resolve(candidatePath);
16
+ }
17
+ try {
18
+ const realParent = realpathSync(parent);
19
+ return path.join(realParent, ...missing);
20
+ }
21
+ catch {
22
+ current = parent;
23
+ }
24
+ }
25
+ }
26
+ }
27
+ /** Resolve `--out` under cwd, realpath-normalizing both sides before containment. */
28
+ export function resolveSafeOutPath(outPath, cwd) {
29
+ const segments = outPath.split(/[/\\]/);
30
+ if (segments.some((segment) => segment === "..")) {
31
+ throw new Error("path must not contain .. segments");
32
+ }
33
+ const resolved = path.resolve(cwd, outPath);
34
+ const cwdResolved = resolveEffectiveRealPathSync(path.resolve(cwd));
35
+ const outResolved = resolveEffectiveRealPathSync(resolved);
36
+ if (!isInsideDir(outResolved, cwdResolved)) {
37
+ throw new Error("output path must resolve under the current working directory");
38
+ }
39
+ return resolved;
40
+ }
@@ -0,0 +1,10 @@
1
+ import { probeGlobalServiceDetailed } from "../server/ensureGlobalService.js";
2
+ export declare const RESTORE_USAGE = "Usage:\n sf restore <file> [--force] [--json]\n\nRestores a Stageflow backup. The Host must be down (probed via /livez).\nNever autostarts a Host. Previous state.db is moved aside, not deleted.";
3
+ export type RestoreCommandIo = {
4
+ log: (line: string) => void;
5
+ error: (line: string) => void;
6
+ };
7
+ export declare function runRestoreCommand(args: string[], options?: {
8
+ io?: Partial<RestoreCommandIo>;
9
+ probe?: typeof probeGlobalServiceDetailed;
10
+ }): Promise<number>;
@@ -0,0 +1,90 @@
1
+ import path from "node:path";
2
+ import { applyRestoreArchive, RestoreError, } from "../runstore/restore.js";
3
+ import { StoreSchemaError } from "../runstore/sqlite/storeSchemaError.js";
4
+ import { globalStageflowHome } from "../project/globalHome.js";
5
+ export const RESTORE_USAGE = `Usage:
6
+ sf restore <file> [--force] [--json]
7
+
8
+ Restores a Stageflow backup. The Host must be down (probed via /livez).
9
+ Never autostarts a Host. Previous state.db is moved aside, not deleted.`;
10
+ const defaultIo = {
11
+ log: (line) => console.log(line),
12
+ error: (line) => console.error(line),
13
+ };
14
+ function parseRestoreArgs(args) {
15
+ let help = false;
16
+ let file;
17
+ let force = false;
18
+ let json = false;
19
+ for (let i = 0; i < args.length; i += 1) {
20
+ const arg = args[i];
21
+ if (arg === "--help" || arg === "-h") {
22
+ help = true;
23
+ }
24
+ else if (arg === "--force") {
25
+ force = true;
26
+ }
27
+ else if (arg === "--json") {
28
+ json = true;
29
+ }
30
+ else if (arg?.startsWith("-")) {
31
+ throw new Error(`Unknown flag: ${arg}`);
32
+ }
33
+ else if (file === undefined) {
34
+ file = arg;
35
+ }
36
+ else {
37
+ throw new Error(`Unexpected argument: ${arg}`);
38
+ }
39
+ }
40
+ return { help, file, force, json };
41
+ }
42
+ export async function runRestoreCommand(args, options = {}) {
43
+ const out = { ...defaultIo, ...options.io };
44
+ let parsed;
45
+ try {
46
+ parsed = parseRestoreArgs(args);
47
+ }
48
+ catch (err) {
49
+ const message = err instanceof Error ? err.message : String(err);
50
+ out.error(message);
51
+ out.error(RESTORE_USAGE);
52
+ return 1;
53
+ }
54
+ if (parsed.help) {
55
+ out.error(RESTORE_USAGE);
56
+ return 0;
57
+ }
58
+ if (!parsed.file) {
59
+ out.error("Missing <file>");
60
+ out.error(RESTORE_USAGE);
61
+ return 1;
62
+ }
63
+ try {
64
+ const result = await applyRestoreArchive({
65
+ archivePath: path.resolve(parsed.file),
66
+ homeDir: globalStageflowHome(),
67
+ force: parsed.force,
68
+ probe: options.probe,
69
+ });
70
+ if (parsed.json) {
71
+ out.log(JSON.stringify({ ok: true, ...result }));
72
+ }
73
+ else {
74
+ out.log(`Restored schema_version=${result.schema_version}` +
75
+ (result.missing_a2a_artifact_rows > 0
76
+ ? ` (missing A2A artifact bytes: ${result.missing_a2a_artifact_rows})`
77
+ : ""));
78
+ }
79
+ return 0;
80
+ }
81
+ catch (err) {
82
+ if (err instanceof RestoreError || err instanceof StoreSchemaError) {
83
+ out.error(`${err.code}: ${err.message}`);
84
+ return 1;
85
+ }
86
+ const message = err instanceof Error ? err.message : String(err);
87
+ out.error(message);
88
+ return 1;
89
+ }
90
+ }
@@ -1,11 +1,12 @@
1
1
  import type { RunStore } from "../runstore/port.js";
2
2
  import type { StartRunResult } from "../runtime/runManager.js";
3
+ import type { TaskFile } from "../types/task.js";
3
4
  import { type EnsureGlobalServiceResult } from "../server/ensureGlobalService.js";
4
5
  import { type CliRunReportIo } from "./runOutput.js";
5
- export declare const RUN_USAGE = "Usage:\n 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>]";
6
+ export declare const RUN_USAGE = "Usage:\n 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>]";
6
7
  export type RunCommandIo = CliRunReportIo;
7
8
  export type StartRunFn = (input: {
8
- task: string;
9
+ task: string | TaskFile;
9
10
  pipeline: string;
10
11
  checkoutOverride?: string;
11
12
  skipGates?: boolean;
@@ -1,11 +1,16 @@
1
- import { PipelineValidationError } from "../runtime/pipelineRunner.js";
1
+ import { readFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { parse as parseYaml } from "yaml";
4
+ import { coerceTaskFile } from "../config/loadTask.js";
5
+ import { relativizeLocalPathForNetwork } from "../config/catalogRelativePath.js";
6
+ import { PipelinePreflightError, PipelineValidationError } from "../runtime/pipelineRunner.js";
2
7
  import { ensureGlobalService, hostBaseUrl, } from "../server/ensureGlobalService.js";
3
- import { httpStartRun, httpStoreReader, resolveAbsolute } from "./hostClient.js";
4
- import { reportCliRun, } from "./runOutput.js";
8
+ import { httpEnsureProject, httpStartRun, httpStoreReader } from "./hostClient.js";
9
+ import { reportCliRun, writeQueuedAdmissionLine, } from "./runOutput.js";
5
10
  import { resolveCiIdentity } from "./ciIdentity.js";
6
11
  import { exitCodeForValidation, formatValidationHuman, formatValidationJson, } from "./validateOutput.js";
7
12
  export const RUN_USAGE = `Usage:
8
- 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>]`;
13
+ 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>]`;
9
14
  const defaultIo = {
10
15
  log: (line) => console.log(line),
11
16
  error: (line) => console.error(line),
@@ -20,6 +25,8 @@ function parseRunArgs(args) {
20
25
  let task;
21
26
  let pipeline;
22
27
  let checkout;
28
+ let repository;
29
+ let ref;
23
30
  let gitSha;
24
31
  let ciPrUrl;
25
32
  let ciJobUrl;
@@ -55,6 +62,20 @@ function parseRunArgs(args) {
55
62
  }
56
63
  checkout = value;
57
64
  }
65
+ else if (arg === "--repository") {
66
+ const value = args[++i];
67
+ if (value === undefined || value.length === 0) {
68
+ throw new Error("Missing value for --repository");
69
+ }
70
+ repository = value;
71
+ }
72
+ else if (arg === "--ref") {
73
+ const value = args[++i];
74
+ if (value === undefined || value.length === 0) {
75
+ throw new Error("Missing value for --ref");
76
+ }
77
+ ref = value;
78
+ }
58
79
  else if (arg === "--git-sha") {
59
80
  const value = args[++i];
60
81
  if (value === undefined || value.length === 0) {
@@ -123,6 +144,8 @@ function parseRunArgs(args) {
123
144
  task,
124
145
  pipeline,
125
146
  checkout,
147
+ repository,
148
+ ref,
126
149
  gitSha,
127
150
  ciPrUrl,
128
151
  ciJobUrl,
@@ -130,18 +153,60 @@ function parseRunArgs(args) {
130
153
  operatorAgentDir,
131
154
  };
132
155
  }
156
+ async function loadTaskWithBindingOverrides(taskPath, cwd, overrides) {
157
+ const absolute = path.resolve(cwd, taskPath);
158
+ const yamlText = await readFile(absolute, "utf8");
159
+ const raw = parseYaml(yamlText);
160
+ const task = coerceTaskFile(raw);
161
+ if (task === undefined) {
162
+ throw new Error(`Invalid task file ${absolute}: id and goal are required strings`);
163
+ }
164
+ if (overrides.repository !== undefined)
165
+ task.repository = overrides.repository;
166
+ if (overrides.ref !== undefined)
167
+ task.ref = overrides.ref;
168
+ return task;
169
+ }
133
170
  function defaultStartRun(cwd, base, ensureService) {
134
171
  return async (input) => {
135
172
  const ensured = await ensureService();
136
173
  if (!ensured.ok) {
137
- return { ok: false, reason: ensured.message, status: 503 };
174
+ return {
175
+ ok: false,
176
+ reason: ensured.message,
177
+ status: 503,
178
+ ...(ensured.reason === "autostart_disabled"
179
+ ? { code: "autostart_disabled" }
180
+ : {}),
181
+ };
138
182
  }
183
+ const pipelineRef = relativizeLocalPathForNetwork(cwd, input.pipeline);
184
+ let task = input.task;
185
+ let projectRoot = pipelineRef.project_root;
186
+ if (typeof input.task === "string") {
187
+ const absTask = path.resolve(cwd, input.task);
188
+ const cwdAbs = path.resolve(cwd);
189
+ const relTask = path.relative(cwdAbs, absTask);
190
+ if (relTask.startsWith("..") || path.isAbsolute(relTask)) {
191
+ task = await loadTaskWithBindingOverrides(input.task, cwd, {});
192
+ }
193
+ else {
194
+ const taskRef = relativizeLocalPathForNetwork(cwd, input.task);
195
+ task = taskRef.path;
196
+ projectRoot = taskRef.project_root;
197
+ }
198
+ }
199
+ const ensuredProject = await httpEnsureProject(base, projectRoot);
200
+ if (!ensuredProject.ok)
201
+ return ensuredProject;
202
+ const checkoutOverride = input.checkoutOverride !== undefined
203
+ ? relativizeLocalPathForNetwork(cwd, input.checkoutOverride).path
204
+ : undefined;
139
205
  return httpStartRun(base, {
140
- pipeline: resolveAbsolute(cwd, input.pipeline),
141
- task: resolveAbsolute(cwd, input.task),
142
- ...(input.checkoutOverride !== undefined
143
- ? { checkoutOverride: resolveAbsolute(cwd, input.checkoutOverride) }
144
- : {}),
206
+ pipeline: pipelineRef.path,
207
+ task,
208
+ project_root: ensuredProject.project_root,
209
+ ...(checkoutOverride !== undefined ? { checkoutOverride } : {}),
145
210
  ...(input.skipGates !== undefined ? { skipGates: input.skipGates } : {}),
146
211
  ...(input.gitSha !== undefined ? { gitSha: input.gitSha } : {}),
147
212
  ...(input.ciPrUrl !== undefined ? { ciPrUrl: input.ciPrUrl } : {}),
@@ -200,8 +265,15 @@ export async function runRunCommand(args, options = {}) {
200
265
  });
201
266
  const store = options.store ?? (parsed.includeStages ? httpStoreReader(base) : undefined);
202
267
  try {
268
+ const hasBindingOverride = parsed.repository !== undefined || parsed.ref !== undefined;
269
+ const taskInput = hasBindingOverride
270
+ ? await loadTaskWithBindingOverrides(parsed.task, cwd, {
271
+ repository: parsed.repository,
272
+ ref: parsed.ref,
273
+ })
274
+ : parsed.task;
203
275
  const started = await startRun({
204
- task: parsed.task,
276
+ task: taskInput,
205
277
  pipeline: parsed.pipeline,
206
278
  checkoutOverride: parsed.checkout,
207
279
  ...(parsed.skipGates ? { skipGates: true } : {}),
@@ -210,6 +282,7 @@ export async function runRunCommand(args, options = {}) {
210
282
  if (!started.ok) {
211
283
  return reportCliRun({ kind: "start-failure", started }, { json: parsed.json, io: out });
212
284
  }
285
+ writeQueuedAdmissionLine(started, out);
213
286
  return completeCliRun(started, out, {
214
287
  json: parsed.json,
215
288
  includeStages: parsed.includeStages,
@@ -226,6 +299,15 @@ export async function runRunCommand(args, options = {}) {
226
299
  }
227
300
  return exitCodeForValidation(err.result);
228
301
  }
302
+ if (err instanceof PipelinePreflightError) {
303
+ if (parsed.json) {
304
+ out.log(JSON.stringify(err.toNetworkBody(), null, 2));
305
+ }
306
+ else {
307
+ out.error(err.message);
308
+ }
309
+ return 1;
310
+ }
229
311
  out.error(err instanceof Error ? err.message : String(err));
230
312
  return 1;
231
313
  }
@@ -14,6 +14,10 @@ export type CliRunReportEvent = {
14
14
  kind: "completion";
15
15
  result: PipelineRunResult;
16
16
  };
17
+ /** Stderr line when start_run was admitted to the queue (origin transparency rule). */
18
+ export declare function writeQueuedAdmissionLine(started: Extract<StartRunResult, {
19
+ ok: true;
20
+ }>, io: Pick<CliRunReportIo, "error">): void;
17
21
  export declare function reportCliRun(event: CliRunReportEvent, options: {
18
22
  json?: boolean;
19
23
  io: CliRunReportIo;
@@ -20,6 +20,12 @@ async function tryReadTotalCostUsd(store, runId) {
20
20
  function isBusyCode(code) {
21
21
  return code === "busy_capacity" || code === "busy_checkout";
22
22
  }
23
+ /** Stderr line when start_run was admitted to the queue (origin transparency rule). */
24
+ export function writeQueuedAdmissionLine(started, io) {
25
+ if (started.queued === true && started.queuePosition !== undefined) {
26
+ io.error(`queued at position ${started.queuePosition}`);
27
+ }
28
+ }
23
29
  function formatRunBusyJson(started) {
24
30
  const payload = {
25
31
  ok: false,
@@ -52,6 +58,13 @@ function formatRunStartFailedJson(started) {
52
58
  };
53
59
  if (started.code !== undefined)
54
60
  payload.code = started.code;
61
+ if (started.freeBytes !== undefined)
62
+ payload.freeBytes = started.freeBytes;
63
+ if (started.minFreeBytes !== undefined) {
64
+ payload.minFreeBytes = started.minFreeBytes;
65
+ }
66
+ if (started.stderr !== undefined)
67
+ payload.stderr = started.stderr;
55
68
  return stringify(payload);
56
69
  }
57
70
  function formatStartFailureJson(started) {
@@ -75,13 +88,21 @@ function baseRunCompletionPayload(result) {
75
88
  runId: result.runId,
76
89
  runDir: result.runDir,
77
90
  }
78
- : {
79
- ok: false,
80
- outcome: "failed",
81
- runId: result.runId,
82
- runDir: result.runDir,
83
- };
84
- if (result.outcome === "failed" && result.reason !== undefined) {
91
+ : result.outcome === "cancelled"
92
+ ? {
93
+ ok: false,
94
+ outcome: "cancelled",
95
+ runId: result.runId,
96
+ runDir: result.runDir,
97
+ }
98
+ : {
99
+ ok: false,
100
+ outcome: "failed",
101
+ runId: result.runId,
102
+ runDir: result.runDir,
103
+ };
104
+ if ((result.outcome === "failed" || result.outcome === "cancelled") &&
105
+ result.reason !== undefined) {
85
106
  payload.reason = result.reason;
86
107
  }
87
108
  if (Array.isArray(result.findings) && result.findings.length > 0) {
@@ -130,6 +151,10 @@ function writeCompletionHuman(result, io, totalCostUsd) {
130
151
  io.error(`Pipeline failed: ${result.reason}`);
131
152
  io.error(`Run folder: ${result.runDir}`);
132
153
  break;
154
+ case "cancelled":
155
+ io.error(`Pipeline cancelled${result.reason ? `: ${result.reason}` : ""}`);
156
+ io.error(`Run folder: ${result.runDir}`);
157
+ break;
133
158
  case "succeeded":
134
159
  io.log(`Pipeline succeeded. Run folder: ${result.runDir}`);
135
160
  break;
@@ -145,6 +170,7 @@ function exitCodeForRunOutcome(outcome) {
145
170
  case "waiting":
146
171
  return 2;
147
172
  case "failed":
173
+ case "cancelled":
148
174
  return 1;
149
175
  }
150
176
  }
@@ -7,6 +7,7 @@ export type RunStageEnvelopeRef = {
7
7
  };
8
8
  export type RunStageToolArgs = {
9
9
  stage: string | Record<string, unknown>;
10
+ project_root?: string;
10
11
  task_path?: string;
11
12
  task?: Record<string, unknown>;
12
13
  envelope_ref?: RunStageEnvelopeRef | RunStageEnvelopeRef[];
@@ -1,6 +1,7 @@
1
+ import { relativizeLocalPathForNetwork } from "../config/catalogRelativePath.js";
1
2
  import { PACKAGE_VERSION } from "../package-meta.js";
2
3
  import { ensureGlobalService, hostBaseUrl, } from "../server/ensureGlobalService.js";
3
- import { resolveAbsolute } from "./hostClient.js";
4
+ import { httpEnsureProject } from "./hostClient.js";
4
5
  export const RUN_STAGE_USAGE = `Usage:
5
6
  sf run-stage (--stage <path> | --stage-inline '<json>') (--task <path> | --task-inline '<json>' | --envelope-ref <runId>:<stageId>[:<attempt>] [--envelope-ref ...]) [--checkout <path>] [--model <id>] [--blocking] [--timeout-ms <n>] [--json]
6
7
 
@@ -247,9 +248,17 @@ function defaultCallTool(base, ensureService) {
247
248
  if (!ensured.ok) {
248
249
  throw new Error(ensured.message);
249
250
  }
251
+ let toolArgs = args;
252
+ if (args.project_root !== undefined) {
253
+ const ensuredProject = await httpEnsureProject(base, args.project_root);
254
+ if (!ensuredProject.ok) {
255
+ throw new Error(ensuredProject.reason);
256
+ }
257
+ toolArgs = { ...args, project_root: ensuredProject.project_root };
258
+ }
250
259
  const sessionId = await mcpInitializeSession(base);
251
260
  try {
252
- return await mcpToolCall(base, sessionId, "run_stage", args);
261
+ return await mcpToolCall(base, sessionId, "run_stage", toolArgs);
253
262
  }
254
263
  finally {
255
264
  await mcpCloseSession(base, sessionId);
@@ -338,37 +347,48 @@ export async function runRunStageCommand(args, options = {}) {
338
347
  return 1;
339
348
  }
340
349
  let stage;
341
- if (parsed.stage !== undefined) {
342
- stage = resolveAbsolute(cwd, parsed.stage);
343
- }
344
- else {
345
- try {
346
- stage = parseJsonFlag(parsed.stageInline, "--stage-inline");
350
+ let projectRoot;
351
+ try {
352
+ if (parsed.stage !== undefined) {
353
+ const stageRef = relativizeLocalPathForNetwork(cwd, parsed.stage);
354
+ stage = stageRef.path;
355
+ projectRoot = stageRef.project_root;
347
356
  }
348
- catch (err) {
349
- out.error(err instanceof Error ? err.message : String(err));
350
- return 1;
357
+ else {
358
+ stage = parseJsonFlag(parsed.stageInline, "--stage-inline");
351
359
  }
352
360
  }
361
+ catch (err) {
362
+ out.error(err instanceof Error ? err.message : String(err));
363
+ return 1;
364
+ }
353
365
  let taskPath;
354
366
  let task;
355
367
  let envelopeRef;
356
- if (parsed.task !== undefined) {
357
- taskPath = resolveAbsolute(cwd, parsed.task);
358
- }
359
- else if (parsed.taskInline !== undefined) {
360
- try {
368
+ try {
369
+ if (parsed.task !== undefined) {
370
+ const taskRef = relativizeLocalPathForNetwork(cwd, parsed.task);
371
+ taskPath = taskRef.path;
372
+ projectRoot = taskRef.project_root;
373
+ }
374
+ else if (parsed.taskInline !== undefined) {
361
375
  task = parseJsonFlag(parsed.taskInline, "--task-inline");
362
376
  }
363
- catch (err) {
364
- out.error(err instanceof Error ? err.message : String(err));
365
- return 1;
377
+ else {
378
+ const refs = parsed.envelopeRef.map(parseEnvelopeRefFlag);
379
+ envelopeRef = refs.length === 1 ? refs[0] : refs;
366
380
  }
367
381
  }
368
- else {
382
+ catch (err) {
383
+ out.error(err instanceof Error ? err.message : String(err));
384
+ return 1;
385
+ }
386
+ let checkout;
387
+ if (parsed.checkout !== undefined) {
369
388
  try {
370
- const refs = parsed.envelopeRef.map(parseEnvelopeRefFlag);
371
- envelopeRef = refs.length === 1 ? refs[0] : refs;
389
+ const checkoutRef = relativizeLocalPathForNetwork(cwd, parsed.checkout);
390
+ checkout = checkoutRef.path;
391
+ projectRoot = projectRoot ?? checkoutRef.project_root;
372
392
  }
373
393
  catch (err) {
374
394
  out.error(err instanceof Error ? err.message : String(err));
@@ -377,12 +397,11 @@ export async function runRunStageCommand(args, options = {}) {
377
397
  }
378
398
  const toolArgs = {
379
399
  stage,
400
+ ...(projectRoot !== undefined ? { project_root: projectRoot } : {}),
380
401
  ...(taskPath !== undefined ? { task_path: taskPath } : {}),
381
402
  ...(task !== undefined ? { task } : {}),
382
403
  ...(envelopeRef !== undefined ? { envelope_ref: envelopeRef } : {}),
383
- ...(parsed.checkout !== undefined
384
- ? { checkout: resolveAbsolute(cwd, parsed.checkout) }
385
- : {}),
404
+ ...(checkout !== undefined ? { checkout } : {}),
386
405
  ...(parsed.model !== undefined ? { model: parsed.model } : {}),
387
406
  ...(parsed.blocking ? { blocking: true } : {}),
388
407
  ...(parsed.timeoutMs !== undefined ? { timeout_ms: parsed.timeoutMs } : {}),
@@ -1,6 +1,6 @@
1
1
  import type { RunStore } from "../runstore/port.js";
2
2
  import { type EnsureGlobalServiceResult } from "../server/ensureGlobalService.js";
3
- export declare const RUNS_USAGE = "Usage:\n sf runs list [--status created|running|succeeded|failed] [--since <iso>] [--pipeline <id-or-path>] [--json]\n sf runs show --run <runId> [--from <sf-run.json>] [--json]\n sf runs verify --run <runId> --stage <stageId> [--json]\n sf runs recover --run <runId> --stage <stageId> [--guidance <text>] [--stop] [--json]\n sf runs waiting [--run <runId>] [--json]\n sf runs wait --run <runId> [--from <sf-run.json>] [--until any|waiting|terminal] [--timeout-ms <n>] [--json]\n sf runs answer --run <runId> --stage <stageId> [--answer '<json>'] [--json]\n sf runs feedback-decide --run <runId> --stage <sourceStageId> [--loop <loopId>] --decision extend|continue|abandon [--reason <text>] [--json]\n sf runs retry --run <runId> --stage <stageId> [--json]\n sf runs resume --run <runId> --stage <stageId> [--json]\n sf runs abandon --run <runId> --stage <stageId> [--json]\n sf runs rerun --run <runId> [--json]";
3
+ export declare const RUNS_USAGE = "Usage:\n sf runs list [--status created|queued|running|succeeded|failed|cancelled] [--since <iso>] [--pipeline <id-or-path>] [--json]\n sf runs show --run <runId> [--from <sf-run.json>] [--json]\n sf runs verify --run <runId> --stage <stageId> [--json]\n sf runs recover --run <runId> --stage <stageId> [--guidance <text>] [--stop] [--json]\n sf runs waiting [--run <runId>] [--json]\n sf runs wait --run <runId> [--from <sf-run.json>] [--until any|waiting|terminal] [--timeout-ms <n>] [--json]\n sf runs answer --run <runId> --stage <stageId> [--answer '<json>'] [--json]\n sf runs feedback-decide --run <runId> --stage <sourceStageId> [--loop <loopId>] --decision extend|continue|abandon [--reason <text>] [--json]\n sf runs retry --run <runId> --stage <stageId> [--json]\n sf runs resume --run <runId> --stage <stageId> [--json]\n sf runs abandon --run <runId> --stage <stageId> [--json]\n sf runs cancel --run <runId> --reason <text> [--json]\n sf runs delete --run <runId> [--force] [--json]\n sf runs gc [--dry-run] [--json]\n sf runs rerun --run <runId> [--pinned] [--json]";
4
4
  export type RunsCommandIo = {
5
5
  log: (line: string) => void;
6
6
  error: (line: string) => void;