deepline 0.3.89 → 0.3.91

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 (267) hide show
  1. package/contracts/install-commands.json +29 -0
  2. package/dist/bundling-sources/sdk/src/client.ts +221 -43
  3. package/dist/bundling-sources/sdk/src/index.ts +4 -0
  4. package/dist/bundling-sources/sdk/src/monitor-fleet-contract.ts +2 -556
  5. package/dist/bundling-sources/sdk/src/monitor-fleets.ts +2 -2
  6. package/dist/bundling-sources/sdk/src/pagination.ts +25 -0
  7. package/dist/bundling-sources/sdk/src/plays/bundle-play-file.ts +1 -1
  8. package/dist/bundling-sources/sdk/src/release.ts +11 -9
  9. package/dist/bundling-sources/sdk/src/types.ts +29 -1
  10. package/dist/bundling-sources/shared_libs/integration-contracts/monitor-fleet-contract.ts +549 -0
  11. package/dist/bundling-sources/shared_libs/monitors/analytics-public.ts +10 -0
  12. package/dist/bundling-sources/shared_libs/monitors/fleets/errors.ts +96 -0
  13. package/dist/bundling-sources/shared_libs/monitors/fleets/limits.ts +8 -0
  14. package/dist/bundling-sources/shared_libs/monitors/fleets/plan.ts +320 -0
  15. package/dist/bundling-sources/shared_libs/monitors/fleets/verdict.ts +106 -0
  16. package/dist/bundling-sources/shared_libs/monitors/http-error-response.ts +8 -1
  17. package/dist/bundling-sources/shared_libs/monitors/inbound-queue.ts +4 -4
  18. package/dist/bundling-sources/shared_libs/monitors/inventory-reconciliation.ts +59 -0
  19. package/dist/bundling-sources/shared_libs/monitors/lifecycle-notifications.ts +7 -9
  20. package/dist/bundling-sources/shared_libs/monitors/monitor-fleet-limits.ts +2 -12
  21. package/dist/bundling-sources/shared_libs/monitors/package.json +113 -4
  22. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-batch-operation.ts +56 -9
  23. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-consumer-health.ts +2 -2
  24. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-identity-claims.ts +2 -2
  25. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-public-aliases.ts +1 -1
  26. package/dist/bundling-sources/shared_libs/monitors/signal-radars/inbound-dead-letter.ts +245 -0
  27. package/dist/bundling-sources/shared_libs/monitors/signal-radars/inbound-message.ts +38 -0
  28. package/dist/bundling-sources/shared_libs/monitors/signal-radars/inbound-queue-ack-probe.ts +94 -0
  29. package/dist/bundling-sources/shared_libs/monitors/signal-radars/inbound-queue-delivery.ts +60 -0
  30. package/dist/bundling-sources/shared_libs/monitors/signal-radars/inbound-queue.ts +60 -0
  31. package/dist/bundling-sources/shared_libs/monitors/snitcher-install-validation.ts +1 -1
  32. package/dist/bundling-sources/shared_libs/monitors/snitcher-ip2company.ts +2 -2
  33. package/dist/bundling-sources/shared_libs/monitors/snitcher-radar.ts +1 -1
  34. package/dist/bundling-sources/shared_libs/monitors/tracking-provider-integrations.ts +1 -1
  35. package/dist/bundling-sources/shared_libs/observability/build-context.ts +13 -0
  36. package/dist/bundling-sources/shared_libs/observability/log-metadata.ts +160 -0
  37. package/dist/bundling-sources/shared_libs/observability/request-context.ts +68 -0
  38. package/dist/bundling-sources/shared_libs/observability/scheduled-jobs.json +690 -0
  39. package/dist/bundling-sources/shared_libs/observability/scheduled-work-manual.ts +35 -0
  40. package/dist/bundling-sources/shared_libs/observability/scheduled-work.ts +5 -0
  41. package/dist/bundling-sources/shared_libs/play-data-plane/neon-constants.ts +9 -0
  42. package/dist/bundling-sources/shared_libs/play-data-plane/r2.ts +272 -0
  43. package/dist/bundling-sources/shared_libs/play-runtime/app-runtime-api.ts +46 -1
  44. package/dist/bundling-sources/shared_libs/play-runtime/async-operation.ts +66 -1
  45. package/dist/bundling-sources/shared_libs/play-runtime/async-play-invocation.ts +0 -1
  46. package/dist/bundling-sources/shared_libs/play-runtime/bounceban-batching.ts +137 -0
  47. package/dist/bundling-sources/shared_libs/play-runtime/context.ts +779 -140
  48. package/dist/bundling-sources/shared_libs/play-runtime/ctx-types.ts +46 -0
  49. package/dist/bundling-sources/shared_libs/play-runtime/daytona-payload-contract.ts +68 -0
  50. package/dist/bundling-sources/shared_libs/play-runtime/daytona-sandbox-janitor.ts +103 -0
  51. package/dist/bundling-sources/shared_libs/play-runtime/daytona-sandbox-reaper.ts +725 -0
  52. package/dist/bundling-sources/shared_libs/play-runtime/db-session-lease-store.ts +578 -0
  53. package/dist/bundling-sources/shared_libs/play-runtime/deployment/commands/roll-execution-relay.ts +521 -0
  54. package/dist/bundling-sources/shared_libs/play-runtime/deployment/commands/roll-receipt-gateway.ts +1378 -0
  55. package/dist/bundling-sources/shared_libs/play-runtime/deployment/commands/runtime-topology.ts +1024 -0
  56. package/dist/bundling-sources/shared_libs/play-runtime/deployment/fly-gateway-route-probe.ts +193 -0
  57. package/dist/bundling-sources/shared_libs/play-runtime/deployment/fly-machine-lifecycle.ts +104 -0
  58. package/dist/bundling-sources/shared_libs/play-runtime/deployment/fly-machines.ts +1844 -0
  59. package/dist/bundling-sources/shared_libs/play-runtime/deployment/fly-registry.ts +21 -0
  60. package/dist/bundling-sources/shared_libs/play-runtime/deployment/process-tree.ts +40 -0
  61. package/dist/bundling-sources/shared_libs/play-runtime/deployment/runtime-gateway-drain.ts +262 -0
  62. package/dist/bundling-sources/shared_libs/play-runtime/deployment/runtime-surface.ts +98 -0
  63. package/dist/bundling-sources/shared_libs/play-runtime/deployment/runtime-topology.ts +303 -0
  64. package/dist/bundling-sources/shared_libs/play-runtime/deployment/runtime-tuple-publication-guardian.ts +70 -0
  65. package/dist/bundling-sources/shared_libs/play-runtime/deployment/runtime-tuple-recovery.ts +519 -0
  66. package/dist/bundling-sources/shared_libs/play-runtime/deployment/vercel-fly-rollback-alignment.ts +280 -0
  67. package/dist/bundling-sources/shared_libs/play-runtime/deployment/vercel-production-gate.ts +159 -0
  68. package/dist/bundling-sources/shared_libs/play-runtime/durable-call-cache.ts +29 -0
  69. package/dist/bundling-sources/shared_libs/play-runtime/execution-capabilities.ts +23 -0
  70. package/dist/bundling-sources/shared_libs/play-runtime/execution-gateway-invocation-fence.ts +442 -0
  71. package/dist/bundling-sources/shared_libs/play-runtime/execution-protocol.ts +3 -3
  72. package/dist/bundling-sources/shared_libs/play-runtime/fixture-behavior.ts +18 -0
  73. package/dist/bundling-sources/shared_libs/play-runtime/governor/app-runtime-rate-state-backend.ts +9 -0
  74. package/dist/bundling-sources/shared_libs/play-runtime/governor/policy.ts +1 -1
  75. package/dist/bundling-sources/shared_libs/play-runtime/governor/rate-state-backend.ts +1 -1
  76. package/dist/bundling-sources/shared_libs/play-runtime/integration-operation-reader-fence/contracts.ts +66 -0
  77. package/dist/bundling-sources/shared_libs/play-runtime/integration-operation-reader-fence/job.ts +145 -0
  78. package/dist/bundling-sources/shared_libs/play-runtime/integration-operation-reader-fence/memory-store.ts +114 -0
  79. package/dist/bundling-sources/shared_libs/play-runtime/integration-operation-reader-fence/ports.ts +21 -0
  80. package/dist/bundling-sources/shared_libs/play-runtime/integration-operation-reader-fence/postgres-store.ts +170 -0
  81. package/dist/bundling-sources/shared_libs/play-runtime/internal-bootstrap-token.ts +1322 -0
  82. package/dist/bundling-sources/shared_libs/play-runtime/internal-step-ids.ts +2 -2
  83. package/dist/bundling-sources/shared_libs/play-runtime/lane-retirement-gate.ts +1 -1
  84. package/dist/bundling-sources/shared_libs/play-runtime/launch-source-policy.ts +112 -0
  85. package/dist/bundling-sources/shared_libs/play-runtime/map-execution-frame.ts +8 -0
  86. package/dist/bundling-sources/shared_libs/play-runtime/perf-trace.ts +127 -0
  87. package/dist/bundling-sources/shared_libs/play-runtime/play-artifact-runtime-contract.ts +5 -0
  88. package/dist/bundling-sources/shared_libs/play-runtime/play-run-recovery-policy.ts +24 -1
  89. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/admission/contracts.ts +56 -0
  90. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/admission/index.ts +13 -0
  91. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/admission/job.ts +41 -0
  92. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/admission/ports.ts +17 -0
  93. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/admission/postgres-adapter.ts +54 -0
  94. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/attempts/contracts.ts +114 -0
  95. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/attempts/engine-suspension.ts +108 -0
  96. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/attempts/index.ts +36 -0
  97. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/attempts/job.ts +97 -0
  98. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/attempts/ports.ts +104 -0
  99. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/attempts/postgres-fence-adapter.ts +263 -0
  100. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/attempts/worker-terminal-projection.ts +64 -0
  101. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/projection/contracts.ts +29 -0
  102. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/projection/gateway-adapter.ts +56 -0
  103. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/projection/index.ts +15 -0
  104. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/projection/job.ts +65 -0
  105. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/projection/ports.ts +17 -0
  106. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/sandbox-cleanup/contracts.ts +42 -0
  107. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/sandbox-cleanup/index.ts +17 -0
  108. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/sandbox-cleanup/job.ts +142 -0
  109. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/sandbox-cleanup/ports.ts +42 -0
  110. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/sandbox-cleanup/postgres-adapter.ts +102 -0
  111. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/terminal/contracts.ts +60 -0
  112. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/terminal/index.ts +16 -0
  113. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/terminal/job.ts +78 -0
  114. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/terminal/ports.ts +54 -0
  115. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/terminal/postgres-adapter.ts +71 -0
  116. package/dist/bundling-sources/shared_libs/play-runtime/play-runtime-batching-registry.ts +4 -0
  117. package/dist/bundling-sources/shared_libs/play-runtime/protocol.ts +2 -0
  118. package/dist/bundling-sources/shared_libs/play-runtime/receipt-status.ts +5 -8
  119. package/dist/bundling-sources/shared_libs/play-runtime/run-failure.ts +3 -5
  120. package/dist/bundling-sources/shared_libs/play-runtime/run-identity.ts +168 -0
  121. package/dist/bundling-sources/shared_libs/play-runtime/run-ledger.ts +44 -5
  122. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/child-play-resolver.ts +26 -0
  123. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/index.ts +3662 -0
  124. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/progress-sidecar.ts +47 -0
  125. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/runtime-deadline.ts +84 -0
  126. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/runtime-gateway-transport.ts +91 -0
  127. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/runtime-heartbeat.ts +424 -0
  128. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/runtime-progress-push.ts +321 -0
  129. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/runtime-sheet-persistence-retry.ts +110 -0
  130. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/runtime-terminal-push.ts +625 -0
  131. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-lifecycle.ts +72 -9
  132. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-payload-transport.ts +6 -12
  133. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona.ts +19 -0
  134. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/bundle.ts +0 -1
  135. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/runtime-sandbox-reconciliation.ts +14 -44
  136. package/dist/bundling-sources/shared_libs/play-runtime/runtime-api.ts +103 -208
  137. package/dist/bundling-sources/shared_libs/play-runtime/runtime-authority.ts +201 -0
  138. package/dist/bundling-sources/shared_libs/play-runtime/runtime-env.ts +6 -0
  139. package/dist/bundling-sources/shared_libs/play-runtime/runtime-operation-contract.ts +67 -0
  140. package/dist/bundling-sources/shared_libs/play-runtime/runtime-release-environment.ts +2 -0
  141. package/dist/bundling-sources/shared_libs/play-runtime/runtime-sandbox-contract.ts +68 -0
  142. package/dist/bundling-sources/shared_libs/play-runtime/runtime-scheduler-topology.ts +14 -2
  143. package/dist/bundling-sources/shared_libs/play-runtime/runtime-telemetry.ts +108 -0
  144. package/dist/bundling-sources/shared_libs/play-runtime/sandbox-runs/contract.ts +4 -0
  145. package/dist/bundling-sources/shared_libs/play-runtime/sandbox-runs/runner-backend-adapter.ts +3 -0
  146. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backend.ts +7 -0
  147. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-deadline-reconciliation.ts +88 -0
  148. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-play-deploy-task.ts +124 -0
  149. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-play-run-task.ts +68 -0
  150. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-pool.ts +193 -0
  151. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-queue-lifecycle.ts +269 -0
  152. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-queue-suffix.ts +73 -0
  153. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-runtime-worker.ts +6642 -0
  154. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-shared.ts +897 -0
  155. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-worker-metrics.ts +120 -0
  156. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-worker-required-env.ts +76 -0
  157. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd.ts +476 -0
  158. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/gateway-heavy-request-admission.ts +47 -0
  159. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/gateway-progress-registry.ts +147 -0
  160. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/index.ts +27 -0
  161. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/lazy.ts +50 -0
  162. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/play-run-recovery.ts +98 -0
  163. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres-budget-state.ts +260 -0
  164. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres-pool.ts +1416 -0
  165. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres-progress.ts +1255 -0
  166. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres-rate-state.ts +942 -0
  167. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres.ts +14636 -0
  168. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/receipt-gateway.ts +888 -0
  169. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/run-ledger-outbox-recovery.ts +355 -0
  170. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/run-terminal-transition.ts +46 -0
  171. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runner-push.ts +60 -0
  172. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-api-origin.ts +33 -0
  173. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-receipt-gateway-health.ts +64 -0
  174. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-sandbox-capacity.ts +835 -0
  175. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-sandbox-ledger-reconciliation.ts +1218 -0
  176. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-sandbox-operation.ts +207 -0
  177. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-scheduler-schema.ts +10 -0
  178. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/scheduler-capacity.ts +123 -0
  179. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/scheduler-launch-read-observability.ts +78 -0
  180. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/submit-admission.ts +169 -0
  181. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/terminal-contract.ts +20 -0
  182. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/worker-queue-metrics.ts +34 -0
  183. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/worker-resource-metrics.ts +249 -0
  184. package/dist/bundling-sources/shared_libs/play-runtime/sheet-attempt-sql.ts +7 -0
  185. package/dist/bundling-sources/shared_libs/play-runtime/step-progress.ts +296 -0
  186. package/dist/bundling-sources/shared_libs/play-runtime/tool-call/native-batch.ts +3 -3
  187. package/dist/bundling-sources/shared_libs/play-runtime/tool-call/runtime-step-receipts-adapter.ts +20 -1
  188. package/dist/bundling-sources/shared_libs/play-runtime/tool-execute-retry-policy.ts +60 -15
  189. package/dist/bundling-sources/shared_libs/play-runtime/tool-execution-outcome.ts +20 -0
  190. package/dist/bundling-sources/shared_libs/play-runtime/transient-service-error.ts +12 -0
  191. package/dist/bundling-sources/shared_libs/play-runtime/vercel-protection.ts +14 -1
  192. package/dist/bundling-sources/shared_libs/play-runtime/webhook-receipt-retry.ts +50 -0
  193. package/dist/bundling-sources/shared_libs/play-runtime/work-receipt-storage-contract.ts +165 -0
  194. package/dist/bundling-sources/shared_libs/play-runtime/work-receipts.ts +15 -23
  195. package/dist/bundling-sources/shared_libs/play-runtime/workflow-executor-auth.ts +169 -0
  196. package/dist/bundling-sources/shared_libs/play-runtime/zerobounce-batching.ts +122 -0
  197. package/dist/bundling-sources/shared_libs/plays/artifact-types.ts +2 -0
  198. package/dist/bundling-sources/shared_libs/plays/bundling/repository-adapter.ts +24 -0
  199. package/dist/bundling-sources/shared_libs/plays/child-run-projection.ts +174 -0
  200. package/dist/bundling-sources/shared_libs/plays/contracts.ts +2 -0
  201. package/dist/bundling-sources/shared_libs/plays/deploy/api-client.ts +267 -0
  202. package/dist/bundling-sources/shared_libs/plays/deploy/control-plane-types.ts +73 -0
  203. package/dist/bundling-sources/shared_libs/plays/deploy/manifest.ts +162 -0
  204. package/dist/bundling-sources/shared_libs/plays/deploy/project-serializer.ts +87 -0
  205. package/dist/bundling-sources/shared_libs/plays/deploy/source-file-path.ts +26 -0
  206. package/dist/bundling-sources/shared_libs/plays/deploy/target-paths.ts +36 -0
  207. package/dist/bundling-sources/shared_libs/plays/deployment-status.ts +1 -1
  208. package/dist/bundling-sources/shared_libs/plays/docflow.ts +1 -1
  209. package/dist/bundling-sources/shared_libs/plays/launch/input-contract.ts +400 -0
  210. package/dist/bundling-sources/shared_libs/plays/launch/prepare.ts +96 -0
  211. package/dist/bundling-sources/shared_libs/plays/local-file-discovery.ts +385 -0
  212. package/dist/bundling-sources/shared_libs/plays/play-grep-search.ts +112 -0
  213. package/dist/bundling-sources/shared_libs/plays/play-reference.ts +117 -0
  214. package/dist/bundling-sources/shared_libs/plays/run-input-summary.ts +260 -0
  215. package/dist/bundling-sources/shared_libs/plays/run-summary-types.ts +49 -0
  216. package/dist/bundling-sources/shared_libs/plays/secrets/errors.ts +19 -0
  217. package/dist/bundling-sources/shared_libs/plays/share/copy.ts +271 -0
  218. package/dist/bundling-sources/shared_libs/plays/share/metrics.ts +140 -0
  219. package/dist/bundling-sources/shared_libs/plays/share/public-read-model.ts +86 -0
  220. package/dist/bundling-sources/shared_libs/plays/share/seo-quality.ts +181 -0
  221. package/dist/bundling-sources/shared_libs/plays/share/static-pipeline-summary.ts +658 -0
  222. package/dist/bundling-sources/shared_libs/plays/share/types.ts +197 -0
  223. package/dist/bundling-sources/shared_libs/plays/sheet-filter.ts +347 -0
  224. package/dist/bundling-sources/shared_libs/plays/slack-hitl-timeout-error.ts +37 -0
  225. package/dist/bundling-sources/shared_libs/plays/standard-webhooks.ts +117 -0
  226. package/dist/bundling-sources/shared_libs/plays/static-pipeline.ts +6 -1
  227. package/dist/bundling-sources/shared_libs/plays/status-result.ts +388 -0
  228. package/dist/bundling-sources/shared_libs/plays/tool-result-types.ts +1 -1
  229. package/dist/bundling-sources/shared_libs/plays/transform-factor-structure.ts +377 -0
  230. package/dist/bundling-sources/shared_libs/plays/webhook-payload.ts +113 -0
  231. package/dist/bundling-sources/shared_libs/product-notifications/configuration.ts +7 -1
  232. package/dist/bundling-sources/shared_libs/product-notifications/default-policy.ts +3 -2
  233. package/dist/bundling-sources/shared_libs/product-notifications/overflow.ts +18 -0
  234. package/dist/bundling-sources/shared_libs/product-notifications/rolling-limit.ts +24 -0
  235. package/dist/bundling-sources/shared_libs/product-notifications/slack-delivery.ts +624 -0
  236. package/dist/bundling-sources/shared_libs/product-notifications/slack-payload.ts +140 -0
  237. package/dist/bundling-sources/shared_libs/product-notifications/slack-transport.ts +75 -0
  238. package/dist/bundling-sources/shared_libs/runtime-env.ts +6 -0
  239. package/dist/bundling-sources/shared_libs/security/email-blacklist.ts +42 -0
  240. package/dist/bundling-sources/shared_libs/security/header-safe-env.ts +10 -3
  241. package/dist/bundling-sources/shared_libs/security/slack-sanitize.ts +133 -0
  242. package/dist/cli/getting-started.d.mts +52 -0
  243. package/dist/cli/getting-started.d.ts +52 -0
  244. package/dist/cli/getting-started.js +65 -0
  245. package/dist/cli/getting-started.mjs +36 -0
  246. package/dist/cli/index.d.mts +9 -0
  247. package/dist/cli/index.d.ts +9 -0
  248. package/dist/cli/index.js +895 -407
  249. package/dist/cli/index.mjs +893 -414
  250. package/dist/{compiler-manifest-DsLbQaew.d.mts → compiler-manifest-x14KL83E.d.mts} +4 -2
  251. package/dist/{compiler-manifest-DsLbQaew.d.ts → compiler-manifest-x14KL83E.d.ts} +4 -2
  252. package/dist/index.d.mts +124 -154
  253. package/dist/index.d.ts +124 -154
  254. package/dist/index.js +132 -28
  255. package/dist/index.mjs +132 -28
  256. package/dist/install-integrity.json +182 -2
  257. package/dist/monitor-fleet-contract.d.mts +131 -0
  258. package/dist/monitor-fleet-contract.d.ts +131 -0
  259. package/dist/monitor-fleet-contract.js +406 -0
  260. package/dist/monitor-fleet-contract.mjs +367 -0
  261. package/dist/plays/bundle-play-file.d.mts +2 -2
  262. package/dist/plays/bundle-play-file.d.ts +2 -2
  263. package/dist/release.d.mts +255 -0
  264. package/dist/release.d.ts +255 -0
  265. package/dist/release.js +210 -0
  266. package/dist/release.mjs +183 -0
  267. package/package.json +21 -4
