deepline 0.3.461 → 0.3.462

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 (296) hide show
  1. package/dist/bundling-sources/sdk/src/client-core.ts +7593 -0
  2. package/dist/bundling-sources/sdk/src/client.ts +8 -7366
  3. package/dist/bundling-sources/sdk/src/http-core.ts +1239 -0
  4. package/dist/bundling-sources/sdk/src/http.ts +6 -1231
  5. package/dist/bundling-sources/sdk/src/index.ts +4 -1
  6. package/dist/bundling-sources/sdk/src/play.ts +5 -5
  7. package/dist/bundling-sources/sdk/src/plays/client-core.ts +437 -0
  8. package/dist/bundling-sources/sdk/src/plays/client.ts +4 -421
  9. package/dist/bundling-sources/sdk/src/plays/input-example.ts +3 -4
  10. package/dist/bundling-sources/sdk/src/plays/play-description.ts +1 -1
  11. package/dist/bundling-sources/sdk/src/plays/run-request.ts +1 -1
  12. package/dist/bundling-sources/sdk/src/release.ts +1 -1
  13. package/dist/bundling-sources/sdk/src/server.ts +43 -0
  14. package/dist/bundling-sources/sdk/src/types.ts +15 -5
  15. package/dist/bundling-sources/shared_libs/integration-contracts/billing-entitlements.ts +15 -0
  16. package/dist/bundling-sources/shared_libs/monitors/callback-security.ts +0 -307
  17. package/dist/bundling-sources/shared_libs/monitors/http-error-response.ts +3 -0
  18. package/dist/bundling-sources/shared_libs/monitors/lifecycle-notifications.ts +3 -2
  19. package/dist/bundling-sources/shared_libs/monitors/package.json +2 -0
  20. package/dist/bundling-sources/shared_libs/monitors/provider-callback-verification.ts +34 -0
  21. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-batch-operation.ts +59 -0
  22. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-upstream-identity.ts +94 -1
  23. package/dist/bundling-sources/shared_libs/monitors/signal-radars/inbound-dead-letter.ts +11 -1
  24. package/dist/bundling-sources/shared_libs/monitors/signal-radars/inbound-failure-codes.ts +24 -0
  25. package/dist/bundling-sources/shared_libs/observability/dlq.ts +32 -0
  26. package/dist/bundling-sources/shared_libs/observability/scheduled-jobs.json +57 -3
  27. package/dist/bundling-sources/shared_libs/observability/scheduled-work.ts +1 -0
  28. package/dist/bundling-sources/shared_libs/play-data-plane/r2.ts +66 -1
  29. package/dist/bundling-sources/shared_libs/play-data-plane/sheet-column-storage.ts +36 -7
  30. package/dist/bundling-sources/shared_libs/play-runtime/app-runtime-api.ts +250 -11
  31. package/dist/bundling-sources/shared_libs/play-runtime/array-input-store.ts +319 -0
  32. package/dist/bundling-sources/shared_libs/play-runtime/context.ts +991 -359
  33. package/dist/bundling-sources/shared_libs/play-runtime/ctx-types.ts +17 -0
  34. package/dist/bundling-sources/shared_libs/play-runtime/daytona-sandbox-janitor.ts +13 -0
  35. package/dist/bundling-sources/shared_libs/play-runtime/daytona-sandbox-reaper.ts +110 -0
  36. package/dist/bundling-sources/shared_libs/play-runtime/deployment/fly-machines.ts +155 -6
  37. package/dist/bundling-sources/shared_libs/play-runtime/deployment/fly-registry.ts +110 -6
  38. package/dist/bundling-sources/shared_libs/play-runtime/durable-receipt-execution.ts +127 -13
  39. package/dist/bundling-sources/shared_libs/play-runtime/execution-capabilities.ts +14 -1
  40. package/dist/bundling-sources/shared_libs/play-runtime/fixture-behavior.ts +57 -1
  41. package/dist/bundling-sources/shared_libs/play-runtime/free-company-lookup-batching.ts +218 -0
  42. package/dist/bundling-sources/shared_libs/play-runtime/gateway-postgres-admission.ts +42 -5
  43. package/dist/bundling-sources/shared_libs/play-runtime/governor/app-runtime-budget-state-backend.ts +6 -1
  44. package/dist/bundling-sources/shared_libs/play-runtime/governor/app-runtime-rate-state-backend.ts +92 -31
  45. package/dist/bundling-sources/shared_libs/play-runtime/governor/block-reserving-budget-state-backend.ts +69 -14
  46. package/dist/bundling-sources/shared_libs/play-runtime/governor/governor.ts +93 -23
  47. package/dist/bundling-sources/shared_libs/play-runtime/governor/in-memory-rate-state-backend.ts +15 -4
  48. package/dist/bundling-sources/shared_libs/play-runtime/governor/policy.ts +22 -18
  49. package/dist/bundling-sources/shared_libs/play-runtime/governor/rate-state-backend.ts +5 -0
  50. package/dist/bundling-sources/shared_libs/play-runtime/launch-identity.ts +2 -0
  51. package/dist/bundling-sources/shared_libs/play-runtime/map-memory-limits.ts +190 -14
  52. package/dist/bundling-sources/shared_libs/play-runtime/memory-ledger.ts +131 -0
  53. package/dist/bundling-sources/shared_libs/play-runtime/modal-runtime-config.ts +77 -2
  54. package/dist/bundling-sources/shared_libs/play-runtime/output-size-limits.ts +271 -2
  55. package/dist/bundling-sources/shared_libs/play-runtime/play-run-recovery-policy.ts +51 -0
  56. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/sandbox-cleanup/contracts.ts +2 -0
  57. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/sandbox-cleanup/job.ts +27 -1
  58. package/dist/bundling-sources/shared_libs/play-runtime/play-runtime-batching-registry.ts +2 -0
  59. package/dist/bundling-sources/shared_libs/play-runtime/protocol.ts +3 -0
  60. package/dist/bundling-sources/shared_libs/play-runtime/provider-text-for-log.ts +63 -0
  61. package/dist/bundling-sources/shared_libs/play-runtime/resource-governor.ts +19 -0
  62. package/dist/bundling-sources/shared_libs/play-runtime/run-ledger-event-transport.ts +112 -16
  63. package/dist/bundling-sources/shared_libs/play-runtime/run-ledger.ts +104 -2
  64. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/index.ts +265 -151
  65. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/runtime-gateway-transport.ts +17 -0
  66. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/runtime-progress-push.ts +35 -14
  67. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/runtime-sheet-persistence-retry.ts +12 -1
  68. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-control-transport.ts +4 -0
  69. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-labels.ts +36 -0
  70. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-launch-transport.ts +136 -70
  71. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-lifecycle.ts +237 -36
  72. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-runtime-watchdog.ts +148 -4
  73. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-session-execution.ts +6 -0
  74. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona.ts +285 -32
  75. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/modal.ts +251 -56
  76. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/runtime-sandbox-reconciliation.ts +29 -4
  77. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/sandbox-create-outcome.ts +27 -0
  78. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/types.ts +22 -1
  79. package/dist/bundling-sources/shared_libs/play-runtime/runtime-api.ts +1397 -382
  80. package/dist/bundling-sources/shared_libs/play-runtime/runtime-array-input-receipts.ts +920 -0
  81. package/dist/bundling-sources/shared_libs/play-runtime/runtime-constants.ts +16 -0
  82. package/dist/bundling-sources/shared_libs/play-runtime/runtime-environment.ts +38 -0
  83. package/dist/bundling-sources/shared_libs/play-runtime/runtime-flow.ts +6 -0
  84. package/dist/bundling-sources/shared_libs/play-runtime/runtime-incident-drills.ts +26 -1
  85. package/dist/bundling-sources/shared_libs/play-runtime/runtime-operation-contract.ts +30 -0
  86. package/dist/bundling-sources/shared_libs/play-runtime/runtime-receipt-store-adapter.ts +14 -3
  87. package/dist/bundling-sources/shared_libs/play-runtime/runtime-receipt-writer.ts +31 -4
  88. package/dist/bundling-sources/shared_libs/play-runtime/runtime-sheet-row-transition.ts +47 -0
  89. package/dist/bundling-sources/shared_libs/play-runtime/sandbox-compute-usage.ts +20 -7
  90. package/dist/bundling-sources/shared_libs/play-runtime/sandbox-runs/contract.ts +12 -0
  91. package/dist/bundling-sources/shared_libs/play-runtime/sandbox-runs/index.ts +9 -0
  92. package/dist/bundling-sources/shared_libs/play-runtime/sandbox-runs/runner-backend-adapter.ts +10 -0
  93. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backend.ts +4 -0
  94. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-runtime-worker.ts +1496 -320
  95. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-worker-required-env.ts +31 -1
  96. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres.ts +1389 -129
  97. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/receipt-gateway.ts +36 -0
  98. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/run-ledger-dispatch-authority.ts +4 -0
  99. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/run-ledger-outbox-recovery.ts +162 -23
  100. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-event-search.ts +499 -115
  101. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-sandbox-capacity.ts +377 -9
  102. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-sandbox-ledger-reconciliation.ts +117 -8
  103. package/dist/bundling-sources/shared_libs/play-runtime/secret-resolution-retry-policy.ts +25 -0
  104. package/dist/bundling-sources/shared_libs/play-runtime/terminal-runtime-performance.ts +391 -0
  105. package/dist/bundling-sources/shared_libs/play-runtime/test-runtime-seams.ts +40 -0
  106. package/dist/bundling-sources/shared_libs/play-runtime/tool-call/index.ts +6 -0
  107. package/dist/bundling-sources/shared_libs/play-runtime/tool-call/mapped-calls.ts +171 -0
  108. package/dist/bundling-sources/shared_libs/play-runtime/tool-call/receipt-cohort.ts +16 -1
  109. package/dist/bundling-sources/shared_libs/play-runtime/tool-execute-retry-policy.ts +26 -3
  110. package/dist/bundling-sources/shared_libs/play-runtime/tool-result.ts +16 -2
  111. package/dist/bundling-sources/shared_libs/play-runtime/transport-error-diagnostics.ts +28 -0
  112. package/dist/bundling-sources/shared_libs/play-runtime/work-receipt-storage-contract.ts +55 -5
  113. package/dist/bundling-sources/shared_libs/plays/authoring-contract.ts +41 -1
  114. package/dist/bundling-sources/shared_libs/plays/contracts.ts +4 -0
  115. package/dist/bundling-sources/shared_libs/plays/dataset.ts +9 -3
  116. package/dist/bundling-sources/shared_libs/plays/deploy/manifest-contract.ts +2 -0
  117. package/dist/bundling-sources/shared_libs/plays/deploy/manifest.ts +3 -2
  118. package/dist/bundling-sources/shared_libs/plays/deploy/project-serializer.ts +2 -2
  119. package/dist/bundling-sources/shared_libs/plays/run-output-summary.ts +66 -0
  120. package/dist/bundling-sources/shared_libs/plays/script-entry.ts +1 -1
  121. package/dist/bundling-sources/shared_libs/product-notifications/catalog.ts +43 -1
  122. package/dist/bundling-sources/shared_libs/product-notifications/content.ts +9 -0
  123. package/dist/bundling-sources/shared_libs/product-notifications/email.ts +91 -13
  124. package/dist/bundling-sources/shared_libs/product-notifications/events.ts +3 -0
  125. package/dist/bundling-sources/shared_libs/product-notifications/slack-delivery.ts +41 -24
  126. package/dist/bundling-sources/shared_libs/security/attested-client-ip.ts +91 -0
  127. package/dist/bundling-sources/shared_libs/security/internal-actor.ts +0 -11
  128. package/dist/cli/{auth-6HJXNWUG.mjs → auth-JDLEY7VU.mjs} +5 -4
  129. package/dist/cli/auth-UXKY6TCC.js +41 -0
  130. package/dist/cli/{billing-6P5HO6QG.js → billing-HXAXB3XZ.js} +152 -78
  131. package/dist/cli/{billing-MJ42N7YF.mjs → billing-SDHLBLMV.mjs} +84 -10
  132. package/dist/cli/{chunk-5MDIZX7M.js → chunk-3ACMRZRV.js} +8 -6
  133. package/dist/cli/{chunk-FGLKOWSC.mjs → chunk-3KZCFOZ6.mjs} +1 -1
  134. package/dist/cli/chunk-4KQ6SIBC.mjs +1038 -0
  135. package/dist/cli/{chunk-Z2GUFYT6.js → chunk-5LEAXRHV.js} +11 -11
  136. package/dist/cli/{chunk-MEAIOXJL.mjs → chunk-6NNVJDVR.mjs} +7 -5
  137. package/dist/cli/{chunk-NMJ4D2WO.js → chunk-6PMCRYDA.js} +216 -91
  138. package/dist/cli/{chunk-RY4IVOU3.mjs → chunk-6RNQGWFD.mjs} +16 -806
  139. package/dist/cli/{chunk-EBU7LQ64.js → chunk-6V7KVRR5.js} +3 -3
  140. package/dist/cli/{chunk-OZBWRICM.js → chunk-7LFIMWMW.js} +2 -2
  141. package/dist/cli/chunk-7MJ6VI2T.mjs +19 -0
  142. package/dist/cli/chunk-7SWNPNML.js +1039 -0
  143. package/dist/cli/{chunk-IHHLTHE7.mjs → chunk-7U3XNPOA.mjs} +267 -38
  144. package/dist/cli/{chunk-5FDKJQZE.js → chunk-7VZHXVOQ.js} +1 -1
  145. package/dist/cli/{chunk-R64BGGRQ.mjs → chunk-AT636LLU.mjs} +2 -2
  146. package/dist/cli/{chunk-MDJPEGVN.js → chunk-BGTPIMSM.js} +392 -261
  147. package/dist/cli/{chunk-KVJ5VHW5.mjs → chunk-CKSOY47X.mjs} +2 -2
  148. package/dist/cli/{chunk-7DH2FD7Y.mjs → chunk-D464JW3N.mjs} +5 -85
  149. package/dist/cli/chunk-D6DXOUTO.mjs +827 -0
  150. package/dist/cli/{describe-2WQY7ZCY.js → chunk-EM4TXCCI.js} +27 -44
  151. package/dist/cli/chunk-F6QV42MC.mjs +91 -0
  152. package/dist/cli/chunk-FKVYR3QA.mjs +1039 -0
  153. package/dist/cli/{chunk-FGMX4HUZ.js → chunk-GEGW5HPZ.js} +29 -27
  154. package/dist/cli/{chunk-TNMBPMMC.js → chunk-HUB3CCM2.js} +13 -4
  155. package/dist/cli/{chunk-ACCR7POB.js → chunk-I6VHOU5O.js} +27 -27
  156. package/dist/cli/{chunk-Z2XUZC34.js → chunk-IAYSWZDJ.js} +188 -76
  157. package/dist/cli/chunk-JF3TLIMQ.js +19 -0
  158. package/dist/cli/{chunk-HDFRJ4IT.mjs → chunk-JVHOS3K3.mjs} +177 -65
  159. package/dist/cli/{chunk-V7REJRDZ.mjs → chunk-LFXLQEZN.mjs} +1 -1
  160. package/dist/cli/{chunk-CRYOUPEB.js → chunk-LROWFPGN.js} +16 -16
  161. package/dist/cli/{chunk-SLEUWLJE.mjs → chunk-MSY22NQW.mjs} +5 -5
  162. package/dist/cli/{chunk-BGY2PLP7.mjs → chunk-MUUQZIOF.mjs} +23 -49
  163. package/dist/cli/{chunk-FCAZQ7WV.js → chunk-NBLSCHKK.js} +52 -50
  164. package/dist/cli/{chunk-QAJAJPKK.mjs → chunk-NHRWZPWZ.mjs} +4 -2
  165. package/dist/cli/{chunk-KXMNM4AQ.js → chunk-NMU3VR5U.js} +4 -5
  166. package/dist/cli/{chunk-QIW7TVV6.mjs → chunk-O2RX5A66.mjs} +14 -12
  167. package/dist/cli/{chunk-SAZFZQRI.js → chunk-OMQ23IXL.js} +2 -2
  168. package/dist/cli/{chunk-5IYOUBFZ.js → chunk-OPJAJBD4.js} +28 -54
  169. package/dist/cli/{chunk-FJZILBL7.mjs → chunk-PHSEINNH.mjs} +5 -5
  170. package/dist/cli/{chunk-3DNKFH2G.mjs → chunk-PKHVSIJG.mjs} +19 -1
  171. package/dist/cli/{chunk-WIYWSYDS.mjs → chunk-Q2EIZKVX.mjs} +3 -3
  172. package/dist/cli/{chunk-5FY72YOV.js → chunk-QJZ6WNWD.js} +8 -8
  173. package/dist/cli/{chunk-EIMG75BT.mjs → chunk-S3A4IXBQ.mjs} +4 -5
  174. package/dist/cli/{chunk-3BMLICF7.mjs → chunk-S42YIQNE.mjs} +13 -8
  175. package/dist/cli/{chunk-RFONC4WJ.mjs → chunk-S6UAJR6V.mjs} +3 -3
  176. package/dist/cli/{chunk-G7L27KZB.mjs → chunk-TKAQR3IB.mjs} +31 -21
  177. package/dist/cli/{chunk-QWRHGGUH.js → chunk-UAJFWWZE.js} +20 -2
  178. package/dist/cli/{chunk-VZBCEA5S.mjs → chunk-UDRPEZ5F.mjs} +223 -92
  179. package/dist/cli/{chunk-KCCOQ5G5.js → chunk-ULK7JGGI.js} +511 -282
  180. package/dist/cli/chunk-V335HGX5.js +1038 -0
  181. package/dist/cli/{chunk-MGXEUZHL.mjs → chunk-V3MEA7NB.mjs} +7 -5
  182. package/dist/cli/{chunk-O6QOMHCH.js → chunk-VFGVXXZP.js} +37 -35
  183. package/dist/cli/chunk-VLEVVDWG.js +91 -0
  184. package/dist/cli/{chunk-R2GLGLDR.mjs → chunk-VPHN2HAL.mjs} +216 -91
  185. package/dist/cli/{chunk-CFUTOWE4.js → chunk-WG3KGAII.js} +8 -88
  186. package/dist/cli/{describe-FRAVCY5F.mjs → chunk-WIY6U6GD.mjs} +19 -36
  187. package/dist/cli/{chunk-PNATXKLP.js → chunk-XANRM3QA.js} +6 -6
  188. package/dist/cli/{chunk-KGQNIA37.js → chunk-XQCTG5OO.js} +44 -34
  189. package/dist/cli/{chunk-T3MVIPHG.mjs → chunk-XZAFIOUQ.mjs} +1 -1
  190. package/dist/cli/chunk-Y4DPU4OM.js +827 -0
  191. package/dist/cli/chunk-YT5EODJO.js +920 -0
  192. package/dist/cli/{chunk-SCIR5JXW.js → chunk-ZGQSFYD2.js} +56 -51
  193. package/dist/cli/{chunk-QEYHTIV4.mjs → chunk-ZUK6LIJB.mjs} +10 -1
  194. package/dist/cli/command-docs.d.mts +5 -0
  195. package/dist/cli/command-docs.d.ts +5 -0
  196. package/dist/cli/command-docs.js +2 -2
  197. package/dist/cli/command-docs.mjs +1 -1
  198. package/dist/cli/{csv-NX7NO3O6.js → csv-C56GSCEU.js} +13 -12
  199. package/dist/cli/{csv-DQ6GW5B5.mjs → csv-L54JS7TF.mjs} +4 -3
  200. package/dist/cli/{db-R72DFMP6.js → db-MOGRMZTA.js} +30 -27
  201. package/dist/cli/{db-2YP33M4K.mjs → db-YVBUW2DX.mjs} +10 -7
  202. package/dist/cli/describe-KYEULWPG.js +48 -0
  203. package/dist/cli/describe-NLZKKT7C.mjs +48 -0
  204. package/dist/cli/describe-core.d.mts +153 -5
  205. package/dist/cli/describe-core.d.ts +153 -5
  206. package/dist/cli/describe-core.js +9 -5
  207. package/dist/cli/describe-core.mjs +10 -6
  208. package/dist/cli/{executions-ZLHD4QIT.js → executions-A7L4ULPP.js} +9 -7
  209. package/dist/cli/{executions-WFBU7L2Q.mjs → executions-ZBGSTT37.mjs} +7 -5
  210. package/dist/cli/{feedback-CN3HJFVF.mjs → feedback-G6GU37FD.mjs} +6 -5
  211. package/dist/cli/{feedback-NDV6TPHG.js → feedback-OHLY7RYD.js} +10 -9
  212. package/dist/cli/getting-started.d.mts +6 -6
  213. package/dist/cli/getting-started.d.ts +6 -6
  214. package/dist/cli/getting-started.js +2 -2
  215. package/dist/cli/getting-started.mjs +1 -1
  216. package/dist/cli/git-P76N4NDQ.js +25 -0
  217. package/dist/cli/{git-QAD6E3HW.mjs → git-PKZW3QD5.mjs} +5 -4
  218. package/dist/cli/index.js +152 -142
  219. package/dist/cli/index.mjs +56 -46
  220. package/dist/cli/{legacy-noops-KVC5QJ74.js → legacy-noops-5LM3D724.js} +8 -7
  221. package/dist/cli/{legacy-noops-TPTKNBI2.mjs → legacy-noops-LJJYG6YA.mjs} +5 -4
  222. package/dist/cli/{monitors-SV57JFLO.mjs → monitors-72QV4ALO.mjs} +19 -6
  223. package/dist/cli/{monitors-KCROV6PJ.js → monitors-UX3H5DC2.js} +103 -90
  224. package/dist/cli/{org-KX6QIR7A.mjs → org-6RRRKOCP.mjs} +9 -6
  225. package/dist/cli/{org-NJYX5743.js → org-IF7ISUVB.js} +70 -67
  226. package/dist/cli/pages-3SU3HKL7.js +252 -0
  227. package/dist/cli/pages-DXDYYKEK.mjs +252 -0
  228. package/dist/cli/{play-IQQ57L7Z.mjs → play-AHASKRLA.mjs} +512 -1508
  229. package/dist/cli/{play-32L7EQN4.js → play-EUIUVLUH.js} +1090 -2086
  230. package/dist/cli/{providers-4WEC2EQN.mjs → providers-GWGE3WY3.mjs} +7 -5
  231. package/dist/cli/{providers-ZQV6QLVQ.js → providers-V5WU4VXJ.js} +10 -8
  232. package/dist/cli/{quickstart-RQ76RIUE.mjs → quickstart-OXKQ5ZST.mjs} +5 -4
  233. package/dist/cli/{quickstart-HKUSFADF.js → quickstart-QP65I5PF.js} +13 -12
  234. package/dist/cli/run-6MM72IGL.mjs +443 -0
  235. package/dist/cli/run-F3FTYS56.js +443 -0
  236. package/dist/cli/search-OYKOOI7A.js +32 -0
  237. package/dist/cli/{search-ZRAVFBZC.mjs → search-ZMEBVJZB.mjs} +8 -6
  238. package/dist/cli/{secrets-J3G5Y43U.js → secrets-ACND5N6A.js} +16 -14
  239. package/dist/cli/{secrets-CMJOVNVH.mjs → secrets-XRCJFF3L.mjs} +7 -5
  240. package/dist/cli/{sessions-MDQYY5CB.mjs → sessions-RTK3CEW6.mjs} +5 -4
  241. package/dist/cli/{sessions-WY7VN4AE.js → sessions-ZGRJPCFF.js} +6 -5
  242. package/dist/cli/{settings-HTNTFKCE.js → settings-PD5KWQQZ.js} +80 -77
  243. package/dist/cli/{settings-4RWZPCT5.mjs → settings-XDRBPRDE.mjs} +14 -11
  244. package/dist/cli/{setup-P3GYYZWG.mjs → setup-3HPYAOCC.mjs} +12 -10
  245. package/dist/cli/{setup-QGCAP62X.js → setup-E2Q6PXHC.js} +53 -51
  246. package/dist/cli/{skills-7NAE4ICL.mjs → skills-OOQFMPOV.mjs} +7 -6
  247. package/dist/cli/skills-XYWV52KB.js +31 -0
  248. package/dist/cli/tools-ASCDZJCK.js +55 -0
  249. package/dist/cli/tools-C5ZT3UIC.mjs +55 -0
  250. package/dist/cli/update-5RQSEIFM.js +33 -0
  251. package/dist/cli/{update-GODLRKNB.mjs → update-ZWJTADIW.mjs} +9 -8
  252. package/dist/cli/{workflow-4BXOUVEO.mjs → workflow-23NMPAJ7.mjs} +10 -8
  253. package/dist/cli/{workflow-AO3A6LXN.js → workflow-TCXU5YJV.js} +20 -18
  254. package/dist/client-DS2IWYZF.d.ts +10 -0
  255. package/dist/client-DTwnz_AW.d.mts +10 -0
  256. package/dist/{client-CYqG23K1.d.ts → client-core-B_6HAIBy.d.ts} +385 -12
  257. package/dist/{client-BbU5_j7n.d.mts → client-core-DzBSlY1U.d.mts} +385 -12
  258. package/dist/{compiler-manifest-CWz_sNOQ.d.ts → compiler-manifest-Dcyd3-Zd.d.mts} +43 -1
  259. package/dist/{compiler-manifest-CWz_sNOQ.d.mts → compiler-manifest-Dcyd3-Zd.d.ts} +43 -1
  260. package/dist/errors-d-sTrZhe.d.mts +142 -0
  261. package/dist/errors-yQwfgrcX.d.ts +142 -0
  262. package/dist/{index-BF2JB_Ug.d.mts → index-C6oXchjN.d.mts} +1 -1
  263. package/dist/{index-4NPXDzlD.d.ts → index-P56zy_z5.d.ts} +1 -1
  264. package/dist/index.d.mts +11 -147
  265. package/dist/index.d.ts +11 -147
  266. package/dist/index.js +15 -11
  267. package/dist/index.mjs +14 -10
  268. package/dist/install-integrity.json +141 -104
  269. package/dist/plays/bundle-play-file.d.mts +3 -3
  270. package/dist/plays/bundle-play-file.d.ts +3 -3
  271. package/dist/plays/bundle-play-file.mjs +2 -1
  272. package/dist/plays/play-description.d.mts +2 -2
  273. package/dist/plays/play-description.d.ts +2 -2
  274. package/dist/plays/play-description.js +2 -2
  275. package/dist/plays/play-description.mjs +1 -1
  276. package/dist/plays/run-request.d.mts +2 -2
  277. package/dist/plays/run-request.d.ts +2 -2
  278. package/dist/release.d.mts +1 -1
  279. package/dist/release.d.ts +1 -1
  280. package/dist/release.js +2 -2
  281. package/dist/release.mjs +1 -1
  282. package/dist/server.d.mts +17 -0
  283. package/dist/server.d.ts +17 -0
  284. package/dist/server.js +76 -0
  285. package/dist/server.mjs +76 -0
  286. package/package.json +6 -1
  287. package/dist/cli/auth-IACERYQH.js +0 -40
  288. package/dist/cli/chunk-PQUUWFXY.js +0 -95
  289. package/dist/cli/chunk-YBWAG72P.mjs +0 -95
  290. package/dist/cli/chunk-YQDUODZW.js +0 -1710
  291. package/dist/cli/git-JVI36ZFV.js +0 -24
  292. package/dist/cli/search-75X5LTDE.js +0 -30
  293. package/dist/cli/skills-BKJ53JOQ.js +0 -30
  294. package/dist/cli/tools-COWMIEJ6.mjs +0 -45
  295. package/dist/cli/tools-TASOCE7I.js +0 -45
  296. package/dist/cli/update-SJIKVME6.js +0 -32
