stageflow 0.25.0 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (681) hide show
  1. package/README.md +14 -3
  2. package/builtin-skills/browser/SKILL.md +42 -0
  3. package/dist/a2a/contracts.d.ts +1 -0
  4. package/dist/a2a/contracts.js +1 -0
  5. package/dist/a2a/registry.d.ts +2 -0
  6. package/dist/a2a/registry.js +20 -1
  7. package/dist/a2a/server.d.ts +7 -0
  8. package/dist/a2a/server.js +5 -2
  9. package/dist/a2a/service.d.ts +1 -1
  10. package/dist/a2a/service.js +57 -8
  11. package/dist/a2a/store.d.ts +8 -5
  12. package/dist/a2a/store.js +24 -67
  13. package/dist/agent/activity.d.ts +3 -0
  14. package/dist/agent/bootProviderConfig.d.ts +21 -0
  15. package/dist/agent/bootProviderConfig.js +74 -0
  16. package/dist/agent/claudeAdapter.js +2 -2
  17. package/dist/agent/cursorProvider.d.ts +2 -0
  18. package/dist/agent/cursorProvider.js +30 -5
  19. package/dist/agent/fakeAgent.d.ts +1 -0
  20. package/dist/agent/fakeAgent.js +13 -0
  21. package/dist/agent/piAdapter.d.ts +11 -24
  22. package/dist/agent/piAdapter.js +107 -50
  23. package/dist/agent/piIsolatedMcp.d.ts +2 -0
  24. package/dist/agent/piIsolatedMcp.js +10 -2
  25. package/dist/agent/piSessionFactory.d.ts +38 -0
  26. package/dist/agent/piSessionFactory.js +60 -0
  27. package/dist/agent/port.d.ts +8 -0
  28. package/dist/agent/streamLogRedact.d.ts +7 -1
  29. package/dist/agent/streamLogRedact.js +26 -11
  30. package/dist/browser/anchor.d.ts +27 -0
  31. package/dist/browser/anchor.js +127 -0
  32. package/dist/browser/auditSink.d.ts +38 -0
  33. package/dist/browser/auditSink.js +34 -0
  34. package/dist/browser/browserHost.d.ts +86 -0
  35. package/dist/browser/browserHost.js +7 -0
  36. package/dist/browser/browserSweep.d.ts +14 -0
  37. package/dist/browser/browserSweep.js +54 -0
  38. package/dist/browser/browserTeardown.d.ts +56 -0
  39. package/dist/browser/browserTeardown.js +235 -0
  40. package/dist/browser/fakeRemoteBrowserHost.d.ts +2 -0
  41. package/dist/browser/fakeRemoteBrowserHost.js +34 -0
  42. package/dist/browser/gateHandoff.d.ts +25 -0
  43. package/dist/browser/gateHandoff.js +83 -0
  44. package/dist/browser/humanLogin.d.ts +18 -0
  45. package/dist/browser/humanLogin.js +34 -0
  46. package/dist/browser/keyProvider.d.ts +10 -0
  47. package/dist/browser/keyProvider.js +39 -0
  48. package/dist/browser/localBrowserHost.d.ts +10 -0
  49. package/dist/browser/localBrowserHost.js +152 -0
  50. package/dist/browser/localProfileLock.d.ts +2 -0
  51. package/dist/browser/localProfileLock.js +218 -0
  52. package/dist/browser/localProfileStore.d.ts +5 -0
  53. package/dist/browser/localProfileStore.js +91 -0
  54. package/dist/browser/loginCheck.d.ts +53 -0
  55. package/dist/browser/loginCheck.js +147 -0
  56. package/dist/browser/memoryProfileLock.d.ts +2 -0
  57. package/dist/browser/memoryProfileLock.js +53 -0
  58. package/dist/browser/memoryProfileStore.d.ts +2 -0
  59. package/dist/browser/memoryProfileStore.js +31 -0
  60. package/dist/browser/navigationAudit.d.ts +16 -0
  61. package/dist/browser/navigationAudit.js +53 -0
  62. package/dist/browser/persistedEnv.d.ts +3 -0
  63. package/dist/browser/persistedEnv.js +15 -0
  64. package/dist/browser/profileLock.d.ts +40 -0
  65. package/dist/browser/profileLock.js +10 -0
  66. package/dist/browser/profileStore.d.ts +23 -0
  67. package/dist/browser/profileStore.js +39 -0
  68. package/dist/browser/runLiveness.d.ts +13 -0
  69. package/dist/browser/runLiveness.js +39 -0
  70. package/dist/browser/sitePolicy.d.ts +10 -0
  71. package/dist/browser/sitePolicy.js +61 -0
  72. package/dist/browser/stageBrowserEnv.d.ts +22 -0
  73. package/dist/browser/stageBrowserEnv.js +147 -0
  74. package/dist/browser/stageProfileLock.d.ts +17 -0
  75. package/dist/browser/stageProfileLock.js +39 -0
  76. package/dist/cli/artifactCommand.js +9 -16
  77. package/dist/cli/backupCommand.d.ts +9 -0
  78. package/dist/cli/backupCommand.js +111 -0
  79. package/dist/cli/browserCommand.d.ts +44 -0
  80. package/dist/cli/browserCommand.js +472 -0
  81. package/dist/cli/debugRunCommand.d.ts +10 -0
  82. package/dist/cli/debugRunCommand.js +109 -0
  83. package/dist/cli/doctorCommand.d.ts +32 -0
  84. package/dist/cli/doctorCommand.js +453 -0
  85. package/dist/cli/envelopeCommand.js +9 -2
  86. package/dist/cli/exportAllCommand.d.ts +55 -0
  87. package/dist/cli/exportAllCommand.js +218 -0
  88. package/dist/cli/exportRunCommand.js +23 -21
  89. package/dist/cli/hostClient.d.ts +41 -3
  90. package/dist/cli/hostClient.js +129 -14
  91. package/dist/cli/initCommand.d.ts +1 -0
  92. package/dist/cli/initCommand.js +23 -7
  93. package/dist/cli/initTemplates.d.ts +5 -2
  94. package/dist/cli/initTemplates.js +32 -2
  95. package/dist/cli/resolveSafeOutPath.d.ts +2 -0
  96. package/dist/cli/resolveSafeOutPath.js +40 -0
  97. package/dist/cli/restoreCommand.d.ts +10 -0
  98. package/dist/cli/restoreCommand.js +90 -0
  99. package/dist/cli/runCommand.d.ts +3 -2
  100. package/dist/cli/runCommand.js +93 -11
  101. package/dist/cli/runOutput.d.ts +4 -0
  102. package/dist/cli/runOutput.js +33 -7
  103. package/dist/cli/runStageCommand.d.ts +1 -0
  104. package/dist/cli/runStageCommand.js +44 -25
  105. package/dist/cli/runsCommand.d.ts +1 -1
  106. package/dist/cli/runsCommand.js +168 -10
  107. package/dist/cli/triggerCommand.d.ts +12 -0
  108. package/dist/cli/triggerCommand.js +183 -0
  109. package/dist/cli/validateCommand.d.ts +1 -1
  110. package/dist/cli/validateCommand.js +23 -6
  111. package/dist/cli.js +202 -32
  112. package/dist/config/browseCatalog.d.ts +1 -0
  113. package/dist/config/browseCatalog.js +5 -4
  114. package/dist/config/builtinSkills.d.ts +4 -0
  115. package/dist/config/builtinSkills.js +23 -0
  116. package/dist/config/catalogRelativePath.d.ts +63 -0
  117. package/dist/config/catalogRelativePath.js +126 -0
  118. package/dist/config/configOrigin.d.ts +27 -0
  119. package/dist/config/configOrigin.js +59 -0
  120. package/dist/config/createTrigger.d.ts +27 -0
  121. package/dist/config/createTrigger.js +232 -0
  122. package/dist/config/draftPackage.d.ts +117 -0
  123. package/dist/config/draftPackage.js +550 -0
  124. package/dist/config/ensureCatalogScanRoot.d.ts +16 -0
  125. package/dist/config/ensureCatalogScanRoot.js +73 -0
  126. package/dist/config/hostConfig.d.ts +57 -0
  127. package/dist/config/hostConfig.js +360 -0
  128. package/dist/config/listSkills.d.ts +26 -0
  129. package/dist/config/listSkills.js +206 -5
  130. package/dist/config/loadOutcome.d.ts +7 -1
  131. package/dist/config/loadPipeline.js +39 -2
  132. package/dist/config/loadStage.js +25 -0
  133. package/dist/config/loadStageflowManifest.js +25 -0
  134. package/dist/config/loadTask.d.ts +2 -0
  135. package/dist/config/loadTask.js +57 -18
  136. package/dist/config/loadTrigger.d.ts +9 -0
  137. package/dist/config/loadTrigger.js +120 -0
  138. package/dist/config/materializeStageModels.js +5 -1
  139. package/dist/config/mergePipelineIncludes.d.ts +3 -0
  140. package/dist/config/mergePipelineIncludes.js +19 -0
  141. package/dist/config/migrateYaml.js +6 -11
  142. package/dist/config/multiProjectCatalog.d.ts +32 -0
  143. package/dist/config/multiProjectCatalog.js +150 -0
  144. package/dist/config/normalizePipelineStageEntry.js +27 -1
  145. package/dist/config/parseCompletionContract.js +6 -0
  146. package/dist/config/pipelineStageKeys.js +3 -0
  147. package/dist/config/publishDraftPackage.d.ts +7 -0
  148. package/dist/config/publishDraftPackage.js +25 -0
  149. package/dist/config/resolveCatalogContext.js +1 -1
  150. package/dist/config/resolveCatalogRoots.d.ts +27 -0
  151. package/dist/config/resolveCatalogRoots.js +76 -0
  152. package/dist/config/resolveModel.d.ts +7 -1
  153. package/dist/config/resolveModel.js +11 -1
  154. package/dist/config/resolvePipelineDag.js +1 -1
  155. package/dist/config/resolveStageMcpServers.d.ts +9 -1
  156. package/dist/config/resolveStageMcpServers.js +36 -9
  157. package/dist/config/scanCatalogPaths.d.ts +1 -1
  158. package/dist/config/scanCatalogPaths.js +6 -2
  159. package/dist/config/secretFromEnvOrFile.d.ts +9 -0
  160. package/dist/config/secretFromEnvOrFile.js +34 -0
  161. package/dist/config/seededCatalog.d.ts +11 -0
  162. package/dist/config/seededCatalog.js +29 -0
  163. package/dist/config/stageBrowser.d.ts +12 -0
  164. package/dist/config/stageBrowser.js +118 -0
  165. package/dist/config/toolRequires.d.ts +24 -0
  166. package/dist/config/toolRequires.js +115 -0
  167. package/dist/config/triggerCatalog.d.ts +10 -0
  168. package/dist/config/triggerCatalog.js +37 -0
  169. package/dist/config/validateCatalog.d.ts +17 -3
  170. package/dist/config/validateCatalog.js +223 -3
  171. package/dist/config/validateCompletionContract.js +8 -0
  172. package/dist/diagnostics/checks.d.ts +39 -0
  173. package/dist/diagnostics/checks.js +135 -0
  174. package/dist/envelope/preEmitChecks.d.ts +1 -1
  175. package/dist/envelope/preEmitChecks.js +8 -0
  176. package/dist/errors/codes.d.ts +14 -0
  177. package/dist/errors/codes.js +59 -0
  178. package/dist/git/cache.d.ts +14 -0
  179. package/dist/git/cache.js +150 -0
  180. package/dist/git/credentials.d.ts +9 -0
  181. package/dist/git/credentials.js +88 -0
  182. package/dist/git/errors.d.ts +20 -0
  183. package/dist/git/errors.js +94 -0
  184. package/dist/git/exec.d.ts +16 -0
  185. package/dist/git/exec.js +135 -0
  186. package/dist/git/operations.d.ts +29 -0
  187. package/dist/git/operations.js +153 -0
  188. package/dist/git/version.d.ts +1 -0
  189. package/dist/git/version.js +10 -0
  190. package/dist/logging/audit.d.ts +16 -0
  191. package/dist/logging/audit.js +19 -0
  192. package/dist/logging/commonWords.d.ts +2 -0
  193. package/dist/logging/commonWords.js +13 -0
  194. package/dist/logging/logger.d.ts +49 -0
  195. package/dist/logging/logger.js +193 -0
  196. package/dist/logging/namedSecrets.d.ts +6 -0
  197. package/dist/logging/namedSecrets.js +58 -0
  198. package/dist/logging/redact.d.ts +17 -0
  199. package/dist/logging/redact.js +105 -0
  200. package/dist/mcp/catalogTools.js +492 -81
  201. package/dist/mcp/checkoutTools.d.ts +52 -0
  202. package/dist/mcp/checkoutTools.js +332 -0
  203. package/dist/mcp/controlTools.js +182 -6
  204. package/dist/mcp/deps.d.ts +3 -0
  205. package/dist/mcp/getStartedTool.d.ts +3 -0
  206. package/dist/mcp/getStartedTool.js +62 -0
  207. package/dist/mcp/readArtifact.d.ts +11 -0
  208. package/dist/mcp/readArtifact.js +46 -30
  209. package/dist/mcp/server.js +2 -0
  210. package/dist/mcp/tools.js +6 -0
  211. package/dist/mcp/triggerTools.d.ts +3 -0
  212. package/dist/mcp/triggerTools.js +176 -0
  213. package/dist/net/proxy.d.ts +14 -0
  214. package/dist/net/proxy.js +78 -0
  215. package/dist/operatorAgent/docsRetrieval.d.ts +40 -0
  216. package/dist/operatorAgent/docsRetrieval.js +269 -0
  217. package/dist/operatorAgent/draftContext.d.ts +16 -0
  218. package/dist/operatorAgent/draftContext.js +68 -0
  219. package/dist/operatorAgent/fakeHost.d.ts +39 -0
  220. package/dist/operatorAgent/fakeHost.js +92 -0
  221. package/dist/operatorAgent/host.d.ts +40 -0
  222. package/dist/operatorAgent/host.js +179 -0
  223. package/dist/operatorAgent/index.d.ts +9 -0
  224. package/dist/operatorAgent/index.js +8 -0
  225. package/dist/operatorAgent/piModel.d.ts +80 -0
  226. package/dist/operatorAgent/piModel.js +528 -0
  227. package/dist/operatorAgent/profiles/workshopAuthor.d.ts +23 -0
  228. package/dist/operatorAgent/profiles/workshopAuthor.js +338 -0
  229. package/dist/operatorAgent/profiles/workshopAuthorPlaybook.d.ts +6 -0
  230. package/dist/operatorAgent/profiles/workshopAuthorPlaybook.js +103 -0
  231. package/dist/operatorAgent/profiles/workshopAuthorTools.d.ts +57 -0
  232. package/dist/operatorAgent/profiles/workshopAuthorTools.js +623 -0
  233. package/dist/operatorAgent/proposals.d.ts +32 -0
  234. package/dist/operatorAgent/proposals.js +144 -0
  235. package/dist/operatorAgent/types.d.ts +128 -0
  236. package/dist/operatorAgent/types.js +1 -0
  237. package/dist/package-meta.d.ts +2 -1
  238. package/dist/package-meta.js +2 -1
  239. package/dist/preflight/bash.d.ts +8 -0
  240. package/dist/preflight/bash.js +34 -0
  241. package/dist/preflight/claudeRoot.d.ts +11 -0
  242. package/dist/preflight/claudeRoot.js +23 -0
  243. package/dist/preflight/mcpCommands.d.ts +8 -0
  244. package/dist/preflight/mcpCommands.js +36 -0
  245. package/dist/preflight/pipelinePreflight.d.ts +40 -0
  246. package/dist/preflight/pipelinePreflight.js +192 -0
  247. package/dist/preflight/tls.d.ts +6 -0
  248. package/dist/preflight/tls.js +18 -0
  249. package/dist/preflight/toolchain.d.ts +45 -0
  250. package/dist/preflight/toolchain.js +219 -0
  251. package/dist/project/findManifestRoot.d.ts +3 -0
  252. package/dist/project/findManifestRoot.js +35 -0
  253. package/dist/project/findProjectRoot.js +3 -4
  254. package/dist/project/globalHome.d.ts +7 -0
  255. package/dist/project/globalHome.js +63 -2
  256. package/dist/project/resolveProjectContext.js +2 -2
  257. package/dist/project/resolveStageflowContext.d.ts +7 -0
  258. package/dist/project/resolveStageflowContext.js +46 -30
  259. package/dist/projection/projectRun.d.ts +2 -1
  260. package/dist/projection/projectRun.js +1 -0
  261. package/dist/runstore/assertTmpdir.d.ts +1 -0
  262. package/dist/runstore/assertTmpdir.js +25 -0
  263. package/dist/runstore/backup.d.ts +52 -0
  264. package/dist/runstore/backup.js +292 -0
  265. package/dist/runstore/createStore.d.ts +18 -1
  266. package/dist/runstore/createStore.js +64 -5
  267. package/dist/runstore/debugBundle.d.ts +60 -0
  268. package/dist/runstore/debugBundle.js +143 -0
  269. package/dist/runstore/diskUsage.d.ts +50 -0
  270. package/dist/runstore/diskUsage.js +214 -0
  271. package/dist/runstore/exportRunPayload.d.ts +8 -0
  272. package/dist/runstore/exportRunPayload.js +23 -0
  273. package/dist/runstore/normalizeCatalogPath.d.ts +1 -0
  274. package/dist/runstore/normalizeCatalogPath.js +10 -0
  275. package/dist/runstore/paths.d.ts +5 -0
  276. package/dist/runstore/paths.js +145 -1
  277. package/dist/runstore/port.d.ts +139 -13
  278. package/dist/runstore/port.js +8 -1
  279. package/dist/runstore/restore.d.ts +81 -0
  280. package/dist/runstore/restore.js +355 -0
  281. package/dist/runstore/retention.d.ts +27 -0
  282. package/dist/runstore/retention.js +74 -0
  283. package/dist/runstore/runManifest.d.ts +146 -0
  284. package/dist/runstore/runManifest.js +288 -0
  285. package/dist/runstore/runProjection.d.ts +3 -1
  286. package/dist/runstore/runProjection.js +63 -1
  287. package/dist/runstore/sqlite/SqliteRunStore.d.ts +35 -3
  288. package/dist/runstore/sqlite/SqliteRunStore.js +442 -219
  289. package/dist/runstore/sqlite/applyStorePragmas.d.ts +39 -0
  290. package/dist/runstore/sqlite/applyStorePragmas.js +145 -0
  291. package/dist/runstore/sqlite/migrations/001-baseline.d.ts +7 -0
  292. package/dist/runstore/sqlite/migrations/001-baseline.js +10 -0
  293. package/dist/runstore/sqlite/migrations/002-repository-binding.d.ts +7 -0
  294. package/dist/runstore/sqlite/migrations/002-repository-binding.js +29 -0
  295. package/dist/runstore/sqlite/migrations/003-run-lifecycle.d.ts +7 -0
  296. package/dist/runstore/sqlite/migrations/003-run-lifecycle.js +28 -0
  297. package/dist/runstore/sqlite/migrations/004-auto-resume-count.d.ts +7 -0
  298. package/dist/runstore/sqlite/migrations/004-auto-resume-count.js +19 -0
  299. package/dist/runstore/sqlite/migrations/005-config-origins.d.ts +7 -0
  300. package/dist/runstore/sqlite/migrations/005-config-origins.js +19 -0
  301. package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.d.ts +7 -0
  302. package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.js +28 -0
  303. package/dist/runstore/sqlite/migrations/007-projects-registry.d.ts +7 -0
  304. package/dist/runstore/sqlite/migrations/007-projects-registry.js +31 -0
  305. package/dist/runstore/sqlite/migrations/008-triggers-table.d.ts +7 -0
  306. package/dist/runstore/sqlite/migrations/008-triggers-table.js +19 -0
  307. package/dist/runstore/sqlite/migrations/009-trigger-next-run.d.ts +7 -0
  308. package/dist/runstore/sqlite/migrations/009-trigger-next-run.js +19 -0
  309. package/dist/runstore/sqlite/migrations/010-trigger-adapter-state.d.ts +7 -0
  310. package/dist/runstore/sqlite/migrations/010-trigger-adapter-state.js +17 -0
  311. package/dist/runstore/sqlite/migrations/index.d.ts +21 -0
  312. package/dist/runstore/sqlite/migrations/index.js +78 -0
  313. package/dist/runstore/sqlite/schema.d.ts +20 -1
  314. package/dist/runstore/sqlite/schema.js +277 -1
  315. package/dist/runstore/sqlite/storeOpenError.d.ts +6 -0
  316. package/dist/runstore/sqlite/storeOpenError.js +11 -0
  317. package/dist/runstore/sqlite/storeSchemaError.d.ts +5 -0
  318. package/dist/runstore/sqlite/storeSchemaError.js +8 -0
  319. package/dist/runstore/stageExecution.js +3 -0
  320. package/dist/runstore/storeFilesystem.d.ts +32 -0
  321. package/dist/runstore/storeFilesystem.js +148 -0
  322. package/dist/runstore/trackProjection.js +2 -0
  323. package/dist/runstore/workspaceLayout.d.ts +13 -0
  324. package/dist/runstore/workspaceLayout.js +76 -0
  325. package/dist/runtime/answerResume.d.ts +1 -0
  326. package/dist/runtime/answerResume.js +3 -1
  327. package/dist/runtime/completionCheckRunner.d.ts +15 -1
  328. package/dist/runtime/completionCheckRunner.js +67 -7
  329. package/dist/runtime/containerLimits.d.ts +16 -0
  330. package/dist/runtime/containerLimits.js +84 -0
  331. package/dist/runtime/credentialBinding.d.ts +2 -0
  332. package/dist/runtime/credentialBinding.js +3 -0
  333. package/dist/runtime/credentialMaterialisation.d.ts +28 -0
  334. package/dist/runtime/credentialMaterialisation.js +128 -0
  335. package/dist/runtime/emailSource.d.ts +72 -0
  336. package/dist/runtime/emailSource.js +304 -0
  337. package/dist/runtime/gitCheckoutCapability.js +7 -13
  338. package/dist/runtime/githubPollSource.d.ts +86 -0
  339. package/dist/runtime/githubPollSource.js +284 -0
  340. package/dist/runtime/pipelineRunner.d.ts +40 -1
  341. package/dist/runtime/pipelineRunner.js +181 -17
  342. package/dist/runtime/pipelineScheduler.d.ts +17 -0
  343. package/dist/runtime/pipelineScheduler.js +220 -28
  344. package/dist/runtime/reloadRunCatalog.js +6 -1
  345. package/dist/runtime/repositoryMaterialize.d.ts +47 -0
  346. package/dist/runtime/repositoryMaterialize.js +235 -0
  347. package/dist/runtime/resumeTimedOut.d.ts +1 -1
  348. package/dist/runtime/resumeTimedOut.js +5 -2
  349. package/dist/runtime/runChangeBus.js +9 -0
  350. package/dist/runtime/runDeletion.d.ts +7 -0
  351. package/dist/runtime/runDeletion.js +37 -0
  352. package/dist/runtime/runManager.d.ts +169 -4
  353. package/dist/runtime/runManager.js +1748 -83
  354. package/dist/runtime/runRetentionSweep.d.ts +31 -0
  355. package/dist/runtime/runRetentionSweep.js +328 -0
  356. package/dist/runtime/runRetryCoordinator.d.ts +4 -0
  357. package/dist/runtime/runRetryCoordinator.js +20 -2
  358. package/dist/runtime/runSkills.d.ts +40 -0
  359. package/dist/runtime/runSkills.js +173 -0
  360. package/dist/runtime/scheduleSource.d.ts +38 -0
  361. package/dist/runtime/scheduleSource.js +119 -0
  362. package/dist/runtime/settingsFile.d.ts +5 -0
  363. package/dist/runtime/settingsFile.js +61 -54
  364. package/dist/runtime/stageAttemptBootstrap.d.ts +5 -1
  365. package/dist/runtime/stageAttemptBootstrap.js +250 -27
  366. package/dist/runtime/stageCacheEnv.d.ts +6 -0
  367. package/dist/runtime/stageCacheEnv.js +34 -0
  368. package/dist/runtime/stageConcurrency.d.ts +2 -1
  369. package/dist/runtime/stageConcurrency.js +4 -2
  370. package/dist/runtime/stageEnvironment.d.ts +38 -0
  371. package/dist/runtime/stageEnvironment.js +194 -0
  372. package/dist/runtime/stageHitl.d.ts +1 -0
  373. package/dist/runtime/stageHitl.js +5 -1
  374. package/dist/runtime/stageProcessLauncher.d.ts +20 -0
  375. package/dist/runtime/stageProcessLauncher.js +236 -41
  376. package/dist/runtime/stageRecovery.d.ts +3 -1
  377. package/dist/runtime/stageRecovery.js +19 -4
  378. package/dist/runtime/stageRoots.d.ts +38 -1
  379. package/dist/runtime/stageRoots.js +118 -0
  380. package/dist/runtime/stageRunner.d.ts +6 -0
  381. package/dist/runtime/stageRunner.js +32 -6
  382. package/dist/runtime/stageSecretDecl.d.ts +9 -0
  383. package/dist/runtime/stageSecretDecl.js +102 -0
  384. package/dist/runtime/stageSecrets.d.ts +40 -0
  385. package/dist/runtime/stageSecrets.js +181 -0
  386. package/dist/runtime/stageStreamLog.d.ts +1 -0
  387. package/dist/runtime/stageStreamLog.js +2 -1
  388. package/dist/runtime/stageWorker.d.ts +3 -2
  389. package/dist/runtime/stageWorker.js +58 -10
  390. package/dist/runtime/stageWorkerProtocol.d.ts +5 -0
  391. package/dist/runtime/stageWorkerProtocol.js +8 -0
  392. package/dist/runtime/startPayload.d.ts +32 -0
  393. package/dist/runtime/startPayload.js +59 -0
  394. package/dist/runtime/taskInput.js +14 -5
  395. package/dist/runtime/triggerCatalog.d.ts +6 -0
  396. package/dist/runtime/triggerCatalog.js +24 -0
  397. package/dist/runtime/triggerEventMatch.d.ts +2 -0
  398. package/dist/runtime/triggerEventMatch.js +6 -0
  399. package/dist/runtime/triggerPort.d.ts +14 -0
  400. package/dist/runtime/triggerPort.js +1 -0
  401. package/dist/runtime/triggerRunner.d.ts +17 -0
  402. package/dist/runtime/triggerRunner.js +89 -0
  403. package/dist/runtime/verifiedStageExecution.d.ts +8 -0
  404. package/dist/runtime/verifiedStageExecution.js +16 -1
  405. package/dist/runtime/webhookSignature.d.ts +1 -0
  406. package/dist/runtime/webhookSignature.js +12 -0
  407. package/dist/runtime/workspaceBinding.d.ts +20 -0
  408. package/dist/runtime/workspaceBinding.js +60 -0
  409. package/dist/server/allowedHosts.d.ts +19 -0
  410. package/dist/server/allowedHosts.js +179 -0
  411. package/dist/server/bootstrap.d.ts +42 -2
  412. package/dist/server/bootstrap.js +273 -5
  413. package/dist/server/controlToken.d.ts +47 -0
  414. package/dist/server/controlToken.js +254 -0
  415. package/dist/server/createHttpHost.d.ts +11 -2
  416. package/dist/server/createHttpHost.js +106 -10
  417. package/dist/server/ensureGlobalService.d.ts +5 -1
  418. package/dist/server/ensureGlobalService.js +35 -1
  419. package/dist/server/healthSurfaces.d.ts +6 -0
  420. package/dist/server/healthSurfaces.js +123 -0
  421. package/dist/server/http.d.ts +27 -1
  422. package/dist/server/http.js +2254 -477
  423. package/dist/server/listenHost.d.ts +5 -0
  424. package/dist/server/listenHost.js +56 -0
  425. package/dist/server/mcpHost.d.ts +10 -1
  426. package/dist/server/mcpHost.js +36 -6
  427. package/dist/server/operatorResults.d.ts +2 -2
  428. package/dist/server/operatorResults.js +40 -29
  429. package/dist/server/requestAuthContext.d.ts +12 -0
  430. package/dist/server/requestAuthContext.js +21 -0
  431. package/dist/server/shutdown.d.ts +69 -0
  432. package/dist/server/shutdown.js +219 -0
  433. package/dist/server/triggerRoutes.d.ts +15 -0
  434. package/dist/server/triggerRoutes.js +268 -0
  435. package/dist/tools/askOperator.d.ts +3 -2
  436. package/dist/types/completion.d.ts +3 -0
  437. package/dist/types/pipeline.d.ts +10 -1
  438. package/dist/types/preEmitCheck.d.ts +7 -0
  439. package/dist/types/stage.d.ts +22 -0
  440. package/dist/types/stageflowManifest.d.ts +3 -0
  441. package/dist/types/task.d.ts +8 -0
  442. package/dist/types/trigger.d.ts +18 -0
  443. package/dist/types/trigger.js +1 -0
  444. package/dist/ui/assets/{index-CSsDued1.css → index-Bv4p1aPK.css} +1 -1
  445. package/dist/ui/assets/index-CntB4bZR.js +133 -0
  446. package/dist/ui/index.html +2 -2
  447. package/dist/workshop/autosave.d.ts +58 -0
  448. package/dist/workshop/autosave.js +222 -0
  449. package/dist/workshop/buildStore.d.ts +79 -0
  450. package/dist/workshop/buildStore.js +326 -0
  451. package/dist/workshop/chatTurn.d.ts +232 -0
  452. package/dist/workshop/chatTurn.js +475 -0
  453. package/dist/workshop/modelSettings.d.ts +18 -0
  454. package/dist/workshop/modelSettings.js +44 -0
  455. package/dist/workshop/sessionStore.d.ts +61 -0
  456. package/dist/workshop/sessionStore.js +254 -0
  457. package/dist/workshop/workshopPin.d.ts +72 -0
  458. package/dist/workshop/workshopPin.js +193 -0
  459. package/examples/README.md +99 -0
  460. package/examples/archify-on-pr/README.md +213 -0
  461. package/examples/archify-on-pr/archify-on-pr.pipeline.yaml +19 -0
  462. package/examples/archify-on-pr/archify-on-pr.task.yaml +19 -0
  463. package/examples/archify-on-pr/author-diagrams.yaml +106 -0
  464. package/examples/archify-on-pr/detect-changes.yaml +89 -0
  465. package/examples/browser-session/README.md +77 -0
  466. package/examples/browser-session/browser-session.pipeline.yaml +50 -0
  467. package/examples/browser-session/browser-session.task.yaml +6 -0
  468. package/examples/browser-session/check-login.yaml +22 -0
  469. package/examples/browser-session/fixture-server.mjs +64 -0
  470. package/examples/browser-session/human-login.yaml +31 -0
  471. package/examples/browser-session/merge.yaml +36 -0
  472. package/examples/browser-session/work-a.yaml +41 -0
  473. package/examples/browser-session/work-b.yaml +41 -0
  474. package/examples/ci-validate/README.md +35 -0
  475. package/examples/ci-validate/check.yaml +13 -0
  476. package/examples/ci-validate/ci-demo.pipeline.yaml +4 -0
  477. package/examples/ci-validate/validate.sh +5 -0
  478. package/examples/compliance-review-demo/README.md +125 -0
  479. package/examples/compliance-review-demo/compliance-review-demo.pipeline.yaml +29 -0
  480. package/examples/compliance-review-demo/connect-account.yaml +47 -0
  481. package/examples/compliance-review-demo/map-to-control.yaml +123 -0
  482. package/examples/compliance-review-demo/poll-bucket-config.yaml +103 -0
  483. package/examples/compliance-review-demo/publish-report.yaml +79 -0
  484. package/examples/compliance-review-demo/review-verdict.yaml +122 -0
  485. package/examples/compliance-review-demo/run-compliance-check.yaml +96 -0
  486. package/examples/compliance-review-demo/store-evidence.yaml +143 -0
  487. package/examples/conditional-fork/README.md +89 -0
  488. package/examples/conditional-fork/branch-a.yaml +13 -0
  489. package/examples/conditional-fork/branch-b.yaml +13 -0
  490. package/examples/conditional-fork/decide.yaml +35 -0
  491. package/examples/conditional-fork/fork-demo.pipeline.yaml +20 -0
  492. package/examples/conditional-fork/fork-demo.task.yaml +8 -0
  493. package/examples/context7-mcp/README.md +42 -0
  494. package/examples/context7-mcp/context7-mcp.pipeline.yaml +15 -0
  495. package/examples/context7-mcp/context7-mcp.task.yaml +4 -0
  496. package/examples/context7-mcp/fetch-docs.yaml +52 -0
  497. package/examples/context7-mcp/resolve-library.yaml +31 -0
  498. package/examples/context7-mcp/write-brief.yaml +52 -0
  499. package/examples/feature-loop/README.md +104 -0
  500. package/examples/feature-loop/address-feedback.yaml +148 -0
  501. package/examples/feature-loop/align.yaml +116 -0
  502. package/examples/feature-loop/decompose.yaml +86 -0
  503. package/examples/feature-loop/default-model-hierarchy.task.yaml +58 -0
  504. package/examples/feature-loop/feature-loop.pipeline.yaml +140 -0
  505. package/examples/feature-loop/feature-loop.task.yaml +25 -0
  506. package/examples/feature-loop/implement.yaml +128 -0
  507. package/examples/feature-loop/plan.yaml +111 -0
  508. package/examples/feature-loop/publish.yaml +167 -0
  509. package/examples/feature-loop/review.yaml +146 -0
  510. package/examples/feature-loop/verify.yaml +106 -0
  511. package/examples/feedback-loop/README.md +72 -0
  512. package/examples/feedback-loop/VERIFY.md +208 -0
  513. package/examples/feedback-loop/continue-only.task.yaml +4 -0
  514. package/examples/feedback-loop/exhaust-require-continue.task.yaml +6 -0
  515. package/examples/feedback-loop/exhaust-wait-human.task.yaml +11 -0
  516. package/examples/feedback-loop/feedback-loop-wait-human.pipeline.yaml +23 -0
  517. package/examples/feedback-loop/feedback-loop.pipeline.yaml +23 -0
  518. package/examples/feedback-loop/feedback-loop.task.yaml +4 -0
  519. package/examples/feedback-loop/implement.yaml +14 -0
  520. package/examples/feedback-loop/plan.yaml +14 -0
  521. package/examples/feedback-loop/review.yaml +15 -0
  522. package/examples/feedback-loop/send-back-once.task.yaml +6 -0
  523. package/examples/feedback-loop/submit.yaml +12 -0
  524. package/examples/generic-fan-in/README.md +151 -0
  525. package/examples/generic-fan-in/clarify.yaml +18 -0
  526. package/examples/generic-fan-in/generic-fan-in-accepted.pipeline.yaml +19 -0
  527. package/examples/generic-fan-in/generic-fan-in-accepted.task.yaml +8 -0
  528. package/examples/generic-fan-in/generic-fan-in.pipeline.yaml +18 -0
  529. package/examples/generic-fan-in/generic-fan-in.task.yaml +9 -0
  530. package/examples/generic-fan-in/research.yaml +45 -0
  531. package/examples/generic-fan-in/synthesize.yaml +66 -0
  532. package/examples/generic-fan-in/validation.yaml +45 -0
  533. package/examples/github-release/README.md +78 -0
  534. package/examples/github-release/draft-release-notes.yaml +64 -0
  535. package/examples/github-release/github-release.pipeline.yaml +11 -0
  536. package/examples/github-release/github-release.task.yaml +13 -0
  537. package/examples/github-release/publish-github-release.yaml +64 -0
  538. package/examples/hello-world/README.md +28 -0
  539. package/examples/hello-world/hello.pipeline.yaml +4 -0
  540. package/examples/hello-world/my-task.task.yaml +6 -0
  541. package/examples/hello-world/research.yaml +18 -0
  542. package/examples/mcp-hitl-tour/README.md +113 -0
  543. package/examples/mcp-hitl-tour/draft-angle.yaml +33 -0
  544. package/examples/mcp-hitl-tour/draft-short.yaml +32 -0
  545. package/examples/mcp-hitl-tour/emit-angles.yaml +45 -0
  546. package/examples/mcp-hitl-tour/gather.yaml +31 -0
  547. package/examples/mcp-hitl-tour/intake.yaml +62 -0
  548. package/examples/mcp-hitl-tour/mcp-hitl-tour-exhaust.task.yaml +13 -0
  549. package/examples/mcp-hitl-tour/mcp-hitl-tour.pipeline.yaml +54 -0
  550. package/examples/mcp-hitl-tour/mcp-hitl-tour.task.yaml +16 -0
  551. package/examples/mcp-hitl-tour/polish.yaml +33 -0
  552. package/examples/mcp-hitl-tour/review.yaml +17 -0
  553. package/examples/mcp-hitl-tour/ship.yaml +25 -0
  554. package/examples/oss-issue-contribution/README.md +218 -0
  555. package/examples/oss-issue-contribution/oss-address-review-feedback.yaml +117 -0
  556. package/examples/oss-issue-contribution/oss-approve-contribution.yaml +181 -0
  557. package/examples/oss-issue-contribution/oss-approve-plan.yaml +111 -0
  558. package/examples/oss-issue-contribution/oss-explain-fix.yaml +108 -0
  559. package/examples/oss-issue-contribution/oss-explain-issue.yaml +114 -0
  560. package/examples/oss-issue-contribution/oss-implement-source-fix.yaml +171 -0
  561. package/examples/oss-issue-contribution/oss-investigate-area.yaml +116 -0
  562. package/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml +125 -0
  563. package/examples/oss-issue-contribution/oss-issue-intake.yaml +106 -0
  564. package/examples/oss-issue-contribution/oss-plan-investigation.yaml +112 -0
  565. package/examples/oss-issue-contribution/oss-plan-review.yaml +109 -0
  566. package/examples/oss-issue-contribution/oss-reproduce-issue.yaml +140 -0
  567. package/examples/oss-issue-contribution/oss-review-change.yaml +107 -0
  568. package/examples/oss-issue-contribution/oss-verify-fix.yaml +130 -0
  569. package/examples/oss-issue-contribution/oss-write-regression-test.yaml +135 -0
  570. package/examples/oss-issue-contribution/pi-7629.task.yaml +79 -0
  571. package/examples/oss-issue-contribution/pi-8919.task.yaml +75 -0
  572. package/examples/oss-issue-contribution/pydantic-ai-7971.task.yaml +53 -0
  573. package/examples/oss-quick-fix/README.md +65 -0
  574. package/examples/oss-quick-fix/implement-fix.yaml +84 -0
  575. package/examples/oss-quick-fix/oss-quick-fix.pipeline.yaml +35 -0
  576. package/examples/oss-quick-fix/oss-quick-fix.task.yaml +19 -0
  577. package/examples/oss-quick-fix/ship-fix.yaml +81 -0
  578. package/examples/oss-quick-fix/understand-issue.yaml +67 -0
  579. package/examples/oss-quick-fix/verify-fix.yaml +73 -0
  580. package/examples/plan-review/README.md +37 -0
  581. package/examples/plan-review/plan-review-followup.yaml +13 -0
  582. package/examples/plan-review/plan-review.pipeline.yaml +9 -0
  583. package/examples/plan-review/plan-review.task.yaml +9 -0
  584. package/examples/plan-review/plan-review.yaml +25 -0
  585. package/examples/playwright-mcp/README.md +39 -0
  586. package/examples/playwright-mcp/playwright-mcp.pipeline.yaml +5 -0
  587. package/examples/playwright-mcp/playwright-mcp.task.yaml +4 -0
  588. package/examples/playwright-mcp/screenshot.yaml +40 -0
  589. package/examples/retry-tour/README.md +75 -0
  590. package/examples/retry-tour/retry-tour.pipeline.yaml +122 -0
  591. package/examples/retry-tour/retry-tour.task.yaml +9 -0
  592. package/examples/route-if-tour/README.md +202 -0
  593. package/examples/route-if-tour/route-if-tour.pipeline.yaml +950 -0
  594. package/examples/route-if-tour/route-if-tour.task.yaml +4 -0
  595. package/examples/route-wiring-smoke-test/01-core-routing.pipeline.yaml +168 -0
  596. package/examples/route-wiring-smoke-test/02-on-gating.pipeline.yaml +44 -0
  597. package/examples/route-wiring-smoke-test/03-two-entry-points.pipeline.yaml +28 -0
  598. package/examples/route-wiring-smoke-test/04-entry-false-equivalent-to-omitted.pipeline.yaml +27 -0
  599. package/examples/route-wiring-smoke-test/05-fork-choice.pipeline.yaml +110 -0
  600. package/examples/route-wiring-smoke-test/06-fan-out-fan-in.pipeline.yaml +82 -0
  601. package/examples/route-wiring-smoke-test/07-loop-human-decision.pipeline.yaml +82 -0
  602. package/examples/route-wiring-smoke-test/08-skip-fallback-and-multi-on-gate.pipeline.yaml +77 -0
  603. package/examples/route-wiring-smoke-test/09-multi-loop-targets.pipeline.yaml +102 -0
  604. package/examples/route-wiring-smoke-test/10-uses-dialect-fork.pipeline.yaml +23 -0
  605. package/examples/route-wiring-smoke-test/11-sequential-io-handoff.pipeline.yaml +37 -0
  606. package/examples/route-wiring-smoke-test/12-complex-io-schemas.pipeline.yaml +138 -0
  607. package/examples/route-wiring-smoke-test/13-ref-io-handoff.pipeline.yaml +84 -0
  608. package/examples/route-wiring-smoke-test/14-if-eq-gating.pipeline.yaml +50 -0
  609. package/examples/route-wiring-smoke-test/15-if-all-gated.pipeline.yaml +37 -0
  610. package/examples/route-wiring-smoke-test/16-if-composition.pipeline.yaml +65 -0
  611. package/examples/route-wiring-smoke-test/17-if-join.pipeline.yaml +80 -0
  612. package/examples/route-wiring-smoke-test/README.md +377 -0
  613. package/examples/route-wiring-smoke-test/rejected/01-reject-legacy-needs.pipeline.yaml +26 -0
  614. package/examples/route-wiring-smoke-test/rejected/02-reject-legacy-fork.pipeline.yaml +25 -0
  615. package/examples/route-wiring-smoke-test/rejected/03-reject-legacy-feedback-loop.pipeline.yaml +30 -0
  616. package/examples/route-wiring-smoke-test/rejected/04-reject-missing-entry.pipeline.yaml +24 -0
  617. package/examples/route-wiring-smoke-test/rejected/05-reject-unreachable.pipeline.yaml +35 -0
  618. package/examples/route-wiring-smoke-test/rejected/06-reject-allow-none-without-route-select.pipeline.yaml +37 -0
  619. package/examples/route-wiring-smoke-test/rejected/07-reject-cycle.pipeline.yaml +27 -0
  620. package/examples/route-wiring-smoke-test/rejected/08-reject-loop-non-ancestor.pipeline.yaml +42 -0
  621. package/examples/route-wiring-smoke-test/rejected/09-reject-route-select-leaf.pipeline.yaml +26 -0
  622. package/examples/route-wiring-smoke-test/rejected/12-reject-loop-replay-unsafe.pipeline.yaml +55 -0
  623. package/examples/route-wiring-smoke-test/rejected/13-reject-multiple-loop-entries.pipeline.yaml +51 -0
  624. package/examples/route-wiring-smoke-test/rejected/14-reject-duplicate-stage-id.pipeline.yaml +35 -0
  625. package/examples/route-wiring-smoke-test/rejected/15-reject-unknown-route-target.pipeline.yaml +15 -0
  626. package/examples/route-wiring-smoke-test/rejected/16-reject-malformed-route-item.pipeline.yaml +15 -0
  627. package/examples/route-wiring-smoke-test/rejected/17-reject-io-incompatible.pipeline.yaml +33 -0
  628. package/examples/route-wiring-smoke-test/rejected/18-reject-nested-io.pipeline.yaml +51 -0
  629. package/examples/route-wiring-smoke-test/rejected/19-reject-array-item-io.pipeline.yaml +55 -0
  630. package/examples/route-wiring-smoke-test/rejected/20-reject-closed-io.pipeline.yaml +36 -0
  631. package/examples/route-wiring-smoke-test/rejected/21-reject-ref-io.pipeline.yaml +42 -0
  632. package/examples/route-wiring-smoke-test/rejected/22-reject-if-unknown-field.pipeline.yaml +33 -0
  633. package/examples/route-wiring-smoke-test/rejected/23-reject-if-optional-field.pipeline.yaml +32 -0
  634. package/examples/route-wiring-smoke-test/rejected/24-reject-if-empty-all.pipeline.yaml +31 -0
  635. package/examples/route-wiring-smoke-test/rejected/25-reject-if-gt-on-string.pipeline.yaml +33 -0
  636. package/examples/route-wiring-smoke-test/rejected/26-reject-if-optional-nested.pipeline.yaml +36 -0
  637. package/examples/route-wiring-smoke-test/rejected/27-reject-if-on-loop.pipeline.yaml +63 -0
  638. package/examples/route-wiring-smoke-test/rejected/29-reject-if-on-failed.pipeline.yaml +46 -0
  639. package/examples/route-wiring-smoke-test/smoke-test.task.yaml +4 -0
  640. package/examples/route-wiring-smoke-test/stages/branch-a.yaml +12 -0
  641. package/examples/route-wiring-smoke-test/stages/branch-b.yaml +12 -0
  642. package/examples/route-wiring-smoke-test/stages/decide.yaml +12 -0
  643. package/examples/route-wiring-smoke-test/stages/finish.yaml +12 -0
  644. package/examples/ship-feature/README.md +190 -0
  645. package/examples/ship-feature/feat-address-feedback.yaml +119 -0
  646. package/examples/ship-feature/feat-implement.yaml +180 -0
  647. package/examples/ship-feature/feat-plan.yaml +120 -0
  648. package/examples/ship-feature/feat-review.yaml +109 -0
  649. package/examples/ship-feature/feat-ship.yaml +203 -0
  650. package/examples/ship-feature/ship-feature.pipeline.yaml +44 -0
  651. package/examples/ship-feature/ship-feature.task.yaml +78 -0
  652. package/examples/stage-mcp/README.md +145 -0
  653. package/examples/stage-mcp/echo-mcp.mjs +20 -0
  654. package/examples/stage-mcp/stage-mcp-dead.pipeline.yaml +5 -0
  655. package/examples/stage-mcp/stage-mcp-dead.task.yaml +3 -0
  656. package/examples/stage-mcp/stage-mcp-missing-var.pipeline.yaml +5 -0
  657. package/examples/stage-mcp/stage-mcp-missing-var.task.yaml +3 -0
  658. package/examples/stage-mcp/stage-mcp.pipeline.yaml +5 -0
  659. package/examples/stage-mcp/stage-mcp.task.yaml +4 -0
  660. package/examples/stage-mcp/use-echo.yaml +20 -0
  661. package/examples/stageflow.yaml +51 -0
  662. package/examples/verify-tour/README.md +80 -0
  663. package/examples/verify-tour/verify-tour.pipeline.yaml +162 -0
  664. package/examples/verify-tour/verify-tour.task.yaml +11 -0
  665. package/package.json +9 -1
  666. package/skills/stageflow/SKILL.md +6 -6
  667. package/skills/stageflow/references/control-surface.md +13 -5
  668. package/skills/stageflow/scripts/detect-host.mjs +14 -1
  669. package/skills/stageflow/scripts/detect-host.test.mjs +29 -1
  670. package/skills/stageflow-author/SKILL.md +4 -3
  671. package/skills/stageflow-author/references/catalog-mapping.md +16 -0
  672. package/skills/stageflow-author/references/catalog-write-conventions.md +1 -1
  673. package/skills/stageflow-author/references/stage-prompt-template.md +4 -4
  674. package/skills/stageflow-run/SKILL.md +22 -12
  675. package/skills/stageflow-run/references/mcp-call.md +9 -1
  676. package/skills/stageflow-run/references/task-and-pipeline-selection.md +19 -6
  677. package/skills/stageflow-run/scripts/mcp-call.mjs +46 -6
  678. package/skills/stageflow-run/scripts/mcp-call.test.mjs +64 -0
  679. package/skills/stageflow-session-capture/references/catalog-authoring.md +2 -0
  680. package/skills/stageflow-setup/SKILL.md +51 -8
  681. package/dist/ui/assets/index-Da5EHU6M.js +0 -119
