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
|
@@ -85,6 +85,11 @@ const RUNTIME_TEST_POLICY_WORK_BUDGET_KEYS = new Set([
|
|
|
85
85
|
|
|
86
86
|
const MAX_RUNTIME_TEST_POLICY_MS = 10 * 60_000;
|
|
87
87
|
const MAX_RUNTIME_TEST_POLICY_YIELD_LIMIT = 1_000_000;
|
|
88
|
+
/**
|
|
89
|
+
* A heartbeat is also the runner's cancellation channel, so silence blinds it
|
|
90
|
+
* too. A drill may hold that, but only briefly.
|
|
91
|
+
*/
|
|
92
|
+
export const MAX_RUNNER_HEARTBEAT_SILENCE_MS = 10 * 60_000;
|
|
88
93
|
|
|
89
94
|
function testRuntimeSeamsEnabled(): boolean {
|
|
90
95
|
return process.env.DEEPLINE_TEST_RUNTIME_SEAMS === '1';
|
|
@@ -143,6 +148,14 @@ function parseRuntimeTestFaultHeader(
|
|
|
143
148
|
error: `Runtime test fault "${name}" count must be 1.`,
|
|
144
149
|
};
|
|
145
150
|
}
|
|
151
|
+
if (
|
|
152
|
+
name === 'runner_heartbeat_silence_ms' &&
|
|
153
|
+
total > MAX_RUNNER_HEARTBEAT_SILENCE_MS
|
|
154
|
+
) {
|
|
155
|
+
return {
|
|
156
|
+
error: `Runtime test fault "${name}" must be at most ${MAX_RUNNER_HEARTBEAT_SILENCE_MS}ms.`,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
146
159
|
faults.set(name, total);
|
|
147
160
|
}
|
|
148
161
|
return faults;
|
|
@@ -189,6 +202,33 @@ export function shouldInjectModalSandboxCreateResourceExhausted(input: {
|
|
|
189
202
|
);
|
|
190
203
|
}
|
|
191
204
|
|
|
205
|
+
/**
|
|
206
|
+
* How long a detached runner's watchdog withholds heartbeats, or 0 for never.
|
|
207
|
+
*
|
|
208
|
+
* Like the Modal fault, the header is admitted only through
|
|
209
|
+
* `parseRuntimeTestFaultCounts` and this is the second production guard: a
|
|
210
|
+
* persisted historical header can never silence a live runner. It reads the
|
|
211
|
+
* Preview marker as well because the Fly worker image sets NODE_ENV=production
|
|
212
|
+
* everywhere, so `getRuntimeEnv()` is `prod` on a Preview worker too. Only the
|
|
213
|
+
* Preview worker config sets that marker. Each attempt is silenced, because a
|
|
214
|
+
* failed sandbox start can make the attempt that reaches customer code a later
|
|
215
|
+
* one.
|
|
216
|
+
*/
|
|
217
|
+
export function resolveRunnerHeartbeatSilenceMs(
|
|
218
|
+
runtimeTestFaultHeader: string | null | undefined,
|
|
219
|
+
): number {
|
|
220
|
+
if (
|
|
221
|
+
getRuntimeEnv() === 'prod' &&
|
|
222
|
+
process.env.DEEPLINE_RUNTIME_ENVIRONMENT !== 'preview'
|
|
223
|
+
) {
|
|
224
|
+
return 0;
|
|
225
|
+
}
|
|
226
|
+
return recognizedRuntimeTestFaultCount(
|
|
227
|
+
runtimeTestFaultHeader,
|
|
228
|
+
'runner_heartbeat_silence_ms',
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
|
|
192
232
|
export function runtimeSheetPageTailRowsContainTarget(
|
|
193
233
|
rows: readonly unknown[],
|
|
194
234
|
): boolean {
|
|
@@ -30,6 +30,12 @@ export {
|
|
|
30
30
|
type NativeBatchToolCallJob,
|
|
31
31
|
type NativeBatchToolCallMember,
|
|
32
32
|
} from './native-batch';
|
|
33
|
+
export {
|
|
34
|
+
createMappedToolCallJob,
|
|
35
|
+
type MappedToolCallDependencies,
|
|
36
|
+
type MappedToolCallJob,
|
|
37
|
+
type MappedToolCallMember,
|
|
38
|
+
} from './mapped-calls';
|
|
33
39
|
export {
|
|
34
40
|
createAlwaysFreshToolCallAdapter,
|
|
35
41
|
type AlwaysFreshToolCall,
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { dispatchBoundedSettled } from '../bounded-dispatch';
|
|
2
|
+
import { toolExecutionMetadataForOutcome } from '../tool-execution-outcome';
|
|
3
|
+
import {
|
|
4
|
+
cloneToolExecuteResultWithExecution,
|
|
5
|
+
type ToolExecuteResult,
|
|
6
|
+
} from '../tool-result';
|
|
7
|
+
import type { ToolResultReceipts } from './contract';
|
|
8
|
+
import type {
|
|
9
|
+
ToolCallReceiptCohortJob,
|
|
10
|
+
ToolCallReceiptCohortMember,
|
|
11
|
+
} from './receipt-cohort';
|
|
12
|
+
|
|
13
|
+
export type MappedToolCallMember<Request> = ToolCallReceiptCohortMember & {
|
|
14
|
+
cacheKey: string;
|
|
15
|
+
receiptKey: string;
|
|
16
|
+
/** Runtime transport and row fields belong to their Adapters. */
|
|
17
|
+
request: Request;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export type MappedToolCallJob<Request> = {
|
|
21
|
+
call(input: {
|
|
22
|
+
owner: { runId: string; attempt: number };
|
|
23
|
+
members: readonly MappedToolCallMember<Request>[];
|
|
24
|
+
}): Promise<{ successfulMemberIds: string[] }>;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export type MappedToolCallDependencies<Request> = {
|
|
28
|
+
receiptCohort: ToolCallReceiptCohortJob;
|
|
29
|
+
admission: {
|
|
30
|
+
parallelism(): Promise<number>;
|
|
31
|
+
assertDispatchAllowed(): void;
|
|
32
|
+
};
|
|
33
|
+
execution: {
|
|
34
|
+
call(input: {
|
|
35
|
+
member: MappedToolCallMember<Request>;
|
|
36
|
+
receipts: ToolResultReceipts;
|
|
37
|
+
retainToolSlot(release: () => void): void;
|
|
38
|
+
}): Promise<ToolExecuteResult>;
|
|
39
|
+
};
|
|
40
|
+
delivery: {
|
|
41
|
+
complete(input: {
|
|
42
|
+
member: MappedToolCallMember<Request>;
|
|
43
|
+
result: ToolExecuteResult;
|
|
44
|
+
source: 'cache' | 'owner';
|
|
45
|
+
}): Promise<void>;
|
|
46
|
+
fail(input: {
|
|
47
|
+
member: MappedToolCallMember<Request>;
|
|
48
|
+
error: unknown;
|
|
49
|
+
}): Promise<void>;
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Deliver receipt-backed scalar map calls independently. The Job owns result
|
|
55
|
+
* presentation and transient member/slot release; its Projection retains IDs
|
|
56
|
+
* only. Native batches and always-fresh calls have separate Jobs.
|
|
57
|
+
*/
|
|
58
|
+
export function createMappedToolCallJob<Request>(
|
|
59
|
+
dependencies: MappedToolCallDependencies<Request>,
|
|
60
|
+
): MappedToolCallJob<Request> {
|
|
61
|
+
return {
|
|
62
|
+
async call({ owner, members }) {
|
|
63
|
+
if (members.length === 0) return { successfulMemberIds: [] };
|
|
64
|
+
const cohort = await dependencies.receiptCohort.acquire({
|
|
65
|
+
owner,
|
|
66
|
+
members: members.map(
|
|
67
|
+
({
|
|
68
|
+
request: _request,
|
|
69
|
+
cacheKey: _cacheKey,
|
|
70
|
+
receiptKey: _receiptKey,
|
|
71
|
+
...receipt
|
|
72
|
+
}) => receipt,
|
|
73
|
+
),
|
|
74
|
+
});
|
|
75
|
+
const successfulMemberIds: string[] = [];
|
|
76
|
+
const cached: Promise<void>[] = [];
|
|
77
|
+
const owned: Array<{
|
|
78
|
+
member: MappedToolCallMember<Request>;
|
|
79
|
+
receipts: ToolResultReceipts;
|
|
80
|
+
}> = [];
|
|
81
|
+
const deliver = async (
|
|
82
|
+
member: MappedToolCallMember<Request>,
|
|
83
|
+
result: ToolExecuteResult,
|
|
84
|
+
source: 'cache' | 'owner',
|
|
85
|
+
) => {
|
|
86
|
+
const presented = cloneToolExecuteResultWithExecution(result, {
|
|
87
|
+
...toolExecutionMetadataForOutcome({
|
|
88
|
+
kind: source === 'owner' ? 'live' : source,
|
|
89
|
+
cacheKey: member.cacheKey,
|
|
90
|
+
receiptKey: member.receiptKey,
|
|
91
|
+
...(source === 'owner'
|
|
92
|
+
? {}
|
|
93
|
+
: { attachedToReceiptKey: member.receiptKey }),
|
|
94
|
+
}),
|
|
95
|
+
resultReceiptKey: member.resultReceiptKey,
|
|
96
|
+
});
|
|
97
|
+
await dependencies.delivery.complete({
|
|
98
|
+
member,
|
|
99
|
+
result: presented,
|
|
100
|
+
source,
|
|
101
|
+
});
|
|
102
|
+
successfulMemberIds.push(member.memberId);
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
// Presence is separate from value: JavaScript permits throw undefined.
|
|
106
|
+
let failure: { error: unknown } | undefined;
|
|
107
|
+
try {
|
|
108
|
+
for (const member of members) {
|
|
109
|
+
const state = cohort.member(member.memberId);
|
|
110
|
+
if (state.kind === 'completed') {
|
|
111
|
+
const delivery = deliver(
|
|
112
|
+
member,
|
|
113
|
+
state.result,
|
|
114
|
+
state.source,
|
|
115
|
+
).finally(() => {
|
|
116
|
+
cohort.releaseDeliveredMember(member.memberId);
|
|
117
|
+
});
|
|
118
|
+
// Observe immediately; parallelism/setup can await or fail before
|
|
119
|
+
// the final join. Keep the original rejecting promise for custody.
|
|
120
|
+
void delivery.catch(() => undefined);
|
|
121
|
+
cached.push(delivery);
|
|
122
|
+
} else if (state.kind === 'owned') {
|
|
123
|
+
owned.push({ member, receipts: state.receipts });
|
|
124
|
+
} else {
|
|
125
|
+
throw new Error(
|
|
126
|
+
'A completed-result cache cannot own a pending invocation.',
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const width = await dependencies.admission.parallelism();
|
|
131
|
+
const dispatched = await dispatchBoundedSettled(
|
|
132
|
+
owned,
|
|
133
|
+
width,
|
|
134
|
+
async ({ member, receipts }) => {
|
|
135
|
+
let releaseToolSlot: () => void = () => undefined;
|
|
136
|
+
try {
|
|
137
|
+
dependencies.admission.assertDispatchAllowed();
|
|
138
|
+
const result = await dependencies.execution.call({
|
|
139
|
+
member,
|
|
140
|
+
receipts,
|
|
141
|
+
retainToolSlot: (release) => {
|
|
142
|
+
releaseToolSlot = release;
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
await deliver(member, result, 'owner');
|
|
146
|
+
} catch (error) {
|
|
147
|
+
await dependencies.delivery.fail({ member, error });
|
|
148
|
+
} finally {
|
|
149
|
+
try {
|
|
150
|
+
cohort.releaseDeliveredMember(member.memberId);
|
|
151
|
+
} finally {
|
|
152
|
+
releaseToolSlot();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
);
|
|
157
|
+
const rejected = dispatched.find((entry) => 'error' in entry);
|
|
158
|
+
if (rejected) failure = { error: rejected.error };
|
|
159
|
+
} catch (error) {
|
|
160
|
+
failure = { error };
|
|
161
|
+
}
|
|
162
|
+
// All exits join deliveries already started, including setup failures.
|
|
163
|
+
for (const result of await Promise.allSettled(cached)) {
|
|
164
|
+
if (result.status === 'rejected' && !failure)
|
|
165
|
+
failure = { error: result.reason };
|
|
166
|
+
}
|
|
167
|
+
if (failure) throw failure.error;
|
|
168
|
+
return { successfulMemberIds };
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
}
|
|
@@ -92,6 +92,8 @@ export type ToolCallReceiptCohortMemberState =
|
|
|
92
92
|
|
|
93
93
|
export type ToolCallReceiptCohort = {
|
|
94
94
|
member(memberId: string): ToolCallReceiptCohortMemberState;
|
|
95
|
+
/** Drop this cohort's result reference after its consumer owns delivery. */
|
|
96
|
+
releaseDeliveredMember(memberId: string): 'released' | 'not_completed';
|
|
95
97
|
complete(
|
|
96
98
|
input: Array<{ memberId: string; result: ToolExecuteResult }>,
|
|
97
99
|
): Promise<Map<string, ToolExecuteResult>>;
|
|
@@ -254,6 +256,7 @@ export function createToolCallReceiptCohortJob(input: {
|
|
|
254
256
|
if (settlement.status === 'stored') {
|
|
255
257
|
for (const entry of matching) {
|
|
256
258
|
owned.delete(entry.member.memberId);
|
|
259
|
+
if (!states.has(entry.member.memberId)) continue;
|
|
257
260
|
states.set(entry.member.memberId, {
|
|
258
261
|
kind: 'completed',
|
|
259
262
|
result: entry.result,
|
|
@@ -396,10 +399,22 @@ export function createToolCallReceiptCohortJob(input: {
|
|
|
396
399
|
const state = states.get(memberId);
|
|
397
400
|
if (!state)
|
|
398
401
|
throw new Error(
|
|
399
|
-
|
|
402
|
+
normalized.has(memberId)
|
|
403
|
+
? `Tool Call Receipt Cohort member ${memberId} was released after delivery.`
|
|
404
|
+
: `Unknown Tool Call Receipt Cohort member ${memberId}.`,
|
|
400
405
|
);
|
|
401
406
|
return state;
|
|
402
407
|
},
|
|
408
|
+
releaseDeliveredMember(memberId) {
|
|
409
|
+
if (!normalized.has(memberId))
|
|
410
|
+
throw new Error(
|
|
411
|
+
`Unknown Tool Call Receipt Cohort member ${memberId}.`,
|
|
412
|
+
);
|
|
413
|
+
const state = states.get(memberId);
|
|
414
|
+
if (state && state.kind !== 'completed') return 'not_completed';
|
|
415
|
+
states.delete(memberId);
|
|
416
|
+
return 'released';
|
|
417
|
+
},
|
|
403
418
|
complete: publish,
|
|
404
419
|
async fail(entries) {
|
|
405
420
|
for (const entry of entries) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { RUNNER_GATEWAY_CONNECTION_RETRY_BUDGET_MS } from './runtime-constants';
|
|
1
2
|
import {
|
|
2
3
|
isHardBillingToolHttpError,
|
|
3
4
|
isHtmlErrorBody,
|
|
@@ -73,6 +74,12 @@ export const TOOL_EXECUTE_RUNTIME_SCHEDULER_CAPACITY_MAX_ATTEMPTS = 65;
|
|
|
73
74
|
export const TOOL_EXECUTE_PROVIDER_PACING_WAIT_MAX_ATTEMPTS = 65;
|
|
74
75
|
export const TOOL_EXECUTE_TRANSPORT_MAX_ATTEMPTS = 3;
|
|
75
76
|
export const TOOL_EXECUTE_TRANSPORT_RETRY_DELAY_MS = 1_000;
|
|
77
|
+
// A sandbox lost new connections for about 97 seconds on 2026-10-30, and each
|
|
78
|
+
// attempt spends a 10-second connect timeout, so three attempts cannot cover it.
|
|
79
|
+
// Daytona network cuts then lasted up to 621 seconds, so the window covers the
|
|
80
|
+
// whole cut. Nothing was sent, so waiting is always safe.
|
|
81
|
+
export const TOOL_EXECUTE_CONNECT_RETRY_WINDOW_MS =
|
|
82
|
+
RUNNER_GATEWAY_CONNECTION_RETRY_BUDGET_MS;
|
|
76
83
|
export const TOOL_EXECUTE_RETRY_DELAY_FALLBACK_MS = 1_000;
|
|
77
84
|
export const TOOL_EXECUTE_RETRY_DELAY_MAX_MS = 5_000;
|
|
78
85
|
export const TOOL_EXECUTE_RATE_LIMIT_RETRY_DELAY_MAX_MS = 30_000;
|
|
@@ -392,22 +399,25 @@ function isConcurrencyBackpressureResponse(input: {
|
|
|
392
399
|
);
|
|
393
400
|
}
|
|
394
401
|
|
|
395
|
-
function
|
|
402
|
+
function isPreDispatchRateRefusalResponse(input: {
|
|
396
403
|
status: number;
|
|
397
404
|
bodyText: string;
|
|
398
405
|
executionFenced?: boolean;
|
|
399
406
|
}): boolean {
|
|
400
|
-
|
|
401
|
-
// This exemption is only for the ordinary execute route's released charge.
|
|
402
|
-
if (input.status !== 429 || input.executionFenced === true) return false;
|
|
407
|
+
if (input.status !== 429) return false;
|
|
403
408
|
const body = parseJsonObject(input.bodyText);
|
|
404
409
|
return (
|
|
405
410
|
body?.code === 'RATE_LIMIT' &&
|
|
406
411
|
body.failure_origin === 'deepline_rate_limit' &&
|
|
407
412
|
body.error_category === 'rate_limit' &&
|
|
408
|
-
body.
|
|
409
|
-
|
|
410
|
-
|
|
413
|
+
body.provider_request_dispatched === false &&
|
|
414
|
+
// Workspace tool admission precedes billing for both execute paths.
|
|
415
|
+
// Credential refusals release a charge and retain their unfenced contract.
|
|
416
|
+
((body.rate_limit_bucket_scope === 'customer_tool' &&
|
|
417
|
+
body.rate_limit_kind === 'requests_per_minute') ||
|
|
418
|
+
(input.executionFenced !== true &&
|
|
419
|
+
body.rate_limit_bucket_scope === 'credential_shared' &&
|
|
420
|
+
body.rate_limit_kind === 'requests_per_second'))
|
|
411
421
|
);
|
|
412
422
|
}
|
|
413
423
|
|
|
@@ -416,10 +426,14 @@ function isRuntimeSchedulerCapacityResponse(input: {
|
|
|
416
426
|
bodyText: string;
|
|
417
427
|
}): boolean {
|
|
418
428
|
// This is a scheduler pre-admission outcome. Do not extend this exemption to
|
|
419
|
-
// generic 503s: they can arrive after a non-idempotent provider call.
|
|
429
|
+
// generic 503s: they can arrive after a non-idempotent provider call. The
|
|
430
|
+
// relay's routing failure qualifies only with its explicit no-dispatch proof.
|
|
431
|
+
if (input.status !== 503) return false;
|
|
432
|
+
const body = parseJsonObject(input.bodyText);
|
|
420
433
|
return (
|
|
421
|
-
|
|
422
|
-
|
|
434
|
+
body?.code === 'scheduler_capacity' ||
|
|
435
|
+
(body?.code === 'RUNTIME_SCHEDULER_UNAVAILABLE' &&
|
|
436
|
+
body.provider_request_dispatched === false)
|
|
423
437
|
);
|
|
424
438
|
}
|
|
425
439
|
|
|
@@ -626,6 +640,18 @@ function decideToolExecuteHttpRetry(input: {
|
|
|
626
640
|
};
|
|
627
641
|
}
|
|
628
642
|
|
|
643
|
+
/** The next wait after a connection failed to open, or null once the window closes. */
|
|
644
|
+
export function toolExecuteConnectRetryDelayMs(input: {
|
|
645
|
+
failures: number;
|
|
646
|
+
elapsedMs: number;
|
|
647
|
+
}): number | null {
|
|
648
|
+
if (input.elapsedMs >= TOOL_EXECUTE_CONNECT_RETRY_WINDOW_MS) return null;
|
|
649
|
+
return Math.min(
|
|
650
|
+
TOOL_EXECUTE_RETRY_DELAY_MAX_MS,
|
|
651
|
+
TOOL_EXECUTE_TRANSPORT_RETRY_DELAY_MS * input.failures,
|
|
652
|
+
);
|
|
653
|
+
}
|
|
654
|
+
|
|
629
655
|
export function createToolExecuteHttpFailureAttemptTracker(): ToolExecuteHttpFailureAttemptTracker {
|
|
630
656
|
const attemptsByReason: Record<
|
|
631
657
|
ToolExecuteHttpRetryDecision['reason'],
|
|
@@ -745,7 +771,7 @@ export function classifyToolExecuteHttpFailure(input: {
|
|
|
745
771
|
const concurrencyBackpressure = isConcurrencyBackpressureResponse(input);
|
|
746
772
|
const runtimeSchedulerCapacity = isRuntimeSchedulerCapacityResponse(input);
|
|
747
773
|
const providerPacingWait = isProviderPacingWaitResponse(input);
|
|
748
|
-
const
|
|
774
|
+
const preDispatchRateRefusal = isPreDispatchRateRefusalResponse(input);
|
|
749
775
|
const edgeGatewayFailure = isEdgeGatewayFailureResponse(input);
|
|
750
776
|
const executionFenced = input.executionFenced === true;
|
|
751
777
|
const explicitRetryable = readExplicitToolHttpRetryability(input);
|
|
@@ -964,6 +990,6 @@ export function classifyToolExecuteHttpFailure(input: {
|
|
|
964
990
|
runtimeSchedulerCapacity ||
|
|
965
991
|
concurrencyBackpressure ||
|
|
966
992
|
providerPacingWait ||
|
|
967
|
-
|
|
993
|
+
preDispatchRateRefusal,
|
|
968
994
|
};
|
|
969
995
|
}
|
|
@@ -60,6 +60,7 @@ import {
|
|
|
60
60
|
import {
|
|
61
61
|
normalizeTableNamespace,
|
|
62
62
|
sha256Hex,
|
|
63
|
+
stableStringify,
|
|
63
64
|
} from '../plays/row-identity';
|
|
64
65
|
import { listNameFromDeclaredPath } from './tool-result-paths';
|
|
65
66
|
import {
|
|
@@ -1275,10 +1276,10 @@ function buildTargets(
|
|
|
1275
1276
|
const declaredTargetPaths = new Map<string, readonly string[]>();
|
|
1276
1277
|
const semanticStatusTargets = new Set<string>();
|
|
1277
1278
|
for (const [target, descriptor] of Object.entries(extractors ?? {})) {
|
|
1278
|
-
//
|
|
1279
|
-
// Semantic status getters
|
|
1280
|
-
//
|
|
1281
|
-
//
|
|
1279
|
+
// Declared getters are total: a declared but absent value reads null.
|
|
1280
|
+
// Semantic status getters never borrow a sibling key or manufacture an
|
|
1281
|
+
// "unknown" status, which would blur no signal with an observed provider
|
|
1282
|
+
// verdict; an unresolved status reads null like any other miss.
|
|
1282
1283
|
const isSemanticStatus =
|
|
1283
1284
|
descriptor.emailStatus !== undefined ||
|
|
1284
1285
|
descriptor.transforms?.some((transform) =>
|
|
@@ -1287,7 +1288,7 @@ function buildTargets(
|
|
|
1287
1288
|
),
|
|
1288
1289
|
) === true;
|
|
1289
1290
|
if (isSemanticStatus) semanticStatusTargets.add(target);
|
|
1290
|
-
|
|
1291
|
+
declaredTargetPaths.set(target, descriptor.paths);
|
|
1291
1292
|
const emailStatusTarget = buildEmailStatusTarget(result, descriptor);
|
|
1292
1293
|
if (emailStatusTarget) {
|
|
1293
1294
|
targets[target] = emailStatusTarget;
|
|
@@ -1447,8 +1448,18 @@ function applySerializedTargetValues(
|
|
|
1447
1448
|
targetValues: Record<string, ToolResultTargetMetadata> | undefined,
|
|
1448
1449
|
): ToolExecuteResult {
|
|
1449
1450
|
if (!targetValues || Object.keys(targetValues).length === 0) return result;
|
|
1450
|
-
|
|
1451
|
-
|
|
1451
|
+
// Receipts saved before status getters were total omit an unresolved
|
|
1452
|
+
// status. Keep every declared getter callable on replay: a target the
|
|
1453
|
+
// receipt did not save reads null, never a value recomputed here.
|
|
1454
|
+
const targets: Record<string, ToolResultTargetMetadata> = {};
|
|
1455
|
+
for (const [target, rebuilt] of Object.entries(result._metadata.targets)) {
|
|
1456
|
+
if (!Object.prototype.hasOwnProperty.call(targetValues, target)) {
|
|
1457
|
+
targets[target] = { path: rebuilt.path, value: null };
|
|
1458
|
+
}
|
|
1459
|
+
}
|
|
1460
|
+
Object.assign(targets, targetValues);
|
|
1461
|
+
result._metadata.targets = targets;
|
|
1462
|
+
result.extractedValues = buildExtractedAccessors(targets);
|
|
1452
1463
|
return result;
|
|
1453
1464
|
}
|
|
1454
1465
|
|
|
@@ -2492,8 +2503,9 @@ export function cloneToolExecuteResultWithExecution<TResult>(
|
|
|
2492
2503
|
value: ToolExecuteResult<TResult>,
|
|
2493
2504
|
execution: ToolResultExecutionMetadata,
|
|
2494
2505
|
): ToolExecuteResult<TResult> {
|
|
2495
|
-
|
|
2496
|
-
|
|
2506
|
+
const serialized = serializeToolExecuteResult(value);
|
|
2507
|
+
const cloned = deserializeToolExecuteResult({
|
|
2508
|
+
...serialized,
|
|
2497
2509
|
execution: {
|
|
2498
2510
|
...execution,
|
|
2499
2511
|
...(!execution.resultReceiptKey &&
|
|
@@ -2502,6 +2514,18 @@ export function cloneToolExecuteResultWithExecution<TResult>(
|
|
|
2502
2514
|
: {}),
|
|
2503
2515
|
},
|
|
2504
2516
|
}) as ToolExecuteResult<TResult>;
|
|
2517
|
+
const relayReference = relayPublishedResultReferences.get(value);
|
|
2518
|
+
// The immutable relay body includes execution metadata. A presentation-only
|
|
2519
|
+
// clone may reuse it only if replaying that body preserves the exact stored
|
|
2520
|
+
// projection; another call's receipt identity must retain its own value.
|
|
2521
|
+
if (
|
|
2522
|
+
relayReference &&
|
|
2523
|
+
stableStringify(serialized.execution) ===
|
|
2524
|
+
stableStringify(cloned._metadata.execution)
|
|
2525
|
+
) {
|
|
2526
|
+
relayPublishedResultReferences.set(cloned, relayReference);
|
|
2527
|
+
}
|
|
2528
|
+
return cloned;
|
|
2505
2529
|
}
|
|
2506
2530
|
|
|
2507
2531
|
/**
|
|
@@ -30,6 +30,34 @@ export function transportGatewayOriginForDiagnostic(url: string): string {
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
+
/**
|
|
34
|
+
* True only for failures that cannot happen once a socket exists, so no byte of
|
|
35
|
+
* the HTTP request was written. Replaying one needs no idempotency proof. A
|
|
36
|
+
* dual-stack host reports an AggregateError with `syscall` only on each entry,
|
|
37
|
+
* and one entry that lacks the proof leaves the whole failure ambiguous.
|
|
38
|
+
*/
|
|
39
|
+
export function transportFailureProvesRequestNeverSent(
|
|
40
|
+
error: unknown,
|
|
41
|
+
depth = 0,
|
|
42
|
+
): boolean {
|
|
43
|
+
const value = asErrorLike(error);
|
|
44
|
+
// Rate-state wraps the fetch failure twice before the AggregateError entries.
|
|
45
|
+
if (!value || depth > 6) return false;
|
|
46
|
+
if (
|
|
47
|
+
value.code === 'UND_ERR_CONNECT_TIMEOUT' ||
|
|
48
|
+
value.syscall === 'connect' ||
|
|
49
|
+
value.syscall === 'getaddrinfo'
|
|
50
|
+
) {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
if (Array.isArray(value.errors) && value.errors.length > 0) {
|
|
54
|
+
return value.errors.every((entry) =>
|
|
55
|
+
transportFailureProvesRequestNeverSent(entry, depth + 1),
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
return transportFailureProvesRequestNeverSent(value.cause, depth + 1);
|
|
59
|
+
}
|
|
60
|
+
|
|
33
61
|
/**
|
|
34
62
|
* Make a small, secret-redacted transport diagnostic that can safely cross the
|
|
35
63
|
* runner -> gateway -> durable run-log boundary. Keep stacks in process logs:
|
|
@@ -16,14 +16,64 @@ export const WORK_RECEIPT_KEY_FORMAT = {
|
|
|
16
16
|
/** Reserved scalar admission fact, distinct from customer-authored work output. */
|
|
17
17
|
export const RUNTIME_SHEET_WRITE_INTENT_RECEIPT_KIND =
|
|
18
18
|
'runtime-sheet-write-intent';
|
|
19
|
+
export const RUNTIME_ARRAY_INPUT_BEGIN_RECEIPT_KIND =
|
|
20
|
+
'runtime-array-input-begin';
|
|
21
|
+
export const RUNTIME_ARRAY_INPUT_PAGE_RECEIPT_KIND = 'runtime-array-input-page';
|
|
22
|
+
export const RUNTIME_ARRAY_INPUT_SEAL_RECEIPT_KIND = 'runtime-array-input-seal';
|
|
23
|
+
export const RUNTIME_ARRAY_INPUT_RUN_GUARD_RECEIPT_KIND =
|
|
24
|
+
'runtime-array-input-run-guard';
|
|
25
|
+
|
|
26
|
+
export const INTERNAL_WORK_RECEIPT_KINDS = [
|
|
27
|
+
RUNTIME_SHEET_WRITE_INTENT_RECEIPT_KIND,
|
|
28
|
+
RUNTIME_ARRAY_INPUT_BEGIN_RECEIPT_KIND,
|
|
29
|
+
RUNTIME_ARRAY_INPUT_PAGE_RECEIPT_KIND,
|
|
30
|
+
RUNTIME_ARRAY_INPUT_SEAL_RECEIPT_KIND,
|
|
31
|
+
RUNTIME_ARRAY_INPUT_RUN_GUARD_RECEIPT_KIND,
|
|
32
|
+
] as const;
|
|
33
|
+
|
|
34
|
+
const INTERNAL_WORK_RECEIPT_KEY_PREFIXES = INTERNAL_WORK_RECEIPT_KINDS.map(
|
|
35
|
+
(kind) => encodeURIComponent(`["${kind}",`),
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
/** Internal facts have dedicated fenced writers, never generic cache writers. */
|
|
39
|
+
export function isInternalWorkReceiptKey(key: string): boolean {
|
|
40
|
+
if (!key.startsWith(`${WORK_RECEIPT_KEY_FORMAT.prefix}:`)) return false;
|
|
41
|
+
const parts = key.split(WORK_RECEIPT_KEY_FORMAT.separator);
|
|
42
|
+
if (
|
|
43
|
+
parts.length !== 4 ||
|
|
44
|
+
!INTERNAL_WORK_RECEIPT_KEY_PREFIXES.some((prefix) =>
|
|
45
|
+
parts[3]!.startsWith(prefix),
|
|
46
|
+
)
|
|
47
|
+
) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
const value: unknown = JSON.parse(decodeURIComponent(parts[3]!));
|
|
52
|
+
return (
|
|
53
|
+
Array.isArray(value) &&
|
|
54
|
+
INTERNAL_WORK_RECEIPT_KINDS.some((kind) => value[0] === kind)
|
|
55
|
+
);
|
|
56
|
+
} catch {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function assertWorkReceiptKeyMutable(key: string): void {
|
|
62
|
+
if (isInternalWorkReceiptKey(key)) {
|
|
63
|
+
throw new Error(
|
|
64
|
+
'Internal runtime facts cannot be mutated through generic work receipt operations.',
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
19
68
|
|
|
20
|
-
/** Keep internal
|
|
69
|
+
/** Keep internal runtime facts out of customer work-output projections. */
|
|
21
70
|
export function workReceiptOutputPredicateSql(keyColumn = 'k'): string {
|
|
22
71
|
const keySql = `convert_from(${keyColumn}, 'UTF8')`;
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
72
|
+
const internalPrefixes = INTERNAL_WORK_RECEIPT_KEY_PREFIXES.map(
|
|
73
|
+
(prefix) =>
|
|
74
|
+
`starts_with(split_part(${keySql}, '${WORK_RECEIPT_KEY_FORMAT.separator}', 4), '${prefix}')`,
|
|
75
|
+
).join(' OR ');
|
|
76
|
+
return `NOT (starts_with(${keySql}, '${WORK_RECEIPT_KEY_FORMAT.prefix}${WORK_RECEIPT_KEY_FORMAT.separator}') AND (${internalPrefixes}))`;
|
|
27
77
|
}
|
|
28
78
|
|
|
29
79
|
export const WORK_RECEIPT_STATUS_CODE = {
|
|
@@ -136,6 +136,12 @@ export const PLAY_AUTHORING_CONTRACT_CHANGELOG =
|
|
|
136
136
|
* execution-boundary guarantee.
|
|
137
137
|
*/
|
|
138
138
|
export const PLAY_AUTHORING_RUNTIME_CAPABILITIES = [
|
|
139
|
+
{
|
|
140
|
+
capability: 'Hosted pages',
|
|
141
|
+
surface: '`deepline.pages.write`',
|
|
142
|
+
contract:
|
|
143
|
+
'A write replaces the whole page and must set `public`. The first write sets who can see the page. A later write can make a public page private but never a private page public; that takes `deepline pages set-public <name>`, and `deepline plays check` warns when code asks for it. A completed write is safe to repeat.',
|
|
144
|
+
},
|
|
139
145
|
{
|
|
140
146
|
capability: 'Durable external I/O',
|
|
141
147
|
surface:
|
|
@@ -1481,6 +1487,28 @@ export const PLAY_AUTHORING_STATIC_FETCH_KEY_HINT =
|
|
|
1481
1487
|
`${PLAY_AUTHORING_DOCUMENTATION.staticCallKeys.workaround} Do not compute the key.` as const;
|
|
1482
1488
|
|
|
1483
1489
|
/** The complete customer-authored `ctx` Interface shared by every Adapter. */
|
|
1490
|
+
export type PlayAuthoringPageWriteOptions = {
|
|
1491
|
+
/**
|
|
1492
|
+
* Who can see the page. Taken from the first write. A later write cannot make
|
|
1493
|
+
* a private page public: run `deepline pages set-public <name>` for that.
|
|
1494
|
+
*/
|
|
1495
|
+
public: boolean;
|
|
1496
|
+
/** Replaces the page's whole content. A non-string is stored as JSON. */
|
|
1497
|
+
content: unknown;
|
|
1498
|
+
/** Defaults to text, JSON, or binary according to `content`. */
|
|
1499
|
+
contentType?: string;
|
|
1500
|
+
description?: string;
|
|
1501
|
+
};
|
|
1502
|
+
|
|
1503
|
+
export type PlayAuthoringPageWriteResult = {
|
|
1504
|
+
name: string;
|
|
1505
|
+
url: string;
|
|
1506
|
+
/** Who can actually see the page after this write. */
|
|
1507
|
+
public: boolean;
|
|
1508
|
+
created: boolean;
|
|
1509
|
+
warnings: string[];
|
|
1510
|
+
};
|
|
1511
|
+
|
|
1484
1512
|
export interface PlayAuthoringRuntimeContext<
|
|
1485
1513
|
TListGetter extends 'dataset' | 'array' = 'dataset',
|
|
1486
1514
|
> {
|
|
@@ -1493,6 +1521,17 @@ export interface PlayAuthoringRuntimeContext<
|
|
|
1493
1521
|
entitlements(): Promise<BillingEntitlements>;
|
|
1494
1522
|
};
|
|
1495
1523
|
|
|
1524
|
+
pages: {
|
|
1525
|
+
/**
|
|
1526
|
+
* Replace a named page in this workspace and return its URL.
|
|
1527
|
+
* @sdkReference runtime 181 deepline.pages.write(name, options)
|
|
1528
|
+
*/
|
|
1529
|
+
write(
|
|
1530
|
+
name: string,
|
|
1531
|
+
options: PlayAuthoringPageWriteOptions,
|
|
1532
|
+
): Promise<PlayAuthoringPageWriteResult>;
|
|
1533
|
+
};
|
|
1534
|
+
|
|
1496
1535
|
/**
|
|
1497
1536
|
* Load a staged CSV file as a durable dataset handle.
|
|
1498
1537
|
* @sdkReference runtime 040 deepline.csv(path, options)
|
|
@@ -3416,9 +3455,10 @@ export const PLAY_AUTHORING_CLOUD_TYPE_DECLARATIONS = [
|
|
|
3416
3455
|
'};',
|
|
3417
3456
|
'export type PlayReferenceLike<TInput extends Record<string, unknown> = Record<string, unknown>> = ({ readonly playName: string; readonly name?: string } | { readonly name: string; readonly playName?: string }) & { readonly __inputType?: TInput };',
|
|
3418
3457
|
'export type BillingBenefitValues = { quickenrichUnlimited: { enabled: boolean; requestsPerMinute: number }; peopleSearch: { enabled: boolean; requestsPerMinute: number; profilesPerMonth: number; overageCreditsPerProfile?: number } };',
|
|
3419
|
-
"export type BillingEntitlements = { org_id: string; as_of: number; plan: { sku: string; name: string; catalog_revision: string | null; included_credits: number; interval: 'month' | 'year' | null } | null; benefits: { quickenrichUnlimited?: { status: 'active' | 'past_due'; value: BillingBenefitValues['quickenrichUnlimited']; expiresAt?: number }; peopleSearch?: { status: 'active'; value: BillingBenefitValues['peopleSearch']; expiresAt?: number; usage: { month: string; periodStartsAt?: number; resetsAt?: number; resetsOn?: 'calendar_month' | 'billing_cycle'; limit: number; consumed: number; remaining: number } } }; effective_limits: { quickenrichUnlimited?: { baseline: number; effective: number; source: 'plan' | 'override'; override_expires_at?: number } } };",
|
|
3458
|
+
"export type BillingEntitlements = { org_id: string; as_of: number; plan: { sku: string; name: string; catalog_revision: string | null; included_credits: number; interval: 'month' | 'year' | null } | null; benefits: { quickenrichUnlimited?: { status: 'active' | 'past_due'; value: BillingBenefitValues['quickenrichUnlimited']; expiresAt?: number }; peopleSearch?: { status: 'active'; value: BillingBenefitValues['peopleSearch']; expiresAt?: number; usage: { month: string; periodStartsAt?: number; resetsAt?: number; resetsOn?: 'calendar_month' | 'billing_cycle'; limit: number; consumed: number; remaining: number } }; includedStorage?: { status: 'active'; usage: { limit: number; consumed: number; remaining: number; measuredDay: string; overageCharged: boolean } } }; effective_limits: { quickenrichUnlimited?: { baseline: number; effective: number; source: 'plan' | 'override'; override_expires_at?: number } } };",
|
|
3420
3459
|
'export interface DeeplinePlayRuntimeContext {',
|
|
3421
3460
|
' billing: { entitlements(): Promise<BillingEntitlements> };',
|
|
3461
|
+
' pages: { write(name: string, options: { public: boolean; content: unknown; contentType?: string; description?: string }): Promise<{ name: string; url: string; public: boolean; created: boolean; warnings: string[] }> };',
|
|
3422
3462
|
' csv<T = Record<string, unknown>>(path: string | CsvInput<T & object>, options?: CsvOptions): Promise<PlayDataset<T>>;',
|
|
3423
3463
|
' dataset<TSource extends PlayDatasetInput<object>>(key: string, items: TSource): DatasetBuilder<PlayDatasetRow<TSource> & object, PlayDatasetRow<TSource> & object>;',
|
|
3424
3464
|
' map<TSource extends PlayDatasetInput<object>>(key: string, items: TSource, options?: DatasetDefinitionOptions<PlayDatasetRow<TSource> & object>): never;',
|
|
@@ -31,6 +31,10 @@ export type PlayRuntimeFeature =
|
|
|
31
31
|
export const PLAY_ARTIFACT_VERSION = CURRENT_PLAY_ARTIFACT_CONTRACT_VERSION;
|
|
32
32
|
|
|
33
33
|
export type PlayContractCompatibilitySnapshot = {
|
|
34
|
+
/** App-injected optional diagnostic reader support, never an execution or version gate. */
|
|
35
|
+
terminalRuntimePerformanceSupported?: boolean;
|
|
36
|
+
/** App-injected reader support for optional nested body diagnostics, never an execution gate. */
|
|
37
|
+
terminalRuntimeBodyAdmissionSupported?: boolean;
|
|
34
38
|
/** Historical marker. Nothing admits, gates, or branches on it. */
|
|
35
39
|
apiVersion?: number;
|
|
36
40
|
artifactVersion: number;
|