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.
- 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/tamradar.ts +17 -17
- 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 +61 -0
- package/dist/bundling-sources/shared_libs/monitors/provider-monitor-upstream-identity.ts +122 -2
- package/dist/bundling-sources/shared_libs/monitors/signal-radars/inbound-dead-letter.ts +11 -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 +38 -12
- package/dist/bundling-sources/shared_libs/play-runtime/tool-result.ts +33 -9
- 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-6HJXNWUG.mjs → auth-LZLBR4C3.mjs} +5 -4
- package/dist/cli/auth-XPGKBJKB.js +41 -0
- package/dist/cli/{billing-6P5HO6QG.js → billing-6TJPNJQD.js} +152 -78
- package/dist/cli/{billing-MJ42N7YF.mjs → billing-OTOP5RE4.mjs} +84 -10
- package/dist/cli/{chunk-FCAZQ7WV.js → chunk-2NISBXMN.js} +52 -50
- package/dist/cli/{chunk-PNATXKLP.js → chunk-2ZIRCBYG.js} +6 -6
- package/dist/cli/{chunk-5FDKJQZE.js → chunk-3BOIOCNX.js} +1 -1
- package/dist/cli/chunk-3BVLLJ3H.mjs +1038 -0
- package/dist/cli/{chunk-FJZILBL7.mjs → chunk-3U5EAP6E.mjs} +5 -5
- package/dist/cli/{describe-FRAVCY5F.mjs → chunk-4YZKBBLZ.mjs} +19 -36
- package/dist/cli/{chunk-QWRHGGUH.js → chunk-5DRNNC72.js} +20 -2
- package/dist/cli/{chunk-Z2GUFYT6.js → chunk-5LEAXRHV.js} +11 -11
- package/dist/cli/{chunk-5MDIZX7M.js → chunk-5LHXOIPT.js} +8 -6
- package/dist/cli/{chunk-NMJ4D2WO.js → chunk-6PMCRYDA.js} +216 -91
- package/dist/cli/{chunk-EBU7LQ64.js → chunk-6V7KVRR5.js} +3 -3
- package/dist/cli/{chunk-MGXEUZHL.mjs → chunk-7D6X7IXW.mjs} +7 -5
- package/dist/cli/{chunk-SAZFZQRI.js → chunk-7FCYPAPP.js} +2 -2
- package/dist/cli/{chunk-ACCR7POB.js → chunk-7XYDDCQ2.js} +27 -27
- package/dist/cli/{chunk-5IYOUBFZ.js → chunk-ALZBANZI.js} +28 -54
- package/dist/cli/{chunk-3DNKFH2G.mjs → chunk-BAPTQDLF.mjs} +19 -1
- package/dist/cli/chunk-BGNWI3KH.js +827 -0
- package/dist/cli/{chunk-V7REJRDZ.mjs → chunk-C25QE4CH.mjs} +1 -1
- package/dist/cli/{chunk-FGMX4HUZ.js → chunk-CBZP6J3V.js} +29 -27
- package/dist/cli/{chunk-QEYHTIV4.mjs → chunk-CTQ56DXP.mjs} +10 -1
- package/dist/cli/{chunk-IHHLTHE7.mjs → chunk-CVQ7N5CV.mjs} +267 -38
- package/dist/cli/{chunk-7DH2FD7Y.mjs → chunk-D464JW3N.mjs} +5 -85
- package/dist/cli/{chunk-MEAIOXJL.mjs → chunk-DHXCBITQ.mjs} +7 -5
- package/dist/cli/chunk-F2RHUPVH.mjs +827 -0
- package/dist/cli/chunk-F6QV42MC.mjs +91 -0
- package/dist/cli/{chunk-OZBWRICM.js → chunk-FK2HNDCN.js} +2 -2
- package/dist/cli/{chunk-BGY2PLP7.mjs → chunk-GUT7CLOL.mjs} +23 -49
- package/dist/cli/{chunk-RY4IVOU3.mjs → chunk-I624J4H5.mjs} +16 -806
- package/dist/cli/{chunk-Z2XUZC34.js → chunk-IAYSWZDJ.js} +188 -76
- package/dist/cli/{chunk-FGLKOWSC.mjs → chunk-IKWRUNAP.mjs} +1 -1
- package/dist/cli/{chunk-KCCOQ5G5.js → chunk-JVDKZJUH.js} +511 -282
- package/dist/cli/{chunk-HDFRJ4IT.mjs → chunk-JVHOS3K3.mjs} +177 -65
- package/dist/cli/chunk-LYFKBLJI.mjs +1039 -0
- package/dist/cli/{chunk-SLEUWLJE.mjs → chunk-MSY22NQW.mjs} +5 -5
- package/dist/cli/{chunk-5FY72YOV.js → chunk-NAPTMYTY.js} +8 -8
- package/dist/cli/{chunk-O6QOMHCH.js → chunk-NDHJR2WZ.js} +37 -35
- package/dist/cli/{chunk-KXMNM4AQ.js → chunk-NMU3VR5U.js} +4 -5
- package/dist/cli/chunk-NTLI6P6Y.mjs +19 -0
- package/dist/cli/{chunk-RFONC4WJ.mjs → chunk-O3BJYD6D.mjs} +3 -3
- package/dist/cli/{describe-2WQY7ZCY.js → chunk-PVY4DPPF.js} +27 -44
- package/dist/cli/{chunk-WIYWSYDS.mjs → chunk-Q2EIZKVX.mjs} +3 -3
- package/dist/cli/{chunk-VZBCEA5S.mjs → chunk-RD6IQ2JY.mjs} +223 -92
- package/dist/cli/chunk-RGOUCIIZ.js +1039 -0
- package/dist/cli/{chunk-EIMG75BT.mjs → chunk-S3A4IXBQ.mjs} +4 -5
- package/dist/cli/{chunk-QIW7TVV6.mjs → chunk-S4XQCFES.mjs} +14 -12
- package/dist/cli/chunk-SKU6ECIY.js +19 -0
- package/dist/cli/{chunk-CRYOUPEB.js → chunk-TIRBDQ3W.js} +16 -16
- package/dist/cli/{chunk-G7L27KZB.mjs → chunk-TKAQR3IB.mjs} +31 -21
- package/dist/cli/{chunk-MDJPEGVN.js → chunk-UC4SFYNU.js} +392 -261
- package/dist/cli/{chunk-3BMLICF7.mjs → chunk-UIURR26V.mjs} +13 -8
- package/dist/cli/{chunk-TNMBPMMC.js → chunk-UROQDCVW.js} +13 -4
- package/dist/cli/{chunk-R64BGGRQ.mjs → chunk-VDGTTH7K.mjs} +2 -2
- package/dist/cli/chunk-VLEVVDWG.js +91 -0
- package/dist/cli/{chunk-R2GLGLDR.mjs → chunk-VPHN2HAL.mjs} +216 -91
- package/dist/cli/chunk-VY2GBNTX.js +1038 -0
- package/dist/cli/{chunk-CFUTOWE4.js → chunk-WG3KGAII.js} +8 -88
- package/dist/cli/{chunk-QAJAJPKK.mjs → chunk-WUMIYOXQ.mjs} +4 -2
- package/dist/cli/{chunk-SCIR5JXW.js → chunk-WUZS2HK6.js} +56 -51
- package/dist/cli/{chunk-T3MVIPHG.mjs → chunk-XDWS2JJT.mjs} +1 -1
- package/dist/cli/{chunk-KGQNIA37.js → chunk-XQCTG5OO.js} +44 -34
- package/dist/cli/{chunk-KVJ5VHW5.mjs → chunk-XW2JIYG7.mjs} +2 -2
- package/dist/cli/chunk-YGGIZ3VT.js +920 -0
- 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-NX7NO3O6.js → csv-EH5QWR4O.js} +13 -12
- package/dist/cli/{csv-DQ6GW5B5.mjs → csv-OK45Z5XQ.mjs} +4 -3
- package/dist/cli/{db-R72DFMP6.js → db-3ESJKETS.js} +30 -27
- package/dist/cli/{db-2YP33M4K.mjs → db-6Z5E4HKN.mjs} +10 -7
- package/dist/cli/describe-PNDQB7YS.mjs +48 -0
- package/dist/cli/describe-QUF7VTTR.js +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-WFBU7L2Q.mjs → executions-2NTWQFEG.mjs} +7 -5
- package/dist/cli/{executions-ZLHD4QIT.js → executions-KUOBRX5V.js} +9 -7
- package/dist/cli/{feedback-CN3HJFVF.mjs → feedback-7RPRMSGY.mjs} +6 -5
- package/dist/cli/{feedback-NDV6TPHG.js → feedback-UPHAZJ4C.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-QAD6E3HW.mjs → git-SCYP6WSZ.mjs} +5 -4
- package/dist/cli/git-UH653WHV.js +25 -0
- package/dist/cli/index.js +152 -142
- package/dist/cli/index.mjs +56 -46
- package/dist/cli/{legacy-noops-KVC5QJ74.js → legacy-noops-7XMFCVRG.js} +8 -7
- package/dist/cli/{legacy-noops-TPTKNBI2.mjs → legacy-noops-A4KYAGI6.mjs} +5 -4
- package/dist/cli/{monitors-SV57JFLO.mjs → monitors-FLC5J7RI.mjs} +19 -6
- package/dist/cli/{monitors-KCROV6PJ.js → monitors-NZV6IX5H.js} +103 -90
- package/dist/cli/{org-NJYX5743.js → org-IZ7UP3XF.js} +70 -67
- package/dist/cli/{org-KX6QIR7A.mjs → org-LUETJ7Z5.mjs} +9 -6
- package/dist/cli/pages-22ML3O7O.js +252 -0
- package/dist/cli/pages-EUX5EAGF.mjs +252 -0
- package/dist/cli/{play-IQQ57L7Z.mjs → play-CDHPAKKM.mjs} +512 -1508
- package/dist/cli/{play-32L7EQN4.js → play-USJBQADG.js} +1090 -2086
- package/dist/cli/{providers-4WEC2EQN.mjs → providers-CCXZ3SQF.mjs} +7 -5
- package/dist/cli/{providers-ZQV6QLVQ.js → providers-WFEUNPGC.js} +10 -8
- package/dist/cli/{quickstart-HKUSFADF.js → quickstart-O4JSUORZ.js} +13 -12
- package/dist/cli/{quickstart-RQ76RIUE.mjs → quickstart-ZUULI635.mjs} +5 -4
- package/dist/cli/run-ISDJYJMU.js +443 -0
- package/dist/cli/run-QJ4NX5F5.mjs +443 -0
- package/dist/cli/{search-ZRAVFBZC.mjs → search-IX3XKZJ3.mjs} +8 -6
- package/dist/cli/search-TIFNLRPM.js +32 -0
- package/dist/cli/{secrets-CMJOVNVH.mjs → secrets-7VUDXTUZ.mjs} +7 -5
- package/dist/cli/{secrets-J3G5Y43U.js → secrets-ELQSNCTR.js} +16 -14
- package/dist/cli/{sessions-WY7VN4AE.js → sessions-A3FG3AZX.js} +6 -5
- package/dist/cli/{sessions-MDQYY5CB.mjs → sessions-VOIQ62GB.mjs} +5 -4
- package/dist/cli/{settings-4RWZPCT5.mjs → settings-S6N6EFBG.mjs} +14 -11
- package/dist/cli/{settings-HTNTFKCE.js → settings-ZTXQEMZI.js} +80 -77
- package/dist/cli/{setup-P3GYYZWG.mjs → setup-AYPIK4JE.mjs} +12 -10
- package/dist/cli/{setup-QGCAP62X.js → setup-Y3WOIFLS.js} +53 -51
- package/dist/cli/{skills-7NAE4ICL.mjs → skills-5SF5QWNI.mjs} +7 -6
- package/dist/cli/skills-MWFRMG3H.js +31 -0
- package/dist/cli/tools-3XNZ4J64.mjs +55 -0
- package/dist/cli/tools-XEC4OD3R.js +55 -0
- package/dist/cli/{update-GODLRKNB.mjs → update-3U4OVX5R.mjs} +9 -8
- package/dist/cli/update-DWYEYTZE.js +33 -0
- package/dist/cli/{workflow-4BXOUVEO.mjs → workflow-2M5JP7SA.mjs} +10 -8
- package/dist/cli/{workflow-AO3A6LXN.js → workflow-RM7H7555.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.ts → compiler-manifest-Dcyd3-Zd.d.mts} +43 -1
- package/dist/{compiler-manifest-CWz_sNOQ.d.mts → 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 +16 -12
- package/dist/index.mjs +15 -11
- 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-IACERYQH.js +0 -40
- package/dist/cli/chunk-PQUUWFXY.js +0 -95
- package/dist/cli/chunk-YBWAG72P.mjs +0 -95
- package/dist/cli/chunk-YQDUODZW.js +0 -1710
- package/dist/cli/git-JVI36ZFV.js +0 -24
- package/dist/cli/search-75X5LTDE.js +0 -30
- package/dist/cli/skills-BKJ53JOQ.js +0 -30
- package/dist/cli/tools-COWMIEJ6.mjs +0 -45
- package/dist/cli/tools-TASOCE7I.js +0 -45
- package/dist/cli/update-SJIKVME6.js +0 -32
|
@@ -10,6 +10,25 @@ import {
|
|
|
10
10
|
const DAYTONA_PROVIDER = RuntimeSandboxProvider.Daytona;
|
|
11
11
|
const DEFAULT_BATCH_SIZE = 500;
|
|
12
12
|
const MAX_BATCH_SIZE = 1_000;
|
|
13
|
+
const EXACT_READ_CONCURRENCY = 8;
|
|
14
|
+
|
|
15
|
+
async function mapWithConcurrency<T, R>(
|
|
16
|
+
items: readonly T[],
|
|
17
|
+
concurrency: number,
|
|
18
|
+
map: (item: T) => Promise<R>,
|
|
19
|
+
): Promise<R[]> {
|
|
20
|
+
const results = new Array<R>(items.length);
|
|
21
|
+
let next = 0;
|
|
22
|
+
await Promise.all(
|
|
23
|
+
Array.from({ length: Math.min(concurrency, items.length) }, async () => {
|
|
24
|
+
while (next < items.length) {
|
|
25
|
+
const index = next++;
|
|
26
|
+
results[index] = await map(items[index]!);
|
|
27
|
+
}
|
|
28
|
+
}),
|
|
29
|
+
);
|
|
30
|
+
return results;
|
|
31
|
+
}
|
|
13
32
|
/** Never classify a very recent resource from a provider snapshot as absent. */
|
|
14
33
|
export const RUNTIME_SANDBOX_LEDGER_RECONCILIATION_MINIMUM_AGE_MS =
|
|
15
34
|
10 * 60 * 1_000;
|
|
@@ -71,13 +90,33 @@ function batchSize(value: number | undefined): number {
|
|
|
71
90
|
return value;
|
|
72
91
|
}
|
|
73
92
|
|
|
93
|
+
/**
|
|
94
|
+
* A read of one exact sandbox id. Only `absent`, Daytona's 404 for that id,
|
|
95
|
+
* settles a ledger row: a list can omit a sandbox that is still running.
|
|
96
|
+
*/
|
|
97
|
+
export type RuntimeSandboxExactReadOutcome = 'absent' | 'present' | 'unknown';
|
|
98
|
+
|
|
99
|
+
/** Keyset position in the absent-candidate order, so a pass never revisits. */
|
|
100
|
+
export type RuntimeSandboxLedgerReconciliationCursor = {
|
|
101
|
+
/** Exact PostgreSQL timestamptz text; milliseconds are insufficient. */
|
|
102
|
+
providerCreatedAt: string;
|
|
103
|
+
operationKey: string;
|
|
104
|
+
};
|
|
105
|
+
|
|
74
106
|
export type RuntimeSandboxLedgerReconciliationSummary = {
|
|
75
107
|
provider: RuntimeSandboxProvider.Daytona;
|
|
76
108
|
providerSandboxCount: number;
|
|
77
109
|
matchedLiveSandboxes: number;
|
|
78
110
|
unmatchedProviderSandboxIds: string[];
|
|
79
111
|
liveLeasesToSeed: number;
|
|
112
|
+
/** Rows missing from the provider list in this batch. */
|
|
80
113
|
absentLedgerRows: number;
|
|
114
|
+
/** Of those, the rows Daytona answered 404 for when read by exact id. */
|
|
115
|
+
confirmedAbsentLedgerRows: number;
|
|
116
|
+
/** Missing from the list, yet Daytona still returns them by id. */
|
|
117
|
+
listOmittedSandboxIds: string[];
|
|
118
|
+
/** Missing from the list, and the exact read did not answer. */
|
|
119
|
+
absenceUnconfirmedSandboxIds: string[];
|
|
81
120
|
seededLeases: number;
|
|
82
121
|
/** Historical or raced leases released because deletion was already durable. */
|
|
83
122
|
releasedTerminalLeases: number;
|
|
@@ -85,6 +124,8 @@ export type RuntimeSandboxLedgerReconciliationSummary = {
|
|
|
85
124
|
/** Reserved creates recovered from Daytona's exact operation-key label. */
|
|
86
125
|
recoveredReservedOperations: number;
|
|
87
126
|
hasMoreAbsentLedgerRows: boolean;
|
|
127
|
+
/** Where the next batch resumes; null when this batch saw no candidates. */
|
|
128
|
+
nextCursor: RuntimeSandboxLedgerReconciliationCursor | null;
|
|
88
129
|
dryRun: boolean;
|
|
89
130
|
diagnostics: readonly RuntimeSandboxLedgerReconciliationDiagnostic[];
|
|
90
131
|
};
|
|
@@ -585,9 +626,10 @@ async function releaseTerminalSandboxCapacityLeases(
|
|
|
585
626
|
* This is intentionally a rollout/migration operation, not a hot-path read:
|
|
586
627
|
* Daytona's label-scoped list is the authority for provider presence. A live
|
|
587
628
|
* provider resource is seeded into the soft-capacity lease table. An older
|
|
588
|
-
* durable resource absent from that inventory is
|
|
589
|
-
* ledger with a provider-confirmed-absent
|
|
590
|
-
*
|
|
629
|
+
* durable resource absent from that inventory is read by its exact id, and
|
|
630
|
+
* only a 404 completes it in the cleanup ledger with a provider-confirmed-absent
|
|
631
|
+
* audit event: a list can omit a sandbox that is still running. The resource
|
|
632
|
+
* history is never deleted or rewritten.
|
|
591
633
|
*/
|
|
592
634
|
export async function reconcileRuntimeDaytonaSandboxLedger(
|
|
593
635
|
client: PostgresSchedulerQueryClient,
|
|
@@ -599,6 +641,16 @@ export async function reconcileRuntimeDaytonaSandboxLedger(
|
|
|
599
641
|
* Resources recorded later than this snapshot are never classified absent.
|
|
600
642
|
*/
|
|
601
643
|
inventoryCapturedAtMs: number;
|
|
644
|
+
/**
|
|
645
|
+
* Reads one sandbox by its exact id, in its routing domain. A row missing
|
|
646
|
+
* from the list is marked deleted only when this answers `absent`.
|
|
647
|
+
*/
|
|
648
|
+
readExactSandbox: (sandbox: {
|
|
649
|
+
sandboxId: string;
|
|
650
|
+
routingDomain: string | null;
|
|
651
|
+
}) => Promise<RuntimeSandboxExactReadOutcome>;
|
|
652
|
+
/** Resume after this candidate; the previous batch's `nextCursor`. */
|
|
653
|
+
after?: RuntimeSandboxLedgerReconciliationCursor | null;
|
|
602
654
|
dryRun: boolean;
|
|
603
655
|
batchSize?: number;
|
|
604
656
|
minimumAgeMs?: number;
|
|
@@ -889,11 +941,15 @@ export async function reconcileRuntimeDaytonaSandboxLedger(
|
|
|
889
941
|
unmatchedProviderSandboxIds,
|
|
890
942
|
liveLeasesToSeed: 0,
|
|
891
943
|
absentLedgerRows: 0,
|
|
944
|
+
confirmedAbsentLedgerRows: 0,
|
|
945
|
+
listOmittedSandboxIds: [],
|
|
946
|
+
absenceUnconfirmedSandboxIds: [],
|
|
892
947
|
seededLeases: 0,
|
|
893
948
|
releasedTerminalLeases,
|
|
894
949
|
markedDeleted: 0,
|
|
895
950
|
recoveredReservedOperations,
|
|
896
951
|
hasMoreAbsentLedgerRows: false,
|
|
952
|
+
nextCursor: null,
|
|
897
953
|
dryRun: input.dryRun,
|
|
898
954
|
diagnostics,
|
|
899
955
|
};
|
|
@@ -906,10 +962,14 @@ export async function reconcileRuntimeDaytonaSandboxLedger(
|
|
|
906
962
|
org_id: string;
|
|
907
963
|
environment: string;
|
|
908
964
|
routing_domain: string | null;
|
|
965
|
+
provider_created_at_text: string;
|
|
966
|
+
operation_key: string;
|
|
909
967
|
}>(
|
|
910
968
|
RuntimeSandboxLedgerReconciliationPhase.FindAbsentOperations,
|
|
911
969
|
`
|
|
912
|
-
SELECT sandbox_id, run_id, attempt, org_id, environment, routing_domain
|
|
970
|
+
SELECT sandbox_id, run_id, attempt, org_id, environment, routing_domain,
|
|
971
|
+
provider_created_at::text AS provider_created_at_text,
|
|
972
|
+
operation_key
|
|
913
973
|
FROM ${operations}
|
|
914
974
|
WHERE provider = $1
|
|
915
975
|
AND environment = 'production'
|
|
@@ -934,6 +994,12 @@ export async function reconcileRuntimeDaytonaSandboxLedger(
|
|
|
934
994
|
-- an operation recorded after it as absent.
|
|
935
995
|
AND provider_created_at <= to_timestamp($4::double precision / 1000.0)
|
|
936
996
|
AND provider_created_at <= clock_timestamp() - ($5::integer * interval '1 millisecond')
|
|
997
|
+
-- A row the exact read did not settle stays live, so later batches
|
|
998
|
+
-- resume after it instead of reading it again.
|
|
999
|
+
AND (
|
|
1000
|
+
$7::timestamptz IS NULL
|
|
1001
|
+
OR (provider_created_at, operation_key) > ($7::timestamptz, $8::text)
|
|
1002
|
+
)
|
|
937
1003
|
ORDER BY provider_created_at, operation_key
|
|
938
1004
|
LIMIT $6
|
|
939
1005
|
`,
|
|
@@ -944,10 +1010,21 @@ export async function reconcileRuntimeDaytonaSandboxLedger(
|
|
|
944
1010
|
input.inventoryCapturedAtMs,
|
|
945
1011
|
minimumAgeMs,
|
|
946
1012
|
limit + 1,
|
|
1013
|
+
input.after?.providerCreatedAt ?? null,
|
|
1014
|
+
input.after?.operationKey ?? null,
|
|
947
1015
|
],
|
|
948
1016
|
);
|
|
949
1017
|
const hasMoreAbsentLedgerRows = candidates.rows.length > limit;
|
|
950
|
-
const
|
|
1018
|
+
const batch = candidates.rows.slice(0, limit);
|
|
1019
|
+
const lastCandidate = batch.at(-1);
|
|
1020
|
+
const nextCursor: RuntimeSandboxLedgerReconciliationCursor | null =
|
|
1021
|
+
lastCandidate
|
|
1022
|
+
? {
|
|
1023
|
+
providerCreatedAt: lastCandidate.provider_created_at_text,
|
|
1024
|
+
operationKey: lastCandidate.operation_key,
|
|
1025
|
+
}
|
|
1026
|
+
: null;
|
|
1027
|
+
const listAbsent = batch.map((row) => ({
|
|
951
1028
|
sandboxId: row.sandbox_id,
|
|
952
1029
|
runId: row.run_id,
|
|
953
1030
|
attempt: Number(row.attempt),
|
|
@@ -955,6 +1032,27 @@ export async function reconcileRuntimeDaytonaSandboxLedger(
|
|
|
955
1032
|
environment: row.environment,
|
|
956
1033
|
routingDomain: row.routing_domain,
|
|
957
1034
|
}));
|
|
1035
|
+
// Absence from a list is not deletion. Read each id; only a 404 settles it.
|
|
1036
|
+
const exactReads = await mapWithConcurrency(
|
|
1037
|
+
listAbsent,
|
|
1038
|
+
EXACT_READ_CONCURRENCY,
|
|
1039
|
+
async (row) => ({
|
|
1040
|
+
row,
|
|
1041
|
+
outcome: await input.readExactSandbox({
|
|
1042
|
+
sandboxId: row.sandboxId,
|
|
1043
|
+
routingDomain: row.routingDomain,
|
|
1044
|
+
}),
|
|
1045
|
+
}),
|
|
1046
|
+
);
|
|
1047
|
+
const absent = exactReads
|
|
1048
|
+
.filter((read) => read.outcome === 'absent')
|
|
1049
|
+
.map((read) => read.row);
|
|
1050
|
+
const listOmittedSandboxIds = exactReads
|
|
1051
|
+
.filter((read) => read.outcome === 'present')
|
|
1052
|
+
.map((read) => read.row.sandboxId);
|
|
1053
|
+
const absenceUnconfirmedSandboxIds = exactReads
|
|
1054
|
+
.filter((read) => read.outcome === 'unknown')
|
|
1055
|
+
.map((read) => read.row.sandboxId);
|
|
958
1056
|
|
|
959
1057
|
const leaseRows = live.length
|
|
960
1058
|
? await measuredQuery<{
|
|
@@ -1015,12 +1113,16 @@ export async function reconcileRuntimeDaytonaSandboxLedger(
|
|
|
1015
1113
|
matchedLiveSandboxes: live.length,
|
|
1016
1114
|
unmatchedProviderSandboxIds,
|
|
1017
1115
|
liveLeasesToSeed: liveLeasesToSeed.length,
|
|
1018
|
-
absentLedgerRows:
|
|
1116
|
+
absentLedgerRows: listAbsent.length,
|
|
1117
|
+
confirmedAbsentLedgerRows: absent.length,
|
|
1118
|
+
listOmittedSandboxIds,
|
|
1119
|
+
absenceUnconfirmedSandboxIds,
|
|
1019
1120
|
seededLeases: 0,
|
|
1020
1121
|
releasedTerminalLeases,
|
|
1021
1122
|
markedDeleted: 0,
|
|
1022
1123
|
recoveredReservedOperations,
|
|
1023
1124
|
hasMoreAbsentLedgerRows,
|
|
1125
|
+
nextCursor,
|
|
1024
1126
|
dryRun: true,
|
|
1025
1127
|
diagnostics,
|
|
1026
1128
|
};
|
|
@@ -1137,7 +1239,10 @@ export async function reconcileRuntimeDaytonaSandboxLedger(
|
|
|
1137
1239
|
SELECT
|
|
1138
1240
|
'${DAYTONA_PROVIDER}', sandbox_id, routing_domain, run_id, attempt,
|
|
1139
1241
|
0, NULL, 'reconciled_provider_confirmed_absent',
|
|
1140
|
-
jsonb_build_object(
|
|
1242
|
+
jsonb_build_object(
|
|
1243
|
+
'source', 'runtime-sandbox-ledger-reconciliation',
|
|
1244
|
+
'evidence', 'exact_id_not_found'
|
|
1245
|
+
)
|
|
1141
1246
|
FROM changed
|
|
1142
1247
|
),
|
|
1143
1248
|
operation_deleted AS (
|
|
@@ -1206,12 +1311,16 @@ export async function reconcileRuntimeDaytonaSandboxLedger(
|
|
|
1206
1311
|
matchedLiveSandboxes: live.length,
|
|
1207
1312
|
unmatchedProviderSandboxIds,
|
|
1208
1313
|
liveLeasesToSeed: liveLeasesToSeed.length,
|
|
1209
|
-
absentLedgerRows:
|
|
1314
|
+
absentLedgerRows: listAbsent.length,
|
|
1315
|
+
confirmedAbsentLedgerRows: absent.length,
|
|
1316
|
+
listOmittedSandboxIds,
|
|
1317
|
+
absenceUnconfirmedSandboxIds,
|
|
1210
1318
|
seededLeases,
|
|
1211
1319
|
releasedTerminalLeases,
|
|
1212
1320
|
markedDeleted: marked.rows.length,
|
|
1213
1321
|
recoveredReservedOperations,
|
|
1214
1322
|
hasMoreAbsentLedgerRows,
|
|
1323
|
+
nextCursor,
|
|
1215
1324
|
dryRun: false,
|
|
1216
1325
|
diagnostics,
|
|
1217
1326
|
};
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { RUNNER_GATEWAY_CONNECTION_RETRY_BUDGET_MS } from './runtime-constants';
|
|
2
|
+
|
|
1
3
|
export const SECRET_RESOLUTION_MAX_ATTEMPTS = 3;
|
|
2
4
|
export const SECRET_RESOLUTION_MAX_RETRY_AFTER_MS = 2_000;
|
|
3
5
|
// Per-attempt client deadline for the secret-resolution gateway call. This is an
|
|
@@ -84,3 +86,26 @@ export function secretResolutionRetryDecision(input: {
|
|
|
84
86
|
retryAfterExceedsCap: false,
|
|
85
87
|
};
|
|
86
88
|
}
|
|
89
|
+
|
|
90
|
+
/** A request timeout or a network-level fetch failure: nothing came back. */
|
|
91
|
+
export function secretResolutionGotNoResponse(error: unknown): boolean {
|
|
92
|
+
if (!(error instanceof Error)) return false;
|
|
93
|
+
return error.name === 'TimeoutError' || /^fetch failed$/i.test(error.message);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* The wait before resending a lookup that got no response once its ordinary
|
|
98
|
+
* attempts are spent, or null when the sandbox network-cut budget is used up.
|
|
99
|
+
*/
|
|
100
|
+
export function secretResolutionOutageRetryDelayMs(input: {
|
|
101
|
+
attempt: number;
|
|
102
|
+
elapsedMs: number;
|
|
103
|
+
}): number | null {
|
|
104
|
+
const delayMs = Math.min(
|
|
105
|
+
8_000,
|
|
106
|
+
1_000 * Math.max(1, input.attempt - SECRET_RESOLUTION_MAX_ATTEMPTS + 1),
|
|
107
|
+
);
|
|
108
|
+
return input.elapsedMs + delayMs <= RUNNER_GATEWAY_CONNECTION_RETRY_BUDGET_MS
|
|
109
|
+
? delayMs
|
|
110
|
+
: null;
|
|
111
|
+
}
|
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
import { runtimeWorkCountersFromStats } from './runtime-work-counters';
|
|
2
|
+
|
|
3
|
+
/** Closed producer-owned terminal sample. Never read this from Play output.
|
|
4
|
+
* CPU is runner-process lifetime usage; peaks are process high-water samples.
|
|
5
|
+
* These are neither database CPU nor provider occupancy/billable seconds.
|
|
6
|
+
*/
|
|
7
|
+
export const TERMINAL_RUNTIME_PHASES = [
|
|
8
|
+
'rowAdmission',
|
|
9
|
+
'providerAdmission',
|
|
10
|
+
'externalExecution',
|
|
11
|
+
'providerResidence',
|
|
12
|
+
'fixtureDelay',
|
|
13
|
+
'transportSlotWait',
|
|
14
|
+
'fetchToHeaders',
|
|
15
|
+
'bodyRead',
|
|
16
|
+
'eventLoopLag',
|
|
17
|
+
'receiptSettlement',
|
|
18
|
+
'receiptClaim',
|
|
19
|
+
'receiptHydrationGateWait',
|
|
20
|
+
'receiptCompletionQueue',
|
|
21
|
+
'receiptCompletionFlight',
|
|
22
|
+
'receiptCompletionReadBack',
|
|
23
|
+
'rowPersistence',
|
|
24
|
+
'dispatchQueueWait',
|
|
25
|
+
'rowResolverGap',
|
|
26
|
+
'toolCallLogicalWall',
|
|
27
|
+
'resultDelivery',
|
|
28
|
+
'deliveryWrap',
|
|
29
|
+
'deliveryPublishWait',
|
|
30
|
+
'deliveryResolve',
|
|
31
|
+
'flightSerialize',
|
|
32
|
+
'flightTransport',
|
|
33
|
+
'flightDecode',
|
|
34
|
+
'gatewayAuthLaunch',
|
|
35
|
+
'gatewayAuthVerify',
|
|
36
|
+
'gatewayBodyParse',
|
|
37
|
+
'gatewayBodyInflate',
|
|
38
|
+
'gatewayPoolWait',
|
|
39
|
+
'gatewayReceiptValuePersist',
|
|
40
|
+
'gatewayCallback',
|
|
41
|
+
'gatewayRoundTrip',
|
|
42
|
+
'gatewayRequestSerialize',
|
|
43
|
+
'gatewayRequestPack',
|
|
44
|
+
] as const;
|
|
45
|
+
export type TerminalRuntimePhase = (typeof TERMINAL_RUNTIME_PHASES)[number];
|
|
46
|
+
export type TerminalRuntimeSegment = {
|
|
47
|
+
attempt: number;
|
|
48
|
+
invocationSeq: number;
|
|
49
|
+
segmentId: string;
|
|
50
|
+
};
|
|
51
|
+
export type TerminalRuntimePerformanceUnavailableReason =
|
|
52
|
+
| 'invalid_runner_stats'
|
|
53
|
+
| 'invalid_terminal_performance';
|
|
54
|
+
export type TerminalRuntimeHistogram = [
|
|
55
|
+
number,
|
|
56
|
+
number,
|
|
57
|
+
number,
|
|
58
|
+
number,
|
|
59
|
+
number,
|
|
60
|
+
number,
|
|
61
|
+
number,
|
|
62
|
+
number,
|
|
63
|
+
number,
|
|
64
|
+
number,
|
|
65
|
+
number,
|
|
66
|
+
number,
|
|
67
|
+
number,
|
|
68
|
+
number,
|
|
69
|
+
number,
|
|
70
|
+
number,
|
|
71
|
+
number,
|
|
72
|
+
number,
|
|
73
|
+
];
|
|
74
|
+
export type TerminalRuntimeDistribution = {
|
|
75
|
+
count: number;
|
|
76
|
+
totalMs: number;
|
|
77
|
+
maxMs: number | null;
|
|
78
|
+
ewmaMs: number | null;
|
|
79
|
+
p50Ms: number | null;
|
|
80
|
+
p90Ms: number | null;
|
|
81
|
+
p99Ms: number | null;
|
|
82
|
+
/** Bucket0 <1ms; buckets1..16 powers of two; bucket17 >=65536ms. */
|
|
83
|
+
histogram: TerminalRuntimeHistogram;
|
|
84
|
+
};
|
|
85
|
+
/** Decoded runner execute-envelope UTF-8 bytes, not upstream wire bytes or RSS. */
|
|
86
|
+
export type TerminalRuntimeToolResponseBodyAdmission = {
|
|
87
|
+
turns: number;
|
|
88
|
+
measuredTurns: number;
|
|
89
|
+
decodedUtf8BytesTotal: number;
|
|
90
|
+
decodedUtf8BytesMax: number;
|
|
91
|
+
/** Peak simultaneous expected-or-measured gate reservations. */
|
|
92
|
+
permitBytesPeak: number;
|
|
93
|
+
/** Delayed requests may abort before admission; refusals may repeat. */
|
|
94
|
+
queuedTurns: number;
|
|
95
|
+
budgetRefusals: number;
|
|
96
|
+
progressAdmissions: number;
|
|
97
|
+
unpricedAdmissions: number;
|
|
98
|
+
};
|
|
99
|
+
export type TerminalRuntimePerformance = TerminalRuntimeSegment & {
|
|
100
|
+
scope: 'terminal_attempt';
|
|
101
|
+
process: {
|
|
102
|
+
cpuUserMs: number;
|
|
103
|
+
cpuSystemMs: number;
|
|
104
|
+
rssBytes: number | null;
|
|
105
|
+
maxRssBytes: number | null;
|
|
106
|
+
heapUsedBytes: number | null;
|
|
107
|
+
externalBytes: number | null;
|
|
108
|
+
};
|
|
109
|
+
counters: {
|
|
110
|
+
logicalCalls: number;
|
|
111
|
+
providerRequests: number;
|
|
112
|
+
provider429s: number;
|
|
113
|
+
};
|
|
114
|
+
phases: Partial<Record<TerminalRuntimePhase, TerminalRuntimeDistribution>>;
|
|
115
|
+
/** Maximum individual map peak; not a sum or simultaneous whole-run peak. */
|
|
116
|
+
rows: { mapCount: number; maxIndividualMapActiveRowPeak: number };
|
|
117
|
+
/** Missing means an older/partial producer, never measured zero bytes. */
|
|
118
|
+
memoryAdmission?: {
|
|
119
|
+
toolResponseBody: TerminalRuntimeToolResponseBodyAdmission;
|
|
120
|
+
};
|
|
121
|
+
};
|
|
122
|
+
function record(value: unknown): Record<string, unknown> | undefined {
|
|
123
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value)
|
|
124
|
+
? (value as Record<string, unknown>)
|
|
125
|
+
: undefined;
|
|
126
|
+
}
|
|
127
|
+
function finite(value: unknown): value is number {
|
|
128
|
+
return typeof value === 'number' && Number.isFinite(value) && value >= 0;
|
|
129
|
+
}
|
|
130
|
+
function count(value: unknown): value is number {
|
|
131
|
+
return finite(value) && Number.isSafeInteger(value);
|
|
132
|
+
}
|
|
133
|
+
function nullable(value: unknown): value is number | null {
|
|
134
|
+
return value === null || finite(value);
|
|
135
|
+
}
|
|
136
|
+
function segment(
|
|
137
|
+
value: Record<string, unknown>,
|
|
138
|
+
): TerminalRuntimeSegment | undefined {
|
|
139
|
+
if (
|
|
140
|
+
!count(value.attempt) ||
|
|
141
|
+
!count(value.invocationSeq) ||
|
|
142
|
+
value.invocationSeq === 0 ||
|
|
143
|
+
typeof value.segmentId !== 'string' ||
|
|
144
|
+
!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(
|
|
145
|
+
value.segmentId,
|
|
146
|
+
)
|
|
147
|
+
)
|
|
148
|
+
return undefined;
|
|
149
|
+
return {
|
|
150
|
+
attempt: value.attempt,
|
|
151
|
+
invocationSeq: value.invocationSeq,
|
|
152
|
+
segmentId: value.segmentId,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
function distribution(value: unknown): TerminalRuntimeDistribution | undefined {
|
|
156
|
+
const v = record(value);
|
|
157
|
+
if (
|
|
158
|
+
!v ||
|
|
159
|
+
!count(v.count) ||
|
|
160
|
+
!finite(v.totalMs) ||
|
|
161
|
+
!nullable(v.maxMs) ||
|
|
162
|
+
!nullable(v.ewmaMs) ||
|
|
163
|
+
!nullable(v.p50Ms) ||
|
|
164
|
+
!nullable(v.p90Ms) ||
|
|
165
|
+
!nullable(v.p99Ms) ||
|
|
166
|
+
!Array.isArray(v.histogram) ||
|
|
167
|
+
v.histogram.length !== 18 ||
|
|
168
|
+
!v.histogram.every(count)
|
|
169
|
+
)
|
|
170
|
+
return undefined;
|
|
171
|
+
if (v.histogram.reduce((a: number, b: number) => a + b, 0) !== v.count)
|
|
172
|
+
return undefined;
|
|
173
|
+
if (
|
|
174
|
+
v.count === 0
|
|
175
|
+
? v.totalMs !== 0 ||
|
|
176
|
+
[v.maxMs, v.ewmaMs, v.p50Ms, v.p90Ms, v.p99Ms].some((x) => x !== null)
|
|
177
|
+
: [v.maxMs, v.ewmaMs, v.p50Ms, v.p90Ms, v.p99Ms].some((x) => x === null)
|
|
178
|
+
)
|
|
179
|
+
return undefined;
|
|
180
|
+
if (
|
|
181
|
+
v.p50Ms !== null &&
|
|
182
|
+
v.p90Ms !== null &&
|
|
183
|
+
v.p99Ms !== null &&
|
|
184
|
+
v.maxMs !== null &&
|
|
185
|
+
!(v.p50Ms <= v.p90Ms && v.p90Ms <= v.p99Ms && v.p99Ms <= v.maxMs)
|
|
186
|
+
)
|
|
187
|
+
return undefined;
|
|
188
|
+
return {
|
|
189
|
+
count: v.count,
|
|
190
|
+
totalMs: v.totalMs,
|
|
191
|
+
maxMs: v.maxMs,
|
|
192
|
+
ewmaMs: v.ewmaMs,
|
|
193
|
+
p50Ms: v.p50Ms,
|
|
194
|
+
p90Ms: v.p90Ms,
|
|
195
|
+
p99Ms: v.p99Ms,
|
|
196
|
+
histogram: [...v.histogram] as TerminalRuntimeHistogram,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
function toolResponseBodyAdmission(
|
|
200
|
+
value: unknown,
|
|
201
|
+
): TerminalRuntimeToolResponseBodyAdmission | undefined {
|
|
202
|
+
const v = record(value);
|
|
203
|
+
if (
|
|
204
|
+
!v ||
|
|
205
|
+
!count(v.turns) ||
|
|
206
|
+
!count(v.measuredTurns) ||
|
|
207
|
+
!count(v.decodedUtf8BytesTotal) ||
|
|
208
|
+
!count(v.decodedUtf8BytesMax) ||
|
|
209
|
+
!count(v.permitBytesPeak) ||
|
|
210
|
+
!count(v.queuedTurns) ||
|
|
211
|
+
!count(v.budgetRefusals) ||
|
|
212
|
+
!count(v.progressAdmissions) ||
|
|
213
|
+
!count(v.unpricedAdmissions)
|
|
214
|
+
)
|
|
215
|
+
return undefined;
|
|
216
|
+
if (
|
|
217
|
+
v.measuredTurns > v.turns ||
|
|
218
|
+
v.progressAdmissions + v.unpricedAdmissions > v.turns ||
|
|
219
|
+
(v.measuredTurns === 0 &&
|
|
220
|
+
(v.decodedUtf8BytesTotal !== 0 || v.decodedUtf8BytesMax !== 0)) ||
|
|
221
|
+
v.decodedUtf8BytesMax > v.decodedUtf8BytesTotal ||
|
|
222
|
+
v.decodedUtf8BytesTotal > v.decodedUtf8BytesMax * v.measuredTurns ||
|
|
223
|
+
v.decodedUtf8BytesMax > v.permitBytesPeak
|
|
224
|
+
)
|
|
225
|
+
return undefined;
|
|
226
|
+
return {
|
|
227
|
+
turns: v.turns,
|
|
228
|
+
measuredTurns: v.measuredTurns,
|
|
229
|
+
decodedUtf8BytesTotal: v.decodedUtf8BytesTotal,
|
|
230
|
+
decodedUtf8BytesMax: v.decodedUtf8BytesMax,
|
|
231
|
+
permitBytesPeak: v.permitBytesPeak,
|
|
232
|
+
queuedTurns: v.queuedTurns,
|
|
233
|
+
budgetRefusals: v.budgetRefusals,
|
|
234
|
+
progressAdmissions: v.progressAdmissions,
|
|
235
|
+
unpricedAdmissions: v.unpricedAdmissions,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
/** Reconstruct known fixed fields; unknown keys never enter the public document. */
|
|
239
|
+
export function normalizeTerminalRuntimePerformance(
|
|
240
|
+
value: unknown,
|
|
241
|
+
expectedSegment?: TerminalRuntimeSegment,
|
|
242
|
+
): TerminalRuntimePerformance | undefined {
|
|
243
|
+
const v = record(value);
|
|
244
|
+
if (!v || v.scope !== 'terminal_attempt') return undefined;
|
|
245
|
+
const identity = segment(v);
|
|
246
|
+
if (
|
|
247
|
+
!identity ||
|
|
248
|
+
(expectedSegment &&
|
|
249
|
+
(identity.attempt !== expectedSegment.attempt ||
|
|
250
|
+
identity.invocationSeq !== expectedSegment.invocationSeq ||
|
|
251
|
+
identity.segmentId !== expectedSegment.segmentId))
|
|
252
|
+
)
|
|
253
|
+
return undefined;
|
|
254
|
+
const p = record(v.process),
|
|
255
|
+
c = record(v.counters),
|
|
256
|
+
rows = record(v.rows),
|
|
257
|
+
rawPhases = record(v.phases);
|
|
258
|
+
if (
|
|
259
|
+
!p ||
|
|
260
|
+
!finite(p.cpuUserMs) ||
|
|
261
|
+
!finite(p.cpuSystemMs) ||
|
|
262
|
+
!nullable(p.rssBytes) ||
|
|
263
|
+
!nullable(p.maxRssBytes) ||
|
|
264
|
+
!nullable(p.heapUsedBytes) ||
|
|
265
|
+
!nullable(p.externalBytes) ||
|
|
266
|
+
!c ||
|
|
267
|
+
!count(c.logicalCalls) ||
|
|
268
|
+
!count(c.providerRequests) ||
|
|
269
|
+
!count(c.provider429s) ||
|
|
270
|
+
!rows ||
|
|
271
|
+
!count(rows.mapCount) ||
|
|
272
|
+
!count(rows.maxIndividualMapActiveRowPeak) ||
|
|
273
|
+
!rawPhases
|
|
274
|
+
)
|
|
275
|
+
return undefined;
|
|
276
|
+
const phases: TerminalRuntimePerformance['phases'] = {};
|
|
277
|
+
for (const key of TERMINAL_RUNTIME_PHASES) {
|
|
278
|
+
if (!Object.hasOwn(rawPhases, key)) continue;
|
|
279
|
+
const phase = distribution(rawPhases[key]);
|
|
280
|
+
if (!phase) return undefined;
|
|
281
|
+
phases[key] = phase;
|
|
282
|
+
}
|
|
283
|
+
let memoryAdmission: TerminalRuntimePerformance['memoryAdmission'];
|
|
284
|
+
if (Object.hasOwn(v, 'memoryAdmission')) {
|
|
285
|
+
const rawMemory = record(v.memoryAdmission);
|
|
286
|
+
if (!rawMemory) return undefined;
|
|
287
|
+
if (Object.hasOwn(rawMemory, 'toolResponseBody')) {
|
|
288
|
+
const body = toolResponseBodyAdmission(rawMemory.toolResponseBody);
|
|
289
|
+
if (!body) return undefined;
|
|
290
|
+
memoryAdmission = { toolResponseBody: body };
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return {
|
|
294
|
+
scope: 'terminal_attempt',
|
|
295
|
+
...identity,
|
|
296
|
+
process: {
|
|
297
|
+
cpuUserMs: p.cpuUserMs,
|
|
298
|
+
cpuSystemMs: p.cpuSystemMs,
|
|
299
|
+
rssBytes: p.rssBytes,
|
|
300
|
+
maxRssBytes: p.maxRssBytes,
|
|
301
|
+
heapUsedBytes: p.heapUsedBytes,
|
|
302
|
+
externalBytes: p.externalBytes,
|
|
303
|
+
},
|
|
304
|
+
counters: {
|
|
305
|
+
logicalCalls: c.logicalCalls,
|
|
306
|
+
providerRequests: c.providerRequests,
|
|
307
|
+
provider429s: c.provider429s,
|
|
308
|
+
},
|
|
309
|
+
phases,
|
|
310
|
+
rows: {
|
|
311
|
+
mapCount: rows.mapCount,
|
|
312
|
+
maxIndividualMapActiveRowPeak: rows.maxIndividualMapActiveRowPeak,
|
|
313
|
+
},
|
|
314
|
+
...(memoryAdmission ? { memoryAdmission } : {}),
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
export function normalizeTerminalRuntimePerformanceUnavailableReason(
|
|
318
|
+
value: unknown,
|
|
319
|
+
): TerminalRuntimePerformanceUnavailableReason | undefined {
|
|
320
|
+
return value === 'invalid_runner_stats' ||
|
|
321
|
+
value === 'invalid_terminal_performance'
|
|
322
|
+
? value
|
|
323
|
+
: undefined;
|
|
324
|
+
}
|
|
325
|
+
/** Canonical Context.getStats() + scheduler-injected identity, never authored output. */
|
|
326
|
+
export function terminalRuntimePerformanceFromStats(
|
|
327
|
+
stats: unknown,
|
|
328
|
+
identity: TerminalRuntimeSegment,
|
|
329
|
+
): TerminalRuntimePerformance | undefined {
|
|
330
|
+
const root = record(stats),
|
|
331
|
+
resources = record(root?.runtimeResources),
|
|
332
|
+
rawPhases = record(resources?.phases),
|
|
333
|
+
maps = record(resources?.mapAdmission);
|
|
334
|
+
const counters = runtimeWorkCountersFromStats(stats);
|
|
335
|
+
if (
|
|
336
|
+
!resources ||
|
|
337
|
+
!rawPhases ||
|
|
338
|
+
!maps ||
|
|
339
|
+
!counters ||
|
|
340
|
+
counters.provider429s === undefined
|
|
341
|
+
)
|
|
342
|
+
return undefined;
|
|
343
|
+
const phases: Record<string, unknown> = {};
|
|
344
|
+
for (const key of TERMINAL_RUNTIME_PHASES) {
|
|
345
|
+
if (!Object.hasOwn(rawPhases, key)) continue;
|
|
346
|
+
const raw = record(rawPhases[key]);
|
|
347
|
+
if (!raw || !Array.isArray(raw.buckets)) return undefined;
|
|
348
|
+
const histogram: number[] = Array(18).fill(0);
|
|
349
|
+
for (const bucket of raw.buckets) {
|
|
350
|
+
if (
|
|
351
|
+
!Array.isArray(bucket) ||
|
|
352
|
+
bucket.length !== 2 ||
|
|
353
|
+
!count(bucket[0]) ||
|
|
354
|
+
bucket[0] >= 18 ||
|
|
355
|
+
!count(bucket[1]) ||
|
|
356
|
+
bucket[1] === 0 ||
|
|
357
|
+
histogram[bucket[0]] !== 0
|
|
358
|
+
)
|
|
359
|
+
return undefined;
|
|
360
|
+
histogram[bucket[0]] = bucket[1];
|
|
361
|
+
}
|
|
362
|
+
phases[key] = { ...raw, histogram };
|
|
363
|
+
}
|
|
364
|
+
let mapCount = 0,
|
|
365
|
+
maxIndividualMapActiveRowPeak = 0;
|
|
366
|
+
// Scan every canonical map; no map names or scaling collections are retained.
|
|
367
|
+
for (const key in maps) {
|
|
368
|
+
if (!Object.hasOwn(maps, key)) continue;
|
|
369
|
+
const map = record(maps[key]);
|
|
370
|
+
if (!map || !count(map.activeRowPeak)) return undefined;
|
|
371
|
+
mapCount += 1;
|
|
372
|
+
maxIndividualMapActiveRowPeak = Math.max(
|
|
373
|
+
maxIndividualMapActiveRowPeak,
|
|
374
|
+
map.activeRowPeak,
|
|
375
|
+
);
|
|
376
|
+
}
|
|
377
|
+
return normalizeTerminalRuntimePerformance(
|
|
378
|
+
{
|
|
379
|
+
scope: 'terminal_attempt',
|
|
380
|
+
...identity,
|
|
381
|
+
process: resources.process,
|
|
382
|
+
counters,
|
|
383
|
+
phases,
|
|
384
|
+
rows: { mapCount, maxIndividualMapActiveRowPeak },
|
|
385
|
+
...(Object.hasOwn(resources, 'memoryAdmission')
|
|
386
|
+
? { memoryAdmission: resources.memoryAdmission }
|
|
387
|
+
: {}),
|
|
388
|
+
},
|
|
389
|
+
identity,
|
|
390
|
+
);
|
|
391
|
+
}
|