stageflow 0.32.0 → 0.35.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 (335) hide show
  1. package/README.md +4 -3
  2. package/dist/agent/adapterSpill.d.ts +14 -0
  3. package/dist/agent/adapterSpill.js +83 -0
  4. package/dist/agent/agentBackend.d.ts +2 -2
  5. package/dist/agent/agentBackend.js +2 -2
  6. package/dist/agent/claudeAdapter.d.ts +13 -2
  7. package/dist/agent/claudeAdapter.js +50 -6
  8. package/dist/agent/cursorProvider.d.ts +3 -0
  9. package/dist/agent/cursorProvider.js +23 -6
  10. package/dist/agent/fakeAgent.d.ts +3 -3
  11. package/dist/agent/fakeAgent.js +0 -6
  12. package/dist/agent/piAdapter.d.ts +2 -2
  13. package/dist/agent/piAdapter.js +116 -15
  14. package/dist/agent/piIsolatedMcp.d.ts +1 -0
  15. package/dist/agent/piIsolatedMcp.js +19 -1
  16. package/dist/agent/piIsolatedMcpProbe.d.ts +11 -0
  17. package/dist/agent/piIsolatedMcpProbe.js +20 -0
  18. package/dist/agent/port.d.ts +2 -2
  19. package/dist/agent/providerAuth.d.ts +6 -0
  20. package/dist/agent/providerAuth.js +86 -17
  21. package/dist/agent/{resolveAgentPort.d.ts → resolveStagePort.d.ts} +8 -6
  22. package/dist/agent/{resolveAgentPort.js → resolveStagePort.js} +13 -9
  23. package/dist/agent/stageTurnDriver.d.ts +33 -0
  24. package/dist/agent/stageTurnDriver.js +64 -0
  25. package/dist/agent/toolOutputBudget.d.ts +46 -0
  26. package/dist/agent/toolOutputBudget.js +97 -0
  27. package/dist/agent/toolOutputBudgetExtension.d.ts +22 -0
  28. package/dist/agent/toolOutputBudgetExtension.js +141 -0
  29. package/dist/agent/toolOutputSpill.d.ts +34 -0
  30. package/dist/agent/toolOutputSpill.js +85 -0
  31. package/dist/browser/agentBrowserLiveViewRelay.d.ts +41 -0
  32. package/dist/browser/agentBrowserLiveViewRelay.js +801 -0
  33. package/dist/browser/anchor.d.ts +2 -0
  34. package/dist/browser/anchor.js +2 -1
  35. package/dist/browser/auditSink.d.ts +8 -0
  36. package/dist/browser/browserHost.d.ts +29 -0
  37. package/dist/browser/browserSweep.d.ts +4 -1
  38. package/dist/browser/browserSweep.js +7 -0
  39. package/dist/browser/browserTeardown.d.ts +1 -0
  40. package/dist/browser/browserTeardown.js +32 -2
  41. package/dist/browser/containerBrowserEndpoint.d.ts +11 -0
  42. package/dist/browser/containerBrowserEndpoint.js +57 -0
  43. package/dist/browser/containerBrowserHost.d.ts +24 -0
  44. package/dist/browser/containerBrowserHost.js +147 -0
  45. package/dist/browser/dockerSandboxOrchestrator.d.ts +26 -0
  46. package/dist/browser/dockerSandboxOrchestrator.js +142 -0
  47. package/dist/browser/fakeLiveViewRelay.d.ts +15 -0
  48. package/dist/browser/fakeLiveViewRelay.js +94 -0
  49. package/dist/browser/fakeLiveViewSource.d.ts +6 -0
  50. package/dist/browser/fakeLiveViewSource.js +16 -0
  51. package/dist/browser/fakeRemoteBrowserHost.d.ts +2 -1
  52. package/dist/browser/fakeRemoteBrowserHost.js +2 -1
  53. package/dist/browser/fakeSandboxOrchestrator.d.ts +9 -0
  54. package/dist/browser/fakeSandboxOrchestrator.js +44 -0
  55. package/dist/browser/gateHandoff.d.ts +0 -2
  56. package/dist/browser/gateHandoff.js +5 -11
  57. package/dist/browser/hostCapabilities.d.ts +23 -0
  58. package/dist/browser/hostCapabilities.js +23 -0
  59. package/dist/browser/humanLogin.d.ts +2 -2
  60. package/dist/browser/humanLogin.js +11 -2
  61. package/dist/browser/liveViewPersisted.d.ts +11 -0
  62. package/dist/browser/liveViewPersisted.js +22 -0
  63. package/dist/browser/liveViewRelay.d.ts +76 -0
  64. package/dist/browser/liveViewRelay.js +1 -0
  65. package/dist/browser/liveViewSessions.d.ts +25 -0
  66. package/dist/browser/liveViewSessions.js +139 -0
  67. package/dist/browser/liveViewSource.d.ts +25 -0
  68. package/dist/browser/liveViewSource.js +7 -0
  69. package/dist/browser/liveViewTickets.d.ts +46 -0
  70. package/dist/browser/liveViewTickets.js +122 -0
  71. package/dist/browser/localBrowserHost.d.ts +10 -0
  72. package/dist/browser/localBrowserHost.js +53 -7
  73. package/dist/browser/ownerScope.d.ts +10 -0
  74. package/dist/browser/ownerScope.js +6 -0
  75. package/dist/browser/profileStore.d.ts +5 -2
  76. package/dist/browser/profileStore.js +3 -5
  77. package/dist/browser/sandboxOrchestrator.d.ts +60 -0
  78. package/dist/browser/sandboxOrchestrator.js +8 -0
  79. package/dist/browser/sessionApiSandboxOrchestrator.d.ts +34 -0
  80. package/dist/browser/sessionApiSandboxOrchestrator.js +108 -0
  81. package/dist/browser/stageBrowserEnv.d.ts +7 -0
  82. package/dist/browser/stageBrowserEnv.js +53 -15
  83. package/dist/browser/stageHandoff.d.ts +47 -0
  84. package/dist/browser/stageHandoff.js +101 -0
  85. package/dist/browser/stageProfileLock.d.ts +1 -0
  86. package/dist/browser/stageProfileLock.js +1 -3
  87. package/dist/browser/volumeProfileStore.d.ts +7 -0
  88. package/dist/browser/volumeProfileStore.js +35 -0
  89. package/dist/cli/browserCommand.d.ts +3 -1
  90. package/dist/cli/browserCommand.js +25 -20
  91. package/dist/cli/resolveCliProjectRoot.d.ts +7 -0
  92. package/dist/cli/resolveCliProjectRoot.js +27 -0
  93. package/dist/cli/runCommand.d.ts +1 -1
  94. package/dist/cli/runCommand.js +59 -17
  95. package/dist/cli/skillsCommand.d.ts +20 -0
  96. package/dist/cli/skillsCommand.js +74 -31
  97. package/dist/cli/validateCommand.d.ts +1 -1
  98. package/dist/cli/validateCommand.js +22 -4
  99. package/dist/cli.js +4 -4
  100. package/dist/config/browseCatalog.d.ts +2 -0
  101. package/dist/config/browseCatalog.js +6 -0
  102. package/dist/config/catalogRelativePath.d.ts +4 -0
  103. package/dist/config/catalogRelativePath.js +37 -9
  104. package/dist/config/createStage.d.ts +1 -0
  105. package/dist/config/createStage.js +11 -2
  106. package/dist/config/createTask.d.ts +30 -0
  107. package/dist/config/createTask.js +161 -0
  108. package/dist/config/createTrigger.d.ts +15 -0
  109. package/dist/config/createTrigger.js +32 -25
  110. package/dist/config/draftPackage.d.ts +41 -0
  111. package/dist/config/draftPackage.js +216 -23
  112. package/dist/config/ensureCatalogScanRoot.d.ts +2 -1
  113. package/dist/config/ensureCatalogScanRoot.js +6 -2
  114. package/dist/config/findTaskInCatalog.d.ts +33 -0
  115. package/dist/config/findTaskInCatalog.js +69 -0
  116. package/dist/config/hostConfig.d.ts +21 -0
  117. package/dist/config/hostConfig.js +113 -1
  118. package/dist/config/importTask.d.ts +19 -0
  119. package/dist/config/importTask.js +133 -0
  120. package/dist/config/installSkillRequest.d.ts +40 -0
  121. package/dist/config/installSkillRequest.js +286 -0
  122. package/dist/config/listConfig.d.ts +0 -16
  123. package/dist/config/listConfig.js +0 -3
  124. package/dist/config/loadOutcome.d.ts +11 -6
  125. package/dist/config/loadPipeline.js +0 -1
  126. package/dist/config/loadStage.js +2 -0
  127. package/dist/config/loadStageflowManifest.js +4 -1
  128. package/dist/config/loadTask.js +2 -0
  129. package/dist/config/loadTrigger.js +2 -0
  130. package/dist/config/mergePipelineIncludes.js +3 -0
  131. package/dist/config/normalizePipelineStageEntry.js +10 -1
  132. package/dist/config/printTargetYaml.js +0 -1
  133. package/dist/config/publishDraftPackage.d.ts +5 -1
  134. package/dist/config/publishDraftPackage.js +4 -1
  135. package/dist/config/resolveCatalogRoots.d.ts +4 -1
  136. package/dist/config/resolveCatalogRoots.js +18 -1
  137. package/dist/config/skillUsageIndex.d.ts +6 -0
  138. package/dist/config/skillUsageIndex.js +39 -0
  139. package/dist/config/stageBrowser.js +13 -0
  140. package/dist/config/triggerAdapterStatus.d.ts +11 -0
  141. package/dist/config/triggerAdapterStatus.js +90 -0
  142. package/dist/config/triggerCatalog.d.ts +41 -2
  143. package/dist/config/triggerCatalog.js +107 -15
  144. package/dist/config/updateTask.d.ts +30 -0
  145. package/dist/config/updateTask.js +119 -0
  146. package/dist/config/updateTrigger.d.ts +38 -0
  147. package/dist/config/updateTrigger.js +220 -0
  148. package/dist/config/validateCatalog.d.ts +6 -2
  149. package/dist/config/validateCatalog.js +48 -7
  150. package/dist/config/workshopCatalogFilenames.d.ts +37 -0
  151. package/dist/config/workshopCatalogFilenames.js +125 -0
  152. package/dist/config/workshopCatalogRepair.d.ts +7 -0
  153. package/dist/config/workshopCatalogRepair.js +144 -0
  154. package/dist/config/yamlParsePosition.d.ts +4 -0
  155. package/dist/config/yamlParsePosition.js +9 -0
  156. package/dist/hosted/containment.d.ts +3 -0
  157. package/dist/hosted/containment.js +36 -0
  158. package/dist/hosted/errors.d.ts +21 -0
  159. package/dist/hosted/errors.js +30 -0
  160. package/dist/hosted/packageSkills.d.ts +3 -0
  161. package/dist/hosted/packageSkills.js +80 -0
  162. package/dist/hosted/runtime.d.ts +12 -0
  163. package/dist/hosted/runtime.js +596 -0
  164. package/dist/hosted/sequencer.d.ts +28 -0
  165. package/dist/hosted/sequencer.js +129 -0
  166. package/dist/hosted/translate.d.ts +3 -0
  167. package/dist/hosted/translate.js +43 -0
  168. package/dist/hosted/types.d.ts +108 -0
  169. package/dist/hosted/types.js +10 -0
  170. package/dist/index.d.ts +9 -1
  171. package/dist/index.js +6 -0
  172. package/dist/mcp/getStartedTool.js +15 -6
  173. package/dist/mcp/triggerTools.js +2 -8
  174. package/dist/operatorAgent/agentPort.d.ts +11 -0
  175. package/dist/operatorAgent/agentPort.js +12 -0
  176. package/dist/operatorAgent/index.d.ts +1 -0
  177. package/dist/operatorAgent/index.js +1 -0
  178. package/dist/operatorAgent/piModel.js +26 -6
  179. package/dist/operatorAgent/profiles/workshopAuthorPlaybook.d.ts +1 -1
  180. package/dist/operatorAgent/profiles/workshopAuthorPlaybook.js +4 -2
  181. package/dist/operatorAgent/profiles/workshopAuthorTools.js +103 -16
  182. package/dist/package-meta.d.ts +1 -1
  183. package/dist/package-meta.js +1 -1
  184. package/dist/project/ensureProjectRootsFromEnv.d.ts +3 -0
  185. package/dist/project/ensureProjectRootsFromEnv.js +22 -0
  186. package/dist/project/globalHome.d.ts +1 -0
  187. package/dist/project/globalHome.js +18 -0
  188. package/dist/project/workspaceCatalog.d.ts +10 -0
  189. package/dist/project/workspaceCatalog.js +91 -0
  190. package/dist/projection/projectRun.d.ts +0 -1
  191. package/dist/projection/projectRun.js +0 -1
  192. package/dist/runstore/backup.js +14 -4
  193. package/dist/runstore/port.d.ts +11 -1
  194. package/dist/runstore/restore.js +5 -2
  195. package/dist/runstore/sqlite/SqliteRunStore.d.ts +8 -0
  196. package/dist/runstore/sqlite/SqliteRunStore.js +29 -9
  197. package/dist/runstore/sqlite/migrations/012-trigger-fires.d.ts +7 -0
  198. package/dist/runstore/sqlite/migrations/012-trigger-fires.js +18 -0
  199. package/dist/runstore/sqlite/migrations/index.js +2 -0
  200. package/dist/runstore/stageSnapshot.d.ts +3 -1
  201. package/dist/runstore/stageSnapshot.js +19 -0
  202. package/dist/runstore/workspaceLayout.js +27 -0
  203. package/dist/runstore/writeContainedArtifact.d.ts +1 -0
  204. package/dist/runstore/writeContainedArtifact.js +52 -0
  205. package/dist/runtime/containerLimits.d.ts +0 -3
  206. package/dist/runtime/containerLimits.js +0 -5
  207. package/dist/runtime/credentialBinding.d.ts +3 -0
  208. package/dist/runtime/credentialBinding.js +23 -6
  209. package/dist/runtime/emailSource.js +20 -28
  210. package/dist/runtime/githubPollSource.js +20 -28
  211. package/dist/runtime/pipelineRunner.d.ts +4 -4
  212. package/dist/runtime/pipelineScheduler.d.ts +2 -2
  213. package/dist/runtime/pipelineScheduler.js +3 -0
  214. package/dist/runtime/resumeReconstruct.d.ts +2 -2
  215. package/dist/runtime/resumeTimedOut.d.ts +2 -2
  216. package/dist/runtime/runManager.d.ts +18 -2
  217. package/dist/runtime/runManager.js +95 -30
  218. package/dist/runtime/runRetentionSweep.d.ts +0 -2
  219. package/dist/runtime/runRetentionSweep.js +0 -8
  220. package/dist/runtime/runRetryCoordinator.d.ts +2 -2
  221. package/dist/runtime/scheduleSource.js +15 -24
  222. package/dist/runtime/stageAttemptBootstrap.d.ts +2 -2
  223. package/dist/runtime/stageAttemptBootstrap.js +10 -1
  224. package/dist/runtime/stageProcessLauncher.js +2 -2
  225. package/dist/runtime/stageRoots.js +12 -1
  226. package/dist/runtime/stageRunner.d.ts +2 -2
  227. package/dist/runtime/stageRunner.js +8 -2
  228. package/dist/runtime/stageWorker.js +2 -2
  229. package/dist/runtime/triggerPort.d.ts +5 -3
  230. package/dist/runtime/triggerRunner.d.ts +1 -0
  231. package/dist/runtime/triggerRunner.js +27 -20
  232. package/dist/runtime/webhookAccept.d.ts +25 -0
  233. package/dist/runtime/webhookAccept.js +56 -0
  234. package/dist/server/bootstrap.d.ts +7 -2
  235. package/dist/server/bootstrap.js +15 -1
  236. package/dist/server/controlToken.d.ts +1 -1
  237. package/dist/server/controlToken.js +18 -2
  238. package/dist/server/healthSurfaces.d.ts +12 -0
  239. package/dist/server/healthSurfaces.js +27 -6
  240. package/dist/server/http.d.ts +19 -10
  241. package/dist/server/http.js +605 -85
  242. package/dist/server/liveViewPath.d.ts +9 -0
  243. package/dist/server/liveViewPath.js +8 -0
  244. package/dist/server/liveViewRoutes.d.ts +58 -0
  245. package/dist/server/liveViewRoutes.js +565 -0
  246. package/dist/server/mcpHost.d.ts +4 -2
  247. package/dist/server/mcpHost.js +2 -0
  248. package/dist/server/readCatalogFile.d.ts +29 -0
  249. package/dist/server/readCatalogFile.js +215 -0
  250. package/dist/server/triggerRoutes.d.ts +1 -0
  251. package/dist/server/triggerRoutes.js +200 -73
  252. package/dist/tools/readEmail.d.ts +3 -3
  253. package/dist/tools/writeStageArtifact.d.ts +9 -0
  254. package/dist/tools/writeStageArtifact.js +2 -47
  255. package/dist/types/pipeline.d.ts +1 -1
  256. package/dist/types/stage.d.ts +1 -1
  257. package/dist/types/stageflowManifest.d.ts +1 -1
  258. package/dist/ui/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
  259. package/dist/ui/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
  260. package/dist/ui/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  261. package/dist/ui/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  262. package/dist/ui/assets/geist-mono-cyrillic-ext-wght-normal-X_5orZeX.woff2 +0 -0
  263. package/dist/ui/assets/geist-mono-cyrillic-wght-normal-DiZS0aHC.woff2 +0 -0
  264. package/dist/ui/assets/geist-mono-latin-ext-wght-normal-Bwz-egvJ.woff2 +0 -0
  265. package/dist/ui/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
  266. package/dist/ui/assets/geist-mono-symbols2-wght-normal-CO5SzqOn.woff2 +0 -0
  267. package/dist/ui/assets/geist-mono-vietnamese-wght-normal-DadHysG0.woff2 +0 -0
  268. package/dist/ui/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
  269. package/dist/ui/assets/index-BoFPkKFg.js +256 -0
  270. package/dist/ui/assets/{index-Bv4p1aPK.css → index-CIPbbBUi.css} +1 -1
  271. package/dist/ui/index.html +4 -4
  272. package/dist/workshop/autosave.d.ts +2 -2
  273. package/dist/workshop/autosave.js +4 -6
  274. package/dist/workshop/buildStore.d.ts +2 -0
  275. package/dist/workshop/chatAttachments.d.ts +27 -0
  276. package/dist/workshop/chatAttachments.js +98 -0
  277. package/dist/workshop/chatTurn.d.ts +5 -2
  278. package/dist/workshop/chatTurn.js +22 -18
  279. package/dist/workshop/sessionMutations.d.ts +17 -0
  280. package/dist/workshop/sessionMutations.js +107 -0
  281. package/dist/workshop/sessionStore.d.ts +10 -0
  282. package/dist/workshop/sessionStore.js +52 -0
  283. package/dist/workshop/workshopPin.d.ts +4 -3
  284. package/dist/workshop/workshopPin.js +26 -6
  285. package/dist/workshop/workshopTranscriptTurn.d.ts +8 -0
  286. package/dist/workshop/workshopTranscriptTurn.js +46 -0
  287. package/examples/README.md +1 -1
  288. package/examples/archify-on-pr/README.md +1 -1
  289. package/examples/archify-on-pr/archify-on-pr.pipeline.yaml +0 -1
  290. package/examples/archify-on-pr/author-diagrams.yaml +1 -0
  291. package/examples/conditional-fork/branch-a.yaml +1 -1
  292. package/examples/conditional-fork/decide.yaml +2 -1
  293. package/examples/feature-loop/{implement.yaml → feature-implement.yaml} +1 -1
  294. package/examples/feature-loop/feature-loop.pipeline.yaml +10 -10
  295. package/examples/feature-loop/{plan.yaml → feature-plan.yaml} +1 -1
  296. package/examples/feature-loop/{review.yaml → feature-review.yaml} +1 -1
  297. package/examples/feedback-loop/{implement.yaml → feedback-implement.yaml} +1 -1
  298. package/examples/feedback-loop/feedback-loop-wait-human.pipeline.yaml +9 -9
  299. package/examples/feedback-loop/feedback-loop.pipeline.yaml +9 -9
  300. package/examples/feedback-loop/{plan.yaml → feedback-plan.yaml} +1 -1
  301. package/examples/feedback-loop/{review.yaml → feedback-review.yaml} +1 -1
  302. package/examples/generic-fan-in/{research.yaml → fan-in-research.yaml} +1 -1
  303. package/examples/generic-fan-in/generic-fan-in-accepted.pipeline.yaml +3 -3
  304. package/examples/generic-fan-in/generic-fan-in.pipeline.yaml +3 -3
  305. package/examples/hello-world/{research.yaml → hello-research.yaml} +1 -1
  306. package/examples/hello-world/hello.pipeline.yaml +2 -2
  307. package/examples/mcp-hitl-tour/{review.yaml → mcp-hitl-review.yaml} +1 -1
  308. package/examples/mcp-hitl-tour/mcp-hitl-tour.pipeline.yaml +3 -3
  309. package/examples/oss-issue-contribution/oss-explain-fix.yaml +1 -0
  310. package/examples/oss-issue-contribution/oss-explain-issue.yaml +1 -0
  311. package/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml +0 -2
  312. package/examples/stageflow.yaml +6 -0
  313. package/examples/triggers/sample-github-pr.trigger.yaml +12 -0
  314. package/examples/triggers/sample-inbox-email.trigger.yaml +14 -0
  315. package/examples/triggers/sample-manual-hello.trigger.yaml +5 -0
  316. package/examples/triggers/sample-nightly-hello.trigger.yaml +8 -0
  317. package/examples/triggers/sample-signed-webhook.trigger.yaml +11 -0
  318. package/examples/triggers-readiness/README.md +48 -0
  319. package/examples/triggers-readiness/readiness-emit.yaml +18 -0
  320. package/examples/triggers-readiness/readiness.pipeline.yaml +4 -0
  321. package/examples/triggers-readiness/readiness.task.yaml +6 -0
  322. package/examples/triggers-readiness/stageflow.yaml +13 -0
  323. package/examples/triggers-readiness/triggers/readiness-dynamic-manual.trigger.yaml +4 -0
  324. package/examples/triggers-readiness/triggers/readiness-email.trigger.yaml +12 -0
  325. package/examples/triggers-readiness/triggers/readiness-github-pr.trigger.yaml +12 -0
  326. package/examples/triggers-readiness/triggers/readiness-manual.trigger.yaml +5 -0
  327. package/examples/triggers-readiness/triggers/readiness-schedule.trigger.yaml +8 -0
  328. package/examples/triggers-readiness/triggers/readiness-webhook.trigger.yaml +11 -0
  329. package/package.json +9 -1
  330. package/skills/stageflow/references/control-surface.md +1 -1
  331. package/skills/stageflow-author/references/catalog-write-conventions.md +2 -2
  332. package/skills/stageflow-run/SKILL.md +1 -1
  333. package/skills/stageflow-run/references/mcp-call.md +1 -1
  334. package/skills/stageflow-setup/SKILL.md +1 -1
  335. package/dist/ui/assets/index-59cjF0OA.js +0 -133
