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
@@ -16,6 +16,7 @@ export type CommandExecutionInput = {
16
16
  command: string;
17
17
  cwd: string;
18
18
  timeout_ms?: number;
19
+ env?: NodeJS.ProcessEnv;
19
20
  };
20
21
  export type CommandExecutor = {
21
22
  run(input: CommandExecutionInput): Promise<CommandExecution>;
@@ -61,6 +62,8 @@ export type CompletionCheckRunnerInput = {
61
62
  artifactsDir: string;
62
63
  /** Base directory used for a command check without its own cwd. */
63
64
  commandWorkingDirectory?: string;
65
+ /** Curated env for command checks; omit to inherit the caller's process env. */
66
+ commandEnv?: NodeJS.ProcessEnv;
64
67
  commandExecutor?: CommandExecutor;
65
68
  gates?: GateDecisionProvider;
66
69
  /** Captured before the agent attempt began. */
@@ -69,6 +72,12 @@ export type CompletionCheckRunnerInput = {
69
72
  /** Why the runtime could not establish the required pre-stage baseline. */
70
73
  checkoutError?: string;
71
74
  checklistAttestations?: readonly ChecklistAttestation[];
75
+ /** Re-runs the Host login check against the stage's own browser session. */
76
+ browserLogin?: () => Promise<{
77
+ state: "logged_in" | "logged_out" | "unknown";
78
+ logged_in: boolean | null;
79
+ url: string;
80
+ }>;
72
81
  onCheckStart?: (check: CompletionCheck) => Promise<void> | void;
73
82
  onCheckComplete?: (result: CompletionCheckResult) => Promise<void> | void;
74
83
  };
@@ -115,7 +124,12 @@ export type ChecklistCheckEvidence = {
115
124
  missing_items: string[];
116
125
  unexpected_items: string[];
117
126
  };
118
- export type CompletionCheckEvidence = CommandCheckEvidence | ArtifactCheckEvidence | PayloadSchemaCheckEvidence | GateCheckEvidence | CheckoutChangesCheckEvidence | ChecklistCheckEvidence;
127
+ export type BrowserLoginCheckEvidence = {
128
+ kind: "browser_login";
129
+ state?: "logged_in" | "logged_out" | "unknown";
130
+ url?: string;
131
+ };
132
+ export type CompletionCheckEvidence = BrowserLoginCheckEvidence | CommandCheckEvidence | ArtifactCheckEvidence | PayloadSchemaCheckEvidence | GateCheckEvidence | CheckoutChangesCheckEvidence | ChecklistCheckEvidence;
119
133
  export type CompletionCheckResult = {
120
134
  check_id: string;
121
135
  check_type: CompletionCheck["type"];
@@ -3,7 +3,12 @@ import { spawn } from "node:child_process";
3
3
  import { lstat, readFile } from "node:fs/promises";
4
4
  import path from "node:path";
5
5
  import { assertEnvelopePayload } from "../envelope/payloadSchema.js";
6
+ import { resolveBashPath } from "../preflight/bash.js";
7
+ import { redactString } from "../logging/redact.js";
8
+ import { getNamedSecrets } from "../logging/namedSecrets.js";
9
+ import { signalProcessGroup } from "./stageProcessLauncher.js";
6
10
  const MAX_COMMAND_OUTPUT_BYTES = 64 * 1024;
11
+ const COMMAND_KILL_ESCALATE_MS = 2000;
7
12
  function captureOutput(chunks, chunk, currentSize) {
8
13
  const remaining = MAX_COMMAND_OUTPUT_BYTES - currentSize;
9
14
  if (remaining <= 0)
@@ -23,19 +28,26 @@ export const nodeCommandExecutor = {
23
28
  let timedOut = false;
24
29
  let settled = false;
25
30
  let timeout;
31
+ let escalateTimer;
26
32
  const finish = (result) => {
27
33
  if (settled)
28
34
  return;
29
35
  settled = true;
30
36
  if (timeout)
31
37
  clearTimeout(timeout);
38
+ // When timed out, keep escalateTimer so SIGKILL still runs after the
39
+ // grace window even if the parent already exited cooperatively.
40
+ if (escalateTimer && !timedOut)
41
+ clearTimeout(escalateTimer);
32
42
  resolve(result);
33
43
  };
34
44
  let child;
35
45
  try {
36
- child = spawn(input.command, {
46
+ const bash = resolveBashPath(input.env ?? process.env);
47
+ child = spawn(bash, ["-c", input.command], {
37
48
  cwd: input.cwd,
38
- shell: true,
49
+ env: input.env,
50
+ detached: true,
39
51
  stdio: ["ignore", "pipe", "pipe"],
40
52
  });
41
53
  }
@@ -55,6 +67,12 @@ export const nodeCommandExecutor = {
55
67
  child.stderr?.on("data", (data) => {
56
68
  stderrSize = captureOutput(stderr, Buffer.from(data), stderrSize);
57
69
  });
70
+ child.once("exit", () => {
71
+ if (timedOut) {
72
+ // Parent may exit on SIGTERM while SIGTERM-proof grandchildren remain.
73
+ signalProcessGroup(child.pid, "SIGKILL");
74
+ }
75
+ });
58
76
  child.once("error", (error) => {
59
77
  finish({
60
78
  exit_code: null,
@@ -75,7 +93,12 @@ export const nodeCommandExecutor = {
75
93
  if (input.timeout_ms !== undefined) {
76
94
  timeout = setTimeout(() => {
77
95
  timedOut = true;
78
- child.kill("SIGTERM");
96
+ const pid = child.pid;
97
+ signalProcessGroup(pid, "SIGTERM");
98
+ escalateTimer = setTimeout(() => {
99
+ // Always escalate after the grace window regardless of exited.
100
+ signalProcessGroup(pid, "SIGKILL");
101
+ }, COMMAND_KILL_ESCALATE_MS);
79
102
  }, input.timeout_ms);
80
103
  }
81
104
  });
@@ -101,16 +124,31 @@ async function runCommandCheck(check, input) {
101
124
  const cwd = resolveCommandCwd(check, base);
102
125
  const executor = input.commandExecutor ?? nodeCommandExecutor;
103
126
  try {
104
- const execution = await executor.run({ command: check.run, cwd, timeout_ms: check.timeout_ms });
127
+ const execution = await executor.run({
128
+ command: check.run,
129
+ cwd,
130
+ timeout_ms: check.timeout_ms,
131
+ ...(input.commandEnv !== undefined ? { env: input.commandEnv } : {}),
132
+ });
105
133
  const evidence = {
106
134
  kind: "command",
107
135
  command: check.run,
108
136
  cwd,
109
137
  exit_code: execution.exit_code,
110
- stdout: execution.stdout,
111
- stderr: execution.stderr,
138
+ stdout: redactString(execution.stdout, {
139
+ namedSecrets: getNamedSecrets(),
140
+ }),
141
+ stderr: redactString(execution.stderr, {
142
+ namedSecrets: getNamedSecrets(),
143
+ }),
112
144
  timed_out: execution.timed_out,
113
- ...(execution.error !== undefined ? { error: execution.error } : {}),
145
+ ...(execution.error !== undefined
146
+ ? {
147
+ error: redactString(execution.error, {
148
+ namedSecrets: getNamedSecrets(),
149
+ }),
150
+ }
151
+ : {}),
114
152
  };
115
153
  if (execution.timed_out)
116
154
  return result(check, "failed", evidence, "command timed out");
@@ -326,6 +364,26 @@ function runChecklistCheck(check, input) {
326
364
  }
327
365
  return result(check, "passed", evidence);
328
366
  }
367
+ async function runBrowserLoginCheck(check, input) {
368
+ const empty = { kind: "browser_login" };
369
+ if (input.browserLogin === undefined) {
370
+ return result(check, "error", empty, "browser_login check requires a browser session");
371
+ }
372
+ try {
373
+ const observed = await input.browserLogin();
374
+ const evidence = {
375
+ kind: "browser_login",
376
+ state: observed.state,
377
+ url: observed.url,
378
+ };
379
+ return observed.logged_in === true
380
+ ? result(check, "passed", evidence)
381
+ : result(check, "failed", evidence, `the Host login check still sees a ${observed.state === "unknown" ? "session it cannot confirm" : "logged-out session"}`);
382
+ }
383
+ catch (error) {
384
+ return result(check, "error", empty, error instanceof Error ? error.message : String(error));
385
+ }
386
+ }
329
387
  async function runCheck(check, input) {
330
388
  switch (check.type) {
331
389
  case "command":
@@ -340,6 +398,8 @@ async function runCheck(check, input) {
340
398
  return runCheckoutChangesCheck(check, input);
341
399
  case "checklist":
342
400
  return runChecklistCheck(check, input);
401
+ case "browser_login":
402
+ return runBrowserLoginCheck(check, input);
343
403
  }
344
404
  }
345
405
  /**
@@ -0,0 +1,16 @@
1
+ import os from "node:os";
2
+ export type ContainerLimits = {
3
+ memoryLimitBytes: number | undefined;
4
+ maxActiveStageProcesses: number;
5
+ maxOldSpaceSizeMb: number;
6
+ source: "cgroup-v2" | "cgroup-v1" | "fallback";
7
+ };
8
+ export declare function readContainerMemoryLimit(roots?: readonly string[]): {
9
+ bytes: number | undefined;
10
+ source: ContainerLimits["source"];
11
+ };
12
+ export declare function deriveContainerLimits(memoryLimitBytes: number | undefined, source?: ContainerLimits["source"]): ContainerLimits;
13
+ export declare function getContainerLimits(): ContainerLimits;
14
+ export declare function resetContainerLimitsForTests(): void;
15
+ /** Test hook: prove sizing never consults os.totalmem. */
16
+ export declare function assertNoOsTotalmemInSizing(): typeof os.totalmem;
@@ -0,0 +1,84 @@
1
+ import { readFileSync, existsSync } from "node:fs";
2
+ import os from "node:os";
3
+ const HOST_RESERVE_MIB = 512;
4
+ const WORKER_BUDGET_MIB = 512;
5
+ const MAX_CAP = 8;
6
+ const FALLBACK_CAP = 4;
7
+ const FALLBACK_HEAP_MIB = 512;
8
+ const V1_SENTINEL = 9223372036854771712n;
9
+ function parseCgroupMemory(raw) {
10
+ const trimmed = raw.trim();
11
+ if (trimmed === "" || trimmed === "max")
12
+ return undefined;
13
+ let n;
14
+ try {
15
+ n = BigInt(trimmed);
16
+ }
17
+ catch {
18
+ return undefined;
19
+ }
20
+ if (n <= 0n || n >= V1_SENTINEL)
21
+ return undefined;
22
+ if (n > BigInt(Number.MAX_SAFE_INTEGER))
23
+ return undefined;
24
+ return Number(n);
25
+ }
26
+ export function readContainerMemoryLimit(roots = ["/sys/fs/cgroup"]) {
27
+ for (const root of roots) {
28
+ const v2 = `${root}/memory.max`;
29
+ if (existsSync(v2)) {
30
+ try {
31
+ const bytes = parseCgroupMemory(readFileSync(v2, "utf8"));
32
+ return { bytes, source: bytes === undefined ? "fallback" : "cgroup-v2" };
33
+ }
34
+ catch {
35
+ // continue
36
+ }
37
+ }
38
+ const v1 = `${root}/memory/memory.limit_in_bytes`;
39
+ if (existsSync(v1)) {
40
+ try {
41
+ const bytes = parseCgroupMemory(readFileSync(v1, "utf8"));
42
+ return { bytes, source: bytes === undefined ? "fallback" : "cgroup-v1" };
43
+ }
44
+ catch {
45
+ // continue
46
+ }
47
+ }
48
+ }
49
+ return { bytes: undefined, source: "fallback" };
50
+ }
51
+ export function deriveContainerLimits(memoryLimitBytes, source = "fallback") {
52
+ if (memoryLimitBytes === undefined) {
53
+ return {
54
+ memoryLimitBytes: undefined,
55
+ maxActiveStageProcesses: FALLBACK_CAP,
56
+ maxOldSpaceSizeMb: FALLBACK_HEAP_MIB,
57
+ source: "fallback",
58
+ };
59
+ }
60
+ const limitMib = Math.floor(memoryLimitBytes / (1024 * 1024));
61
+ const workerBudget = Math.max(1, limitMib - HOST_RESERVE_MIB);
62
+ const cap = Math.min(MAX_CAP, Math.max(1, Math.floor(workerBudget / WORKER_BUDGET_MIB)));
63
+ return {
64
+ memoryLimitBytes,
65
+ maxActiveStageProcesses: cap,
66
+ maxOldSpaceSizeMb: WORKER_BUDGET_MIB,
67
+ source,
68
+ };
69
+ }
70
+ let cached;
71
+ export function getContainerLimits() {
72
+ if (cached === undefined) {
73
+ const { bytes, source } = readContainerMemoryLimit();
74
+ cached = deriveContainerLimits(bytes, source);
75
+ }
76
+ return cached;
77
+ }
78
+ export function resetContainerLimitsForTests() {
79
+ cached = undefined;
80
+ }
81
+ /** Test hook: prove sizing never consults os.totalmem. */
82
+ export function assertNoOsTotalmemInSizing() {
83
+ return os.totalmem;
84
+ }
@@ -11,6 +11,8 @@ export type ResolveCredentialBindingOptions = {
11
11
  };
12
12
  export declare function sfOwnedAgentDir(): string;
13
13
  export declare function sfOwnedAuthPath(): string;
14
+ export declare const PI_HOME_AUTH_PATH_ENV = "STAGEFLOW_PI_HOME_AUTH_PATH";
15
+ /** A stage worker's HOME is an empty attempt dir, so the Host passes its own Pi auth path through the environment. */
14
16
  export declare function piHomeAuthPath(override?: string): string;
15
17
  export declare function isUsableAuthFile(authPath: string): boolean;
16
18
  export declare function ensureSfOwnedAuthStore(): string;
@@ -11,8 +11,11 @@ export function sfOwnedAgentDir() {
11
11
  export function sfOwnedAuthPath() {
12
12
  return path.join(sfOwnedAgentDir(), "auth.json");
13
13
  }
14
+ export const PI_HOME_AUTH_PATH_ENV = "STAGEFLOW_PI_HOME_AUTH_PATH";
15
+ /** A stage worker's HOME is an empty attempt dir, so the Host passes its own Pi auth path through the environment. */
14
16
  export function piHomeAuthPath(override) {
15
17
  return (override ??
18
+ (process.env[PI_HOME_AUTH_PATH_ENV] || undefined) ??
16
19
  path.join(os.homedir(), ".pi", "agent", "auth.json"));
17
20
  }
18
21
  export function isUsableAuthFile(authPath) {
@@ -0,0 +1,28 @@
1
+ export type MaterialiseCopyResult = {
2
+ destPath: string;
3
+ mode: number;
4
+ };
5
+ export declare class CredentialMaterialisationError extends Error {
6
+ readonly code: "symlink_rejected" | "escape_rejected" | "source_missing" | "not_a_file";
7
+ constructor(message: string, code: CredentialMaterialisationError["code"]);
8
+ }
9
+ export declare function attemptCredentialsDir(attemptDir: string, secretName: string): string;
10
+ /** Copy a Host source file into attempt credentials with mode 0400. */
11
+ export declare function materialiseCredentialFile(options: {
12
+ sourcePath: string;
13
+ destDir: string;
14
+ destBasename?: string;
15
+ allowedRoot?: string;
16
+ }): MaterialiseCopyResult;
17
+ export declare function materialiseSecretBytes(options: {
18
+ contents: string | Buffer;
19
+ destDir: string;
20
+ destBasename: string;
21
+ }): MaterialiseCopyResult;
22
+ export declare function cleanupCredentialsDir(attemptDir: string): void;
23
+ export declare function stageAskpassHelperPath(home?: string): string;
24
+ export declare function ensureStageAskpassHelper(home?: string): string;
25
+ export declare function readFileCredentialRegistry(home?: string): Record<string, {
26
+ source: string;
27
+ pointerVar: string;
28
+ }>;
@@ -0,0 +1,128 @@
1
+ import { chmodSync, copyFileSync, existsSync, lstatSync, mkdirSync, readFileSync, realpathSync, rmSync, writeFileSync, } from "node:fs";
2
+ import path from "node:path";
3
+ import { ensureGlobalHome, globalStageflowHome } from "../project/globalHome.js";
4
+ export class CredentialMaterialisationError extends Error {
5
+ code;
6
+ constructor(message, code) {
7
+ super(message);
8
+ this.name = "CredentialMaterialisationError";
9
+ this.code = code;
10
+ }
11
+ }
12
+ export function attemptCredentialsDir(attemptDir, secretName) {
13
+ return path.join(attemptDir, "credentials", secretName);
14
+ }
15
+ /** Copy a Host source file into attempt credentials with mode 0400. */
16
+ export function materialiseCredentialFile(options) {
17
+ const sourcePath = path.resolve(options.sourcePath);
18
+ let stat;
19
+ try {
20
+ stat = lstatSync(sourcePath);
21
+ }
22
+ catch {
23
+ throw new CredentialMaterialisationError(`credential source missing: ${sourcePath}`, "source_missing");
24
+ }
25
+ if (stat.isSymbolicLink()) {
26
+ throw new CredentialMaterialisationError(`credential source must not be a symlink: ${sourcePath}`, "symlink_rejected");
27
+ }
28
+ if (!stat.isFile()) {
29
+ throw new CredentialMaterialisationError(`credential source must be a regular file: ${sourcePath}`, "not_a_file");
30
+ }
31
+ const realSource = realpathSync(sourcePath);
32
+ if (options.allowedRoot !== undefined) {
33
+ let root = path.resolve(options.allowedRoot);
34
+ try {
35
+ root = realpathSync(root);
36
+ }
37
+ catch {
38
+ // allowed root may not exist yet; keep resolved path
39
+ }
40
+ if (realSource !== root && !realSource.startsWith(root + path.sep)) {
41
+ throw new CredentialMaterialisationError(`credential source escapes allowed root: ${sourcePath}`, "escape_rejected");
42
+ }
43
+ }
44
+ mkdirSync(options.destDir, { recursive: true, mode: 0o700 });
45
+ const destPath = path.join(options.destDir, options.destBasename ?? path.basename(realSource));
46
+ copyFileSync(realSource, destPath);
47
+ try {
48
+ chmodSync(destPath, 0o400);
49
+ }
50
+ catch {
51
+ // best-effort on non-POSIX
52
+ }
53
+ return { destPath, mode: 0o400 };
54
+ }
55
+ export function materialiseSecretBytes(options) {
56
+ mkdirSync(options.destDir, { recursive: true, mode: 0o700 });
57
+ const destPath = path.join(options.destDir, options.destBasename);
58
+ writeFileSync(destPath, options.contents, { mode: 0o400 });
59
+ try {
60
+ chmodSync(destPath, 0o400);
61
+ }
62
+ catch {
63
+ // best-effort
64
+ }
65
+ return { destPath, mode: 0o400 };
66
+ }
67
+ export function cleanupCredentialsDir(attemptDir) {
68
+ const root = path.join(attemptDir, "credentials");
69
+ if (!existsSync(root))
70
+ return;
71
+ rmSync(root, { recursive: true, force: true });
72
+ }
73
+ const STAGE_ASKPASS_BASENAME = "git-askpass-stage";
74
+ const STAGE_ASKPASS_SCRIPT = `#!/bin/sh
75
+ prompt=\${1-}
76
+ case "\$prompt" in
77
+ *Username*|*username*)
78
+ printf '%s\\n' 'x-access-token'
79
+ ;;
80
+ *)
81
+ token=
82
+ if [ -n "\${STAGEFLOW_GIT_ASKPASS_TOKEN_FILE-}" ] && [ -f "\$STAGEFLOW_GIT_ASKPASS_TOKEN_FILE" ]; then
83
+ token=\$(cat "\$STAGEFLOW_GIT_ASKPASS_TOKEN_FILE")
84
+ fi
85
+ printf '%s\\n' "\$token"
86
+ ;;
87
+ esac
88
+ `;
89
+ export function stageAskpassHelperPath(home = globalStageflowHome()) {
90
+ return path.join(home, STAGE_ASKPASS_BASENAME);
91
+ }
92
+ export function ensureStageAskpassHelper(home) {
93
+ const resolvedHome = home ?? ensureGlobalHome();
94
+ mkdirSync(resolvedHome, { recursive: true });
95
+ const askpass = stageAskpassHelperPath(resolvedHome);
96
+ writeFileSync(askpass, STAGE_ASKPASS_SCRIPT, { encoding: "utf8", mode: 0o700 });
97
+ try {
98
+ chmodSync(askpass, 0o700);
99
+ }
100
+ catch {
101
+ // best-effort
102
+ }
103
+ return askpass;
104
+ }
105
+ export function readFileCredentialRegistry(home = globalStageflowHome()) {
106
+ const registryPath = path.join(home, "secrets", "file-credentials.json");
107
+ if (!existsSync(registryPath))
108
+ return {};
109
+ try {
110
+ const raw = JSON.parse(readFileSync(registryPath, "utf8"));
111
+ if (!raw || typeof raw !== "object" || Array.isArray(raw))
112
+ return {};
113
+ const out = {};
114
+ for (const [name, entry] of Object.entries(raw)) {
115
+ if (!entry || typeof entry !== "object" || Array.isArray(entry))
116
+ continue;
117
+ const e = entry;
118
+ if (typeof e.source !== "string" || typeof e.pointerVar !== "string") {
119
+ continue;
120
+ }
121
+ out[name] = { source: e.source, pointerVar: e.pointerVar };
122
+ }
123
+ return out;
124
+ }
125
+ catch {
126
+ return {};
127
+ }
128
+ }
@@ -0,0 +1,72 @@
1
+ import type { RunStore } from "../runstore/port.js";
2
+ import type { TriggerFireEvent, TriggerSourcePort } from "./triggerPort.js";
3
+ export declare const DEFAULT_EMAIL_RECONNECT_BASE_DELAY_MS = 1000;
4
+ export declare const DEFAULT_EMAIL_RECONNECT_MAX_DELAY_MS = 30000;
5
+ export declare const EMAIL_TEXT_EXCERPT_MAX_CHARS = 2000;
6
+ export type NormalizedEmailMessage = {
7
+ uid: number;
8
+ from: string;
9
+ subject: string;
10
+ date: string;
11
+ text: string;
12
+ };
13
+ export type EmailClientConfig = {
14
+ host: string;
15
+ port: number;
16
+ user: string;
17
+ password: string;
18
+ };
19
+ /**
20
+ * Narrow, test-friendly seam over "one IMAP/IDLE mailbox connection". The
21
+ * default implementation adapts `imapflow`'s `ImapFlow`; tests inject a fake
22
+ * so no real mailbox is ever contacted.
23
+ */
24
+ export type EmailImapClient = {
25
+ connect(): Promise<{
26
+ uidNext: number;
27
+ }>;
28
+ idle(): void;
29
+ fetchNewMessages(sinceUid: number): Promise<NormalizedEmailMessage[]>;
30
+ close(): Promise<void>;
31
+ onExists(listener: () => void): void;
32
+ onClose(listener: () => void): void;
33
+ onError(listener: (err: Error) => void): void;
34
+ };
35
+ export type EmailSourceOptions = {
36
+ store: RunStore;
37
+ cwd?: string;
38
+ logError?: (message: string) => void;
39
+ env?: NodeJS.ProcessEnv;
40
+ /** Injectable client factory so tests never hit a real mailbox. */
41
+ createEmailClient?: (config: EmailClientConfig) => EmailImapClient;
42
+ reconnectBaseDelayMs?: number;
43
+ reconnectMaxDelayMs?: number;
44
+ };
45
+ /**
46
+ * `TriggerSourcePort` adapter for `event`-kind triggers whose `event.source`
47
+ * starts with `email.`. Unlike the poll-based adapters this one is push-based:
48
+ * on `start()` it groups triggers by distinct mailbox (`host`+`port`+`user`),
49
+ * opens exactly one real IMAP/IDLE connection per mailbox regardless of how
50
+ * many triggers watch it, and reacts to the server's new-message
51
+ * notification instead of ticking on an interval. A dropped connection
52
+ * reconnects with bounded exponential backoff rather than going dark.
53
+ */
54
+ export declare class EmailSource implements TriggerSourcePort {
55
+ private readonly store;
56
+ private readonly cwd;
57
+ private readonly logError;
58
+ private readonly env;
59
+ private readonly createEmailClient;
60
+ private readonly reconnectBaseDelayMs;
61
+ private readonly reconnectMaxDelayMs;
62
+ private readonly connections;
63
+ private stopped;
64
+ constructor(options: EmailSourceOptions);
65
+ start(onFire: (event: TriggerFireEvent) => Promise<void>): Promise<void>;
66
+ stop(): Promise<void>;
67
+ private discover;
68
+ private connectMailbox;
69
+ private scheduleReconnect;
70
+ private processNewMail;
71
+ private fireSafely;
72
+ }