@@ -0,0 +1,67 @@
1
+ import {
2
+ deployed,
3
+ type DeployedOperationContract,
4
+ } from '@deepline/deployed-contracts';
5
+ import type { RuntimeExecutionCapability } from './execution-capabilities';
6
+
7
+ /**
8
+ * One declarative owner for the runtime action → authority relationship. The
9
+ * route still owns authentication and execution; callers can add an action in
10
+ * one obvious place and CI will prevent removing/changing an existing one.
11
+ */
12
+ export const RUNTIME_OPERATION_CAPABILITIES = {
13
+ create_signed_artifact_url: 'artifact.read',
14
+ resolve_play: 'artifact.read',
15
+ create_signed_staged_file_url: 'file.read',
16
+ get_runtime_step_receipt: 'receipt.read',
17
+ get_runtime_step_receipts: 'receipt.read',
18
+ acquire_runtime_receipt_execution_lock: 'receipt.write',
19
+ release_runtime_receipt_execution_lock: 'receipt.write',
20
+ claim_runtime_step_receipt: 'receipt.write',
21
+ claim_runtime_step_receipts: 'receipt.write',
22
+ mark_runtime_step_receipt_running: 'receipt.write',
23
+ mark_runtime_step_receipts_running: 'receipt.write',
24
+ mark_runtime_step_receipts_queued: 'receipt.write',
25
+ complete_runtime_step_receipt: 'receipt.write',
26
+ complete_runtime_step_receipts: 'receipt.write',
27
+ release_runtime_step_receipt: 'receipt.write',
28
+ fail_runtime_step_receipt: 'receipt.write',
29
+ fail_runtime_step_receipts: 'receipt.write',
30
+ heartbeat_runtime_step_receipts: 'receipt.write',
31
+ skip_runtime_step_receipt: 'receipt.write',
32
+ ensure_sheet: 'sheet.write',
33
+ apply_row_updates: 'sheet.write',
34
+ create_db_session: 'db.session',
35
+ repair_runtime_storage_grants: 'sheet.write',
36
+ append_run_events: 'run.progress',
37
+ save_results: 'run.progress',
38
+ start_run: 'run.progress',
39
+ record_first_claim_latency: 'run.progress',
40
+ project_run_created: 'run.progress',
41
+ launch_play_async: 'run.child',
42
+ compute_billing_upsert: 'billing.write',
43
+ compute_billing_record_item: 'billing.write',
44
+ compute_billing_finalize: 'billing.write',
45
+ rate_state_acquire: 'rate.acquire',
46
+ rate_state_release: 'rate.acquire',
47
+ rate_state_penalize: 'rate.acquire',
48
+ get_runtime_traffic_policy: 'rate.acquire',
49
+ governor_budget_charge: 'budget.charge',
50
+ resolve_secret: 'secret.resolve',
51
+ } as const satisfies Readonly<Record<string, RuntimeExecutionCapability>>;
52
+
53
+ export const RUNTIME_OPERATION_CONTRACT: DeployedOperationContract =
54
+ deployed.operation({
55
+ id: 'runtime-api-actions',
56
+ actions: RUNTIME_OPERATION_CAPABILITIES,
57
+ });
58
+
59
+ export function runtimeOperationCapability(
60
+ action: string,
61
+ ): RuntimeExecutionCapability | null {
62
+ return (
63
+ RUNTIME_OPERATION_CAPABILITIES[
64
+ action as keyof typeof RUNTIME_OPERATION_CAPABILITIES
65
+ ] ?? null
66
+ );
67
+ }
@@ -0,0 +1,2 @@
1
+ /** Runtime estate owning one attested Runtime Release Bundle. */
2
+ export type RuntimeReleaseEnvironment = 'preview' | 'production';
@@ -0,0 +1,68 @@
1
+ import { deployed, readDeployedObject } from '@deepline/deployed-contracts';
2
+
3
+ export type RuntimeSandboxProviderId = 'daytona' | 'modal';
4
+
5
+ export type RuntimeSandboxRef = {
6
+ /** Internal normalized form; persisted writer markers are diagnostic only. */
7
+ schemaVersion: 1;
8
+ provider: RuntimeSandboxProviderId;
9
+ resourceId: string;
10
+ routingDomain: string | null;
11
+ };
12
+
13
+ /**
14
+ * This ref lives in a durable suspension. Its provider and resource identity
15
+ * fence cleanup; its writer marker never decides whether a known sandbox can
16
+ * be reconciled by a different deployment.
17
+ */
18
+ export const RUNTIME_SANDBOX_REF_CONTRACT = deployed.object({
19
+ id: 'runtime-sandbox-ref',
20
+ unknown: 'preserve',
21
+ fields: {
22
+ provider: deployed.openEnum(),
23
+ resourceId: deployed.string(),
24
+ routingDomain: deployed.json(),
25
+ schemaVersion: deployed.optional(deployed.diagnostic.number(), {
26
+ whenAbsent: 'diagnostic unavailable',
27
+ }),
28
+ },
29
+ });
30
+
31
+ export function readPersistedRuntimeSandboxRef(input: {
32
+ raw: unknown;
33
+ expectedSandboxId: string;
34
+ expectedProvider?: unknown;
35
+ }): RuntimeSandboxRef {
36
+ const invalid = () =>
37
+ new Error(
38
+ `Persisted Runtime Sandbox Ref is invalid or inconsistent for sandbox ${input.expectedSandboxId}.`,
39
+ );
40
+ let value: Record<string, unknown>;
41
+ try {
42
+ value = readDeployedObject(RUNTIME_SANDBOX_REF_CONTRACT, input.raw).value;
43
+ } catch {
44
+ throw invalid();
45
+ }
46
+ const provider = value.provider;
47
+ const resourceId =
48
+ typeof value.resourceId === 'string' ? value.resourceId.trim() : '';
49
+ const routingDomain = value.routingDomain;
50
+ if (
51
+ (provider !== 'daytona' && provider !== 'modal') ||
52
+ !resourceId ||
53
+ resourceId !== input.expectedSandboxId.trim() ||
54
+ (routingDomain !== null && typeof routingDomain !== 'string') ||
55
+ (typeof routingDomain === 'string' && !routingDomain.trim()) ||
56
+ (input.expectedProvider !== undefined &&
57
+ input.expectedProvider !== provider)
58
+ ) {
59
+ throw invalid();
60
+ }
61
+ return {
62
+ schemaVersion: 1,
63
+ provider,
64
+ resourceId,
65
+ routingDomain:
66
+ typeof routingDomain === 'string' ? routingDomain.trim() : null,
67
+ };
68
+ }
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Runtime-scheduler topology predicate shared by the app-side lane helpers
3
- * (`src/lib/plays/scheduler-backends/absurd-shared.ts`) and the runner
3
+ * (`packages/play-runtime/scheduler-backends/absurd-shared.ts`) and the runner
4
4
  * backends (`runner-backends/backends/daytona-lifecycle.ts`).
