stageflow 0.25.0 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (681) hide show
  1. package/README.md +14 -3
  2. package/builtin-skills/browser/SKILL.md +42 -0
  3. package/dist/a2a/contracts.d.ts +1 -0
  4. package/dist/a2a/contracts.js +1 -0
  5. package/dist/a2a/registry.d.ts +2 -0
  6. package/dist/a2a/registry.js +20 -1
  7. package/dist/a2a/server.d.ts +7 -0
  8. package/dist/a2a/server.js +5 -2
  9. package/dist/a2a/service.d.ts +1 -1
  10. package/dist/a2a/service.js +57 -8
  11. package/dist/a2a/store.d.ts +8 -5
  12. package/dist/a2a/store.js +24 -67
  13. package/dist/agent/activity.d.ts +3 -0
  14. package/dist/agent/bootProviderConfig.d.ts +21 -0
  15. package/dist/agent/bootProviderConfig.js +74 -0
  16. package/dist/agent/claudeAdapter.js +2 -2
  17. package/dist/agent/cursorProvider.d.ts +2 -0
  18. package/dist/agent/cursorProvider.js +30 -5
  19. package/dist/agent/fakeAgent.d.ts +1 -0
  20. package/dist/agent/fakeAgent.js +13 -0
  21. package/dist/agent/piAdapter.d.ts +11 -24
  22. package/dist/agent/piAdapter.js +107 -50
  23. package/dist/agent/piIsolatedMcp.d.ts +2 -0
  24. package/dist/agent/piIsolatedMcp.js +10 -2
  25. package/dist/agent/piSessionFactory.d.ts +38 -0
  26. package/dist/agent/piSessionFactory.js +60 -0
  27. package/dist/agent/port.d.ts +8 -0
  28. package/dist/agent/streamLogRedact.d.ts +7 -1
  29. package/dist/agent/streamLogRedact.js +26 -11
  30. package/dist/browser/anchor.d.ts +27 -0
  31. package/dist/browser/anchor.js +127 -0
  32. package/dist/browser/auditSink.d.ts +38 -0
  33. package/dist/browser/auditSink.js +34 -0
  34. package/dist/browser/browserHost.d.ts +86 -0
  35. package/dist/browser/browserHost.js +7 -0
  36. package/dist/browser/browserSweep.d.ts +14 -0
  37. package/dist/browser/browserSweep.js +54 -0
  38. package/dist/browser/browserTeardown.d.ts +56 -0
  39. package/dist/browser/browserTeardown.js +235 -0
  40. package/dist/browser/fakeRemoteBrowserHost.d.ts +2 -0
  41. package/dist/browser/fakeRemoteBrowserHost.js +34 -0
  42. package/dist/browser/gateHandoff.d.ts +25 -0
  43. package/dist/browser/gateHandoff.js +83 -0
  44. package/dist/browser/humanLogin.d.ts +18 -0
  45. package/dist/browser/humanLogin.js +34 -0
  46. package/dist/browser/keyProvider.d.ts +10 -0
  47. package/dist/browser/keyProvider.js +39 -0
  48. package/dist/browser/localBrowserHost.d.ts +10 -0
  49. package/dist/browser/localBrowserHost.js +152 -0
  50. package/dist/browser/localProfileLock.d.ts +2 -0
  51. package/dist/browser/localProfileLock.js +218 -0
  52. package/dist/browser/localProfileStore.d.ts +5 -0
  53. package/dist/browser/localProfileStore.js +91 -0
  54. package/dist/browser/loginCheck.d.ts +53 -0
  55. package/dist/browser/loginCheck.js +147 -0
  56. package/dist/browser/memoryProfileLock.d.ts +2 -0
  57. package/dist/browser/memoryProfileLock.js +53 -0
  58. package/dist/browser/memoryProfileStore.d.ts +2 -0
  59. package/dist/browser/memoryProfileStore.js +31 -0
  60. package/dist/browser/navigationAudit.d.ts +16 -0
  61. package/dist/browser/navigationAudit.js +53 -0
  62. package/dist/browser/persistedEnv.d.ts +3 -0
  63. package/dist/browser/persistedEnv.js +15 -0
  64. package/dist/browser/profileLock.d.ts +40 -0
  65. package/dist/browser/profileLock.js +10 -0
  66. package/dist/browser/profileStore.d.ts +23 -0
  67. package/dist/browser/profileStore.js +39 -0
  68. package/dist/browser/runLiveness.d.ts +13 -0
  69. package/dist/browser/runLiveness.js +39 -0
  70. package/dist/browser/sitePolicy.d.ts +10 -0
  71. package/dist/browser/sitePolicy.js +61 -0
  72. package/dist/browser/stageBrowserEnv.d.ts +22 -0
  73. package/dist/browser/stageBrowserEnv.js +147 -0
  74. package/dist/browser/stageProfileLock.d.ts +17 -0
  75. package/dist/browser/stageProfileLock.js +39 -0
  76. package/dist/cli/artifactCommand.js +9 -16
  77. package/dist/cli/backupCommand.d.ts +9 -0
  78. package/dist/cli/backupCommand.js +111 -0
  79. package/dist/cli/browserCommand.d.ts +44 -0
  80. package/dist/cli/browserCommand.js +472 -0
  81. package/dist/cli/debugRunCommand.d.ts +10 -0
  82. package/dist/cli/debugRunCommand.js +109 -0
  83. package/dist/cli/doctorCommand.d.ts +32 -0
  84. package/dist/cli/doctorCommand.js +453 -0
  85. package/dist/cli/envelopeCommand.js +9 -2
  86. package/dist/cli/exportAllCommand.d.ts +55 -0
  87. package/dist/cli/exportAllCommand.js +218 -0
  88. package/dist/cli/exportRunCommand.js +23 -21
  89. package/dist/cli/hostClient.d.ts +41 -3
  90. package/dist/cli/hostClient.js +129 -14
  91. package/dist/cli/initCommand.d.ts +1 -0
  92. package/dist/cli/initCommand.js +23 -7
  93. package/dist/cli/initTemplates.d.ts +5 -2
  94. package/dist/cli/initTemplates.js +32 -2
  95. package/dist/cli/resolveSafeOutPath.d.ts +2 -0
  96. package/dist/cli/resolveSafeOutPath.js +40 -0
  97. package/dist/cli/restoreCommand.d.ts +10 -0
  98. package/dist/cli/restoreCommand.js +90 -0
  99. package/dist/cli/runCommand.d.ts +3 -2
  100. package/dist/cli/runCommand.js +93 -11
  101. package/dist/cli/runOutput.d.ts +4 -0
  102. package/dist/cli/runOutput.js +33 -7
  103. package/dist/cli/runStageCommand.d.ts +1 -0
  104. package/dist/cli/runStageCommand.js +44 -25
  105. package/dist/cli/runsCommand.d.ts +1 -1
  106. package/dist/cli/runsCommand.js +168 -10
  107. package/dist/cli/triggerCommand.d.ts +12 -0
  108. package/dist/cli/triggerCommand.js +183 -0
  109. package/dist/cli/validateCommand.d.ts +1 -1
  110. package/dist/cli/validateCommand.js +23 -6
  111. package/dist/cli.js +202 -32
  112. package/dist/config/browseCatalog.d.ts +1 -0
  113. package/dist/config/browseCatalog.js +5 -4
  114. package/dist/config/builtinSkills.d.ts +4 -0
  115. package/dist/config/builtinSkills.js +23 -0
  116. package/dist/config/catalogRelativePath.d.ts +63 -0
  117. package/dist/config/catalogRelativePath.js +126 -0
  118. package/dist/config/configOrigin.d.ts +27 -0
  119. package/dist/config/configOrigin.js +59 -0
  120. package/dist/config/createTrigger.d.ts +27 -0
  121. package/dist/config/createTrigger.js +232 -0
  122. package/dist/config/draftPackage.d.ts +117 -0
  123. package/dist/config/draftPackage.js +550 -0
  124. package/dist/config/ensureCatalogScanRoot.d.ts +16 -0
  125. package/dist/config/ensureCatalogScanRoot.js +73 -0
  126. package/dist/config/hostConfig.d.ts +57 -0
  127. package/dist/config/hostConfig.js +360 -0
  128. package/dist/config/listSkills.d.ts +26 -0
  129. package/dist/config/listSkills.js +206 -5
  130. package/dist/config/loadOutcome.d.ts +7 -1
  131. package/dist/config/loadPipeline.js +39 -2
  132. package/dist/config/loadStage.js +25 -0
  133. package/dist/config/loadStageflowManifest.js +25 -0
  134. package/dist/config/loadTask.d.ts +2 -0
  135. package/dist/config/loadTask.js +57 -18
  136. package/dist/config/loadTrigger.d.ts +9 -0
  137. package/dist/config/loadTrigger.js +120 -0
  138. package/dist/config/materializeStageModels.js +5 -1
  139. package/dist/config/mergePipelineIncludes.d.ts +3 -0
  140. package/dist/config/mergePipelineIncludes.js +19 -0
  141. package/dist/config/migrateYaml.js +6 -11
  142. package/dist/config/multiProjectCatalog.d.ts +32 -0
  143. package/dist/config/multiProjectCatalog.js +150 -0
  144. package/dist/config/normalizePipelineStageEntry.js +27 -1
  145. package/dist/config/parseCompletionContract.js +6 -0
  146. package/dist/config/pipelineStageKeys.js +3 -0
  147. package/dist/config/publishDraftPackage.d.ts +7 -0
  148. package/dist/config/publishDraftPackage.js +25 -0
  149. package/dist/config/resolveCatalogContext.js +1 -1
  150. package/dist/config/resolveCatalogRoots.d.ts +27 -0
  151. package/dist/config/resolveCatalogRoots.js +76 -0
  152. package/dist/config/resolveModel.d.ts +7 -1
  153. package/dist/config/resolveModel.js +11 -1
  154. package/dist/config/resolvePipelineDag.js +1 -1
  155. package/dist/config/resolveStageMcpServers.d.ts +9 -1
  156. package/dist/config/resolveStageMcpServers.js +36 -9
  157. package/dist/config/scanCatalogPaths.d.ts +1 -1
  158. package/dist/config/scanCatalogPaths.js +6 -2
  159. package/dist/config/secretFromEnvOrFile.d.ts +9 -0
  160. package/dist/config/secretFromEnvOrFile.js +34 -0
  161. package/dist/config/seededCatalog.d.ts +11 -0
  162. package/dist/config/seededCatalog.js +29 -0
  163. package/dist/config/stageBrowser.d.ts +12 -0
  164. package/dist/config/stageBrowser.js +118 -0
  165. package/dist/config/toolRequires.d.ts +24 -0
  166. package/dist/config/toolRequires.js +115 -0
  167. package/dist/config/triggerCatalog.d.ts +10 -0
  168. package/dist/config/triggerCatalog.js +37 -0
  169. package/dist/config/validateCatalog.d.ts +17 -3
  170. package/dist/config/validateCatalog.js +223 -3
  171. package/dist/config/validateCompletionContract.js +8 -0
  172. package/dist/diagnostics/checks.d.ts +39 -0
  173. package/dist/diagnostics/checks.js +135 -0
  174. package/dist/envelope/preEmitChecks.d.ts +1 -1
  175. package/dist/envelope/preEmitChecks.js +8 -0
  176. package/dist/errors/codes.d.ts +14 -0
  177. package/dist/errors/codes.js +59 -0
  178. package/dist/git/cache.d.ts +14 -0
  179. package/dist/git/cache.js +150 -0
  180. package/dist/git/credentials.d.ts +9 -0
  181. package/dist/git/credentials.js +88 -0
  182. package/dist/git/errors.d.ts +20 -0
  183. package/dist/git/errors.js +94 -0
  184. package/dist/git/exec.d.ts +16 -0
  185. package/dist/git/exec.js +135 -0
  186. package/dist/git/operations.d.ts +29 -0
  187. package/dist/git/operations.js +153 -0
  188. package/dist/git/version.d.ts +1 -0
  189. package/dist/git/version.js +10 -0
  190. package/dist/logging/audit.d.ts +16 -0
  191. package/dist/logging/audit.js +19 -0
  192. package/dist/logging/commonWords.d.ts +2 -0
  193. package/dist/logging/commonWords.js +13 -0
  194. package/dist/logging/logger.d.ts +49 -0
  195. package/dist/logging/logger.js +193 -0
  196. package/dist/logging/namedSecrets.d.ts +6 -0
  197. package/dist/logging/namedSecrets.js +58 -0
  198. package/dist/logging/redact.d.ts +17 -0
  199. package/dist/logging/redact.js +105 -0
  200. package/dist/mcp/catalogTools.js +492 -81
  201. package/dist/mcp/checkoutTools.d.ts +52 -0
  202. package/dist/mcp/checkoutTools.js +332 -0
  203. package/dist/mcp/controlTools.js +182 -6
  204. package/dist/mcp/deps.d.ts +3 -0
  205. package/dist/mcp/getStartedTool.d.ts +3 -0
  206. package/dist/mcp/getStartedTool.js +62 -0
  207. package/dist/mcp/readArtifact.d.ts +11 -0
  208. package/dist/mcp/readArtifact.js +46 -30
  209. package/dist/mcp/server.js +2 -0
  210. package/dist/mcp/tools.js +6 -0
  211. package/dist/mcp/triggerTools.d.ts +3 -0
  212. package/dist/mcp/triggerTools.js +176 -0
  213. package/dist/net/proxy.d.ts +14 -0
  214. package/dist/net/proxy.js +78 -0
  215. package/dist/operatorAgent/docsRetrieval.d.ts +40 -0
  216. package/dist/operatorAgent/docsRetrieval.js +269 -0
  217. package/dist/operatorAgent/draftContext.d.ts +16 -0
  218. package/dist/operatorAgent/draftContext.js +68 -0
  219. package/dist/operatorAgent/fakeHost.d.ts +39 -0
  220. package/dist/operatorAgent/fakeHost.js +92 -0
  221. package/dist/operatorAgent/host.d.ts +40 -0
  222. package/dist/operatorAgent/host.js +179 -0
  223. package/dist/operatorAgent/index.d.ts +9 -0
  224. package/dist/operatorAgent/index.js +8 -0
  225. package/dist/operatorAgent/piModel.d.ts +80 -0
  226. package/dist/operatorAgent/piModel.js +528 -0
  227. package/dist/operatorAgent/profiles/workshopAuthor.d.ts +23 -0
  228. package/dist/operatorAgent/profiles/workshopAuthor.js +338 -0
  229. package/dist/operatorAgent/profiles/workshopAuthorPlaybook.d.ts +6 -0
  230. package/dist/operatorAgent/profiles/workshopAuthorPlaybook.js +103 -0
  231. package/dist/operatorAgent/profiles/workshopAuthorTools.d.ts +57 -0
  232. package/dist/operatorAgent/profiles/workshopAuthorTools.js +623 -0
  233. package/dist/operatorAgent/proposals.d.ts +32 -0
  234. package/dist/operatorAgent/proposals.js +144 -0
  235. package/dist/operatorAgent/types.d.ts +128 -0
  236. package/dist/operatorAgent/types.js +1 -0
  237. package/dist/package-meta.d.ts +2 -1
  238. package/dist/package-meta.js +2 -1
  239. package/dist/preflight/bash.d.ts +8 -0
  240. package/dist/preflight/bash.js +34 -0
  241. package/dist/preflight/claudeRoot.d.ts +11 -0
  242. package/dist/preflight/claudeRoot.js +23 -0
  243. package/dist/preflight/mcpCommands.d.ts +8 -0
  244. package/dist/preflight/mcpCommands.js +36 -0
  245. package/dist/preflight/pipelinePreflight.d.ts +40 -0
  246. package/dist/preflight/pipelinePreflight.js +192 -0
  247. package/dist/preflight/tls.d.ts +6 -0
  248. package/dist/preflight/tls.js +18 -0
  249. package/dist/preflight/toolchain.d.ts +45 -0
  250. package/dist/preflight/toolchain.js +219 -0
  251. package/dist/project/findManifestRoot.d.ts +3 -0
  252. package/dist/project/findManifestRoot.js +35 -0
  253. package/dist/project/findProjectRoot.js +3 -4
  254. package/dist/project/globalHome.d.ts +7 -0
  255. package/dist/project/globalHome.js +63 -2
  256. package/dist/project/resolveProjectContext.js +2 -2
  257. package/dist/project/resolveStageflowContext.d.ts +7 -0
  258. package/dist/project/resolveStageflowContext.js +46 -30
  259. package/dist/projection/projectRun.d.ts +2 -1
  260. package/dist/projection/projectRun.js +1 -0
  261. package/dist/runstore/assertTmpdir.d.ts +1 -0
  262. package/dist/runstore/assertTmpdir.js +25 -0
  263. package/dist/runstore/backup.d.ts +52 -0
  264. package/dist/runstore/backup.js +292 -0
  265. package/dist/runstore/createStore.d.ts +18 -1
  266. package/dist/runstore/createStore.js +64 -5
  267. package/dist/runstore/debugBundle.d.ts +60 -0
  268. package/dist/runstore/debugBundle.js +143 -0
  269. package/dist/runstore/diskUsage.d.ts +50 -0
  270. package/dist/runstore/diskUsage.js +214 -0
  271. package/dist/runstore/exportRunPayload.d.ts +8 -0
  272. package/dist/runstore/exportRunPayload.js +23 -0
  273. package/dist/runstore/normalizeCatalogPath.d.ts +1 -0
  274. package/dist/runstore/normalizeCatalogPath.js +10 -0
  275. package/dist/runstore/paths.d.ts +5 -0
  276. package/dist/runstore/paths.js +145 -1
  277. package/dist/runstore/port.d.ts +139 -13
  278. package/dist/runstore/port.js +8 -1
  279. package/dist/runstore/restore.d.ts +81 -0
  280. package/dist/runstore/restore.js +355 -0
  281. package/dist/runstore/retention.d.ts +27 -0
  282. package/dist/runstore/retention.js +74 -0
  283. package/dist/runstore/runManifest.d.ts +146 -0
  284. package/dist/runstore/runManifest.js +288 -0
  285. package/dist/runstore/runProjection.d.ts +3 -1
  286. package/dist/runstore/runProjection.js +63 -1
  287. package/dist/runstore/sqlite/SqliteRunStore.d.ts +35 -3
  288. package/dist/runstore/sqlite/SqliteRunStore.js +442 -219
  289. package/dist/runstore/sqlite/applyStorePragmas.d.ts +39 -0
  290. package/dist/runstore/sqlite/applyStorePragmas.js +145 -0
  291. package/dist/runstore/sqlite/migrations/001-baseline.d.ts +7 -0
  292. package/dist/runstore/sqlite/migrations/001-baseline.js +10 -0
  293. package/dist/runstore/sqlite/migrations/002-repository-binding.d.ts +7 -0
  294. package/dist/runstore/sqlite/migrations/002-repository-binding.js +29 -0
  295. package/dist/runstore/sqlite/migrations/003-run-lifecycle.d.ts +7 -0
  296. package/dist/runstore/sqlite/migrations/003-run-lifecycle.js +28 -0
  297. package/dist/runstore/sqlite/migrations/004-auto-resume-count.d.ts +7 -0
  298. package/dist/runstore/sqlite/migrations/004-auto-resume-count.js +19 -0
  299. package/dist/runstore/sqlite/migrations/005-config-origins.d.ts +7 -0
  300. package/dist/runstore/sqlite/migrations/005-config-origins.js +19 -0
  301. package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.d.ts +7 -0
  302. package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.js +28 -0
  303. package/dist/runstore/sqlite/migrations/007-projects-registry.d.ts +7 -0
  304. package/dist/runstore/sqlite/migrations/007-projects-registry.js +31 -0
  305. package/dist/runstore/sqlite/migrations/008-triggers-table.d.ts +7 -0
  306. package/dist/runstore/sqlite/migrations/008-triggers-table.js +19 -0
  307. package/dist/runstore/sqlite/migrations/009-trigger-next-run.d.ts +7 -0
  308. package/dist/runstore/sqlite/migrations/009-trigger-next-run.js +19 -0
  309. package/dist/runstore/sqlite/migrations/010-trigger-adapter-state.d.ts +7 -0
  310. package/dist/runstore/sqlite/migrations/010-trigger-adapter-state.js +17 -0
  311. package/dist/runstore/sqlite/migrations/index.d.ts +21 -0
  312. package/dist/runstore/sqlite/migrations/index.js +78 -0
  313. package/dist/runstore/sqlite/schema.d.ts +20 -1
  314. package/dist/runstore/sqlite/schema.js +277 -1
  315. package/dist/runstore/sqlite/storeOpenError.d.ts +6 -0
  316. package/dist/runstore/sqlite/storeOpenError.js +11 -0
  317. package/dist/runstore/sqlite/storeSchemaError.d.ts +5 -0
  318. package/dist/runstore/sqlite/storeSchemaError.js +8 -0
  319. package/dist/runstore/stageExecution.js +3 -0
  320. package/dist/runstore/storeFilesystem.d.ts +32 -0
  321. package/dist/runstore/storeFilesystem.js +148 -0
  322. package/dist/runstore/trackProjection.js +2 -0
  323. package/dist/runstore/workspaceLayout.d.ts +13 -0
  324. package/dist/runstore/workspaceLayout.js +76 -0
  325. package/dist/runtime/answerResume.d.ts +1 -0
  326. package/dist/runtime/answerResume.js +3 -1
  327. package/dist/runtime/completionCheckRunner.d.ts +15 -1
  328. package/dist/runtime/completionCheckRunner.js +67 -7
  329. package/dist/runtime/containerLimits.d.ts +16 -0
  330. package/dist/runtime/containerLimits.js +84 -0
  331. package/dist/runtime/credentialBinding.d.ts +2 -0
  332. package/dist/runtime/credentialBinding.js +3 -0
  333. package/dist/runtime/credentialMaterialisation.d.ts +28 -0
  334. package/dist/runtime/credentialMaterialisation.js +128 -0
  335. package/dist/runtime/emailSource.d.ts +72 -0
  336. package/dist/runtime/emailSource.js +304 -0
  337. package/dist/runtime/gitCheckoutCapability.js +7 -13
  338. package/dist/runtime/githubPollSource.d.ts +86 -0
  339. package/dist/runtime/githubPollSource.js +284 -0
  340. package/dist/runtime/pipelineRunner.d.ts +40 -1
  341. package/dist/runtime/pipelineRunner.js +181 -17
  342. package/dist/runtime/pipelineScheduler.d.ts +17 -0
  343. package/dist/runtime/pipelineScheduler.js +220 -28
  344. package/dist/runtime/reloadRunCatalog.js +6 -1
  345. package/dist/runtime/repositoryMaterialize.d.ts +47 -0
  346. package/dist/runtime/repositoryMaterialize.js +235 -0
  347. package/dist/runtime/resumeTimedOut.d.ts +1 -1
  348. package/dist/runtime/resumeTimedOut.js +5 -2
  349. package/dist/runtime/runChangeBus.js +9 -0
  350. package/dist/runtime/runDeletion.d.ts +7 -0
  351. package/dist/runtime/runDeletion.js +37 -0
  352. package/dist/runtime/runManager.d.ts +169 -4
  353. package/dist/runtime/runManager.js +1748 -83
  354. package/dist/runtime/runRetentionSweep.d.ts +31 -0
  355. package/dist/runtime/runRetentionSweep.js +328 -0
  356. package/dist/runtime/runRetryCoordinator.d.ts +4 -0
  357. package/dist/runtime/runRetryCoordinator.js +20 -2
  358. package/dist/runtime/runSkills.d.ts +40 -0
  359. package/dist/runtime/runSkills.js +173 -0
  360. package/dist/runtime/scheduleSource.d.ts +38 -0
  361. package/dist/runtime/scheduleSource.js +119 -0
  362. package/dist/runtime/settingsFile.d.ts +5 -0
  363. package/dist/runtime/settingsFile.js +61 -54
  364. package/dist/runtime/stageAttemptBootstrap.d.ts +5 -1
  365. package/dist/runtime/stageAttemptBootstrap.js +250 -27
  366. package/dist/runtime/stageCacheEnv.d.ts +6 -0
  367. package/dist/runtime/stageCacheEnv.js +34 -0
  368. package/dist/runtime/stageConcurrency.d.ts +2 -1
  369. package/dist/runtime/stageConcurrency.js +4 -2
  370. package/dist/runtime/stageEnvironment.d.ts +38 -0
  371. package/dist/runtime/stageEnvironment.js +194 -0
  372. package/dist/runtime/stageHitl.d.ts +1 -0
  373. package/dist/runtime/stageHitl.js +5 -1
  374. package/dist/runtime/stageProcessLauncher.d.ts +20 -0
  375. package/dist/runtime/stageProcessLauncher.js +236 -41
  376. package/dist/runtime/stageRecovery.d.ts +3 -1
  377. package/dist/runtime/stageRecovery.js +19 -4
  378. package/dist/runtime/stageRoots.d.ts +38 -1
  379. package/dist/runtime/stageRoots.js +118 -0
  380. package/dist/runtime/stageRunner.d.ts +6 -0
  381. package/dist/runtime/stageRunner.js +32 -6
  382. package/dist/runtime/stageSecretDecl.d.ts +9 -0
  383. package/dist/runtime/stageSecretDecl.js +102 -0
  384. package/dist/runtime/stageSecrets.d.ts +40 -0
  385. package/dist/runtime/stageSecrets.js +181 -0
  386. package/dist/runtime/stageStreamLog.d.ts +1 -0
  387. package/dist/runtime/stageStreamLog.js +2 -1
  388. package/dist/runtime/stageWorker.d.ts +3 -2
  389. package/dist/runtime/stageWorker.js +58 -10
  390. package/dist/runtime/stageWorkerProtocol.d.ts +5 -0
  391. package/dist/runtime/stageWorkerProtocol.js +8 -0
  392. package/dist/runtime/startPayload.d.ts +32 -0
  393. package/dist/runtime/startPayload.js +59 -0
  394. package/dist/runtime/taskInput.js +14 -5
  395. package/dist/runtime/triggerCatalog.d.ts +6 -0
  396. package/dist/runtime/triggerCatalog.js +24 -0
  397. package/dist/runtime/triggerEventMatch.d.ts +2 -0
  398. package/dist/runtime/triggerEventMatch.js +6 -0
  399. package/dist/runtime/triggerPort.d.ts +14 -0
  400. package/dist/runtime/triggerPort.js +1 -0
  401. package/dist/runtime/triggerRunner.d.ts +17 -0
  402. package/dist/runtime/triggerRunner.js +89 -0
  403. package/dist/runtime/verifiedStageExecution.d.ts +8 -0
  404. package/dist/runtime/verifiedStageExecution.js +16 -1
  405. package/dist/runtime/webhookSignature.d.ts +1 -0
  406. package/dist/runtime/webhookSignature.js +12 -0
  407. package/dist/runtime/workspaceBinding.d.ts +20 -0
  408. package/dist/runtime/workspaceBinding.js +60 -0
  409. package/dist/server/allowedHosts.d.ts +19 -0
  410. package/dist/server/allowedHosts.js +179 -0
  411. package/dist/server/bootstrap.d.ts +42 -2
  412. package/dist/server/bootstrap.js +273 -5
  413. package/dist/server/controlToken.d.ts +47 -0
  414. package/dist/server/controlToken.js +254 -0
  415. package/dist/server/createHttpHost.d.ts +11 -2
  416. package/dist/server/createHttpHost.js +106 -10
  417. package/dist/server/ensureGlobalService.d.ts +5 -1
  418. package/dist/server/ensureGlobalService.js +35 -1
  419. package/dist/server/healthSurfaces.d.ts +6 -0
  420. package/dist/server/healthSurfaces.js +123 -0
  421. package/dist/server/http.d.ts +27 -1
  422. package/dist/server/http.js +2254 -477
  423. package/dist/server/listenHost.d.ts +5 -0
  424. package/dist/server/listenHost.js +56 -0
  425. package/dist/server/mcpHost.d.ts +10 -1
  426. package/dist/server/mcpHost.js +36 -6
  427. package/dist/server/operatorResults.d.ts +2 -2
  428. package/dist/server/operatorResults.js +40 -29
  429. package/dist/server/requestAuthContext.d.ts +12 -0
  430. package/dist/server/requestAuthContext.js +21 -0
  431. package/dist/server/shutdown.d.ts +69 -0
  432. package/dist/server/shutdown.js +219 -0
  433. package/dist/server/triggerRoutes.d.ts +15 -0
  434. package/dist/server/triggerRoutes.js +268 -0
  435. package/dist/tools/askOperator.d.ts +3 -2
  436. package/dist/types/completion.d.ts +3 -0
  437. package/dist/types/pipeline.d.ts +10 -1
  438. package/dist/types/preEmitCheck.d.ts +7 -0
  439. package/dist/types/stage.d.ts +22 -0
  440. package/dist/types/stageflowManifest.d.ts +3 -0
  441. package/dist/types/task.d.ts +8 -0
  442. package/dist/types/trigger.d.ts +18 -0
  443. package/dist/types/trigger.js +1 -0
  444. package/dist/ui/assets/{index-CSsDued1.css → index-Bv4p1aPK.css} +1 -1
  445. package/dist/ui/assets/index-CntB4bZR.js +133 -0
  446. package/dist/ui/index.html +2 -2
  447. package/dist/workshop/autosave.d.ts +58 -0
  448. package/dist/workshop/autosave.js +222 -0
  449. package/dist/workshop/buildStore.d.ts +79 -0
  450. package/dist/workshop/buildStore.js +326 -0
  451. package/dist/workshop/chatTurn.d.ts +232 -0
  452. package/dist/workshop/chatTurn.js +475 -0
  453. package/dist/workshop/modelSettings.d.ts +18 -0
  454. package/dist/workshop/modelSettings.js +44 -0
  455. package/dist/workshop/sessionStore.d.ts +61 -0
  456. package/dist/workshop/sessionStore.js +254 -0
  457. package/dist/workshop/workshopPin.d.ts +72 -0
  458. package/dist/workshop/workshopPin.js +193 -0
  459. package/examples/README.md +99 -0
  460. package/examples/archify-on-pr/README.md +213 -0
  461. package/examples/archify-on-pr/archify-on-pr.pipeline.yaml +19 -0
  462. package/examples/archify-on-pr/archify-on-pr.task.yaml +19 -0
  463. package/examples/archify-on-pr/author-diagrams.yaml +106 -0
  464. package/examples/archify-on-pr/detect-changes.yaml +89 -0
  465. package/examples/browser-session/README.md +77 -0
  466. package/examples/browser-session/browser-session.pipeline.yaml +50 -0
  467. package/examples/browser-session/browser-session.task.yaml +6 -0
  468. package/examples/browser-session/check-login.yaml +22 -0
  469. package/examples/browser-session/fixture-server.mjs +64 -0
  470. package/examples/browser-session/human-login.yaml +31 -0
  471. package/examples/browser-session/merge.yaml +36 -0
  472. package/examples/browser-session/work-a.yaml +41 -0
  473. package/examples/browser-session/work-b.yaml +41 -0
  474. package/examples/ci-validate/README.md +35 -0
  475. package/examples/ci-validate/check.yaml +13 -0
  476. package/examples/ci-validate/ci-demo.pipeline.yaml +4 -0
  477. package/examples/ci-validate/validate.sh +5 -0
  478. package/examples/compliance-review-demo/README.md +125 -0
  479. package/examples/compliance-review-demo/compliance-review-demo.pipeline.yaml +29 -0
  480. package/examples/compliance-review-demo/connect-account.yaml +47 -0
  481. package/examples/compliance-review-demo/map-to-control.yaml +123 -0
  482. package/examples/compliance-review-demo/poll-bucket-config.yaml +103 -0
  483. package/examples/compliance-review-demo/publish-report.yaml +79 -0
  484. package/examples/compliance-review-demo/review-verdict.yaml +122 -0
  485. package/examples/compliance-review-demo/run-compliance-check.yaml +96 -0
  486. package/examples/compliance-review-demo/store-evidence.yaml +143 -0
  487. package/examples/conditional-fork/README.md +89 -0
  488. package/examples/conditional-fork/branch-a.yaml +13 -0
  489. package/examples/conditional-fork/branch-b.yaml +13 -0
  490. package/examples/conditional-fork/decide.yaml +35 -0
  491. package/examples/conditional-fork/fork-demo.pipeline.yaml +20 -0
  492. package/examples/conditional-fork/fork-demo.task.yaml +8 -0
  493. package/examples/context7-mcp/README.md +42 -0
  494. package/examples/context7-mcp/context7-mcp.pipeline.yaml +15 -0
  495. package/examples/context7-mcp/context7-mcp.task.yaml +4 -0
  496. package/examples/context7-mcp/fetch-docs.yaml +52 -0
  497. package/examples/context7-mcp/resolve-library.yaml +31 -0
  498. package/examples/context7-mcp/write-brief.yaml +52 -0
  499. package/examples/feature-loop/README.md +104 -0
  500. package/examples/feature-loop/address-feedback.yaml +148 -0
  501. package/examples/feature-loop/align.yaml +116 -0
  502. package/examples/feature-loop/decompose.yaml +86 -0
  503. package/examples/feature-loop/default-model-hierarchy.task.yaml +58 -0
  504. package/examples/feature-loop/feature-loop.pipeline.yaml +140 -0
  505. package/examples/feature-loop/feature-loop.task.yaml +25 -0
  506. package/examples/feature-loop/implement.yaml +128 -0
  507. package/examples/feature-loop/plan.yaml +111 -0
  508. package/examples/feature-loop/publish.yaml +167 -0
  509. package/examples/feature-loop/review.yaml +146 -0
  510. package/examples/feature-loop/verify.yaml +106 -0
  511. package/examples/feedback-loop/README.md +72 -0
  512. package/examples/feedback-loop/VERIFY.md +208 -0
  513. package/examples/feedback-loop/continue-only.task.yaml +4 -0
  514. package/examples/feedback-loop/exhaust-require-continue.task.yaml +6 -0
  515. package/examples/feedback-loop/exhaust-wait-human.task.yaml +11 -0
  516. package/examples/feedback-loop/feedback-loop-wait-human.pipeline.yaml +23 -0
  517. package/examples/feedback-loop/feedback-loop.pipeline.yaml +23 -0
  518. package/examples/feedback-loop/feedback-loop.task.yaml +4 -0
  519. package/examples/feedback-loop/implement.yaml +14 -0
  520. package/examples/feedback-loop/plan.yaml +14 -0
  521. package/examples/feedback-loop/review.yaml +15 -0
  522. package/examples/feedback-loop/send-back-once.task.yaml +6 -0
  523. package/examples/feedback-loop/submit.yaml +12 -0
  524. package/examples/generic-fan-in/README.md +151 -0
  525. package/examples/generic-fan-in/clarify.yaml +18 -0
  526. package/examples/generic-fan-in/generic-fan-in-accepted.pipeline.yaml +19 -0
  527. package/examples/generic-fan-in/generic-fan-in-accepted.task.yaml +8 -0
  528. package/examples/generic-fan-in/generic-fan-in.pipeline.yaml +18 -0
  529. package/examples/generic-fan-in/generic-fan-in.task.yaml +9 -0
  530. package/examples/generic-fan-in/research.yaml +45 -0
  531. package/examples/generic-fan-in/synthesize.yaml +66 -0
  532. package/examples/generic-fan-in/validation.yaml +45 -0
  533. package/examples/github-release/README.md +78 -0
  534. package/examples/github-release/draft-release-notes.yaml +64 -0
  535. package/examples/github-release/github-release.pipeline.yaml +11 -0
  536. package/examples/github-release/github-release.task.yaml +13 -0
  537. package/examples/github-release/publish-github-release.yaml +64 -0
  538. package/examples/hello-world/README.md +28 -0
  539. package/examples/hello-world/hello.pipeline.yaml +4 -0
  540. package/examples/hello-world/my-task.task.yaml +6 -0
  541. package/examples/hello-world/research.yaml +18 -0
  542. package/examples/mcp-hitl-tour/README.md +113 -0
  543. package/examples/mcp-hitl-tour/draft-angle.yaml +33 -0
  544. package/examples/mcp-hitl-tour/draft-short.yaml +32 -0
  545. package/examples/mcp-hitl-tour/emit-angles.yaml +45 -0
  546. package/examples/mcp-hitl-tour/gather.yaml +31 -0
  547. package/examples/mcp-hitl-tour/intake.yaml +62 -0
  548. package/examples/mcp-hitl-tour/mcp-hitl-tour-exhaust.task.yaml +13 -0
  549. package/examples/mcp-hitl-tour/mcp-hitl-tour.pipeline.yaml +54 -0
  550. package/examples/mcp-hitl-tour/mcp-hitl-tour.task.yaml +16 -0
  551. package/examples/mcp-hitl-tour/polish.yaml +33 -0
  552. package/examples/mcp-hitl-tour/review.yaml +17 -0
  553. package/examples/mcp-hitl-tour/ship.yaml +25 -0
  554. package/examples/oss-issue-contribution/README.md +218 -0
  555. package/examples/oss-issue-contribution/oss-address-review-feedback.yaml +117 -0
  556. package/examples/oss-issue-contribution/oss-approve-contribution.yaml +181 -0
  557. package/examples/oss-issue-contribution/oss-approve-plan.yaml +111 -0
  558. package/examples/oss-issue-contribution/oss-explain-fix.yaml +108 -0
  559. package/examples/oss-issue-contribution/oss-explain-issue.yaml +114 -0
  560. package/examples/oss-issue-contribution/oss-implement-source-fix.yaml +171 -0
  561. package/examples/oss-issue-contribution/oss-investigate-area.yaml +116 -0
  562. package/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml +125 -0
  563. package/examples/oss-issue-contribution/oss-issue-intake.yaml +106 -0
  564. package/examples/oss-issue-contribution/oss-plan-investigation.yaml +112 -0
  565. package/examples/oss-issue-contribution/oss-plan-review.yaml +109 -0
  566. package/examples/oss-issue-contribution/oss-reproduce-issue.yaml +140 -0
  567. package/examples/oss-issue-contribution/oss-review-change.yaml +107 -0
  568. package/examples/oss-issue-contribution/oss-verify-fix.yaml +130 -0
  569. package/examples/oss-issue-contribution/oss-write-regression-test.yaml +135 -0
  570. package/examples/oss-issue-contribution/pi-7629.task.yaml +79 -0
  571. package/examples/oss-issue-contribution/pi-8919.task.yaml +75 -0
  572. package/examples/oss-issue-contribution/pydantic-ai-7971.task.yaml +53 -0
  573. package/examples/oss-quick-fix/README.md +65 -0
  574. package/examples/oss-quick-fix/implement-fix.yaml +84 -0
  575. package/examples/oss-quick-fix/oss-quick-fix.pipeline.yaml +35 -0
  576. package/examples/oss-quick-fix/oss-quick-fix.task.yaml +19 -0
  577. package/examples/oss-quick-fix/ship-fix.yaml +81 -0
  578. package/examples/oss-quick-fix/understand-issue.yaml +67 -0
  579. package/examples/oss-quick-fix/verify-fix.yaml +73 -0
  580. package/examples/plan-review/README.md +37 -0
  581. package/examples/plan-review/plan-review-followup.yaml +13 -0
  582. package/examples/plan-review/plan-review.pipeline.yaml +9 -0
  583. package/examples/plan-review/plan-review.task.yaml +9 -0
  584. package/examples/plan-review/plan-review.yaml +25 -0
  585. package/examples/playwright-mcp/README.md +39 -0
  586. package/examples/playwright-mcp/playwright-mcp.pipeline.yaml +5 -0
  587. package/examples/playwright-mcp/playwright-mcp.task.yaml +4 -0
  588. package/examples/playwright-mcp/screenshot.yaml +40 -0
  589. package/examples/retry-tour/README.md +75 -0
  590. package/examples/retry-tour/retry-tour.pipeline.yaml +122 -0
  591. package/examples/retry-tour/retry-tour.task.yaml +9 -0
  592. package/examples/route-if-tour/README.md +202 -0
  593. package/examples/route-if-tour/route-if-tour.pipeline.yaml +950 -0
  594. package/examples/route-if-tour/route-if-tour.task.yaml +4 -0
  595. package/examples/route-wiring-smoke-test/01-core-routing.pipeline.yaml +168 -0
  596. package/examples/route-wiring-smoke-test/02-on-gating.pipeline.yaml +44 -0
  597. package/examples/route-wiring-smoke-test/03-two-entry-points.pipeline.yaml +28 -0
  598. package/examples/route-wiring-smoke-test/04-entry-false-equivalent-to-omitted.pipeline.yaml +27 -0
  599. package/examples/route-wiring-smoke-test/05-fork-choice.pipeline.yaml +110 -0
  600. package/examples/route-wiring-smoke-test/06-fan-out-fan-in.pipeline.yaml +82 -0
  601. package/examples/route-wiring-smoke-test/07-loop-human-decision.pipeline.yaml +82 -0
  602. package/examples/route-wiring-smoke-test/08-skip-fallback-and-multi-on-gate.pipeline.yaml +77 -0
  603. package/examples/route-wiring-smoke-test/09-multi-loop-targets.pipeline.yaml +102 -0
  604. package/examples/route-wiring-smoke-test/10-uses-dialect-fork.pipeline.yaml +23 -0
  605. package/examples/route-wiring-smoke-test/11-sequential-io-handoff.pipeline.yaml +37 -0
  606. package/examples/route-wiring-smoke-test/12-complex-io-schemas.pipeline.yaml +138 -0
  607. package/examples/route-wiring-smoke-test/13-ref-io-handoff.pipeline.yaml +84 -0
  608. package/examples/route-wiring-smoke-test/14-if-eq-gating.pipeline.yaml +50 -0
  609. package/examples/route-wiring-smoke-test/15-if-all-gated.pipeline.yaml +37 -0
  610. package/examples/route-wiring-smoke-test/16-if-composition.pipeline.yaml +65 -0
  611. package/examples/route-wiring-smoke-test/17-if-join.pipeline.yaml +80 -0
  612. package/examples/route-wiring-smoke-test/README.md +377 -0
  613. package/examples/route-wiring-smoke-test/rejected/01-reject-legacy-needs.pipeline.yaml +26 -0
  614. package/examples/route-wiring-smoke-test/rejected/02-reject-legacy-fork.pipeline.yaml +25 -0
  615. package/examples/route-wiring-smoke-test/rejected/03-reject-legacy-feedback-loop.pipeline.yaml +30 -0
  616. package/examples/route-wiring-smoke-test/rejected/04-reject-missing-entry.pipeline.yaml +24 -0
  617. package/examples/route-wiring-smoke-test/rejected/05-reject-unreachable.pipeline.yaml +35 -0
  618. package/examples/route-wiring-smoke-test/rejected/06-reject-allow-none-without-route-select.pipeline.yaml +37 -0
  619. package/examples/route-wiring-smoke-test/rejected/07-reject-cycle.pipeline.yaml +27 -0
  620. package/examples/route-wiring-smoke-test/rejected/08-reject-loop-non-ancestor.pipeline.yaml +42 -0
  621. package/examples/route-wiring-smoke-test/rejected/09-reject-route-select-leaf.pipeline.yaml +26 -0
  622. package/examples/route-wiring-smoke-test/rejected/12-reject-loop-replay-unsafe.pipeline.yaml +55 -0
  623. package/examples/route-wiring-smoke-test/rejected/13-reject-multiple-loop-entries.pipeline.yaml +51 -0
  624. package/examples/route-wiring-smoke-test/rejected/14-reject-duplicate-stage-id.pipeline.yaml +35 -0
  625. package/examples/route-wiring-smoke-test/rejected/15-reject-unknown-route-target.pipeline.yaml +15 -0
  626. package/examples/route-wiring-smoke-test/rejected/16-reject-malformed-route-item.pipeline.yaml +15 -0
  627. package/examples/route-wiring-smoke-test/rejected/17-reject-io-incompatible.pipeline.yaml +33 -0
  628. package/examples/route-wiring-smoke-test/rejected/18-reject-nested-io.pipeline.yaml +51 -0
  629. package/examples/route-wiring-smoke-test/rejected/19-reject-array-item-io.pipeline.yaml +55 -0
  630. package/examples/route-wiring-smoke-test/rejected/20-reject-closed-io.pipeline.yaml +36 -0
  631. package/examples/route-wiring-smoke-test/rejected/21-reject-ref-io.pipeline.yaml +42 -0
  632. package/examples/route-wiring-smoke-test/rejected/22-reject-if-unknown-field.pipeline.yaml +33 -0
  633. package/examples/route-wiring-smoke-test/rejected/23-reject-if-optional-field.pipeline.yaml +32 -0
  634. package/examples/route-wiring-smoke-test/rejected/24-reject-if-empty-all.pipeline.yaml +31 -0
  635. package/examples/route-wiring-smoke-test/rejected/25-reject-if-gt-on-string.pipeline.yaml +33 -0
  636. package/examples/route-wiring-smoke-test/rejected/26-reject-if-optional-nested.pipeline.yaml +36 -0
  637. package/examples/route-wiring-smoke-test/rejected/27-reject-if-on-loop.pipeline.yaml +63 -0
  638. package/examples/route-wiring-smoke-test/rejected/29-reject-if-on-failed.pipeline.yaml +46 -0
  639. package/examples/route-wiring-smoke-test/smoke-test.task.yaml +4 -0
  640. package/examples/route-wiring-smoke-test/stages/branch-a.yaml +12 -0
  641. package/examples/route-wiring-smoke-test/stages/branch-b.yaml +12 -0
  642. package/examples/route-wiring-smoke-test/stages/decide.yaml +12 -0
  643. package/examples/route-wiring-smoke-test/stages/finish.yaml +12 -0
  644. package/examples/ship-feature/README.md +190 -0
  645. package/examples/ship-feature/feat-address-feedback.yaml +119 -0
  646. package/examples/ship-feature/feat-implement.yaml +180 -0
  647. package/examples/ship-feature/feat-plan.yaml +120 -0
  648. package/examples/ship-feature/feat-review.yaml +109 -0
  649. package/examples/ship-feature/feat-ship.yaml +203 -0
  650. package/examples/ship-feature/ship-feature.pipeline.yaml +44 -0
  651. package/examples/ship-feature/ship-feature.task.yaml +78 -0
  652. package/examples/stage-mcp/README.md +145 -0
  653. package/examples/stage-mcp/echo-mcp.mjs +20 -0
  654. package/examples/stage-mcp/stage-mcp-dead.pipeline.yaml +5 -0
  655. package/examples/stage-mcp/stage-mcp-dead.task.yaml +3 -0
  656. package/examples/stage-mcp/stage-mcp-missing-var.pipeline.yaml +5 -0
  657. package/examples/stage-mcp/stage-mcp-missing-var.task.yaml +3 -0
  658. package/examples/stage-mcp/stage-mcp.pipeline.yaml +5 -0
  659. package/examples/stage-mcp/stage-mcp.task.yaml +4 -0
  660. package/examples/stage-mcp/use-echo.yaml +20 -0
  661. package/examples/stageflow.yaml +51 -0
  662. package/examples/verify-tour/README.md +80 -0
  663. package/examples/verify-tour/verify-tour.pipeline.yaml +162 -0
  664. package/examples/verify-tour/verify-tour.task.yaml +11 -0
  665. package/package.json +9 -1
  666. package/skills/stageflow/SKILL.md +6 -6
  667. package/skills/stageflow/references/control-surface.md +13 -5
  668. package/skills/stageflow/scripts/detect-host.mjs +14 -1
  669. package/skills/stageflow/scripts/detect-host.test.mjs +29 -1
  670. package/skills/stageflow-author/SKILL.md +4 -3
  671. package/skills/stageflow-author/references/catalog-mapping.md +16 -0
  672. package/skills/stageflow-author/references/catalog-write-conventions.md +1 -1
  673. package/skills/stageflow-author/references/stage-prompt-template.md +4 -4
  674. package/skills/stageflow-run/SKILL.md +22 -12
  675. package/skills/stageflow-run/references/mcp-call.md +9 -1
  676. package/skills/stageflow-run/references/task-and-pipeline-selection.md +19 -6
  677. package/skills/stageflow-run/scripts/mcp-call.mjs +46 -6
  678. package/skills/stageflow-run/scripts/mcp-call.test.mjs +64 -0
  679. package/skills/stageflow-session-capture/references/catalog-authoring.md +2 -0
  680. package/skills/stageflow-setup/SKILL.md +51 -8
  681. package/dist/ui/assets/index-Da5EHU6M.js +0 -119