@@ -4,8 +4,126 @@ import { isCursorModelRef } from "../agent/cursorProvider.js";
4
4
  import { stageDir } from "../runstore/paths.js";
5
5
  import { noAttemptContext } from "./stageAttemptContext.js";
6
6
  import { resolveCredentialBinding } from "./credentialBinding.js";
7
+ export const STAGEFLOW_CHECKOUT = "STAGEFLOW_CHECKOUT";
7
8
  export const STAGEFLOW_RUN_WORKSPACE = "STAGEFLOW_RUN_WORKSPACE";
9
+ export const STAGEFLOW_REPOSITORY = "STAGEFLOW_REPOSITORY";
10
+ export const STAGEFLOW_REF = "STAGEFLOW_REF";
11
+ export const STAGEFLOW_BASE_SHA = "STAGEFLOW_BASE_SHA";
12
+ export const STAGEFLOW_RUN_BRANCH = "STAGEFLOW_RUN_BRANCH";
13
+ export const REPOSITORY_ONLY_STAGEFLOW_VARS = [
14
+ STAGEFLOW_REPOSITORY,
15
+ STAGEFLOW_REF,
16
+ STAGEFLOW_BASE_SHA,
17
+ STAGEFLOW_RUN_BRANCH,
18
+ ];
8
19
  export const PI_CODING_AGENT_DIR_ENV = "PI_CODING_AGENT_DIR";
