deepline 0.3.461 → 0.3.463

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 (297) 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/billing/tamradar.ts +17 -17
  17. package/dist/bundling-sources/shared_libs/monitors/callback-security.ts +0 -307
  18. package/dist/bundling-sources/shared_libs/monitors/http-error-response.ts +3 -0
  19. package/dist/bundling-sources/shared_libs/monitors/lifecycle-notifications.ts +3 -2
  20. package/dist/bundling-sources/shared_libs/monitors/package.json +2 -0
  21. package/dist/bundling-sources/shared_libs/monitors/provider-callback-verification.ts +34 -0
  22. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-batch-operation.ts +61 -0
  23. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-upstream-identity.ts +122 -2
  24. package/dist/bundling-sources/shared_libs/monitors/signal-radars/inbound-dead-letter.ts +11 -1
  25. package/dist/bundling-sources/shared_libs/monitors/signal-radars/inbound-failure-codes.ts +24 -0
  26. package/dist/bundling-sources/shared_libs/observability/dlq.ts +32 -0
  27. package/dist/bundling-sources/shared_libs/observability/scheduled-jobs.json +57 -3
  28. package/dist/bundling-sources/shared_libs/observability/scheduled-work.ts +1 -0
  29. package/dist/bundling-sources/shared_libs/play-data-plane/r2.ts +66 -1
  30. package/dist/bundling-sources/shared_libs/play-data-plane/sheet-column-storage.ts +36 -7
  31. package/dist/bundling-sources/shared_libs/play-runtime/app-runtime-api.ts +250 -11
  32. package/dist/bundling-sources/shared_libs/play-runtime/array-input-store.ts +319 -0
  33. package/dist/bundling-sources/shared_libs/play-runtime/context.ts +991 -359
  34. package/dist/bundling-sources/shared_libs/play-runtime/ctx-types.ts +17 -0
  35. package/dist/bundling-sources/shared_libs/play-runtime/daytona-sandbox-janitor.ts +13 -0
  36. package/dist/bundling-sources/shared_libs/play-runtime/daytona-sandbox-reaper.ts +110 -0
  37. package/dist/bundling-sources/shared_libs/play-runtime/deployment/fly-machines.ts +155 -6
  38. package/dist/bundling-sources/shared_libs/play-runtime/deployment/fly-registry.ts +110 -6
  39. package/dist/bundling-sources/shared_libs/play-runtime/durable-receipt-execution.ts +127 -13
  40. package/dist/bundling-sources/shared_libs/play-runtime/execution-capabilities.ts +14 -1
  41. package/dist/bundling-sources/shared_libs/play-runtime/fixture-behavior.ts +57 -1
  42. package/dist/bundling-sources/shared_libs/play-runtime/free-company-lookup-batching.ts +218 -0
  43. package/dist/bundling-sources/shared_libs/play-runtime/gateway-postgres-admission.ts +42 -5
  44. package/dist/bundling-sources/shared_libs/play-runtime/governor/app-runtime-budget-state-backend.ts +6 -1
  45. package/dist/bundling-sources/shared_libs/play-runtime/governor/app-runtime-rate-state-backend.ts +92 -31
  46. package/dist/bundling-sources/shared_libs/play-runtime/governor/block-reserving-budget-state-backend.ts +69 -14
  47. package/dist/bundling-sources/shared_libs/play-runtime/governor/governor.ts +93 -23
  48. package/dist/bundling-sources/shared_libs/play-runtime/governor/in-memory-rate-state-backend.ts +15 -4
  49. package/dist/bundling-sources/shared_libs/play-runtime/governor/policy.ts +22 -18
  50. package/dist/bundling-sources/shared_libs/play-runtime/governor/rate-state-backend.ts +5 -0
  51. package/dist/bundling-sources/shared_libs/play-runtime/launch-identity.ts +2 -0
  52. package/dist/bundling-sources/shared_libs/play-runtime/map-memory-limits.ts +190 -14
  53. package/dist/bundling-sources/shared_libs/play-runtime/memory-ledger.ts +131 -0
  54. package/dist/bundling-sources/shared_libs/play-runtime/modal-runtime-config.ts +77 -2
  55. package/dist/bundling-sources/shared_libs/play-runtime/output-size-limits.ts +271 -2
  56. package/dist/bundling-sources/shared_libs/play-runtime/play-run-recovery-policy.ts +51 -0
  57. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/sandbox-cleanup/contracts.ts +2 -0
  58. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/sandbox-cleanup/job.ts +27 -1
  59. package/dist/bundling-sources/shared_libs/play-runtime/play-runtime-batching-registry.ts +2 -0
  60. package/dist/bundling-sources/shared_libs/play-runtime/protocol.ts +3 -0
  61. package/dist/bundling-sources/shared_libs/play-runtime/provider-text-for-log.ts +63 -0
  62. package/dist/bundling-sources/shared_libs/play-runtime/resource-governor.ts +19 -0
  63. package/dist/bundling-sources/shared_libs/play-runtime/run-ledger-event-transport.ts +112 -16
  64. package/dist/bundling-sources/shared_libs/play-runtime/run-ledger.ts +104 -2
  65. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/index.ts +265 -151
  66. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/runtime-gateway-transport.ts +17 -0
  67. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/runtime-progress-push.ts +35 -14
  68. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/runtime-sheet-persistence-retry.ts +12 -1
  69. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-control-transport.ts +4 -0
  70. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-labels.ts +36 -0
  71. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-launch-transport.ts +136 -70
  72. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-lifecycle.ts +237 -36
  73. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-runtime-watchdog.ts +148 -4
  74. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-session-execution.ts +6 -0
  75. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona.ts +285 -32
  76. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/modal.ts +251 -56
  77. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/runtime-sandbox-reconciliation.ts +29 -4
  78. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/sandbox-create-outcome.ts +27 -0
  79. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/types.ts +22 -1
  80. package/dist/bundling-sources/shared_libs/play-runtime/runtime-api.ts +1397 -382
  81. package/dist/bundling-sources/shared_libs/play-runtime/runtime-array-input-receipts.ts +920 -0
  82. package/dist/bundling-sources/shared_libs/play-runtime/runtime-constants.ts +16 -0
  83. package/dist/bundling-sources/shared_libs/play-runtime/runtime-environment.ts +38 -0
  84. package/dist/bundling-sources/shared_libs/play-runtime/runtime-flow.ts +6 -0
  85. package/dist/bundling-sources/shared_libs/play-runtime/runtime-incident-drills.ts +26 -1
  86. package/dist/bundling-sources/shared_libs/play-runtime/runtime-operation-contract.ts +30 -0
  87. package/dist/bundling-sources/shared_libs/play-runtime/runtime-receipt-store-adapter.ts +14 -3
  88. package/dist/bundling-sources/shared_libs/play-runtime/runtime-receipt-writer.ts +31 -4
  89. package/dist/bundling-sources/shared_libs/play-runtime/runtime-sheet-row-transition.ts +47 -0
  90. package/dist/bundling-sources/shared_libs/play-runtime/sandbox-compute-usage.ts +20 -7
  91. package/dist/bundling-sources/shared_libs/play-runtime/sandbox-runs/contract.ts +12 -0
  92. package/dist/bundling-sources/shared_libs/play-runtime/sandbox-runs/index.ts +9 -0
  93. package/dist/bundling-sources/shared_libs/play-runtime/sandbox-runs/runner-backend-adapter.ts +10 -0
  94. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backend.ts +4 -0
  95. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-runtime-worker.ts +1496 -320
  96. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-worker-required-env.ts +31 -1
  97. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres.ts +1389 -129
  98. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/receipt-gateway.ts +36 -0
  99. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/run-ledger-dispatch-authority.ts +4 -0
  100. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/run-ledger-outbox-recovery.ts +162 -23
  101. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-event-search.ts +499 -115
  102. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-sandbox-capacity.ts +377 -9
  103. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-sandbox-ledger-reconciliation.ts +117 -8
  104. package/dist/bundling-sources/shared_libs/play-runtime/secret-resolution-retry-policy.ts +25 -0
  105. package/dist/bundling-sources/shared_libs/play-runtime/terminal-runtime-performance.ts +391 -0
  106. package/dist/bundling-sources/shared_libs/play-runtime/test-runtime-seams.ts +40 -0
  107. package/dist/bundling-sources/shared_libs/play-runtime/tool-call/index.ts +6 -0
  108. package/dist/bundling-sources/shared_libs/play-runtime/tool-call/mapped-calls.ts +171 -0
  109. package/dist/bundling-sources/shared_libs/play-runtime/tool-call/receipt-cohort.ts +16 -1
  110. package/dist/bundling-sources/shared_libs/play-runtime/tool-execute-retry-policy.ts +38 -12
  111. package/dist/bundling-sources/shared_libs/play-runtime/tool-result.ts +33 -9
  112. package/dist/bundling-sources/shared_libs/play-runtime/transport-error-diagnostics.ts +28 -0
  113. package/dist/bundling-sources/shared_libs/play-runtime/work-receipt-storage-contract.ts +55 -5
  114. package/dist/bundling-sources/shared_libs/plays/authoring-contract.ts +41 -1
  115. package/dist/bundling-sources/shared_libs/plays/contracts.ts +4 -0
  116. package/dist/bundling-sources/shared_libs/plays/dataset.ts +9 -3
  117. package/dist/bundling-sources/shared_libs/plays/deploy/manifest-contract.ts +2 -0
  118. package/dist/bundling-sources/shared_libs/plays/deploy/manifest.ts +3 -2
  119. package/dist/bundling-sources/shared_libs/plays/deploy/project-serializer.ts +2 -2
  120. package/dist/bundling-sources/shared_libs/plays/run-output-summary.ts +66 -0
  121. package/dist/bundling-sources/shared_libs/plays/script-entry.ts +1 -1
  122. package/dist/bundling-sources/shared_libs/product-notifications/catalog.ts +43 -1
  123. package/dist/bundling-sources/shared_libs/product-notifications/content.ts +9 -0
  124. package/dist/bundling-sources/shared_libs/product-notifications/email.ts +91 -13
  125. package/dist/bundling-sources/shared_libs/product-notifications/events.ts +3 -0
  126. package/dist/bundling-sources/shared_libs/product-notifications/slack-delivery.ts +41 -24
  127. package/dist/bundling-sources/shared_libs/security/attested-client-ip.ts +91 -0
  128. package/dist/bundling-sources/shared_libs/security/internal-actor.ts +0 -11
  129. package/dist/cli/{auth-6HJXNWUG.mjs → auth-LZLBR4C3.mjs} +5 -4
  130. package/dist/cli/auth-XPGKBJKB.js +41 -0
  131. package/dist/cli/{billing-6P5HO6QG.js → billing-6TJPNJQD.js} +152 -78
  132. package/dist/cli/{billing-MJ42N7YF.mjs → billing-OTOP5RE4.mjs} +84 -10
  133. package/dist/cli/{chunk-FCAZQ7WV.js → chunk-2NISBXMN.js} +52 -50
  134. package/dist/cli/{chunk-PNATXKLP.js → chunk-2ZIRCBYG.js} +6 -6
  135. package/dist/cli/{chunk-5FDKJQZE.js → chunk-3BOIOCNX.js} +1 -1
  136. package/dist/cli/chunk-3BVLLJ3H.mjs +1038 -0
  137. package/dist/cli/{chunk-FJZILBL7.mjs → chunk-3U5EAP6E.mjs} +5 -5
  138. package/dist/cli/{describe-FRAVCY5F.mjs → chunk-4YZKBBLZ.mjs} +19 -36
  139. package/dist/cli/{chunk-QWRHGGUH.js → chunk-5DRNNC72.js} +20 -2
  140. package/dist/cli/{chunk-Z2GUFYT6.js → chunk-5LEAXRHV.js} +11 -11
  141. package/dist/cli/{chunk-5MDIZX7M.js → chunk-5LHXOIPT.js} +8 -6
  142. package/dist/cli/{chunk-NMJ4D2WO.js → chunk-6PMCRYDA.js} +216 -91
  143. package/dist/cli/{chunk-EBU7LQ64.js → chunk-6V7KVRR5.js} +3 -3
  144. package/dist/cli/{chunk-MGXEUZHL.mjs → chunk-7D6X7IXW.mjs} +7 -5
  145. package/dist/cli/{chunk-SAZFZQRI.js → chunk-7FCYPAPP.js} +2 -2
  146. package/dist/cli/{chunk-ACCR7POB.js → chunk-7XYDDCQ2.js} +27 -27
  147. package/dist/cli/{chunk-5IYOUBFZ.js → chunk-ALZBANZI.js} +28 -54
  148. package/dist/cli/{chunk-3DNKFH2G.mjs → chunk-BAPTQDLF.mjs} +19 -1
  149. package/dist/cli/chunk-BGNWI3KH.js +827 -0
  150. package/dist/cli/{chunk-V7REJRDZ.mjs → chunk-C25QE4CH.mjs} +1 -1
  151. package/dist/cli/{chunk-FGMX4HUZ.js → chunk-CBZP6J3V.js} +29 -27
  152. package/dist/cli/{chunk-QEYHTIV4.mjs → chunk-CTQ56DXP.mjs} +10 -1
  153. package/dist/cli/{chunk-IHHLTHE7.mjs → chunk-CVQ7N5CV.mjs} +267 -38
  154. package/dist/cli/{chunk-7DH2FD7Y.mjs → chunk-D464JW3N.mjs} +5 -85
  155. package/dist/cli/{chunk-MEAIOXJL.mjs → chunk-DHXCBITQ.mjs} +7 -5
  156. package/dist/cli/chunk-F2RHUPVH.mjs +827 -0
  157. package/dist/cli/chunk-F6QV42MC.mjs +91 -0
  158. package/dist/cli/{chunk-OZBWRICM.js → chunk-FK2HNDCN.js} +2 -2
  159. package/dist/cli/{chunk-BGY2PLP7.mjs → chunk-GUT7CLOL.mjs} +23 -49
  160. package/dist/cli/{chunk-RY4IVOU3.mjs → chunk-I624J4H5.mjs} +16 -806
  161. package/dist/cli/{chunk-Z2XUZC34.js → chunk-IAYSWZDJ.js} +188 -76
  162. package/dist/cli/{chunk-FGLKOWSC.mjs → chunk-IKWRUNAP.mjs} +1 -1
  163. package/dist/cli/{chunk-KCCOQ5G5.js → chunk-JVDKZJUH.js} +511 -282
  164. package/dist/cli/{chunk-HDFRJ4IT.mjs → chunk-JVHOS3K3.mjs} +177 -65
  165. package/dist/cli/chunk-LYFKBLJI.mjs +1039 -0
  166. package/dist/cli/{chunk-SLEUWLJE.mjs → chunk-MSY22NQW.mjs} +5 -5
  167. package/dist/cli/{chunk-5FY72YOV.js → chunk-NAPTMYTY.js} +8 -8
  168. package/dist/cli/{chunk-O6QOMHCH.js → chunk-NDHJR2WZ.js} +37 -35
  169. package/dist/cli/{chunk-KXMNM4AQ.js → chunk-NMU3VR5U.js} +4 -5
  170. package/dist/cli/chunk-NTLI6P6Y.mjs +19 -0
  171. package/dist/cli/{chunk-RFONC4WJ.mjs → chunk-O3BJYD6D.mjs} +3 -3
  172. package/dist/cli/{describe-2WQY7ZCY.js → chunk-PVY4DPPF.js} +27 -44
  173. package/dist/cli/{chunk-WIYWSYDS.mjs → chunk-Q2EIZKVX.mjs} +3 -3
  174. package/dist/cli/{chunk-VZBCEA5S.mjs → chunk-RD6IQ2JY.mjs} +223 -92
  175. package/dist/cli/chunk-RGOUCIIZ.js +1039 -0
  176. package/dist/cli/{chunk-EIMG75BT.mjs → chunk-S3A4IXBQ.mjs} +4 -5
  177. package/dist/cli/{chunk-QIW7TVV6.mjs → chunk-S4XQCFES.mjs} +14 -12
  178. package/dist/cli/chunk-SKU6ECIY.js +19 -0
  179. package/dist/cli/{chunk-CRYOUPEB.js → chunk-TIRBDQ3W.js} +16 -16
  180. package/dist/cli/{chunk-G7L27KZB.mjs → chunk-TKAQR3IB.mjs} +31 -21
  181. package/dist/cli/{chunk-MDJPEGVN.js → chunk-UC4SFYNU.js} +392 -261
  182. package/dist/cli/{chunk-3BMLICF7.mjs → chunk-UIURR26V.mjs} +13 -8
  183. package/dist/cli/{chunk-TNMBPMMC.js → chunk-UROQDCVW.js} +13 -4
  184. package/dist/cli/{chunk-R64BGGRQ.mjs → chunk-VDGTTH7K.mjs} +2 -2
  185. package/dist/cli/chunk-VLEVVDWG.js +91 -0
  186. package/dist/cli/{chunk-R2GLGLDR.mjs → chunk-VPHN2HAL.mjs} +216 -91
  187. package/dist/cli/chunk-VY2GBNTX.js +1038 -0
  188. package/dist/cli/{chunk-CFUTOWE4.js → chunk-WG3KGAII.js} +8 -88
  189. package/dist/cli/{chunk-QAJAJPKK.mjs → chunk-WUMIYOXQ.mjs} +4 -2
  190. package/dist/cli/{chunk-SCIR5JXW.js → chunk-WUZS2HK6.js} +56 -51
  191. package/dist/cli/{chunk-T3MVIPHG.mjs → chunk-XDWS2JJT.mjs} +1 -1
  192. package/dist/cli/{chunk-KGQNIA37.js → chunk-XQCTG5OO.js} +44 -34
  193. package/dist/cli/{chunk-KVJ5VHW5.mjs → chunk-XW2JIYG7.mjs} +2 -2
  194. package/dist/cli/chunk-YGGIZ3VT.js +920 -0
  195. package/dist/cli/command-docs.d.mts +5 -0
  196. package/dist/cli/command-docs.d.ts +5 -0
  197. package/dist/cli/command-docs.js +2 -2
  198. package/dist/cli/command-docs.mjs +1 -1
  199. package/dist/cli/{csv-NX7NO3O6.js → csv-EH5QWR4O.js} +13 -12
  200. package/dist/cli/{csv-DQ6GW5B5.mjs → csv-OK45Z5XQ.mjs} +4 -3
  201. package/dist/cli/{db-R72DFMP6.js → db-3ESJKETS.js} +30 -27
  202. package/dist/cli/{db-2YP33M4K.mjs → db-6Z5E4HKN.mjs} +10 -7
  203. package/dist/cli/describe-PNDQB7YS.mjs +48 -0
  204. package/dist/cli/describe-QUF7VTTR.js +48 -0
  205. package/dist/cli/describe-core.d.mts +153 -5
  206. package/dist/cli/describe-core.d.ts +153 -5
  207. package/dist/cli/describe-core.js +9 -5
  208. package/dist/cli/describe-core.mjs +10 -6
  209. package/dist/cli/{executions-WFBU7L2Q.mjs → executions-2NTWQFEG.mjs} +7 -5
  210. package/dist/cli/{executions-ZLHD4QIT.js → executions-KUOBRX5V.js} +9 -7
  211. package/dist/cli/{feedback-CN3HJFVF.mjs → feedback-7RPRMSGY.mjs} +6 -5
  212. package/dist/cli/{feedback-NDV6TPHG.js → feedback-UPHAZJ4C.js} +10 -9
  213. package/dist/cli/getting-started.d.mts +6 -6
  214. package/dist/cli/getting-started.d.ts +6 -6
  215. package/dist/cli/getting-started.js +2 -2
  216. package/dist/cli/getting-started.mjs +1 -1
  217. package/dist/cli/{git-QAD6E3HW.mjs → git-SCYP6WSZ.mjs} +5 -4
  218. package/dist/cli/git-UH653WHV.js +25 -0
  219. package/dist/cli/index.js +152 -142
  220. package/dist/cli/index.mjs +56 -46
  221. package/dist/cli/{legacy-noops-KVC5QJ74.js → legacy-noops-7XMFCVRG.js} +8 -7
  222. package/dist/cli/{legacy-noops-TPTKNBI2.mjs → legacy-noops-A4KYAGI6.mjs} +5 -4
  223. package/dist/cli/{monitors-SV57JFLO.mjs → monitors-FLC5J7RI.mjs} +19 -6
  224. package/dist/cli/{monitors-KCROV6PJ.js → monitors-NZV6IX5H.js} +103 -90
  225. package/dist/cli/{org-NJYX5743.js → org-IZ7UP3XF.js} +70 -67
  226. package/dist/cli/{org-KX6QIR7A.mjs → org-LUETJ7Z5.mjs} +9 -6
  227. package/dist/cli/pages-22ML3O7O.js +252 -0
  228. package/dist/cli/pages-EUX5EAGF.mjs +252 -0
  229. package/dist/cli/{play-IQQ57L7Z.mjs → play-CDHPAKKM.mjs} +512 -1508
  230. package/dist/cli/{play-32L7EQN4.js → play-USJBQADG.js} +1090 -2086
  231. package/dist/cli/{providers-4WEC2EQN.mjs → providers-CCXZ3SQF.mjs} +7 -5
  232. package/dist/cli/{providers-ZQV6QLVQ.js → providers-WFEUNPGC.js} +10 -8
  233. package/dist/cli/{quickstart-HKUSFADF.js → quickstart-O4JSUORZ.js} +13 -12
  234. package/dist/cli/{quickstart-RQ76RIUE.mjs → quickstart-ZUULI635.mjs} +5 -4
  235. package/dist/cli/run-ISDJYJMU.js +443 -0
  236. package/dist/cli/run-QJ4NX5F5.mjs +443 -0
  237. package/dist/cli/{search-ZRAVFBZC.mjs → search-IX3XKZJ3.mjs} +8 -6
  238. package/dist/cli/search-TIFNLRPM.js +32 -0
  239. package/dist/cli/{secrets-CMJOVNVH.mjs → secrets-7VUDXTUZ.mjs} +7 -5
  240. package/dist/cli/{secrets-J3G5Y43U.js → secrets-ELQSNCTR.js} +16 -14
  241. package/dist/cli/{sessions-WY7VN4AE.js → sessions-A3FG3AZX.js} +6 -5
  242. package/dist/cli/{sessions-MDQYY5CB.mjs → sessions-VOIQ62GB.mjs} +5 -4
  243. package/dist/cli/{settings-4RWZPCT5.mjs → settings-S6N6EFBG.mjs} +14 -11
  244. package/dist/cli/{settings-HTNTFKCE.js → settings-ZTXQEMZI.js} +80 -77
  245. package/dist/cli/{setup-P3GYYZWG.mjs → setup-AYPIK4JE.mjs} +12 -10
  246. package/dist/cli/{setup-QGCAP62X.js → setup-Y3WOIFLS.js} +53 -51
  247. package/dist/cli/{skills-7NAE4ICL.mjs → skills-5SF5QWNI.mjs} +7 -6
  248. package/dist/cli/skills-MWFRMG3H.js +31 -0
  249. package/dist/cli/tools-3XNZ4J64.mjs +55 -0
  250. package/dist/cli/tools-XEC4OD3R.js +55 -0
  251. package/dist/cli/{update-GODLRKNB.mjs → update-3U4OVX5R.mjs} +9 -8
  252. package/dist/cli/update-DWYEYTZE.js +33 -0
  253. package/dist/cli/{workflow-4BXOUVEO.mjs → workflow-2M5JP7SA.mjs} +10 -8
  254. package/dist/cli/{workflow-AO3A6LXN.js → workflow-RM7H7555.js} +20 -18
  255. package/dist/client-DS2IWYZF.d.ts +10 -0
  256. package/dist/client-DTwnz_AW.d.mts +10 -0
  257. package/dist/{client-CYqG23K1.d.ts → client-core-B_6HAIBy.d.ts} +385 -12
  258. package/dist/{client-BbU5_j7n.d.mts → client-core-DzBSlY1U.d.mts} +385 -12
  259. package/dist/{compiler-manifest-CWz_sNOQ.d.ts → compiler-manifest-Dcyd3-Zd.d.mts} +43 -1
  260. package/dist/{compiler-manifest-CWz_sNOQ.d.mts → compiler-manifest-Dcyd3-Zd.d.ts} +43 -1
  261. package/dist/errors-d-sTrZhe.d.mts +142 -0
  262. package/dist/errors-yQwfgrcX.d.ts +142 -0
  263. package/dist/{index-BF2JB_Ug.d.mts → index-C6oXchjN.d.mts} +1 -1
  264. package/dist/{index-4NPXDzlD.d.ts → index-P56zy_z5.d.ts} +1 -1
  265. package/dist/index.d.mts +11 -147
  266. package/dist/index.d.ts +11 -147
  267. package/dist/index.js +16 -12
  268. package/dist/index.mjs +15 -11
  269. package/dist/install-integrity.json +141 -104
  270. package/dist/plays/bundle-play-file.d.mts +3 -3
  271. package/dist/plays/bundle-play-file.d.ts +3 -3
  272. package/dist/plays/bundle-play-file.mjs +2 -1
  273. package/dist/plays/play-description.d.mts +2 -2
  274. package/dist/plays/play-description.d.ts +2 -2
  275. package/dist/plays/play-description.js +2 -2
  276. package/dist/plays/play-description.mjs +1 -1
  277. package/dist/plays/run-request.d.mts +2 -2
  278. package/dist/plays/run-request.d.ts +2 -2
  279. package/dist/release.d.mts +1 -1
  280. package/dist/release.d.ts +1 -1
  281. package/dist/release.js +2 -2
  282. package/dist/release.mjs +1 -1
  283. package/dist/server.d.mts +17 -0
  284. package/dist/server.d.ts +17 -0
  285. package/dist/server.js +76 -0
  286. package/dist/server.mjs +76 -0
  287. package/package.json +6 -1
  288. package/dist/cli/auth-IACERYQH.js +0 -40
  289. package/dist/cli/chunk-PQUUWFXY.js +0 -95
  290. package/dist/cli/chunk-YBWAG72P.mjs +0 -95
  291. package/dist/cli/chunk-YQDUODZW.js +0 -1710
  292. package/dist/cli/git-JVI36ZFV.js +0 -24
  293. package/dist/cli/search-75X5LTDE.js +0 -30
  294. package/dist/cli/skills-BKJ53JOQ.js +0 -30
  295. package/dist/cli/tools-COWMIEJ6.mjs +0 -45
  296. package/dist/cli/tools-TASOCE7I.js +0 -45
  297. package/dist/cli/update-SJIKVME6.js +0 -32