5
5
  *
6
6
  * ONE distinction drives several guards: a run whose scheduler schema is the
@@ -8,7 +8,7 @@
8
8
  * production egress policy), while any other schema is an ISOLATED topology —
9
9
  * a per-PR preview fleet or a per-worktree dev fleet running synthetic
10
10
  * internal test plays. Keeping the predicate here (dependency-free) lets
11
- * shared_libs code use it without importing the app-side scheduler stack.
11
+ * package code uses it without importing the app-side scheduler stack.
12
12
  */
13
13
  export const PROD_DEFAULT_RUNTIME_SCHEDULER_SCHEMA = 'runtime_scheduler';
14
14
 
@@ -48,3 +48,15 @@ export function isIsolatedRuntimeSchedulerSchema(
48
48
  const schema = schedulerSchema?.trim();
49
49
  return Boolean(schema) && schema !== PROD_DEFAULT_RUNTIME_SCHEDULER_SCHEMA;
50
50
  }
51
+
52
+ /**
53
+ * PostgreSQL LISTEN only improves wake-up latency; durable polling owns
54
+ * correctness. Isolated schemas deliberately share a small direct-connection
55
+ * budget across preview workers, so they use that polling path and leave
56
+ * direct sessions to the production topology.
57
+ */
58
+ export function shouldUseRuntimeSchedulerDirectNotify(
59
+ schedulerSchema: string | null | undefined,
60
+ ): boolean {
61
+ return !isIsolatedRuntimeSchedulerSchema(schedulerSchema);
62
+ }
@@ -0,0 +1,108 @@
1
+ import { createTelemetry } from '../observability/telemetry';
2
+
3
+ type PlayRuntimeTelemetryInput = {
4
+ phase: string;
5
+ status: string;
6
+ orgId?: string | null;
7
+ runId?: string | null;
8
+ playName?: string | null;
9
+ graphHash?: string | null;
10
+ triggerSource?: string | null;
11
+ ms?: number;
12
+ errorCode?: string;
13
+ };
14
+
15
+ const playRuntimeTelemetry = createTelemetry({
16
+ service: 'deepline-api',
17
+ component: 'play-runtime',
18
+ });
19
+
20
+ type PlayTelemetryLevel = 'debug' | 'info' | 'warn' | 'error';
21
+
22
+ function stringField(
23
+ fields: Record<string, unknown>,
24
+ ...keys: readonly string[]
25
+ ): string | null {
26
+ for (const key of keys) {
27
+ const value = fields[key];
28
+ if (typeof value === 'string' && value.trim()) return value.trim();
29
+ }
30
+ return null;
31
+ }
32
+
33
+ export function emitPlayTelemetry(input: {
34
+ level: PlayTelemetryLevel;
35
+ event: string;
36
+ tag: string;
37
+ fields?: Record<string, unknown>;
38
+ error?: unknown;
39
+ }): void {
40
+ const fields = input.fields ?? {};
41
+ const telemetry = playRuntimeTelemetry.child({
42
+ context: {
43
+ orgId: stringField(fields, 'orgId', 'org_id'),
44
+ orgName: stringField(fields, 'orgName', 'org_name'),
45
+ requestId: stringField(fields, 'requestId', 'request_id'),
46
+ runId: stringField(fields, 'runId', 'run_id'),
47
+ workflowId: stringField(fields, 'workflowId', 'workflow_id', 'runId'),
48
+ playName: stringField(fields, 'playName', 'play_name'),
49
+ },
50
+ });
51
+ const options = { tag: input.tag };
52
+ if (input.level === 'error') {
53
+ void telemetry.error(input.event, input.error, fields, options);
54
+ } else {
55
+ void telemetry[input.level](input.event, fields, options);
56
+ }
57
+ }
58
+
59
+ /**
60
+ * Emit the stable play.runtime.span event consumed by Axiom dashboards.
61
+ * Domain fields stay unchanged while the shared telemetry envelope supplies
62
+ * consistent service, context, severity, and schema metadata.
63
+ */
64
+ export function emitPlayRuntimeSpan(input: PlayRuntimeTelemetryInput): void {
65
+ emitPlayTelemetry({
66
+ level: 'info',
67
+ event: 'play.runtime.span',
68
+ tag: '[play.runtime.span]',
69
+ fields: {
70
+ orgId: input.orgId,
71
+ runId: input.runId,
72
+ workflowId: input.runId,
73
+ playName: input.playName,
74
+ phase: input.phase,
75
+ status: input.status,
76
+ graphHash: input.graphHash,
77
+ triggerSource: input.triggerSource,
78
+ ms: input.ms,
79
+ errorCode: input.errorCode,
80
+ },
81
+ });
82
+ }
83
+
84
+ export function emitRecoveredSecretResolutionRetry(input: {
85
+ orgId: string;
86
+ runId?: string | null;
87
+ playName?: string | null;
88
+ requestId: string;
89
+ operationId: string;
90
+ attempt: number;
91
+ httpStatus: number;
92
+ }): void {
93
+ emitPlayTelemetry({
94
+ level: 'warn',
95
+ event: 'play.runtime.secret_resolution_retry_recovered',
96
+ tag: '[play.runtime.secret_resolution_retry_recovered]',
97
+ fields: {
98
+ orgId: input.orgId,
99
+ runId: input.runId,
100
+ workflowId: input.runId,
101
+ playName: input.playName,
102
+ requestId: input.requestId,
103
+ operationId: input.operationId,
104
+ attempt: input.attempt,
105
+ httpStatus: input.httpStatus,
106
+ },
107
+ });
108
+ }
@@ -230,6 +230,8 @@ export type SandboxExecutionAdmission = {
230
230
  leaseId: string;
231
231
  /** Stable provider correlation for operation-first managed creates. */
232
232
  providerOperationToken?: string | null;
233
+ /** Resume the existing durable provider operation before any new create. */
234
+ resumeExistingProviderOperation?: boolean;
233
235
  }
