deepline 0.3.461 → 0.3.462

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/dist/bundling-sources/sdk/src/client-core.ts +7593 -0
  2. package/dist/bundling-sources/sdk/src/client.ts +8 -7366
  3. package/dist/bundling-sources/sdk/src/http-core.ts +1239 -0
  4. package/dist/bundling-sources/sdk/src/http.ts +6 -1231
  5. package/dist/bundling-sources/sdk/src/index.ts +4 -1
  6. package/dist/bundling-sources/sdk/src/play.ts +5 -5
  7. package/dist/bundling-sources/sdk/src/plays/client-core.ts +437 -0
  8. package/dist/bundling-sources/sdk/src/plays/client.ts +4 -421
  9. package/dist/bundling-sources/sdk/src/plays/input-example.ts +3 -4
  10. package/dist/bundling-sources/sdk/src/plays/play-description.ts +1 -1
  11. package/dist/bundling-sources/sdk/src/plays/run-request.ts +1 -1
  12. package/dist/bundling-sources/sdk/src/release.ts +1 -1
  13. package/dist/bundling-sources/sdk/src/server.ts +43 -0
  14. package/dist/bundling-sources/sdk/src/types.ts +15 -5
  15. package/dist/bundling-sources/shared_libs/integration-contracts/billing-entitlements.ts +15 -0
  16. package/dist/bundling-sources/shared_libs/monitors/callback-security.ts +0 -307
  17. package/dist/bundling-sources/shared_libs/monitors/http-error-response.ts +3 -0
  18. package/dist/bundling-sources/shared_libs/monitors/lifecycle-notifications.ts +3 -2
  19. package/dist/bundling-sources/shared_libs/monitors/package.json +2 -0
  20. package/dist/bundling-sources/shared_libs/monitors/provider-callback-verification.ts +34 -0
  21. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-batch-operation.ts +59 -0
  22. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-upstream-identity.ts +94 -1
  23. package/dist/bundling-sources/shared_libs/monitors/signal-radars/inbound-dead-letter.ts +11 -1
  24. package/dist/bundling-sources/shared_libs/monitors/signal-radars/inbound-failure-codes.ts +24 -0
  25. package/dist/bundling-sources/shared_libs/observability/dlq.ts +32 -0
  26. package/dist/bundling-sources/shared_libs/observability/scheduled-jobs.json +57 -3
  27. package/dist/bundling-sources/shared_libs/observability/scheduled-work.ts +1 -0
  28. package/dist/bundling-sources/shared_libs/play-data-plane/r2.ts +66 -1
  29. package/dist/bundling-sources/shared_libs/play-data-plane/sheet-column-storage.ts +36 -7
  30. package/dist/bundling-sources/shared_libs/play-runtime/app-runtime-api.ts +250 -11
  31. package/dist/bundling-sources/shared_libs/play-runtime/array-input-store.ts +319 -0
  32. package/dist/bundling-sources/shared_libs/play-runtime/context.ts +991 -359
  33. package/dist/bundling-sources/shared_libs/play-runtime/ctx-types.ts +17 -0
  34. package/dist/bundling-sources/shared_libs/play-runtime/daytona-sandbox-janitor.ts +13 -0
  35. package/dist/bundling-sources/shared_libs/play-runtime/daytona-sandbox-reaper.ts +110 -0
  36. package/dist/bundling-sources/shared_libs/play-runtime/deployment/fly-machines.ts +155 -6
  37. package/dist/bundling-sources/shared_libs/play-runtime/deployment/fly-registry.ts +110 -6
  38. package/dist/bundling-sources/shared_libs/play-runtime/durable-receipt-execution.ts +127 -13
  39. package/dist/bundling-sources/shared_libs/play-runtime/execution-capabilities.ts +14 -1
  40. package/dist/bundling-sources/shared_libs/play-runtime/fixture-behavior.ts +57 -1
  41. package/dist/bundling-sources/shared_libs/play-runtime/free-company-lookup-batching.ts +218 -0
  42. package/dist/bundling-sources/shared_libs/play-runtime/gateway-postgres-admission.ts +42 -5
  43. package/dist/bundling-sources/shared_libs/play-runtime/governor/app-runtime-budget-state-backend.ts +6 -1
  44. package/dist/bundling-sources/shared_libs/play-runtime/governor/app-runtime-rate-state-backend.ts +92 -31
  45. package/dist/bundling-sources/shared_libs/play-runtime/governor/block-reserving-budget-state-backend.ts +69 -14
  46. package/dist/bundling-sources/shared_libs/play-runtime/governor/governor.ts +93 -23
  47. package/dist/bundling-sources/shared_libs/play-runtime/governor/in-memory-rate-state-backend.ts +15 -4
  48. package/dist/bundling-sources/shared_libs/play-runtime/governor/policy.ts +22 -18
  49. package/dist/bundling-sources/shared_libs/play-runtime/governor/rate-state-backend.ts +5 -0
  50. package/dist/bundling-sources/shared_libs/play-runtime/launch-identity.ts +2 -0
  51. package/dist/bundling-sources/shared_libs/play-runtime/map-memory-limits.ts +190 -14
  52. package/dist/bundling-sources/shared_libs/play-runtime/memory-ledger.ts +131 -0
  53. package/dist/bundling-sources/shared_libs/play-runtime/modal-runtime-config.ts +77 -2
  54. package/dist/bundling-sources/shared_libs/play-runtime/output-size-limits.ts +271 -2
  55. package/dist/bundling-sources/shared_libs/play-runtime/play-run-recovery-policy.ts +51 -0
  56. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/sandbox-cleanup/contracts.ts +2 -0
  57. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/sandbox-cleanup/job.ts +27 -1
  58. package/dist/bundling-sources/shared_libs/play-runtime/play-runtime-batching-registry.ts +2 -0
  59. package/dist/bundling-sources/shared_libs/play-runtime/protocol.ts +3 -0
  60. package/dist/bundling-sources/shared_libs/play-runtime/provider-text-for-log.ts +63 -0
  61. package/dist/bundling-sources/shared_libs/play-runtime/resource-governor.ts +19 -0
  62. package/dist/bundling-sources/shared_libs/play-runtime/run-ledger-event-transport.ts +112 -16
  63. package/dist/bundling-sources/shared_libs/play-runtime/run-ledger.ts +104 -2
  64. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/index.ts +265 -151
  65. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/runtime-gateway-transport.ts +17 -0
  66. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/runtime-progress-push.ts +35 -14
  67. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/runtime-sheet-persistence-retry.ts +12 -1
  68. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-control-transport.ts +4 -0
  69. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-labels.ts +36 -0
  70. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-launch-transport.ts +136 -70
  71. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-lifecycle.ts +237 -36
  72. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-runtime-watchdog.ts +148 -4
  73. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-session-execution.ts +6 -0
  74. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona.ts +285 -32
  75. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/modal.ts +251 -56
  76. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/runtime-sandbox-reconciliation.ts +29 -4
  77. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/sandbox-create-outcome.ts +27 -0
  78. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/types.ts +22 -1
  79. package/dist/bundling-sources/shared_libs/play-runtime/runtime-api.ts +1397 -382
  80. package/dist/bundling-sources/shared_libs/play-runtime/runtime-array-input-receipts.ts +920 -0
  81. package/dist/bundling-sources/shared_libs/play-runtime/runtime-constants.ts +16 -0
  82. package/dist/bundling-sources/shared_libs/play-runtime/runtime-environment.ts +38 -0
  83. package/dist/bundling-sources/shared_libs/play-runtime/runtime-flow.ts +6 -0
  84. package/dist/bundling-sources/shared_libs/play-runtime/runtime-incident-drills.ts +26 -1
  85. package/dist/bundling-sources/shared_libs/play-runtime/runtime-operation-contract.ts +30 -0
  86. package/dist/bundling-sources/shared_libs/play-runtime/runtime-receipt-store-adapter.ts +14 -3
  87. package/dist/bundling-sources/shared_libs/play-runtime/runtime-receipt-writer.ts +31 -4
  88. package/dist/bundling-sources/shared_libs/play-runtime/runtime-sheet-row-transition.ts +47 -0
  89. package/dist/bundling-sources/shared_libs/play-runtime/sandbox-compute-usage.ts +20 -7
  90. package/dist/bundling-sources/shared_libs/play-runtime/sandbox-runs/contract.ts +12 -0
  91. package/dist/bundling-sources/shared_libs/play-runtime/sandbox-runs/index.ts +9 -0
  92. package/dist/bundling-sources/shared_libs/play-runtime/sandbox-runs/runner-backend-adapter.ts +10 -0
  93. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backend.ts +4 -0
  94. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-runtime-worker.ts +1496 -320
  95. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-worker-required-env.ts +31 -1
  96. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres.ts +1389 -129
  97. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/receipt-gateway.ts +36 -0
  98. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/run-ledger-dispatch-authority.ts +4 -0
  99. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/run-ledger-outbox-recovery.ts +162 -23
  100. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-event-search.ts +499 -115
  101. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-sandbox-capacity.ts +377 -9
  102. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-sandbox-ledger-reconciliation.ts +117 -8
  103. package/dist/bundling-sources/shared_libs/play-runtime/secret-resolution-retry-policy.ts +25 -0
  104. package/dist/bundling-sources/shared_libs/play-runtime/terminal-runtime-performance.ts +391 -0
  105. package/dist/bundling-sources/shared_libs/play-runtime/test-runtime-seams.ts +40 -0
  106. package/dist/bundling-sources/shared_libs/play-runtime/tool-call/index.ts +6 -0
  107. package/dist/bundling-sources/shared_libs/play-runtime/tool-call/mapped-calls.ts +171 -0
  108. package/dist/bundling-sources/shared_libs/play-runtime/tool-call/receipt-cohort.ts +16 -1
  109. package/dist/bundling-sources/shared_libs/play-runtime/tool-execute-retry-policy.ts +26 -3
  110. package/dist/bundling-sources/shared_libs/play-runtime/tool-result.ts +16 -2
  111. package/dist/bundling-sources/shared_libs/play-runtime/transport-error-diagnostics.ts +28 -0
  112. package/dist/bundling-sources/shared_libs/play-runtime/work-receipt-storage-contract.ts +55 -5
  113. package/dist/bundling-sources/shared_libs/plays/authoring-contract.ts +41 -1
  114. package/dist/bundling-sources/shared_libs/plays/contracts.ts +4 -0
  115. package/dist/bundling-sources/shared_libs/plays/dataset.ts +9 -3
  116. package/dist/bundling-sources/shared_libs/plays/deploy/manifest-contract.ts +2 -0
  117. package/dist/bundling-sources/shared_libs/plays/deploy/manifest.ts +3 -2
  118. package/dist/bundling-sources/shared_libs/plays/deploy/project-serializer.ts +2 -2
  119. package/dist/bundling-sources/shared_libs/plays/run-output-summary.ts +66 -0
  120. package/dist/bundling-sources/shared_libs/plays/script-entry.ts +1 -1
  121. package/dist/bundling-sources/shared_libs/product-notifications/catalog.ts +43 -1
  122. package/dist/bundling-sources/shared_libs/product-notifications/content.ts +9 -0
  123. package/dist/bundling-sources/shared_libs/product-notifications/email.ts +91 -13
  124. package/dist/bundling-sources/shared_libs/product-notifications/events.ts +3 -0
  125. package/dist/bundling-sources/shared_libs/product-notifications/slack-delivery.ts +41 -24
  126. package/dist/bundling-sources/shared_libs/security/attested-client-ip.ts +91 -0
  127. package/dist/bundling-sources/shared_libs/security/internal-actor.ts +0 -11
  128. package/dist/cli/{auth-6HJXNWUG.mjs → auth-JDLEY7VU.mjs} +5 -4
  129. package/dist/cli/auth-UXKY6TCC.js +41 -0
  130. package/dist/cli/{billing-6P5HO6QG.js → billing-HXAXB3XZ.js} +152 -78
  131. package/dist/cli/{billing-MJ42N7YF.mjs → billing-SDHLBLMV.mjs} +84 -10
  132. package/dist/cli/{chunk-5MDIZX7M.js → chunk-3ACMRZRV.js} +8 -6
  133. package/dist/cli/{chunk-FGLKOWSC.mjs → chunk-3KZCFOZ6.mjs} +1 -1
  134. package/dist/cli/chunk-4KQ6SIBC.mjs +1038 -0
  135. package/dist/cli/{chunk-Z2GUFYT6.js → chunk-5LEAXRHV.js} +11 -11
  136. package/dist/cli/{chunk-MEAIOXJL.mjs → chunk-6NNVJDVR.mjs} +7 -5
  137. package/dist/cli/{chunk-NMJ4D2WO.js → chunk-6PMCRYDA.js} +216 -91
  138. package/dist/cli/{chunk-RY4IVOU3.mjs → chunk-6RNQGWFD.mjs} +16 -806
  139. package/dist/cli/{chunk-EBU7LQ64.js → chunk-6V7KVRR5.js} +3 -3
  140. package/dist/cli/{chunk-OZBWRICM.js → chunk-7LFIMWMW.js} +2 -2
  141. package/dist/cli/chunk-7MJ6VI2T.mjs +19 -0
  142. package/dist/cli/chunk-7SWNPNML.js +1039 -0
  143. package/dist/cli/{chunk-IHHLTHE7.mjs → chunk-7U3XNPOA.mjs} +267 -38
  144. package/dist/cli/{chunk-5FDKJQZE.js → chunk-7VZHXVOQ.js} +1 -1
  145. package/dist/cli/{chunk-R64BGGRQ.mjs → chunk-AT636LLU.mjs} +2 -2
  146. package/dist/cli/{chunk-MDJPEGVN.js → chunk-BGTPIMSM.js} +392 -261
  147. package/dist/cli/{chunk-KVJ5VHW5.mjs → chunk-CKSOY47X.mjs} +2 -2
  148. package/dist/cli/{chunk-7DH2FD7Y.mjs → chunk-D464JW3N.mjs} +5 -85
  149. package/dist/cli/chunk-D6DXOUTO.mjs +827 -0
  150. package/dist/cli/{describe-2WQY7ZCY.js → chunk-EM4TXCCI.js} +27 -44
  151. package/dist/cli/chunk-F6QV42MC.mjs +91 -0
  152. package/dist/cli/chunk-FKVYR3QA.mjs +1039 -0
  153. package/dist/cli/{chunk-FGMX4HUZ.js → chunk-GEGW5HPZ.js} +29 -27
  154. package/dist/cli/{chunk-TNMBPMMC.js → chunk-HUB3CCM2.js} +13 -4
  155. package/dist/cli/{chunk-ACCR7POB.js → chunk-I6VHOU5O.js} +27 -27
  156. package/dist/cli/{chunk-Z2XUZC34.js → chunk-IAYSWZDJ.js} +188 -76
  157. package/dist/cli/chunk-JF3TLIMQ.js +19 -0
  158. package/dist/cli/{chunk-HDFRJ4IT.mjs → chunk-JVHOS3K3.mjs} +177 -65
  159. package/dist/cli/{chunk-V7REJRDZ.mjs → chunk-LFXLQEZN.mjs} +1 -1
  160. package/dist/cli/{chunk-CRYOUPEB.js → chunk-LROWFPGN.js} +16 -16
  161. package/dist/cli/{chunk-SLEUWLJE.mjs → chunk-MSY22NQW.mjs} +5 -5
  162. package/dist/cli/{chunk-BGY2PLP7.mjs → chunk-MUUQZIOF.mjs} +23 -49
  163. package/dist/cli/{chunk-FCAZQ7WV.js → chunk-NBLSCHKK.js} +52 -50
  164. package/dist/cli/{chunk-QAJAJPKK.mjs → chunk-NHRWZPWZ.mjs} +4 -2
  165. package/dist/cli/{chunk-KXMNM4AQ.js → chunk-NMU3VR5U.js} +4 -5
  166. package/dist/cli/{chunk-QIW7TVV6.mjs → chunk-O2RX5A66.mjs} +14 -12
  167. package/dist/cli/{chunk-SAZFZQRI.js → chunk-OMQ23IXL.js} +2 -2
  168. package/dist/cli/{chunk-5IYOUBFZ.js → chunk-OPJAJBD4.js} +28 -54
  169. package/dist/cli/{chunk-FJZILBL7.mjs → chunk-PHSEINNH.mjs} +5 -5
  170. package/dist/cli/{chunk-3DNKFH2G.mjs → chunk-PKHVSIJG.mjs} +19 -1
  171. package/dist/cli/{chunk-WIYWSYDS.mjs → chunk-Q2EIZKVX.mjs} +3 -3
  172. package/dist/cli/{chunk-5FY72YOV.js → chunk-QJZ6WNWD.js} +8 -8
  173. package/dist/cli/{chunk-EIMG75BT.mjs → chunk-S3A4IXBQ.mjs} +4 -5
  174. package/dist/cli/{chunk-3BMLICF7.mjs → chunk-S42YIQNE.mjs} +13 -8
  175. package/dist/cli/{chunk-RFONC4WJ.mjs → chunk-S6UAJR6V.mjs} +3 -3
  176. package/dist/cli/{chunk-G7L27KZB.mjs → chunk-TKAQR3IB.mjs} +31 -21
  177. package/dist/cli/{chunk-QWRHGGUH.js → chunk-UAJFWWZE.js} +20 -2
  178. package/dist/cli/{chunk-VZBCEA5S.mjs → chunk-UDRPEZ5F.mjs} +223 -92
  179. package/dist/cli/{chunk-KCCOQ5G5.js → chunk-ULK7JGGI.js} +511 -282
  180. package/dist/cli/chunk-V335HGX5.js +1038 -0
  181. package/dist/cli/{chunk-MGXEUZHL.mjs → chunk-V3MEA7NB.mjs} +7 -5
  182. package/dist/cli/{chunk-O6QOMHCH.js → chunk-VFGVXXZP.js} +37 -35
  183. package/dist/cli/chunk-VLEVVDWG.js +91 -0
  184. package/dist/cli/{chunk-R2GLGLDR.mjs → chunk-VPHN2HAL.mjs} +216 -91
  185. package/dist/cli/{chunk-CFUTOWE4.js → chunk-WG3KGAII.js} +8 -88
  186. package/dist/cli/{describe-FRAVCY5F.mjs → chunk-WIY6U6GD.mjs} +19 -36
  187. package/dist/cli/{chunk-PNATXKLP.js → chunk-XANRM3QA.js} +6 -6
  188. package/dist/cli/{chunk-KGQNIA37.js → chunk-XQCTG5OO.js} +44 -34
  189. package/dist/cli/{chunk-T3MVIPHG.mjs → chunk-XZAFIOUQ.mjs} +1 -1
  190. package/dist/cli/chunk-Y4DPU4OM.js +827 -0
  191. package/dist/cli/chunk-YT5EODJO.js +920 -0
  192. package/dist/cli/{chunk-SCIR5JXW.js → chunk-ZGQSFYD2.js} +56 -51
  193. package/dist/cli/{chunk-QEYHTIV4.mjs → chunk-ZUK6LIJB.mjs} +10 -1
  194. package/dist/cli/command-docs.d.mts +5 -0
  195. package/dist/cli/command-docs.d.ts +5 -0
  196. package/dist/cli/command-docs.js +2 -2
  197. package/dist/cli/command-docs.mjs +1 -1
  198. package/dist/cli/{csv-NX7NO3O6.js → csv-C56GSCEU.js} +13 -12
  199. package/dist/cli/{csv-DQ6GW5B5.mjs → csv-L54JS7TF.mjs} +4 -3
  200. package/dist/cli/{db-R72DFMP6.js → db-MOGRMZTA.js} +30 -27
  201. package/dist/cli/{db-2YP33M4K.mjs → db-YVBUW2DX.mjs} +10 -7
  202. package/dist/cli/describe-KYEULWPG.js +48 -0
  203. package/dist/cli/describe-NLZKKT7C.mjs +48 -0
  204. package/dist/cli/describe-core.d.mts +153 -5
  205. package/dist/cli/describe-core.d.ts +153 -5
  206. package/dist/cli/describe-core.js +9 -5
  207. package/dist/cli/describe-core.mjs +10 -6
  208. package/dist/cli/{executions-ZLHD4QIT.js → executions-A7L4ULPP.js} +9 -7
  209. package/dist/cli/{executions-WFBU7L2Q.mjs → executions-ZBGSTT37.mjs} +7 -5
  210. package/dist/cli/{feedback-CN3HJFVF.mjs → feedback-G6GU37FD.mjs} +6 -5
  211. package/dist/cli/{feedback-NDV6TPHG.js → feedback-OHLY7RYD.js} +10 -9
  212. package/dist/cli/getting-started.d.mts +6 -6
  213. package/dist/cli/getting-started.d.ts +6 -6
  214. package/dist/cli/getting-started.js +2 -2
  215. package/dist/cli/getting-started.mjs +1 -1
  216. package/dist/cli/git-P76N4NDQ.js +25 -0
  217. package/dist/cli/{git-QAD6E3HW.mjs → git-PKZW3QD5.mjs} +5 -4
  218. package/dist/cli/index.js +152 -142
  219. package/dist/cli/index.mjs +56 -46
  220. package/dist/cli/{legacy-noops-KVC5QJ74.js → legacy-noops-5LM3D724.js} +8 -7
  221. package/dist/cli/{legacy-noops-TPTKNBI2.mjs → legacy-noops-LJJYG6YA.mjs} +5 -4
  222. package/dist/cli/{monitors-SV57JFLO.mjs → monitors-72QV4ALO.mjs} +19 -6
  223. package/dist/cli/{monitors-KCROV6PJ.js → monitors-UX3H5DC2.js} +103 -90
  224. package/dist/cli/{org-KX6QIR7A.mjs → org-6RRRKOCP.mjs} +9 -6
  225. package/dist/cli/{org-NJYX5743.js → org-IF7ISUVB.js} +70 -67
  226. package/dist/cli/pages-3SU3HKL7.js +252 -0
  227. package/dist/cli/pages-DXDYYKEK.mjs +252 -0
  228. package/dist/cli/{play-IQQ57L7Z.mjs → play-AHASKRLA.mjs} +512 -1508
  229. package/dist/cli/{play-32L7EQN4.js → play-EUIUVLUH.js} +1090 -2086
  230. package/dist/cli/{providers-4WEC2EQN.mjs → providers-GWGE3WY3.mjs} +7 -5
  231. package/dist/cli/{providers-ZQV6QLVQ.js → providers-V5WU4VXJ.js} +10 -8
  232. package/dist/cli/{quickstart-RQ76RIUE.mjs → quickstart-OXKQ5ZST.mjs} +5 -4
  233. package/dist/cli/{quickstart-HKUSFADF.js → quickstart-QP65I5PF.js} +13 -12
  234. package/dist/cli/run-6MM72IGL.mjs +443 -0
  235. package/dist/cli/run-F3FTYS56.js +443 -0
  236. package/dist/cli/search-OYKOOI7A.js +32 -0
  237. package/dist/cli/{search-ZRAVFBZC.mjs → search-ZMEBVJZB.mjs} +8 -6
  238. package/dist/cli/{secrets-J3G5Y43U.js → secrets-ACND5N6A.js} +16 -14
  239. package/dist/cli/{secrets-CMJOVNVH.mjs → secrets-XRCJFF3L.mjs} +7 -5
  240. package/dist/cli/{sessions-MDQYY5CB.mjs → sessions-RTK3CEW6.mjs} +5 -4
  241. package/dist/cli/{sessions-WY7VN4AE.js → sessions-ZGRJPCFF.js} +6 -5
  242. package/dist/cli/{settings-HTNTFKCE.js → settings-PD5KWQQZ.js} +80 -77
  243. package/dist/cli/{settings-4RWZPCT5.mjs → settings-XDRBPRDE.mjs} +14 -11
  244. package/dist/cli/{setup-P3GYYZWG.mjs → setup-3HPYAOCC.mjs} +12 -10
  245. package/dist/cli/{setup-QGCAP62X.js → setup-E2Q6PXHC.js} +53 -51
  246. package/dist/cli/{skills-7NAE4ICL.mjs → skills-OOQFMPOV.mjs} +7 -6
  247. package/dist/cli/skills-XYWV52KB.js +31 -0
  248. package/dist/cli/tools-ASCDZJCK.js +55 -0
  249. package/dist/cli/tools-C5ZT3UIC.mjs +55 -0
  250. package/dist/cli/update-5RQSEIFM.js +33 -0
  251. package/dist/cli/{update-GODLRKNB.mjs → update-ZWJTADIW.mjs} +9 -8
  252. package/dist/cli/{workflow-4BXOUVEO.mjs → workflow-23NMPAJ7.mjs} +10 -8
  253. package/dist/cli/{workflow-AO3A6LXN.js → workflow-TCXU5YJV.js} +20 -18
  254. package/dist/client-DS2IWYZF.d.ts +10 -0
  255. package/dist/client-DTwnz_AW.d.mts +10 -0
  256. package/dist/{client-CYqG23K1.d.ts → client-core-B_6HAIBy.d.ts} +385 -12
  257. package/dist/{client-BbU5_j7n.d.mts → client-core-DzBSlY1U.d.mts} +385 -12
  258. package/dist/{compiler-manifest-CWz_sNOQ.d.ts → compiler-manifest-Dcyd3-Zd.d.mts} +43 -1
  259. package/dist/{compiler-manifest-CWz_sNOQ.d.mts → compiler-manifest-Dcyd3-Zd.d.ts} +43 -1
  260. package/dist/errors-d-sTrZhe.d.mts +142 -0
  261. package/dist/errors-yQwfgrcX.d.ts +142 -0
  262. package/dist/{index-BF2JB_Ug.d.mts → index-C6oXchjN.d.mts} +1 -1
  263. package/dist/{index-4NPXDzlD.d.ts → index-P56zy_z5.d.ts} +1 -1
  264. package/dist/index.d.mts +11 -147
  265. package/dist/index.d.ts +11 -147
  266. package/dist/index.js +15 -11
  267. package/dist/index.mjs +14 -10
  268. package/dist/install-integrity.json +141 -104
  269. package/dist/plays/bundle-play-file.d.mts +3 -3
  270. package/dist/plays/bundle-play-file.d.ts +3 -3
  271. package/dist/plays/bundle-play-file.mjs +2 -1
  272. package/dist/plays/play-description.d.mts +2 -2
  273. package/dist/plays/play-description.d.ts +2 -2
  274. package/dist/plays/play-description.js +2 -2
  275. package/dist/plays/play-description.mjs +1 -1
  276. package/dist/plays/run-request.d.mts +2 -2
  277. package/dist/plays/run-request.d.ts +2 -2
  278. package/dist/release.d.mts +1 -1
  279. package/dist/release.d.ts +1 -1
  280. package/dist/release.js +2 -2
  281. package/dist/release.mjs +1 -1
  282. package/dist/server.d.mts +17 -0
  283. package/dist/server.d.ts +17 -0
  284. package/dist/server.js +76 -0
  285. package/dist/server.mjs +76 -0
  286. package/package.json +6 -1
  287. package/dist/cli/auth-IACERYQH.js +0 -40
  288. package/dist/cli/chunk-PQUUWFXY.js +0 -95
  289. package/dist/cli/chunk-YBWAG72P.mjs +0 -95
  290. package/dist/cli/chunk-YQDUODZW.js +0 -1710
  291. package/dist/cli/git-JVI36ZFV.js +0 -24
  292. package/dist/cli/search-75X5LTDE.js +0 -30
  293. package/dist/cli/skills-BKJ53JOQ.js +0 -30
  294. package/dist/cli/tools-COWMIEJ6.mjs +0 -45
  295. package/dist/cli/tools-TASOCE7I.js +0 -45
  296. package/dist/cli/update-SJIKVME6.js +0 -32