@@ -0,0 +1,218 @@
1
+ import { createWriteStream } from "node:fs";
2
+ import path from "node:path";
3
+ import { projectRun } from "../projection/projectRun.js";
4
+ import { PACKAGE_VERSION } from "../package-meta.js";
5
+ import { globalStageflowHome } from "../project/globalHome.js";
6
+ import { createRunStoreAfterHostEnsure, } from "../runstore/createStore.js";
7
+ import { isInsideDir } from "../runstore/workspaceLayout.js";
8
+ import { ensureGlobalService } from "../server/ensureGlobalService.js";
9
+ export const EXPORT_ALL_USAGE = `Usage:
10
+ sf export --all [--status <status>] [--since <iso>] [--pipeline <id-or-path>] [--out <file>]
11
+
12
+ Streams whole-instance NDJSON (header + one projectRun line per run, including
13
+ non-terminal). Not a backup — restore does not accept export streams.`;
14
+ const defaultIo = {
15
+ log: (line) => console.log(line),
16
+ error: (line) => console.error(line),
17
+ };
18
+ export function buildExportHeader(filter, now = new Date()) {
19
+ return {
20
+ type: "stageflow_export",
21
+ version: 1,
22
+ stageflow_version: PACKAGE_VERSION,
23
+ created_at: now.toISOString(),
24
+ ...(filter !== undefined ? { filter } : {}),
25
+ };
26
+ }
27
+ export function resolveExportPipelineSource(options) {
28
+ if (options.pipelineSource === "inline") {
29
+ if (options.pipelineBody != null && options.pipelineBody !== "") {
30
+ try {
31
+ return {
32
+ kind: "inline",
33
+ pipeline: JSON.parse(options.pipelineBody),
34
+ };
35
+ }
36
+ catch {
37
+ return {
38
+ kind: "unavailable",
39
+ pipeline: null,
40
+ note: "pipeline_body is not valid JSON",
41
+ };
42
+ }
43
+ }
44
+ return {
45
+ kind: "unavailable",
46
+ pipeline: null,
47
+ note: "inline pipeline body missing",
48
+ };
49
+ }
50
+ if (options.pipelineSource === "path" || options.pipelinePath) {
51
+ return {
52
+ kind: "path",
53
+ path: options.pipelinePath ?? "",
54
+ pipeline: null,
55
+ };
56
+ }
57
+ return {
58
+ kind: "unavailable",
59
+ pipeline: null,
60
+ note: "pipeline source not recorded",
61
+ };
62
+ }
63
+ export function projectRunForExport(detail, pipelineBody) {
64
+ return {
65
+ ...projectRun(detail),
66
+ pipeline_source: resolveExportPipelineSource({
67
+ pipelineSource: detail.pipeline_source,
68
+ pipelinePath: detail.pipeline_path,
69
+ pipelineBody,
70
+ }),
71
+ };
72
+ }
73
+ export function assertExportOutPathAllowed(outPath, homeDir = globalStageflowHome(), cwd = process.cwd()) {
74
+ const segments = outPath.split(/[/\\]/);
75
+ if (segments.some((segment) => segment === "..")) {
76
+ throw new Error("path must not contain .. segments");
77
+ }
78
+ const resolved = path.isAbsolute(outPath)
79
+ ? path.resolve(outPath)
80
+ : path.resolve(cwd, outPath);
81
+ const worktrees = path.resolve(homeDir, "worktrees");
82
+ const runs = path.resolve(homeDir, "runs");
83
+ if (isInsideDir(resolved, worktrees) || isInsideDir(resolved, runs)) {
84
+ throw new Error("output path must not be under worktrees/ or runs/");
85
+ }
86
+ return resolved;
87
+ }
88
+ function parseExportArgs(args) {
89
+ let help = false;
90
+ let all = false;
91
+ let status;
92
+ let since;
93
+ let pipeline;
94
+ let outPath;
95
+ for (let i = 0; i < args.length; i += 1) {
96
+ const arg = args[i];
97
+ if (arg === "--help" || arg === "-h") {
98
+ help = true;
99
+ }
100
+ else if (arg === "--all") {
101
+ all = true;
102
+ }
103
+ else if (arg === "--status") {
104
+ const value = args[++i];
105
+ if (value === undefined)
106
+ throw new Error("Missing value for --status");
107
+ status = value;
108
+ }
109
+ else if (arg === "--since") {
110
+ const value = args[++i];
111
+ if (value === undefined)
112
+ throw new Error("Missing value for --since");
113
+ since = value;
114
+ }
115
+ else if (arg === "--pipeline") {
116
+ const value = args[++i];
117
+ if (value === undefined)
118
+ throw new Error("Missing value for --pipeline");
119
+ pipeline = value;
120
+ }
121
+ else if (arg === "--out") {
122
+ const value = args[++i];
123
+ if (value === undefined)
124
+ throw new Error("Missing value for --out");
125
+ outPath = value;
126
+ }
127
+ else if (arg?.startsWith("-")) {
128
+ throw new Error(`Unknown flag: ${arg}`);
129
+ }
130
+ else {
131
+ throw new Error(`Unexpected argument: ${arg}`);
132
+ }
133
+ }
134
+ return { help, all, status, since, pipeline, outPath };
135
+ }
136
+ export async function* iterateExportNdjson(options) {
137
+ yield `${JSON.stringify(buildExportHeader(options.filter, options.now ?? new Date()))}\n`;
138
+ const runs = await options.store.listRuns(options.filter);
139
+ for (const summary of runs) {
140
+ const detail = await options.store.readRun(summary.run_id);
141
+ const pipelineBody = await options.store.readPipelineBody(summary.run_id);
142
+ const line = {
143
+ type: "projectRun",
144
+ run: projectRunForExport(detail, pipelineBody),
145
+ };
146
+ yield `${JSON.stringify(line)}\n`;
147
+ }
148
+ }
149
+ export async function runExportAllCommand(args, options = {}) {
150
+ const cwd = options.cwd ?? process.cwd();
151
+ const out = { ...defaultIo, ...options.io };
152
+ let parsed;
153
+ try {
154
+ parsed = parseExportArgs(args);
155
+ }
156
+ catch (err) {
157
+ const message = err instanceof Error ? err.message : String(err);
158
+ out.error(message);
159
+ out.error(EXPORT_ALL_USAGE);
160
+ return 1;
161
+ }
162
+ if (parsed.help) {
163
+ out.error(EXPORT_ALL_USAGE);
164
+ return 0;
165
+ }
166
+ if (!parsed.all) {
167
+ out.error("sf export requires --all (whole-instance NDJSON)");
168
+ out.error(EXPORT_ALL_USAGE);
169
+ return 1;
170
+ }
171
+ const filter = {};
172
+ if (parsed.status !== undefined)
173
+ filter.status = parsed.status;
174
+ if (parsed.since !== undefined)
175
+ filter.since = parsed.since;
176
+ if (parsed.pipeline !== undefined)
177
+ filter.pipeline = parsed.pipeline;
178
+ const opened = await createRunStoreAfterHostEnsure({ rootDir: globalStageflowHome() }, () => ensureGlobalService());
179
+ if (!opened.ok) {
180
+ out.error(opened.message);
181
+ return 1;
182
+ }
183
+ const store = opened.store;
184
+ try {
185
+ let sink = (line) => out.log(line.replace(/\n$/, ""));
186
+ let close;
187
+ if (parsed.outPath !== undefined) {
188
+ const target = assertExportOutPathAllowed(parsed.outPath, globalStageflowHome(), cwd);
189
+ const stream = createWriteStream(target);
190
+ sink = (line) => {
191
+ stream.write(line);
192
+ };
193
+ close = () => new Promise((resolve, reject) => {
194
+ stream.end(() => resolve());
195
+ stream.on("error", reject);
196
+ });
197
+ }
198
+ for await (const line of iterateExportNdjson({
199
+ store,
200
+ filter: Object.keys(filter).length > 0 ? filter : undefined,
201
+ })) {
202
+ sink(line);
203
+ }
204
+ await close?.();
205
+ if (parsed.outPath !== undefined) {
206
+ out.error(`Wrote ${assertExportOutPathAllowed(parsed.outPath, globalStageflowHome(), cwd)}`);
207
+ }
208
+ return 0;
209
+ }
210
+ catch (err) {
211
+ const message = err instanceof Error ? err.message : String(err);
212
+ out.error(message);
213
+ return 1;
214
+ }
215
+ finally {
216
+ await store.close();
217
+ }
218
+ }
@@ -1,9 +1,10 @@
1
1
  import { readFileSync, writeFileSync } from "node:fs";
