deepline 0.3.460 → 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.
- package/dist/bundling-sources/sdk/src/client-core.ts +7593 -0
- package/dist/bundling-sources/sdk/src/client.ts +8 -7366
- package/dist/bundling-sources/sdk/src/http-core.ts +1239 -0
- package/dist/bundling-sources/sdk/src/http.ts +6 -1231
- package/dist/bundling-sources/sdk/src/index.ts +4 -1
- package/dist/bundling-sources/sdk/src/play.ts +5 -5
- package/dist/bundling-sources/sdk/src/plays/client-core.ts +437 -0
- package/dist/bundling-sources/sdk/src/plays/client.ts +4 -421
- package/dist/bundling-sources/sdk/src/plays/input-example.ts +3 -4
- package/dist/bundling-sources/sdk/src/plays/play-description.ts +1 -1
- package/dist/bundling-sources/sdk/src/plays/run-request.ts +1 -1
- package/dist/bundling-sources/sdk/src/release.ts +1 -1
- package/dist/bundling-sources/sdk/src/server.ts +43 -0
- package/dist/bundling-sources/sdk/src/types.ts +15 -5
- package/dist/bundling-sources/shared_libs/integration-contracts/billing-entitlements.ts +15 -0
- package/dist/bundling-sources/shared_libs/monitors/billing/state.ts +28 -0
- package/dist/bundling-sources/shared_libs/monitors/callback-security.ts +0 -307
- package/dist/bundling-sources/shared_libs/monitors/http-error-response.ts +3 -0
- package/dist/bundling-sources/shared_libs/monitors/lifecycle-notifications.ts +3 -2
- package/dist/bundling-sources/shared_libs/monitors/package.json +2 -0
- package/dist/bundling-sources/shared_libs/monitors/provider-callback-verification.ts +34 -0
- package/dist/bundling-sources/shared_libs/monitors/provider-monitor-batch-operation.ts +59 -0
- package/dist/bundling-sources/shared_libs/monitors/provider-monitor-upstream-identity.ts +94 -1
- package/dist/bundling-sources/shared_libs/monitors/signal-radars/inbound-dead-letter.ts +35 -1
- package/dist/bundling-sources/shared_libs/monitors/signal-radars/inbound-failure-codes.ts +24 -0
- package/dist/bundling-sources/shared_libs/observability/dlq.ts +32 -0
- package/dist/bundling-sources/shared_libs/observability/scheduled-jobs.json +57 -3
- package/dist/bundling-sources/shared_libs/observability/scheduled-work.ts +1 -0
- package/dist/bundling-sources/shared_libs/play-data-plane/r2.ts +66 -1
- package/dist/bundling-sources/shared_libs/play-data-plane/sheet-column-storage.ts +36 -7
- package/dist/bundling-sources/shared_libs/play-runtime/app-runtime-api.ts +250 -11
- package/dist/bundling-sources/shared_libs/play-runtime/array-input-store.ts +319 -0
- package/dist/bundling-sources/shared_libs/play-runtime/context.ts +991 -359
- package/dist/bundling-sources/shared_libs/play-runtime/ctx-types.ts +17 -0
- package/dist/bundling-sources/shared_libs/play-runtime/daytona-sandbox-janitor.ts +13 -0
- package/dist/bundling-sources/shared_libs/play-runtime/daytona-sandbox-reaper.ts +110 -0
- package/dist/bundling-sources/shared_libs/play-runtime/deployment/fly-machines.ts +155 -6
- package/dist/bundling-sources/shared_libs/play-runtime/deployment/fly-registry.ts +110 -6
- package/dist/bundling-sources/shared_libs/play-runtime/durable-receipt-execution.ts +127 -13
- package/dist/bundling-sources/shared_libs/play-runtime/execution-capabilities.ts +14 -1
- package/dist/bundling-sources/shared_libs/play-runtime/fixture-behavior.ts +57 -1
- package/dist/bundling-sources/shared_libs/play-runtime/free-company-lookup-batching.ts +218 -0
- package/dist/bundling-sources/shared_libs/play-runtime/gateway-postgres-admission.ts +42 -5
- package/dist/bundling-sources/shared_libs/play-runtime/governor/app-runtime-budget-state-backend.ts +6 -1
- package/dist/bundling-sources/shared_libs/play-runtime/governor/app-runtime-rate-state-backend.ts +92 -31
- package/dist/bundling-sources/shared_libs/play-runtime/governor/block-reserving-budget-state-backend.ts +69 -14
- package/dist/bundling-sources/shared_libs/play-runtime/governor/governor.ts +93 -23
- package/dist/bundling-sources/shared_libs/play-runtime/governor/in-memory-rate-state-backend.ts +15 -4
- package/dist/bundling-sources/shared_libs/play-runtime/governor/policy.ts +22 -18
- package/dist/bundling-sources/shared_libs/play-runtime/governor/rate-state-backend.ts +5 -0
- package/dist/bundling-sources/shared_libs/play-runtime/launch-identity.ts +2 -0
- package/dist/bundling-sources/shared_libs/play-runtime/map-memory-limits.ts +190 -14
- package/dist/bundling-sources/shared_libs/play-runtime/memory-ledger.ts +131 -0
- package/dist/bundling-sources/shared_libs/play-runtime/modal-runtime-config.ts +77 -2
- package/dist/bundling-sources/shared_libs/play-runtime/output-size-limits.ts +271 -2
- package/dist/bundling-sources/shared_libs/play-runtime/play-run-recovery-policy.ts +51 -0
- package/dist/bundling-sources/shared_libs/play-runtime/play-runs/sandbox-cleanup/contracts.ts +2 -0
- package/dist/bundling-sources/shared_libs/play-runtime/play-runs/sandbox-cleanup/job.ts +27 -1
- package/dist/bundling-sources/shared_libs/play-runtime/play-runtime-batching-registry.ts +2 -0
- package/dist/bundling-sources/shared_libs/play-runtime/protocol.ts +3 -0
- package/dist/bundling-sources/shared_libs/play-runtime/provider-text-for-log.ts +63 -0
- package/dist/bundling-sources/shared_libs/play-runtime/resource-governor.ts +19 -0
- package/dist/bundling-sources/shared_libs/play-runtime/run-ledger-event-transport.ts +112 -16
- package/dist/bundling-sources/shared_libs/play-runtime/run-ledger.ts +104 -2
- package/dist/bundling-sources/shared_libs/play-runtime/runner-app/index.ts +265 -151
- package/dist/bundling-sources/shared_libs/play-runtime/runner-app/runtime-gateway-transport.ts +17 -0
- package/dist/bundling-sources/shared_libs/play-runtime/runner-app/runtime-progress-push.ts +35 -14
- package/dist/bundling-sources/shared_libs/play-runtime/runner-app/runtime-sheet-persistence-retry.ts +12 -1
- package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-control-transport.ts +4 -0
- package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-labels.ts +36 -0
- package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-launch-transport.ts +136 -70
- package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-lifecycle.ts +237 -36
- package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-runtime-watchdog.ts +148 -4
- package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-session-execution.ts +6 -0
- package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona.ts +285 -32
- package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/modal.ts +251 -56
- package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/runtime-sandbox-reconciliation.ts +29 -4
- package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/sandbox-create-outcome.ts +27 -0
- package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/types.ts +22 -1
- package/dist/bundling-sources/shared_libs/play-runtime/runtime-api.ts +1397 -382
- package/dist/bundling-sources/shared_libs/play-runtime/runtime-array-input-receipts.ts +920 -0
- package/dist/bundling-sources/shared_libs/play-runtime/runtime-constants.ts +16 -0
- package/dist/bundling-sources/shared_libs/play-runtime/runtime-environment.ts +38 -0
- package/dist/bundling-sources/shared_libs/play-runtime/runtime-flow.ts +6 -0
- package/dist/bundling-sources/shared_libs/play-runtime/runtime-incident-drills.ts +26 -1
- package/dist/bundling-sources/shared_libs/play-runtime/runtime-operation-contract.ts +30 -0
- package/dist/bundling-sources/shared_libs/play-runtime/runtime-receipt-store-adapter.ts +14 -3
- package/dist/bundling-sources/shared_libs/play-runtime/runtime-receipt-writer.ts +31 -4
- package/dist/bundling-sources/shared_libs/play-runtime/runtime-sheet-row-transition.ts +47 -0
- package/dist/bundling-sources/shared_libs/play-runtime/sandbox-compute-usage.ts +20 -7
- package/dist/bundling-sources/shared_libs/play-runtime/sandbox-runs/contract.ts +12 -0
- package/dist/bundling-sources/shared_libs/play-runtime/sandbox-runs/index.ts +9 -0
- package/dist/bundling-sources/shared_libs/play-runtime/sandbox-runs/runner-backend-adapter.ts +10 -0
- package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backend.ts +4 -0
- package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-runtime-worker.ts +1496 -320
- package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-worker-required-env.ts +31 -1
- package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres.ts +1389 -129
- package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/receipt-gateway.ts +36 -0
- package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/run-ledger-dispatch-authority.ts +4 -0
- package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/run-ledger-outbox-recovery.ts +162 -23
- package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-event-search.ts +499 -115
- package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-sandbox-capacity.ts +377 -9
- package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-sandbox-ledger-reconciliation.ts +117 -8
- package/dist/bundling-sources/shared_libs/play-runtime/secret-resolution-retry-policy.ts +25 -0
- package/dist/bundling-sources/shared_libs/play-runtime/terminal-runtime-performance.ts +391 -0
- package/dist/bundling-sources/shared_libs/play-runtime/test-runtime-seams.ts +40 -0
- package/dist/bundling-sources/shared_libs/play-runtime/tool-call/index.ts +6 -0
- package/dist/bundling-sources/shared_libs/play-runtime/tool-call/mapped-calls.ts +171 -0
- package/dist/bundling-sources/shared_libs/play-runtime/tool-call/receipt-cohort.ts +16 -1
- package/dist/bundling-sources/shared_libs/play-runtime/tool-execute-retry-policy.ts +26 -3
- package/dist/bundling-sources/shared_libs/play-runtime/tool-result.ts +16 -2
- package/dist/bundling-sources/shared_libs/play-runtime/transport-error-diagnostics.ts +28 -0
- package/dist/bundling-sources/shared_libs/play-runtime/work-receipt-storage-contract.ts +55 -5
- package/dist/bundling-sources/shared_libs/plays/authoring-contract.ts +41 -1
- package/dist/bundling-sources/shared_libs/plays/contracts.ts +4 -0
- package/dist/bundling-sources/shared_libs/plays/dataset.ts +9 -3
- package/dist/bundling-sources/shared_libs/plays/deploy/manifest-contract.ts +2 -0
- package/dist/bundling-sources/shared_libs/plays/deploy/manifest.ts +3 -2
- package/dist/bundling-sources/shared_libs/plays/deploy/project-serializer.ts +2 -2
- package/dist/bundling-sources/shared_libs/plays/run-output-summary.ts +66 -0
- package/dist/bundling-sources/shared_libs/plays/script-entry.ts +1 -1
- package/dist/bundling-sources/shared_libs/product-notifications/catalog.ts +43 -1
- package/dist/bundling-sources/shared_libs/product-notifications/content.ts +9 -0
- package/dist/bundling-sources/shared_libs/product-notifications/email.ts +91 -13
- package/dist/bundling-sources/shared_libs/product-notifications/events.ts +3 -0
- package/dist/bundling-sources/shared_libs/product-notifications/slack-delivery.ts +41 -24
- package/dist/bundling-sources/shared_libs/security/attested-client-ip.ts +91 -0
- package/dist/bundling-sources/shared_libs/security/internal-actor.ts +0 -11
- package/dist/cli/{auth-HKA6ZVHQ.mjs → auth-JDLEY7VU.mjs} +5 -4
- package/dist/cli/auth-UXKY6TCC.js +41 -0
- package/dist/cli/{billing-MTO2ZZ3G.js → billing-HXAXB3XZ.js} +152 -78
- package/dist/cli/{billing-26G44S5N.mjs → billing-SDHLBLMV.mjs} +84 -10
- package/dist/cli/{chunk-BHGII2D6.js → chunk-3ACMRZRV.js} +8 -6
- package/dist/cli/{chunk-S4Q2XCGM.mjs → chunk-3KZCFOZ6.mjs} +1 -1
- package/dist/cli/chunk-4KQ6SIBC.mjs +1038 -0
- package/dist/cli/{chunk-Z2GUFYT6.js → chunk-5LEAXRHV.js} +11 -11
- package/dist/cli/{chunk-XAYO3Q2X.mjs → chunk-6NNVJDVR.mjs} +7 -5
- package/dist/cli/{chunk-NMJ4D2WO.js → chunk-6PMCRYDA.js} +216 -91
- package/dist/cli/{chunk-OMM54B3X.mjs → chunk-6RNQGWFD.mjs} +16 -806
- package/dist/cli/{chunk-EBU7LQ64.js → chunk-6V7KVRR5.js} +3 -3
- package/dist/cli/{chunk-RDPTDDKX.js → chunk-7LFIMWMW.js} +2 -2
- package/dist/cli/chunk-7MJ6VI2T.mjs +19 -0
- package/dist/cli/chunk-7SWNPNML.js +1039 -0
- package/dist/cli/{chunk-CTRPCARW.mjs → chunk-7U3XNPOA.mjs} +267 -38
- package/dist/cli/{chunk-RBTTUYZZ.js → chunk-7VZHXVOQ.js} +1 -1
- package/dist/cli/{chunk-YVBWO647.mjs → chunk-AT636LLU.mjs} +2 -2
- package/dist/cli/{chunk-VTODQWQA.js → chunk-BGTPIMSM.js} +392 -261
- package/dist/cli/{chunk-KADIT5NV.mjs → chunk-CKSOY47X.mjs} +2 -2
- package/dist/cli/{chunk-7DH2FD7Y.mjs → chunk-D464JW3N.mjs} +5 -85
- package/dist/cli/chunk-D6DXOUTO.mjs +827 -0
- package/dist/cli/{describe-QW54QQNB.js → chunk-EM4TXCCI.js} +27 -44
- package/dist/cli/chunk-F6QV42MC.mjs +91 -0
- package/dist/cli/chunk-FKVYR3QA.mjs +1039 -0
- package/dist/cli/{chunk-LMAULZLF.js → chunk-GEGW5HPZ.js} +29 -27
- package/dist/cli/{chunk-M52JQSLK.js → chunk-HUB3CCM2.js} +13 -4
- package/dist/cli/{chunk-YHTQM5XI.js → chunk-I6VHOU5O.js} +27 -27
- package/dist/cli/{chunk-Z2XUZC34.js → chunk-IAYSWZDJ.js} +188 -76
- package/dist/cli/chunk-JF3TLIMQ.js +19 -0
- package/dist/cli/{chunk-HDFRJ4IT.mjs → chunk-JVHOS3K3.mjs} +177 -65
- package/dist/cli/{chunk-LAWEURCT.mjs → chunk-LFXLQEZN.mjs} +1 -1
- package/dist/cli/{chunk-2PBN4SZE.js → chunk-LROWFPGN.js} +16 -16
- package/dist/cli/{chunk-SLEUWLJE.mjs → chunk-MSY22NQW.mjs} +5 -5
- package/dist/cli/{chunk-LVJOFUU7.mjs → chunk-MUUQZIOF.mjs} +23 -49
- package/dist/cli/{chunk-2XHWOQF4.js → chunk-NBLSCHKK.js} +52 -50
- package/dist/cli/{chunk-526R2HON.mjs → chunk-NHRWZPWZ.mjs} +4 -2
- package/dist/cli/{chunk-KXMNM4AQ.js → chunk-NMU3VR5U.js} +4 -5
- package/dist/cli/{chunk-W3BE3CHK.mjs → chunk-O2RX5A66.mjs} +14 -12
- package/dist/cli/{chunk-UKFZT7RF.js → chunk-OMQ23IXL.js} +2 -2
- package/dist/cli/{chunk-LJTFZOHU.js → chunk-OPJAJBD4.js} +28 -54
- package/dist/cli/{chunk-MLFR6DVF.mjs → chunk-PHSEINNH.mjs} +5 -5
- package/dist/cli/{chunk-3DNKFH2G.mjs → chunk-PKHVSIJG.mjs} +19 -1
- package/dist/cli/{chunk-WIYWSYDS.mjs → chunk-Q2EIZKVX.mjs} +3 -3
- package/dist/cli/{chunk-VJAEA4CS.js → chunk-QJZ6WNWD.js} +8 -8
- package/dist/cli/{chunk-EIMG75BT.mjs → chunk-S3A4IXBQ.mjs} +4 -5
- package/dist/cli/{chunk-RZSTT45F.mjs → chunk-S42YIQNE.mjs} +13 -8
- package/dist/cli/{chunk-YULBYKAK.mjs → chunk-S6UAJR6V.mjs} +3 -3
- package/dist/cli/{chunk-G7L27KZB.mjs → chunk-TKAQR3IB.mjs} +31 -21
- package/dist/cli/{chunk-QWRHGGUH.js → chunk-UAJFWWZE.js} +20 -2
- package/dist/cli/{chunk-ZR2RLI4O.mjs → chunk-UDRPEZ5F.mjs} +223 -92
- package/dist/cli/{chunk-QGAWTBIR.js → chunk-ULK7JGGI.js} +511 -282
- package/dist/cli/chunk-V335HGX5.js +1038 -0
- package/dist/cli/{chunk-NH6JSJW6.mjs → chunk-V3MEA7NB.mjs} +7 -5
- package/dist/cli/{chunk-NRGGFVVB.js → chunk-VFGVXXZP.js} +37 -35
- package/dist/cli/chunk-VLEVVDWG.js +91 -0
- package/dist/cli/{chunk-R2GLGLDR.mjs → chunk-VPHN2HAL.mjs} +216 -91
- package/dist/cli/{chunk-CFUTOWE4.js → chunk-WG3KGAII.js} +8 -88
- package/dist/cli/{describe-TOMIAT37.mjs → chunk-WIY6U6GD.mjs} +19 -36
- package/dist/cli/{chunk-YS2YBSJB.js → chunk-XANRM3QA.js} +6 -6
- package/dist/cli/{chunk-KGQNIA37.js → chunk-XQCTG5OO.js} +44 -34
- package/dist/cli/{chunk-EJGBLXDZ.mjs → chunk-XZAFIOUQ.mjs} +1 -1
- package/dist/cli/chunk-Y4DPU4OM.js +827 -0
- package/dist/cli/chunk-YT5EODJO.js +920 -0
- package/dist/cli/{chunk-2WRO2UJ5.js → chunk-ZGQSFYD2.js} +56 -51
- package/dist/cli/{chunk-OJ6RUKVT.mjs → chunk-ZUK6LIJB.mjs} +10 -1
- package/dist/cli/command-docs.d.mts +5 -0
- package/dist/cli/command-docs.d.ts +5 -0
- package/dist/cli/command-docs.js +2 -2
- package/dist/cli/command-docs.mjs +1 -1
- package/dist/cli/{csv-6FNFYJUC.js → csv-C56GSCEU.js} +13 -12
- package/dist/cli/{csv-MDHT4BKK.mjs → csv-L54JS7TF.mjs} +4 -3
- package/dist/cli/{db-D6AMVOEW.js → db-MOGRMZTA.js} +30 -27
- package/dist/cli/{db-74O3RFWY.mjs → db-YVBUW2DX.mjs} +10 -7
- package/dist/cli/describe-KYEULWPG.js +48 -0
- package/dist/cli/describe-NLZKKT7C.mjs +48 -0
- package/dist/cli/describe-core.d.mts +153 -5
- package/dist/cli/describe-core.d.ts +153 -5
- package/dist/cli/describe-core.js +9 -5
- package/dist/cli/describe-core.mjs +10 -6
- package/dist/cli/{executions-N4FMGVSC.js → executions-A7L4ULPP.js} +9 -7
- package/dist/cli/{executions-PVSF4HUF.mjs → executions-ZBGSTT37.mjs} +7 -5
- package/dist/cli/{feedback-OB7NANZW.mjs → feedback-G6GU37FD.mjs} +6 -5
- package/dist/cli/{feedback-WFSPCAI2.js → feedback-OHLY7RYD.js} +10 -9
- package/dist/cli/getting-started.d.mts +6 -6
- package/dist/cli/getting-started.d.ts +6 -6
- package/dist/cli/getting-started.js +2 -2
- package/dist/cli/getting-started.mjs +1 -1
- package/dist/cli/git-P76N4NDQ.js +25 -0
- package/dist/cli/{git-FHUSPAEU.mjs → git-PKZW3QD5.mjs} +5 -4
- package/dist/cli/index.js +152 -142
- package/dist/cli/index.mjs +56 -46
- package/dist/cli/{legacy-noops-ECHNA5HN.js → legacy-noops-5LM3D724.js} +8 -7
- package/dist/cli/{legacy-noops-HMK4BSCI.mjs → legacy-noops-LJJYG6YA.mjs} +5 -4
- package/dist/cli/{monitors-U7VQ3EZM.mjs → monitors-72QV4ALO.mjs} +19 -6
- package/dist/cli/{monitors-XLLFNENH.js → monitors-UX3H5DC2.js} +103 -90
- package/dist/cli/{org-6H3USO5M.mjs → org-6RRRKOCP.mjs} +9 -6
- package/dist/cli/{org-QX6ER2HN.js → org-IF7ISUVB.js} +70 -67
- package/dist/cli/pages-3SU3HKL7.js +252 -0
- package/dist/cli/pages-DXDYYKEK.mjs +252 -0
- package/dist/cli/{play-MOB2WYOR.mjs → play-AHASKRLA.mjs} +512 -1508
- package/dist/cli/{play-WNB7HBZK.js → play-EUIUVLUH.js} +1090 -2086
- package/dist/cli/{providers-CXEZ23E2.mjs → providers-GWGE3WY3.mjs} +7 -5
- package/dist/cli/{providers-7M3DISKX.js → providers-V5WU4VXJ.js} +10 -8
- package/dist/cli/{quickstart-ZFCHKHF6.mjs → quickstart-OXKQ5ZST.mjs} +5 -4
- package/dist/cli/{quickstart-CLJT4AZL.js → quickstart-QP65I5PF.js} +13 -12
- package/dist/cli/run-6MM72IGL.mjs +443 -0
- package/dist/cli/run-F3FTYS56.js +443 -0
- package/dist/cli/search-OYKOOI7A.js +32 -0
- package/dist/cli/{search-FVYWYIC3.mjs → search-ZMEBVJZB.mjs} +8 -6
- package/dist/cli/{secrets-YRLKZQS5.js → secrets-ACND5N6A.js} +16 -14
- package/dist/cli/{secrets-WAMPTQFC.mjs → secrets-XRCJFF3L.mjs} +7 -5
- package/dist/cli/{sessions-IQ332BJH.mjs → sessions-RTK3CEW6.mjs} +5 -4
- package/dist/cli/{sessions-44J6WIVU.js → sessions-ZGRJPCFF.js} +6 -5
- package/dist/cli/{settings-4IJR2I2T.js → settings-PD5KWQQZ.js} +80 -77
- package/dist/cli/{settings-22S6NIFQ.mjs → settings-XDRBPRDE.mjs} +14 -11
- package/dist/cli/{setup-OZUPKKPW.mjs → setup-3HPYAOCC.mjs} +12 -10
- package/dist/cli/{setup-3FWSRNOX.js → setup-E2Q6PXHC.js} +53 -51
- package/dist/cli/{skills-5CW3NFP3.mjs → skills-OOQFMPOV.mjs} +7 -6
- package/dist/cli/skills-XYWV52KB.js +31 -0
- package/dist/cli/tools-ASCDZJCK.js +55 -0
- package/dist/cli/tools-C5ZT3UIC.mjs +55 -0
- package/dist/cli/update-5RQSEIFM.js +33 -0
- package/dist/cli/{update-IBULOV7P.mjs → update-ZWJTADIW.mjs} +9 -8
- package/dist/cli/{workflow-MVZT7MWT.mjs → workflow-23NMPAJ7.mjs} +10 -8
- package/dist/cli/{workflow-Z7FW6GT2.js → workflow-TCXU5YJV.js} +20 -18
- package/dist/client-DS2IWYZF.d.ts +10 -0
- package/dist/client-DTwnz_AW.d.mts +10 -0
- package/dist/{client-CYqG23K1.d.ts → client-core-B_6HAIBy.d.ts} +385 -12
- package/dist/{client-BbU5_j7n.d.mts → client-core-DzBSlY1U.d.mts} +385 -12
- package/dist/{compiler-manifest-CWz_sNOQ.d.mts → compiler-manifest-Dcyd3-Zd.d.mts} +43 -1
- package/dist/{compiler-manifest-CWz_sNOQ.d.ts → compiler-manifest-Dcyd3-Zd.d.ts} +43 -1
- package/dist/errors-d-sTrZhe.d.mts +142 -0
- package/dist/errors-yQwfgrcX.d.ts +142 -0
- package/dist/{index-BF2JB_Ug.d.mts → index-C6oXchjN.d.mts} +1 -1
- package/dist/{index-4NPXDzlD.d.ts → index-P56zy_z5.d.ts} +1 -1
- package/dist/index.d.mts +11 -147
- package/dist/index.d.ts +11 -147
- package/dist/index.js +15 -11
- package/dist/index.mjs +14 -10
- package/dist/install-integrity.json +141 -104
- package/dist/plays/bundle-play-file.d.mts +3 -3
- package/dist/plays/bundle-play-file.d.ts +3 -3
- package/dist/plays/bundle-play-file.mjs +2 -1
- package/dist/plays/play-description.d.mts +2 -2
- package/dist/plays/play-description.d.ts +2 -2
- package/dist/plays/play-description.js +2 -2
- package/dist/plays/play-description.mjs +1 -1
- package/dist/plays/run-request.d.mts +2 -2
- package/dist/plays/run-request.d.ts +2 -2
- package/dist/release.d.mts +1 -1
- package/dist/release.d.ts +1 -1
- package/dist/release.js +2 -2
- package/dist/release.mjs +1 -1
- package/dist/server.d.mts +17 -0
- package/dist/server.d.ts +17 -0
- package/dist/server.js +76 -0
- package/dist/server.mjs +76 -0
- package/package.json +6 -1
- package/dist/cli/auth-VDOCNR7H.js +0 -40
- package/dist/cli/chunk-PQUUWFXY.js +0 -95
- package/dist/cli/chunk-QJLKYYPX.js +0 -1710
- package/dist/cli/chunk-YBWAG72P.mjs +0 -95
- package/dist/cli/git-4PMBJSH5.js +0 -24
- package/dist/cli/search-4CCQCTVD.js +0 -30
- package/dist/cli/skills-LMNM6B5F.js +0 -30
- package/dist/cli/tools-AGBBDJ7P.js +0 -45
- package/dist/cli/tools-NOPBDRGW.mjs +0 -45
- package/dist/cli/update-U3W6USVD.js +0 -32
package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-lifecycle.ts
CHANGED
|
@@ -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 {
|
|
26
|
-
|
|
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
|
-
//
|
|
248
|
-
//
|
|
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 {
|
|
266
|
-
|
|
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
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
1007
|
-
|
|
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
|
-
//
|
|
1201
|
-
//
|
|
1202
|
-
//
|
|
1203
|
-
//
|
|
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) {
|