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,146 @@
1
+ import type { CallerSurface } from "../server/requestAuthContext.js";
2
+ import type { ToolchainCheck } from "../preflight/toolchain.js";
3
+ import type { SkillOrigin } from "../config/listSkills.js";
4
+ import type { ResolvedMcpServers } from "../config/resolveStageMcpServers.js";
5
+ import type { SkillsPayload } from "../runtime/runSkills.js";
6
+ import type { LoadedStageConfig } from "../types/stage.js";
7
+ import { type NamedSecret, type RedactOptions } from "../logging/redact.js";
8
+ import type { RunStore } from "./port.js";
9
+ export declare const RUN_MANIFEST_VERSION: 1;
10
+ export type ModelAuthoredTier = "stage" | "pipeline" | "global";
11
+ export type RunManifestHost = {
12
+ stageflow_version: string;
13
+ build_sha: string;
14
+ image_digest: string | null;
15
+ schema_version: number;
16
+ };
17
+ export type RunManifestCaller = {
18
+ caller_id: string | null;
19
+ surface: CallerSurface;
20
+ };
21
+ export type RunManifestBinding = {
22
+ kind: "repository";
23
+ repository: string;
24
+ ref?: string;
25
+ resolved_sha?: string;
26
+ branch?: string;
27
+ worktree_path?: string;
28
+ } | {
29
+ kind: "checkout";
30
+ resolved_sha?: string;
31
+ worktree_path?: string;
32
+ } | {
33
+ kind: "unbound";
34
+ };
35
+ export type RunManifestPipeline = {
36
+ source: "inline" | "path";
37
+ path: string | null;
38
+ bytes_sha256: string;
39
+ body: unknown;
40
+ };
41
+ export type RunManifestTask = {
42
+ source: "inline" | "path";
43
+ path: string | null;
44
+ bytes_sha256: string;
45
+ body: string;
46
+ };
47
+ export type RunManifestSkill = {
48
+ name: string;
49
+ origin: SkillOrigin;
50
+ digest: string;
51
+ files: string[];
52
+ };
53
+ export type RunManifestStageModel = {
54
+ authored: string;
55
+ authored_tier: ModelAuthoredTier;
56
+ resolved?: string;
57
+ thinking_level?: string;
58
+ };
59
+ export type RunManifestMcpServer = {
60
+ name: string;
61
+ command?: string;
62
+ args?: unknown;
63
+ env?: Record<string, unknown>;
64
+ url?: string;
65
+ origin?: string;
66
+ [key: string]: unknown;
67
+ };
68
+ export type RunManifestStage = {
69
+ stage_id: string;
70
+ model: RunManifestStageModel;
71
+ mcp_servers: RunManifestMcpServer[];
72
+ };
73
+ export type RunManifestToolchainEntry = {
74
+ tool: string;
75
+ required?: string;
76
+ resolved?: string;
77
+ path?: string;
78
+ origin?: ToolchainCheck["origin"];
79
+ status?: ToolchainCheck["status"];
80
+ };
81
+ export type RunManifestV1 = {
82
+ manifest_version: typeof RUN_MANIFEST_VERSION;
83
+ run_id: string;
84
+ created_at: string;
85
+ finalised_at?: string;
86
+ host: RunManifestHost;
87
+ caller: RunManifestCaller;
88
+ binding: RunManifestBinding;
89
+ pipeline: RunManifestPipeline;
90
+ task: RunManifestTask;
91
+ skills: RunManifestSkill[];
92
+ stages: RunManifestStage[];
93
+ toolchain: RunManifestToolchainEntry[];
94
+ };
95
+ export type RunManifest = RunManifestV1;
96
+ export declare function sha256Hex(bytes: string | Buffer): string;
97
+ export declare function sha256Digest(bytes: string | Buffer): string;
98
+ export declare function digestSkillFiles(files: Record<string, string>): {
99
+ digest: string;
100
+ files: string[];
101
+ };
102
+ export declare function skillsFromPayload(payload: SkillsPayload | undefined): RunManifestSkill[];
103
+ export declare function toolchainFromChecks(checks: readonly ToolchainCheck[]): RunManifestToolchainEntry[];
104
+ export declare function bindingFromFields(fields: {
105
+ repository?: string;
106
+ ref?: string;
107
+ resolvedSha?: string;
108
+ runBranch?: string;
109
+ checkoutRoot?: string;
110
+ }): RunManifestBinding;
111
+ export declare function stagesFromLoaded(stages: readonly LoadedStageConfig[]): RunManifestStage[];
112
+ export declare function buildHostIdentity(env?: NodeJS.ProcessEnv): RunManifestHost;
113
+ export type BuildInitialRunManifestInput = {
114
+ runId: string;
115
+ createdAt: string;
116
+ callerId: string | null;
117
+ surface: CallerSurface;
118
+ binding: RunManifestBinding;
119
+ pipelineSource: "inline" | "path";
120
+ pipelinePath?: string;
121
+ pipelineBody?: string | null;
122
+ taskYaml: string;
123
+ taskPath?: string;
124
+ skills?: SkillsPayload;
125
+ stages: readonly LoadedStageConfig[];
126
+ toolchain: readonly ToolchainCheck[];
127
+ namedSecrets?: readonly NamedSecret[];
128
+ };
129
+ export declare function buildInitialRunManifest(input: BuildInitialRunManifestInput): RunManifestV1;
130
+ export declare function parseRunManifest(value: unknown): RunManifest | null;
131
+ export declare function collectMcpEnvNamedSecrets(servers: ResolvedMcpServers | undefined): NamedSecret[];
132
+ export declare function collectDeclaredSecretValues(names: readonly string[], env?: NodeJS.ProcessEnv): NamedSecret[];
133
+ export declare function redactMcpServers(servers: ResolvedMcpServers, namedSecrets: readonly NamedSecret[], origins?: ReadonlyMap<string, string>): RunManifestMcpServer[];
134
+ export declare function redactRunManifest(manifest: RunManifestV1, options?: RedactOptions): RunManifestV1;
135
+ /** Defense-in-depth redaction for get_run / export views (pipeline body included). */
136
+ export declare function redactRunManifestForRead(value: unknown, options?: RedactOptions): RunManifest | null;
137
+ export declare function withStageResolvedModel(manifest: RunManifestV1, stageId: string, resolved: {
138
+ model: string;
139
+ thinkingLevel?: string;
140
+ }): RunManifestV1;
141
+ export declare function withStageMcpServers(manifest: RunManifestV1, stageId: string, mcpServers: RunManifestMcpServer[]): RunManifestV1;
142
+ export declare function withSkillEntry(manifest: RunManifestV1, skill: RunManifestSkill): RunManifestV1;
143
+ export declare function finaliseRunManifest(manifest: RunManifestV1, finalisedAt?: string): RunManifestV1;
144
+ export declare function readParsedRunManifest(store: Pick<RunStore, "readRunMeta">, runId: string): Promise<RunManifest | null>;
145
+ export declare function patchRunManifest(store: Pick<RunStore, "readRunMeta" | "updateRunManifest">, runId: string, mutate: (current: RunManifestV1) => RunManifestV1, namedSecrets?: readonly NamedSecret[]): Promise<RunManifestV1 | null>;
146
+ export declare function finaliseStoredRunManifest(store: Pick<RunStore, "readRunMeta" | "updateRunManifest">, runId: string, finalisedAt?: string): Promise<void>;
@@ -0,0 +1,288 @@
1
+ import { createHash } from "node:crypto";
2
+ import { PACKAGE_VERSION, BUILD_SHA } from "../package-meta.js";
3
+ import { redact, } from "../logging/redact.js";
4
+ import { getNamedSecrets } from "../logging/namedSecrets.js";
5
+ import { CURRENT_SCHEMA_VERSION } from "./sqlite/migrations/index.js";
6
+ export const RUN_MANIFEST_VERSION = 1;
7
+ export function sha256Hex(bytes) {
8
+ return createHash("sha256").update(bytes).digest("hex");
9
+ }
10
+ export function sha256Digest(bytes) {
11
+ return `sha256:${sha256Hex(bytes)}`;
12
+ }
13
+ export function digestSkillFiles(files) {
14
+ const names = Object.keys(files).sort();
15
+ const hash = createHash("sha256");
16
+ for (const name of names) {
17
+ hash.update(name);
18
+ hash.update("\0");
19
+ hash.update(files[name] ?? "");
20
+ hash.update("\0");
21
+ }
22
+ return { digest: `sha256:${hash.digest("hex")}`, files: names };
23
+ }
24
+ export function skillsFromPayload(payload) {
25
+ if (payload === undefined)
26
+ return [];
27
+ const out = [];
28
+ for (const [name, files] of Object.entries(payload)) {
29
+ const dig = digestSkillFiles(files);
30
+ out.push({
31
+ name,
32
+ origin: "run",
33
+ digest: dig.digest,
34
+ files: dig.files,
35
+ });
36
+ }
37
+ return out.sort((a, b) => a.name.localeCompare(b.name));
38
+ }
39
+ export function toolchainFromChecks(checks) {
40
+ return checks.map((c) => ({
41
+ tool: c.tool,
42
+ ...(c.required !== undefined ? { required: c.required } : {}),
43
+ ...(c.found !== undefined ? { resolved: c.found } : {}),
44
+ ...(c.path !== undefined ? { path: c.path } : {}),
45
+ origin: c.origin,
46
+ status: c.status,
47
+ }));
48
+ }
49
+ export function bindingFromFields(fields) {
50
+ if (fields.repository != null && fields.repository !== "") {
51
+ return {
52
+ kind: "repository",
53
+ repository: fields.repository,
54
+ ...(fields.ref !== undefined ? { ref: fields.ref } : {}),
55
+ ...(fields.resolvedSha !== undefined
56
+ ? { resolved_sha: fields.resolvedSha }
57
+ : {}),
58
+ ...(fields.runBranch !== undefined ? { branch: fields.runBranch } : {}),
59
+ ...(fields.checkoutRoot !== undefined
60
+ ? { worktree_path: fields.checkoutRoot }
61
+ : {}),
62
+ };
63
+ }
64
+ if (fields.checkoutRoot != null && fields.checkoutRoot !== "") {
65
+ return {
66
+ kind: "checkout",
67
+ ...(fields.resolvedSha !== undefined
68
+ ? { resolved_sha: fields.resolvedSha }
69
+ : {}),
70
+ worktree_path: fields.checkoutRoot,
71
+ };
72
+ }
73
+ return { kind: "unbound" };
74
+ }
75
+ export function stagesFromLoaded(stages) {
76
+ return stages.map((stage) => ({
77
+ stage_id: stage.id,
78
+ model: {
79
+ authored: stage.model,
80
+ authored_tier: stage.model_tier ?? "stage",
81
+ },
82
+ mcp_servers: [],
83
+ }));
84
+ }
85
+ export function buildHostIdentity(env = process.env) {
86
+ const digest = env.STAGEFLOW_IMAGE_DIGEST?.trim();
87
+ return {
88
+ stageflow_version: PACKAGE_VERSION,
89
+ build_sha: BUILD_SHA,
90
+ image_digest: digest && digest.length > 0 ? digest : null,
91
+ schema_version: CURRENT_SCHEMA_VERSION,
92
+ };
93
+ }
94
+ export function buildInitialRunManifest(input) {
95
+ const pipelineBody = input.pipelineSource === "inline" && input.pipelineBody
96
+ ? (() => {
97
+ try {
98
+ return JSON.parse(input.pipelineBody);
99
+ }
100
+ catch {
101
+ return input.pipelineBody;
102
+ }
103
+ })()
104
+ : null;
105
+ const pipelineBytes = input.pipelineSource === "inline" && input.pipelineBody
106
+ ? input.pipelineBody
107
+ : input.pipelinePath ?? "";
108
+ const taskSource = input.taskPath !== undefined && input.taskPath.length > 0
109
+ ? "path"
110
+ : "inline";
111
+ const raw = {
112
+ manifest_version: RUN_MANIFEST_VERSION,
113
+ run_id: input.runId,
114
+ created_at: input.createdAt,
115
+ host: buildHostIdentity(),
116
+ caller: {
117
+ caller_id: input.callerId,
118
+ surface: input.surface,
119
+ },
120
+ binding: input.binding,
121
+ pipeline: {
122
+ source: input.pipelineSource,
123
+ path: input.pipelinePath ?? null,
124
+ bytes_sha256: sha256Hex(pipelineBytes),
125
+ body: pipelineBody,
126
+ },
127
+ task: {
128
+ source: taskSource,
129
+ path: input.taskPath ?? null,
130
+ bytes_sha256: sha256Hex(input.taskYaml),
131
+ body: input.taskYaml,
132
+ },
133
+ skills: skillsFromPayload(input.skills),
134
+ stages: stagesFromLoaded(input.stages),
135
+ toolchain: toolchainFromChecks(input.toolchain),
136
+ };
137
+ return redactRunManifest(raw, {
138
+ namedSecrets: input.namedSecrets ?? getNamedSecrets(),
139
+ });
140
+ }
141
+ export function parseRunManifest(value) {
142
+ if (value === null || value === undefined)
143
+ return null;
144
+ if (typeof value !== "object" || Array.isArray(value))
145
+ return null;
146
+ const version = value.manifest_version;
147
+ if (version === 1) {
148
+ return value;
149
+ }
150
+ return null;
151
+ }
152
+ export function collectMcpEnvNamedSecrets(servers) {
153
+ if (servers === undefined)
154
+ return [];
155
+ const out = [];
156
+ for (const [serverName, cfg] of Object.entries(servers)) {
157
+ const env = cfg.env;
158
+ if (env === null || typeof env !== "object" || Array.isArray(env))
159
+ continue;
160
+ for (const [key, value] of Object.entries(env)) {
161
+ if (typeof value === "string" && value.length > 0) {
162
+ out.push({ name: `${serverName}.${key}`, value });
163
+ }
164
+ }
165
+ }
166
+ return out;
167
+ }
168
+ export function collectDeclaredSecretValues(names, env = process.env) {
169
+ const out = [];
170
+ for (const name of names) {
171
+ const plain = env[name];
172
+ if (typeof plain === "string" && plain.length > 0) {
173
+ out.push({ name, value: plain });
174
+ }
175
+ }
176
+ return out;
177
+ }
178
+ export function redactMcpServers(servers, namedSecrets, origins) {
179
+ const out = [];
180
+ for (const [name, cfg] of Object.entries(servers)) {
181
+ const redacted = redact({ ...cfg }, { namedSecrets });
182
+ out.push({
183
+ name,
184
+ ...redacted,
185
+ ...(origins?.get(name) !== undefined
186
+ ? { origin: origins.get(name) }
187
+ : {}),
188
+ });
189
+ }
190
+ return out;
191
+ }
192
+ export function redactRunManifest(manifest, options = {}) {
193
+ const namedSecrets = [
194
+ ...(options.namedSecrets ?? getNamedSecrets()),
195
+ ];
196
+ return redact({ ...manifest }, {
197
+ ...options,
198
+ namedSecrets,
199
+ });
200
+ }
201
+ /** Defense-in-depth redaction for get_run / export views (pipeline body included). */
202
+ export function redactRunManifestForRead(value, options = {}) {
203
+ const parsed = parseRunManifest(value);
204
+ if (parsed === null)
205
+ return null;
206
+ if (parsed.manifest_version === 1) {
207
+ return redactRunManifest(parsed, options);
208
+ }
209
+ return null;
210
+ }
211
+ export function withStageResolvedModel(manifest, stageId, resolved) {
212
+ const stages = manifest.stages.map((stage) => {
213
+ if (stage.stage_id !== stageId)
214
+ return stage;
215
+ return {
216
+ ...stage,
217
+ model: {
218
+ ...stage.model,
219
+ resolved: resolved.model,
220
+ ...(resolved.thinkingLevel !== undefined
221
+ ? { thinking_level: resolved.thinkingLevel }
222
+ : {}),
223
+ },
224
+ };
225
+ });
226
+ const has = stages.some((s) => s.stage_id === stageId);
227
+ if (!has) {
228
+ stages.push({
229
+ stage_id: stageId,
230
+ model: {
231
+ authored: resolved.model,
232
+ authored_tier: "stage",
233
+ resolved: resolved.model,
234
+ ...(resolved.thinkingLevel !== undefined
235
+ ? { thinking_level: resolved.thinkingLevel }
236
+ : {}),
237
+ },
238
+ mcp_servers: [],
239
+ });
240
+ }
241
+ return { ...manifest, stages };
242
+ }
243
+ export function withStageMcpServers(manifest, stageId, mcpServers) {
244
+ const stages = manifest.stages.map((stage) => {
245
+ if (stage.stage_id !== stageId)
246
+ return stage;
247
+ return { ...stage, mcp_servers: mcpServers };
248
+ });
249
+ const has = stages.some((s) => s.stage_id === stageId);
250
+ if (!has) {
251
+ stages.push({
252
+ stage_id: stageId,
253
+ model: { authored: "", authored_tier: "stage" },
254
+ mcp_servers: mcpServers,
255
+ });
256
+ }
257
+ return { ...manifest, stages };
258
+ }
259
+ export function withSkillEntry(manifest, skill) {
260
+ const skills = [...manifest.skills];
261
+ const idx = skills.findIndex((s) => s.name === skill.name);
262
+ if (idx >= 0)
263
+ skills[idx] = skill;
264
+ else
265
+ skills.push(skill);
266
+ skills.sort((a, b) => a.name.localeCompare(b.name));
267
+ return { ...manifest, skills };
268
+ }
269
+ export function finaliseRunManifest(manifest, finalisedAt = new Date().toISOString()) {
270
+ return { ...manifest, finalised_at: finalisedAt };
271
+ }
272
+ export async function readParsedRunManifest(store, runId) {
273
+ const meta = await store.readRunMeta(runId);
274
+ return parseRunManifest(meta.run_manifest);
275
+ }
276
+ export async function patchRunManifest(store, runId, mutate, namedSecrets) {
277
+ const current = await readParsedRunManifest(store, runId);
278
+ if (current === null || current.manifest_version !== 1)
279
+ return null;
280
+ const next = redactRunManifest(mutate(current), {
281
+ namedSecrets: namedSecrets ?? getNamedSecrets(),
282
+ });
283
+ await store.updateRunManifest(runId, next);
284
+ return next;
285
+ }
286
+ export async function finaliseStoredRunManifest(store, runId, finalisedAt = new Date().toISOString()) {
287
+ await patchRunManifest(store, runId, (m) => m.finalised_at !== undefined ? m : finaliseRunManifest(m, finalisedAt));
288
+ }
@@ -1,9 +1,11 @@
1
- import type { FeedbackLoopHistory, FeedbackLoopRecord, RunDetail, RunMeta, RunPipelineDagSnapshot, RunSummary, StageSnapshot } from "./port.js";
1
+ import type { FeedbackLoopHistory, FeedbackLoopRecord, RunBindingCompact, RunBindingDetail, RunDetail, RunMeta, RunPipelineDagSnapshot, RunSummary, StageSnapshot } from "./port.js";
2
2
  export { syntheticPendingSnapshot } from "./syntheticStageSnapshot.js";