@@ -22,9 +22,27 @@ import {
22
22
  STANDARD_PLAY_SANDBOX_RUNTIME_LIMITS,
23
23
  validatePlaySandboxRuntimeLimits,
24
24
  } from '../../../plays/sandbox-runtime-limits';
25
- import type { PlayRunnerRuntimeLifecycleEvent } from '../types';
26
- import { DAYTONA_PLAY_RUNNER_LABEL_SOURCE } from './daytona-labels';
25
+ import type {
26
+ PlayRunnerDaytonaCleanupIntent,
27
+ PlayRunnerRuntimeLifecycleEvent,
28
+ } from '../types';
29
+ import {
30
+ daytonaSandboxMatchesOperationIdentity,
31
+ DAYTONA_PLAY_RUNNER_LABEL_SOURCE,
32
+ } from './daytona-labels';
33
+ import { logSandboxCreateOutcome } from '../sandbox-create-outcome';
27
34
  import type { DaytonaSandboxStartAdmission } from './daytona-start-admission';
35
+ import { DaytonaControlTimeoutError } from './daytona-control-transport';
36
+
37
+ function isDaytonaControlTimeout(error: unknown): boolean {
38
+ return (
39
+ error instanceof DaytonaControlTimeoutError ||
40
+ (error instanceof Error &&
41
+ error.name === 'DaytonaControlTimeoutError' &&
42
+ 'code' in error &&
43
+ error.code === 'ETIMEDOUT')
44
+ );
45
+ }
28
46
 