@@ -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
- `Unknown Tool Call Receipt Cohort member ${memberId}.`,
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;
@@ -416,10 +423,14 @@ function isRuntimeSchedulerCapacityResponse(input: {
416
423
  bodyText: string;
417
424
  }): boolean {
418
425
  // 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.
426
+ // generic 503s: they can arrive after a non-idempotent provider call. The
427
+ // relay's routing failure qualifies only with its explicit no-dispatch proof.
428
+ if (input.status !== 503) return false;
429
+ const body = parseJsonObject(input.bodyText);
420
430
  return (
421
- input.status === 503 &&
422
- parseJsonObject(input.bodyText)?.code === 'scheduler_capacity'
431
+ body?.code === 'scheduler_capacity' ||
432
+ (body?.code === 'RUNTIME_SCHEDULER_UNAVAILABLE' &&
433
+ body.provider_request_dispatched === false)
423
434
  );
424
435
  }
425
436
 
@@ -626,6 +637,18 @@ function decideToolExecuteHttpRetry(input: {
626
637
  };
627
638
  }
628
639
 
640
+ /** The next wait after a connection failed to open, or null once the window closes. */
641
+ export function toolExecuteConnectRetryDelayMs(input: {
642
+ failures: number;
643
+ elapsedMs: number;
644
+ }): number | null {
645
+ if (input.elapsedMs >= TOOL_EXECUTE_CONNECT_RETRY_WINDOW_MS) return null;
646
+ return Math.min(
647
+ TOOL_EXECUTE_RETRY_DELAY_MAX_MS,
648
+ TOOL_EXECUTE_TRANSPORT_RETRY_DELAY_MS * input.failures,
649
+ );
650
+ }
651
+
629
652
  export function createToolExecuteHttpFailureAttemptTracker(): ToolExecuteHttpFailureAttemptTracker {
630
653
  const attemptsByReason: Record<
631
654
  ToolExecuteHttpRetryDecision['reason'],
@@ -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 {
@@ -2492,8 +2493,9 @@ export function cloneToolExecuteResultWithExecution<TResult>(
2492
2493
  value: ToolExecuteResult<TResult>,
2493
2494
  execution: ToolResultExecutionMetadata,
2494
2495
  ): ToolExecuteResult<TResult> {
2495
- return deserializeToolExecuteResult({
2496
- ...serializeToolExecuteResult(value),
2496
+ const serialized = serializeToolExecuteResult(value);
2497
+ const cloned = deserializeToolExecuteResult({
2498
+ ...serialized,
2497
2499
  execution: {
2498
2500
  ...execution,
2499
2501
  ...(!execution.resultReceiptKey &&
@@ -2502,6 +2504,18 @@ export function cloneToolExecuteResultWithExecution<TResult>(
2502
2504
  : {}),
2503
2505
  },
2504
2506
  }) as ToolExecuteResult<TResult>;
2507
+ const relayReference = relayPublishedResultReferences.get(value);
2508
+ // The immutable relay body includes execution metadata. A presentation-only
2509
+ // clone may reuse it only if replaying that body preserves the exact stored
2510
+ // projection; another call's receipt identity must retain its own value.
2511
+ if (
2512
+ relayReference &&
2513
+ stableStringify(serialized.execution) ===
2514
+ stableStringify(cloned._metadata.execution)
2515
+ ) {
2516
+ relayPublishedResultReferences.set(cloned, relayReference);
2517
+ }
2518
+ return cloned;
2505
2519
  }
2506
2520
 
2507
2521
  /**
@@ -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 sheet admission facts out of customer work-output projections. */
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 intentPrefix = encodeURIComponent(
24
- `["${RUNTIME_SHEET_WRITE_INTENT_RECEIPT_KIND}",`,
25
- );
26
- return `NOT (starts_with(${keySql}, '${WORK_RECEIPT_KEY_FORMAT.prefix}${WORK_RECEIPT_KEY_FORMAT.separator}') AND starts_with(split_part(${keySql}, '${WORK_RECEIPT_KEY_FORMAT.separator}', 4), '${intentPrefix}'))`;
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;
@@ -1037,7 +1037,11 @@ export type MaterializePlayDatasetInputOptions<T> = {
1037
1037
  export type IteratePlayDatasetInputPagesOptions<T> = {
1038
1038
  pageSize?: number;
1039
1039
  maxPageBytes?: number;
1040
- estimateRowBytes?: (row: T) => number;
1040
+ estimateRowBytes?: (
1041
+ row: T,
1042
+ index: number,
1043
+ sourceIdentity?: PlayDatasetSourceRowIdentity,
1044
+ ) => number;
1041
1045
  onRow?: (row: T, index: number) => void;
1042
1046
  };
1043
1047
 
@@ -1076,8 +1080,10 @@ export async function* iteratePlayDatasetInputPages<T>(
1076
1080
  sourceIdentity: PlayDatasetSourceRowIdentity | undefined,
1077
1081
  ): Array<{ rows: T[]; offset: number }> => {
1078
1082
  options?.onRow?.(row, index);
1079
- index += 1;
1080
- const rowBytes = Math.max(0, Math.ceil(estimateRowBytes(row)));
1083
+ const rowBytes = Math.max(
1084
+ 0,
1085
+ Math.ceil(estimateRowBytes(row, index++, sourceIdentity)),
1086
+ );
1081
1087
  const ready: Array<{ rows: T[]; offset: number }> = [];
1082
1088
  if (page.length > 0 && pageBytes + rowBytes > maxPageBytes) {
1083
1089
  ready.push({ rows: page, offset });
@@ -0,0 +1,2 @@
1
+ /** Pure deployment configuration shared by API projections and checkout readers. */
2
+ export const DEFAULT_MANIFEST_FILE = 'deepline.json';
@@ -1,6 +1,9 @@
1
1
  import { readdir, readFile, stat } from 'node:fs/promises';
2
2
  import { join, relative } from 'node:path';
3
3
  import picomatch from 'picomatch';
4
+ import { DEFAULT_MANIFEST_FILE } from './manifest-contract';
5
+
6
+ export { DEFAULT_MANIFEST_FILE } from './manifest-contract';
4
7
 
5
8
  /**
6
9
  * deepline.json — the repo-owned half of deploy configuration. The repo
@@ -98,8 +101,6 @@ export function parseDeeplineManifest(
98
101
  };
99
102
  }
100
103
 
101
- export const DEFAULT_MANIFEST_FILE = 'deepline.json';
102
-
103
104
  export async function readDeeplineManifest(
104
105
  projectRoot: string,
105
106
  manifestFile: string = DEFAULT_MANIFEST_FILE,
@@ -1,7 +1,7 @@
1
- import { DEFAULT_MANIFEST_FILE } from './manifest';
1
+ import { DEFAULT_MANIFEST_FILE } from './manifest-contract';
2
2
  import type { PlayDeploymentDoc, PlayProjectDoc } from './control-plane-types';
3
3
 
4
- export { DEFAULT_MANIFEST_FILE } from './manifest';
4
+ export { DEFAULT_MANIFEST_FILE } from './manifest-contract';
5
5
 
6
6
  export type SerializedPlayProject = {
7
7
  id: string;