20
+ function nonEmptyTrimmed(value) {
21
+ if (value === undefined)
22
+ return undefined;
23
+ const trimmed = value.trim();
24
+ return trimmed.length > 0 ? trimmed : undefined;
25
+ }
26
+ export function resolveEffectiveGitIdentity(hostEnv, taskIdentity) {
27
+ const name = nonEmptyTrimmed(taskIdentity?.name) ??
28
+ nonEmptyTrimmed(hostEnv.STAGEFLOW_GIT_AUTHOR_NAME) ??
29
+ "Stageflow";
30
+ const email = nonEmptyTrimmed(taskIdentity?.email) ??
31
+ nonEmptyTrimmed(hostEnv.STAGEFLOW_GIT_AUTHOR_EMAIL) ??
32
+ "stageflow@localhost";
33
+ return { name, email };
34
+ }
35
+ export function buildStageBindingEnv(input) {
36
+ const hostEnv = input.hostEnv ?? {};
37
+ const authorName = input.gitIdentity.name;
38
+ const authorEmail = input.gitIdentity.email;
39
+ const committerName = nonEmptyTrimmed(hostEnv.STAGEFLOW_GIT_COMMITTER_NAME) ?? authorName;
40
+ const committerEmail = nonEmptyTrimmed(hostEnv.STAGEFLOW_GIT_COMMITTER_EMAIL) ?? authorEmail;
41
+ const env = {
42
+ [STAGEFLOW_RUN_WORKSPACE]: input.runWorkspaceDir,
43
+ GIT_AUTHOR_NAME: authorName,
44
+ GIT_AUTHOR_EMAIL: authorEmail,
45
+ GIT_COMMITTER_NAME: committerName,
46
+ GIT_COMMITTER_EMAIL: committerEmail,
47
+ };
48
+ if (input.checkoutRoot !== undefined && input.kind !== "unbound") {
49
+ env[STAGEFLOW_CHECKOUT] = input.checkoutRoot;
50
+ env.GIT_CONFIG_COUNT = "1";
51
+ env.GIT_CONFIG_KEY_0 = "safe.directory";
52
+ env.GIT_CONFIG_VALUE_0 = input.checkoutRoot;
53
+ }
54
+ if (input.kind === "repository") {
55
+ if (input.repository !== undefined) {
56
+ env[STAGEFLOW_REPOSITORY] = input.repository;
57
+ }
58
+ if (input.ref !== undefined) {
59
+ env[STAGEFLOW_REF] = input.ref;
60
+ }
61
+ if (input.resolvedSha !== undefined) {
62
+ env[STAGEFLOW_BASE_SHA] = input.resolvedSha;
63
+ }
64
+ if (input.runBranch !== undefined) {
65
+ env[STAGEFLOW_RUN_BRANCH] = input.runBranch;
66
+ }
67
+ }
68
+ return env;
69
+ }
70
+ export function overlayStageBindingEnv(base, bindingEnv, kind) {
71
+ const out = { ...base, ...bindingEnv };
72
+ if (kind !== "repository") {
73
+ for (const key of REPOSITORY_ONLY_STAGEFLOW_VARS) {
74
+ delete out[key];
75
+ }
76
+ }
77
+ if (kind === "unbound" || !Object.hasOwn(bindingEnv, STAGEFLOW_CHECKOUT)) {
78
+ delete out[STAGEFLOW_CHECKOUT];
79
+ }
80
+ if (!Object.hasOwn(bindingEnv, "GIT_CONFIG_COUNT")) {
81
+ delete out.GIT_CONFIG_COUNT;
82
+ delete out.GIT_CONFIG_KEY_0;
83
+ delete out.GIT_CONFIG_VALUE_0;
84
+ }
85
+ return out;
86
+ }
87
+ export function bindingKindFromMeta(meta) {
88
+ if (meta.repository != null && meta.repository !== "") {
89
+ return "repository";
90
+ }
91
+ if (meta.checkout_root != null && meta.checkout_root !== "") {
92
+ return "checkout";
93
+ }
94
+ return "unbound";
95
+ }
96
+ export function stageBindingEnvFromRun(options) {
97
+ const hostEnv = options.hostEnv ?? process.env;
98
+ const kind = bindingKindFromMeta(options.meta);
99
+ const identity = options.meta.git_author_name !== undefined &&
100
+ options.meta.git_author_email !== undefined
101
+ ? {
102
+ name: options.meta.git_author_name,
103
+ email: options.meta.git_author_email,
104
+ }
105
+ : resolveEffectiveGitIdentity(hostEnv, options.task.git_identity);
106
+ const env = buildStageBindingEnv({
107
+ kind,
108
+ runWorkspaceDir: options.runWorkspaceDir,
109
+ ...(options.meta.checkout_root !== undefined
110
+ ? { checkoutRoot: options.meta.checkout_root }
111
+ : {}),
112
+ ...(options.meta.repository !== undefined
113
+ ? { repository: options.meta.repository }
114
+ : {}),
115
+ ...(options.meta.ref !== undefined ? { ref: options.meta.ref } : {}),
116
+ ...(options.meta.resolved_sha !== undefined
117
+ ? { resolvedSha: options.meta.resolved_sha }
118
+ : {}),
119
+ ...(options.meta.run_branch !== undefined
120
+ ? { runBranch: options.meta.run_branch }
121
+ : {}),
122
+ gitIdentity: identity,
123
+ hostEnv,
124
+ });
125
+ return { kind, env, identity };
126
+ }
9
127
  export function withResolvedAuthPath(roots, factoryCwd) {
10
128
  if (roots.authPath)
11
129
  return roots;
@@ -1,4 +1,6 @@
1
1
  import type { AgentPort, FeedbackLoopContext, StageHandle, StageRunResult, StageSessionMode } from "../agent/port.js";
2
+ import { type HostGateContext } from "../browser/gateHandoff.js";
3
+ import type { StageBrowserSupport } from "../browser/browserHost.js";
2
4
  import type { StageEnvelope } from "../types/envelope.js";
3
5
  import type { LoadedStageConfig } from "../types/stage.js";
4
6
  import type { TaskFile } from "../types/task.js";
@@ -48,6 +50,9 @@ export type RunStageOptions = {
48
50
  sessionMode?: StageSessionMode;
49
51
  feedbackLoopContext?: FeedbackLoopContext;
50
52
  resumeToken?: string;
53
+ stageEnv?: Record<string, string>;
54
+ /** Test seam for the Host login check run by a `browser_login` verify item. */
55
+ browser?: Pick<StageBrowserSupport, "runner" | "loginCheck">;
51
56
  };
52
57
  /**
53
58
  * Yield loop: next() until completed; on wait, coordinator enterWait (KTD6).
@@ -61,5 +66,6 @@ export declare function runStageYieldLoop(options: {
61
66
  store?: RunStore;
62
67
  attemptCtx?: StageAttemptContext;
63
68
  skipGates?: boolean;
69
+ gateContext?: HostGateContext;
64
70
  }): Promise<RunStageYieldLoopResult>;
65
71
  export declare function runStage(options: RunStageOptions): Promise<RunStageOutcome>;
@@ -1,8 +1,11 @@
1
+ import { hostGateContextFor, stampGateRequest, } from "../browser/gateHandoff.js";
1
2
  import { deriveExecutionPatchFromEvent } from "../runstore/stageExecution.js";
2
3
  import { buildStageRoots, withResolvedAuthPath, } from "./stageRoots.js";
3
4
  import { createDefaultHitlQaHooks, recordWaitEnter, } from "./stageHitl.js";
4
5
  import { openStageAttempt, } from "./stageAttemptBootstrap.js";
5
6
  import { createVerifiedStageExecution } from "./verifiedStageExecution.js";
7
+ import { BROWSER_STAGE_PATTERNS, redact } from "../logging/redact.js";
8
+ import { getNamedSecrets } from "../logging/namedSecrets.js";
6
9
  import { isStageTimeoutReason } from "../agent/stageTimeout.js";
7
10
  export function isRunStageWaiting(outcome) {
8
11
  return "waiting" in outcome && outcome.waiting === true;
@@ -44,11 +47,16 @@ async function appendLifecycleEventAndPatchExecution(options) {
44
47
  }
45
48
  }
46
49
  async function finalizeStageResult(options) {
47
- const { store, runId, stageId, result, activityChain, attemptCtx } = options;
50
+ const { store, runId, stageId, result, activityChain, attemptCtx, browser } = options;
48
51
  const attemptOpt = attemptCtx?.eventOptions();
49
52
  await activityChain;
50
53
  if (result.envelope) {
51
- await store.writeEnvelope(runId, stageId, result.envelope, attemptOpt);
54
+ await store.writeEnvelope(runId, stageId, browser
55
+ ? redact(result.envelope, {
56
+ patterns: BROWSER_STAGE_PATTERNS,
57
+ namedSecrets: getNamedSecrets(),
58
+ })
59
+ : result.envelope, attemptOpt);
52
60
  }
53
61
  if (!result.ok) {
54
62
  await appendLifecycleEventAndPatchExecution({
@@ -75,10 +83,11 @@ async function finalizeStageResult(options) {
75
83
  * Yield loop: next() until completed; on wait, coordinator enterWait (KTD6).
76
84
  */
77
85
  export async function runStageYieldLoop(options) {
78
- const { handle, runId, stageId, hitl, workerMode, store, attemptCtx, skipGates } = options;
86
+ const { handle, runId, stageId, hitl, workerMode, store, attemptCtx, skipGates, gateContext } = options;
79
87
  while (true) {
80
88
  const event = await handle.next();
81
89
  if (event.status === "waiting_for_input") {
90
+ const request = stampGateRequest(event.request, gateContext);
82
91
  if (skipGates) {
83
92
  return {
84
93
  ok: false,
@@ -96,7 +105,7 @@ export async function runStageYieldLoop(options) {
96
105
  store,
97
106
  runId,
98
107
  stageId,
99
- request: event.request,
108
+ request,
100
109
  attemptCtx,
101
110
  qaHooks: createDefaultHitlQaHooks(store),
102
111
  });
@@ -108,14 +117,14 @@ export async function runStageYieldLoop(options) {
108
117
  reason: "stage requested wait but no HITL controller is configured",
109
118
  };
110
119
  }
111
- await hitl.enterWait(runId, stageId, handle, event.request, attemptCtx);
120
+ await hitl.enterWait(runId, stageId, handle, request, attemptCtx);
112
121
  continue;
113
122
  }
114
123
  return event.result;
115
124
  }
116
125
  }
117
126
  export async function runStage(options) {
118
- const { agent, store, runId, stage, task, dag, checkoutRoot, workspaceDir, hitl, skipStarted, existingHandle, workerMode, roots: rootsOverride, attemptCtx, factoryCwd, operatorCatalog, completedEnvelopes, skipGates, sessionMode, feedbackLoopContext, resumeToken, } = options;
127
+ const { agent, store, runId, stage, task, dag, checkoutRoot, workspaceDir, hitl, skipStarted, existingHandle, workerMode, roots: rootsOverride, attemptCtx, factoryCwd, operatorCatalog, completedEnvelopes, skipGates, sessionMode, feedbackLoopContext, resumeToken, stageEnv, browser: browserSeams, } = options;
119
128
  const stageId = options.stageId ?? stage.id;
120
129
  const attemptOpt = attemptCtx?.eventOptions();
121
130
  const baseRoots = rootsOverride ??
@@ -143,6 +152,20 @@ export async function runStage(options) {
143
152
  stage,
144
153
  dag,
145
154
  roots,
155
+ commandEnv: stageEnv ?? process.env,
156
+ ...(stage.browser?.check !== undefined
157
+ ? {
158
+ browserLogin: {
159
+ check: stage.browser.check,
160
+ ...(browserSeams?.runner !== undefined
161
+ ? { runner: browserSeams.runner }
162
+ : {}),
163
+ ...(browserSeams?.loginCheck !== undefined
164
+ ? { options: browserSeams.loginCheck }
165
+ : {}),
166
+ },
167
+ }
168
+ : {}),
146
169
  });
147
170
  await verifiedExecution.prepare();
148
171
  console.error(`Running stage ${stageId} (${stage.model})...`);
@@ -179,6 +202,7 @@ export async function runStage(options) {
179
202
  ...(sessionMode !== undefined ? { sessionMode } : {}),
180
203
  ...(feedbackLoopContext !== undefined ? { feedbackLoopContext } : {}),
181
204
  ...(resumeToken !== undefined ? { resumeToken } : {}),
205
+ ...(stageEnv !== undefined ? { stageEnv } : {}),
182
206
  onActivity: (event) => {
183
207
  enqueueActivity(event);
184
208
  },
@@ -207,6 +231,7 @@ export async function runStage(options) {
207
231
  store: workerMode ? store : undefined,
208
232
  attemptCtx,
209
233
  skipGates,
234
+ gateContext: hostGateContextFor(stage.browser),
210
235
  });
211
236
  }