3
3
  export type FeedbackProjectionInput = {
4
4
  feedback_loops?: FeedbackLoopHistory[];
5
5
  active_feedback_loop?: FeedbackLoopRecord;
6
6
  };
7
+ export declare function projectRunBindingCompact(meta: RunMeta): RunBindingCompact;
8
+ export declare function projectRunBindingDetail(meta: RunMeta): RunBindingDetail;
7
9
  export declare function overlayPlannedStages(stageIds: string[], snapshots: StageSnapshot[], dag?: Pick<RunPipelineDagSnapshot, "nodes"> | null): StageSnapshot[];
8
10
  export declare function orderStageSnapshots(stageIds: string[], snapshots: StageSnapshot[]): StageSnapshot[];
9
11
  export declare function projectRunSummary(meta: RunMeta, stages: StageSnapshot[], feedback?: Pick<FeedbackProjectionInput, "active_feedback_loop">): RunSummary;
@@ -3,6 +3,47 @@ import { linearCompatDagSnapshot } from "./pipelineDagSnapshot.js";
3
3
  import { syntheticPendingSnapshot } from "./syntheticStageSnapshot.js";
4
4
  import { buildPipelineTrack } from "./trackProjection.js";
5
5
  export { syntheticPendingSnapshot } from "./syntheticStageSnapshot.js";