29
47
  // Match Daytona's supported default create window. Ten seconds is shorter
30
48
  // than normal provider startup under burst load: the SDK abandons an otherwise
@@ -69,6 +87,7 @@ export type DaytonaClient = {
69
87
  options: { timeout: number },
70
88
  ): Promise<Sandbox>;
71
89
  get?(name: string): Promise<Sandbox>;
90
+ placementForLog?(sandbox: Sandbox): Record<string, unknown>;
72
91
  delete(
73
92
  sandbox: Pick<Sandbox, 'id'>,
74
93
  timeoutSeconds?: number,
@@ -88,7 +107,7 @@ export type DaytonaStageEmitter = (
88
107
 
89
108
  type DaytonaCreateCallObserver = (
90
109
  event: PlayRunnerRuntimeLifecycleEvent,
91
- ) => Promise<void>;
110
+ ) => Promise<void> | undefined;
92
111
 
93
112
  export type AcquiredDaytonaSandbox = {
94
113
  sandbox: DaytonaSandbox;
@@ -178,6 +197,7 @@ export type DaytonaSandboxTransitionPendingLogDetail =
178
197
  lookups: number;
179
198
  lookupErrors: number;
180
199
  deleteConflicts: number;
200
+ deleteTimeouts: number;
181
201
  elapsedMs: number;
182
202
  /** Known only in the process that sent the create. */
183
203
  createResponseReceived: boolean | null;
@@ -240,12 +260,16 @@ function daytonaTransitionPendingReasonDetail(
240
260
  phase: DaytonaSandboxTransitionPendingLogDetail['phase'],
241
261
  observation: DaytonaNamedSandboxObservation,
242
262
  deleteConflicts: number,
263
+ deleteTimeouts: number,
243
264
  ): string {
244
265
  if (observation.lookup !== 'found') {
245
266
  return `${phase}:lookup_${observation.lookup}`;
246
267
  }
247
- // Reconcile reaches a pending decision with a visible sandbox only after
248
- // every delete of it reported an in-progress state change.
268
+ // A visible sandbox may remain in its original create transition, or its
269
+ // deletion may have conflicted or timed out.
270
+ if (deleteTimeouts > 0) {
271
+ return `${phase}:delete_timeout:${observation.sandboxState}`;
272
+ }
249
273
  return deleteConflicts > 0
250
274
  ? `${phase}:delete_conflict:${observation.sandboxState}`
251
275
  : `${phase}:sandbox_state:${observation.sandboxState}`;
@@ -262,8 +286,14 @@ function daytonaTransitionPendingLogDetail(input: {
262
286
  launchOutcome: DaytonaLaunchOutcomeDiagnostic | null;
263
287
  }): DaytonaSandboxTransitionPendingLogDetail | null {
264
288
  try {
265
- const { last, lookups, lookupErrors, deleteConflicts, elapsedMs } =
266
- input.observed;
289
+ const {
290
+ last,
291
+ lookups,
292
+ lookupErrors,
293
+ deleteConflicts,
294
+ deleteTimeouts,
295
+ elapsedMs,
296
+ } = input.observed;
267
297
  return {
268
298
  ...last,
269
299
  phase: input.phase,
@@ -271,11 +301,13 @@ function daytonaTransitionPendingLogDetail(input: {
271
301
  input.phase,
272
302
  last,
273
303
  deleteConflicts,
304
+ deleteTimeouts,
274
305
  ),
275
306
  providerAttempt: input.providerAttempt,
276
307
  lookups,
277
308
  lookupErrors,
278
309
  deleteConflicts,
310
+ deleteTimeouts,
279
311
  elapsedMs,
280
312
  createResponseReceived:
281
313
  input.launchOutcome?.createResponseReceived ?? null,
@@ -340,6 +372,44 @@ function isDaytonaSandboxNotFound(error: unknown): boolean {
340
372
  return /\b(?:sandbox )?not found\b|\b404\b/i.test(message);
341
373
  }
342
374
 
375
+ /** How long an in-process delete waits for Daytona to stop returning it. */
376
+ export const DAYTONA_DELETE_CONFIRMATION_TIMEOUT_MS = 30_000;
377
+ const DAYTONA_DELETE_CONFIRMATION_BACKOFF_INITIAL_MS = 100;
378
+ const DAYTONA_DELETE_CONFIRMATION_BACKOFF_MAX_MS = 5_000;
379
+
380
+ /**
381
+ * An accepted DELETE only starts Daytona's work, and the sandbox can keep
382
+ * running after it. Read the exact id until Daytona answers 404. A sandbox
383
+ * still returned at the deadline, or a read that fails some other way, proves
384
+ * nothing, so the caller keeps the sandbox's capacity and identity.
385
+ */
386
+ async function confirmDaytonaSandboxDeleted(input: {
387
+ daytona: DaytonaClient;
388
+ sandboxId: string;
389
+ cancellationSignal?: AbortSignal;
390
+ }): Promise<boolean> {
391
+ if (!input.daytona.get) return false;
392
+ const deadlineAt = Date.now() + DAYTONA_DELETE_CONFIRMATION_TIMEOUT_MS;
393
+ let backoffMs = DAYTONA_DELETE_CONFIRMATION_BACKOFF_INITIAL_MS;
394
+ for (;;) {
395
+ try {
396
+ await input.daytona.get(input.sandboxId);
397
+ } catch (error) {
398
+ return isDaytonaSandboxNotFound(error);
399
+ }
400
+ const remainingMs = deadlineAt - Date.now();
401
+ if (remainingMs <= 0) return false;
402
+ await waitForAcquisitionRetry(
403
+ Math.min(backoffMs, remainingMs),
404
+ input.cancellationSignal,
405
+ );
406
+ backoffMs = Math.min(
407
+ backoffMs * 2,
408
+ DAYTONA_DELETE_CONFIRMATION_BACKOFF_MAX_MS,
409
+ );
410
+ }
411
+ }
412
+
343
413
  type DaytonaCreateResult = {
344
414
  sandbox: DaytonaSandbox;
345
415
  attempt: number;
@@ -363,6 +433,7 @@ async function rejectAcquiredSandbox(
363
433
  reservation: { leaseId: string } | undefined,
364
434
  releaseSandboxCapacity: ((leaseId: string) => Promise<void>) | undefined,
365
435
  deleteSandbox: () => Promise<void>,
436
+ confirmDeleted: () => Promise<boolean>,
366
437
  ): Promise<never> {
367
438
  try {
368
439
  await deleteSandbox();
@@ -376,6 +447,14 @@ async function rejectAcquiredSandbox(
376
447
  );
377
448
  }
378
449
  if (reservation) {
450
+ if (!(await confirmDeleted())) {
451
+ // Releasing now would count a sandbox Daytona still returns as gone.
452
+ // Nothing re-reads it once this run fails, so the reservation ends at
453
+ // its crash-backstop TTL, as it does when the delete itself fails above.
454
+ throw new Error(
455
+ `${reason} Daytona accepted the defensive deletion of sandbox ${sandbox.id} but still returns it, so its capacity stays held.`,
456
+ );
457
+ }
379
458
  await releaseSandboxCapacity?.(reservation.leaseId);
380
459
  }
381
460
  throw new Error(reason);
@@ -545,6 +624,7 @@ type TimedOutDaytonaSandboxReconcileObserved = {
545
624
  lookups: number;
546
625
  lookupErrors: number;
547
626
  deleteConflicts: number;
627
+ deleteTimeouts: number;
548
628
  elapsedMs: number;
549
629
  };
550
630
 
@@ -561,25 +641,32 @@ async function reconcileAndDeleteTimedOutDaytonaSandbox(input: {
561
641
  cancellationSignal?: AbortSignal;
562
642
  emitStage?: DaytonaStageEmitter;
563
643
  operationIdentity?: {
644
+ leaseId: string;
564
645
  providerOperationToken: string;
565
646
  orgId: string;
566
647
  runId?: string;
567
648
  };
649
+ recordCleanupIntent?: (
650
+ intent: PlayRunnerDaytonaCleanupIntent,
651
+ ) => Promise<void>;
568
652
  }): Promise<TimedOutDaytonaSandboxReconciliation> {
569
653
  const reconcileStartedAt = Date.now();
570
654
  let last = NO_DAYTONA_NAMED_SANDBOX_LOOKUP;
571
655
  let lookups = 0;
572
656
  let lookupErrors = 0;
573
657
  let deleteConflicts = 0;
658
+ let deleteTimeouts = 0;
574
659
  const observed = (): TimedOutDaytonaSandboxReconcileObserved => ({
575
660
  last,
576
661
  lookups,
577
662
  lookupErrors,
578
663
  deleteConflicts,
664
+ deleteTimeouts,
579
665
  elapsedMs: Date.now() - reconcileStartedAt,
580
666
  });
581
667
  if (!input.daytona.get) return { kind: 'not_found', observed: observed() };
582
668
  let lastDeleteConflict: unknown = null;
669
+ let sawDeleteTimeout = false;
583
670
  for (const delayMs of DAYTONA_TIMED_OUT_CREATE_RECONCILE_DELAYS_MS) {
584
671
  input.cancellationSignal?.throwIfAborted();
585
672
  if (delayMs > 0) {
@@ -613,36 +700,56 @@ async function reconcileAndDeleteTimedOutDaytonaSandbox(input: {
613
700
  input.emitStage?.('create:reconcile_state', {
614
701
  sandboxId: sandbox.id,
615
702
  state: sandbox.state ?? null,
703
+ ...input.daytona.placementForLog?.(sandbox),
616
704
  });
617
- // `create` waits only a bounded interval, but the named sandbox may finish
618
- // the same create transition immediately afterwards. It is already the
619
- // durable identity associated with this provider operation, so reusing it
620
- // is safer and faster than attempting a conflicting delete or creating a
621
- // second sandbox.
622
- if (sandbox.state === 'started') {
623
- return { kind: 'started', sandbox, observed: observed() };
624
- }
625
705
  last = observeDaytonaNamedSandbox(sandbox);
626
706
  if (input.operationIdentity) {
627
707
  const expected = input.operationIdentity;
628
708
  const configuredOrganizationId =
629
709
  process.env.DAYTONA_ORGANIZATION_ID?.trim();
630
710
  if (
631
- sandbox.name !== input.sandboxName ||
632
- sandbox.labels?.source !== DAYTONA_PLAY_RUNNER_LABEL_SOURCE ||
633
- sandbox.labels?.operationKey !== expected.providerOperationToken ||
634
- sandbox.labels?.orgId !== normalizeLabelValue(expected.orgId) ||
635
- (normalizeLabelValue(expected.runId) &&
636
- sandbox.labels?.runId !== normalizeLabelValue(expected.runId)) ||
637
- !sandbox.organizationId?.trim() ||
638
- (configuredOrganizationId &&
639
- sandbox.organizationId !== configuredOrganizationId)
711
+ !daytonaSandboxMatchesOperationIdentity({
712
+ sandbox,
713
+ sandboxName: input.sandboxName,
714
+ providerOperationToken: expected.providerOperationToken,
715
+ orgId: expected.orgId,
716
+ runId: expected.runId,
717
+ configuredOrganizationId,
718
+ })
640
719
  ) {
641
720
  throw new Error(
642
721
  'Daytona resumed sandbox identity or organization routing does not match its reserved operation. Cleanup and fallback suppressed.',
643
722
  );
644
723
  }
645
724
  }
725
+ // Keep an in-progress create under its original reservation. A late start
726
+ // belongs to the same operation, unless a prior DELETE timed out and made
727
+ // that sandbox's future state ambiguous.
728
+ if (sandbox.state === 'creating' && !sawDeleteTimeout) continue;
729
+ if (sandbox.state === 'started' && !sawDeleteTimeout) {
730
+ return { kind: 'started', sandbox, observed: observed() };
731
+ }
732
+ // Persist the exact identity before handing stable or ambiguously-deleted
733
+ // resources to the cleanup worker. Never turn a still-creating sandbox
734
+ // into a delete intent: its create may complete and be safely resumed.
735
+ if (input.operationIdentity && input.recordCleanupIntent) {
736
+ if (!input.operationIdentity.runId || !sandbox.organizationId?.trim()) {
737
+ throw new Error(
738
+ 'Daytona timed-out sandbox lacks the run or organization identity required for durable cleanup.',
739
+ );
740
+ }
741
+ await input.recordCleanupIntent({
742
+ leaseId: input.operationIdentity.leaseId,
743
+ providerOperationToken: input.operationIdentity.providerOperationToken,
744
+ orgId: input.operationIdentity.orgId,
745
+ runId: input.operationIdentity.runId,
746
+ sandboxId: sandbox.id,
747
+ routingDomain: sandbox.organizationId,
748
+ });
749
+ return { kind: 'transition_pending', observed: observed() };
750
+ }
751
+ // After a DELETE timed out, never run the sandbox until this same named
752
+ // identity is confirmed deleted or remains pending cleanup.
646
753
  try {
647
754
  await input.daytona.delete(sandbox, 30);
648
755
  } catch (error) {
@@ -656,14 +763,30 @@ async function reconcileAndDeleteTimedOutDaytonaSandbox(input: {
656
763
  deleteConflicts += 1;
657
764
  continue;
658
765
  }
766
+ if (isDaytonaControlTimeout(error)) {
767
+ sawDeleteTimeout = true;
768
+ deleteTimeouts += 1;
769
+ continue;
770
+ }
659
771
  throw new Error(
660
772
  `Daytona timed-out sandbox ${sandbox.id} was reconciled by name but could not be deleted. Modal fallback suppressed.`,
661
773
  { cause: error },
662
774
  );
663
775
  }
664
- return { kind: 'deleted', observed: observed() };
776
+ if (
777
+ await confirmDaytonaSandboxDeleted({
778
+ daytona: input.daytona,
779
+ sandboxId: sandbox.id,
780
+ cancellationSignal: input.cancellationSignal,
781
+ })
782
+ ) {
783
+ return { kind: 'deleted', observed: observed() };
784
+ }
785
+ // Accepted is not gone. Keep this identity and its capacity: the
786
+ // scheduler resumes the same name and re-reads it.
787
+ return { kind: 'transition_pending', observed: observed() };
665
788
  }
666
- if (lastDeleteConflict) {
789
+ if (lastDeleteConflict || sawDeleteTimeout || last.lookup === 'found') {
667
790
  return { kind: 'transition_pending', observed: observed() };
668
791
  }
669
792
  return { kind: 'not_found', observed: observed() };
@@ -685,9 +808,13 @@ async function createRetriedOneShotDaytonaSandbox(input: {
685
808
  leaseId: string;
686
809
  providerOperationToken: string | null;
687
810
  resumeExistingProviderOperation?: boolean;
811
+ resumePendingDelete?: boolean;
688
812
  existingProviderOperationAgeMs?: number;
689
813
  }>;
690
814
  releaseSandboxCapacity?: (leaseId: string) => Promise<void>;
815
+ recordCleanupIntent?: (
816
+ intent: PlayRunnerDaytonaCleanupIntent,
817
+ ) => Promise<void>;
691
818
  nextProviderAttempt: () => number;
692
819
  startedAt: number;
693
820
  cancellationSignal?: AbortSignal;
@@ -716,6 +843,20 @@ async function createRetriedOneShotDaytonaSandbox(input: {
716
843
  const reservation = await input.reserveSandboxCapacity?.(attempt);
717
844
  const sandboxName = daytonaSandboxName(reservation?.providerOperationToken);
718
845
  let recreatedAfter: TimedOutDaytonaSandboxReconcileObserved | null = null;
846
+ if (reservation?.resumePendingDelete) {
847
+ input.emitStage('create:resume_delete_pending', {
848
+ attempt,
849
+ sandboxName,
850
+ });
851
+ throw new DaytonaSandboxTransitionPendingError(sandboxName);
852
+ }
853
+ if (
854
+ reservation &&
855
+ !reservation.providerOperationToken &&
856
+ input.recordCleanupIntent
857
+ ) {
858
+ throw new DaytonaSandboxTransitionPendingError(sandboxName);
859
+ }
719
860
  if (reservation?.resumeExistingProviderOperation) {
720
861
  if (!reservation.providerOperationToken) {
721
862
  throw new DaytonaSandboxTransitionPendingError(sandboxName);
@@ -728,10 +869,12 @@ async function createRetriedOneShotDaytonaSandbox(input: {
728
869
  cancellationSignal: input.cancellationSignal,
729
870
  emitStage: input.emitStage,
730
871
  operationIdentity: {
872
+ leaseId: reservation.leaseId,
731
873
  providerOperationToken: reservation.providerOperationToken,
732
874
  orgId: input.orgId,
733
875
  runId: input.context.runId ?? undefined,
734
876
  },
877
+ recordCleanupIntent: input.recordCleanupIntent,
735
878
  });
736
879
  if (reconciliation.kind === 'started') {
737
880
  const sandbox = reconciliation.sandbox;
@@ -798,13 +941,25 @@ async function createRetriedOneShotDaytonaSandbox(input: {
798
941
  // can be ambiguous, so retain its lease until the crash TTL rather than
799
942
  // admitting another sandbox against an unknown provider outcome.
800
943
  const message = error instanceof Error ? error.message : String(error);
801
- const recordCreateFailure = () =>
802
- input.observeCreateCall?.({
944
+ const recordCreateFailure = () => {
945
+ const errorClass = daytonaCreateErrorClass(error);
946
+ logSandboxCreateOutcome({
947
+ provider: 'daytona',
948
+ outcome:
949
+ error instanceof DaytonaLaunchOutcomeUnknownError ||
950
+ errorClass === 'timeout'
951
+ ? 'unknown'
952
+ : 'failed',
953
+ runId: input.context.runId,
954
+ reason: errorClass,
955
+ });
956
+ return input.observeCreateCall?.({
803
957
  type: 'daytona_create_call_failed',
804
958
  occurredAtMs: Date.now(),
805
959
  providerAttempt: attempt,
806
- errorClass: daytonaCreateErrorClass(error),
960
+ errorClass,
807
961
  });
962
+ };
808
963
  errors.push(message);
809
964
  runErrors.push(
810
965
  isDaytonaProviderError(error)
@@ -848,6 +1003,19 @@ async function createRetriedOneShotDaytonaSandbox(input: {
848
1003
  sandboxName,
849
1004
  cancellationSignal: input.cancellationSignal,
850
1005
  emitStage: input.emitStage,
1006
+ ...(input.recordCleanupIntent &&
1007
+ reservation?.providerOperationToken &&
1008
+ reservation.leaseId
1009
+ ? {
1010
+ operationIdentity: {
1011
+ leaseId: reservation.leaseId,
1012
+ providerOperationToken: reservation.providerOperationToken,
1013
+ orgId: input.orgId,
1014
+ runId: input.context.runId ?? undefined,
1015
+ },
1016
+ recordCleanupIntent: input.recordCleanupIntent,
1017
+ }
1018
+ : {}),
851
1019
  });
852
1020
  } catch (reconciliationError) {
853
1021
  await recordCreateFailure();
@@ -1002,10 +1170,17 @@ async function acquireOneShotDaytonaSandbox(input: {
1002
1170
  context: DaytonaExecutionContext;
1003
1171
  emitStage: DaytonaStageEmitter;
1004
1172
  observeCreateCall?: DaytonaCreateCallObserver;
1005
- reserveSandboxCapacity?: (
1006
- providerAttempt: number,
1007
- ) => Promise<{ leaseId: string; providerOperationToken: string | null }>;
1173
+ reserveSandboxCapacity?: (providerAttempt: number) => Promise<{
1174
+ leaseId: string;
1175
+ providerOperationToken: string | null;
1176
+ resumeExistingProviderOperation?: boolean;
1177
+ resumePendingDelete?: boolean;
1178
+ existingProviderOperationAgeMs?: number;
1179
+ }>;
1008
1180
  releaseSandboxCapacity?: (leaseId: string) => Promise<void>;
1181
+ recordCleanupIntent?: (
1182
+ intent: PlayRunnerDaytonaCleanupIntent,
1183
+ ) => Promise<void>;
1009
1184
  nextProviderAttempt: () => number;
1010
1185
  startedAt: number;
1011
1186
  startAdmission?: DaytonaSandboxStartAdmission;
@@ -1045,6 +1220,12 @@ async function acquireOneShotDaytonaSandbox(input: {
1045
1220
  diskGiB: result.sandbox.disk,
1046
1221
  gpu: result.sandbox.gpu ?? 0,
1047
1222
  };
1223
+ const confirmDeleted = () =>
1224
+ confirmDaytonaSandboxDeleted({
1225
+ daytona: input.daytona,
1226
+ sandboxId: result.sandbox.id,
1227
+ cancellationSignal: input.cancellationSignal,
1228
+ });
1048
1229
  if (
1049
1230
  granted.cpu !== limits.cpu ||
1050
1231
  granted.memoryGiB !== limits.memoryGiB ||
@@ -1059,6 +1240,7 @@ async function acquireOneShotDaytonaSandbox(input: {
1059
1240
  : undefined,
1060
1241
  input.releaseSandboxCapacity,
1061
1242
  () => input.daytona.delete(result.sandbox, 30),
1243
+ confirmDeleted,
1062
1244
  );
1063
1245
  }
1064
1246
  const configuredOrganizationId =
@@ -1077,6 +1259,7 @@ async function acquireOneShotDaytonaSandbox(input: {
1077
1259
  : undefined,
1078
1260
  input.releaseSandboxCapacity,
1079
1261
  () => input.daytona.delete(result.sandbox, 30),
1262
+ confirmDeleted,
1080
1263
  );
1081
1264
  }
1082
1265
  let lookupOrganizationId: string | null = null;
@@ -1104,6 +1287,7 @@ async function acquireOneShotDaytonaSandbox(input: {
1104
1287
  : undefined,
1105
1288
  input.releaseSandboxCapacity,
1106
1289
  () => input.daytona.delete(result.sandbox, 30),
1290
+ confirmDeleted,
1107
1291
  );
1108
1292
  }
1109
1293
  const billingStartedAt = Date.now();
@@ -1143,9 +1327,13 @@ export function createOneShotDaytonaSandboxLifecycle(input: {
1143
1327
  leaseId: string;
1144
1328
  providerOperationToken: string | null;
1145
1329
  resumeExistingProviderOperation?: boolean;
1330
+ resumePendingDelete?: boolean;
1146
1331
  existingProviderOperationAgeMs?: number;
1147
1332
  }>;
1148
1333
  releaseSandboxCapacity?: (leaseId: string) => Promise<void>;
1334
+ recordCleanupIntent?: (
1335
+ intent: PlayRunnerDaytonaCleanupIntent,
1336
+ ) => Promise<void>;
1149
1337
  startAdmission?: DaytonaSandboxStartAdmission;
1150
1338
  cancellationSignal?: AbortSignal;
1151
1339
  startedAt?: number;
@@ -1165,6 +1353,7 @@ export function createOneShotDaytonaSandboxLifecycle(input: {
1165
1353
  observeCreateCall: input.observeCreateCall,
1166
1354
  reserveSandboxCapacity: input.reserveSandboxCapacity,
1167
1355
  releaseSandboxCapacity: input.releaseSandboxCapacity,
1356
+ recordCleanupIntent: input.recordCleanupIntent,
1168
1357
  startAdmission: input.startAdmission,
1169
1358
  cancellationSignal: input.cancellationSignal,
1170
1359
  nextProviderAttempt: () => {
@@ -1197,11 +1386,23 @@ export function createOneShotDaytonaSandboxLifecycle(input: {
1197
1386
  try {
1198
1387
  const acquired = await latestAcquiredSandboxPromise;
1199
1388
  await acquired.deleteSandbox();
1200
- // `dispose` has provider-confirmed that the sandbox is gone. This is
1201
- // normally the narrow cancellation window before the scheduler has
1202
- // durably recorded the resource, so no cleanup job will release an
1203
- // unbound lease on our behalf.
1389
+ // This is normally the narrow cancellation window before the scheduler
1390
+ // has durably recorded the resource, so no cleanup job will release an
1391
+ // unbound lease on our behalf. Release it only once Daytona stops
1392
+ // returning the sandbox; otherwise the reservation keeps its name for
1393
+ // the scheduler to resume and re-read.
1204
1394
  if (acquired.sandboxCapacityLeaseId) {
1395
+ if (
1396
+ !(await confirmDaytonaSandboxDeleted({
1397
+ daytona: input.daytona,
1398
+ sandboxId: acquired.sandbox.id,
1399
+ }))
1400
+ ) {
1401
+ console.warn('[play-runner.daytona.dispose_delete_unconfirmed]', {
1402
+ sandboxId: acquired.sandbox.id,
1403
+ });
1404
+ return;
1405
+ }
1205
1406
  await input.releaseSandboxCapacity?.(acquired.sandboxCapacityLeaseId);
1206
1407
  }
1207
1408
  } catch (error) {