212
237
  catch (err) {
@@ -251,6 +276,7 @@ export async function runStage(options) {
251
276
  result,
252
277
  activityChain,
253
278
  attemptCtx,
279
+ browser: stage.browser !== undefined,
254
280
  });
255
281
  }
256
282
  finally {
@@ -0,0 +1,9 @@
1
+ import { type LoadOutcome } from "../config/loadOutcome.js";
2
+ export type StageSecretAs = "env" | "helper" | "file";
3
+ export type StageSecretDecl = {
4
+ name: string;
5
+ /** Default: helper for git/gh token names, else env for env-kind registry entries / file for file-kind. */
6
+ as?: "env";
7
+ };
8
+ export declare function defaultSecretDelivery(name: string): "helper" | "env";
9
+ export declare function parseStageSecrets(raw: unknown, label: string, stageId?: string): LoadOutcome<StageSecretDecl[] | undefined>;
@@ -0,0 +1,102 @@
1
+ import { loadFailure, loadSuccess } from "../config/loadOutcome.js";
2
+ import { isForeverDeniedSecret } from "./stageEnvironment.js";
3
+ const GIT_HELPER_DEFAULT_NAMES = new Set([
4
+ "GITHUB_TOKEN",
5
+ "GH_TOKEN",
6
+ ]);
7
+ export function defaultSecretDelivery(name) {
8
+ return GIT_HELPER_DEFAULT_NAMES.has(name) ? "helper" : "env";
9
+ }
10
+ export function parseStageSecrets(raw, label, stageId) {
11
+ if (raw === undefined)
12
+ return loadSuccess(undefined);
13
+ if (!Array.isArray(raw)) {
14
+ return loadFailure([
15
+ {
16
+ code: "stage.invalid_secrets",
17
+ message: `Invalid stage ${label}: secrets must be an array`,
18
+ category: "stage",
19
+ stageId,
20
+ },
21
+ ]);
22
+ }
23
+ const decls = [];
24
+ const seen = new Set();
25
+ for (const item of raw) {
26
+ let name;
27
+ let asEnv = false;
28
+ if (typeof item === "string") {
29
+ name = item.trim();
30
+ }
31
+ else if (item !== null && typeof item === "object" && !Array.isArray(item)) {
32
+ const obj = item;
33
+ if (typeof obj.name !== "string" || obj.name.trim() === "") {
34
+ return loadFailure([
35
+ {
36
+ code: "stage.invalid_secrets",
37
+ message: `Invalid stage ${label}: secrets entries must be strings or { name, as? }`,
38
+ category: "stage",
39
+ stageId,
40
+ },
41
+ ]);
42
+ }
43
+ name = obj.name.trim();
44
+ if (obj.as !== undefined) {
45
+ if (obj.as !== "env") {
46
+ return loadFailure([
47
+ {
48
+ code: "stage.invalid_secrets",
49
+ message: `Invalid stage ${label}: secrets as must be "env" when set`,
50
+ category: "stage",
51
+ stageId,
52
+ },
53
+ ]);
54
+ }
55
+ asEnv = true;
56
+ }
57
+ }
58
+ else {
59
+ return loadFailure([
60
+ {
61
+ code: "stage.invalid_secrets",
62
+ message: `Invalid stage ${label}: secrets entries must be strings or { name, as? }`,
63
+ category: "stage",
64
+ stageId,
65
+ },
66
+ ]);
67
+ }
68
+ if (name === "") {
69
+ return loadFailure([
70
+ {
71
+ code: "stage.invalid_secrets",
72
+ message: `Invalid stage ${label}: secrets names must be non-empty`,
73
+ category: "stage",
74
+ stageId,
75
+ },
76
+ ]);
77
+ }
78
+ if (isForeverDeniedSecret(name)) {
79
+ return loadFailure([
80
+ {
81
+ code: "stage.denied_secret",
82
+ message: `Invalid stage ${label}: secret "${name}" is permanently denied and cannot be granted`,
83
+ category: "stage",
84
+ stageId,
85
+ },
86
+ ]);
87
+ }
88
+ if (seen.has(name)) {
89
+ return loadFailure([
90
+ {
91
+ code: "stage.invalid_secrets",
92
+ message: `Invalid stage ${label}: secrets contains duplicate name "${name}"`,
93
+ category: "stage",
94
+ stageId,
95
+ },
96
+ ]);
97
+ }
98
+ seen.add(name);
99
+ decls.push(asEnv ? { name, as: "env" } : { name });
100
+ }
101
+ return loadSuccess(decls);
102
+ }
@@ -0,0 +1,40 @@
1
+ import { cleanupCredentialsDir } from "./credentialMaterialisation.js";
2
+ import { type StageSecretDecl } from "./stageSecretDecl.js";
3
+ import type { ResolvedStageGrants } from "./stageEnvironment.js";
4
+ export type SecretRegistryEntry = {
5
+ kind: "env";
6
+ name: string;
7
+ } | {
8
+ kind: "file";
9
+ name: string;
10
+ source: string;
11
+ pointerVar: string;
12
+ };
13
+ export type SecretRegistry = Map<string, SecretRegistryEntry>;
14
+ export declare class SecretUnavailableError extends Error {
15
+ readonly code: "secret_unavailable";
16
+ readonly secretName: string;
17
+ constructor(secretName: string);
18
+ }
19
+ /** Host-owned secret registry: env NAME/_FILE plus file-credentials under $STAGEFLOW_HOME. */
20
+ export declare function loadSecretRegistry(env?: NodeJS.ProcessEnv, home?: string): SecretRegistry;
21
+ export type ResolveStageSecretsInput = {
22
+ decls: readonly StageSecretDecl[] | undefined;
23
+ registry: SecretRegistry;
24
+ hostEnv: NodeJS.ProcessEnv;
25
+ attemptDir: string;
26
+ home?: string;
27
+ };
28
+ export type ResolveStageSecretsResult = {
29
+ grants: ResolvedStageGrants;
30
+ warnings: string[];
31
+ knownValues: Array<{
32
+ name: string;
33
+ value: string;
34
+ }>;
35
+ credentialDirs: string[];
36
+ };
37
+ /** Presence-only check (no materialisation) for preflight / start gates. */
38
+ export declare function assertSecretPresent(name: string, registry: SecretRegistry, hostEnv: NodeJS.ProcessEnv): void;
39
+ export declare function resolveStageSecrets(input: ResolveStageSecretsInput): ResolveStageSecretsResult;
40
+ export { cleanupCredentialsDir };
@@ -0,0 +1,181 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { shouldRegisterValue } from "../logging/redact.js";
3
+ import { globalStageflowHome } from "../project/globalHome.js";
4
+ import { attemptCredentialsDir, cleanupCredentialsDir, ensureStageAskpassHelper, materialiseCredentialFile, materialiseSecretBytes, readFileCredentialRegistry, } from "./credentialMaterialisation.js";
5
+ import { defaultSecretDelivery, } from "./stageSecretDecl.js";
6
+ import { isForeverDeniedSecret } from "./stageEnvironment.js";
7
+ export class SecretUnavailableError extends Error {
8
+ code = "secret_unavailable";
9
+ secretName;
10
+ constructor(secretName) {
11
+ super(`secret_unavailable: registered secret "${secretName}" has no value on this Host`);
12
+ this.name = "SecretUnavailableError";
13
+ this.secretName = secretName;
14
+ }
15
+ }
16
+ function readEnvSecretValue(name, env) {
17
+ const plain = env[name];
18
+ const fileKey = `${name}_FILE`;
19
+ const filePath = env[fileKey];
20
+ const hasPlain = plain !== undefined && plain.length > 0;
21
+ const hasFile = filePath !== undefined && filePath.length > 0;
22
+ if (hasPlain && hasFile) {
23
+ throw new Error(`Set only one of ${name} or ${fileKey}, not both`);
24
+ }
25
+ if (hasFile) {
26
+ return readFileSync(filePath, "utf8").replace(/\r?\n$/, "");
27
+ }
28
+ if (hasPlain)
29
+ return plain;
30
+ return undefined;
31
+ }
32
+ /** Host-owned secret registry: env NAME/_FILE plus file-credentials under $STAGEFLOW_HOME. */
33
+ export function loadSecretRegistry(env = process.env, home = globalStageflowHome()) {
34
+ const registry = new Map();
35
+ const fileCreds = readFileCredentialRegistry(home);
36
+ for (const [name, entry] of Object.entries(fileCreds)) {
37
+ if (isForeverDeniedSecret(name))
38
+ continue;
39
+ registry.set(name, {
40
+ kind: "file",
41
+ name,
42
+ source: entry.source,
43
+ pointerVar: entry.pointerVar,
44
+ });
45
+ }
46
+ // Well-known env secrets are always registered when present or when declared
47
+ // (presence checked at resolve time). Register common names so validate can
48
+ // distinguish unknown vs unavailable.
49
+ for (const name of [
50
+ "GITHUB_TOKEN",
51
+ "GH_TOKEN",
52
+ "NPM_TOKEN",
53
+ "NODE_AUTH_TOKEN",
54
+ ]) {
55
+ if (!registry.has(name)) {
56
+ registry.set(name, { kind: "env", name });
57
+ }
58
+ }
59
+ // Any Host env var with a sibling `_FILE` or non-empty value that looks like a
60
+ // registered secret name from STAGEFLOW_SECRET_REGISTRY (comma list) is also
61
+ // env-kind.
62
+ const extra = env.STAGEFLOW_SECRET_REGISTRY?.split(",") ?? [];
63
+ for (const raw of extra) {
64
+ const name = raw.trim();
65
+ if (!name || isForeverDeniedSecret(name) || registry.has(name))
66
+ continue;
67
+ registry.set(name, { kind: "env", name });
68
+ }
69
+ return registry;
70
+ }
71
+ /** Presence-only check (no materialisation) for preflight / start gates. */
72
+ export function assertSecretPresent(name, registry, hostEnv) {
73
+ if (isForeverDeniedSecret(name)) {
74
+ throw new Error(`secret "${name}" is permanently denied`);
75
+ }
76
+ const entry = registry.get(name);
77
+ if (entry === undefined) {
78
+ throw new Error(`stage.unknown_secret: "${name}"`);
79
+ }
80
+ if (entry.kind === "file") {
81
+ try {
82
+ readFileSync(entry.source, "utf8");
83
+ }
84
+ catch {
85
+ throw new SecretUnavailableError(name);
86
+ }
87
+ return;
88
+ }
89
+ const value = readEnvSecretValue(name, hostEnv);
90
+ if (value === undefined || value === "") {
91
+ throw new SecretUnavailableError(name);
92
+ }
93
+ }
94
+ function materialiseGitAskpassGrant(grantEnv, credentialDirs, opts) {
95
+ const destDir = attemptCredentialsDir(opts.attemptDir, opts.secretName);
96
+ const tokenFile = materialiseSecretBytes({
97
+ contents: opts.value,
98
+ destDir,
99
+ destBasename: "token",
100
+ });
101
+ credentialDirs.push(destDir);
102
+ grantEnv.GIT_ASKPASS = ensureStageAskpassHelper(opts.home);
103
+ grantEnv.GIT_TERMINAL_PROMPT = "0";
104
+ grantEnv.STAGEFLOW_GIT_ASKPASS_TOKEN_FILE = tokenFile.destPath;
105
+ }
106
+ export function resolveStageSecrets(input) {
107
+ const decls = input.decls ?? [];
108
+ const warnings = [];
109
+ const grantEnv = {};
110
+ const knownValues = [];
111
+ const credentialDirs = [];
112
+ const registeredNames = [...input.registry.keys()];
113
+ const declaredNames = decls.map((d) => d.name);
114
+ for (const decl of decls) {
115
+ if (isForeverDeniedSecret(decl.name)) {
116
+ throw new Error(`secret "${decl.name}" is permanently denied`);
117
+ }
118
+ const entry = input.registry.get(decl.name);
119
+ if (entry === undefined) {
120
+ throw new Error(`stage.unknown_secret: "${decl.name}"`);
121
+ }
122
+ if (entry.kind === "file") {
123
+ const destDir = attemptCredentialsDir(input.attemptDir, decl.name);
124
+ const homeRoot = input.home ?? globalStageflowHome();
125
+ const copied = materialiseCredentialFile({
126
+ sourcePath: entry.source,
127
+ destDir,
128
+ allowedRoot: homeRoot,
129
+ });
130
+ credentialDirs.push(destDir);
131
+ grantEnv[entry.pointerVar] = copied.destPath;
132
+ const contents = readFileSync(copied.destPath, "utf8");
133
+ if (shouldRegisterValue(contents)) {
134
+ knownValues.push({ name: decl.name, value: contents });
135
+ }
136
+ if (decl.as === "env") {
137
+ warnings.push(`secrets: ${decl.name} granted as: env (value present in stage environment)`);
138
+ grantEnv[decl.name] = contents;
139
+ }
140
+ continue;
141
+ }
142
+ const value = readEnvSecretValue(decl.name, input.hostEnv);
143
+ if (value === undefined || value === "") {
144
+ throw new SecretUnavailableError(decl.name);
145
+ }
146
+ knownValues.push({ name: decl.name, value });
147
+ const delivery = decl.as === "env" ? "env" : defaultSecretDelivery(decl.name);
148
+ if (delivery === "env") {
149
+ if (decl.as === "env") {
150
+ warnings.push(`secrets: ${decl.name} granted as: env (value present in stage environment)`);
151
+ }
152
+ grantEnv[decl.name] = value;
153
+ if (defaultSecretDelivery(decl.name) === "helper") {
154
+ materialiseGitAskpassGrant(grantEnv, credentialDirs, {
155
+ attemptDir: input.attemptDir,
156
+ secretName: decl.name,
157
+ value,
158
+ home: input.home,
159
+ });
160
+ }
161
+ continue;
162
+ }
163
+ materialiseGitAskpassGrant(grantEnv, credentialDirs, {
164
+ attemptDir: input.attemptDir,
165
+ secretName: decl.name,
166
+ value,
167
+ home: input.home,
168
+ });
169
+ }
170
+ return {
171
+ grants: {
172
+ env: grantEnv,
173
+ registeredSecretNames: registeredNames,
174
+ declaredSecretNames: declaredNames,
175
+ },
176
+ warnings,
177
+ knownValues,
178
+ credentialDirs,
179
+ };
180
+ }
181
+ export { cleanupCredentialsDir };
@@ -14,4 +14,5 @@ export type StageStreamLogWriter = {
14
14
  export declare function createStageStreamLogWriter(streamLogPath: string, options?: {
15
15
  flushThrottleMs?: number;
16
16
  capBytes?: number;
17
+ redact?: (text: string) => string;
17
18
  }): StageStreamLogWriter;
@@ -54,6 +54,7 @@ async function appendChunk(streamLogPath, chunk, capBytes) {
54
54
  export function createStageStreamLogWriter(streamLogPath, options = {}) {
55
55
  const flushThrottleMs = options.flushThrottleMs ?? STREAM_FLUSH_THROTTLE_MS;
56
56
  const capBytes = options.capBytes ?? DEFAULT_CAP_BYTES;
57
+ const scrub = options.redact ?? redactSecrets;
57
58
  let buffer = "";
58
59
  let timer = null;
59
60
  // Serializes disk writes so the throttle timer and an eager flush() never race.
@@ -65,7 +66,7 @@ export function createStageStreamLogWriter(streamLogPath, options = {}) {
65
66
  }
66
67
  if (!buffer)
67
68
  return writeChain;
68
- const chunk = redactSecrets(buffer);
69
+ const chunk = scrub(buffer);
69
70
  buffer = "";
70
71
  writeChain = writeChain.then(() => appendChunk(streamLogPath, chunk, capBytes));
71
72
  return writeChain;
@@ -2,5 +2,6 @@ import { type RunStageOutcome } from "./stageRunner.js";
2
2
  import { type StageWorkerInput, type StageWorkerResult } from "./stageWorkerProtocol.js";
3
3
  export type { StageWorkerInput, StageWorkerResult } from "./stageWorkerProtocol.js";
4
4
  export declare function runStageWorker(input: StageWorkerInput): Promise<RunStageOutcome>;
5
- export declare function sendWorkerResult(result: StageWorkerResult): void;
6
- export declare function exitForOutcome(outcome: RunStageOutcome): never;
5
+ export declare function sendWorkerResult(result: StageWorkerResult): Promise<void>;
6
+ export declare function exitCodeForOutcome(outcome: RunStageOutcome): number;
7
+ export declare function exitForOutcome(outcome: RunStageOutcome): Promise<number>;