2
2
  import path from "node:path";
3
- import { projectRun } from "../projection/projectRun.js";
4
3
  import { globalStageflowHome } from "../project/globalHome.js";
5
- import { createRunStore } from "../runstore/createStore.js";
6
- import { isInsideDir } from "../runstore/workspaceLayout.js";
4
+ import { createRunStoreAfterHostEnsure, } from "../runstore/createStore.js";
5
+ import { ensureGlobalService, } from "../server/ensureGlobalService.js";
6
+ import { buildRunExportPayload } from "../runstore/exportRunPayload.js";
7
+ import { resolveSafeOutPath } from "./resolveSafeOutPath.js";
7
8
  export const EXPORT_RUN_USAGE = `Usage:
8
9
  sf export-run --run <runId> [--from <sf-run.json>] [--out <file>]`;
9
10
  const defaultIo = {
@@ -75,23 +76,19 @@ function resolveRunIdFromFile(fromPath, cwd) {
75
76
  }
76
77
  return runId;
77
78
  }
78
- function resolveSafeOutPath(outPath, cwd) {
79
- const segments = outPath.split(/[/\\]/);
80
- if (segments.some((segment) => segment === "..")) {
81
- throw new Error("path must not contain .. segments");
82
- }
83
- const resolved = path.resolve(cwd, outPath);
84
- const cwdResolved = path.resolve(cwd);
85
- if (!isInsideDir(resolved, cwdResolved)) {
86
- throw new Error("output path must resolve under the current working directory");
87
- }
88
- return resolved;
89
- }
90
- function assertRunComplete(status, runId) {
91
- if (status === "succeeded" || status === "failed") {
79
+ const EXPORTABLE_STATUSES = new Set([
80
+ "running",
81
+ "succeeded",
82
+ "failed",
83
+ "cancelled",
84
+ "queued",
85
+ "created",
86
+ ]);
87
+ function assertRunExportable(status, runId) {
88
+ if (EXPORTABLE_STATUSES.has(status)) {
92
89
  return;
93
90
  }
94
- throw new Error(`run is not complete: ${runId} (status: ${status})`);
91
+ throw new Error(`run cannot be exported: ${runId} (status: ${status})`);
95
92
  }
96
93
  export async function runExportRunCommand(args, options = {}) {
97
94
  const cwd = options.cwd ?? process.cwd();
@@ -126,11 +123,16 @@ export async function runExportRunCommand(args, options = {}) {
126
123
  out.error(EXPORT_RUN_USAGE);
127
124
  return 1;
128
125
  }
129
- const store = createRunStore({ rootDir: globalStageflowHome() });
126
+ const opened = await createRunStoreAfterHostEnsure({ rootDir: globalStageflowHome() }, () => ensureGlobalService());
127
+ if (!opened.ok) {
128
+ out.error(opened.message);
129
+ return 1;
130
+ }
131
+ const store = opened.store;
130
132
  try {
131
133
  const detail = await store.readRun(runId);
132
- assertRunComplete(detail.status, runId);
133
- const projection = projectRun(detail);
134
+ assertRunExportable(detail.status, runId);
135
+ const projection = buildRunExportPayload(detail);
134
136
  const json = JSON.stringify(projection, null, 2);
135
137
  if (parsed.outPath !== undefined) {
136
138
  const target = resolveSafeOutPath(parsed.outPath, cwd);
@@ -1,8 +1,10 @@
1
1
  import type { PipelineRunResult } from "../runtime/pipelineRunner.js";
2
- import type { AbandonStageResult, DecideFeedbackLoopResult, StartRunResult, StopManualRecoveryResult } from "../runtime/runManager.js";
2
+ import type { AbandonStageResult, CancelRunResult, DecideFeedbackLoopResult, DeleteRunResult, GcRunsResult, StartRunResult, StopManualRecoveryResult } from "../runtime/runManager.js";
3
3
  import type { DeliverAnswerResult } from "../runtime/stageHitl.js";
4
4
  import type { RetryStageResult } from "../runtime/runRetryCoordinator.js";
5
5
  import type { RunDetail, RunStore } from "../runstore/port.js";
6
+ import type { TriggerListItem } from "../server/triggerRoutes.js";
7
+ import type { TaskFile } from "../types/task.js";
6
8
  export declare function computeRunDir(runId: string): string;
7
9
  export declare function httpReadRun(base: string, runId: string): Promise<RunDetail>;
8
10
  /** Thin RunStore-shaped reader backed by the global service, for the CLI output helpers that only need `readRun`. */
@@ -13,7 +15,8 @@ export declare function pollRunUntilTerminal(base: string, runId: string, option
13
15
  export declare function runDetailToPipelineRunResult(detail: RunDetail): PipelineRunResult;
14
16
  export type HttpStartRunInput = {
15
17
  pipeline: string;
16
- task: string;
18
+ task: string | TaskFile;
19
+ project_root?: string;
17
20
  checkoutOverride?: string;
18
21
  skipGates?: boolean;
19
22
  gitSha?: string;
@@ -21,7 +24,16 @@ export type HttpStartRunInput = {
21
24
  ciJobUrl?: string;
22
25
  };
23
26
  export declare function httpStartRun(base: string, input: HttpStartRunInput): Promise<StartRunResult>;
24
- export declare function httpRerun(base: string, runId: string): Promise<StartRunResult>;
27
+ export type HttpEnsureProjectResult = {
28
+ ok: true;
29
+ project_root: string;
30
+ } | Extract<StartRunResult, {
31
+ ok: false;
32
+ }>;
33
+ export declare function httpEnsureProject(base: string, projectRoot: string): Promise<HttpEnsureProjectResult>;
34
+ export declare function httpRerun(base: string, runId: string, options?: {
35
+ pinned?: boolean;
36
+ }): Promise<StartRunResult>;
25
37
  export declare function httpDeliverAnswer(base: string, runId: string, stageId: string, answer: unknown): Promise<DeliverAnswerResult>;
26
38
  export declare function httpDecideFeedbackLoop(base: string, runId: string, stageId: string, input: {
27
39
  decision: "extend" | "continue" | "abandon";
@@ -39,5 +51,31 @@ export declare function httpResumeTimedOutStage(base: string, runId: string, sta
39
51
  export declare function httpRecoverManualStageUntilStop(base: string, runId: string, stageId: string, guidance?: string): Promise<RetryOrchestrationResult>;
40
52
  export declare function httpStopManualRecovery(base: string, runId: string, stageId: string): Promise<StopManualRecoveryResult>;
41
53
  export declare function httpAbandonStage(base: string, runId: string, stageId: string): Promise<AbandonStageResult>;
54
+ export declare function httpCancelRun(base: string, runId: string, reason: string): Promise<CancelRunResult>;
55
+ export declare function httpDeleteRun(base: string, runId: string, options?: {
56
+ force?: boolean;
57
+ }): Promise<DeleteRunResult>;
58
+ export declare function httpGcRuns(base: string, options?: {
59
+ execute?: boolean;
60
+ }): Promise<GcRunsResult>;
61
+ export type HttpTriggerLookupResult = {
62
+ ok: true;
63
+ trigger: TriggerListItem;
64
+ } | {
65
+ ok: false;
66
+ reason: string;
67
+ status?: number;
68
+ };
69
+ export type HttpListTriggersResult = {
70
+ ok: true;
71
+ triggers: TriggerListItem[];
72
+ } | {
73
+ ok: false;
74
+ reason: string;
75
+ status?: number;
76
+ };
77
+ export declare function httpFireTrigger(base: string, triggerId: string, task?: Record<string, unknown>): Promise<StartRunResult>;
78
+ export declare function httpListTriggers(base: string): Promise<HttpListTriggersResult>;
79
+ export declare function httpGetTrigger(base: string, triggerId: string): Promise<HttpTriggerLookupResult>;
42
80
  export declare function resolveAbsolute(cwd: string, maybeRelative: string): string;
43
81
  export {};
@@ -1,17 +1,23 @@
1
1
  import path from "node:path";
2
2
  import { globalStageflowHome } from "../project/globalHome.js";
3
3
  import { PipelineValidationError } from "../runtime/pipelineValidationError.js";
4
- import { runWorkspaceDir, storeRootFor } from "../runstore/paths.js";
4
+ import { resolveStoreRoot, runWorkspaceDir } from "../runstore/paths.js";
5
+ import { clientAuthorizationHeaders } from "../server/controlToken.js";
5
6
  async function postJson(base, urlPath, body) {
6
7
  const res = await fetch(`${base}${urlPath}`, {
7
8
  method: "POST",
8
- headers: { "Content-Type": "application/json" },
9
+ headers: {
10
+ "Content-Type": "application/json",
11
+ ...clientAuthorizationHeaders("POST"),
12
+ },
9
13
  body: JSON.stringify(body ?? {}),
10
14
  });
11
15
  return { status: res.status, body: await parseJsonBody(res) };
12
16
  }
13
17
  async function getJson(base, urlPath) {
14
- const res = await fetch(`${base}${urlPath}`);
18
+ const res = await fetch(`${base}${urlPath}`, {
19
+ headers: { ...clientAuthorizationHeaders("GET") },
20
+ });
15
21
  return { status: res.status, body: await parseJsonBody(res) };
16
22
  }
17
23
  async function parseJsonBody(res) {
@@ -35,7 +41,7 @@ function enc(value) {
35
41
  return encodeURIComponent(value);
36
42
  }
37
43
  export function computeRunDir(runId) {
38
- return runWorkspaceDir(storeRootFor(globalStageflowHome()), runId);
44
+ return runWorkspaceDir(resolveStoreRoot(globalStageflowHome()), runId);
39
45
  }
40
46
  export async function httpReadRun(base, runId) {
41
47
  const { status, body } = await getJson(base, `/api/runs/${enc(runId)}`);
@@ -51,6 +57,7 @@ export function httpStoreReader(base) {
51
57
  function isRunTerminal(detail) {
52
58
  return (detail.status === "succeeded" ||
53
59
  detail.status === "failed" ||
60
+ detail.status === "cancelled" ||
54
61
  (detail.status === "running" && detail.waiting_stage_id !== undefined));
55
62
  }
56
63
  function sleep(ms) {
@@ -70,15 +77,20 @@ export function runDetailToPipelineRunResult(detail) {
70
77
  ? "succeeded"
71
78
  : detail.status === "failed"
72
79
  ? "failed"
73
- : "waiting";
80
+ : detail.status === "cancelled"
81
+ ? "cancelled"
82
+ : "waiting";
83
+ const reason = outcome === "cancelled"
84
+ ? (detail.cancel_reason ?? detail.failed_reason)
85
+ : outcome === "failed"
86
+ ? detail.failed_reason
87
+ : undefined;
74
88
  return {
75
89
  ok: outcome === "succeeded",
76
90
  outcome,
77
91
  runId: detail.run_id,
78
92
  runDir: computeRunDir(detail.run_id),
79
- ...(outcome === "failed" && detail.failed_reason !== undefined
80
- ? { reason: detail.failed_reason }
81
- : {}),
93
+ ...(reason !== undefined ? { reason } : {}),
82
94
  };
83
95
  }
84
96
  function toStartFailure(status, body) {
@@ -107,15 +119,36 @@ export async function httpStartRun(base, input) {
107
119
  }
108
120
  if (status !== 202)
109
121
  return toStartFailure(status, body);
110
- const runId = body.runId;
122
+ const parsed = body;
123
+ const runId = parsed.runId;
111
124
  return {
112
125
  ok: true,
113
126
  runId,
127
+ ...(parsed.queued === true
128
+ ? { queued: true, queuePosition: parsed.queuePosition }
129
+ : {}),
114
130
  done: pollRunUntilTerminal(base, runId).then(runDetailToPipelineRunResult),
115
131
  };
116
132
  }
117
- export async function httpRerun(base, runId) {
118
- const { status, body } = await postJson(base, `/api/runs/${enc(runId)}/rerun`, {});
133
+ export async function httpEnsureProject(base, projectRoot) {
134
+ const { status, body } = await postJson(base, "/api/projects", {
135
+ project_root: projectRoot,
136
+ });
137
+ if (status === 200) {
138
+ const parsed = body;
139
+ if (typeof parsed.project_root === "string" && parsed.project_root.length > 0) {
140
+ return { ok: true, project_root: parsed.project_root };
141
+ }
142
+ return {
143
+ ok: false,
144
+ reason: "ensure_project response missing project_root",
145
+ status,
146
+ };
147
+ }
148
+ return toStartFailure(status, body);
149
+ }
150
+ export async function httpRerun(base, runId, options) {
151
+ const { status, body } = await postJson(base, `/api/runs/${enc(runId)}/rerun`, options?.pinned !== undefined ? { pinned: options.pinned } : {});
119
152
  if (status !== 202)
120
153
  return toStartFailure(status, body);
121
154
  const newRunId = body.runId;
@@ -127,8 +160,12 @@ export async function httpRerun(base, runId) {
127
160
  }
128
161
  export async function httpDeliverAnswer(base, runId, stageId, answer) {
129
162
  const { status, body } = await postJson(base, `/api/runs/${enc(runId)}/stages/${enc(stageId)}/answer`, answer);
130
- if (status === 202)
131
- return { ok: true };
163
+ if (status === 202) {
164
+ const verification = body?.verification;
165
+ return verification === "failed_retrying"
166
+ ? { ok: true, verification }
167
+ : { ok: true };
168
+ }
132
169
  return { ok: false, reason: extractError(body, status), status: status };
133
170
  }
134
171
  export async function httpDecideFeedbackLoop(base, runId, stageId, input) {
@@ -142,7 +179,15 @@ export async function httpDecideFeedbackLoop(base, runId, stageId, input) {
142
179
  export async function httpRetryStageUntilStop(base, runId, stageId) {
143
180
  const { status, body } = await postJson(base, `/api/runs/${enc(runId)}/stages/${enc(stageId)}/retry`, {});
144
181
  if (status !== 202) {
145
- return { ok: false, reason: extractError(body, status), status };
182
+ const code = body && typeof body === "object" && typeof body.code === "string"
183
+ ? body.code
184
+ : undefined;
185
+ return {
186
+ ok: false,
187
+ reason: extractError(body, status),
188
+ status,
189
+ ...(code !== undefined ? { code } : {}),
190
+ };
146
191
  }
147
192
  const detail = await pollRunUntilTerminal(base, runId);
148
193
  return { ok: true, pipeline: runDetailToPipelineRunResult(detail) };
@@ -177,6 +222,76 @@ export async function httpAbandonStage(base, runId, stageId) {
177
222
  }
178
223
  return { ok: false, reason: extractError(body, status), status };
179
224
  }
225
+ export async function httpCancelRun(base, runId, reason) {
226
+ const { status, body } = await postJson(base, `/api/runs/${enc(runId)}/cancel`, { reason });
227
+ if (status === 202) {
228
+ const parsed = body;
229
+ return { ok: true, runId: parsed.runId };
230
+ }
231
+ return { ok: false, reason: extractError(body, status), status };
232
+ }
233
+ export async function httpDeleteRun(base, runId, options) {
234
+ const forceQs = options?.force ? "?force=true" : "";
235
+ const res = await fetch(`${base}/api/runs/${enc(runId)}${forceQs}`, {
236
+ method: "DELETE",
237
+ headers: { ...clientAuthorizationHeaders("DELETE") },
238
+ });
239
+ const body = await parseJsonBody(res);
240
+ if (res.status === 200) {
241
+ const parsed = body;
242
+ return { ok: true, runId: parsed.runId };
243
+ }
244
+ return {
245
+ ok: false,
246
+ reason: extractError(body, res.status),
247
+ status: res.status,
248
+ };
249
+ }
250
+ export async function httpGcRuns(base, options) {
251
+ const { status, body } = await postJson(base, "/api/runs/gc", {
252
+ execute: options?.execute === true,
253
+ });
254
+ if (status === 200) {
255
+ const parsed = body;
256
+ return {
257
+ ok: true,
258
+ slimmed: parsed.slimmed ?? [],
259
+ purged: parsed.purged ?? [],
260
+ bareCachesEvicted: parsed.bareCachesEvicted ?? [],
261
+ };
262
+ }
263
+ return { ok: false, reason: extractError(body, status), status };
264
+ }
265
+ export async function httpFireTrigger(base, triggerId, task) {
266
+ const { status, body } = await postJson(base, `/api/triggers/${enc(triggerId)}/fire`, task !== undefined ? { task } : {});
267
+ if (status !== 202)
268
+ return toStartFailure(status, body);
269
+ const parsed = body;
270
+ const runId = parsed.runId;
271
+ return {
272
+ ok: true,
273
+ runId,
274
+ ...(parsed.queued === true
275
+ ? { queued: true, queuePosition: parsed.queuePosition }
276
+ : {}),
277
+ done: pollRunUntilTerminal(base, runId).then(runDetailToPipelineRunResult),
278
+ };
279
+ }
280
+ export async function httpListTriggers(base) {
281
+ const { status, body } = await getJson(base, "/api/triggers");
282
+ if (status !== 200) {
283
+ return { ok: false, reason: extractError(body, status), status };
284
+ }
285
+ const parsed = body;
286
+ return { ok: true, triggers: parsed.triggers };
287
+ }
288
+ export async function httpGetTrigger(base, triggerId) {
289
+ const { status, body } = await getJson(base, `/api/triggers/${enc(triggerId)}`);
290
+ if (status !== 200) {
291
+ return { ok: false, reason: extractError(body, status), status };
292
+ }
293
+ return { ok: true, trigger: body };
294
+ }
180
295
  export function resolveAbsolute(cwd, maybeRelative) {
181
296
  return path.resolve(cwd, maybeRelative);
182
297
  }
@@ -6,4 +6,5 @@ export type InitCommandIo = {
6
6
  export declare function runInitCommand(args: string[], options?: {
7
7
  cwd?: string;
8
8
  io?: Partial<InitCommandIo>;
9
+ resolveConfiguredProviderIds?: (cwd: string) => Promise<string[]>;
9
10
  }): Promise<number>;
@@ -1,19 +1,15 @@
1
1
  import { access, mkdir, writeFile } from "node:fs/promises";
2
2
  import path from "node:path";
3
+ import { getAuthStatus } from "../agent/providerAuth.js";
3
4
  import { findProjectRoot } from "../project/findProjectRoot.js";
4
5
  import { ensureGlobalHome } from "../project/globalHome.js";
5
- import { HELLO_PIPELINE_YAML, HELLO_TASK_YAML, STAGEFLOW_YAML, } from "./initTemplates.js";
6
+ import { HELLO_TASK_YAML, STAGEFLOW_YAML, helloPipelineYaml, resolveInitDefaultModel, } from "./initTemplates.js";
6
7
  export const INIT_USAGE = `Usage:
7
8
  sf init`;
8
9
  const defaultIo = {
9
10
  log: (line) => console.log(line),
10
11
  error: (line) => console.error(line),
11
12
  };
12
- const INIT_TARGETS = [
13
- { relPath: "stageflow.yaml", content: STAGEFLOW_YAML },
14
- { relPath: "pipelines/hello.pipeline.yaml", content: HELLO_PIPELINE_YAML },
15
- { relPath: "tasks/hello.task.yaml", content: HELLO_TASK_YAML },
16
- ];
17
13
  async function fileExists(absPath) {
18
14
  try {
19
15
  await access(absPath);
@@ -35,6 +31,16 @@ function parseInitArgs(args) {
35
31
  }
36
32
  throw new Error(`Unexpected argument: ${args[0]}`);
37
33
  }
34
+ async function defaultConfiguredProviderIds(cwd) {
35
+ try {
36
+ const status = await getAuthStatus(cwd);
37
+ const rows = Array.isArray(status) ? status : [status];
38
+ return rows.filter((r) => r.configured).map((r) => r.providerId);
39
+ }
40
+ catch {
41
+ return [];
42
+ }
43
+ }
38
44
  export async function runInitCommand(args, options = {}) {
39
45
  const cwd = options.cwd ?? process.cwd();
40
46
  const out = { ...defaultIo, ...options.io };
@@ -46,7 +52,17 @@ export async function runInitCommand(args, options = {}) {
46
52
  }
47
53
  const initRoot = findProjectRoot(cwd) ?? path.resolve(cwd);
48
54
  ensureGlobalHome();
49
- for (const target of INIT_TARGETS) {
55
+ const configuredIds = await (options.resolveConfiguredProviderIds ?? defaultConfiguredProviderIds)(cwd);
56
+ const model = resolveInitDefaultModel(configuredIds);
57
+ const targets = [
58
+ { relPath: "stageflow.yaml", content: STAGEFLOW_YAML },
59
+ {
60
+ relPath: "pipelines/hello.pipeline.yaml",
61
+ content: helloPipelineYaml(model),
62
+ },
63
+ { relPath: "tasks/hello.task.yaml", content: HELLO_TASK_YAML },
64
+ ];
65
+ for (const target of targets) {
50
66
  const absPath = path.join(initRoot, target.relPath);
51
67
  if (await fileExists(absPath)) {
52
68
  out.log(`Skipped ${target.relPath} (exists)`);
@@ -1,3 +1,6 @@
1
- export declare const STAGEFLOW_YAML = "version: 1\ncatalog:\n pipelines:\n - pipelines\n tasks:\n - tasks\n patterns:\n pipeline: \"*.pipeline.yaml\"\n task: \"*.task.yaml\"\n";
2
- export declare const HELLO_PIPELINE_YAML = "id: hello\nmodel: anthropic/claude-sonnet-4-5\nstages:\n - id: hello\n system_prompt: Say hello and emit a success envelope.\n";
1
+ export declare const STAGEFLOW_YAML = "version: 1\ncatalog:\n pipelines:\n - pipelines\n - workshop\n tasks:\n - tasks\n - workshop\n patterns:\n pipeline: \"*.pipeline.yaml\"\n task: \"*.task.yaml\"\n";
2
+ export declare const LOUD_MODEL_PLACEHOLDER = "CHANGE_ME/<provider-model>";
3
+ export declare function resolveInitDefaultModel(configuredProviderIds: readonly string[]): string;
4
+ export declare function helloPipelineYaml(model: string): string;
5
+ export declare const HELLO_PIPELINE_YAML: string;
3
6
  export declare const HELLO_TASK_YAML = "id: hello\ngoal: Run the hello pipeline scaffold.\n";