stageflow 0.25.0 → 0.27.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 (501) hide show
  1. package/README.md +10 -3
  2. package/dist/a2a/contracts.d.ts +1 -0
  3. package/dist/a2a/contracts.js +1 -0
  4. package/dist/a2a/registry.d.ts +2 -0
  5. package/dist/a2a/registry.js +20 -1
  6. package/dist/a2a/server.d.ts +7 -0
  7. package/dist/a2a/server.js +5 -2
  8. package/dist/a2a/service.d.ts +1 -1
  9. package/dist/a2a/service.js +57 -8
  10. package/dist/a2a/store.d.ts +8 -5
  11. package/dist/a2a/store.js +24 -67
  12. package/dist/agent/activity.d.ts +3 -0
  13. package/dist/agent/bootProviderConfig.d.ts +21 -0
  14. package/dist/agent/bootProviderConfig.js +74 -0
  15. package/dist/agent/piAdapter.d.ts +9 -1
  16. package/dist/agent/piAdapter.js +58 -3
  17. package/dist/agent/piIsolatedMcp.d.ts +2 -0
  18. package/dist/agent/piIsolatedMcp.js +10 -2
  19. package/dist/agent/port.d.ts +6 -0
  20. package/dist/agent/streamLogRedact.d.ts +1 -1
  21. package/dist/agent/streamLogRedact.js +4 -11
  22. package/dist/cli/artifactCommand.js +9 -16
  23. package/dist/cli/backupCommand.d.ts +9 -0
  24. package/dist/cli/backupCommand.js +111 -0
  25. package/dist/cli/debugRunCommand.d.ts +10 -0
  26. package/dist/cli/debugRunCommand.js +109 -0
  27. package/dist/cli/doctorCommand.d.ts +32 -0
  28. package/dist/cli/doctorCommand.js +453 -0
  29. package/dist/cli/envelopeCommand.js +9 -2
  30. package/dist/cli/exportAllCommand.d.ts +55 -0
  31. package/dist/cli/exportAllCommand.js +218 -0
  32. package/dist/cli/exportRunCommand.js +23 -21
  33. package/dist/cli/hostClient.d.ts +21 -3
  34. package/dist/cli/hostClient.js +93 -12
  35. package/dist/cli/initTemplates.d.ts +1 -1
  36. package/dist/cli/initTemplates.js +8 -1
  37. package/dist/cli/resolveSafeOutPath.d.ts +2 -0
  38. package/dist/cli/resolveSafeOutPath.js +40 -0
  39. package/dist/cli/restoreCommand.d.ts +10 -0
  40. package/dist/cli/restoreCommand.js +90 -0
  41. package/dist/cli/runCommand.d.ts +3 -2
  42. package/dist/cli/runCommand.js +93 -11
  43. package/dist/cli/runOutput.d.ts +4 -0
  44. package/dist/cli/runOutput.js +33 -7
  45. package/dist/cli/runStageCommand.d.ts +1 -0
  46. package/dist/cli/runStageCommand.js +44 -25
  47. package/dist/cli/runsCommand.d.ts +1 -1
  48. package/dist/cli/runsCommand.js +162 -8
  49. package/dist/cli.js +171 -30
  50. package/dist/config/catalogRelativePath.d.ts +62 -0
  51. package/dist/config/catalogRelativePath.js +118 -0
  52. package/dist/config/configOrigin.d.ts +27 -0
  53. package/dist/config/configOrigin.js +59 -0
  54. package/dist/config/hostConfig.d.ts +55 -0
  55. package/dist/config/hostConfig.js +333 -0
  56. package/dist/config/listSkills.d.ts +26 -0
  57. package/dist/config/listSkills.js +190 -3
  58. package/dist/config/loadOutcome.d.ts +1 -1
  59. package/dist/config/loadPipeline.js +23 -2
  60. package/dist/config/loadStage.js +18 -0
  61. package/dist/config/loadTask.d.ts +2 -0
  62. package/dist/config/loadTask.js +57 -18
  63. package/dist/config/materializeStageModels.js +5 -1
  64. package/dist/config/mergePipelineIncludes.d.ts +3 -0
  65. package/dist/config/mergePipelineIncludes.js +19 -0
  66. package/dist/config/migrateYaml.js +6 -11
  67. package/dist/config/multiProjectCatalog.d.ts +30 -0
  68. package/dist/config/multiProjectCatalog.js +142 -0
  69. package/dist/config/normalizePipelineStageEntry.js +20 -1
  70. package/dist/config/pipelineStageKeys.js +2 -0
  71. package/dist/config/resolveCatalogRoots.d.ts +27 -0
  72. package/dist/config/resolveCatalogRoots.js +76 -0
  73. package/dist/config/resolveModel.d.ts +7 -1
  74. package/dist/config/resolveModel.js +11 -1
  75. package/dist/config/resolveStageMcpServers.d.ts +9 -1
  76. package/dist/config/resolveStageMcpServers.js +36 -9
  77. package/dist/config/secretFromEnvOrFile.d.ts +9 -0
  78. package/dist/config/secretFromEnvOrFile.js +34 -0
  79. package/dist/config/seededCatalog.d.ts +11 -0
  80. package/dist/config/seededCatalog.js +29 -0
  81. package/dist/config/toolRequires.d.ts +24 -0
  82. package/dist/config/toolRequires.js +115 -0
  83. package/dist/config/validateCatalog.d.ts +5 -1
  84. package/dist/config/validateCatalog.js +140 -1
  85. package/dist/diagnostics/checks.d.ts +39 -0
  86. package/dist/diagnostics/checks.js +135 -0
  87. package/dist/errors/codes.d.ts +14 -0
  88. package/dist/errors/codes.js +59 -0
  89. package/dist/git/cache.d.ts +14 -0
  90. package/dist/git/cache.js +150 -0
  91. package/dist/git/credentials.d.ts +9 -0
  92. package/dist/git/credentials.js +88 -0
  93. package/dist/git/errors.d.ts +20 -0
  94. package/dist/git/errors.js +94 -0
  95. package/dist/git/exec.d.ts +16 -0
  96. package/dist/git/exec.js +135 -0
  97. package/dist/git/operations.d.ts +29 -0
  98. package/dist/git/operations.js +153 -0
  99. package/dist/git/version.d.ts +1 -0
  100. package/dist/git/version.js +10 -0
  101. package/dist/logging/audit.d.ts +16 -0
  102. package/dist/logging/audit.js +19 -0
  103. package/dist/logging/commonWords.d.ts +2 -0
  104. package/dist/logging/commonWords.js +13 -0
  105. package/dist/logging/logger.d.ts +49 -0
  106. package/dist/logging/logger.js +193 -0
  107. package/dist/logging/namedSecrets.d.ts +6 -0
  108. package/dist/logging/namedSecrets.js +58 -0
  109. package/dist/logging/redact.d.ts +13 -0
  110. package/dist/logging/redact.js +88 -0
  111. package/dist/mcp/catalogTools.js +456 -80
  112. package/dist/mcp/checkoutTools.d.ts +52 -0
  113. package/dist/mcp/checkoutTools.js +332 -0
  114. package/dist/mcp/controlTools.js +179 -5
  115. package/dist/mcp/deps.d.ts +1 -0
  116. package/dist/mcp/getStartedTool.d.ts +3 -0
  117. package/dist/mcp/getStartedTool.js +62 -0
  118. package/dist/mcp/readArtifact.d.ts +11 -0
  119. package/dist/mcp/readArtifact.js +46 -30
  120. package/dist/mcp/server.js +1 -0
  121. package/dist/mcp/tools.js +4 -0
  122. package/dist/net/proxy.d.ts +14 -0
  123. package/dist/net/proxy.js +78 -0
  124. package/dist/package-meta.d.ts +2 -1
  125. package/dist/package-meta.js +2 -1
  126. package/dist/preflight/bash.d.ts +8 -0
  127. package/dist/preflight/bash.js +34 -0
  128. package/dist/preflight/claudeRoot.d.ts +11 -0
  129. package/dist/preflight/claudeRoot.js +23 -0
  130. package/dist/preflight/mcpCommands.d.ts +8 -0
  131. package/dist/preflight/mcpCommands.js +36 -0
  132. package/dist/preflight/pipelinePreflight.d.ts +40 -0
  133. package/dist/preflight/pipelinePreflight.js +192 -0
  134. package/dist/preflight/tls.d.ts +6 -0
  135. package/dist/preflight/tls.js +18 -0
  136. package/dist/preflight/toolchain.d.ts +45 -0
  137. package/dist/preflight/toolchain.js +219 -0
  138. package/dist/project/findProjectRoot.js +3 -4
  139. package/dist/project/globalHome.d.ts +7 -0
  140. package/dist/project/globalHome.js +63 -2
  141. package/dist/project/resolveProjectContext.js +2 -2
  142. package/dist/project/resolveStageflowContext.js +2 -2
  143. package/dist/projection/projectRun.d.ts +2 -1
  144. package/dist/projection/projectRun.js +1 -0
  145. package/dist/runstore/assertTmpdir.d.ts +1 -0
  146. package/dist/runstore/assertTmpdir.js +21 -0
  147. package/dist/runstore/backup.d.ts +52 -0
  148. package/dist/runstore/backup.js +292 -0
  149. package/dist/runstore/createStore.d.ts +18 -1
  150. package/dist/runstore/createStore.js +64 -5
  151. package/dist/runstore/debugBundle.d.ts +60 -0
  152. package/dist/runstore/debugBundle.js +143 -0
  153. package/dist/runstore/diskUsage.d.ts +50 -0
  154. package/dist/runstore/diskUsage.js +214 -0
  155. package/dist/runstore/exportRunPayload.d.ts +8 -0
  156. package/dist/runstore/exportRunPayload.js +23 -0
  157. package/dist/runstore/normalizeCatalogPath.d.ts +1 -0
  158. package/dist/runstore/normalizeCatalogPath.js +10 -0
  159. package/dist/runstore/paths.d.ts +5 -0
  160. package/dist/runstore/paths.js +145 -1
  161. package/dist/runstore/port.d.ts +111 -13
  162. package/dist/runstore/port.js +8 -1
  163. package/dist/runstore/restore.d.ts +81 -0
  164. package/dist/runstore/restore.js +355 -0
  165. package/dist/runstore/retention.d.ts +27 -0
  166. package/dist/runstore/retention.js +74 -0
  167. package/dist/runstore/runManifest.d.ts +146 -0
  168. package/dist/runstore/runManifest.js +288 -0
  169. package/dist/runstore/runProjection.d.ts +3 -1
  170. package/dist/runstore/runProjection.js +63 -1
  171. package/dist/runstore/sqlite/SqliteRunStore.d.ts +28 -3
  172. package/dist/runstore/sqlite/SqliteRunStore.js +352 -219
  173. package/dist/runstore/sqlite/applyStorePragmas.d.ts +39 -0
  174. package/dist/runstore/sqlite/applyStorePragmas.js +145 -0
  175. package/dist/runstore/sqlite/migrations/001-baseline.d.ts +7 -0
  176. package/dist/runstore/sqlite/migrations/001-baseline.js +10 -0
  177. package/dist/runstore/sqlite/migrations/002-repository-binding.d.ts +7 -0
  178. package/dist/runstore/sqlite/migrations/002-repository-binding.js +29 -0
  179. package/dist/runstore/sqlite/migrations/003-run-lifecycle.d.ts +7 -0
  180. package/dist/runstore/sqlite/migrations/003-run-lifecycle.js +28 -0
  181. package/dist/runstore/sqlite/migrations/004-auto-resume-count.d.ts +7 -0
  182. package/dist/runstore/sqlite/migrations/004-auto-resume-count.js +19 -0
  183. package/dist/runstore/sqlite/migrations/005-config-origins.d.ts +7 -0
  184. package/dist/runstore/sqlite/migrations/005-config-origins.js +19 -0
  185. package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.d.ts +7 -0
  186. package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.js +28 -0
  187. package/dist/runstore/sqlite/migrations/007-projects-registry.d.ts +7 -0
  188. package/dist/runstore/sqlite/migrations/007-projects-registry.js +31 -0
  189. package/dist/runstore/sqlite/migrations/index.d.ts +21 -0
  190. package/dist/runstore/sqlite/migrations/index.js +72 -0
  191. package/dist/runstore/sqlite/schema.d.ts +20 -1
  192. package/dist/runstore/sqlite/schema.js +277 -1
  193. package/dist/runstore/sqlite/storeOpenError.d.ts +6 -0
  194. package/dist/runstore/sqlite/storeOpenError.js +11 -0
  195. package/dist/runstore/sqlite/storeSchemaError.d.ts +5 -0
  196. package/dist/runstore/sqlite/storeSchemaError.js +8 -0
  197. package/dist/runstore/stageExecution.js +3 -0
  198. package/dist/runstore/storeFilesystem.d.ts +32 -0
  199. package/dist/runstore/storeFilesystem.js +148 -0
  200. package/dist/runstore/trackProjection.js +2 -0
  201. package/dist/runstore/workspaceLayout.d.ts +13 -0
  202. package/dist/runstore/workspaceLayout.js +76 -0
  203. package/dist/runtime/completionCheckRunner.d.ts +3 -0
  204. package/dist/runtime/completionCheckRunner.js +45 -7
  205. package/dist/runtime/containerLimits.d.ts +16 -0
  206. package/dist/runtime/containerLimits.js +84 -0
  207. package/dist/runtime/credentialMaterialisation.d.ts +28 -0
  208. package/dist/runtime/credentialMaterialisation.js +128 -0
  209. package/dist/runtime/gitCheckoutCapability.js +7 -13
  210. package/dist/runtime/pipelineRunner.d.ts +36 -1
  211. package/dist/runtime/pipelineRunner.js +178 -17
  212. package/dist/runtime/pipelineScheduler.d.ts +15 -0
  213. package/dist/runtime/pipelineScheduler.js +135 -27
  214. package/dist/runtime/reloadRunCatalog.js +6 -1
  215. package/dist/runtime/repositoryMaterialize.d.ts +47 -0
  216. package/dist/runtime/repositoryMaterialize.js +235 -0
  217. package/dist/runtime/resumeTimedOut.d.ts +1 -1
  218. package/dist/runtime/resumeTimedOut.js +5 -2
  219. package/dist/runtime/runChangeBus.js +9 -0
  220. package/dist/runtime/runDeletion.d.ts +7 -0
  221. package/dist/runtime/runDeletion.js +37 -0
  222. package/dist/runtime/runManager.d.ts +158 -4
  223. package/dist/runtime/runManager.js +1596 -79
  224. package/dist/runtime/runRetentionSweep.d.ts +31 -0
  225. package/dist/runtime/runRetentionSweep.js +328 -0
  226. package/dist/runtime/runRetryCoordinator.d.ts +2 -0
  227. package/dist/runtime/runRetryCoordinator.js +19 -2
  228. package/dist/runtime/runSkills.d.ts +40 -0
  229. package/dist/runtime/runSkills.js +173 -0
  230. package/dist/runtime/stageAttemptBootstrap.d.ts +5 -1
  231. package/dist/runtime/stageAttemptBootstrap.js +195 -24
  232. package/dist/runtime/stageCacheEnv.d.ts +6 -0
  233. package/dist/runtime/stageCacheEnv.js +34 -0
  234. package/dist/runtime/stageConcurrency.d.ts +2 -1
  235. package/dist/runtime/stageConcurrency.js +4 -2
  236. package/dist/runtime/stageEnvironment.d.ts +38 -0
  237. package/dist/runtime/stageEnvironment.js +193 -0
  238. package/dist/runtime/stageProcessLauncher.d.ts +18 -0
  239. package/dist/runtime/stageProcessLauncher.js +194 -38
  240. package/dist/runtime/stageRecovery.d.ts +3 -1
  241. package/dist/runtime/stageRecovery.js +19 -4
  242. package/dist/runtime/stageRoots.d.ts +38 -1
  243. package/dist/runtime/stageRoots.js +118 -0
  244. package/dist/runtime/stageRunner.d.ts +1 -0
  245. package/dist/runtime/stageRunner.js +3 -1
  246. package/dist/runtime/stageSecretDecl.d.ts +9 -0
  247. package/dist/runtime/stageSecretDecl.js +102 -0
  248. package/dist/runtime/stageSecrets.d.ts +40 -0
  249. package/dist/runtime/stageSecrets.js +181 -0
  250. package/dist/runtime/stageWorker.d.ts +3 -2
  251. package/dist/runtime/stageWorker.js +58 -10
  252. package/dist/runtime/stageWorkerProtocol.d.ts +5 -0
  253. package/dist/runtime/stageWorkerProtocol.js +8 -0
  254. package/dist/runtime/startPayload.d.ts +32 -0
  255. package/dist/runtime/startPayload.js +59 -0
  256. package/dist/runtime/taskInput.js +14 -5
  257. package/dist/runtime/verifiedStageExecution.d.ts +1 -0
  258. package/dist/runtime/verifiedStageExecution.js +2 -1
  259. package/dist/runtime/workspaceBinding.d.ts +20 -0
  260. package/dist/runtime/workspaceBinding.js +60 -0
  261. package/dist/server/allowedHosts.d.ts +19 -0
  262. package/dist/server/allowedHosts.js +179 -0
  263. package/dist/server/bootstrap.d.ts +36 -2
  264. package/dist/server/bootstrap.js +209 -5
  265. package/dist/server/controlToken.d.ts +47 -0
  266. package/dist/server/controlToken.js +241 -0
  267. package/dist/server/createHttpHost.d.ts +11 -2
  268. package/dist/server/createHttpHost.js +103 -10
  269. package/dist/server/ensureGlobalService.d.ts +5 -1
  270. package/dist/server/ensureGlobalService.js +35 -1
  271. package/dist/server/healthSurfaces.d.ts +6 -0
  272. package/dist/server/healthSurfaces.js +98 -0
  273. package/dist/server/http.d.ts +12 -1
  274. package/dist/server/http.js +1085 -485
  275. package/dist/server/listenHost.d.ts +5 -0
  276. package/dist/server/listenHost.js +56 -0
  277. package/dist/server/mcpHost.d.ts +10 -1
  278. package/dist/server/mcpHost.js +36 -6
  279. package/dist/server/operatorResults.d.ts +2 -2
  280. package/dist/server/operatorResults.js +40 -29
  281. package/dist/server/requestAuthContext.d.ts +12 -0
  282. package/dist/server/requestAuthContext.js +21 -0
  283. package/dist/server/shutdown.d.ts +69 -0
  284. package/dist/server/shutdown.js +219 -0
  285. package/dist/types/pipeline.d.ts +7 -0
  286. package/dist/types/stage.d.ts +8 -0
  287. package/dist/types/task.d.ts +8 -0
  288. package/dist/ui/assets/index-B6hlSXXn.js +120 -0
  289. package/dist/ui/index.html +1 -1
  290. package/examples/README.md +98 -0
  291. package/examples/archify-on-pr/README.md +213 -0
  292. package/examples/archify-on-pr/archify-on-pr.pipeline.yaml +19 -0
  293. package/examples/archify-on-pr/archify-on-pr.task.yaml +19 -0
  294. package/examples/archify-on-pr/author-diagrams.yaml +106 -0
  295. package/examples/archify-on-pr/detect-changes.yaml +89 -0
  296. package/examples/ci-validate/README.md +35 -0
  297. package/examples/ci-validate/check.yaml +13 -0
  298. package/examples/ci-validate/ci-demo.pipeline.yaml +4 -0
  299. package/examples/ci-validate/validate.sh +5 -0
  300. package/examples/compliance-review-demo/README.md +125 -0
  301. package/examples/compliance-review-demo/compliance-review-demo.pipeline.yaml +29 -0
  302. package/examples/compliance-review-demo/connect-account.yaml +47 -0
  303. package/examples/compliance-review-demo/map-to-control.yaml +123 -0
  304. package/examples/compliance-review-demo/poll-bucket-config.yaml +103 -0
  305. package/examples/compliance-review-demo/publish-report.yaml +79 -0
  306. package/examples/compliance-review-demo/review-verdict.yaml +122 -0
  307. package/examples/compliance-review-demo/run-compliance-check.yaml +96 -0
  308. package/examples/compliance-review-demo/store-evidence.yaml +143 -0
  309. package/examples/conditional-fork/README.md +89 -0
  310. package/examples/conditional-fork/branch-a.yaml +13 -0
  311. package/examples/conditional-fork/branch-b.yaml +13 -0
  312. package/examples/conditional-fork/decide.yaml +35 -0
  313. package/examples/conditional-fork/fork-demo.pipeline.yaml +20 -0
  314. package/examples/conditional-fork/fork-demo.task.yaml +8 -0
  315. package/examples/context7-mcp/README.md +42 -0
  316. package/examples/context7-mcp/context7-mcp.pipeline.yaml +15 -0
  317. package/examples/context7-mcp/context7-mcp.task.yaml +4 -0
  318. package/examples/context7-mcp/fetch-docs.yaml +52 -0
  319. package/examples/context7-mcp/resolve-library.yaml +31 -0
  320. package/examples/context7-mcp/write-brief.yaml +52 -0
  321. package/examples/feature-loop/README.md +104 -0
  322. package/examples/feature-loop/address-feedback.yaml +148 -0
  323. package/examples/feature-loop/align.yaml +116 -0
  324. package/examples/feature-loop/decompose.yaml +86 -0
  325. package/examples/feature-loop/default-model-hierarchy.task.yaml +58 -0
  326. package/examples/feature-loop/feature-loop.pipeline.yaml +140 -0
  327. package/examples/feature-loop/feature-loop.task.yaml +25 -0
  328. package/examples/feature-loop/implement.yaml +128 -0
  329. package/examples/feature-loop/plan.yaml +111 -0
  330. package/examples/feature-loop/publish.yaml +167 -0
  331. package/examples/feature-loop/review.yaml +146 -0
  332. package/examples/feature-loop/verify.yaml +106 -0
  333. package/examples/feedback-loop/README.md +72 -0
  334. package/examples/feedback-loop/VERIFY.md +208 -0
  335. package/examples/feedback-loop/continue-only.task.yaml +4 -0
  336. package/examples/feedback-loop/exhaust-require-continue.task.yaml +6 -0
  337. package/examples/feedback-loop/exhaust-wait-human.task.yaml +11 -0
  338. package/examples/feedback-loop/feedback-loop-wait-human.pipeline.yaml +23 -0
  339. package/examples/feedback-loop/feedback-loop.pipeline.yaml +23 -0
  340. package/examples/feedback-loop/feedback-loop.task.yaml +4 -0
  341. package/examples/feedback-loop/implement.yaml +14 -0
  342. package/examples/feedback-loop/plan.yaml +14 -0
  343. package/examples/feedback-loop/review.yaml +15 -0
  344. package/examples/feedback-loop/send-back-once.task.yaml +6 -0
  345. package/examples/feedback-loop/submit.yaml +12 -0
  346. package/examples/generic-fan-in/README.md +151 -0
  347. package/examples/generic-fan-in/clarify.yaml +18 -0
  348. package/examples/generic-fan-in/generic-fan-in-accepted.pipeline.yaml +19 -0
  349. package/examples/generic-fan-in/generic-fan-in-accepted.task.yaml +8 -0
  350. package/examples/generic-fan-in/generic-fan-in.pipeline.yaml +18 -0
  351. package/examples/generic-fan-in/generic-fan-in.task.yaml +9 -0
  352. package/examples/generic-fan-in/research.yaml +45 -0
  353. package/examples/generic-fan-in/synthesize.yaml +66 -0
  354. package/examples/generic-fan-in/validation.yaml +45 -0
  355. package/examples/github-release/README.md +78 -0
  356. package/examples/github-release/draft-release-notes.yaml +64 -0
  357. package/examples/github-release/github-release.pipeline.yaml +11 -0
  358. package/examples/github-release/github-release.task.yaml +13 -0
  359. package/examples/github-release/publish-github-release.yaml +64 -0
  360. package/examples/hello-world/README.md +28 -0
  361. package/examples/hello-world/hello.pipeline.yaml +4 -0
  362. package/examples/hello-world/my-task.task.yaml +6 -0
  363. package/examples/hello-world/research.yaml +18 -0
  364. package/examples/mcp-hitl-tour/README.md +113 -0
  365. package/examples/mcp-hitl-tour/draft-angle.yaml +33 -0
  366. package/examples/mcp-hitl-tour/draft-short.yaml +32 -0
  367. package/examples/mcp-hitl-tour/emit-angles.yaml +45 -0
  368. package/examples/mcp-hitl-tour/gather.yaml +31 -0
  369. package/examples/mcp-hitl-tour/intake.yaml +62 -0
  370. package/examples/mcp-hitl-tour/mcp-hitl-tour-exhaust.task.yaml +13 -0
  371. package/examples/mcp-hitl-tour/mcp-hitl-tour.pipeline.yaml +54 -0
  372. package/examples/mcp-hitl-tour/mcp-hitl-tour.task.yaml +16 -0
  373. package/examples/mcp-hitl-tour/polish.yaml +33 -0
  374. package/examples/mcp-hitl-tour/review.yaml +17 -0
  375. package/examples/mcp-hitl-tour/ship.yaml +25 -0
  376. package/examples/oss-issue-contribution/README.md +218 -0
  377. package/examples/oss-issue-contribution/oss-address-review-feedback.yaml +117 -0
  378. package/examples/oss-issue-contribution/oss-approve-contribution.yaml +181 -0
  379. package/examples/oss-issue-contribution/oss-approve-plan.yaml +111 -0
  380. package/examples/oss-issue-contribution/oss-explain-fix.yaml +108 -0
  381. package/examples/oss-issue-contribution/oss-explain-issue.yaml +114 -0
  382. package/examples/oss-issue-contribution/oss-implement-source-fix.yaml +171 -0
  383. package/examples/oss-issue-contribution/oss-investigate-area.yaml +116 -0
  384. package/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml +125 -0
  385. package/examples/oss-issue-contribution/oss-issue-intake.yaml +106 -0
  386. package/examples/oss-issue-contribution/oss-plan-investigation.yaml +112 -0
  387. package/examples/oss-issue-contribution/oss-plan-review.yaml +109 -0
  388. package/examples/oss-issue-contribution/oss-reproduce-issue.yaml +140 -0
  389. package/examples/oss-issue-contribution/oss-review-change.yaml +107 -0
  390. package/examples/oss-issue-contribution/oss-verify-fix.yaml +130 -0
  391. package/examples/oss-issue-contribution/oss-write-regression-test.yaml +135 -0
  392. package/examples/oss-issue-contribution/pi-7629.task.yaml +79 -0
  393. package/examples/oss-issue-contribution/pi-8919.task.yaml +75 -0
  394. package/examples/oss-issue-contribution/pydantic-ai-7971.task.yaml +53 -0
  395. package/examples/oss-quick-fix/README.md +65 -0
  396. package/examples/oss-quick-fix/implement-fix.yaml +84 -0
  397. package/examples/oss-quick-fix/oss-quick-fix.pipeline.yaml +35 -0
  398. package/examples/oss-quick-fix/oss-quick-fix.task.yaml +19 -0
  399. package/examples/oss-quick-fix/ship-fix.yaml +81 -0
  400. package/examples/oss-quick-fix/understand-issue.yaml +67 -0
  401. package/examples/oss-quick-fix/verify-fix.yaml +73 -0
  402. package/examples/plan-review/README.md +37 -0
  403. package/examples/plan-review/plan-review-followup.yaml +13 -0
  404. package/examples/plan-review/plan-review.pipeline.yaml +9 -0
  405. package/examples/plan-review/plan-review.task.yaml +9 -0
  406. package/examples/plan-review/plan-review.yaml +25 -0
  407. package/examples/playwright-mcp/README.md +39 -0
  408. package/examples/playwright-mcp/playwright-mcp.pipeline.yaml +5 -0
  409. package/examples/playwright-mcp/playwright-mcp.task.yaml +4 -0
  410. package/examples/playwright-mcp/screenshot.yaml +40 -0
  411. package/examples/retry-tour/README.md +75 -0
  412. package/examples/retry-tour/retry-tour.pipeline.yaml +122 -0
  413. package/examples/retry-tour/retry-tour.task.yaml +9 -0
  414. package/examples/route-if-tour/README.md +202 -0
  415. package/examples/route-if-tour/route-if-tour.pipeline.yaml +950 -0
  416. package/examples/route-if-tour/route-if-tour.task.yaml +4 -0
  417. package/examples/route-wiring-smoke-test/01-core-routing.pipeline.yaml +168 -0
  418. package/examples/route-wiring-smoke-test/02-on-gating.pipeline.yaml +44 -0
  419. package/examples/route-wiring-smoke-test/03-two-entry-points.pipeline.yaml +28 -0
  420. package/examples/route-wiring-smoke-test/04-entry-false-equivalent-to-omitted.pipeline.yaml +27 -0
  421. package/examples/route-wiring-smoke-test/05-fork-choice.pipeline.yaml +110 -0
  422. package/examples/route-wiring-smoke-test/06-fan-out-fan-in.pipeline.yaml +82 -0
  423. package/examples/route-wiring-smoke-test/07-loop-human-decision.pipeline.yaml +82 -0
  424. package/examples/route-wiring-smoke-test/08-skip-fallback-and-multi-on-gate.pipeline.yaml +77 -0
  425. package/examples/route-wiring-smoke-test/09-multi-loop-targets.pipeline.yaml +102 -0
  426. package/examples/route-wiring-smoke-test/10-uses-dialect-fork.pipeline.yaml +23 -0
  427. package/examples/route-wiring-smoke-test/11-sequential-io-handoff.pipeline.yaml +37 -0
  428. package/examples/route-wiring-smoke-test/12-complex-io-schemas.pipeline.yaml +138 -0
  429. package/examples/route-wiring-smoke-test/13-ref-io-handoff.pipeline.yaml +84 -0
  430. package/examples/route-wiring-smoke-test/14-if-eq-gating.pipeline.yaml +50 -0
  431. package/examples/route-wiring-smoke-test/15-if-all-gated.pipeline.yaml +37 -0
  432. package/examples/route-wiring-smoke-test/16-if-composition.pipeline.yaml +65 -0
  433. package/examples/route-wiring-smoke-test/17-if-join.pipeline.yaml +80 -0
  434. package/examples/route-wiring-smoke-test/README.md +377 -0
  435. package/examples/route-wiring-smoke-test/rejected/01-reject-legacy-needs.pipeline.yaml +26 -0
  436. package/examples/route-wiring-smoke-test/rejected/02-reject-legacy-fork.pipeline.yaml +25 -0
  437. package/examples/route-wiring-smoke-test/rejected/03-reject-legacy-feedback-loop.pipeline.yaml +30 -0
  438. package/examples/route-wiring-smoke-test/rejected/04-reject-missing-entry.pipeline.yaml +24 -0
  439. package/examples/route-wiring-smoke-test/rejected/05-reject-unreachable.pipeline.yaml +35 -0
  440. package/examples/route-wiring-smoke-test/rejected/06-reject-allow-none-without-route-select.pipeline.yaml +37 -0
  441. package/examples/route-wiring-smoke-test/rejected/07-reject-cycle.pipeline.yaml +27 -0
  442. package/examples/route-wiring-smoke-test/rejected/08-reject-loop-non-ancestor.pipeline.yaml +42 -0
  443. package/examples/route-wiring-smoke-test/rejected/09-reject-route-select-leaf.pipeline.yaml +26 -0
  444. package/examples/route-wiring-smoke-test/rejected/12-reject-loop-replay-unsafe.pipeline.yaml +55 -0
  445. package/examples/route-wiring-smoke-test/rejected/13-reject-multiple-loop-entries.pipeline.yaml +51 -0
  446. package/examples/route-wiring-smoke-test/rejected/14-reject-duplicate-stage-id.pipeline.yaml +35 -0
  447. package/examples/route-wiring-smoke-test/rejected/15-reject-unknown-route-target.pipeline.yaml +15 -0
  448. package/examples/route-wiring-smoke-test/rejected/16-reject-malformed-route-item.pipeline.yaml +15 -0
  449. package/examples/route-wiring-smoke-test/rejected/17-reject-io-incompatible.pipeline.yaml +33 -0
  450. package/examples/route-wiring-smoke-test/rejected/18-reject-nested-io.pipeline.yaml +51 -0
  451. package/examples/route-wiring-smoke-test/rejected/19-reject-array-item-io.pipeline.yaml +55 -0
  452. package/examples/route-wiring-smoke-test/rejected/20-reject-closed-io.pipeline.yaml +36 -0
  453. package/examples/route-wiring-smoke-test/rejected/21-reject-ref-io.pipeline.yaml +42 -0
  454. package/examples/route-wiring-smoke-test/rejected/22-reject-if-unknown-field.pipeline.yaml +33 -0
  455. package/examples/route-wiring-smoke-test/rejected/23-reject-if-optional-field.pipeline.yaml +32 -0
  456. package/examples/route-wiring-smoke-test/rejected/24-reject-if-empty-all.pipeline.yaml +31 -0
  457. package/examples/route-wiring-smoke-test/rejected/25-reject-if-gt-on-string.pipeline.yaml +33 -0
  458. package/examples/route-wiring-smoke-test/rejected/26-reject-if-optional-nested.pipeline.yaml +36 -0
  459. package/examples/route-wiring-smoke-test/rejected/27-reject-if-on-loop.pipeline.yaml +63 -0
  460. package/examples/route-wiring-smoke-test/rejected/29-reject-if-on-failed.pipeline.yaml +46 -0
  461. package/examples/route-wiring-smoke-test/smoke-test.task.yaml +4 -0
  462. package/examples/route-wiring-smoke-test/stages/branch-a.yaml +12 -0
  463. package/examples/route-wiring-smoke-test/stages/branch-b.yaml +12 -0
  464. package/examples/route-wiring-smoke-test/stages/decide.yaml +12 -0
  465. package/examples/route-wiring-smoke-test/stages/finish.yaml +12 -0
  466. package/examples/ship-feature/README.md +190 -0
  467. package/examples/ship-feature/feat-address-feedback.yaml +119 -0
  468. package/examples/ship-feature/feat-implement.yaml +180 -0
  469. package/examples/ship-feature/feat-plan.yaml +120 -0
  470. package/examples/ship-feature/feat-review.yaml +109 -0
  471. package/examples/ship-feature/feat-ship.yaml +203 -0
  472. package/examples/ship-feature/ship-feature.pipeline.yaml +44 -0
  473. package/examples/ship-feature/ship-feature.task.yaml +78 -0
  474. package/examples/stage-mcp/README.md +144 -0
  475. package/examples/stage-mcp/echo-mcp.mjs +20 -0
  476. package/examples/stage-mcp/stage-mcp-dead.pipeline.yaml +5 -0
  477. package/examples/stage-mcp/stage-mcp-dead.task.yaml +3 -0
  478. package/examples/stage-mcp/stage-mcp-missing-var.pipeline.yaml +5 -0
  479. package/examples/stage-mcp/stage-mcp-missing-var.task.yaml +3 -0
  480. package/examples/stage-mcp/stage-mcp.pipeline.yaml +5 -0
  481. package/examples/stage-mcp/stage-mcp.task.yaml +4 -0
  482. package/examples/stage-mcp/use-echo.yaml +20 -0
  483. package/examples/verify-tour/README.md +80 -0
  484. package/examples/verify-tour/verify-tour.pipeline.yaml +162 -0
  485. package/examples/verify-tour/verify-tour.task.yaml +11 -0
  486. package/package.json +5 -1
  487. package/skills/stageflow/SKILL.md +6 -6
  488. package/skills/stageflow/references/control-surface.md +11 -5
  489. package/skills/stageflow/scripts/detect-host.mjs +14 -1
  490. package/skills/stageflow/scripts/detect-host.test.mjs +29 -1
  491. package/skills/stageflow-author/SKILL.md +4 -3
  492. package/skills/stageflow-author/references/catalog-mapping.md +16 -0
  493. package/skills/stageflow-author/references/catalog-write-conventions.md +1 -1
  494. package/skills/stageflow-run/SKILL.md +20 -12
  495. package/skills/stageflow-run/references/mcp-call.md +9 -1
  496. package/skills/stageflow-run/references/task-and-pipeline-selection.md +16 -5
  497. package/skills/stageflow-run/scripts/mcp-call.mjs +46 -6
  498. package/skills/stageflow-run/scripts/mcp-call.test.mjs +64 -0
  499. package/skills/stageflow-session-capture/references/catalog-authoring.md +2 -0
  500. package/skills/stageflow-setup/SKILL.md +40 -8
  501. package/dist/ui/assets/index-Da5EHU6M.js +0 -119