@@ -76,6 +76,7 @@ function schemaTables(options?: Pick<PostgresSchedulerOptions, 'schema'>) {
76
76
  operations: `${schema}."runtime_sandbox_operations"`,
77
77
  cleanup: `${schema}."sandbox_cleanup_jobs_v2"`,
78
78
  runs: `${schema}."runs"`,
79
+ attempts: `${schema}."attempts"`,
79
80
  };
80
81
  }
81
82
 
@@ -286,6 +287,7 @@ export async function reserveRuntimeSandboxCapacityLease(
286
287
  activeLeases: number;
287
288
  wouldDefer: boolean;
288
289
  resumeExistingProviderOperation: boolean;
290
+ resumePendingDelete?: boolean;
289
291
  /**
290
292
  * Database-clock age of a resumed operation. Absent on a same-key race and
291
293
  * once the lease expires, when a new sandbox could no longer be promoted.
@@ -296,7 +298,8 @@ export async function reserveRuntimeSandboxCapacityLease(
296
298
  > {
297
299
  const orgId = assertId(input.orgId, 'orgId');
298
300
  const runId = assertId(input.runId, 'runId');
299
- const { cache, leases, operations, runs } = schemaTables(options);
301
+ const { cache, leases, operations, runs, attempts, cleanup } =
302
+ schemaTables(options);
300
303
  const leaseId = input.leaseId?.trim() || randomUUID();
301
304
  const unsentProviderOperationToken = unsentReservationInputs.get(input);
302
305
  const providerOperationToken =
@@ -321,6 +324,9 @@ export async function reserveRuntimeSandboxCapacityLease(
321
324
  provider_operation_token: string | null;
322
325
  attempt: number;
323
326
  environment: 'preview' | 'production';
327
+ operation_state: RuntimeSandboxOperationState;
328
+ sandbox_id: string | null;
329
+ routing_domain: string | null;
324
330
  age_ms: number | null;
325
331
  }>;
326
332
  existing_operation: {
@@ -368,6 +374,8 @@ export async function reserveRuntimeSandboxCapacityLease(
368
374
  FROM (
369
375
  SELECT lease.lease_id, operation.provider_operation_token,
370
376
  operation.attempt, operation.environment,
377
+ operation.state AS operation_state,
378
+ operation.sandbox_id, operation.routing_domain,
371
379
  CASE WHEN lease.expires_at > clock_timestamp() THEN
372
380
  extract(epoch FROM clock_timestamp() - operation.created_at) * 1000
373
381
  END AS age_ms
@@ -377,9 +385,44 @@ export async function reserveRuntimeSandboxCapacityLease(
377
385
  AND operation.org_id = $1
378
386
  AND operation.run_id = $3
379
387
  AND operation.provider = $4
380
- AND operation.state = $7
388
+ AND (
389
+ (operation.state = $7 AND lease.sandbox_id IS NULL)
390
+ OR (
391
+ operation.state = 'deleting'
392
+ AND operation.sandbox_id IS NOT NULL
393
+ AND lease.sandbox_id = operation.sandbox_id
394
+ AND lease.routing_domain IS NOT DISTINCT FROM operation.routing_domain
395
+ AND EXISTS (
396
+ SELECT 1
397
+ FROM ${attempts} AS owner_attempt
398
+ CROSS JOIN LATERAL jsonb_array_elements(
399
+ CASE
400
+ WHEN jsonb_typeof(owner_attempt.resource_json) = 'array'
401
+ THEN owner_attempt.resource_json
402
+ WHEN owner_attempt.resource_json IS NULL THEN '[]'::jsonb
403
+ ELSE jsonb_build_array(owner_attempt.resource_json)
404
+ END
405
+ ) AS resource
406
+ WHERE owner_attempt.run_id = operation.run_id
407
+ AND owner_attempt.attempt = operation.attempt
408
+ AND resource->>'sandboxCapacityLeaseId' = operation.operation_key
409
+ AND resource->>'sandboxId' = operation.sandbox_id
410
+ AND resource->>'lateAcquired' = 'true'
411
+ AND (
412
+ resource->'billingEndedAt' IS NULL
413
+ OR resource->'billingEndedAt' = 'null'::jsonb
414
+ )
415
+ )
416
+ AND EXISTS (
417
+ SELECT 1 FROM ${cleanup} AS cleanup_job
418
+ WHERE cleanup_job.provider = operation.provider
419
+ AND cleanup_job.sandbox_id = operation.sandbox_id
420
+ AND cleanup_job.routing_domain IS NOT DISTINCT FROM operation.routing_domain
421
+ AND cleanup_job.status <> 'deleted'
422
+ )
423
+ )
424
+ )
381
425
  AND lease.released_at IS NULL
382
- AND lease.sandbox_id IS NULL
383
426
  ORDER BY operation.created_at ASC
384
427
  LIMIT 2
385
428
  ) AS pending
@@ -512,9 +555,15 @@ export async function reserveRuntimeSandboxCapacityLease(
512
555
  activeLeases,
513
556
  wouldDefer,
514
557
  resumeExistingProviderOperation: true,
558
+ ...(pendingOperation.operation_state ===
559
+ RuntimeSandboxOperationState.Deleting
560
+ ? { resumePendingDelete: true }
561
+ : {}),
515
562
  ...(pendingOperation.age_ms === null
516
563
  ? {}
517
- : { existingProviderOperationAgeMs: Number(pendingOperation.age_ms) }),
564
+ : {
565
+ existingProviderOperationAgeMs: Number(pendingOperation.age_ms),
566
+ }),
518
567
  };
519
568
  }
520
569
  }
@@ -887,14 +936,19 @@ export async function releaseRuntimeSandboxCapacityLease(
887
936
  export async function abandonRuntimeSandboxOperationReservation(
888
937
  client: PostgresSchedulerQueryClient,
889
938
  /** With `attempt`, an operation a newer attempt has adopted is left alone. */
890
- input: { operationKey: string; attempt?: number },
939
+ input: {
940
+ operationKey: string;
941
+ attempt?: number;
942
+ /** A lookup 404 must not retire a terminal Run's unresolved creation. */
943
+ onlyWhileRunActive?: boolean;
944
+ },
891
945
  options?: Pick<PostgresSchedulerOptions, 'schema'>,
892
946
  ): Promise<boolean> {
893
947
  const { leases, operations, runs } = schemaTables(options);
894
948
  const result = await client.query<{ operation_key: string }>(
895
949
  `
896
950
  WITH custody_run AS MATERIALIZED (
897
- SELECT run_id FROM ${runs}
951
+ SELECT run_id, status FROM ${runs}
898
952
  WHERE run_id = (SELECT run_id FROM ${operations} WHERE operation_key = $1)
899
953
  FOR NO KEY UPDATE
900
954
  ), custody_attempts AS MATERIALIZED (
@@ -914,6 +968,12 @@ export async function abandonRuntimeSandboxOperationReservation(
914
968
  AND operation.state = $3
915
969
  AND ($4::integer IS NULL OR operation.attempt <= $4)
916
970
  AND EXISTS (SELECT 1 FROM eligible_lease)
971
+ AND (
972
+ NOT $5::boolean OR EXISTS (
973
+ SELECT 1 FROM custody_run
974
+ WHERE status IN ('queued', 'running', 'waiting')
975
+ )
976
+ )
917
977
  RETURNING operation.operation_key
918
978
  ), released AS (
919
979
  UPDATE ${leases} AS lease
@@ -930,11 +990,13 @@ export async function abandonRuntimeSandboxOperationReservation(
930
990
  RuntimeSandboxOperationState.Abandoned,
931
991
  RuntimeSandboxOperationState.Reserved,
932
992
  input.attempt ?? null,
993
+ input.onlyWhileRunActive ?? false,
933
994
  ],
934
995
  );
935
996
  return result.rows.length === 1;
936
997
  }
937
998
 
999
+ /** A run's terminal outcome must not strand a create that has not been bound yet. */
938
1000
  export async function readReservedDaytonaCancellationOperation(
939
1001
  client: PostgresSchedulerQueryClient,
940
1002
  environment: 'preview' | 'production',
@@ -942,23 +1004,32 @@ export async function readReservedDaytonaCancellationOperation(
942
1004
  ): Promise<{
943
1005
  operationKey: string;
944
1006
  providerOperationToken: string;
1007
+ orgId: string;
1008
+ runId: string;
945
1009
  createdAtMs: number;
946
1010
  } | null> {
947
- const { operations } = schemaTables(options);
1011
+ const { operations, runs } = schemaTables(options);
948
1012
  const schema = quoteIdent(options?.schema ?? 'runtime_scheduler');
949
1013
  const rows = await client.query<{
950
1014
  operation_key: string;
951
1015
  provider_operation_token: string | null;
1016
+ org_id: string;
1017
+ run_id: string;
952
1018
  created_at_ms: number;
953
1019
  }>(
954
1020
  `WITH candidate AS (
955
1021
  SELECT operation.operation_key
956
1022
  FROM ${operations} AS operation
957
- JOIN ${schema}."control" AS request
1023
+ JOIN ${runs} AS run ON run.run_id = operation.run_id
1024
+ LEFT JOIN ${schema}."control" AS request
958
1025
  ON request.key = 'runtime_cancel:' || operation.run_id
959
1026
  WHERE operation.provider = 'daytona'
960
1027
  AND operation.environment = $1
961
1028
  AND operation.state = 'reserved'
1029
+ AND (
1030
+ run.status IN ('completed', 'failed', 'cancelled')
1031
+ OR request.key IS NOT NULL
1032
+ )
962
1033
  ORDER BY operation.updated_at ASC, operation.operation_key ASC
963
1034
  LIMIT 1
964
1035
  FOR UPDATE OF operation SKIP LOCKED
@@ -967,7 +1038,8 @@ export async function readReservedDaytonaCancellationOperation(
967
1038
  SET updated_at = clock_timestamp()
968
1039
  FROM candidate
969
1040
  WHERE operation.operation_key = candidate.operation_key
970
- RETURNING operation.operation_key, operation.provider_operation_token,
1041
+ RETURNING operation.operation_key, operation.provider_operation_token,
1042
+ operation.org_id, operation.run_id,
971
1043
  floor(extract(epoch FROM operation.created_at) * 1000)::bigint AS created_at_ms`,
972
1044
  [environment],
973
1045
  );
@@ -981,6 +1053,8 @@ export async function readReservedDaytonaCancellationOperation(
981
1053
  return {
982
1054
  operationKey: row.operation_key,
983
1055
  providerOperationToken: row.provider_operation_token,
1056
+ orgId: row.org_id,
1057
+ runId: row.run_id,
984
1058
  createdAtMs: Number(row.created_at_ms),
985
1059
  };
986
1060
  }
@@ -1071,6 +1145,165 @@ export async function recordRecoveredDaytonaCancellationSandbox(
1071
1145
  return recorded.rows.length === 1;
1072
1146
  }
1073
1147
 
1148
+ export async function recordDaytonaSandboxCleanupIntent(
1149
+ client: PostgresSchedulerQueryClient,
1150
+ input: {
1151
+ operationKey: string;
1152
+ providerOperationToken: string;
1153
+ orgId: string;
1154
+ runId: string;
1155
+ sandboxId: string;
1156
+ routingDomain: string;
1157
+ },
1158
+ options?: Pick<PostgresSchedulerOptions, 'schema'>,
1159
+ ): Promise<boolean> {
1160
+ const { operations, leases, cleanup } = schemaTables(options);
1161
+ const schema = quoteIdent(options?.schema ?? 'runtime_scheduler');
1162
+ const recorded = await client.query<{ operation_key: string }>(
1163
+ `WITH custody_run AS MATERIALIZED (
1164
+ SELECT run.run_id FROM ${schema}."runs" AS run
1165
+ WHERE run.run_id = $1
1166
+ FOR NO KEY UPDATE
1167
+ ), custody_attempts AS MATERIALIZED (
1168
+ SELECT attempt.* FROM ${schema}."attempts" AS attempt
1169
+ WHERE attempt.run_id IN (SELECT run_id FROM custody_run)
1170
+ ORDER BY attempt.attempt FOR UPDATE
1171
+ ), custody_lease AS MATERIALIZED (
1172
+ SELECT lease.lease_id FROM ${leases} AS lease
1173
+ CROSS JOIN (SELECT count(*) FROM custody_attempts) AS attempt_locks
1174
+ WHERE lease.lease_id = $2 FOR UPDATE OF lease
1175
+ ), custody_operation AS MATERIALIZED (
1176
+ SELECT operation.operation_key FROM ${operations} AS operation
1177
+ CROSS JOIN (SELECT count(*) FROM custody_lease) AS lease_locks
1178
+ WHERE operation.operation_key = $2 FOR UPDATE OF operation
1179
+ ), eligible AS MATERIALIZED (
1180
+ SELECT operation.operation_key, operation.run_id, operation.attempt,
1181
+ operation.environment, operation.created_at
1182
+ FROM ${operations} AS operation
1183
+ JOIN custody_operation
1184
+ ON custody_operation.operation_key = operation.operation_key
1185
+ JOIN custody_lease ON custody_lease.lease_id = operation.operation_key
1186
+ JOIN ${leases} AS lease ON lease.lease_id = operation.operation_key
1187
+ JOIN custody_attempts AS attempt
1188
+ ON attempt.run_id = operation.run_id
1189
+ AND attempt.attempt = operation.attempt
1190
+ WHERE operation.operation_key = $2
1191
+ AND operation.run_id = $1
1192
+ AND operation.org_id = $3
1193
+ AND operation.provider_operation_token = $4
1194
+ AND operation.provider = 'daytona'
1195
+ AND operation.state = 'reserved'
1196
+ AND lease.released_at IS NULL
1197
+ AND lease.sandbox_id IS NULL
1198
+ ), queued AS (
1199
+ INSERT INTO ${cleanup} AS job (
1200
+ provider, sandbox_id, run_id, attempt, environment, routing_domain
1201
+ )
1202
+ SELECT 'daytona', $5, eligible.run_id, eligible.attempt,
1203
+ eligible.environment, $6
1204
+ FROM eligible
1205
+ ON CONFLICT (provider, sandbox_id, routing_domain_key)
1206
+ DO UPDATE SET updated_at = job.updated_at
1207
+ WHERE job.status <> 'deleted'
1208
+ AND job.run_id = EXCLUDED.run_id
1209
+ AND job.attempt = EXCLUDED.attempt
1210
+ AND job.environment = EXCLUDED.environment
1211
+ AND job.routing_domain IS NOT DISTINCT FROM EXCLUDED.routing_domain
1212
+ RETURNING job.provider, job.sandbox_id, job.run_id, job.attempt,
1213
+ job.environment, job.routing_domain
1214
+ ), promoted AS (
1215
+ UPDATE ${operations} AS operation
1216
+ SET state = 'deleting',
1217
+ sandbox_id = $5,
1218
+ routing_domain = $6,
1219
+ provider_created_at = clock_timestamp(),
1220
+ updated_at = clock_timestamp()
1221
+ FROM eligible
1222
+ JOIN queued ON queued.run_id = eligible.run_id
1223
+ AND queued.attempt = eligible.attempt
1224
+ AND queued.environment = eligible.environment
1225
+ WHERE operation.operation_key = eligible.operation_key
1226
+ AND operation.state = 'reserved'
1227
+ RETURNING operation.operation_key, operation.run_id, operation.attempt,
1228
+ operation.environment, operation.created_at
1229
+ ), resource AS (
1230
+ SELECT promoted.*,
1231
+ jsonb_build_object(
1232
+ 'kind', 'daytona_sandbox',
1233
+ 'sandboxId', $5::text,
1234
+ 'runtimeEnvironment', promoted.environment,
1235
+ 'daytonaOrganizationId', $6::text,
1236
+ 'billingStartedAt', extract(epoch FROM promoted.created_at) * 1000,
1237
+ 'sandboxCapacityLeaseId', promoted.operation_key,
1238
+ 'lateAcquired', true
1239
+ ) AS value
1240
+ FROM promoted
1241
+ ), recorded_attempt AS (
1242
+ UPDATE ${schema}."attempts" AS attempt
1243
+ SET resource_json = CASE
1244
+ WHEN attempt.resource_json IS NULL THEN jsonb_build_array(resource.value)
1245
+ WHEN jsonb_typeof(attempt.resource_json) = 'array'
1246
+ THEN attempt.resource_json || jsonb_build_array(resource.value)
1247
+ ELSE jsonb_build_array(attempt.resource_json, resource.value)
1248
+ END,
1249
+ updated_at = clock_timestamp()
1250
+ FROM resource
1251
+ WHERE attempt.run_id = resource.run_id
1252
+ AND attempt.attempt = resource.attempt
1253
+ RETURNING attempt.run_id
1254
+ ), bound AS (
1255
+ UPDATE ${leases} AS lease
1256
+ SET sandbox_id = $5, routing_domain = $6
1257
+ FROM promoted
1258
+ WHERE lease.lease_id = promoted.operation_key
1259
+ AND lease.released_at IS NULL
1260
+ RETURNING lease.lease_id
1261
+ )
1262
+ SELECT promoted.operation_key FROM promoted
1263
+ JOIN recorded_attempt ON recorded_attempt.run_id = promoted.run_id
1264
+ JOIN bound ON bound.lease_id = promoted.operation_key
1265
+ JOIN queued ON queued.provider = 'daytona'
1266
+ AND queued.sandbox_id = $5
1267
+ AND queued.run_id = promoted.run_id
1268
+ AND queued.attempt = promoted.attempt
1269
+ AND queued.environment = promoted.environment
1270
+ AND queued.routing_domain IS NOT DISTINCT FROM $6
1271
+ UNION ALL
1272
+ SELECT operation.operation_key
1273
+ FROM ${operations} AS operation
1274
+ JOIN ${leases} AS lease ON lease.lease_id = operation.operation_key
1275
+ JOIN ${cleanup} AS job
1276
+ ON job.provider = operation.provider
1277
+ AND job.sandbox_id = operation.sandbox_id
1278
+ AND job.routing_domain IS NOT DISTINCT FROM operation.routing_domain
1279
+ AND job.run_id = operation.run_id
1280
+ AND job.attempt = operation.attempt
1281
+ AND job.environment = operation.environment
1282
+ WHERE operation.operation_key = $2
1283
+ AND operation.run_id = $1
1284
+ AND operation.org_id = $3
1285
+ AND operation.provider_operation_token = $4
1286
+ AND operation.provider = 'daytona'
1287
+ AND operation.state = 'deleting'
1288
+ AND operation.sandbox_id = $5
1289
+ AND operation.routing_domain IS NOT DISTINCT FROM $6
1290
+ AND lease.sandbox_id = operation.sandbox_id
1291
+ AND lease.routing_domain IS NOT DISTINCT FROM operation.routing_domain
1292
+ AND lease.released_at IS NULL
1293
+ AND job.status <> 'deleted'
1294
+ LIMIT 1`,
1295
+ [
1296
+ input.runId,
1297
+ input.operationKey,
1298
+ input.orgId,
1299
+ input.providerOperationToken,
1300
+ input.sandboxId,
1301
+ input.routingDomain,
1302
+ ],
1303
+ );
1304
+ return recorded.rows.length === 1;
1305
+ }
1306
+
1074
1307
  /** Release only after the provider confirms deletion (or already absent). */
1075
1308
  export async function releaseRuntimeSandboxCapacityLeaseForSandbox(
1076
1309
  client: PostgresSchedulerQueryClient,
@@ -1178,3 +1411,138 @@ export async function readRuntimeSandboxCapacitySummaryViaRuntimeScheduler(input
1178
1411
  ),
1179
1412
  );
1180
1413
  }
1414
+
1415
+ /** Fixed-size Preview test evidence from the existing capacity/cleanup owners. */
1416
+ export type RuntimeSandboxCapacityTestEvidence = {
1417
+ observedAtMs: number;
1418
+ mirror:
1419
+ | null
1420
+ | (Pick<
1421
+ RuntimeOrgSandboxLimitCacheRow,
1422
+ 'limit' | 'expiresAt' | 'sourceRevision'
1423
+ > & { effectiveLimit: number });
1424
+ org: {
1425
+ unreleasedLeases: number;
1426
+ };
1427
+ run: null | {
1428
+ runId: string;
1429
+ status: string;
1430
+ capacityDeferrals: number;
1431
+ acquired: number;
1432
+ unresolvedOperations: number;
1433
+ confirmedDeleted: number;
1434
+ unreleasedLeases: number;
1435
+ releasedBoundLeases: number;
1436
+ invalidReleasedLeases: number;
1437
+ cleanupJobs: number;
1438
+ confirmedCleanupJobs: number;
1439
+ pendingCleanup: number;
1440
+ computeJobStatus: string | null;
1441
+ hasComputeIntent: boolean;
1442
+ recordedResources: number;
1443
+ firstAcquiredAtMs: number | null;
1444
+ lastDeleteConfirmedAtMs: number | null;
1445
+ };
1446
+ };
1447
+
1448
+ /**
1449
+ * Read-only, caller-owned evidence for a small Preview contract fixture. The
1450
+ * API chooses the namespace-derived schema; no SQL or connection override is
1451
+ * accepted. Every row projection is an aggregate, so response size never
1452
+ * depends on attempts, resources, leases or cleanup history.
1453
+ *
1454
+ * Deleted means the existing lifecycle owner recorded provider-confirmed
1455
+ * deletion. Lease expiry is deliberately never consulted by this reader.
1456
+ */
1457
+ export async function readRuntimeSandboxCapacityTestEvidence(
1458
+ client: PostgresSchedulerQueryClient,
1459
+ input: { orgId: string; runId?: string; releaseId: string },
1460
+ options: Pick<PostgresSchedulerOptions, 'schema'>,
1461
+ ): Promise<RuntimeSandboxCapacityTestEvidence | null> {
1462
+ if (!options.schema?.startsWith('runtime_scheduler_preview_')) {
1463
+ throw new Error(
1464
+ 'Sandbox capacity test evidence requires an isolated Preview schema.',
1465
+ );
1466
+ }
1467
+ const schema = quoteIdent(options.schema);
1468
+ const { cache, leases, operations, cleanup, runs } = schemaTables(options);
1469
+ const result = await client.query<{
1470
+ evidence: RuntimeSandboxCapacityTestEvidence;
1471
+ }>(
1472
+ `WITH owned_run AS (
1473
+ SELECT run_id, status FROM ${runs}
1474
+ WHERE org_id = $1 AND run_id = $2
1475
+ AND launch_json->>'absurdReleaseId' = $3
1476
+ ), owned_operations AS (
1477
+ SELECT operation.* FROM ${operations} AS operation
1478
+ JOIN owned_run ON owned_run.run_id = operation.run_id
1479
+ WHERE operation.org_id = $1
1480
+ ), owned_leases AS (
1481
+ SELECT lease.* FROM owned_operations AS operation
1482
+ JOIN ${leases} AS lease ON lease.lease_id = operation.operation_key
1483
+ WHERE lease.org_id = $1 AND lease.run_id = operation.run_id
1484
+ ), owned_cleanup AS (
1485
+ SELECT job.* FROM owned_operations AS operation
1486
+ JOIN ${cleanup} AS job ON job.provider = operation.provider
1487
+ AND job.sandbox_id = operation.sandbox_id
1488
+ AND job.routing_domain_key = operation.routing_domain_key
1489
+ AND job.run_id = operation.run_id
1490
+ )
1491
+ SELECT jsonb_build_object(
1492
+ 'observedAtMs', floor(extract(epoch FROM clock_timestamp()) * 1000)::bigint,
1493
+ 'mirror', (SELECT jsonb_build_object(
1494
+ 'limit', "limit", 'effectiveLimit', CASE WHEN expires_at IS NOT NULL AND expires_at <= clock_timestamp()
1495
+ THEN ${DEFAULT_PLAY_SANDBOX_CONCURRENCY} ELSE "limit" END,
1496
+ 'expiresAt', floor(extract(epoch FROM expires_at) * 1000)::bigint,
1497
+ 'sourceRevision', source_revision
1498
+ ) FROM ${cache} WHERE org_id = $1),
1499
+ 'org', jsonb_build_object(
1500
+ 'unreleasedLeases', (SELECT count(*)::integer FROM ${leases} WHERE org_id = $1 AND released_at IS NULL)
1501
+ ),
1502
+ 'run', (SELECT jsonb_build_object(
1503
+ 'runId', run_id, 'status', status,
1504
+ 'capacityDeferrals', (SELECT count(*)::integer FROM ${schema}."attempts" AS attempt
1505
+ WHERE attempt.run_id = owned_run.run_id AND attempt.error_json->>'kind' = 'scheduler_capacity'
1506
+ AND starts_with(attempt.error_json->>'message', 'Runtime scheduler sandbox capacity is full for organization ')),
1507
+ 'acquired', (SELECT count(*)::integer FROM owned_operations WHERE sandbox_id IS NOT NULL AND provider_created_at IS NOT NULL),
1508
+ 'unresolvedOperations', (SELECT count(*)::integer FROM owned_operations WHERE state NOT IN ('deleted', 'abandoned')),
1509
+ 'confirmedDeleted', (SELECT count(*)::integer FROM owned_operations WHERE state = 'deleted' AND delete_confirmed_at IS NOT NULL),
1510
+ 'unreleasedLeases', (SELECT count(*)::integer FROM owned_leases WHERE released_at IS NULL),
1511
+ 'releasedBoundLeases', (SELECT count(*)::integer FROM owned_leases WHERE sandbox_id IS NOT NULL AND released_at IS NOT NULL),
1512
+ 'invalidReleasedLeases', (SELECT count(*)::integer FROM owned_leases AS lease
1513
+ WHERE lease.sandbox_id IS NOT NULL AND lease.released_at IS NOT NULL AND NOT EXISTS (
1514
+ SELECT 1 FROM owned_operations AS operation WHERE operation.operation_key = lease.lease_id
1515
+ AND operation.provider = lease.provider AND operation.sandbox_id = lease.sandbox_id
1516
+ AND operation.routing_domain_key = coalesce(lease.routing_domain, '')
1517
+ AND operation.state = 'deleted' AND operation.delete_confirmed_at IS NOT NULL)),
1518
+ 'cleanupJobs', (SELECT count(*)::integer FROM owned_cleanup),
1519
+ 'confirmedCleanupJobs', (SELECT count(*)::integer FROM owned_cleanup WHERE status = 'deleted' AND deleted_at IS NOT NULL),
1520
+ 'pendingCleanup', (SELECT count(*)::integer FROM owned_cleanup WHERE status <> 'deleted' OR blocked_at IS NOT NULL),
1521
+ 'hasComputeIntent', EXISTS (SELECT 1 FROM ${schema}."attempts" AS attempt
1522
+ CROSS JOIN LATERAL jsonb_array_elements(CASE
1523
+ WHEN jsonb_typeof(attempt.resource_json) = 'array' THEN attempt.resource_json
1524
+ WHEN attempt.resource_json IS NULL THEN '[]'::jsonb ELSE jsonb_build_array(attempt.resource_json) END) AS resource
1525
+ WHERE attempt.run_id = owned_run.run_id AND resource->>'kind' = 'compute_session'),
1526
+ 'recordedResources', (SELECT count(DISTINCT (resource->>'kind', resource->>'sandboxId'))::integer
1527
+ FROM ${schema}."attempts" AS attempt
1528
+ CROSS JOIN LATERAL jsonb_array_elements(CASE
1529
+ WHEN jsonb_typeof(attempt.resource_json) = 'array' THEN attempt.resource_json
1530
+ WHEN attempt.resource_json IS NULL THEN '[]'::jsonb ELSE jsonb_build_array(attempt.resource_json) END) AS resource
1531
+ WHERE attempt.run_id = owned_run.run_id AND resource->>'kind' IN ('daytona_sandbox', 'modal_sandbox')
1532
+ AND NULLIF(resource->>'sandboxId', '') IS NOT NULL),
1533
+ 'computeJobStatus', (SELECT status FROM ${schema}."compute_billing_jobs_v2" AS job WHERE job.run_id = owned_run.run_id),
1534
+ 'firstAcquiredAtMs', (SELECT floor(extract(epoch FROM min(provider_created_at)) * 1000)::bigint FROM owned_operations),
1535
+ 'lastDeleteConfirmedAtMs', (SELECT floor(extract(epoch FROM max(delete_confirmed_at)) * 1000)::bigint FROM owned_operations)
1536
+ ) FROM owned_run)
1537
+ ) AS evidence`,
1538
+ [
1539
+ assertId(input.orgId, 'orgId'),
1540
+ input.runId ? assertId(input.runId, 'runId') : null,
1541
+ assertId(input.releaseId, 'releaseId'),
1542
+ ],
1543
+ );
1544
+ const evidence = result.rows[0]?.evidence;
1545
+ if (!evidence)
1546
+ throw new Error('Sandbox capacity evidence query returned no snapshot.');
1547
+ return input.runId && evidence.run === null ? null : evidence;
1548
+ }