6
+ export function projectRunBindingCompact(meta) {
7
+ if (meta.repository != null && meta.repository !== "") {
8
+ return {
9
+ kind: "repository",
10
+ repository: meta.repository,
11
+ ...(meta.ref !== undefined ? { ref: meta.ref } : {}),
12
+ ...(meta.resolved_sha !== undefined
13
+ ? { resolved_sha: meta.resolved_sha }
14
+ : {}),
15
+ };
16
+ }
17
+ if (meta.checkout_root != null && meta.checkout_root !== "") {
18
+ return {
19
+ kind: "checkout",
20
+ ...(meta.resolved_sha !== undefined
21
+ ? { resolved_sha: meta.resolved_sha }
22
+ : {}),
23
+ };
24
+ }
25
+ return { kind: "unbound" };
26
+ }
27
+ export function projectRunBindingDetail(meta) {
28
+ const compact = projectRunBindingCompact(meta);
29
+ if (compact.kind === "unbound")
30
+ return compact;
31
+ if (compact.kind === "checkout") {
32
+ return {
33
+ ...compact,
34
+ ...(meta.checkout_root !== undefined
35
+ ? { checkout_root: meta.checkout_root }
36
+ : {}),
37
+ };
38
+ }
39
+ return {
40
+ ...compact,
41
+ ...(meta.run_branch !== undefined ? { run_branch: meta.run_branch } : {}),
42
+ ...(meta.checkout_root !== undefined
43
+ ? { checkout_root: meta.checkout_root }
44
+ : {}),
45
+ };
46
+ }
6
47
  export function overlayPlannedStages(stageIds, snapshots, dag) {
7
48
  const byId = new Map(snapshots.map((s) => [s.stage_id, s]));
8
49
  const nodeById = new Map((dag?.nodes ?? []).map((n) => [n.id, n]));
@@ -85,7 +126,7 @@ function failedFieldsFromStages(stages, dag) {
85
126
  function resolveListedStatus(stages, meta, dag) {
86
127
  if (stages.length === 0)
87
128
  return meta.status ?? "created";
88
- const derived = deriveStatusFromStages(stages, dag);
129
+ const derived = deriveStatusFromStages(stages, dag, meta.status);
89
130
  if (meta.status === "succeeded" && derived === "running") {
90
131
  const hasActiveStage = stages.some((s) => s.status === "running" || s.status === "waiting_for_input");
91
132
  if (!hasActiveStage)
@@ -113,9 +154,13 @@ export function projectRunSummary(meta, stages, feedback) {
113
154
  ...(meta.pipeline_path !== undefined ? { pipeline_path: meta.pipeline_path } : {}),
114
155
  ...(meta.task_path !== undefined ? { task_path: meta.task_path } : {}),
115
156
  ...(meta.project_root !== undefined ? { project_root: meta.project_root } : {}),
157
+ ...(meta.pipeline_source !== undefined
158
+ ? { pipeline_source: meta.pipeline_source }
159
+ : {}),
116
160
  status: resolveListedStatus(stages, meta, dag),
117
161
  created_at: meta.created_at,
118
162
  updated_at: meta.updated_at,
163
+ binding: projectRunBindingCompact(meta),
119
164
  stages: compactStages(stages),
120
165
  ...waiting,
121
166
  ...failedFieldsFromStages(stages, dag),
@@ -123,6 +168,15 @@ export function projectRunSummary(meta, stages, feedback) {
123
168
  ? { active_feedback_loop: feedback.active_feedback_loop }
124
169
  : {}),
125
170
  ...(cost !== undefined ? { total_cost_usd: cost } : {}),
171
+ ...(meta.cancel_reason !== undefined
172
+ ? { cancel_reason: meta.cancel_reason }
173
+ : {}),
174
+ ...(meta.finished_at !== undefined ? { finished_at: meta.finished_at } : {}),
175
+ ...(meta.slimmed_at !== undefined ? { slimmed_at: meta.slimmed_at } : {}),
176
+ ...(meta.disk_bytes !== undefined ? { disk_bytes: meta.disk_bytes } : {}),
177
+ ...(meta.disk_measured_at !== undefined
178
+ ? { disk_measured_at: meta.disk_measured_at }
179
+ : {}),
126
180
  };
127
181
  }
128
182
  export function projectRunDetail(meta, stages, task_yaml, dagSnapshot, feedback) {
@@ -139,9 +193,17 @@ export function projectRunDetail(meta, stages, task_yaml, dagSnapshot, feedback)
139
193
  });
140
194
  return {
141
195
  ...summary,
196
+ binding: projectRunBindingDetail(dag ? { ...meta, pipeline_dag: dag } : meta),
142
197
  task_yaml,
143
198
  stages: ordered,
144
199
  pipeline_track,
145
200
  feedback_loops: feedback?.feedback_loops ?? [],
201
+ ...(meta.config_origins !== undefined && meta.config_origins.length > 0
202
+ ? { config_origins: meta.config_origins }
203
+ : {}),
204
+ ...(meta.caller_id !== undefined ? { caller_id: meta.caller_id } : {}),
205
+ ...(meta.run_manifest !== undefined
206
+ ? { run_manifest: meta.run_manifest }
207
+ : {}),
146
208
  };
147
209
  }
@@ -1,15 +1,22 @@
1
1
  import Database from "better-sqlite3";
2
2
  import type { StageEnvelope } from "../../types/envelope.js";
3
3
  import type { StageLogLine } from "../../agent/activity.js";
4
- import { type CreateFeedbackLoopInput, type CreateFeedbackReplayInput, type CreateFeedbackReplayStagePassInput, type CreateForkGenerationInput, type CreateRunInput, type CreatedRun, type FeedbackLoopPatch, type FeedbackLoopRecord, type FeedbackLoopState, type FeedbackReplayPatch, type FeedbackReplayRecord, type FeedbackReplayStagePassPatch, type FeedbackReplayStagePassRecord, type ForkGenerationPatch, type ForkGenerationRecord, type ListRunsFilter, type RunDetail, type RunMeta, type RunPipelineDagSnapshot, type RunStatus, type RunStore, type RunSummary, type StageExecution, type StageExecutionPatch, type StageLogEvent, type VerificationCheckResult, type VerificationCheckResultPatch } from "../port.js";
4
+ import { type CreateFeedbackLoopInput, type CreateFeedbackReplayInput, type CreateFeedbackReplayStagePassInput, type CreateForkGenerationInput, type CreateRunInput, type CreatedRun, type FeedbackLoopPatch, type FeedbackLoopRecord, type FeedbackLoopState, type FeedbackReplayPatch, type FeedbackReplayRecord, type FeedbackReplayStagePassPatch, type FeedbackReplayStagePassRecord, type ForkGenerationPatch, type ForkGenerationRecord, type ListRunsFilter, type RunDetail, type RunMeta, type RunPipelineDagSnapshot, type RunStatus, type RunStore, type RunSummary, type StageExecution, type StageExecutionPatch, type StageLogEvent, type VerificationCheckResult, type VerificationCheckResultPatch, type ConfigOriginRecord } from "../port.js";
5
5
  import { type RunSubmissionRecord } from "../submission.js";
6
+ type SqliteRunStoreOpenerMode = "assert" | "migrate";
6
7
  export declare class SqliteRunStore implements RunStore {
7
8
  private readonly storeRoot;
8
9
  private readonly db;
9
10
  private migratePromise;
10
- constructor(storeRoot: string);
11
+ constructor(storeRoot: string, options?: {
12
+ openerMode?: SqliteRunStoreOpenerMode;
13
+ });
11
14
  /** Await one-shot disk import before catalog reads (create paths also wait). */
12
15
  ready(): Promise<void>;
16
+ close(): Promise<void>;
17
+ snapshotInto(destPath: string): Promise<{
18
+ userVersion: number;
19
+ }>;
13
20
  /**
14
21
  * The connection this store owns, for the one caller allowed to share it: the composition root
15
22
  * wiring the A2A tables into the same `state.db` file. Not part of the `RunStore` interface.
@@ -20,9 +27,24 @@ export declare class SqliteRunStore implements RunStore {
20
27
  private readSubmission;
21
28
  getRunBySubmission(key: string): Promise<RunSubmissionRecord | null>;
22
29
  updateRunStatus(runId: string, status: RunStatus): Promise<void>;
30
+ tryUpdateRunStatus(runId: string, status: RunStatus, expectedStatus: RunStatus): Promise<boolean>;
31
+ patchRunWorkspaceBinding(runId: string, patch: {
32
+ checkoutRoot?: string;
33
+ repository?: string;
34
+ ref?: string;
35
+ resolvedSha?: string;
36
+ runBranch?: string;
37
+ }): Promise<void>;
38
+ appendConfigOrigins(runId: string, origins: ConfigOriginRecord[]): Promise<void>;
39
+ setCancelReason(runId: string, reason: string): Promise<void>;
40
+ setRunDiskUsage(runId: string, diskBytes: number, measuredAt: string): Promise<void>;
41
+ setSlimmedAt(runId: string, slimmedAt: string): Promise<void>;
42
+ deleteRun(runId: string): Promise<void>;
23
43
  updatePipelineDag(runId: string, dag: RunPipelineDagSnapshot): Promise<void>;
24
44
  readRunMeta(runId: string): Promise<RunMeta>;
25
45
  readTaskYaml(runId: string): Promise<string>;
46
+ readPipelineBody(runId: string): Promise<string | null>;
47
+ updateRunManifest(runId: string, manifest: unknown): Promise<void>;
26
48
  ensureStageWorkspace(runId: string, stageId: string): Promise<void>;
27
49
  ensureAttemptWorkspace(runId: string, stageId: string, attempt: number): Promise<void>;
28
50
  createStageExecution(runId: string, stageId: string): Promise<StageExecution>;
@@ -30,6 +52,7 @@ export declare class SqliteRunStore implements RunStore {
30
52
  getLatestStageExecution(runId: string, stageId: string): Promise<StageExecution | null>;
31
53
  countStageAttempts(runId: string, stageId: string): Promise<number>;
32
54
  getStageExecution(runId: string, stageId: string, attempt: number): Promise<StageExecution>;
55
+ listInterruptedStageExecutions(): Promise<StageExecution[]>;
33
56
  updateStageExecution(runId: string, stageId: string, attempt: number, patch: StageExecutionPatch): Promise<void>;
34
57
  upsertVerificationCheckResult(runId: string, stageId: string, result: VerificationCheckResultPatch, options?: {
35
58
  attempt?: number;
@@ -52,7 +75,8 @@ export declare class SqliteRunStore implements RunStore {
52
75
  private updateStageStatusDenorm;
53
76
  listStageEvents(runId: string, stageId: string, attempt?: number): Promise<StageLogEvent[]>;
54
77
  listRuns(filter?: ListRunsFilter): Promise<RunSummary[]>;
55
- listProjectRoots(): Promise<string[]>;
78
+ ensureProject(absPath: string): Promise<string>;
79
+ listRegisteredProjects(): Promise<string[]>;
56
80
  readRun(runId: string): Promise<RunDetail>;
57
81
  createFeedbackLoop(runId: string, input: CreateFeedbackLoopInput): Promise<FeedbackLoopRecord>;
58
82
  getFeedbackLoop(runId: string, loopId: string): Promise<FeedbackLoopRecord>;
@@ -81,3 +105,4 @@ export declare class SqliteRunStore implements RunStore {
81
105
  private loadStageSnapshots;
82
106
  }
83
107
  export declare function openSqliteRunStore(storeRoot: string): SqliteRunStore;
108
+ export {};