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
@@ -1,5 +1,6 @@
1
1
  import type { AgentPort } from "../agent/port.js";
2
2
  import type { RunPipelineDagSnapshot, RunStore, StageSnapshot } from "../runstore/port.js";
3
+ import type { StageBrowserSupport } from "../browser/browserHost.js";
3
4
  import type { StageEnvelope } from "../types/envelope.js";
4
5
  import type { LoadedPipeline, ResolvedPipelineDag } from "../types/pipeline.js";
5
6
  import type { TaskFile } from "../types/task.js";
@@ -24,6 +25,7 @@ type SchedulerPreparedPipeline = {
24
25
  hitl?: StageHitlController;
25
26
  operatorCatalog?: OperatorCatalog;
26
27
  skipGates?: boolean;
28
+ browser?: StageBrowserSupport;
27
29
  };
28
30
  export type { SchedulerPreparedPipeline };
29
31
  type RetryContext = {
@@ -61,7 +63,13 @@ export type ResumeRunOptions = {
61
63
  initialPrior?: StageEnvelope | null;
62
64
  executionMode?: StageExecutionMode;
63
65
  stageProcessLauncher?: StageProcessLauncher;
66
+ schedulingHalt?: {
67
+ halted: boolean;
68
+ hostShutdown?: boolean;
69
+ };
64
70
  };
71
+ /** Refuses to overwrite a cancelled run (KTD7). */
72
+ export declare function writeTerminalRunStatus(store: RunStore, runId: string, status: "succeeded" | "failed"): Promise<void>;
65
73
  export declare function resumeRun(options: ResumeRunOptions): Promise<PipelineRunResult>;
66
74
  export type RunPipelineDagOptions = {
67
75
  prepared: SchedulerPreparedPipeline;
@@ -87,6 +95,11 @@ export type RunPipelineDagOptions = {
87
95
  sourceStageId: string;
88
96
  resolve: (decision: FeedbackLoopDecisionInput) => Promise<ResolveFeedbackLoopDecisionResult>;
89
97
  }) => Promise<void>;
98
+ /** Live cancel flag — when set, launchStage/startStage stop. */
99
+ schedulingHalt?: {
100
+ halted: boolean;
101
+ hostShutdown?: boolean;
102
+ };
90
103
  };