234
236
  | { kind: 'pre_code_deferred'; reason: SandboxPreCodeDeferralReason }
235
237
  >;
@@ -293,6 +295,8 @@ export type SandboxExecutionLifecycle = {
293
295
  leaseId: string;
294
296
  /** Stable provider correlation for operation-first managed creates. */
295
297
  providerOperationToken?: string | null;
298
+ /** Resume the existing durable provider operation before any new create. */
299
+ resumeExistingProviderOperation?: boolean;
296
300
  }
297
301
  | { kind: 'pre_code_deferred'; reason: SandboxPreCodeDeferralReason }
298
302
  >;
@@ -180,6 +180,9 @@ function createRunnerCallbacks(input: {
180
180
  return {
181
181
  leaseId: outcome.leaseId,
182
182
  providerOperationToken: outcome.providerOperationToken ?? null,
183
+ ...(outcome.resumeExistingProviderOperation === true
184
+ ? { resumeExistingProviderOperation: true }
185
+ : {}),
183
186
  };
184
187
  },
185
188
  releaseSandboxCapacity: async (leaseId) => {
@@ -47,6 +47,13 @@ export type PlaySchedulerSubmitInput = {
47
47
  asyncLaunchKey?: string | null;
48
48
  asyncInvocationKey?: string | null;
49
49
  asyncRequestFingerprint?: string | null;
50
+ /**
51
+ * Ephemeral proof carried only into atomic async-child admission. It is never
52
+ * persisted on the child launch; the child receives its own authority.
53
+ */
54
+ asyncParentRunAttempt?: number | null;
55
+ asyncParentRunLeaseToken?: string | null;
56
+ asyncParentAttemptRequired?: boolean | null;
50
57
  /** Full play ancestry for a scheduled child, including this play. */
51
58
  asyncAncestryPlayIds?: string[] | null;
52
59
  playId: string;
@@ -0,0 +1,88 @@
1
+ import { cancelPostgresSchedulerRun } from './postgres';
2
+ import type {
3
+ PostgresSchedulerOptions,
4
+ PostgresSchedulerQueryClient,
5
+ } from './postgres';
6
+ import { ABSURD_PLAY_RUN_TASK } from './absurd-shared';
7
+ import { resolveRuntimeSchedulerSchemaEnv } from './runtime-scheduler-schema';
8
+
9
+ /** Bound deadline reconciliation just like Absurd's own cancellation sweep. */
10
+ export const ABSURD_CANCELLED_DEADLINE_RECONCILE_LIMIT = 100;
11
+
12
+ function quoteAbsurdTable(table: string): string {
13
+ return `"${table.replaceAll('"', '""')}"`;
14
+ }
15
+
16
+ /**
17
+ * Project a play task cancelled by Absurd's indexed `max_delay` sweep into the
18
+ * scheduler's authoritative run state.
19
+ *
20
+ * The engine can cancel an overdue task before or after a worker claims its
21
+ * handler. A cancelled task has no handler path left to write the normal
22
+ * terminal state. This reconciler
23
+ * closes that gap: `cancelPostgresSchedulerRun` atomically writes the runtime
24
+ * terminal and its run-ledger outbox event, and is idempotent if a user cancel
25
+ * or a racing worker already terminalized the run. The next empty claim invokes
26
+ * it immediately after Absurd performs its bounded cancellation sweep.
27
+ */
28
+ export async function reconcileAbsurdRuntimeMaxDelayCancellations(input: {
29
+ client: PostgresSchedulerQueryClient;
30
+ queue: string;
31
+ schedulerOptions?: Pick<PostgresSchedulerOptions, 'schema'>;
32
+ limit?: number;
33
+ }): Promise<{ reconciled: number; skipped: number }> {
34
+ const requestedLimit = Math.floor(
35
+ input.limit ?? ABSURD_CANCELLED_DEADLINE_RECONCILE_LIMIT,
36
+ );
37
+ const limit = Number.isFinite(requestedLimit)
38
+ ? Math.max(
39
+ 1,
40
+ Math.min(ABSURD_CANCELLED_DEADLINE_RECONCILE_LIMIT, requestedLimit),
41
+ )
42
+ : ABSURD_CANCELLED_DEADLINE_RECONCILE_LIMIT;
43
+ const taskTable = quoteAbsurdTable(`t_${input.queue}`);
44
+ const schedulerSchema = quoteAbsurdTable(
45
+ input.schedulerOptions?.schema?.trim() ||
46
+ resolveRuntimeSchedulerSchemaEnv() ||
47
+ 'runtime_scheduler',
48
+ );
49
+ const cancelled = await input.client.query<{ run_id: string | null }>(
50
+ `
51
+ SELECT task.params ->> 'runId' AS run_id
52
+ FROM absurd.${taskTable} AS task
53
+ JOIN ${schedulerSchema}.runs AS run
54
+ ON run.run_id = task.params ->> 'runId'
55
+ AND run.status IN ('queued', 'running', 'waiting')
56
+ WHERE task.state = 'cancelled'
57
+ AND task.task_name = $1
58
+ AND task.cancellation ? 'max_delay'
59
+ AND task.cancel_at IS NOT NULL
60
+ AND task.cancelled_at >= task.cancel_at
61
+ ORDER BY task.cancelled_at ASC NULLS LAST, task.task_id ASC
62
+ LIMIT $2
63
+ `,
64
+ [ABSURD_PLAY_RUN_TASK, limit],
65
+ );
66
+
67
+ let reconciled = 0;
68
+ let skipped = 0;
69
+ for (const row of cancelled.rows) {
70
+ const runId = row.run_id?.trim();
71
+ if (!runId) {
72
+ skipped += 1;
73
+ continue;
74
+ }
75
+ const didCancel = await cancelPostgresSchedulerRun(
76
+ input.client,
77
+ {
78
+ runId,
79
+ reason:
80
+ 'Run did not start within its configured scheduler queue deadline.',
81
+ },
82
+ input.schedulerOptions,
83
+ );
84
+ if (didCancel) reconciled += 1;
85
+ else skipped += 1;
86
+ }
87
+ return { reconciled, skipped };
88
+ }
@@ -0,0 +1,124 @@
1
+ import type { RetryStrategy } from '@deepline/absurd/sdk';
2
+ import {
3
+ createAbsurdRuntimeClient,
4
+ resolveAbsurdPoolOptions,
5
+ resolveAbsurdQueueSuffix,
6
+ } from './absurd-shared';
7
+ import { ensureAbsurdSchema } from './postgres';
8
+ import { withRuntimeSchedulerClient } from './postgres-pool';
9
+
10
+ /**
11
+ * GitHub deploy-on-push build tasks ride their own fixed Absurd queue,
12
+ * deliberately OUTSIDE the release-lane model: builds are not versioned by
13
+ * play-runtime release, so pinning them to a `runs_<release>` lane would
14
+ * strand queued deploys on lane retirement. A plain rolling deploy of the
15
+ * deploy worker is correct.
16
+ */
17
+ export const PLAY_DEPLOY_QUEUE = 'deploys';
18
+ export const PLAY_DEPLOY_TASK_NAME = 'play-deploy';
19
+
20
+ /**
21
+ * The queue this process submits to / drains. Production and plain local
22
+ * dev use the fixed base name; a worktree/preview with
23
+ * DEEPLINE_ABSURD_QUEUE_SUFFIX gets `deploys_<suffix>` so multiple local
24
+ * stacks sharing one docker Postgres never consume each other's builds
25
+ * (Absurd partitions its engine tables BY QUEUE, same as the runs lanes).
26
+ */
27
+ export function playDeployQueueName(): string {
28
+ const suffix = resolveAbsurdQueueSuffix();
29
+ return suffix ? `${PLAY_DEPLOY_QUEUE}_${suffix}` : PLAY_DEPLOY_QUEUE;
30
+ }
31
+ export const PLAY_DEPLOY_MAX_ATTEMPTS = 5;
32
+ export const PLAY_DEPLOY_RETRY_STRATEGY: RetryStrategy = {
33
+ kind: 'exponential',
34
+ baseSeconds: 5,
35
+ maxSeconds: 60,
36
+ };
37
+ /**
38
+ * Retained deploy rows are bounded like the runs queue: a stuck or finished
39
+ * deploy task must not accumulate forever.
40
+ *
41
+ * NOTE: this queue previously set a per-org claim cap. Upstream Absurd
42
+ * removed account-level caps from queue policy (see the comment on the runs
43
+ * queue in absurd-shared.ts: parked work holds no slot and fair claim
44
+ * ordering picks the next runnable task). Build parallelism is now bounded
45
+ * by worker slots, not per-org policy. If per-org fairness is wanted again
46
+ * it has to be expressed at claim time, not here.
47
+ */
48
+ export const PLAY_DEPLOY_CLEANUP_TTL = '6 hours';
49
+ export const PLAY_DEPLOY_CLEANUP_LIMIT = 1_000;
50
+
51
+ /**
52
+ * Task payload stays tiny (32 KiB control-plane cap): the deploy token plus
53
+ * addressing. The worker fetches everything else — repo, commit, project
54
+ * settings, a GitHub installation token — from the app API with the token,
55
+ * so state is always read fresh (supersession, disabled projects).
56
+ */
57
+ export type PlayDeployTaskParams = {
58
+ deploymentId: string;
59
+ orgId: string;
60
+ playProjectId: string;
61
+ deployToken: string;
62
+ appBaseUrl: string;
63
+ };
64
+
65
+ const deployQueueReadyPromises = new Map<string, Promise<void>>();
66
+
67
+ /**
68
+ * Ensure the deploys queue exists with its policy. Idempotent per process;
69
+ * a failure evicts the memo so the next caller retries loudly. Deliberately
70
+ * NOT ensureAbsurdRuntimeReady — that helper hardcodes the runs-lane
71
+ * derivation and its policies.
72
+ */
73
+ export function ensurePlayDeployQueueReady(input?: {
74
+ url?: string | null;
75
+ schema?: string | null;
76
+ }): Promise<void> {
77
+ const poolOptions = resolveAbsurdPoolOptions(input?.url);
78
+ const schema = input?.schema?.trim() ?? '';
79
+ const queueName = playDeployQueueName();
80
+ const key = `${poolOptions.url}::${schema}::${queueName}`;
81
+ const existing = deployQueueReadyPromises.get(key);
82
+ if (existing) return existing;
83
+ const promise = (async () => {
84
+ await withRuntimeSchedulerClient(poolOptions, (client) =>
85
+ ensureAbsurdSchema(client),
86
+ );
87
+ const absurd = createAbsurdRuntimeClient(poolOptions, queueName);
88
+ const existingQueues = new Set(await absurd.listQueues());
89
+ if (!existingQueues.has(queueName)) {
90
+ await absurd.createQueue(queueName);
91
+ }
92
+ await absurd.setQueuePolicy(queueName, {
93
+ cleanupTtl: PLAY_DEPLOY_CLEANUP_TTL,
94
+ cleanupLimit: PLAY_DEPLOY_CLEANUP_LIMIT,
95
+ });
96
+ })().catch((error) => {
97
+ deployQueueReadyPromises.delete(key);
98
+ throw error;
99
+ });
100
+ deployQueueReadyPromises.set(key, promise);
101
+ return promise;
102
+ }
103
+
104
+ /**
105
+ * Enqueue one deploy build task, idempotent on the deployment id. Called by
106
+ * the webhook receiver AFTER the Convex playDeployments row exists and
107
+ * BEFORE the delivery is marked processed — a crash in between lets
108
+ * GitHub's redelivery re-run both steps safely.
109
+ */
110
+ export async function enqueuePlayDeployTask(
111
+ params: PlayDeployTaskParams,
112
+ ): Promise<void> {
113
+ const poolOptions = resolveAbsurdPoolOptions();
114
+ await ensurePlayDeployQueueReady();
115
+ const queueName = playDeployQueueName();
116
+ const absurd = createAbsurdRuntimeClient(poolOptions, queueName);
117
+ await absurd.spawn(PLAY_DEPLOY_TASK_NAME, params, {
118
+ queue: queueName,
119
+ idempotencyKey: `play-deploy:${params.deploymentId}`,
120
+ orgKey: params.orgId,
121
+ maxAttempts: PLAY_DEPLOY_MAX_ATTEMPTS,
122
+ retryStrategy: PLAY_DEPLOY_RETRY_STRATEGY,
123
+ });
124
+ }
@@ -0,0 +1,68 @@
1
+ import type { RetryStrategy } from '@deepline/absurd/sdk';
2
+ import type { PlaySchedulerSubmitInput } from '../scheduler-backend';
3
+ import { RUNTIME_RELIABILITY_POLICY } from '../runtime-reliability-policy';
4
+
5
+ export const ABSURD_PLAY_RUN_TASK = 'play-run';
6
+
7
+ export const ABSURD_PLAY_RUN_RETRY_STRATEGY: RetryStrategy = {
8
+ kind: 'exponential',
9
+ baseSeconds: RUNTIME_RELIABILITY_POLICY.engine.retryBaseSeconds,
10
+ factor: 2,
11
+ maxSeconds: RUNTIME_RELIABILITY_POLICY.engine.retryMaxSeconds,
12
+ };
13
+
14
+ export const ABSURD_PLAY_RUN_MAX_ATTEMPTS =
15
+ RUNTIME_RELIABILITY_POLICY.engine.maxAttempts;
16
+
17
+ export type AbsurdPlayRunTaskParams = {
18
+ runId: string;
19
+ orgId: string;
20
+ /**
21
+ * Retained release lanes may still validate this field before loading the
22
+ * launch row. Every newly submitted task is a root.
23
+ */
24
+ nestingDepth: number;
25
+ schedulerSchema?: string | null;
26
+ };
27
+
28
+ /**
29
+ * The one task ABI for an ordinary Play Run.
30
+ *
31
+ * Callers choose only the release queue. Task identity, fairness, retries, and
32
+ * queue-delay policy stay inside the scheduler adapter.
33
+ */
34
+ export function buildAbsurdPlayRunTask(input: {
35
+ launch: Pick<
36
+ PlaySchedulerSubmitInput,
37
+ 'runId' | 'orgId' | 'queueMaxDelaySeconds' | 'queuePriority'
38
+ >;
39
+ schedulerSchema?: string | null;
40
+ }) {
41
+ const params: AbsurdPlayRunTaskParams = {
42
+ runId: input.launch.runId,
43
+ orgId: input.launch.orgId,
44
+ nestingDepth: 0,
45
+ schedulerSchema: input.schedulerSchema ?? null,
46
+ };
47
+ const maxDelaySeconds = input.launch.queueMaxDelaySeconds;
48
+ const priority = input.launch.queuePriority;
49
+ return {
50
+ taskName: ABSURD_PLAY_RUN_TASK,
51
+ params,
52
+ options: {
53
+ idempotency_key: input.launch.runId,
54
+ org_key: input.launch.orgId,
55
+ max_attempts: ABSURD_PLAY_RUN_MAX_ATTEMPTS,
56
+ retry_strategy: {
57
+ kind: ABSURD_PLAY_RUN_RETRY_STRATEGY.kind,
58
+ base_seconds: ABSURD_PLAY_RUN_RETRY_STRATEGY.baseSeconds,
59
+ factor: ABSURD_PLAY_RUN_RETRY_STRATEGY.factor,
60
+ max_seconds: ABSURD_PLAY_RUN_RETRY_STRATEGY.maxSeconds,
61
+ },
62
+ ...(typeof priority === 'number' ? { priority } : {}),
63
+ ...(typeof maxDelaySeconds === 'number'
64
+ ? { cancellation: { max_delay: maxDelaySeconds } }
65
+ : {}),
66
+ },
67
+ };
68
+ }