@@ -3,7 +3,12 @@ import { spawn } from "node:child_process";
3
3
  import { lstat, readFile } from "node:fs/promises";
4
4
  import path from "node:path";
5
5
  import { assertEnvelopePayload } from "../envelope/payloadSchema.js";
6
+ import { resolveBashPath } from "../preflight/bash.js";
7
+ import { redactString } from "../logging/redact.js";
8
+ import { getNamedSecrets } from "../logging/namedSecrets.js";
9
+ import { signalProcessGroup } from "./stageProcessLauncher.js";
6
10
  const MAX_COMMAND_OUTPUT_BYTES = 64 * 1024;
11
+ const COMMAND_KILL_ESCALATE_MS = 2000;
7
12
  function captureOutput(chunks, chunk, currentSize) {
8
13
  const remaining = MAX_COMMAND_OUTPUT_BYTES - currentSize;
9
14
  if (remaining <= 0)
@@ -23,19 +28,26 @@ export const nodeCommandExecutor = {
23
28
  let timedOut = false;
24
29
  let settled = false;
25
30
  let timeout;
31
+ let escalateTimer;
26
32
  const finish = (result) => {
27
33
  if (settled)
28
34
  return;
29
35
  settled = true;
30
36
  if (timeout)
31
37
  clearTimeout(timeout);
38
+ // When timed out, keep escalateTimer so SIGKILL still runs after the
39
+ // grace window even if the parent already exited cooperatively.
40
+ if (escalateTimer && !timedOut)
41
+ clearTimeout(escalateTimer);
32
42
  resolve(result);
33
43
  };
34
44
  let child;
35
45
  try {
36
- child = spawn(input.command, {
46
+ const bash = resolveBashPath(input.env ?? process.env);
47
+ child = spawn(bash, ["-c", input.command], {
37
48
  cwd: input.cwd,
38
- shell: true,
49
+ env: input.env,
50
+ detached: true,
39
51
  stdio: ["ignore", "pipe", "pipe"],
40
52
  });
41
53
  }
@@ -55,6 +67,12 @@ export const nodeCommandExecutor = {
55
67
  child.stderr?.on("data", (data) => {
56
68
  stderrSize = captureOutput(stderr, Buffer.from(data), stderrSize);
57
69
  });
70
+ child.once("exit", () => {
71
+ if (timedOut) {
72
+ // Parent may exit on SIGTERM while SIGTERM-proof grandchildren remain.
73
+ signalProcessGroup(child.pid, "SIGKILL");
74
+ }
75
+ });
58
76
  child.once("error", (error) => {
59
77
  finish({
60
78
  exit_code: null,
@@ -75,7 +93,12 @@ export const nodeCommandExecutor = {
75
93
  if (input.timeout_ms !== undefined) {
76
94
  timeout = setTimeout(() => {
77
95
  timedOut = true;
78
- child.kill("SIGTERM");
96
+ const pid = child.pid;
97
+ signalProcessGroup(pid, "SIGTERM");
98
+ escalateTimer = setTimeout(() => {
99
+ // Always escalate after the grace window regardless of exited.
100
+ signalProcessGroup(pid, "SIGKILL");
101
+ }, COMMAND_KILL_ESCALATE_MS);
79
102
  }, input.timeout_ms);
80
103
  }
81
104
  });
@@ -101,16 +124,31 @@ async function runCommandCheck(check, input) {
101
124
  const cwd = resolveCommandCwd(check, base);
102
125
  const executor = input.commandExecutor ?? nodeCommandExecutor;
103
126
  try {
104
- const execution = await executor.run({ command: check.run, cwd, timeout_ms: check.timeout_ms });
127
+ const execution = await executor.run({
128
+ command: check.run,
129
+ cwd,
130
+ timeout_ms: check.timeout_ms,
131
+ ...(input.commandEnv !== undefined ? { env: input.commandEnv } : {}),
132
+ });
105
133
  const evidence = {
106
134
  kind: "command",
107
135
  command: check.run,
108
136
  cwd,
109
137
  exit_code: execution.exit_code,
110
- stdout: execution.stdout,
111
- stderr: execution.stderr,
138
+ stdout: redactString(execution.stdout, {
139
+ namedSecrets: getNamedSecrets(),
140
+ }),
141
+ stderr: redactString(execution.stderr, {
142
+ namedSecrets: getNamedSecrets(),
143
+ }),
112
144
  timed_out: execution.timed_out,
113
- ...(execution.error !== undefined ? { error: execution.error } : {}),
145
+ ...(execution.error !== undefined
146
+ ? {
147
+ error: redactString(execution.error, {
148
+ namedSecrets: getNamedSecrets(),
149
+ }),
150
+ }
151
+ : {}),
114
152
  };
115
153
  if (execution.timed_out)
116
154
  return result(check, "failed", evidence, "command timed out");
@@ -0,0 +1,16 @@
1
+ import os from "node:os";
2
+ export type ContainerLimits = {
3
+ memoryLimitBytes: number | undefined;
4
+ maxActiveStageProcesses: number;
5
+ maxOldSpaceSizeMb: number;
6
+ source: "cgroup-v2" | "cgroup-v1" | "fallback";
7
+ };
8
+ export declare function readContainerMemoryLimit(roots?: readonly string[]): {
9
+ bytes: number | undefined;
10
+ source: ContainerLimits["source"];
11
+ };
12
+ export declare function deriveContainerLimits(memoryLimitBytes: number | undefined, source?: ContainerLimits["source"]): ContainerLimits;
13
+ export declare function getContainerLimits(): ContainerLimits;
14
+ export declare function resetContainerLimitsForTests(): void;
15
+ /** Test hook: prove sizing never consults os.totalmem. */
16
+ export declare function assertNoOsTotalmemInSizing(): typeof os.totalmem;
@@ -0,0 +1,84 @@
1
+ import { readFileSync, existsSync } from "node:fs";
2
+ import os from "node:os";
3
+ const HOST_RESERVE_MIB = 512;
4
+ const WORKER_BUDGET_MIB = 512;
5
+ const MAX_CAP = 8;
6
+ const FALLBACK_CAP = 4;
7
+ const FALLBACK_HEAP_MIB = 512;
8
+ const V1_SENTINEL = 9223372036854771712n;
9
+ function parseCgroupMemory(raw) {
10
+ const trimmed = raw.trim();
11
+ if (trimmed === "" || trimmed === "max")
12
+ return undefined;
13
+ let n;
14
+ try {
15
+ n = BigInt(trimmed);
16
+ }
17
+ catch {
18
+ return undefined;
19
+ }
20
+ if (n <= 0n || n >= V1_SENTINEL)
21
+ return undefined;
22
+ if (n > BigInt(Number.MAX_SAFE_INTEGER))
23
+ return undefined;
24
+ return Number(n);
25
+ }
26
+ export function readContainerMemoryLimit(roots = ["/sys/fs/cgroup"]) {
27
+ for (const root of roots) {
28
+ const v2 = `${root}/memory.max`;
29
+ if (existsSync(v2)) {
30
+ try {
31
+ const bytes = parseCgroupMemory(readFileSync(v2, "utf8"));
32
+ return { bytes, source: bytes === undefined ? "fallback" : "cgroup-v2" };
33
+ }
34
+ catch {
35
+ // continue
36
+ }
37
+ }
38
+ const v1 = `${root}/memory/memory.limit_in_bytes`;
39
+ if (existsSync(v1)) {
40
+ try {
41
+ const bytes = parseCgroupMemory(readFileSync(v1, "utf8"));
42
+ return { bytes, source: bytes === undefined ? "fallback" : "cgroup-v1" };
43
+ }
44
+ catch {
45
+ // continue
46
+ }
47
+ }
48
+ }
49
+ return { bytes: undefined, source: "fallback" };
50
+ }
51
+ export function deriveContainerLimits(memoryLimitBytes, source = "fallback") {
52
+ if (memoryLimitBytes === undefined) {
53
+ return {
54
+ memoryLimitBytes: undefined,
55
+ maxActiveStageProcesses: FALLBACK_CAP,
56
+ maxOldSpaceSizeMb: FALLBACK_HEAP_MIB,
57
+ source: "fallback",
58
+ };
59
+ }
60
+ const limitMib = Math.floor(memoryLimitBytes / (1024 * 1024));
61
+ const workerBudget = Math.max(1, limitMib - HOST_RESERVE_MIB);
62
+ const cap = Math.min(MAX_CAP, Math.max(1, Math.floor(workerBudget / WORKER_BUDGET_MIB)));
63
+ return {
64
+ memoryLimitBytes,
65
+ maxActiveStageProcesses: cap,
66
+ maxOldSpaceSizeMb: WORKER_BUDGET_MIB,
67
+ source,
68
+ };
69
+ }
70
+ let cached;
71
+ export function getContainerLimits() {
72
+ if (cached === undefined) {
73
+ const { bytes, source } = readContainerMemoryLimit();
74
+ cached = deriveContainerLimits(bytes, source);
75
+ }
76
+ return cached;
77
+ }
78
+ export function resetContainerLimitsForTests() {
79
+ cached = undefined;
80
+ }
81
+ /** Test hook: prove sizing never consults os.totalmem. */
82
+ export function assertNoOsTotalmemInSizing() {
83
+ return os.totalmem;
84
+ }
@@ -0,0 +1,28 @@
1
+ export type MaterialiseCopyResult = {
2
+ destPath: string;
3
+ mode: number;
4
+ };
5
+ export declare class CredentialMaterialisationError extends Error {
6
+ readonly code: "symlink_rejected" | "escape_rejected" | "source_missing" | "not_a_file";
7
+ constructor(message: string, code: CredentialMaterialisationError["code"]);
8
+ }
9
+ export declare function attemptCredentialsDir(attemptDir: string, secretName: string): string;
10
+ /** Copy a Host source file into attempt credentials with mode 0400. */
11
+ export declare function materialiseCredentialFile(options: {
12
+ sourcePath: string;
13
+ destDir: string;
14
+ destBasename?: string;
15
+ allowedRoot?: string;
16
+ }): MaterialiseCopyResult;
17
+ export declare function materialiseSecretBytes(options: {
18
+ contents: string | Buffer;
19
+ destDir: string;
20
+ destBasename: string;
21
+ }): MaterialiseCopyResult;
22
+ export declare function cleanupCredentialsDir(attemptDir: string): void;
23
+ export declare function stageAskpassHelperPath(home?: string): string;
24
+ export declare function ensureStageAskpassHelper(home?: string): string;
25
+ export declare function readFileCredentialRegistry(home?: string): Record<string, {
26
+ source: string;
27
+ pointerVar: string;
28
+ }>;
@@ -0,0 +1,128 @@
1
+ import { chmodSync, copyFileSync, existsSync, lstatSync, mkdirSync, readFileSync, realpathSync, rmSync, writeFileSync, } from "node:fs";
2
+ import path from "node:path";
3
+ import { ensureGlobalHome, globalStageflowHome } from "../project/globalHome.js";
4
+ export class CredentialMaterialisationError extends Error {
5
+ code;
6
+ constructor(message, code) {
7
+ super(message);
8
+ this.name = "CredentialMaterialisationError";
9
+ this.code = code;
10
+ }
11
+ }
12
+ export function attemptCredentialsDir(attemptDir, secretName) {
13
+ return path.join(attemptDir, "credentials", secretName);
14
+ }
15
+ /** Copy a Host source file into attempt credentials with mode 0400. */
16
+ export function materialiseCredentialFile(options) {
17
+ const sourcePath = path.resolve(options.sourcePath);
18
+ let stat;
19
+ try {
20
+ stat = lstatSync(sourcePath);
21
+ }
22
+ catch {
23
+ throw new CredentialMaterialisationError(`credential source missing: ${sourcePath}`, "source_missing");
24
+ }
25
+ if (stat.isSymbolicLink()) {
26
+ throw new CredentialMaterialisationError(`credential source must not be a symlink: ${sourcePath}`, "symlink_rejected");
27
+ }
28
+ if (!stat.isFile()) {
29
+ throw new CredentialMaterialisationError(`credential source must be a regular file: ${sourcePath}`, "not_a_file");
30
+ }
31
+ const realSource = realpathSync(sourcePath);
32
+ if (options.allowedRoot !== undefined) {
33
+ let root = path.resolve(options.allowedRoot);
34
+ try {
35
+ root = realpathSync(root);
36
+ }
37
+ catch {
38
+ // allowed root may not exist yet; keep resolved path
39
+ }
40
+ if (realSource !== root && !realSource.startsWith(root + path.sep)) {
41
+ throw new CredentialMaterialisationError(`credential source escapes allowed root: ${sourcePath}`, "escape_rejected");
42
+ }
43
+ }
44
+ mkdirSync(options.destDir, { recursive: true, mode: 0o700 });
45
+ const destPath = path.join(options.destDir, options.destBasename ?? path.basename(realSource));
46
+ copyFileSync(realSource, destPath);
47
+ try {
48
+ chmodSync(destPath, 0o400);
49
+ }
50
+ catch {
51
+ // best-effort on non-POSIX
52
+ }
53
+ return { destPath, mode: 0o400 };
54
+ }
55
+ export function materialiseSecretBytes(options) {
56
+ mkdirSync(options.destDir, { recursive: true, mode: 0o700 });
57
+ const destPath = path.join(options.destDir, options.destBasename);
58
+ writeFileSync(destPath, options.contents, { mode: 0o400 });
59
+ try {
60
+ chmodSync(destPath, 0o400);
61
+ }
62
+ catch {
63
+ // best-effort
64
+ }
65
+ return { destPath, mode: 0o400 };
66
+ }
67
+ export function cleanupCredentialsDir(attemptDir) {
68
+ const root = path.join(attemptDir, "credentials");
69
+ if (!existsSync(root))
70
+ return;
71
+ rmSync(root, { recursive: true, force: true });
72
+ }
73
+ const STAGE_ASKPASS_BASENAME = "git-askpass-stage";
74
+ const STAGE_ASKPASS_SCRIPT = `#!/bin/sh
75
+ prompt=\${1-}
76
+ case "\$prompt" in
77
+ *Username*|*username*)
78
+ printf '%s\\n' 'x-access-token'
79
+ ;;
80
+ *)
81
+ token=
82
+ if [ -n "\${STAGEFLOW_GIT_ASKPASS_TOKEN_FILE-}" ] && [ -f "\$STAGEFLOW_GIT_ASKPASS_TOKEN_FILE" ]; then
83
+ token=\$(cat "\$STAGEFLOW_GIT_ASKPASS_TOKEN_FILE")
84
+ fi
85
+ printf '%s\\n' "\$token"
86
+ ;;
87
+ esac
88
+ `;
89
+ export function stageAskpassHelperPath(home = globalStageflowHome()) {
90
+ return path.join(home, STAGE_ASKPASS_BASENAME);
91
+ }
92
+ export function ensureStageAskpassHelper(home) {
93
+ const resolvedHome = home ?? ensureGlobalHome();
94
+ mkdirSync(resolvedHome, { recursive: true });
95
+ const askpass = stageAskpassHelperPath(resolvedHome);
96
+ writeFileSync(askpass, STAGE_ASKPASS_SCRIPT, { encoding: "utf8", mode: 0o700 });
97
+ try {
98
+ chmodSync(askpass, 0o700);
99
+ }
100
+ catch {
101
+ // best-effort
102
+ }
103
+ return askpass;
104
+ }
105
+ export function readFileCredentialRegistry(home = globalStageflowHome()) {
106
+ const registryPath = path.join(home, "secrets", "file-credentials.json");
107
+ if (!existsSync(registryPath))
108
+ return {};
109
+ try {
110
+ const raw = JSON.parse(readFileSync(registryPath, "utf8"));
111
+ if (!raw || typeof raw !== "object" || Array.isArray(raw))
112
+ return {};
113
+ const out = {};
114
+ for (const [name, entry] of Object.entries(raw)) {
115
+ if (!entry || typeof entry !== "object" || Array.isArray(entry))
116
+ continue;
117
+ const e = entry;
118
+ if (typeof e.source !== "string" || typeof e.pointerVar !== "string") {
119
+ continue;
120
+ }
121
+ out[name] = { source: e.source, pointerVar: e.pointerVar };
122
+ }
123
+ return out;
124
+ }
125
+ catch {
126
+ return {};
127
+ }
128
+ }
@@ -1,20 +1,14 @@
1
1
  import { createHash } from "node:crypto";
2
- import { execFile } from "node:child_process";
3
2
  import { lstat, readFile, readlink } from "node:fs/promises";
4
3
  import path from "node:path";
5
- function runGit(root, args) {
6
- return new Promise((resolve, reject) => {
7
- execFile("git", ["-C", root, ...args], { encoding: "buffer", maxBuffer: 16 * 1024 * 1024 }, (error, stdout, stderr) => {
8
- if (error) {
9
- const detail = Buffer.isBuffer(stderr)
10
- ? stderr.toString("utf8").trim()
11
- : "";
12
- reject(new Error(detail || error.message));
13
- return;
14
- }
15
- resolve(stdout);
16
- });
4
+ import { runGit as execGit } from "../git/exec.js";
5
+ async function runGit(root, args) {
6
+ const result = await execGit({
7
+ cwd: root,
8
+ args,
9
+ maxBuffer: 16 * 1024 * 1024,
17
10
  });
11
+ return Buffer.from(result.stdout, "utf8");
18
12
  }
19
13
  function nulPaths(output) {
20
14
  return output.toString("utf8").split("\0").filter(Boolean);
@@ -9,8 +9,28 @@ import type { TaskFile } from "../types/task.js";
9
9
  import { type StageExecutionMode } from "./stageConcurrency.js";
10
10
  import { StageProcessLauncher } from "./stageProcessLauncher.js";
11
11
  import type { OperatorCatalog } from "./stageAttemptBootstrap.js";
12
+ import { type SkillsPayload } from "./runSkills.js";
13
+ import { runPipelinePreflight } from "../preflight/pipelinePreflight.js";
12
14
  export { PipelineValidationError } from "./pipelineValidationError.js";
13
- export type PipelineRunOutcome = "succeeded" | "failed" | "waiting";
15
+ export declare class PipelinePreflightError extends Error {
16
+ readonly code: string;
17
+ readonly preflight: Awaited<ReturnType<typeof runPipelinePreflight>>;
18
+ constructor(code: string, preflight: Awaited<ReturnType<typeof runPipelinePreflight>>);
19
+ toNetworkBody(): import("../errors/codes.js").NetworkErrorBody;
20
+ }
21
+ export type PipelineRunOutcome = "succeeded" | "failed" | "waiting" | "cancelled";
22
+ export declare class InlinePipelineTooLargeError extends Error {
23
+ readonly code: "inline_pipeline_too_large";
24
+ readonly bytes: number;
25
+ readonly maxBytes: number;
26
+ constructor(bytes: number, maxBytes: number);
27
+ }
28
+ /** Thrown when queued→running CAS fails (e.g. cancel won the race). */
29
+ export declare class QueuedRunActivationAborted extends Error {
30
+ readonly runId: string;
31
+ readonly currentStatus?: string;
32
+ constructor(runId: string, currentStatus?: string);
33
+ }
14
34
  export type PipelineRunResult = {
15
35
  ok: boolean;
16
36
  outcome: PipelineRunOutcome;
@@ -51,6 +71,9 @@ export type ExecuteStagesOptions = {
51
71
  startAtStageIndex?: number;
52
72
  executionMode?: StageExecutionMode;
53
73
  stageProcessLauncher?: StageProcessLauncher;
74
+ schedulingHalt?: {
75
+ halted: boolean;
76
+ };
54
77
  };
55
78
  export declare function executeStages(prepared: PreparedPipeline, options?: ExecuteStagesOptions): Promise<PipelineRunResult>;
56
79
  export declare function runPipeline(options: {
@@ -80,14 +103,26 @@ export declare function startPipeline(options: {
80
103
  cwd?: string;
81
104
  projectRoot?: string;
82
105
  checkoutOverride?: string;
106
+ runId?: string;
107
+ checkoutRoot?: string;
108
+ repository?: string;
109
+ ref?: string;
110
+ resolvedSha?: string;
111
+ runBranch?: string;
83
112
  gitSha?: string;
84
113
  ciPrUrl?: string;
85
114
  ciJobUrl?: string;
115
+ reuseExistingRun?: boolean;
86
116
  hitl?: StageHitlController;
87
117
  maxActiveStagesPerRun?: number;
88
118
  executionMode?: StageExecutionMode;
89
119
  stageProcessLauncher?: StageProcessLauncher;
90
120
  operatorCatalog?: OperatorCatalog;
91
121
  skipGates?: boolean;
122
+ schedulingHalt?: {
123
+ halted: boolean;
124
+ };
125
+ callerId?: string | null;
126
+ skills?: SkillsPayload;
92
127
  }): Promise<StartedPipeline>;
93
128
  export declare function resolveTaskPath(taskArg: string, cwd?: string): string;