91
104
  export type RetryRunOptions = {
92
105
  prepared: SchedulerPreparedPipeline;
@@ -97,6 +110,10 @@ export type RetryRunOptions = {
97
110
  mutationQueue?: RetryMutationQueue;
98
111
  onLoopTick?: () => void | Promise<void>;
99
112
  onRetryRootTerminal?: OnRetryRootTerminal;
113
+ schedulingHalt?: {
114
+ halted: boolean;
115
+ hostShutdown?: boolean;
116
+ };
100
117
  };
101
118
  export declare function retryRun(options: RetryRunOptions): Promise<PipelineRunResult>;
102
119
  export declare function applyForkSkipsFromEnvelopes(dag: ResolvedPipelineDag, states: Map<string, StageScheduleState>, completedEnvelopes: Map<string, StageEnvelope>): void;
@@ -1,5 +1,11 @@
1
1
  import { normalizeForkChoice } from "../envelope/forkChoice.js";
2
+ import { refreshRunDiskUsage } from "../runstore/diskUsage.js";
2
3
  import { buildPipelineDagSnapshotFromLoaded } from "../runstore/pipelineDagSnapshot.js";
4
+ import { defaultStageBrowserSupport, resolveStageBrowserEnv, } from "../browser/stageBrowserEnv.js";
5
+ import { teardownRunBrowsers, teardownStageBrowser, } from "../browser/browserTeardown.js";
6
+ import { isHumanLoginStage } from "../browser/humanLogin.js";
7
+ import { createRunLiveness } from "../browser/runLiveness.js";
8
+ import { acquireStageProfile, profileWaitingMessage, } from "../browser/stageProfileLock.js";
3
9
  import { definitionIdForInstance } from "../runstore/stageInstanceId.js";
4
10
  import { cloneFailureContinuesSchedule, cloneRetryDownstream, cloneFailFastSkipIds, cloneScheduleAllowsRun, failureIsAccepted, isCloneInstance, mint, protectedClonableChildIds, sequentialLaterCloneIds, skipRejectedNeedDependents, } from "./cloneSchedule.js";
5
11
  import { buildCompletedEnvelopesFromRun, buildStageConfigById, } from "./envelopeRouting.js";
@@ -8,8 +14,18 @@ import { reopenRunnableSkippedStages, persistReopenedStages } from "./reopenSkip
8
14
  import { forkChoicePreservesReplaySource, forkCohortMapsFromStore, mintCohortForFanout, } from "./forkGeneration.js";
9
15
  import { activeReplayId, activeSourceStageId, applySendBack, createReplaySchedule, hydrateFromStore, isHeld, launchAttemptFor, launchFor, noteActiveCohort, onContinued, onRouteStageFailed, onRouteStageRunning, onRouteStageSucceeded, rebindRouteAttempts, resolveDecision, } from "./replayLifecycle.js";
10
16
  import { WAIT_WITHOUT_WORKER_DISPATCH } from "./answerResume.js";
17
+ import { reclaimWorkspaceOnRunSucceeded } from "./repositoryMaterialize.js";
18
+ import { syncRunStatusFromStages } from "./stageRecovery.js";
11
19
  import { runStage, isRunStageWaiting } from "./stageRunner.js";
12
20
  import { attemptContext, resumeSessionFilePath } from "./stageAttemptContext.js";
21
+ import { stageBindingEnvFromRun } from "./stageRoots.js";
22
+ import { attemptWorkspaceDir } from "../runstore/workspaceLayout.js";
23
+ import { cleanupCredentialsDir, loadSecretRegistry, resolveStageSecrets, SecretUnavailableError, } from "./stageSecrets.js";
24
+ import { mkdir, writeFile } from "node:fs/promises";
25
+ import path from "node:path";
26
+ import { logger as rootLogger, } from "../logging/logger.js";
27
+ import { registerNamedSecrets, REDACTION_SECRETS_FILENAME } from "../logging/namedSecrets.js";
28
+ import { finaliseStoredRunManifest } from "../runstore/runManifest.js";
13
29
  function asDagSnapshot(dag) {
14
30
  const snapshot = dag;
15
31
  if (Array.isArray(snapshot.stage_ids))
@@ -35,6 +51,8 @@ export function snapshotToScheduleState(snap, overrides, stageId, executionMode)
35
51
  return "active";
36
52
  case "waiting_for_input":
37
53
  return executionMode === "process" ? "waiting" : "active";
54
+ case "interrupted":
55
+ return "waiting";
38
56
  case "skipped":
39
57
  return "skipped";
40
58
  default:
@@ -136,6 +154,18 @@ export async function hydrateScheduleForRetryRoots(store, runId, dag, retryStage
136
154
  export async function hydrateScheduleForRetry(store, runId, dag, retryStageId) {
137
155
  return hydrateScheduleForRetryRoots(store, runId, dag, [retryStageId]);
138
156
  }
157
+ /** Refuses to overwrite a cancelled run (KTD7). */
158
+ export async function writeTerminalRunStatus(store, runId, status) {
159
+ const meta = await store.readRunMeta(runId);
160
+ if (meta.status === "cancelled")
161
+ return;
162
+ await store.updateRunStatus(runId, status);
163
+ await finaliseStoredRunManifest(store, runId).catch(() => undefined);
164
+ await refreshRunDiskUsage(store, runId).catch(() => undefined);
165
+ if (status === "succeeded") {
166
+ await reclaimWorkspaceOnRunSucceeded(store, runId);
167
+ }
168
+ }
139
169
  export async function resumeRun(options) {
140
170
  const { prepared, resumeFromStageId, initialPrior } = options;
141
171
  const meta = await prepared.store.readRunMeta(prepared.run.runId);
@@ -165,7 +195,7 @@ export async function resumeRun(options) {
165
195
  });
166
196
  if (allTerminal) {
167
197
  const unhandledFailure = scheduleHasUnhandledFailure(dag, hydrated.states);
168
- await prepared.store.updateRunStatus(prepared.run.runId, unhandledFailure ? "failed" : "succeeded");
198
+ await writeTerminalRunStatus(prepared.store, prepared.run.runId, unhandledFailure ? "failed" : "succeeded");
169
199
  return {
170
200
  ok: !unhandledFailure,
171
201
  outcome: unhandledFailure ? "failed" : "succeeded",
@@ -191,6 +221,7 @@ export async function retryRun(options) {
191
221
  mutationQueue: options.mutationQueue,
192
222
  onLoopTick: options.onLoopTick,
193
223
  onRetryRootTerminal: options.onRetryRootTerminal,
224
+ schedulingHalt: options.schedulingHalt,
194
225
  });
195
226
  }
196
227
  function applyForkChoiceToSchedule(dag, forkStageId, chosen, states, options) {
@@ -349,11 +380,18 @@ export async function runPipelineDag(options) {
349
380
  let { states, completedEnvelopes, schedulingHalted, firstFailureReason, dag: hydratedDag, } = options.initialSchedule ??
350
381
  (await hydrateScheduleFromStore(store, run.runId, fallbackDag, executionMode));
351
382
  let dag = hydratedDag ?? fallbackDag;
383
+ const runMeta = await store.readRunMeta(run.runId);
352
384
  if (hydratedDag === undefined) {
353
- const meta = await store.readRunMeta(run.runId);
354
- dag = meta.pipeline_dag ?? fallbackDag;
385
+ dag = runMeta.pipeline_dag ?? fallbackDag;
355
386
  }
387
+ const stageBinding = stageBindingEnvFromRun({
388
+ meta: runMeta,
389
+ task,
390
+ runWorkspaceDir: run.workspaceDir,
391
+ hostEnv: process.env,
392
+ });
356
393
  const stageById = buildStageConfigById(loaded);
394
+ const runUsesBrowser = [...stageById.values()].some((s) => s.browser !== undefined);
357
395
  const retryContext = options.retryContext;
358
396
  const feedbackSchedule = createReplaySchedule();
359
397
  await hydrateFromStore(feedbackSchedule, store, run.runId, dag);
@@ -810,6 +848,40 @@ export async function runPipelineDag(options) {
810
848
  return;
811
849
  }
812
850
  const attempt = await resolveLaunchAttempt(stageId);
851
+ if (stage.browser?.profile !== undefined) {
852
+ const profile = stage.browser.profile;
853
+ // A stage queued behind another run's lease must not hold one of this
854
+ // run's active slots; it takes the slot back once it joins the lease.
855
+ let slotReleased = false;
856
+ let acquired;
857
+ try {
858
+ acquired = await acquireStageProfile(prepared.browser ?? defaultStageBrowserSupport(), {
859
+ profile,
860
+ owner: { runId: run.runId, stageId },
861
+ isRunLive: createRunLiveness(store),
862
+ halted: () => options.schedulingHalt?.halted === true,
863
+ onWaiting: async (holder) => {
864
+ if (!slotReleased) {
865
+ slotReleased = true;
866
+ activeCount -= 1;
867
+ }
868
+ await store.appendStageEvent(run.runId, stageId, {
869
+ event: "message",
870
+ role: "host",
871
+ text: profileWaitingMessage(profile, holder),
872
+ }, { attempt });
873
+ },
874
+ });
875
+ }
876
+ finally {
877
+ if (slotReleased)
878
+ activeCount += 1;
879
+ }
880
+ if (acquired === "halted") {
881
+ states.set(stageId, "skipped");
882
+ return;
883
+ }
884
+ }
813
885
  const attemptCtx = attemptContext(attempt);
814
886
  const prep = launchFor(feedbackSchedule, stageId);
815
887
  const feedbackLoopContext = prep?.feedbackLoopContext;
@@ -827,32 +899,100 @@ export async function runPipelineDag(options) {
827
899
  stageId,
828
900
  });
829
901
  }
902
+ const attemptDir = attemptWorkspaceDir(run.workspaceDir, stageId, attempt);
903
+ await mkdir(attemptDir, { recursive: true });
904
+ const attemptHome = path.join(attemptDir, "home");
905
+ await mkdir(attemptHome, { recursive: true });
906
+ let grants;
907
+ try {
908
+ const resolved = resolveStageSecrets({
909
+ decls: stage.secrets,
910
+ registry: loadSecretRegistry(process.env),
911
+ hostEnv: process.env,
912
+ attemptDir,
913
+ });
914
+ grants = resolved.grants;
915
+ registerNamedSecrets(resolved.knownValues);
916
+ await writeFile(path.join(attemptDir, REDACTION_SECRETS_FILENAME), `${JSON.stringify(resolved.knownValues)}\n`, { encoding: "utf8", mode: 0o600 });
917
+ for (const warning of resolved.warnings) {
918
+ rootLogger.warn("stage.secrets", warning, {
919
+ run_id: run.runId,
920
+ stage_id: stageId,
921
+ });
922
+ }
923
+ await writeFile(path.join(attemptDir, "declared-secrets.json"), `${JSON.stringify({ names: grants.declaredSecretNames }, null, 2)}\n`, "utf8");
924
+ }
925
+ catch (err) {
926
+ const reason = err instanceof SecretUnavailableError
927
+ ? err.message
928
+ : err instanceof Error
929
+ ? err.message
930
+ : String(err);
931
+ await onStageFailure(stageId, reason);
932
+ return;
933
+ }
934
+ const cleanupAttemptCredentials = () => {
935
+ try {
936
+ cleanupCredentialsDir(attemptDir);
937
+ }
938
+ catch {
939
+ // best-effort Host cleanup
940
+ }
941
+ };
942
+ let browserEnv;
943
+ try {
944
+ browserEnv = await resolveStageBrowserEnv(prepared.browser ?? defaultStageBrowserSupport(), {
945
+ runId: run.runId,
946
+ stageId,
947
+ runDir: run.workspaceDir,
948
+ browser: stage.browser,
949
+ attempt,
950
+ humanLogin: isHumanLoginStage(dag, definitionId, stage.browser),
951
+ });
952
+ }
953
+ catch (err) {
954
+ cleanupAttemptCredentials();
955
+ await onStageFailure(stageId, err instanceof Error ? err.message : String(err));
956
+ return;
957
+ }
830
958
  if (executionMode === "process") {
831
959
  const launcher = options.stageProcessLauncher;
832
960
  if (!launcher) {
961
+ cleanupAttemptCredentials();
833
962
  await onStageFailure(stageId, "stage process launcher is not configured");
834
963
  return;
835
964
  }
836
- const launchResult = await launcher.launch({
837
- runId: run.runId,
838
- stageId,
839
- rootDir: factoryCwd,
840
- attempt,
841
- ...(sessionMode !== undefined
842
- ? {
843
- mode: sessionMode === "feedback_resume"
844
- ? "feedback_resume"
845
- : sessionMode === "new_session"
846
- ? "new_session"
847
- : "run",
848
- }
849
- : {}),
850
- ...(resumeToken !== undefined ? { sessionFilePath: resumeToken } : {}),
851
- ...(prepared.operatorCatalog !== undefined
852
- ? { operatorCatalog: prepared.operatorCatalog }
853
- : {}),
854
- ...(prepared.skipGates ? { skipGates: true } : {}),
855
- });
965
+ let launchResult;
966
+ try {
967
+ launchResult = await launcher.launch({
968
+ runId: run.runId,
969
+ stageId,
970
+ rootDir: factoryCwd,
971
+ attempt,
972
+ env: stageBinding.env,
973
+ bindingKind: stageBinding.kind,
974
+ grants,
975
+ attemptHome,
976
+ ...(browserEnv !== undefined ? { browserEnv } : {}),
977
+ ...(sessionMode !== undefined
978
+ ? {
979
+ mode: sessionMode === "feedback_resume"
980
+ ? "feedback_resume"
981
+ : sessionMode === "new_session"
982
+ ? "new_session"
983
+ : "run",
984
+ }
985
+ : {}),
986
+ ...(resumeToken !== undefined ? { sessionFilePath: resumeToken } : {}),
987
+ ...(prepared.operatorCatalog !== undefined
988
+ ? { operatorCatalog: prepared.operatorCatalog }
989
+ : {}),
990
+ ...(prepared.skipGates ? { skipGates: true } : {}),
991
+ });
992
+ }
993
+ finally {
994
+ cleanupAttemptCredentials();
995
+ }
856
996
  if (launchResult.type === "succeeded") {
857
997
  try {
858
998
  const envelope = await store.readEnvelope(run.runId, stageId);
@@ -868,6 +1008,14 @@ export async function runPipelineDag(options) {
868
1008
  states.set(stageId, "waiting");
869
1009
  return;
870
1010
  }
1011
+ if (options.schedulingHalt?.hostShutdown) {
1012
+ states.set(stageId, "waiting");
1013
+ return;
1014
+ }
1015
+ const recorded = await store.listStageEvents(run.runId, stageId, attempt);
1016
+ if (!recorded.some((event) => event.event === "failed")) {
1017
+ await store.appendStageEvent(run.runId, stageId, { event: "failed", reason: launchResult.reason }, { attempt });
1018
+ }
871
1019
  await onStageFailure(stageId, launchResult.reason);
872
1020
  return;
873
1021
  }
@@ -887,15 +1035,27 @@ export async function runPipelineDag(options) {
887
1035
  operatorCatalog: prepared.operatorCatalog,
888
1036
  completedEnvelopes,
889
1037
  skipGates: prepared.skipGates,
1038
+ ...(prepared.browser !== undefined ? { browser: prepared.browser } : {}),
1039
+ stageEnv: {
1040
+ ...stageBinding.env,
1041
+ ...grants.env,
1042
+ ...browserEnv,
1043
+ HOME: attemptHome,
1044
+ },
890
1045
  ...(sessionMode !== undefined ? { sessionMode } : {}),
891
1046
  ...(feedbackLoopContext !== undefined ? { feedbackLoopContext } : {}),
892
1047
  ...(resumeToken !== undefined ? { resumeToken } : {}),
893
1048
  });
1049
+ cleanupAttemptCredentials();
894
1050
  if (isRunStageWaiting(result)) {
895
1051
  await onStageFailure(stageId, WAIT_WITHOUT_WORKER_DISPATCH);
896
1052
  return;
897
1053
  }
898
1054
  if (!result.ok) {
1055
+ if (options.schedulingHalt?.hostShutdown) {
1056
+ states.set(stageId, "waiting");
1057
+ return;
1058
+ }
899
1059
  await onStageFailure(stageId, result.reason ?? "stage failed", result.envelope);
900
1060
  return;
901
1061
  }
@@ -919,7 +1079,19 @@ export async function runPipelineDag(options) {
919
1079
  states.set(stageId, "active");
920
1080
  launchedIds.add(stageId);
921
1081
  activeCount += 1;
922
- const taskPromise = launchStage(stageId).finally(() => {
1082
+ const taskPromise = launchStage(stageId)
1083
+ .then(async () => {
1084
+ const state = states.get(stageId);
1085
+ if (runUsesBrowser && (state === "succeeded" || state === "failed")) {
1086
+ await teardownStageBrowser(prepared.browser ?? defaultStageBrowserSupport(), {
1087
+ runId: run.runId,
1088
+ runDir: run.workspaceDir,
1089
+ stageId,
1090
+ events: () => store.listStageEvents(run.runId, stageId),
1091
+ }).catch(() => undefined);
1092
+ }
1093
+ })
1094
+ .finally(() => {
923
1095
  activeCount -= 1;
924
1096
  inFlight.delete(taskPromise);
925
1097
  });
@@ -944,11 +1116,17 @@ export async function runPipelineDag(options) {
944
1116
  return true;
945
1117
  };
946
1118
  while (!allTerminal()) {
1119
+ if (options.schedulingHalt?.halted) {
1120
+ schedulingHalted = true;
1121
+ }
947
1122
  drainRetryMutations();
948
1123
  await applyStalledJoinSkips();
949
1124
  if (options.onLoopTick !== undefined) {
950
1125
  await options.onLoopTick();
951
1126
  }
1127
+ if (options.schedulingHalt?.halted) {
1128
+ schedulingHalted = true;
1129
+ }
952
1130
  if (!schedulingHalted) {
953
1131
  const runnable = pickRunnable();
954
1132
  for (const stageId of runnable) {
@@ -981,6 +1159,15 @@ export async function runPipelineDag(options) {
981
1159
  await Promise.all(inFlight);
982
1160
  }
983
1161
  const hasWaiting = [...states.values()].some((s) => s === "waiting");
1162
+ if (runUsesBrowser &&
1163
+ !(hasWaiting && !schedulingHalted) &&
1164
+ !options.schedulingHalt?.hostShutdown) {
1165
+ await teardownRunBrowsers(prepared.browser ?? defaultStageBrowserSupport(), {
1166
+ runId: run.runId,
1167
+ runDir: run.workspaceDir,
1168
+ events: (stageId) => store.listStageEvents(run.runId, stageId),
1169
+ });
1170
+ }
984
1171
  if (hasWaiting && !schedulingHalted) {
985
1172
  return {
986
1173
  ok: false,
@@ -992,11 +1179,16 @@ export async function runPipelineDag(options) {
992
1179
  if (schedulingHalted) {
993
1180
  markSkippedPending();
994
1181
  if (retryContext === undefined) {
995
- await store.updateRunStatus(run.runId, "failed");
1182
+ if (options.schedulingHalt?.hostShutdown) {
1183
+ await syncRunStatusFromStages(store, run.runId);
1184
+ }
1185
+ else {
1186
+ await writeTerminalRunStatus(store, run.runId, "failed");
1187
+ }
996
1188
  }
997
1189
  return {
998
1190
  ok: false,
999
- outcome: "failed",
1191
+ outcome: options.schedulingHalt?.hostShutdown ? "waiting" : "failed",
1000
1192
  runDir: run.workspaceDir,
1001
1193
  runId: run.runId,
1002
1194
  reason: firstFailureReason,
@@ -1004,7 +1196,7 @@ export async function runPipelineDag(options) {
1004
1196
  }
1005
1197
  if (scheduleHasUnhandledFailure(dag, states) || !allTerminal()) {
1006
1198
  if (retryContext === undefined) {
1007
- await store.updateRunStatus(run.runId, "failed");
1199
+ await writeTerminalRunStatus(store, run.runId, "failed");
1008
1200
  }
1009
1201
  return {
1010
1202
  ok: false,
@@ -1014,7 +1206,7 @@ export async function runPipelineDag(options) {
1014
1206
  reason: firstFailureReason ?? "pipeline incomplete",
1015
1207
  };
1016
1208
  }
1017
- await store.updateRunStatus(run.runId, "succeeded");
1209
+ await writeTerminalRunStatus(store, run.runId, "succeeded");
1018
1210
  return {
1019
1211
  ok: true,
1020
1212
  outcome: "succeeded",
@@ -32,13 +32,18 @@ async function assertCatalogFileExists(filePath, label) {
32
32
  }
33
33
  }
34
34
  export async function reloadPipelineForRun(meta) {
35
- const projectRoot = requireProjectRoot(meta);
36
35
  // An inline-pipeline run (no pipeline_path — nothing was ever written to a
37
36
  // catalog file) carries its own pipeline body in meta.inline_pipeline
38
37
  // instead, the same way a task without task_path reloads from task_yaml.
38
+ // Prefer this before requiring path locators; project_root is optional and
39
+ // falls back to cwd (same as loadPipelineFromObject).
39
40
  if (meta.inline_pipeline) {
41
+ const projectRoot = meta.project_root
42
+ ? normalizeCatalogPath(meta.project_root)
43
+ : process.cwd();
40
44
  return loadPipelineFromObject(meta.inline_pipeline, { projectRoot });
41
45
  }
46
+ const projectRoot = requireProjectRoot(meta);
42
47
  const pipelinePath = requirePipelinePath(meta);
43
48
  await assertCatalogFileExists(pipelinePath, "Pipeline");
44
49
  return loadPipeline(pipelinePath, { cwd: projectRoot });
@@ -0,0 +1,47 @@
1
+ import type { RunMeta, RunStore } from "../runstore/port.js";
2
+ import type { TaskFile } from "../types/task.js";
3
+ import type { WorkspaceBinding } from "./workspaceBinding.js";
4
+ export type StartFailureCode = "busy_capacity" | "busy_checkout" | "busy_caller_quota" | "repository_auth_failed" | "repository_not_found" | "ref_not_found" | "repository_fetch_failed" | "worktree_create_failed" | "git_missing" | "insufficient_disk" | "disk_check_failed" | "pinned_sha_unavailable" | "invalid_run_branch" | "task.binding_conflict" | "task.repository_ref_required" | "task.ref_without_repository" | "task.repository_invalid" | "task.invalid_shape" | "task.load_error" | "trigger.task_override_not_allowed" | "trigger.task_required" | "start.token_rejected" | "inline_pipeline_too_large" | "skills_invalid_name" | "skills_invalid_path" | "skills_missing_skill_md" | "skills_payload_too_large" | "missing_tool" | "tool_version_mismatch" | "unknown_version" | "secret_unavailable" | "unresolved_var" | "shutting_down" | "autostart_disabled" | "ensure_project_not_allowed" | "claude_as_root";
5
+ export type MaterializedBinding = {
6
+ runId: string;
7
+ checkoutRoot?: string;
8
+ repository?: string;
9
+ ref?: string;
10
+ resolvedSha?: string;
11
+ runBranch?: string;
12
+ };
13
+ export type DerivedBindingKind = "repository" | "checkout" | "unbound";
14
+ export declare function derivedBindingKindFromMeta(meta: RunMeta): DerivedBindingKind;
15
+ export declare function worktreePathForRun(runId: string): string;
16
+ export declare function resolveRunBranchTemplate(task: TaskFile): string;
17
+ export declare class StartLinkError extends Error {
18
+ readonly code: StartFailureCode;
19
+ readonly status: number;
20
+ readonly stderr?: string;
21
+ constructor(message: string, options: {
22
+ code: StartFailureCode;
23
+ status: number;
24
+ stderr?: string;
25
+ });
26
+ }
27
+ export declare function throwMappedGitError(err: unknown, phase: "fetch" | "resolve" | "worktree"): never;
28
+ export type MaterializeOptions = {
29
+ runId: string;
30
+ task: TaskFile;
31
+ binding: WorkspaceBinding;
32
+ checkoutRoot?: string;
33
+ pinned?: {
34
+ ref: string;
35
+ resolvedSha: string;
36
+ };
37
+ };
38
+ export type ReclaimWorkspaceBindingOptions = {
39
+ /** When true, remove the worktree but leave `run_branch` (SLIM must keep the branch). */
40
+ keepRunBranch?: boolean;
41
+ };
42
+ export declare function reclaimWorkspaceBinding(meta: RunMeta, options?: ReclaimWorkspaceBindingOptions): Promise<void>;
43
+ export declare function reclaimWorkspaceOnRunSucceeded(store: RunStore, runId: string): Promise<void>;
44
+ export declare function materializeWorkspaceBinding(options: MaterializeOptions): Promise<{
45
+ materialized: MaterializedBinding;
46
+ rollback: () => Promise<void>;
47
+ }>;