@@ -0,0 +1,596 @@
1
+ import path from "node:path";
2
+ import { tmpdir } from "node:os";
3
+ import { mkdir, realpath } from "node:fs/promises";
4
+ import { loadPipelineValidated } from "../config/validateCatalog.js";
5
+ import { loadTaskFromYaml } from "../config/loadTask.js";
6
+ import { redactString } from "../logging/redact.js";
7
+ import { PACKAGE_VERSION } from "../package-meta.js";
8
+ import { PipelinePreflightError, PipelineValidationError, startPipeline, } from "../runtime/pipelineRunner.js";
9
+ import { runWithExplicitAuthPath } from "../runtime/credentialBinding.js";
10
+ import { loadPackageSkills } from "./packageSkills.js";
11
+ import { containedRealPath, isContained, resolveDirectory, } from "./containment.js";
12
+ import { HostedRuntimeError } from "./errors.js";
13
+ import { HostedEventSequencer } from "./sequencer.js";
14
+ import { translateStageEvent } from "./translate.js";
15
+ import { DEFAULT_EVENT_DELIVERY_TIMEOUT_MS, HOSTED_CANCEL_GRACE_MS, HOSTED_DELIVERY_ATTEMPTS, HOSTED_EVENT_SCHEMA_VERSION, } from "./types.js";
16
+ const HOSTED_EXECUTION_MODE = "inprocess";
17
+ export function createHostedRuntime(dependencies) {
18
+ const timeoutMs = dependencies.eventDeliveryTimeoutMs ?? DEFAULT_EVENT_DELIVERY_TIMEOUT_MS;
19
+ return {
20
+ run(input) {
21
+ return runWithExplicitAuthPath(hostedAuthPath(dependencies.localStore), async () => {
22
+ const context = readContext(input);
23
+ readLimits(input);
24
+ if (input.signal?.aborted) {
25
+ return cancelledBeforeStart(dependencies.eventSink, context, timeoutMs);
26
+ }
27
+ let preflightAborted = false;
28
+ const onPreflightAbort = () => {
29
+ preflightAborted = true;
30
+ };
31
+ input.signal?.addEventListener("abort", onPreflightAbort, { once: true });
32
+ const disarmPreflight = () => {
33
+ input.signal?.removeEventListener("abort", onPreflightAbort);
34
+ };
35
+ let packageRoot;
36
+ let skills;
37
+ let operatorCatalog;
38
+ try {
39
+ packageRoot = await readPackageRoot(input.packageRoot, context);
40
+ validateTask(input.taskYaml, context);
41
+ await validatePackage(packageRoot, input.pipeline, context);
42
+ await assertStoreOutsidePackage(dependencies.localStore, packageRoot, context);
43
+ try {
44
+ skills = await loadPackageSkills(packageRoot);
45
+ }
46
+ catch (error) {
47
+ throw hostedError(errorMessage(error), "package_invalid", context.externalRunId, context.externalAttemptId);
48
+ }
49
+ operatorCatalog = await hostedOperatorCatalog(dependencies.localStore, packageRoot);
50
+ if (preflightAborted || input.signal?.aborted) {
51
+ disarmPreflight();
52
+ return cancelledBeforeStart(dependencies.eventSink, context, timeoutMs);
53
+ }
54
+ disarmPreflight();
55
+ if (input.signal?.aborted) {
56
+ return cancelledBeforeStart(dependencies.eventSink, context, timeoutMs);
57
+ }
58
+ }
59
+ catch (error) {
60
+ disarmPreflight();
61
+ throw error;
62
+ }
63
+ const sequencer = new HostedEventSequencer(dependencies.eventSink, context, timeoutMs, HOSTED_DELIVERY_ATTEMPTS);
64
+ const halt = { halted: false };
65
+ const handles = new ActiveHandles();
66
+ const store = observeStore(dependencies.localStore, (stageId, event, attempt) => {
67
+ const body = translateStageEvent(stageId, event, attempt);
68
+ if (body === undefined)
69
+ return Promise.resolve();
70
+ return sequencer.emit(body);
71
+ });
72
+ const agent = wrapAgent(dependencies.agent, handles);
73
+ let decision;
74
+ let released = false;
75
+ const claim = (next) => {
76
+ if (decision !== undefined)
77
+ return false;
78
+ decision = next;
79
+ return true;
80
+ };
81
+ let runId = "";
82
+ let workspaceDir;
83
+ const startedAt = new Date().toISOString();
84
+ let removeAbort;
85
+ let timer;
86
+ const stop = () => {
87
+ halt.halted = true;
88
+ if (runId !== "") {
89
+ void dependencies.localStore
90
+ .updateRunStatus(runId, "cancelled")
91
+ .catch(() => undefined);
92
+ }
93
+ void handles.stop();
94
+ };
95
+ if (input.signal !== undefined) {
96
+ const onAbort = () => {
97
+ if (!claim({ status: "cancelled", reason: "hosted run cancelled" }))
98
+ return;
99
+ stop();
100
+ };
101
+ input.signal.addEventListener("abort", onAbort, { once: true });
102
+ removeAbort = () => input.signal?.removeEventListener("abort", onAbort);
103
+ }
104
+ if (input.timeoutMs !== undefined) {
105
+ timer = setTimeout(() => {
106
+ if (!claim({
107
+ status: "failed",
108
+ code: "timed_out",
109
+ reason: "hosted run timed out",
110
+ })) {
111
+ return;
112
+ }
113
+ halt.halted = true;
114
+ void handles.stop();
115
+ }, input.timeoutMs);
116
+ }
117
+ try {
118
+ if (input.signal?.aborted) {
119
+ return cancelledBeforeStart(dependencies.eventSink, context, timeoutMs);
120
+ }
121
+ const started = await startPipeline({
122
+ agent,
123
+ store,
124
+ taskYaml: input.taskYaml,
125
+ pipeline: input.pipeline,
126
+ cwd: packageRoot,
127
+ projectRoot: packageRoot,
128
+ executionMode: HOSTED_EXECUTION_MODE,
129
+ maxActiveStagesPerRun: input.maxActiveStagesPerRun,
130
+ schedulingHalt: halt,
131
+ operatorCatalog,
132
+ ...(skills !== undefined ? { skills } : {}),
133
+ });
134
+ runId = started.runId;
135
+ workspaceDir = started.runDir;
136
+ sequencer.setRunId(runId);
137
+ await assertWorkspaceOutside(packageRoot, started.runDir, context, runId);
138
+ try {
139
+ await sequencer.emitNow({ type: "run.created" });
140
+ await sequencer.emitNow({ type: "run.started" });
141
+ }
142
+ catch (error) {
143
+ halt.halted = true;
144
+ sequencer.rejectHeld(error);
145
+ await handles.stop();
146
+ const local = await settle(started.done, started.runId, started.runDir);
147
+ throw sinkFailure(sequencer, context, local, startedAt);
148
+ }
149
+ sequencer.release();
150
+ released = true;
151
+ const local = await waitForRun(started.done, () => decision !== undefined, started.runId, started.runDir);
152
+ if (sequencer.failed) {
153
+ throw sinkFailure(sequencer, context, local, startedAt, workspaceDir);
154
+ }
155
+ claim(decisionFromPipeline(local));
156
+ const chosen = decision;
157
+ if (chosen.status === "cancelled" && runId !== "") {
158
+ await dependencies.localStore
159
+ .updateRunStatus(runId, "cancelled")
160
+ .catch(() => undefined);
161
+ }
162
+ const receipt = receiptFor(context, startedAt);
163
+ try {
164
+ await sequencer.emitNow(terminalBody(chosen, receipt));
165
+ }
166
+ catch (error) {
167
+ throw sinkFailure(sequencer, context, local, startedAt, workspaceDir, resultFrom(chosen, context, runId, workspaceDir, receipt));
168
+ }
169
+ return resultFrom(chosen, context, runId, workspaceDir, receipt);
170
+ }
171
+ catch (error) {
172
+ if (error instanceof HostedRuntimeError)
173
+ throw error;
174
+ throw mapStartError(error, context, runId);
175
+ }
176
+ finally {
177
+ if (!released) {
178
+ sequencer.rejectHeld(new Error("hosted run ended before stage events were released"));
179
+ }
180
+ if (timer !== undefined)
181
+ clearTimeout(timer);
182
+ removeAbort?.();
183
+ await handles.stop();
184
+ }
185
+ });
186
+ },
187
+ };
188
+ }
189
+ function readContext(input) {
190
+ const context = input.context;
191
+ const externalRunId = typeof context?.externalRunId === "string" ? context.externalRunId.trim() : "";
192
+ const externalAttemptId = typeof context?.externalAttemptId === "string"
193
+ ? context.externalAttemptId.trim()
194
+ : "";
195
+ const packageRevision = typeof context?.packageRevision === "string"
196
+ ? context.packageRevision.trim()
197
+ : "";
198
+ if (externalRunId === "" || externalAttemptId === "" || packageRevision === "") {
199
+ throw hostedError("hosted context requires externalRunId, externalAttemptId, and packageRevision", "invalid_input", externalRunId, externalAttemptId);
200
+ }
201
+ const attributes = readAttributes(context.attributes, externalRunId, externalAttemptId);
202
+ return {
203
+ externalRunId,
204
+ externalAttemptId,
205
+ packageRevision,
206
+ ...(attributes !== undefined ? { attributes } : {}),
207
+ };
208
+ }
209
+ function readAttributes(attributes, externalRunId, externalAttemptId) {
210
+ if (attributes === undefined)
211
+ return undefined;
212
+ if (attributes === null || typeof attributes !== "object" || Array.isArray(attributes)) {
213
+ throw hostedError("hosted context attributes must be a string record", "invalid_input", externalRunId, externalAttemptId);
214
+ }
215
+ for (const [key, value] of Object.entries(attributes)) {
216
+ if (typeof value !== "string") {
217
+ throw hostedError("hosted context attributes must be strings", "invalid_input", externalRunId, externalAttemptId);
218
+ }
219
+ if (redactString(`${key}=${value}`) !== `${key}=${value}`) {
220
+ throw hostedError("hosted context attributes must not contain credentials", "invalid_input", externalRunId, externalAttemptId);
221
+ }
222
+ }
223
+ return attributes;
224
+ }
225
+ function readLimits(input) {
226
+ if (input.timeoutMs !== undefined &&
227
+ (!Number.isFinite(input.timeoutMs) || input.timeoutMs <= 0)) {
228
+ const context = input.context;
229
+ throw hostedError("timeoutMs must be a positive number", "invalid_input", context?.externalRunId ?? "", context?.externalAttemptId ?? "");
230
+ }
231
+ if (input.maxActiveStagesPerRun !== undefined &&
232
+ (!Number.isInteger(input.maxActiveStagesPerRun) ||
233
+ input.maxActiveStagesPerRun < 1)) {
234
+ const context = input.context;
235
+ throw hostedError("maxActiveStagesPerRun must be a positive integer", "invalid_input", context?.externalRunId ?? "", context?.externalAttemptId ?? "");
236
+ }
237
+ }
238
+ async function readPackageRoot(packageRoot, context) {
239
+ if (typeof packageRoot !== "string" || packageRoot.trim() === "") {
240
+ throw hostedError("packageRoot is required", "invalid_input", context.externalRunId, context.externalAttemptId);
241
+ }
242
+ try {
243
+ return await resolveDirectory(packageRoot);
244
+ }
245
+ catch (error) {
246
+ throw hostedError(errorMessage(error), "package_invalid", context.externalRunId, context.externalAttemptId);
247
+ }
248
+ }
249
+ function validateTask(taskYaml, context) {
250
+ if (typeof taskYaml !== "string" || taskYaml.trim() === "") {
251
+ throw hostedError("taskYaml is required", "invalid_input", context.externalRunId, context.externalAttemptId);
252
+ }
253
+ let task;
254
+ try {
255
+ task = loadTaskFromYaml(taskYaml, "hosted task yaml");
256
+ }
257
+ catch (error) {
258
+ throw hostedError(redactString(errorMessage(error)), "invalid_input", context.externalRunId, context.externalAttemptId);
259
+ }
260
+ if (task.repository !== undefined || task.checkout !== undefined || task.ref !== undefined) {
261
+ throw hostedError("hosted runs do not accept a repository or checkout binding", "invalid_input", context.externalRunId, context.externalAttemptId);
262
+ }
263
+ }
264
+ async function validatePackage(packageRoot, pipeline, context) {
265
+ if (typeof pipeline !== "string" || pipeline.trim() === "") {
266
+ throw hostedError("pipeline is required", "invalid_input", context.externalRunId, context.externalAttemptId);
267
+ }
268
+ const pipelinePath = path.resolve(packageRoot, pipeline);
269
+ try {
270
+ await containedRealPath(packageRoot, pipelinePath);
271
+ }
272
+ catch (error) {
273
+ throw hostedError(errorMessage(error), "package_invalid", context.externalRunId, context.externalAttemptId);
274
+ }
275
+ const loaded = await loadPipelineValidated(pipeline, {
276
+ cwd: packageRoot,
277
+ projectRoot: packageRoot,
278
+ validateStages: true,
279
+ });
280
+ if (!loaded.ok) {
281
+ throw hostedError(redactString(loaded.findings[0]?.message ?? "pipeline failed validation"), "package_invalid", context.externalRunId, context.externalAttemptId);
282
+ }
283
+ try {
284
+ await containedRealPath(packageRoot, loaded.loaded.pipelinePath);
285
+ for (const source of Object.values(loaded.loaded.stageSources ?? {})) {
286
+ if (source.kind !== "file")
287
+ continue;
288
+ await containedRealPath(packageRoot, source.path);
289
+ }
290
+ }
291
+ catch (error) {
292
+ throw hostedError(errorMessage(error), "package_invalid", context.externalRunId, context.externalAttemptId);
293
+ }
294
+ }
295
+ async function assertStoreOutsidePackage(store, packageRoot, context) {
296
+ const dbPath = sqlitePath(store);
297
+ if (dbPath === undefined)
298
+ return;
299
+ let real = path.resolve(dbPath);
300
+ try {
301
+ real = await realpath(dbPath);
302
+ }
303
+ catch {
304
+ real = path.resolve(dbPath);
305
+ }
306
+ if (isContained(packageRoot, real)) {
307
+ throw hostedError("local run store must stay outside the package root", "invalid_input", context.externalRunId, context.externalAttemptId);
308
+ }
309
+ }
310
+ async function assertWorkspaceOutside(packageRoot, workspaceDir, context, runId) {
311
+ let real;
312
+ try {
313
+ real = await realpath(workspaceDir);
314
+ }
315
+ catch {
316
+ return;
317
+ }
318
+ if (isContained(packageRoot, real)) {
319
+ throw hostedError("run workspace must stay outside the package root", "invalid_input", context.externalRunId, context.externalAttemptId, runId);
320
+ }
321
+ }
322
+ async function hostedOperatorCatalog(store, packageRoot) {
323
+ const dbPath = sqlitePath(store);
324
+ const agentDir = dbPath !== undefined
325
+ ? path.join(path.dirname(dbPath), "hosted-skill-catalog")
326
+ : path.join(tmpdir(), "stageflow-hosted-skill-catalog");
327
+ await mkdir(agentDir, { recursive: true });
328
+ return { cwd: packageRoot, agentDir };
329
+ }
330
+ function hostedAuthPath(store) {
331
+ const fromEnv = process.env.STAGEFLOW_AGENT_AUTH_PATH?.trim();
332
+ if (fromEnv)
333
+ return fromEnv;
334
+ const dbPath = sqlitePath(store);
335
+ if (dbPath !== undefined)
336
+ return path.join(path.dirname(dbPath), "hosted-agent-auth.json");
337
+ return path.join(tmpdir(), "stageflow-hosted-agent-auth.json");
338
+ }
339
+ function sqlitePath(store) {
340
+ const connection = store.connection;
341
+ if (typeof connection?.name !== "string" || connection.name === "" || connection.name === ":memory:") {
342
+ return undefined;
343
+ }
344
+ return connection.name;
345
+ }
346
+ function observeStore(store, onStageEvent) {
347
+ return new Proxy(store, {
348
+ get(target, prop, receiver) {
349
+ if (prop === "appendStageEvent") {
350
+ return async (runId, stageId, event, options) => {
351
+ await target.appendStageEvent(runId, stageId, event, options);
352
+ await onStageEvent(stageId, event, options?.attempt ?? 1);
353
+ };
354
+ }
355
+ const value = Reflect.get(target, prop, receiver);
356
+ if (typeof value === "function") {
357
+ return value.bind(target);
358
+ }
359
+ return value;
360
+ },
361
+ });
362
+ }
363
+ class ActiveHandles {
364
+ handles = new Set();
365
+ stopping = false;
366
+ get isStopping() {
367
+ return this.stopping;
368
+ }
369
+ track(handle) {
370
+ this.handles.add(handle);
371
+ }
372
+ untrack(handle) {
373
+ this.handles.delete(handle);
374
+ }
375
+ async stop() {
376
+ this.stopping = true;
377
+ const open = [...this.handles];
378
+ await Promise.all(open.map((handle) => Promise.race([
379
+ handle.close().catch(() => undefined),
380
+ sleep(HOSTED_CANCEL_GRACE_MS),
381
+ ])));
382
+ }
383
+ }
384
+ function wrapAgent(agent, handles) {
385
+ return {
386
+ openStage(input) {
387
+ const inner = agent.openStage(input);
388
+ let closed = false;
389
+ const wrapped = {
390
+ stageId: inner.stageId,
391
+ next() {
392
+ if (handles.isStopping || closed) {
393
+ return Promise.resolve(stoppedEvent());
394
+ }
395
+ return inner.next();
396
+ },
397
+ deliverAnswer(answer) {
398
+ inner.deliverAnswer(answer);
399
+ },
400
+ async close(options) {
401
+ if (closed)
402
+ return;
403
+ closed = true;
404
+ handles.untrack(wrapped);
405
+ await inner.close(options);
406
+ },
407
+ };
408
+ handles.track(wrapped);
409
+ return wrapped;
410
+ },
411
+ runStage(input) {
412
+ return agent.runStage(input);
413
+ },
414
+ };
415
+ }
416
+ function stoppedEvent() {
417
+ return {
418
+ status: "completed",
419
+ result: { ok: false, reason: "cancelled" },
420
+ };
421
+ }
422
+ async function cancelledBeforeStart(sink, context, timeoutMs) {
423
+ const startedAt = new Date().toISOString();
424
+ const sequencer = new HostedEventSequencer(sink, context, timeoutMs, HOSTED_DELIVERY_ATTEMPTS);
425
+ sequencer.release();
426
+ const decision = {
427
+ status: "cancelled",
428
+ reason: "hosted run cancelled before start",
429
+ };
430
+ const receipt = receiptFor(context, startedAt);
431
+ try {
432
+ await sequencer.emitNow(terminalBody(decision, receipt));
433
+ }
434
+ catch (error) {
435
+ if (error instanceof HostedRuntimeError)
436
+ throw error;
437
+ throw sinkFailure(sequencer, context, undefined, startedAt);
438
+ }
439
+ return resultFrom(decision, context, "", undefined, receipt);
440
+ }
441
+ function decisionFromPipeline(result) {
442
+ if (result.outcome === "cancelled") {
443
+ return { status: "cancelled", reason: result.reason ?? "hosted run cancelled" };
444
+ }
445
+ if (result.outcome === "waiting") {
446
+ return {
447
+ status: "failed",
448
+ code: "hitl_unsupported",
449
+ reason: result.reason ??
450
+ "hosted run stopped for approval; destroying the sandbox does not leave a resumable attempt",
451
+ };
452
+ }
453
+ if (result.ok && result.outcome === "succeeded") {
454
+ return { status: "succeeded" };
455
+ }
456
+ const reason = redactString(result.reason ?? "hosted run failed");
457
+ if (/requested wait|no HITL controller/i.test(reason)) {
458
+ return { status: "failed", code: "hitl_unsupported", reason };
459
+ }
460
+ if (/timed out|timeout/i.test(reason)) {
461
+ return { status: "failed", code: "timed_out", reason };
462
+ }
463
+ return { status: "failed", code: "agent_failed", reason };
464
+ }
465
+ function terminalBody(decision, receipt) {
466
+ if (decision.status === "succeeded") {
467
+ return { type: "run.succeeded", receipt };
468
+ }
469
+ if (decision.status === "cancelled") {
470
+ return {
471
+ type: "run.cancelled",
472
+ ...(decision.reason !== undefined ? { reason: decision.reason } : {}),
473
+ receipt,
474
+ };
475
+ }
476
+ if (decision.status === "waiting") {
477
+ return {
478
+ type: "run.failed",
479
+ code: decision.code,
480
+ reason: decision.reason,
481
+ receipt,
482
+ };
483
+ }
484
+ return {
485
+ type: "run.failed",
486
+ code: decision.code,
487
+ ...(decision.reason !== undefined ? { reason: decision.reason } : {}),
488
+ receipt,
489
+ };
490
+ }
491
+ function resultFrom(decision, context, runId, workspaceDir, receipt) {
492
+ return {
493
+ runId: runId === "" ? null : runId,
494
+ externalRunId: context.externalRunId,
495
+ externalAttemptId: context.externalAttemptId,
496
+ status: decision.status,
497
+ ...(decision.status === "succeeded"
498
+ ? {}
499
+ : {
500
+ code: decision.status === "cancelled" ? "cancelled" : decision.code,
501
+ ...(decision.reason !== undefined ? { reason: decision.reason } : {}),
502
+ }),
503
+ ...(workspaceDir !== undefined ? { workspaceDir } : {}),
504
+ receipt,
505
+ };
506
+ }
507
+ function receiptFor(context, startedAt) {
508
+ return {
509
+ coreVersion: PACKAGE_VERSION,
510
+ eventSchemaVersion: HOSTED_EVENT_SCHEMA_VERSION,
511
+ packageRevision: context.packageRevision,
512
+ executionMode: "inline",
513
+ startedAt,
514
+ finishedAt: new Date().toISOString(),
515
+ };
516
+ }
517
+ function sinkFailure(sequencer, context, local, startedAt, workspaceDir, localResult) {
518
+ const base = sequencer.failure;
519
+ const result = localResult ??
520
+ (local !== undefined
521
+ ? resultFrom(decisionFromPipeline(local), context, local.runId, workspaceDir ?? local.runDir, receiptFor(context, startedAt))
522
+ : undefined);
523
+ return new HostedRuntimeError(base?.message ?? "hosted event sink failed", {
524
+ code: "event_sink_failed",
525
+ externalRunId: context.externalRunId,
526
+ externalAttemptId: context.externalAttemptId,
527
+ ...(local?.runId !== undefined && local.runId !== ""
528
+ ? { runId: local.runId }
529
+ : {}),
530
+ ...(base !== undefined
531
+ ? { eventType: base.eventType, sequence: base.sequence }
532
+ : {}),
533
+ ...(result !== undefined ? { localResult: result } : {}),
534
+ });
535
+ }
536
+ async function waitForRun(done, stopped, runId, runDir) {
537
+ let timer;
538
+ const stoppedPromise = new Promise((resolve) => {
539
+ if (stopped()) {
540
+ resolve();
541
+ return;
542
+ }
543
+ timer = setInterval(() => {
544
+ if (!stopped())
545
+ return;
546
+ if (timer !== undefined)
547
+ clearInterval(timer);
548
+ resolve();
549
+ }, 15);
550
+ });
551
+ try {
552
+ const winner = await Promise.race([
553
+ done.then((result) => ({ kind: "done", result })),
554
+ stoppedPromise.then(() => ({ kind: "stopped" })),
555
+ ]);
556
+ if (winner.kind === "done")
557
+ return winner.result;
558
+ return settle(done, runId, runDir);
559
+ }
560
+ finally {
561
+ if (timer !== undefined)
562
+ clearInterval(timer);
563
+ }
564
+ }
565
+ async function settle(done, runId, runDir) {
566
+ return Promise.race([
567
+ done,
568
+ sleep(HOSTED_CANCEL_GRACE_MS).then(() => ({
569
+ ok: false,
570
+ outcome: "cancelled",
571
+ runId,
572
+ runDir,
573
+ reason: "hosted run cancelled",
574
+ })),
575
+ ]);
576
+ }
577
+ function mapStartError(error, context, runId) {
578
+ if (error instanceof PipelineValidationError || error instanceof PipelinePreflightError) {
579
+ return hostedError(redactString(errorMessage(error)), "package_invalid", context.externalRunId, context.externalAttemptId, runId === "" ? undefined : runId);
580
+ }
581
+ return hostedError(redactString(errorMessage(error)), "internal", context.externalRunId, context.externalAttemptId, runId === "" ? undefined : runId);
582
+ }
583
+ function hostedError(message, code, externalRunId, externalAttemptId, runId) {
584
+ return new HostedRuntimeError(message, {
585
+ code,
586
+ externalRunId,
587
+ externalAttemptId,
588
+ ...(runId !== undefined ? { runId } : {}),
589
+ });
590
+ }
591
+ function errorMessage(error) {
592
+ return error instanceof Error ? error.message : String(error);
593
+ }
594
+ function sleep(ms) {
595
+ return new Promise((resolve) => setTimeout(resolve, ms));
596
+ }
@@ -0,0 +1,28 @@
1
+ import { type HostedEventBody, type HostedEventSink, type HostedRunContext } from "./types.js";
2
+ export declare class HostedEventSequencer {
3
+ private readonly sink;
4
+ private readonly context;
5
+ private readonly timeoutMs;
6
+ private readonly attempts;
7
+ private chain;
8
+ private held;
9
+ private holding;
10
+ private sequence;
11
+ private runId;
12
+ failed: boolean;
13
+ failure?: {
14
+ eventType: string;
15
+ sequence: number;
16
+ message: string;
17
+ };
18
+ constructor(sink: HostedEventSink, context: HostedRunContext, timeoutMs: number, attempts: number);
19
+ setRunId(runId: string): void;
20
+ emit(body: HostedEventBody): Promise<void>;
21
+ emitNow(body: HostedEventBody): Promise<void>;
22
+ release(): void;
23
+ rejectHeld(error: unknown): void;
24
+ private enqueue;
25
+ private deliver;
26
+ private envelope;
27
+ private failureError;
28
+ }