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
@@ -0,0 +1,235 @@
1
+ import { existsSync, mkdirSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { bareCachePath, ensureBareCache, } from "../git/cache.js";
4
+ import { GitError } from "../git/errors.js";
5
+ import { catFileCommit, checkRefFormat, deleteBranch, resolveRef, revParse, worktreeAdd, worktreePrune, worktreeRemove, } from "../git/operations.js";
6
+ import { ensureGlobalHome, globalStageflowHome } from "../project/globalHome.js";
7
+ const DEFAULT_BRANCH_TEMPLATE = "stageflow/run-<runId>";
8
+ const FULL_SHA_RE = /^[0-9a-f]{40}$/i;
9
+ export function derivedBindingKindFromMeta(meta) {
10
+ if (meta.repository != null && meta.repository !== "") {
11
+ return "repository";
12
+ }
13
+ if (meta.checkout_root != null && meta.checkout_root !== "") {
14
+ return "checkout";
15
+ }
16
+ return "unbound";
17
+ }
18
+ export function worktreePathForRun(runId) {
19
+ return path.join(globalStageflowHome(), "worktrees", runId);
20
+ }
21
+ function renderBranchTemplate(template, runId, taskId) {
22
+ return template.replaceAll("<runId>", runId).replaceAll("<taskId>", taskId);
23
+ }
24
+ export function resolveRunBranchTemplate(task) {
25
+ const fromTask = task.run_branch_template?.trim();
26
+ if (fromTask)
27
+ return fromTask;
28
+ const fromEnv = process.env.STAGEFLOW_RUN_BRANCH_TEMPLATE?.trim();
29
+ if (fromEnv)
30
+ return fromEnv;
31
+ return DEFAULT_BRANCH_TEMPLATE;
32
+ }
33
+ export class StartLinkError extends Error {
34
+ code;
35
+ status;
36
+ stderr;
37
+ constructor(message, options) {
38
+ super(message);
39
+ this.name = "StartLinkError";
40
+ this.code = options.code;
41
+ this.status = options.status;
42
+ this.stderr = options.stderr;
43
+ }
44
+ }
45
+ function mapGitCode(code, phase) {
46
+ switch (code) {
47
+ case "auth_failed":
48
+ return { code: "repository_auth_failed", status: 401 };
49
+ case "repo_not_found":
50
+ return { code: "repository_not_found", status: 404 };
51
+ case "ref_not_found":
52
+ return { code: "ref_not_found", status: 404 };
53
+ case "network":
54
+ case "timeout":
55
+ return { code: "repository_fetch_failed", status: 502 };
56
+ case "disk_full":
57
+ return { code: "insufficient_disk", status: 507 };
58
+ case "git_missing":
59
+ return { code: "git_missing", status: 500 };
60
+ default:
61
+ if (phase === "worktree") {
62
+ return { code: "worktree_create_failed", status: 500 };
63
+ }
64
+ if (phase === "resolve") {
65
+ return { code: "ref_not_found", status: 404 };
66
+ }
67
+ return { code: "repository_fetch_failed", status: 502 };
68
+ }
69
+ }
70
+ export function throwMappedGitError(err, phase) {
71
+ if (err instanceof StartLinkError)
72
+ throw err;
73
+ if (err instanceof GitError) {
74
+ const mapped = mapGitCode(err.code, phase);
75
+ throw new StartLinkError(err.message, {
76
+ code: mapped.code,
77
+ status: mapped.status,
78
+ stderr: err.stderr,
79
+ });
80
+ }
81
+ throw err;
82
+ }
83
+ async function runRollbackThunks(thunks) {
84
+ for (const thunk of thunks) {
85
+ try {
86
+ await thunk();
87
+ }
88
+ catch (cleanupErr) {
89
+ console.error(`repository link rollback failed: ${cleanupErr instanceof Error ? cleanupErr.message : String(cleanupErr)}`);
90
+ }
91
+ }
92
+ }
93
+ export async function reclaimWorkspaceBinding(meta, options) {
94
+ if (derivedBindingKindFromMeta(meta) !== "repository") {
95
+ return;
96
+ }
97
+ const cachePath = bareCachePath(meta.repository);
98
+ try {
99
+ await worktreeRemove(cachePath, meta.checkout_root);
100
+ }
101
+ catch {
102
+ }
103
+ try {
104
+ await worktreePrune(cachePath);
105
+ }
106
+ catch {
107
+ }
108
+ if (options?.keepRunBranch) {
109
+ return;
110
+ }
111
+ try {
112
+ await deleteBranch(cachePath, meta.run_branch);
113
+ }
114
+ catch {
115
+ }
116
+ }
117
+ export async function reclaimWorkspaceOnRunSucceeded(store, runId) {
118
+ try {
119
+ const meta = await store.readRunMeta(runId);
120
+ await reclaimWorkspaceBinding(meta, { keepRunBranch: true });
121
+ }
122
+ catch (err) {
123
+ console.error(`reclaimWorkspaceOnRunSucceeded: failed for ${runId}: ${err instanceof Error ? err.message : String(err)}`);
124
+ }
125
+ }
126
+ export async function materializeWorkspaceBinding(options) {
127
+ const { runId, task, binding } = options;
128
+ const rollbacks = [];
129
+ const rollback = async () => runRollbackThunks(rollbacks);
130
+ if (binding.kind === "unbound") {
131
+ return { materialized: { runId }, rollback };
132
+ }
133
+ if (binding.kind === "checkout") {
134
+ const checkoutRoot = options.checkoutRoot;
135
+ if (checkoutRoot === undefined) {
136
+ throw new StartLinkError("Checkout path is required", {
137
+ code: "worktree_create_failed",
138
+ status: 500,
139
+ });
140
+ }
141
+ let resolvedSha;
142
+ if (options.pinned?.resolvedSha) {
143
+ resolvedSha = options.pinned.resolvedSha;
144
+ }
145
+ else {
146
+ try {
147
+ const head = await revParse(checkoutRoot, ["HEAD"]);
148
+ if (FULL_SHA_RE.test(head)) {
149
+ resolvedSha = head;
150
+ }
151
+ }
152
+ catch {
153
+ // non-git path checkouts leave resolved_sha null (KD6/KD7)
154
+ }
155
+ }
156
+ return {
157
+ materialized: {
158
+ runId,
159
+ checkoutRoot,
160
+ ...(resolvedSha !== undefined ? { resolvedSha } : {}),
161
+ },
162
+ rollback,
163
+ };
164
+ }
165
+ const repository = binding.repository;
166
+ const refToRecord = options.pinned?.ref ?? binding.ref;
167
+ let resolvedSha;
168
+ let cachePath;
169
+ if (options.pinned) {
170
+ cachePath = bareCachePath(repository);
171
+ const present = existsSync(cachePath) &&
172
+ (await catFileCommit(cachePath, options.pinned.resolvedSha));
173
+ if (!present) {
174
+ throw new StartLinkError(`Pinned SHA is not available in the local cache: ${options.pinned.resolvedSha}`, { code: "pinned_sha_unavailable", status: 404 });
175
+ }
176
+ resolvedSha = options.pinned.resolvedSha;
177
+ }
178
+ else {
179
+ try {
180
+ const ensured = await ensureBareCache(repository, binding.ref);
181
+ cachePath = ensured.cachePath;
182
+ }
183
+ catch (err) {
184
+ throwMappedGitError(err, "fetch");
185
+ }
186
+ try {
187
+ resolvedSha = await resolveRef(cachePath, binding.ref);
188
+ }
189
+ catch (err) {
190
+ throwMappedGitError(err, "resolve");
191
+ }
192
+ }
193
+ const template = resolveRunBranchTemplate(task);
194
+ const runBranch = renderBranchTemplate(template, runId, task.id);
195
+ const branchOk = await checkRefFormat(runBranch);
196
+ if (!branchOk) {
197
+ throw new StartLinkError(`Invalid run branch name from template: ${runBranch}`, { code: "invalid_run_branch", status: 400 });
198
+ }
199
+ ensureGlobalHome();
200
+ const checkoutRoot = worktreePathForRun(runId);
201
+ mkdirSync(path.dirname(checkoutRoot), { recursive: true });
202
+ try {
203
+ await worktreeAdd(cachePath, {
204
+ worktreePath: checkoutRoot,
205
+ branch: runBranch,
206
+ startPoint: resolvedSha,
207
+ });
208
+ }
209
+ catch (err) {
210
+ throwMappedGitError(err, "worktree");
211
+ }
212
+ rollbacks.push(async () => {
213
+ try {
214
+ await worktreeRemove(cachePath, checkoutRoot);
215
+ }
216
+ catch {
217
+ // prune recovers admin state when the dir is already gone
218
+ }
219
+ await worktreePrune(cachePath);
220
+ });
221
+ rollbacks.push(async () => {
222
+ await deleteBranch(cachePath, runBranch);
223
+ });
224
+ return {
225
+ materialized: {
226
+ runId,
227
+ checkoutRoot,
228
+ repository,
229
+ ref: refToRecord,
230
+ resolvedSha,
231
+ runBranch,
232
+ },
233
+ rollback,
234
+ };
235
+ }
@@ -17,7 +17,7 @@ export type ResumeTimedOutContext = {
17
17
  maxActiveStagesPerRun: number;
18
18
  operatorCatalog?: OperatorCatalog;
19
19
  };
20
- export declare function assertTimedOutStageEligible(status: string, events: ReadonlyArray<{
20
+ export declare function assertResumableStage(status: string, events: ReadonlyArray<{
21
21
  event: string;
22
22
  reason?: string;
23
23
  }>): {
@@ -11,11 +11,14 @@ import { openStageAttempt, } from "./stageAttemptBootstrap.js";
11
11
  import { buildStageRoots, withResolvedAuthPath } from "./stageRoots.js";
12
12
  import { isStageTimeoutReason, lastFailedReason, } from "../agent/stageTimeout.js";
13
13
  import { deriveExecutionPatchFromEvent } from "../runstore/stageExecution.js";
14
- export function assertTimedOutStageEligible(status, events) {
14
+ export function assertResumableStage(status, events) {
15
+ if (status === "interrupted") {
16
+ return { ok: true };
17
+ }
15
18
  if (status !== "failed") {
16
19
  return {
17
20
  ok: false,
18
- reason: `Stage is not timed out (status=${status})`,
21
+ reason: `Stage is not resumable (status=${status})`,
19
22
  status: 409,
20
23
  };
21
24
  }
@@ -49,6 +49,13 @@ export function wrapRunStoreWithChangeBus(store, bus) {
49
49
  await store.updateRunStatus(runId, status);
50
50
  bus.emit({ runId, kind: "status" });
51
51
  };
52
+ const tryUpdateRunStatus = async (runId, status, expectedStatus) => {
53
+ const updated = await store.tryUpdateRunStatus(runId, status, expectedStatus);
54
+ if (updated) {
55
+ bus.emit({ runId, kind: "status" });
56
+ }
57
+ return updated;
58
+ };
52
59
  const appendStageEvent = async (runId, stageId, event, options) => {
53
60
  await store.appendStageEvent(runId, stageId, event, options);
54
61
  if (event.event === "waiting_for_input" || event.event === "resumed") {
@@ -66,6 +73,8 @@ export function wrapRunStoreWithChangeBus(store, bus) {
66
73
  return createRun;
67
74
  if (prop === "updateRunStatus")
68
75
  return updateRunStatus;
76
+ if (prop === "tryUpdateRunStatus")
77
+ return tryUpdateRunStatus;
69
78
  if (prop === "appendStageEvent")
70
79
  return appendStageEvent;
71
80
  const cached = boundCache.get(prop);
@@ -0,0 +1,7 @@
1
+ import type { A2aStore } from "../a2a/store.js";
2
+ import type { RunStore } from "../runstore/port.js";
3
+ /**
4
+ * Hard-delete a run across A2A, workspace, worktree/branch, then store rows last.
5
+ * Filesystem/git step failures are logged and do not abort the sequence (R10).
6
+ */
7
+ export declare function deleteRunEverywhere(store: RunStore, a2aStore: A2aStore, runId: string): Promise<void>;
@@ -0,0 +1,37 @@
1
+ import { rm } from "node:fs/promises";
2
+ import { reclaimWorkspaceBinding } from "./repositoryMaterialize.js";
3
+ /**
4
+ * Hard-delete a run across A2A, workspace, worktree/branch, then store rows last.
5
+ * Filesystem/git step failures are logged and do not abort the sequence (R10).
6
+ */
7
+ export async function deleteRunEverywhere(store, a2aStore, runId) {
8
+ try {
9
+ await a2aStore.deleteByRunId(runId);
10
+ }
11
+ catch (err) {
12
+ console.error(`deleteRunEverywhere: A2A cleanup failed for ${runId}: ${err instanceof Error ? err.message : String(err)}`);
13
+ }
14
+ let meta;
15
+ try {
16
+ meta = await store.readRunMeta(runId);
17
+ }
18
+ catch {
19
+ meta = undefined;
20
+ }
21
+ const workspaceDir = store.getWorkspaceDir(runId);
22
+ try {
23
+ await rm(workspaceDir, { recursive: true, force: true });
24
+ }
25
+ catch (err) {
26
+ console.error(`deleteRunEverywhere: workspace rm failed for ${runId}: ${err instanceof Error ? err.message : String(err)}`);
27
+ }
28
+ if (meta !== undefined) {
29
+ try {
30
+ await reclaimWorkspaceBinding(meta);
31
+ }
32
+ catch (err) {
33
+ console.error(`deleteRunEverywhere: reclaimWorkspaceBinding failed for ${runId}: ${err instanceof Error ? err.message : String(err)}`);
34
+ }
35
+ }
36
+ await store.deleteRun(runId);
37
+ }
@@ -1,32 +1,50 @@
1
1
  import { type RunSubmission } from "../runstore/submission.js";
2
2
  import type { AgentPort, OpaqueAnswer } from "../agent/port.js";
3
3
  import type { InlinePipelineDefinition } from "../types/pipeline.js";
4
+ import { type DiskBreakdown, type FreeSpaceReader } from "../runstore/diskUsage.js";
4
5
  import { type RunStore } from "../runstore/port.js";
5
6
  import type { TaskFile } from "../types/task.js";
6
7
  import { type PipelineRunResult } from "./pipelineRunner.js";
8
+ import { type SkillsPayload } from "./runSkills.js";
7
9
  import { type FeedbackLoopDecisionKind } from "./feedbackLoopDecision.js";
8
10
  import { type RetryStageResult } from "./runRetryCoordinator.js";
9
11
  import { type StageExecutionMode } from "./stageConcurrency.js";
10
12
  import { StageProcessLauncher } from "./stageProcessLauncher.js";
11
13
  import { StageHitlController, type DeliverAnswerResult, type HitlSeams } from "./stageHitl.js";
12
14
  import { type StartTaskInput } from "./taskInput.js";
15
+ import { type RetentionSweepReport, type RunRetentionSweepOptions } from "./runRetentionSweep.js";
16
+ import type { A2aStore } from "../a2a/store.js";
13
17
  import type { OperatorCatalog } from "./stageAttemptBootstrap.js";
14
- export type BusyCode = "busy_capacity" | "busy_checkout";
18
+ import { type StartFailureCode } from "./repositoryMaterialize.js";
19
+ export type BusyCode = "busy_capacity" | "busy_checkout" | "busy_caller_quota";
20
+ export type { StartFailureCode } from "./repositoryMaterialize.js";
15
21
  export type StartRunResult = {
16
22
  ok: true;
17
23
  runId: string;
18
24
  done: Promise<PipelineRunResult>;
25
+ queued?: boolean;
26
+ queuePosition?: number;
27
+ /** Present when queued because the caller hit its concurrency quota. */
28
+ queuedCode?: "busy_caller_quota";
19
29
  } | {
20
30
  ok: false;
21
31
  reason: string;
22
32
  status?: number;
23
- code?: BusyCode;
33
+ code?: StartFailureCode;
24
34
  activeCount?: number;
25
35
  maxConcurrent?: number;
26
36
  activeRunIds?: string[];
37
+ scope?: "global" | "project" | "caller";
38
+ project_root?: string;
39
+ caller_id?: string;
27
40
  conflictingRunId?: string;
28
41
  conflictingCheckout?: string;
42
+ freeBytes?: number;
43
+ minFreeBytes?: number;
44
+ stderr?: string;
29
45
  };
46
+ export declare const PROJECT_ROOT_UNAVAILABLE_REASON = "project_root_unavailable";
47
+ export declare const INSUFFICIENT_DISK_CANCEL_REASON = "insufficient_disk";
30
48
  export type CapacityHealth = {
31
49
  ok: true;
32
50
  activeRunIds: string[];
@@ -35,6 +53,18 @@ export type CapacityHealth = {
35
53
  slotsAvailable: number;
36
54
  activeStageProcesses: number;
37
55
  maxActiveStageProcesses: number | null;
56
+ disk?: DiskBreakdown;
57
+ stage_env_passthrough?: boolean;
58
+ proxy?: Record<string, unknown>;
59
+ container?: {
60
+ max_old_space_size_mb: number;
61
+ max_active_stage_processes: number;
62
+ memory_limit_bytes: number | null;
63
+ source: string;
64
+ };
65
+ cache?: {
66
+ root: string;
67
+ };
38
68
  };
39
69
  export type StartRunOnceResult = {
40
70
  ok: true;
@@ -64,6 +94,32 @@ export type AbandonStageResult = {
64
94
  reason: string;
65
95
  status?: number;
66
96
  };
97
+ export type CancelRunResult = {
98
+ ok: true;
99
+ runId: string;
100
+ } | {
101
+ ok: false;
102
+ reason: string;
103
+ status?: number;
104
+ };
105
+ export type DeleteRunChannel = "mcp" | "rest" | "cli";
106
+ export type DeleteRunResult = {
107
+ ok: true;
108
+ runId: string;
109
+ } | {
110
+ ok: false;
111
+ reason: string;
112
+ status?: number;
113
+ };
114
+ export type GcRunsChannel = "mcp" | "rest" | "cli" | "periodic";
115
+ export type GcRunsResult = ({
116
+ ok: true;
117
+ } & RetentionSweepReport) | {
118
+ ok: false;
119
+ reason: string;
120
+ status?: number;
121
+ };
122
+ export declare const FORCE_DELETE_CANCEL_REASON = "delete_run: force";
67
123
  export type DecideFeedbackLoopResult = {
68
124
  ok: true;
69
125
  effect: "extended" | "continued" | "abandoned";
@@ -82,21 +138,34 @@ export type StopManualRecoveryResult = {
82
138
  reason: string;
83
139
  status?: number;
84
140
  };
141
+ export declare const STAGEFLOW_AUTO_RESUME_INTERRUPTED = "STAGEFLOW_AUTO_RESUME_INTERRUPTED";
142
+ export declare const STAGEFLOW_MAX_AUTO_RESUMES = "STAGEFLOW_MAX_AUTO_RESUMES";
143
+ export declare function isAutoResumeInterruptedEnabled(env?: NodeJS.ProcessEnv): boolean;
144
+ export declare function parseMaxAutoResumes(env?: NodeJS.ProcessEnv): number;
85
145
  export declare class RunManager {
86
146
  private readonly options;
87
147
  private readonly submissionsInFlight;
88
148
  private readonly active;
149
+ private readonly schedulingHalts;
89
150
  private readonly checkoutLeases;
90
151
  private readonly provisionalIds;
152
+ private readonly admissionQueue;
153
+ private readonly pendingQueuedStarts;
154
+ private readonly queuedDone;
155
+ private admissionDrainInFlight;
91
156
  private readonly resumeInFlight;
92
157
  private readonly retryInFlight;
93
158
  private readonly retryStartOwner;
94
159
  private readonly retryStartWaiters;
95
160
  private trackingGeneration;
96
161
  private maxConcurrent;
162
+ private readonly maxQueued;
163
+ private readonly maxConcurrentPerProject;
164
+ private readonly callerQuotas;
97
165
  private readonly maxActiveStagesPerRun;
98
166
  private readonly executionMode;
99
167
  private readonly stageProcessLauncher;
168
+ private a2aStore;
100
169
  private readonly hitl;
101
170
  private readonly attachedWaiting;
102
171
  private readonly retryCoordinator;
@@ -104,6 +173,7 @@ export declare class RunManager {
104
173
  private readonly cwd;
105
174
  private readonly projectRoot;
106
175
  private readonly isGitProject;
176
+ private acceptingWork;
107
177
  constructor(options: {
108
178
  agent: AgentPort;
109
179
  store: RunStore;
@@ -113,15 +183,47 @@ export declare class RunManager {
113
183
  operatorCatalog?: OperatorCatalog;
114
184
  seams?: HitlSeams;
115
185
  maxConcurrent?: number;
186
+ maxQueued?: number;
187
+ maxConcurrentPerProject?: number;
188
+ /** caller_id → max concurrent active runs for that caller. */
189
+ callerQuotas?: Record<string, number>;
116
190
  maxActiveStagesPerRun?: number;
117
191
  executionMode?: StageExecutionMode;
118
192
  stageProcessLauncher?: StageProcessLauncher;
193
+ a2aStore?: A2aStore;
194
+ knownWritableProjectRoots?: () => Iterable<string> | Promise<Iterable<string>>;
195
+ freeSpaceReader?: FreeSpaceReader;
196
+ /** Test-only: await before materialize when activating a queued run. */
197
+ onBeforeQueuedMaterialize?: (runId: string) => void | Promise<void>;
119
198
  });
120
199
  getMaxConcurrent(): number;
121
200
  setMaxConcurrent(n: number): CapacityHealth;
122
201
  getActiveCount(): number;
202
+ stopAcceptingWork(): void;
203
+ isAcceptingWork(): boolean;
204
+ drainActiveStages(options: {
205
+ deadlineMs: number;
206
+ isEscalated?: () => boolean;
207
+ }): Promise<{
208
+ forced: boolean;
209
+ }>;
123
210
  getActiveRunIds(): string[];
124
211
  getHealth(): CapacityHealth;
212
+ getPerProjectCapacity(): {
213
+ maxConcurrent: number | undefined;
214
+ projects: Array<{
215
+ project_root: string;
216
+ activeCount: number;
217
+ maxConcurrent: number | undefined;
218
+ }>;
219
+ };
220
+ private countActiveForProject;
221
+ private countActiveForCaller;
222
+ private callerQuotaLimit;
223
+ /** Capacity plus on-demand durable-root disk breakdown (KTD16). */
224
+ getHealthWithDisk(): Promise<CapacityHealth>;
225
+ /** Refresh cached `disk_bytes` for one run after a terminal transition. */
226
+ refreshRunDiskBytes(runId: string): Promise<void>;
125
227
  getHitlController(): StageHitlController;
126
228
  /**
127
229
  * KTD7/KTD8: discover waiting stages from the store; leave waiting; do not
@@ -140,10 +242,38 @@ export declare class RunManager {
140
242
  reason: string;
141
243
  }>;
142
244
  }>;
245
+ autoResumeInterruptedStages(): Promise<{
246
+ resumed: Array<{
247
+ runId: string;
248
+ stageId: string;
249
+ }>;
250
+ capped: Array<{
251
+ runId: string;
252
+ stageId: string;
253
+ }>;
254
+ skipped: Array<{
255
+ runId: string;
256
+ stageId: string;
257
+ reason: string;
258
+ }>;
259
+ }>;
143
260
  resumeStalledSchedules(): Promise<Array<{
144
261
  runId: string;
145
262
  }>>;
263
+ /** Rebuild in-memory admission queue from persisted `queued` rows (R27). */
264
+ reenqueuePersistedQueuedRuns(): Promise<void>;
146
265
  abandonStage(runId: string, stageId: string): Promise<AbandonStageResult>;
266
+ cancelRun(runId: string, reason: string): Promise<CancelRunResult>;
267
+ setA2aStore(store: A2aStore): void;
268
+ deleteRun(runId: string, options?: {
269
+ force?: boolean;
270
+ channel: DeleteRunChannel;
271
+ }): Promise<DeleteRunResult>;
272
+ gcRuns(options?: {
273
+ execute?: boolean;
274
+ channel?: GcRunsChannel;
275
+ } & Pick<RunRetentionSweepOptions, "now" | "windows" | "env" | "artifactMaxBytes" | "bareCacheTtlMs">): Promise<GcRunsResult>;
276
+ private waitForPromise;
147
277
  startRunOnce(input: Parameters<RunManager["startRun"]>[0], submission: RunSubmission): Promise<StartRunOnceResult>;
148
278
  private startSubmittedRun;
149
279
  startRun(input: StartTaskInput & {
@@ -154,10 +284,24 @@ export declare class RunManager {
154
284
  gitSha?: string;
155
285
  ciPrUrl?: string;
156
286
  ciJobUrl?: string;
287
+ /**
288
+ * Absolute store-key project root from the wire (registered path or
289
+ * seeded-mapped absolute). When set, persisted as run project_root;
290
+ * Host boot / findProjectRoot are not used to override it.
291
+ */
292
+ projectRoot?: string;
293
+ /** Attribution from auth only — never from request body/query. */
294
+ callerId?: string | null;
295
+ skills?: SkillsPayload;
157
296
  }, submission?: RunSubmission): Promise<StartRunResult>;
158
- rerun(runId: string): Promise<StartRunResult>;
297
+ rerun(runId: string, options?: {
298
+ pinned?: boolean;
299
+ callerId?: string | null;
300
+ }): Promise<StartRunResult>;
159
301
  retryStage(runId: string, stageId: string): Promise<RetryStageResult>;
160
- resumeTimedOutStage(runId: string, stageId: string): Promise<RetryStageResult>;
302
+ resumeTimedOutStage(runId: string, stageId: string, options?: {
303
+ source?: "explicit" | "auto";
304
+ }): Promise<RetryStageResult>;
161
305
  recoverManualStage(runId: string, stageId: string, guidance?: string): Promise<RetryStageResult>;
162
306
  recoverManualStageUntilStop(runId: string, stageId: string, guidance?: string): Promise<{
163
307
  ok: true;
@@ -203,7 +347,16 @@ export declare class RunManager {
203
347
  private reconstructAndContinue;
204
348
  private reserveAndStartPipeline;
205
349
  private busyFailure;
350
+ private insufficientDiskFailure;
351
+ private checkDiskFloorAdmission;
352
+ private isProjectRootAvailable;
353
+ private tryAdmitOrEnqueue;
206
354
  private tryReserve;
355
+ private ensureQueuedDone;
356
+ private resolveQueuedDone;
357
+ private attachQueuedDone;
358
+ private drainAdmissionQueue;
359
+ private startDequeuedAdmission;
207
360
  private clearReservation;
208
361
  private track;
209
362
  private tryResumeStalledSchedule;
@@ -217,4 +370,5 @@ export declare class RunManager {
217
370
  private quarantineAttachRun;
218
371
  private untrackIfGeneration;
219
372
  private removeActiveEntry;
373
+ private ensureSchedulingHalt;
220
374
  }