deepline 0.3.409 → 0.3.410

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 (213) hide show
  1. package/dist/bundling-sources/sdk/src/agent-runtime.ts +18 -1
  2. package/dist/bundling-sources/sdk/src/client.ts +206 -333
  3. package/dist/bundling-sources/sdk/src/compat.ts +45 -2
  4. package/dist/bundling-sources/sdk/src/db/query.ts +9 -10
  5. package/dist/bundling-sources/sdk/src/http.ts +38 -20
  6. package/dist/bundling-sources/sdk/src/index.ts +4 -5
  7. package/dist/bundling-sources/sdk/src/play.ts +10 -10
  8. package/dist/bundling-sources/sdk/src/plays/bundle-play-file.ts +6 -4
  9. package/dist/bundling-sources/sdk/src/plays/check-local-play-graph.ts +114 -0
  10. package/dist/bundling-sources/sdk/src/plays/client.ts +431 -0
  11. package/dist/bundling-sources/sdk/src/plays/local-play-execution.ts +2 -2
  12. package/dist/bundling-sources/sdk/src/plays/run-request.ts +106 -16
  13. package/dist/bundling-sources/sdk/src/release.ts +13 -7
  14. package/dist/bundling-sources/sdk/src/runs/read-errors.ts +8 -0
  15. package/dist/bundling-sources/sdk/src/runs/watch-polling.ts +124 -13
  16. package/dist/bundling-sources/sdk/src/tool-calls.ts +108 -19
  17. package/dist/bundling-sources/sdk/src/types.ts +18 -0
  18. package/dist/bundling-sources/shared_libs/integration-contracts/execute-retry-contract.ts +37 -0
  19. package/dist/bundling-sources/shared_libs/integration-contracts/package.json +3 -0
  20. package/dist/bundling-sources/shared_libs/play-data-plane/r2.ts +3 -1
  21. package/dist/bundling-sources/shared_libs/play-runtime/context.ts +277 -76
  22. package/dist/bundling-sources/shared_libs/play-runtime/ctx-types.ts +6 -0
  23. package/dist/bundling-sources/shared_libs/play-runtime/dataset-row-input.ts +124 -0
  24. package/dist/bundling-sources/shared_libs/play-runtime/durable-call-cache.ts +6 -62
  25. package/dist/bundling-sources/shared_libs/play-runtime/durable-receipt-execution.ts +1 -0
  26. package/dist/bundling-sources/shared_libs/play-runtime/durable-tool-identity.ts +67 -0
  27. package/dist/bundling-sources/shared_libs/play-runtime/execute-server-timing.ts +64 -6
  28. package/dist/bundling-sources/shared_libs/play-runtime/freshness-receipt-execution.ts +1 -5
  29. package/dist/bundling-sources/shared_libs/play-runtime/ledger-safe-payload.ts +1 -1
  30. package/dist/bundling-sources/shared_libs/play-runtime/play-artifact-runtime-contract.ts +3 -0
  31. package/dist/bundling-sources/shared_libs/play-runtime/play-http-request.ts +10 -0
  32. package/dist/bundling-sources/shared_libs/play-runtime/query-result-dataset.ts +3 -0
  33. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/egress-probe.ts +3 -0
  34. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/index.ts +26 -16
  35. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/runtime-heartbeat.ts +36 -11
  36. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/runtime-terminal-push.ts +35 -0
  37. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-launch-transport.ts +21 -0
  38. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-payload-transport.ts +21 -6
  39. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-session-execution.ts +11 -2
  40. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona.ts +85 -20
  41. package/dist/bundling-sources/shared_libs/play-runtime/runtime-api.ts +71 -13
  42. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-execution-queries.ts +100 -0
  43. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-pool.ts +9 -5
  44. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-runtime-worker.ts +337 -146
  45. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-shared.ts +26 -12
  46. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres-rate-state.ts +3 -1
  47. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres.ts +425 -102
  48. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/run-ledger-dispatch-authority.ts +4 -0
  49. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/run-ledger-outbox-recovery.ts +4 -0
  50. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-event-search.ts +9 -0
  51. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-sandbox-capacity.ts +181 -124
  52. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-worker-wake.ts +152 -0
  53. package/dist/bundling-sources/shared_libs/play-runtime/test-runtime-seams.ts +5 -3
  54. package/dist/bundling-sources/shared_libs/play-runtime/tool-cache-policy.ts +31 -0
  55. package/dist/bundling-sources/shared_libs/play-runtime/transient-service-error.ts +10 -0
  56. package/dist/bundling-sources/shared_libs/plays/ambiguous-write-error.ts +25 -0
  57. package/dist/bundling-sources/shared_libs/plays/artifact-types.ts +4 -0
  58. package/dist/bundling-sources/shared_libs/plays/authoring-contract.ts +63 -68
  59. package/dist/bundling-sources/shared_libs/plays/bundling/index.ts +129 -63
  60. package/dist/bundling-sources/shared_libs/plays/contracts.ts +14 -0
  61. package/dist/bundling-sources/shared_libs/plays/enrich-play-compiler.ts +58 -16
  62. package/dist/bundling-sources/shared_libs/plays/fetch-http-error.ts +50 -0
  63. package/dist/bundling-sources/shared_libs/plays/source-authoring-edition.ts +351 -0
  64. package/dist/bundling-sources/shared_libs/plays/tool-list-getter-mode.ts +9 -0
  65. package/dist/bundling-sources/shared_libs/plays/tool-result-types.ts +1 -1
  66. package/dist/cli/{auth-5HIIACF7.mjs → auth-LLXLIILR.mjs} +6 -6
  67. package/dist/cli/auth-UG4WOYGL.js +40 -0
  68. package/dist/cli/{billing-EVZ3ZWKC.mjs → billing-5FVXZYAC.mjs} +8 -8
  69. package/dist/cli/{billing-4275N7FL.js → billing-NFPK7GYP.js} +84 -84
  70. package/dist/cli/{chunk-ZAAKSJAS.js → chunk-27GJKC5Q.js} +17 -10
  71. package/dist/cli/{chunk-UHNDVD3P.js → chunk-2H4EY7KH.js} +100 -41
  72. package/dist/cli/{chunk-TQNHMWUR.mjs → chunk-2YR7BIIC.mjs} +5 -2
  73. package/dist/cli/{chunk-AU4OFDFX.js → chunk-36AHOWVS.js} +26 -26
  74. package/dist/cli/{chunk-OSDXE27V.mjs → chunk-4PG4ARL2.mjs} +17 -10
  75. package/dist/cli/{chunk-PBZYY7VZ.mjs → chunk-4XQLVUC7.mjs} +734 -511
  76. package/dist/cli/chunk-5TUGWDEB.js +313 -0
  77. package/dist/cli/{chunk-DEC3JECC.js → chunk-5UUQAGJS.js} +5 -2
  78. package/dist/cli/{chunk-JRAVVJ3T.mjs → chunk-5V5Y37BC.mjs} +2 -2
  79. package/dist/cli/{chunk-PMVFAYL7.mjs → chunk-63ILLN5H.mjs} +2 -2
  80. package/dist/cli/{chunk-V76R6HMV.js → chunk-63S7X326.js} +1029 -806
  81. package/dist/cli/{chunk-VWBTTJYQ.mjs → chunk-6PGATQ6L.mjs} +6 -3
  82. package/dist/cli/{chunk-6BJK4EJ3.mjs → chunk-AARWVK4C.mjs} +2132 -65
  83. package/dist/cli/{chunk-FERRDNMO.js → chunk-AD47BXN2.js} +5 -5
  84. package/dist/cli/{chunk-GAICVLKL.js → chunk-D37FEBES.js} +2 -2
  85. package/dist/cli/{chunk-S6R3OX7B.js → chunk-E4CABWXL.js} +25 -2
  86. package/dist/cli/{chunk-NXGCO4JB.mjs → chunk-E4IXDAZI.mjs} +5 -0
  87. package/dist/cli/chunk-EQ4Z7RJW.mjs +35 -0
  88. package/dist/cli/chunk-FR2ILQ4G.mjs +8 -0
  89. package/dist/cli/{chunk-FJCIUF34.js → chunk-FVLNYDI4.js} +128 -376
  90. package/dist/cli/{chunk-O3VSXP2F.js → chunk-FZJAM576.js} +50 -50
  91. package/dist/cli/{chunk-BZAMOCPA.mjs → chunk-IMZ56EOH.mjs} +3 -3
  92. package/dist/cli/{chunk-N44JHMKY.mjs → chunk-IPG42SD2.mjs} +452 -138
  93. package/dist/cli/chunk-J33TSWO5.js +8 -0
  94. package/dist/cli/{chunk-BEVLCKXG.mjs → chunk-JNXJZ577.mjs} +1 -1
  95. package/dist/cli/{chunk-JI2B4RZP.mjs → chunk-KCC3FKIW.mjs} +71 -12
  96. package/dist/cli/{chunk-6IKARAYD.mjs → chunk-L2VKAASU.mjs} +23 -0
  97. package/dist/cli/{chunk-WLOCMJWV.js → chunk-LTFL4JRN.js} +426 -721
  98. package/dist/cli/{chunk-YHPYUZZX.mjs → chunk-MAMVGOSC.mjs} +1 -1
  99. package/dist/cli/{chunk-NZSF57UO.mjs → chunk-MN2OWLFA.mjs} +2 -2
  100. package/dist/cli/{chunk-YD7B53RW.js → chunk-NF4V5DTY.js} +12 -12
  101. package/dist/cli/{chunk-Q2E4E4FJ.js → chunk-NPBJI7RE.js} +8 -8
  102. package/dist/cli/chunk-NTVLGHFM.js +501 -0
  103. package/dist/cli/{chunk-HQXL5526.mjs → chunk-NUX2QHNC.mjs} +1 -1
  104. package/dist/cli/{chunk-JGHG4NBA.js → chunk-OBB4QXHA.js} +19 -4
  105. package/dist/cli/{chunk-SEFMGO3Z.js → chunk-OQQOXSYA.js} +2184 -117
  106. package/dist/cli/chunk-OZ6E3IRZ.js +6084 -0
  107. package/dist/cli/{chunk-7P5AA3SN.js → chunk-PPDBRJRW.js} +6 -1
  108. package/dist/cli/{chunk-FHPCKULR.mjs → chunk-PZSLPBDA.mjs} +2 -2
  109. package/dist/cli/{chunk-ILHRA7AD.js → chunk-QADCFSGH.js} +7 -7
  110. package/dist/cli/{chunk-RTCDW2GU.js → chunk-QJI5FIOW.js} +170 -49
  111. package/dist/cli/{chunk-WYQO2CBS.mjs → chunk-QL22Y56M.mjs} +149 -28
  112. package/dist/cli/{chunk-2PRO2JTX.mjs → chunk-RFB25DSQ.mjs} +36 -284
  113. package/dist/cli/chunk-T44IIOT6.mjs +501 -0
  114. package/dist/cli/chunk-VK2LZ5IP.js +35 -0
  115. package/dist/cli/chunk-VKKVSFRD.js +62 -0
  116. package/dist/cli/{chunk-2GI3QD3L.js → chunk-VYKV5XHL.js} +644 -330
  117. package/dist/cli/{chunk-GSK6NHVM.js → chunk-WU4U6VSB.js} +5 -5
  118. package/dist/cli/chunk-XHLKJOTN.mjs +313 -0
  119. package/dist/cli/{chunk-IT3XBJQR.mjs → chunk-XIHWSXSV.mjs} +330 -625
  120. package/dist/cli/chunk-XNZJKRJA.mjs +6084 -0
  121. package/dist/cli/chunk-ZCALLYF6.mjs +62 -0
  122. package/dist/cli/{chunk-WHG43Z67.js → chunk-ZFZ427HN.js} +11 -8
  123. package/dist/cli/{chunk-J6DCKJNM.mjs → chunk-ZKYEW55U.mjs} +16 -1
  124. package/dist/cli/{csv-BBOTCGQY.js → csv-7U3FJYKZ.js} +14 -14
  125. package/dist/cli/{csv-A2MP6EFV.mjs → csv-ZWLDMM4A.mjs} +5 -5
  126. package/dist/cli/{db-G4CODDCA.js → db-DNCGV5PC.js} +42 -47
  127. package/dist/cli/{db-3W5DMTUX.mjs → db-IMYXVMGI.mjs} +15 -20
  128. package/dist/cli/{describe-XYJ2ZT4M.mjs → describe-Q23DWJUK.mjs} +20 -15
  129. package/dist/cli/{describe-PQTQ5B6F.js → describe-S34JUX5W.js} +27 -22
  130. package/dist/cli/describe-core.d.mts +2 -2
  131. package/dist/cli/describe-core.d.ts +2 -2
  132. package/dist/cli/describe-core.js +6 -6
  133. package/dist/cli/describe-core.mjs +5 -5
  134. package/dist/cli/{executions-UR67CA5H.mjs → executions-A73EUGSI.mjs} +8 -8
  135. package/dist/cli/{executions-TLANVR7Y.js → executions-XOMPX2YJ.js} +10 -10
  136. package/dist/cli/{feedback-WHCMGEIL.mjs → feedback-N4GJ2POI.mjs} +11 -7
  137. package/dist/cli/{feedback-6C2YTRJL.js → feedback-QTCHNJJH.js} +13 -9
  138. package/dist/cli/{git-GWLB6VSA.mjs → git-4Q3JIQYZ.mjs} +6 -6
  139. package/dist/cli/git-I6CPBEVG.js +24 -0
  140. package/dist/cli/index.js +236 -348
  141. package/dist/cli/index.mjs +162 -274
  142. package/dist/cli/{legacy-noops-KF4XIFEF.mjs → legacy-noops-3SOVGFF7.mjs} +6 -6
  143. package/dist/cli/{legacy-noops-ZUFA7RWI.js → legacy-noops-4OSHZM34.js} +9 -9
  144. package/dist/cli/{monitors-TB3K2IVE.js → monitors-LVE2KZNG.js} +94 -94
  145. package/dist/cli/{monitors-6UOIDIMB.mjs → monitors-QP2XID2B.mjs} +8 -8
  146. package/dist/cli/{org-WGHHMVDZ.mjs → org-IVRETVQA.mjs} +8 -8
  147. package/dist/cli/{org-CKWMBPIR.js → org-XFLK5IAP.js} +68 -68
  148. package/dist/cli/{play-LYPAXCLD.mjs → play-DE7VH6NU.mjs} +533 -98
  149. package/dist/cli/{play-N2B3KAVS.js → play-XXTPPP23.js} +1067 -632
  150. package/dist/cli/{providers-UR42MD6Z.js → providers-DLD3I4JF.js} +11 -11
  151. package/dist/cli/{providers-6DI5BVZJ.mjs → providers-GX2NIZQQ.mjs} +8 -8
  152. package/dist/cli/{quickstart-MNA2S6PO.mjs → quickstart-72B4L4PK.mjs} +5 -5
  153. package/dist/cli/{quickstart-FCJG4XGB.js → quickstart-XNS3HSWC.js} +7 -7
  154. package/dist/cli/search-6NCH4HB5.js +30 -0
  155. package/dist/cli/{search-VPPYUJ2M.mjs → search-SUTRANJI.mjs} +9 -9
  156. package/dist/cli/{secrets-QOSMVO36.js → secrets-6OBLOVEV.js} +17 -17
  157. package/dist/cli/{secrets-DRI4W7Z5.mjs → secrets-FPFXXNUH.mjs} +8 -8
  158. package/dist/cli/sessions-235532DR.js +16 -0
  159. package/dist/cli/{sessions-DQNUKP43.mjs → sessions-R25I4QKN.mjs} +6 -6
  160. package/dist/cli/{settings-DWDK3Y2R.mjs → settings-AOP6F5PZ.mjs} +12 -12
  161. package/dist/cli/{settings-JUGGCOPS.js → settings-VL5FOFPN.js} +79 -79
  162. package/dist/cli/{setup-AWBHNYXK.js → setup-BSC67YT3.js} +45 -44
  163. package/dist/cli/{setup-D5DWVNY4.mjs → setup-ZMPHBHVJ.mjs} +11 -10
  164. package/dist/cli/skills-3IWLYYRL.js +29 -0
  165. package/dist/cli/{skills-YV2XR35J.mjs → skills-KF65TVFO.mjs} +7 -7
  166. package/dist/cli/tools-LR66SPYU.js +44 -0
  167. package/dist/cli/{tools-VFJYHNV2.mjs → tools-SX4XIPM7.mjs} +19 -14
  168. package/dist/cli/{update-IM6VOTGL.mjs → update-QRMFRAQQ.mjs} +11 -9
  169. package/dist/cli/update-SP7UEO53.js +31 -0
  170. package/dist/cli/{workflow-26URBWPV.mjs → workflow-FOEEEB7G.mjs} +44 -20
  171. package/dist/cli/{workflow-3BS6U6SL.js → workflow-KOCK2FLW.js} +54 -30
  172. package/dist/{client-BfInrZPB.d.mts → client-74k4IPh6.d.mts} +135 -54
  173. package/dist/{client-BMjJFpan.d.ts → client-C1IK1f8c.d.ts} +135 -54
  174. package/dist/{compiler-manifest-Ycx-hoAr.d.mts → compiler-manifest-lzWpbV3w.d.mts} +83 -66
  175. package/dist/{compiler-manifest-Ycx-hoAr.d.ts → compiler-manifest-lzWpbV3w.d.ts} +83 -66
  176. package/dist/{index-CZXgiN3E.d.mts → index-C8Cy-YTm.d.ts} +5 -1
  177. package/dist/{index-NPG5pqxQ.d.ts → index-CtNK-0nI.d.mts} +5 -1
  178. package/dist/index.d.mts +47 -9
  179. package/dist/index.d.ts +47 -9
  180. package/dist/index.js +17 -14
  181. package/dist/index.mjs +13 -10
  182. package/dist/install-integrity.json +118 -102
  183. package/dist/plays/bundle-play-file.d.mts +3 -3
  184. package/dist/plays/bundle-play-file.d.ts +3 -3
  185. package/dist/plays/bundle-play-file.mjs +5 -4
  186. package/dist/plays/csv-data-input.js +3 -3
  187. package/dist/plays/csv-data-input.mjs +2 -2
  188. package/dist/plays/play-description.d.mts +2 -2
  189. package/dist/plays/play-description.d.ts +2 -2
  190. package/dist/plays/run-request.d.mts +2 -2
  191. package/dist/plays/run-request.d.ts +2 -2
  192. package/dist/plays/run-request.js +11 -3
  193. package/dist/plays/run-request.mjs +10 -2
  194. package/dist/release.d.mts +15 -6
  195. package/dist/release.d.ts +15 -6
  196. package/dist/release.js +2 -2
  197. package/dist/release.mjs +1 -1
  198. package/package.json +2 -2
  199. package/dist/cli/auth-F6BX32XZ.js +0 -40
  200. package/dist/cli/chunk-264PC2RN.mjs +0 -83
  201. package/dist/cli/chunk-44ZTYHMQ.mjs +0 -155
  202. package/dist/cli/chunk-53HN7WZN.js +0 -392
  203. package/dist/cli/chunk-7AALNGTA.mjs +0 -392
  204. package/dist/cli/chunk-ALD4COBH.js +0 -155
  205. package/dist/cli/chunk-CLJGSOVM.mjs +0 -1716
  206. package/dist/cli/chunk-WNUR6VP5.js +0 -83
  207. package/dist/cli/chunk-Z4VNJOF7.js +0 -1716
  208. package/dist/cli/git-VQFF6D7C.js +0 -24
  209. package/dist/cli/search-NCEEONMQ.js +0 -30
  210. package/dist/cli/sessions-3WYKQABW.js +0 -16
  211. package/dist/cli/skills-AKPAJVSO.js +0 -29
  212. package/dist/cli/tools-RBKEK6PM.js +0 -39
  213. package/dist/cli/update-VFNUBLDA.js +0 -29
@@ -3,7 +3,7 @@
3
3
 
4
4
 
5
5
 
6
- var _chunkS6R3OX7Bjs = require('./chunk-S6R3OX7B.js');
6
+ var _chunkE4CABWXLjs = require('./chunk-E4CABWXL.js');
7
7
 
8
8
 
9
9
 
@@ -13,7 +13,9 @@ var _chunkS6R3OX7Bjs = require('./chunk-S6R3OX7B.js');
13
13
 
14
14
 
15
15
 
16
- var _chunkUHNDVD3Pjs = require('./chunk-UHNDVD3P.js');
16
+
17
+
18
+ var _chunk2H4EY7KHjs = require('./chunk-2H4EY7KH.js');
17
19
 
18
20
 
19
21
 
@@ -24,16 +26,18 @@ var _chunkKXMNM4AQjs = require('./chunk-KXMNM4AQ.js');
24
26
 
25
27
 
26
28
 
27
- var _chunkFJCIUF34js = require('./chunk-FJCIUF34.js');
28
29
 
29
30
 
30
- var _chunkQ2E4E4FJjs = require('./chunk-Q2E4E4FJ.js');
31
+ var _chunkFVLNYDI4js = require('./chunk-FVLNYDI4.js');
32
+
33
+
34
+ var _chunkNPBJI7REjs = require('./chunk-NPBJI7RE.js');
31
35
 
32
36
 
33
37
 
34
38
 
35
39
 
36
- var _chunk7P5AA3SNjs = require('./chunk-7P5AA3SN.js');
40
+ var _chunkPPDBRJRWjs = require('./chunk-PPDBRJRW.js');
37
41
 
38
42
  // src/pagination.ts
39
43
  async function* iterateCursorPages(fetchPage) {
@@ -67,7 +71,7 @@ function requireBillingIdempotencyKey(value) {
67
71
  }
68
72
  }
69
73
  if (!valid) {
70
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
74
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
71
75
  "Billing idempotencyKey must contain 1\u2013200 characters with no leading or trailing whitespace and be valid HTTP header text.",
72
76
  void 0,
73
77
  "INVALID_BILLING_IDEMPOTENCY_KEY"
@@ -77,25 +81,25 @@ function requireBillingIdempotencyKey(value) {
77
81
  }
78
82
 
79
83
  // src/db/query.ts
80
- function planCustomerDbQuery(input) {
84
+ function planCustomerDbQuery(input, maxRetries = 3) {
81
85
  if (typeof input.sql !== "string" || !input.sql.trim())
82
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)("sql must not be empty.", 400, "INVALID_SQL");
86
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)("sql must not be empty.", 400, "INVALID_SQL");
83
87
  if (input.operationKey !== void 0 && typeof input.operationKey !== "string")
84
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
88
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
85
89
  "operationKey must be a string containing 1\u2013512 characters.",
86
90
  400,
87
91
  "INVALID_OPERATION_KEY"
88
92
  );
89
93
  const operationKey = input.operationKey;
90
94
  if (operationKey !== void 0 && (!operationKey.trim() || operationKey.length > 512)) {
91
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
95
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
92
96
  "operationKey must contain 1\u2013512 characters.",
93
97
  400,
94
98
  "INVALID_OPERATION_KEY"
95
99
  );
96
100
  }
97
101
  if (input.maxRows !== void 0 && (!Number.isSafeInteger(input.maxRows) || input.maxRows < 1 || input.maxRows > 1e3)) {
98
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
102
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
99
103
  "maxRows must be a whole number from 1 to 1000.",
100
104
  400,
101
105
  "INVALID_MAX_ROWS"
@@ -118,13 +122,13 @@ function planCustomerDbQuery(input) {
118
122
  recovery: operationKey === void 0 ? "unkeyed_unknown_outcome" : "original_operation_key"
119
123
  },
120
124
  transport: {
121
- maxRetries: 0,
122
- urlFailover: "disabled"
125
+ maxRetries: operationKey === void 0 ? 0 : maxRetries,
126
+ urlFailover: operationKey === void 0 ? "disabled" : "loopback_only"
123
127
  }
124
128
  };
125
129
  }
126
- async function queryCustomerDatabase(http, input) {
127
- const plan = planCustomerDbQuery(input);
130
+ async function queryCustomerDatabase(http, input, maxRetries) {
131
+ const plan = planCustomerDbQuery(input, maxRetries);
128
132
  let result;
129
133
  try {
130
134
  result = await http.post(
@@ -137,10 +141,10 @@ async function queryCustomerDatabase(http, input) {
137
141
  }
138
142
  );
139
143
  } catch (error) {
140
- if (error instanceof _chunk7P5AA3SNjs.DeeplineError && (_optionalChain([error, 'access', _ => _.code, 'optionalAccess', _2 => _2.startsWith, 'call', _3 => _3("NETWORK_")]) || // Older API readers return PostgreSQL errors as HTTP 400, including
144
+ if (error instanceof _chunkPPDBRJRWjs.DeeplineError && (_optionalChain([error, 'access', _ => _.code, 'optionalAccess', _2 => _2.startsWith, 'call', _3 => _3("NETWORK_")]) || // Older API readers return PostgreSQL errors as HTTP 400, including
141
145
  // lost connections and explicitly unknown transaction resolution.
142
146
  /^08[A-Z0-9]{3}$/.test(_nullishCoalesce(error.code, () => ( ""))) || ["57P01", "57P02", "57P03"].includes(_nullishCoalesce(error.code, () => ( ""))) || error.statusCode === 408 || (_nullishCoalesce(error.statusCode, () => ( 0))) >= 500)) {
143
- throw new (0, _chunkQ2E4E4FJjs.CustomerDbQueryOutcomeUnknownError)(
147
+ throw new (0, _chunkNPBJI7REjs.CustomerDbQueryOutcomeUnknownError)(
144
148
  error,
145
149
  plan.request.body.operation_key
146
150
  );
@@ -148,8 +152,8 @@ async function queryCustomerDatabase(http, input) {
148
152
  throw error;
149
153
  }
150
154
  if (!result || typeof result !== "object" || Array.isArray(result) || typeof result.command !== "string" || !Array.isArray(result.columns) || !Array.isArray(result.rows) || typeof result.truncated !== "boolean" || result.row_count !== null && (!Number.isSafeInteger(result.row_count) || result.row_count < 0) || !Number.isSafeInteger(result.row_count_returned) || result.row_count_returned < 0) {
151
- throw new (0, _chunkQ2E4E4FJjs.CustomerDbQueryOutcomeUnknownError)(
152
- new (0, _chunk7P5AA3SNjs.DeeplineError)(
155
+ throw new (0, _chunkNPBJI7REjs.CustomerDbQueryOutcomeUnknownError)(
156
+ new (0, _chunkPPDBRJRWjs.DeeplineError)(
153
157
  "The SQL response did not contain a valid result.",
154
158
  200,
155
159
  "CUSTOMER_DB_QUERY_RESPONSE_INVALID"
@@ -159,8 +163,8 @@ async function queryCustomerDatabase(http, input) {
159
163
  }
160
164
  const operation = result.operation;
161
165
  if (input.operationKey !== void 0 && (!operation || operation.operation_key !== input.operationKey || !Number.isSafeInteger(operation.completed_at_ms) || operation.completed_at_ms < 0 || !["executed", "operation_recovery"].includes(operation.source))) {
162
- throw new (0, _chunkQ2E4E4FJjs.CustomerDbQueryOutcomeUnknownError)(
163
- new (0, _chunk7P5AA3SNjs.DeeplineError)(
166
+ throw new (0, _chunkNPBJI7REjs.CustomerDbQueryOutcomeUnknownError)(
167
+ new (0, _chunkPPDBRJRWjs.DeeplineError)(
164
168
  "The server did not confirm the original atomic SQL operation.",
165
169
  200,
166
170
  "CUSTOMER_DB_OPERATION_ACK_INVALID"
@@ -189,6 +193,156 @@ function resolveLookupClientTimeoutMs(toolId) {
189
193
  return lookupClientTimeouts.get(toolId.trim().toLowerCase());
190
194
  }
191
195
 
196
+ // ../play-runtime/execute-server-timing.ts
197
+ var EXECUTE_SERVER_TIMING_STAGES = [
198
+ "auth",
199
+ "rate_limit",
200
+ "catalog",
201
+ // Local preparation accumulates compilation/hooks/pricing inside catalog
202
+ // and executor loading before the final provider permit. Do not add it to
203
+ // catalog or total. Credential selection excludes charge admission.
204
+ "credential_plan",
205
+ "provider_prepare",
206
+ "charge_open",
207
+ // Charge admission substages. `charge_open` keeps its original meaning — the
208
+ // TOTAL of all charge-admission work — so an existing reader is unchanged and
209
+ // these four explain work inside it. The authorization action adapter splits
210
+ // its wall into snapshot, remaining action time and application retry gaps.
211
+ // Absent stages are unobserved, not confident zero durations.
212
+ // - `charge_eligibility` canonical wallet and cap authorization snapshot
213
+ // - `charge_cap_preflight` legacy standalone cap work (zero in current path)
214
+ // - `charge_open_mutation` remaining action wall, including transport and
215
+ // failed attempts; legacy name, not mutation CPU
216
+ // - `charge_retry_wait` elapsed gaps before application RPC retries;
217
+ // native Convex logs attribute internal OCC retries
218
+ "charge_eligibility",
219
+ "charge_cap_preflight",
220
+ "charge_open_mutation",
221
+ "charge_retry_wait",
222
+ // Billing completion slices explain the full stage, including transport.
223
+ // Handoff headers/body are nested within billing_handoff, not additive.
224
+ "billing_settle",
225
+ "billing_price",
226
+ "billing_precision",
227
+ "billing_caps",
228
+ "billing_catalog",
229
+ "billing_witness",
230
+ "billing_handoff",
231
+ "billing_handoff_rpc",
232
+ "billing_handoff_headers",
233
+ "billing_handoff_after_headers",
234
+ // Process-wide activity over the RPC interval, including concurrent work.
235
+ // These overlap the wall clocks above; they are not request-attributed CPU.
236
+ "billing_handoff_process_cpu",
237
+ "billing_handoff_event_loop_active",
238
+ "billing_handoff_event_loop_idle",
239
+ "fixture_load",
240
+ "execute",
241
+ "identity",
242
+ "usage_schedule",
243
+ // Managed AI inference slices: `ai_prepare` includes request preparation and
244
+ // contains `ai_billing_authorize`; `ai_provider_work_start` is the durable
245
+ // pre-call transition; `ai_gateway_first_output` is the time to the first
246
+ // model-output part (excluding SDK control chunks); and
247
+ // `ai_gateway_stream_wall` is the end-to-end SDK stream
248
+ // collection wall. Stream wall includes awaited finish callbacks, so evidence
249
+ // persistence and settlement overlap it. First-output and stream wall both
250
+ // include Gateway/network/upstream time; neither claims provider-internal
251
+ // model time.
252
+ "ai_prepare",
253
+ "ai_billing_authorize",
254
+ "ai_provider_work_start",
255
+ "ai_gateway_first_output",
256
+ "ai_gateway_stream_wall",
257
+ "ai_generation_evidence_persist",
258
+ "ai_billing_settlement",
259
+ "ai_output_canonicalization",
260
+ "ai_result_persist",
261
+ // Provider HTTP slices are only nonzero for calls that take this path:
262
+ // admission; `provider_fetch_headers` until response headers arrive (or
263
+ // `provider_fetch_error_wait` for a rejected fetch); retry backoff; body
264
+ // read, JSON parse, result transform and output normalization are separate.
265
+ "provider_admission",
266
+ "provider_fetch_headers",
267
+ "provider_fetch_error_wait",
268
+ "provider_retry_wait",
269
+ "provider_body_read",
270
+ "provider_json_parse",
271
+ "provider_result_transform",
272
+ "provider_output_normalization",
273
+ "total",
274
+ // The execution gateway preserves these disjoint stages beside the app
275
+ // handler's stages. They are deliberately part of this small, additive
276
+ // response diagnostic contract: a long sandbox-to-headers wall is otherwise
277
+ // incorrectly reduced to "network" after the app handler reports quickly.
278
+ "auth_launch",
279
+ "auth_verify",
280
+ "body_parse",
281
+ "dispatch_pool",
282
+ "dispatch_callback",
283
+ // The execution relay measures its own upstream fetch. `upstream_headers`
284
+ // contains the app handler's `total`; subtracting those two clocks leaves
285
+ // only the Vercel/platform-or-transit boundary, never a made-up provider
286
+ // latency. `upstream_body` follows headers while the relay buffers the
287
+ // bounded response before it returns to the runner.
288
+ "upstream_headers",
289
+ "upstream_body"
290
+ ];
291
+ var PUBLIC_EXECUTE_SERVER_TIMING_STAGES = [
292
+ // Route total includes lazy execution-module loading. The handler's
293
+ // public_total keeps its existing meaning so older readers remain valid.
294
+ "public_load",
295
+ "public_route",
296
+ // Core and recovery initialization overlap authentication. Their wall is
297
+ // included in public_total; these stages are not additive.
298
+ "public_core_load",
299
+ "public_recovery_load",
300
+ "public_auth",
301
+ "public_claim",
302
+ "public_claim_headers",
303
+ "public_claim_after_headers",
304
+ "public_core",
305
+ "public_prepare",
306
+ "public_r2",
307
+ "public_complete",
308
+ "public_complete_headers",
309
+ "public_complete_after_headers",
310
+ "public_total"
311
+ ];
312
+ var ALL_EXECUTE_SERVER_TIMING_STAGES = /* @__PURE__ */ (() => [
313
+ ...EXECUTE_SERVER_TIMING_STAGES,
314
+ ...PUBLIC_EXECUTE_SERVER_TIMING_STAGES
315
+ ])();
316
+ function parseExecuteServerTiming(header) {
317
+ if (typeof header !== "string" || !header.trim()) return null;
318
+ const durations = /* @__PURE__ */ new Map();
319
+ for (const rawEntry of header.split(",")) {
320
+ const parts = rawEntry.split(";");
321
+ const name = _optionalChain([parts, 'access', _4 => _4[0], 'optionalAccess', _5 => _5.trim, 'call', _6 => _6(), 'access', _7 => _7.toLowerCase, 'call', _8 => _8()]);
322
+ if (!name) continue;
323
+ for (const parameter of parts.slice(1)) {
324
+ const separator = parameter.indexOf("=");
325
+ if (separator < 0) continue;
326
+ const key = parameter.slice(0, separator).trim().toLowerCase();
327
+ if (key !== "dur") continue;
328
+ const value = parameter.slice(separator + 1).trim().replace(/^"|"$/g, "");
329
+ const parsed = value === "" ? Number.NaN : Number(value);
330
+ if (Number.isFinite(parsed) && parsed >= 0) {
331
+ durations.set(name, parsed);
332
+ }
333
+ }
334
+ }
335
+ const timing = Object.fromEntries(
336
+ ALL_EXECUTE_SERVER_TIMING_STAGES.map((stage) => [
337
+ stage,
338
+ _nullishCoalesce(durations.get(stage), () => ( null))
339
+ ])
340
+ );
341
+ return ALL_EXECUTE_SERVER_TIMING_STAGES.some(
342
+ (stage) => timing[stage] !== null
343
+ ) ? timing : null;
344
+ }
345
+
192
346
  // ../integration-contracts/theirstack/execution-policy.ts
193
347
  var THEIRSTACK_SLOW_JOB_SEARCH_PROVIDER_TIMEOUT_MS = 135e3;
194
348
  var THEIRSTACK_SLOW_JOB_SEARCH_CLIENT_TIMEOUT_MS = 6e4 + THEIRSTACK_SLOW_JOB_SEARCH_PROVIDER_TIMEOUT_MS + 15e3;
@@ -267,7 +421,7 @@ function usesExtendedBetterContactLauncherBudget(toolId) {
267
421
  var CLI_INVOCATION_ID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
268
422
  function validateCliInvocationId(value) {
269
423
  if (!CLI_INVOCATION_ID_PATTERN.test(value)) {
270
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
424
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
271
425
  "CLI invocation IDs must be UUID v4 values.",
272
426
  void 0,
273
427
  "CLI_INVOCATION_ID_INVALID"
@@ -279,11 +433,11 @@ function validateCliInvocationId(value) {
279
433
  var INCLUDE_TOOL_METADATA_HEADER = "x-deepline-include-tool-metadata";
280
434
  var EXECUTE_RESPONSE_CONTRACT_HEADER = "x-deepline-execute-response-contract";
281
435
  var EXECUTE_RESPONSE_INTENT_HEADER = "x-deepline-execute-response-intent";
282
- var RAW_V2_EXECUTE_RESPONSE_CONTRACT = _chunkS6R3OX7Bjs.RAW_V2_TOOL_RESPONSE_CONTRACT;
436
+ var RAW_V2_EXECUTE_RESPONSE_CONTRACT = _chunkE4CABWXLjs.RAW_V2_TOOL_RESPONSE_CONTRACT;
283
437
  var DEFAULT_EXECUTION_RECOVERY_TIMEOUT_MS = 15 * 60 * 1e3;
284
438
  function validateExecutionIdempotencyKey(key) {
285
439
  if (typeof key !== "string" || key.length < 1 || key.length > 200 || !/^[A-Za-z0-9._:-]+$/.test(key)) {
286
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
440
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
287
441
  "Execution idempotency keys must be 1\u2013200 ASCII letters, digits, dots, underscores, colons, or hyphens.",
288
442
  void 0,
289
443
  "IDEMPOTENCY_KEY_INVALID"
@@ -296,20 +450,20 @@ function getExecutionRecoveryState(value) {
296
450
  return state === "running" || state === "completed" || state === "outcome_unknown" ? state : null;
297
451
  }
298
452
  function isRecoverableExecutionAttemptError(error) {
299
- if (error instanceof _chunk7P5AA3SNjs.ToolExecutionError) {
453
+ if (error instanceof _chunkPPDBRJRWjs.ToolExecutionError) {
300
454
  return error.code === "EXECUTION_IN_PROGRESS" || error.origin === "deepline" && error.category === "network" && error.networkScope === "client_to_deepline";
301
455
  }
302
- return error instanceof _chunk7P5AA3SNjs.DeeplineError && (error.code === "EXECUTION_IN_PROGRESS" || _optionalChain([error, 'access', _4 => _4.code, 'optionalAccess', _5 => _5.startsWith, 'call', _6 => _6("NETWORK_")]) === true && error.statusCode === void 0);
456
+ return error instanceof _chunkPPDBRJRWjs.DeeplineError && (error.code === "EXECUTION_IN_PROGRESS" || _optionalChain([error, 'access', _9 => _9.code, 'optionalAccess', _10 => _10.startsWith, 'call', _11 => _11("NETWORK_")]) === true && error.statusCode === void 0);
303
457
  }
304
458
  function isRecoverableExecutionLookupError(error) {
305
459
  if (isRecoverableExecutionAttemptError(error)) return true;
306
- return error instanceof _chunk7P5AA3SNjs.DeeplineError && (error.statusCode === 429 || error.statusCode !== void 0 && error.statusCode >= 500);
460
+ return error instanceof _chunkPPDBRJRWjs.DeeplineError && (error.statusCode === 429 || error.statusCode !== void 0 && error.statusCode >= 500);
307
461
  }
308
462
  function timeoutWithinRecoveryBudget(requestTimeoutMs, defaultRequestTimeoutMs, remainingMs) {
309
463
  return Math.min(_nullishCoalesce(requestTimeoutMs, () => ( defaultRequestTimeoutMs)), remainingMs);
310
464
  }
311
465
  function executionRecoveryError(input) {
312
- return new (0, _chunk7P5AA3SNjs.ToolExecutionError)(input.message, {
466
+ return new (0, _chunkPPDBRJRWjs.ToolExecutionError)(input.message, {
313
467
  toolId: input.toolId,
314
468
  provider: null,
315
469
  operation: input.toolId,
@@ -377,7 +531,7 @@ function materializeToolExecutionResponse(response) {
377
531
  }
378
532
  const rawV2 = toolResponse.rawV2;
379
533
  const view = toolResponse.view;
380
- const providerMeta = _chunkS6R3OX7Bjs.providerMetaFromToolResponseRawV2.call(void 0,
534
+ const providerMeta = _chunkE4CABWXLjs.providerMetaFromToolResponseRawV2.call(void 0,
381
535
  rawV2,
382
536
  _nullishCoalesce(view, () => ( "rawV2"))
383
537
  );
@@ -386,7 +540,7 @@ function materializeToolExecutionResponse(response) {
386
540
  ...response,
387
541
  toolResponse: {
388
542
  ...toolResponse,
389
- raw: _chunkS6R3OX7Bjs.legacyRawFromToolResponseRawV2.call(void 0,
543
+ raw: _chunkE4CABWXLjs.legacyRawFromToolResponseRawV2.call(void 0,
390
544
  rawV2,
391
545
  _nullishCoalesce(view, () => ( "rawV2")),
392
546
  responseMeta
@@ -408,54 +562,47 @@ var ToolCalls = class {
408
562
  this.configuredRequestTimeoutMs = configuredRequestTimeoutMs;
409
563
  }
410
564
  async call(toolId, input, options) {
411
- if (_optionalChain([options, 'optionalAccess', _7 => _7.cliInvocationId]) !== void 0) {
565
+ if (_optionalChain([options, 'optionalAccess', _12 => _12.cliInvocationId]) !== void 0) {
412
566
  validateCliInvocationId(options.cliInvocationId);
413
567
  }
414
568
  const inputSnapshot = JSON.parse(JSON.stringify(input));
415
- const metadataSnapshot = _optionalChain([options, 'optionalAccess', _8 => _8.metadata]) ? JSON.parse(JSON.stringify(options.metadata)) : void 0;
416
- const idempotencyKey = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _9 => _9.idempotencyKey]), () => ( (_optionalChain([options, 'optionalAccess', _10 => _10.recover]) ? crypto.randomUUID() : void 0)));
569
+ const metadataSnapshot = _optionalChain([options, 'optionalAccess', _13 => _13.metadata]) ? JSON.parse(JSON.stringify(options.metadata)) : void 0;
570
+ const idempotencyKey = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _14 => _14.idempotencyKey]), () => ( (_optionalChain([options, 'optionalAccess', _15 => _15.recover]) ? crypto.randomUUID() : void 0)));
417
571
  if (idempotencyKey !== void 0) {
418
572
  validateExecutionIdempotencyKey(idempotencyKey);
419
- if (_optionalChain([options, 'optionalAccess', _11 => _11.recoveryTimeoutMs]) !== void 0 && (!Number.isFinite(options.recoveryTimeoutMs) || options.recoveryTimeoutMs < 0)) {
420
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
573
+ if (_optionalChain([options, 'optionalAccess', _16 => _16.recoveryTimeoutMs]) !== void 0 && (!Number.isFinite(options.recoveryTimeoutMs) || options.recoveryTimeoutMs < 0)) {
574
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
421
575
  "recoveryTimeoutMs must be a finite, non-negative number.",
422
576
  void 0,
423
577
  "IDEMPOTENCY_KEY_INVALID"
424
578
  );
425
579
  }
426
- await _optionalChain([options, 'optionalAccess', _12 => _12.onExecution, 'optionalCall', _13 => _13({ idempotencyKey })]);
580
+ await _optionalChain([options, 'optionalAccess', _17 => _17.onExecution, 'optionalCall', _18 => _18({ idempotencyKey })]);
427
581
  }
428
- const timeoutMs = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _14 => _14.timeout]), () => ( resolveToolExecuteTimeoutMs(
582
+ const timeoutMs = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _19 => _19.timeout]), () => ( resolveToolExecuteTimeoutMs(
429
583
  toolId,
430
584
  inputSnapshot,
431
585
  this.configuredRequestTimeoutMs
432
586
  )));
433
- if (idempotencyKey !== void 0) {
434
- await this.lookupExecutionByKey(
435
- idempotencyKey,
436
- timeoutMs,
437
- _optionalChain([options, 'optionalAccess', _15 => _15.cliInvocationId])
438
- );
439
- }
440
587
  const isApifySync = toolId.trim().toLowerCase() === "apify_run_actor_sync";
441
588
  const headers = {
442
589
  [EXECUTE_RESPONSE_CONTRACT_HEADER]: RAW_V2_EXECUTE_RESPONSE_CONTRACT,
443
590
  ...isApifySync ? { "X-Deepline-Apify-Sync-Response-Budget": "extended-v1" } : {},
444
- [_chunk7P5AA3SNjs.TOOL_EXECUTION_ERROR_SCHEMA_HEADER]: String(
445
- _chunk7P5AA3SNjs.TOOL_EXECUTION_ERROR_SCHEMA_VERSION
591
+ [_chunkPPDBRJRWjs.TOOL_EXECUTION_ERROR_SCHEMA_HEADER]: String(
592
+ _chunkPPDBRJRWjs.TOOL_EXECUTION_ERROR_SCHEMA_VERSION
446
593
  ),
447
- ..._optionalChain([options, 'optionalAccess', _16 => _16.includeToolMetadata]) ? { [INCLUDE_TOOL_METADATA_HEADER]: "true" } : {},
448
- [EXECUTE_RESPONSE_INTENT_HEADER]: _nullishCoalesce(_optionalChain([options, 'optionalAccess', _17 => _17.responseIntent]), () => ( "raw")),
594
+ ..._optionalChain([options, 'optionalAccess', _20 => _20.includeToolMetadata]) ? { [INCLUDE_TOOL_METADATA_HEADER]: "true" } : {},
595
+ [EXECUTE_RESPONSE_INTENT_HEADER]: _nullishCoalesce(_optionalChain([options, 'optionalAccess', _21 => _21.responseIntent]), () => ( "raw")),
449
596
  ...idempotencyKey ? { "Idempotency-Key": idempotencyKey } : {},
450
- ..._optionalChain([options, 'optionalAccess', _18 => _18.searchRef]) ? { "x-deepline-search-ref": options.searchRef } : {},
451
- ..._optionalChain([options, 'optionalAccess', _19 => _19.cliInvocationId]) !== void 0 ? { "x-deepline-cli-invocation-id": options.cliInvocationId } : {}
597
+ ..._optionalChain([options, 'optionalAccess', _22 => _22.searchRef]) ? { "x-deepline-search-ref": options.searchRef } : {},
598
+ ..._optionalChain([options, 'optionalAccess', _23 => _23.cliInvocationId]) !== void 0 ? { "x-deepline-cli-invocation-id": options.cliInvocationId } : {}
452
599
  };
453
600
  let lastResponse = null;
454
601
  const observeTerminal = (failure) => {
455
602
  if (!lastResponse) return;
456
603
  if (failure) {
457
604
  const { error } = failure;
458
- if (isRecoverableExecutionAttemptError(error) || !(error instanceof _chunk7P5AA3SNjs.DeeplineError) || error.statusCode === void 0 || error.statusCode !== lastResponse.httpStatus || error.code === "EXECUTION_OUTCOME_UNKNOWN")
605
+ if (isRecoverableExecutionAttemptError(error) || !(error instanceof _chunkPPDBRJRWjs.DeeplineError) || error.statusCode === void 0 || error.statusCode !== lastResponse.httpStatus || error.code === "EXECUTION_OUTCOME_UNKNOWN")
459
606
  return;
460
607
  }
461
608
  const body = lastResponse.body;
@@ -463,38 +610,91 @@ var ToolCalls = class {
463
610
  if (recovery === "running" || recovery === "outcome_unknown") return;
464
611
  const state = isRecord(body) ? body.status : null;
465
612
  const terminal = state === "completed" || state === "failed" || state === "cancelled" ? state : state === "canceled" ? "cancelled" : failure ? "failed" : null;
466
- if (terminal)
467
- _optionalChain([options, 'optionalAccess', _20 => _20.onResponseReceived, 'optionalCall', _21 => _21({
613
+ if (!terminal || !_optionalChain([options, 'optionalAccess', _24 => _24.onResponseReceived])) return;
614
+ const reportObservationFailure = () => console.error("[tools.execute] response observation failed");
615
+ try {
616
+ const notification = options.onResponseReceived({
468
617
  receivedAtMs: lastResponse.receivedAtMs,
469
618
  httpStatus: lastResponse.httpStatus,
470
619
  state: terminal
471
- })]);
620
+ });
621
+ void Promise.resolve(notification).catch(reportObservationFailure);
622
+ } catch (e2) {
623
+ reportObservationFailure();
624
+ }
472
625
  };
473
- const request = async (requestTimeoutMs) => {
474
- lastResponse = null;
475
- try {
476
- return await this.http.post(
477
- `/api/v2/integrations/${encodeURIComponent(toolId)}/execute`,
478
- {
479
- payload: inputSnapshot,
480
- ...metadataSnapshot ? { metadata: metadataSnapshot } : {}
481
- },
482
- headers,
483
- {
484
- timeout: requestTimeoutMs,
485
- maxRetries: idempotencyKey ? 0 : _nullishCoalesce(_optionalChain([options, 'optionalAccess', _22 => _22.maxRetries]), () => ( 0)),
486
- retryApiErrors: _optionalChain([options, 'optionalAccess', _23 => _23.retryApiErrors]) === true,
487
- exactUrlOnly: true,
488
- toolId,
489
- idempotencyKey,
490
- onResponse: () => {
491
- lastResponse = null;
492
- },
493
- onResponseBody: (observation) => {
494
- lastResponse = observation;
626
+ const legacyEndpoint = `/api/v2/integrations/${encodeURIComponent(toolId)}/execute`;
627
+ let useLegacyEndpoint = idempotencyKey === void 0;
628
+ const atomicToolOnly = _optionalChain([options, 'optionalAccess', _25 => _25.atomicToolOnly]) === true;
629
+ const dispatchRequest = async (requestTimeoutMs) => {
630
+ let recoverySupported = false;
631
+ let atomicToolsSupported = false;
632
+ const post = () => this.http.post(
633
+ atomicToolOnly ? `/api/v2/tools/${encodeURIComponent(toolId)}/execute` : useLegacyEndpoint ? legacyEndpoint : `/api/v2/executions/by-key/${encodeURIComponent(idempotencyKey)}?tool_id=${encodeURIComponent(toolId)}`,
634
+ {
635
+ payload: inputSnapshot,
636
+ ...metadataSnapshot ? { metadata: metadataSnapshot } : {}
637
+ },
638
+ headers,
639
+ {
640
+ timeout: requestTimeoutMs,
641
+ maxRetries: idempotencyKey ? 0 : _nullishCoalesce(_optionalChain([options, 'optionalAccess', _26 => _26.maxRetries]), () => ( 0)),
642
+ ...atomicToolOnly && !idempotencyKey && _optionalChain([options, 'optionalAccess', _27 => _27.maxRetries]) === void 0 ? { executePolicyMaxRetries: 2 } : {},
643
+ retryApiErrors: atomicToolOnly || _optionalChain([options, 'optionalAccess', _28 => _28.retryApiErrors]) === true,
644
+ retryFromExecutePolicy: atomicToolOnly,
645
+ exactUrlOnly: true,
646
+ toolId,
647
+ idempotencyKey,
648
+ onResponse: (response2) => {
649
+ lastResponse = null;
650
+ atomicToolsSupported = response2.headers.get(_chunkFVLNYDI4js.ATOMIC_TOOL_EXECUTE_SUPPORTED_HEADER) === "true";
651
+ recoverySupported = response2.headers.get("X-Deepline-Idempotency-Supported") === "true";
652
+ if (_optionalChain([options, 'optionalAccess', _29 => _29.onServerTiming])) {
653
+ try {
654
+ const notification = options.onServerTiming(
655
+ parseExecuteServerTiming(
656
+ response2.headers.get("server-timing")
657
+ )
658
+ );
659
+ void Promise.resolve(notification).catch(() => void 0);
660
+ } catch (e3) {
661
+ }
495
662
  }
663
+ },
664
+ onResponseBody: (observation) => {
665
+ lastResponse = observation;
666
+ }
667
+ }
668
+ );
669
+ try {
670
+ return await post();
671
+ } catch (error) {
672
+ if (atomicToolOnly) {
673
+ if (!atomicToolsSupported && !recoverySupported && !(error instanceof _chunkPPDBRJRWjs.ToolExecutionError) && error instanceof _chunkPPDBRJRWjs.DeeplineError && (error.statusCode === 404 || error.statusCode === 405)) {
674
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
675
+ "This server does not support atomic tool execution.",
676
+ error.statusCode,
677
+ "ATOMIC_TOOL_EXECUTE_UNSUPPORTED"
678
+ );
496
679
  }
680
+ throw error;
681
+ }
682
+ if (useLegacyEndpoint || recoverySupported || !(error instanceof _chunkPPDBRJRWjs.DeeplineError) || error.statusCode !== 404 && error.statusCode !== 405)
683
+ throw error;
684
+ lastResponse = null;
685
+ await this.lookupExecutionByKey(
686
+ idempotencyKey,
687
+ requestTimeoutMs,
688
+ _optionalChain([options, 'optionalAccess', _30 => _30.cliInvocationId])
497
689
  );
690
+ useLegacyEndpoint = true;
691
+ return post();
692
+ }
693
+ };
694
+ const request = async (requestTimeoutMs) => {
695
+ lastResponse = null;
696
+ try {
697
+ return await dispatchRequest(requestTimeoutMs);
498
698
  } catch (error) {
499
699
  observeTerminal({ error });
500
700
  throw error;
@@ -502,7 +702,7 @@ var ToolCalls = class {
502
702
  };
503
703
  let response;
504
704
  let recoveryDeadline = null;
505
- const recoveryTimeoutMs = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _24 => _24.recoveryTimeoutMs]), () => ( DEFAULT_EXECUTION_RECOVERY_TIMEOUT_MS));
705
+ const recoveryTimeoutMs = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _31 => _31.recoveryTimeoutMs]), () => ( DEFAULT_EXECUTION_RECOVERY_TIMEOUT_MS));
506
706
  let retryDelayMs = 1e3;
507
707
  const recoveryTimeoutError = () => executionRecoveryError({
508
708
  toolId,
@@ -530,7 +730,7 @@ var ToolCalls = class {
530
730
  this.defaultRequestTimeoutMs,
531
731
  remainingMs
532
732
  ),
533
- _optionalChain([options, 'optionalAccess', _25 => _25.cliInvocationId])
733
+ _optionalChain([options, 'optionalAccess', _32 => _32.cliInvocationId])
534
734
  );
535
735
  } catch (error) {
536
736
  if (!isRecoverableExecutionLookupError(error)) throw error;
@@ -568,7 +768,7 @@ var ToolCalls = class {
568
768
  recoveryDeadline = Date.now() + recoveryTimeoutMs;
569
769
  }
570
770
  } catch (error) {
571
- if (idempotencyKey && error instanceof _chunk7P5AA3SNjs.DeeplineError && error.code === "EXECUTION_OUTCOME_UNKNOWN") {
771
+ if (idempotencyKey && error instanceof _chunkPPDBRJRWjs.DeeplineError && error.code === "EXECUTION_OUTCOME_UNKNOWN") {
572
772
  throw executionRecoveryError({
573
773
  toolId,
574
774
  idempotencyKey,
@@ -603,7 +803,7 @@ var ToolCalls = class {
603
803
  validateExecutionIdempotencyKey(idempotencyKey);
604
804
  const result = await this.lookupExecutionByKey(idempotencyKey);
605
805
  if (!result) {
606
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
806
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
607
807
  `No execution exists for idempotency key ${idempotencyKey}.`,
608
808
  404,
609
809
  "EXECUTION_NOT_FOUND"
@@ -629,7 +829,7 @@ var ToolCalls = class {
629
829
  }
630
830
  );
631
831
  if (!supported) {
632
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
832
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
633
833
  "This Deepline server does not support recoverable tool executions; no tool was dispatched.",
634
834
  422,
635
835
  "IDEMPOTENCY_NOT_SUPPORTED"
@@ -639,6 +839,309 @@ var ToolCalls = class {
639
839
  }
640
840
  };
641
841
 
842
+ // ../play-runtime/runtime-environment.ts
843
+ var PLAY_RUNTIME_ENVIRONMENTS = ["preview"];
844
+ var PLAY_RUNTIME_NAMESPACE_PATTERN = /^[a-z][a-z0-9-]{0,30}$/;
845
+ var PLAY_RUNTIME_SANDBOX_PLACEMENT_POLICY_PATTERN = /^[a-z][a-z0-9_]*@[1-9][0-9]*$/;
846
+ function normalizePlayRuntimeNamespace(value) {
847
+ if (typeof value !== "string") return null;
848
+ const normalized = value.trim();
849
+ return PLAY_RUNTIME_NAMESPACE_PATTERN.test(normalized) ? normalized : null;
850
+ }
851
+ function normalizePlayRuntimeSandboxPlacementPolicy(value) {
852
+ if (typeof value !== "string") return null;
853
+ const normalized = value.trim();
854
+ return PLAY_RUNTIME_SANDBOX_PLACEMENT_POLICY_PATTERN.test(normalized) ? normalized : null;
855
+ }
856
+ function normalizePlayRuntimeSelection(value) {
857
+ if (!value || typeof value !== "object" || Array.isArray(value)) return null;
858
+ const record = value;
859
+ if (Object.keys(record).some(
860
+ (key) => key !== "environment" && key !== "namespace" && key !== "backend" && key !== "sandboxPlacementPolicy"
861
+ ) || record.environment !== "preview") {
862
+ return null;
863
+ }
864
+ const namespace = normalizePlayRuntimeNamespace(record.namespace);
865
+ if (!namespace) return null;
866
+ const sandboxPlacementPolicy = record.sandboxPlacementPolicy === void 0 ? void 0 : normalizePlayRuntimeSandboxPlacementPolicy(
867
+ record.sandboxPlacementPolicy
868
+ );
869
+ if (record.sandboxPlacementPolicy !== void 0 && sandboxPlacementPolicy === null) {
870
+ return null;
871
+ }
872
+ if (record.backend !== void 0 && record.backend !== _chunkE4CABWXLjs.PLAY_RUNTIME_BACKENDS.daytona && record.backend !== _chunkE4CABWXLjs.PLAY_RUNTIME_BACKENDS.modal) {
873
+ return null;
874
+ }
875
+ return {
876
+ environment: "preview",
877
+ namespace,
878
+ ...record.backend === void 0 ? {} : { backend: record.backend },
879
+ ...sandboxPlacementPolicy ? { sandboxPlacementPolicy } : {}
880
+ };
881
+ }
882
+ function normalizePlayRuntimeEnvironment(value) {
883
+ return typeof value === "string" && PLAY_RUNTIME_ENVIRONMENTS.includes(value) ? value : null;
884
+ }
885
+
886
+ // src/plays/client.ts
887
+ function normalizePlayRunIntegrationMode(value) {
888
+ if (value === "live" || value === "eval_stub" || value === "fixture") {
889
+ return value;
890
+ }
891
+ return void 0;
892
+ }
893
+ function resolvePlayRunIntegrationMode(request, env) {
894
+ return normalizePlayRunIntegrationMode(
895
+ _nullishCoalesce(request.integrationMode, () => ( env.DEEPLINE_EVAL_INTEGRATION_MODE))
896
+ );
897
+ }
898
+ function resolvePlayRunRuntimeSelection(request, env) {
899
+ if (request.runtime !== void 0) {
900
+ const runtime = normalizePlayRuntimeSelection(request.runtime);
901
+ if (!runtime) {
902
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
903
+ 'runtime must be { environment: "preview", namespace, backend?: "daytona" | "modal", sandboxPlacementPolicy?: "policy_name@1" } with namespace matching ^[a-z][a-z0-9-]{0,30}$.',
904
+ void 0,
905
+ "INVALID_RUNTIME_SELECTION"
906
+ );
907
+ }
908
+ return runtime;
909
+ }
910
+ const configured = _optionalChain([env, 'access', _33 => _33.DEEPLINE_RUNTIME_ENVIRONMENT, 'optionalAccess', _34 => _34.trim, 'call', _35 => _35()]);
911
+ const configuredNamespace = _optionalChain([env, 'access', _36 => _36.DEEPLINE_RUNTIME_NAMESPACE, 'optionalAccess', _37 => _37.trim, 'call', _38 => _38()]);
912
+ const configuredToken = _optionalChain([env, 'access', _39 => _39.DEEPLINE_RUNTIME_ENVIRONMENT_TOKEN, 'optionalAccess', _40 => _40.trim, 'call', _41 => _41()]);
913
+ const configuredPlacementPolicy = _optionalChain([env, 'access', _42 => _42.DEEPLINE_RUNTIME_SANDBOX_PLACEMENT_POLICY, 'optionalAccess', _43 => _43.trim, 'call', _44 => _44()]);
914
+ if (!configured) {
915
+ if (configuredNamespace || configuredToken || configuredPlacementPolicy) {
916
+ const present = [];
917
+ if (configuredNamespace) present.push("DEEPLINE_RUNTIME_NAMESPACE");
918
+ if (configuredToken) present.push("DEEPLINE_RUNTIME_ENVIRONMENT_TOKEN");
919
+ if (configuredPlacementPolicy) {
920
+ present.push("DEEPLINE_RUNTIME_SANDBOX_PLACEMENT_POLICY");
921
+ }
922
+ const isPlural = present.length > 1;
923
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
924
+ [
925
+ `Incomplete play runtime selection: ${present.join(" and ")} ${isPlural ? "are" : "is"} set but DEEPLINE_RUNTIME_ENVIRONMENT is not.`,
926
+ "Preview routing requires DEEPLINE_RUNTIME_ENVIRONMENT=preview together with DEEPLINE_RUNTIME_NAMESPACE; the token alone authorizes nothing.",
927
+ `If you did not export ${isPlural ? "these" : "this"} yourself, ${isPlural ? "they were" : "it was"} most likely auto-loaded from a .env or .env.local in the current directory (bun loads those automatically, and in a git worktree .env.local is usually a symlink to the main checkout).`,
928
+ `To run against the app-native runtime, clear ${isPlural ? "them" : "it"} for this command: ${present.map((name) => `${name}=`).join(" ")} <your deepline command>`
929
+ ].join("\n"),
930
+ void 0,
931
+ "INVALID_RUNTIME_ENVIRONMENT"
932
+ );
933
+ }
934
+ return void 0;
935
+ }
936
+ const environment = normalizePlayRuntimeEnvironment(configured);
937
+ if (!environment) {
938
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
939
+ `DEEPLINE_RUNTIME_ENVIRONMENT supports only explicit preview selection. Received "${configured}". Omit it to use the app-native runtime.`,
940
+ void 0,
941
+ "INVALID_RUNTIME_ENVIRONMENT"
942
+ );
943
+ }
944
+ const namespace = normalizePlayRuntimeNamespace(configuredNamespace);
945
+ if (!namespace) {
946
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
947
+ "DEEPLINE_RUNTIME_NAMESPACE is required for preview and must match ^[a-z][a-z0-9-]{0,30}$.",
948
+ void 0,
949
+ "INVALID_RUNTIME_NAMESPACE"
950
+ );
951
+ }
952
+ const configuredBackendValue = _optionalChain([env, 'access', _45 => _45.DEEPLINE_PLAY_RUNNER_BACKEND, 'optionalAccess', _46 => _46.trim, 'call', _47 => _47()]);
953
+ const configuredBackend = configuredBackendValue === "daytona" || configuredBackendValue === "modal" ? configuredBackendValue : void 0;
954
+ if (configuredBackendValue && !configuredBackend) {
955
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
956
+ `DEEPLINE_PLAY_RUNNER_BACKEND must be daytona or modal for preview runtime selection. Received "${configuredBackendValue}".`,
957
+ void 0,
958
+ "INVALID_RUNTIME_BACKEND"
959
+ );
960
+ }
961
+ if (configuredPlacementPolicy && !normalizePlayRuntimeSandboxPlacementPolicy(configuredPlacementPolicy)) {
962
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
963
+ `DEEPLINE_RUNTIME_SANDBOX_PLACEMENT_POLICY must be a versioned placement policy id such as daytona_only@1. Received "${configuredPlacementPolicy}".`,
964
+ void 0,
965
+ "INVALID_RUNTIME_SANDBOX_PLACEMENT_POLICY"
966
+ );
967
+ }
968
+ return {
969
+ environment,
970
+ namespace,
971
+ ...configuredBackend ? { backend: configuredBackend } : {},
972
+ ...configuredPlacementPolicy ? { sandboxPlacementPolicy: configuredPlacementPolicy } : {}
973
+ };
974
+ }
975
+ function resolveStartPlayRunRequest(request, env) {
976
+ const integrationMode = resolvePlayRunIntegrationMode(request, env);
977
+ const testPolicyOverrides = _nullishCoalesce(request.testPolicyOverrides, () => ( parseEnvTestPolicyOverrides(env)));
978
+ const runtime = resolvePlayRunRuntimeSelection(request, env);
979
+ const resolved = { ...request };
980
+ delete resolved.integrationMode;
981
+ delete resolved.runtime;
982
+ delete resolved.testPolicyOverrides;
983
+ if (integrationMode) resolved.integrationMode = integrationMode;
984
+ if (runtime) resolved.runtime = runtime;
985
+ if (testPolicyOverrides) resolved.testPolicyOverrides = testPolicyOverrides;
986
+ return { request: resolved, runtime };
987
+ }
988
+ function runtimeSelectionHeaders(runtime, env) {
989
+ if (!runtime) return void 0;
990
+ const token = _optionalChain([env, 'access', _48 => _48.DEEPLINE_RUNTIME_ENVIRONMENT_TOKEN, 'optionalAccess', _49 => _49.trim, 'call', _50 => _50()]);
991
+ if (!token) {
992
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
993
+ "DEEPLINE_RUNTIME_ENVIRONMENT_TOKEN is required for explicit preview runtime selection.",
994
+ void 0,
995
+ "RUNTIME_ENVIRONMENT_TOKEN_REQUIRED"
996
+ );
997
+ }
998
+ const receivers = _optionalChain([env, 'access', _51 => _51.DEEPLINE_RUNTIME_RETAINED_PIPELINE_RECEIVERS, 'optionalAccess', _52 => _52.trim, 'call', _53 => _53()]);
999
+ return {
1000
+ [_chunkFVLNYDI4js.RUNTIME_ENVIRONMENT_TOKEN_HEADER]: token,
1001
+ ...receivers ? { [_chunkFVLNYDI4js.RETAINED_PIPELINE_RECEIVERS_HEADER]: receivers } : {}
1002
+ };
1003
+ }
1004
+ function normalizeTestPolicyOverrides(value, source) {
1005
+ if (value && typeof value === "object" && !Array.isArray(value)) {
1006
+ return value;
1007
+ }
1008
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
1009
+ `${source} must be a JSON object.`,
1010
+ void 0,
1011
+ "INVALID_TEST_POLICY_OVERRIDES"
1012
+ );
1013
+ }
1014
+ function parseEnvTestPolicyOverrides(env) {
1015
+ const raw = env.DEEPLINE_TEST_POLICY_OVERRIDES;
1016
+ const trimmed = _optionalChain([raw, 'optionalAccess', _54 => _54.trim, 'call', _55 => _55()]);
1017
+ if (!trimmed) return void 0;
1018
+ let parsed;
1019
+ try {
1020
+ parsed = JSON.parse(trimmed);
1021
+ } catch (error) {
1022
+ const detail = error instanceof Error ? ` ${error.message}` : "";
1023
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
1024
+ `DEEPLINE_TEST_POLICY_OVERRIDES must be valid JSON.${detail}`,
1025
+ void 0,
1026
+ "INVALID_TEST_POLICY_OVERRIDES"
1027
+ );
1028
+ }
1029
+ return normalizeTestPolicyOverrides(parsed, "DEEPLINE_TEST_POLICY_OVERRIDES");
1030
+ }
1031
+ function isRecord2(value) {
1032
+ return Boolean(value && typeof value === "object" && !Array.isArray(value));
1033
+ }
1034
+ function normalizePlayStatus(raw) {
1035
+ const runPackage = _chunk2H4EY7KHjs.isPlayRunPackage.call(void 0, raw) ? raw : _chunk2H4EY7KHjs.isPlayRunPackage.call(void 0, raw.package) ? raw.package : null;
1036
+ const packageRun = _optionalChain([runPackage, 'optionalAccess', _56 => _56.run]);
1037
+ const rawStatus = typeof raw.status === "string" ? raw.status : typeof _optionalChain([packageRun, 'optionalAccess', _57 => _57.status]) === "string" ? packageRun.status : null;
1038
+ const status = _chunk2H4EY7KHjs.decodePlayRunPublicStatus.call(void 0, rawStatus);
1039
+ if (!status) {
1040
+ throw new Error(
1041
+ `Invalid play run lifecycle status in API response: ${JSON.stringify(rawStatus)}.`
1042
+ );
1043
+ }
1044
+ const runId = typeof raw.runId === "string" ? raw.runId : typeof raw.workflowId === "string" ? raw.workflowId : _nullishCoalesce(_optionalChain([packageRun, 'optionalAccess', _58 => _58.id]), () => ( ""));
1045
+ const legacyOverview = _nullishCoalesce(_optionalChain([runPackage, 'optionalAccess', _59 => _59.overview]), () => ( raw.overview));
1046
+ const runStatus = _nullishCoalesce(_optionalChain([runPackage, 'optionalAccess', _60 => _60.runStatus]), () => ( raw.runStatus));
1047
+ return {
1048
+ ...raw,
1049
+ runId,
1050
+ ...isRecord2(legacyOverview) ? {
1051
+ overview: legacyOverview
1052
+ } : {},
1053
+ ...isRecord2(runStatus) ? { runStatus } : {},
1054
+ ...runPackage ? {
1055
+ package: runPackage,
1056
+ outputs: runPackage.outputs
1057
+ } : {},
1058
+ status
1059
+ };
1060
+ }
1061
+ var PlayClient = class {
1062
+ constructor(http, environment = process.env) {
1063
+ this.http = http;
1064
+ this.environment = environment;
1065
+ }
1066
+ async startPlayRun(request, options) {
1067
+ const resolved = resolveStartPlayRunRequest(request, this.environment);
1068
+ const headers = runtimeSelectionHeaders(resolved.runtime, this.environment);
1069
+ return _chunk2H4EY7KHjs.startPlayRun.call(void 0,
1070
+ this.http,
1071
+ resolved.request,
1072
+ _optionalChain([options, 'optionalAccess', _61 => _61.cliAdmission]) ? { ...headers, "X-Deepline-API-Major": String(_chunkFVLNYDI4js.SDK_API_MAJOR) } : headers,
1073
+ options
1074
+ );
1075
+ }
1076
+ async getPlayStatus(workflowId, options) {
1077
+ const params = new URLSearchParams();
1078
+ if (_optionalChain([options, 'optionalAccess', _62 => _62.billing]) === false) {
1079
+ params.set("billing", "false");
1080
+ }
1081
+ if (_optionalChain([options, 'optionalAccess', _63 => _63.full]) === true) {
1082
+ params.set("full", "true");
1083
+ }
1084
+ const query = params.size > 0 ? `?${params.toString()}` : "";
1085
+ const response = await this.http.get(
1086
+ `/api/v2/runs/${encodeURIComponent(workflowId)}${query}`
1087
+ );
1088
+ return normalizePlayStatus(response);
1089
+ }
1090
+ async cancelPlay(workflowId) {
1091
+ await this.http.request(
1092
+ `/api/v2/runs/${encodeURIComponent(workflowId)}/stop`,
1093
+ { method: "POST" }
1094
+ );
1095
+ }
1096
+ async stopPlay(workflowId, options) {
1097
+ return this.http.post(
1098
+ `/api/v2/runs/${encodeURIComponent(workflowId)}/stop`,
1099
+ _optionalChain([options, 'optionalAccess', _64 => _64.reason]) ? { reason: options.reason } : {}
1100
+ );
1101
+ }
1102
+ async listPlayRuns(playName) {
1103
+ const encodedName = encodeURIComponent(playName);
1104
+ const response = await this.http.get(
1105
+ `/api/v2/plays/${encodedName}/runs`
1106
+ );
1107
+ return _nullishCoalesce(response.runs, () => ( []));
1108
+ }
1109
+ async getPlay(name, options) {
1110
+ const encodedName = encodeURIComponent(name);
1111
+ const query = _optionalChain([options, 'optionalAccess', _65 => _65.source]) ? `?include=source&revision=${encodeURIComponent(options.source)}` : _optionalChain([options, 'optionalAccess', _66 => _66.guidance]) ? "?include=guidance" : "";
1112
+ return this.http.get(`/api/v2/plays/${encodedName}${query}`);
1113
+ }
1114
+ async clearPlayHistory(name, request = {}) {
1115
+ const encodedName = encodeURIComponent(name);
1116
+ return this.http.post(
1117
+ `/api/v2/plays/${encodedName}/history/clear`,
1118
+ request
1119
+ );
1120
+ }
1121
+ async listPlayVersions(name, options) {
1122
+ const encodedName = encodeURIComponent(name);
1123
+ const suffix = _optionalChain([options, 'optionalAccess', _67 => _67.full]) ? "?full=true" : "";
1124
+ const response = await this.http.get(
1125
+ `/api/v2/plays/${encodedName}/versions${suffix}`
1126
+ );
1127
+ return _nullishCoalesce(response.versions, () => ( []));
1128
+ }
1129
+ async publishPlayVersion(name, request = {}) {
1130
+ const encodedName = encodeURIComponent(name);
1131
+ return this.http.post(
1132
+ `/api/v2/plays/${encodedName}/live`,
1133
+ request
1134
+ );
1135
+ }
1136
+ };
1137
+ function createPlayClient(options) {
1138
+ const config = _chunkFVLNYDI4js.resolveConfig.call(void 0, options);
1139
+ return new PlayClient(
1140
+ new (0, _chunkFVLNYDI4js.HttpClient)(config),
1141
+ _nullishCoalesce(config.environment, () => ( process.env))
1142
+ );
1143
+ }
1144
+
642
1145
  // ../product-notifications/contract.ts
643
1146
  var PRODUCT_NOTIFICATION_EVENT_CATALOG = [
644
1147
  {
@@ -846,10 +1349,13 @@ function stripLeadingTimestamp(line) {
846
1349
 
847
1350
  // src/runs/read-errors.ts
848
1351
  function isTransientPlayRunReadError(error) {
849
- if (error instanceof _chunk7P5AA3SNjs.DeeplineError && error.code === "PLAY_STREAM_NETWORK_ABORTED") {
1352
+ if (error instanceof _chunkPPDBRJRWjs.DeeplineError && error.code === "PLAY_START_OUTCOME_UNKNOWN") {
1353
+ return false;
1354
+ }
1355
+ if (error instanceof _chunkPPDBRJRWjs.DeeplineError && error.code === "PLAY_STREAM_NETWORK_ABORTED") {
850
1356
  return true;
851
1357
  }
852
- if (error instanceof _chunk7P5AA3SNjs.DeeplineError && typeof error.statusCode === "number") {
1358
+ if (error instanceof _chunkPPDBRJRWjs.DeeplineError && typeof error.statusCode === "number") {
853
1359
  return error.statusCode >= 500 && error.statusCode < 600;
854
1360
  }
855
1361
  const text = error instanceof Error ? error.message : String(error);
@@ -1353,7 +1859,7 @@ function bounded(value, maxBytes = MAX_BYTES) {
1353
1859
  let encoded;
1354
1860
  try {
1355
1861
  encoded = JSON.stringify(value);
1356
- } catch (e2) {
1862
+ } catch (e4) {
1357
1863
  fail("Run event query must be bounded JSON without cycles.");
1358
1864
  }
1359
1865
  if (!encoded || new TextEncoder().encode(encoded).length > maxBytes)
@@ -1553,7 +2059,7 @@ function parseDsl(input) {
1553
2059
  }
1554
2060
  try {
1555
2061
  return JSON.parse(input.slice(start, position));
1556
- } catch (e3) {
2062
+ } catch (e5) {
1557
2063
  fail("Run event DSL requires valid JSON scalars.");
1558
2064
  }
1559
2065
  };
@@ -1578,7 +2084,7 @@ function parseDsl(input) {
1578
2084
  input.slice(position)
1579
2085
  );
1580
2086
  if (!operation) {
1581
- const token = _nullishCoalesce(_nullishCoalesce(_optionalChain([/^(?:[=!<>~]+|[A-Za-z_]+)/, 'access', _26 => _26.exec, 'call', _27 => _27(input.slice(position)), 'optionalAccess', _28 => _28[0]]), () => ( input[position])), () => ( "<end>"));
2087
+ const token = _nullishCoalesce(_nullishCoalesce(_optionalChain([/^(?:[=!<>~]+|[A-Za-z_]+)/, 'access', _68 => _68.exec, 'call', _69 => _69(input.slice(position)), 'optionalAccess', _70 => _70[0]]), () => ( input[position])), () => ( "<end>"));
1582
2088
  if (token === "=") {
1583
2089
  const corrected = `${input.slice(0, position)}==${input.slice(position + 1)}`;
1584
2090
  fail(
@@ -1657,7 +2163,7 @@ function normalizeRunEventQueryTimestamp(value) {
1657
2163
  return /[1-9]/.test(extraMicros) ? canonical2.replace(/Z$/, `${extraMicros}Z`) : canonical2;
1658
2164
  }
1659
2165
  function timestampMicros(value) {
1660
- const fraction = _nullishCoalesce(_optionalChain([/\.(\d+)Z$/, 'access', _29 => _29.exec, 'call', _30 => _30(value), 'optionalAccess', _31 => _31[1]]), () => ( ""));
2166
+ const fraction = _nullishCoalesce(_optionalChain([/\.(\d+)Z$/, 'access', _71 => _71.exec, 'call', _72 => _72(value), 'optionalAccess', _73 => _73[1]]), () => ( ""));
1661
2167
  return BigInt(Date.parse(value)) * BigInt(1e3) + BigInt(fraction.padEnd(6, "0").slice(3));
1662
2168
  }
1663
2169
  function time(value, nowMs, fallback) {
@@ -1886,57 +2392,15 @@ var TERMINAL_RESERVE_BYTES = 64 * 1024;
1886
2392
  var encoder = new TextEncoder();
1887
2393
 
1888
2394
  // ../play-runtime/secret-redaction.ts
1889
- var SECRET_REDACTION_PLACEHOLDER = "[REDACTED_SECRET]";
1890
- var BEARER_TOKEN_RE = /\bBearer\s+[A-Za-z0-9._~+/=-]{12,}\b/g;
1891
- var BASIC_CREDENTIAL_RE = /\bBasic\s+[A-Za-z0-9+/]{4,}={0,2}\b/g;
1892
- var JWT_RE = /\b[A-Za-z0-9_-]{8,16384}\.[A-Za-z0-9_-]{1,16384}\.[A-Za-z0-9_-]{8,16384}\b/g;
1893
- var EMAIL_LOCAL_CHAR_RE = /[A-Za-z0-9.!#$%&'*+/=?^_`{|}~-]/;
1894
- var EMAIL_DOMAIN_RE = /^[A-Za-z0-9](?:[A-Za-z0-9.-]{0,251}[A-Za-z0-9])?\.[A-Za-z]{2,63}\b/;
1895
- function isEmailLocalPart(value, start, end) {
1896
- let localStart = start;
1897
- while (localStart > 0 && EMAIL_LOCAL_CHAR_RE.test(value[localStart - 1])) {
1898
- localStart -= 1;
1899
- }
1900
- let localEnd = end;
1901
- while (localEnd < value.length && EMAIL_LOCAL_CHAR_RE.test(value[localEnd])) {
1902
- localEnd += 1;
1903
- }
1904
- return localStart < localEnd && localEnd - localStart <= 64 && value[localEnd] === "@" && EMAIL_DOMAIN_RE.test(value.slice(localEnd + 1));
1905
- }
1906
- function redactTokenUnlessEmail(match, offset, source) {
1907
- return isEmailLocalPart(source, offset, offset + match.length) ? match : SECRET_REDACTION_PLACEHOLDER;
1908
- }
1909
- var PRIVATE_KEY_RE = /-----BEGIN [A-Z0-9 ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z0-9 ]*PRIVATE KEY-----/g;
1910
2395
  var SENSITIVE_FIELD_NAME = "authorization|cookie|password|(?:client[_-]?)?secret|(?:access|refresh)[_-]?token|(?:x[_-]?)?api[_-]?key|private[_-]?key|token|credentials";
1911
- var COMMON_SECRET_RE = /\b(?:[prs]k_(?:live|test)_|(?:pat|ghp|github_pat)_|xox[baprs]-)[A-Za-z0-9_./+=:-]{12,}\b/gi;
1912
- var GENERIC_PREFIXED_SECRET_RE = /\b(?:key|token|secret|api[_-]?key)_[A-Za-z0-9_./+=:-]{12,}\b/gi;
1913
- var URL_SECRET_VALUE_RE = /\b(?:[spr]k|pat|ghp|github_pat|xox)[A-Za-z0-9_./+=:-]{12,}\b/i;
1914
- var GENERIC_SECRET_ASSIGNMENT_RE = /\b(?:api[_-]?key|token|secret|password)\b\s*[:=]\s*["']?[^"',\s]{12,}["']?/gi;
1915
- var HIGH_ENTROPY_ASSIGNMENT_RE = /\b(?:api[_-]?key|token|secret|password|authorization|(?:access|refresh)[_-]?token)\b\s*[:=]\s*["']?[^"',\s]{16,}["']?/gi;
1916
- var SENSITIVE_URL_PARAM_RE = /[?#&](?:\w*(?:key|token)|secret|password|authorization|credential|signature|sig)(?:=|$)/i;
1917
2396
  var SENSITIVE_FIELD_NAME_RE = new RegExp(
1918
2397
  `(^|[._-])(?:${SENSITIVE_FIELD_NAME})$`,
1919
2398
  "i"
1920
2399
  );
1921
- var SENSITIVE_FIELD_NAME_CACHE_MAX_ENTRIES = 4096;
1922
- var sensitiveFieldNameCache = /* @__PURE__ */ new Map();
1923
- function isSensitiveFieldName(key) {
1924
- const cached = sensitiveFieldNameCache.get(key);
1925
- if (cached !== void 0) return cached;
1926
- const sensitive = SENSITIVE_FIELD_NAME_RE.test(key);
1927
- if (sensitiveFieldNameCache.size >= SENSITIVE_FIELD_NAME_CACHE_MAX_ENTRIES) {
1928
- sensitiveFieldNameCache.clear();
1929
- }
1930
- sensitiveFieldNameCache.set(key, sensitive);
1931
- return sensitive;
1932
- }
1933
2400
  var SERIALIZED_SECRET_FIELD_RE = new RegExp(
1934
2401
  `"(${SENSITIVE_FIELD_NAME})"\\s*:\\s*(?:"[^"\\\\]*"|\\{[^{}]*\\})`,
1935
2402
  "gi"
1936
2403
  );
1937
- function escapeRegExp(value) {
1938
- return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
1939
- }
1940
2404
  var REDACTION_TRIGGER_RE = new RegExp(
1941
2405
  [
1942
2406
  // Sensitive field names, in object keys and in `name=`/`"name":` text.
@@ -1971,147 +2435,6 @@ var REDACTION_TRIGGER_RE = new RegExp(
1971
2435
  ].join("|"),
1972
2436
  "i"
1973
2437
  );
1974
- function mightContainRedactableSecret(value) {
1975
- return REDACTION_TRIGGER_RE.test(value);
1976
- }
1977
- function redactSecretLikeString(value) {
1978
- if (!mightContainRedactableSecret(value)) return value;
1979
- const serializedRedacted = value.replace(
1980
- SERIALIZED_SECRET_FIELD_RE,
1981
- `"$1":"${SECRET_REDACTION_PLACEHOLDER}"`
1982
- );
1983
- const trimmed = serializedRedacted.trim();
1984
- if (/^https?:\/\/\S+$/i.test(trimmed)) {
1985
- if (/^https?:\/\/[^/?#@]+@/i.test(trimmed) || SENSITIVE_URL_PARAM_RE.test(trimmed)) {
1986
- return SECRET_REDACTION_PLACEHOLDER;
1987
- }
1988
- if (!URL_SECRET_VALUE_RE.test(serializedRedacted)) {
1989
- return serializedRedacted;
1990
- }
1991
- }
1992
- return serializedRedacted.replace(PRIVATE_KEY_RE, SECRET_REDACTION_PLACEHOLDER).replace(BEARER_TOKEN_RE, `Bearer ${SECRET_REDACTION_PLACEHOLDER}`).replace(BASIC_CREDENTIAL_RE, `Basic ${SECRET_REDACTION_PLACEHOLDER}`).replace(JWT_RE, redactTokenUnlessEmail).replace(COMMON_SECRET_RE, redactTokenUnlessEmail).replace(GENERIC_PREFIXED_SECRET_RE, redactTokenUnlessEmail).replace(GENERIC_SECRET_ASSIGNMENT_RE, SECRET_REDACTION_PLACEHOLDER).replace(HIGH_ENTROPY_ASSIGNMENT_RE, (match) => {
1993
- const separator = match.includes("=") ? "=" : ":";
1994
- const [key] = match.split(separator, 1);
1995
- return `${key.trim()}${separator}${SECRET_REDACTION_PLACEHOLDER}`;
1996
- });
1997
- }
1998
- function createSecretRedactionContext(initialValues = []) {
1999
- const exactSecrets = /* @__PURE__ */ new Set();
2000
- const exactSecretMatchers = /* @__PURE__ */ new Map();
2001
- function register(value) {
2002
- if (value.length > 0) exactSecrets.add(value);
2003
- }
2004
- function matchersForSecret(secret) {
2005
- const cached = exactSecretMatchers.get(secret);
2006
- if (cached) return cached;
2007
- const literals = [secret];
2008
- try {
2009
- const encoded = encodeURIComponent(secret);
2010
- if (encoded !== secret) literals.push(encoded);
2011
- } catch (e4) {
2012
- }
2013
- const built = literals.map((literal) => ({
2014
- literal,
2015
- matcher: new RegExp(escapeRegExp(literal), "g")
2016
- }));
2017
- exactSecretMatchers.set(secret, built);
2018
- return built;
2019
- }
2020
- for (const value of initialValues) register(value);
2021
- function containsRegisteredSecret(value, {
2022
- includeEncoded = false,
2023
- minimumLength = 1
2024
- } = {}) {
2025
- for (const secret of exactSecrets) {
2026
- if (secret.length < minimumLength) continue;
2027
- if (value.includes(secret)) return true;
2028
- if (includeEncoded) {
2029
- try {
2030
- const encoded = encodeURIComponent(secret);
2031
- if (encoded !== secret && value.includes(encoded)) return true;
2032
- } catch (e5) {
2033
- }
2034
- }
2035
- }
2036
- return false;
2037
- }
2038
- function matchesRegisteredSecret(value) {
2039
- return exactSecrets.has(value);
2040
- }
2041
- function redactRegisteredSecrets(value) {
2042
- if (exactSecrets.size === 0) return value;
2043
- let output = value;
2044
- for (const secret of exactSecrets) {
2045
- for (const { literal, matcher } of matchersForSecret(secret)) {
2046
- if (!output.includes(literal)) continue;
2047
- matcher.lastIndex = 0;
2048
- output = output.replace(matcher, SECRET_REDACTION_PLACEHOLDER);
2049
- }
2050
- }
2051
- return output;
2052
- }
2053
- function redactString(value) {
2054
- const output = redactRegisteredSecrets(value);
2055
- return redactSecretLikeString(output);
2056
- }
2057
- function redact(value) {
2058
- if (typeof value === "string") return redactString(value);
2059
- if (Array.isArray(value)) {
2060
- let changed = false;
2061
- const next = new Array(value.length);
2062
- for (let index = 0; index < value.length; index += 1) {
2063
- const entry = value[index];
2064
- const redacted = redact(entry);
2065
- next[index] = redacted;
2066
- if (redacted !== entry) changed = true;
2067
- }
2068
- return changed ? next : value;
2069
- }
2070
- if (value && typeof value === "object") {
2071
- const prototype = Object.getPrototypeOf(value);
2072
- let changed = prototype !== Object.prototype && prototype !== null;
2073
- const source = value;
2074
- const keys = Object.keys(source);
2075
- const redactedValues = new Array(keys.length);
2076
- for (let index = 0; index < keys.length; index += 1) {
2077
- const key = keys[index];
2078
- const entry = source[key];
2079
- const redacted = isSensitiveFieldName(key) ? SECRET_REDACTION_PLACEHOLDER : redact(entry);
2080
- redactedValues[index] = redacted;
2081
- if (redacted !== entry) changed = true;
2082
- }
2083
- if (!changed) return value;
2084
- return Object.fromEntries(
2085
- keys.map((key, index) => [key, redactedValues[index]])
2086
- );
2087
- }
2088
- return value;
2089
- }
2090
- function redactKnownSecrets(value) {
2091
- if (typeof value === "string") return redactRegisteredSecrets(value);
2092
- if (Array.isArray(value)) {
2093
- return value.map((entry) => redactKnownSecrets(entry));
2094
- }
2095
- if (value && typeof value === "object") {
2096
- return Object.fromEntries(
2097
- Object.entries(value).map(([key, entry]) => [
2098
- key,
2099
- redactKnownSecrets(entry)
2100
- ])
2101
- );
2102
- }
2103
- return value;
2104
- }
2105
- return {
2106
- register,
2107
- containsRegisteredSecret,
2108
- matchesRegisteredSecret,
2109
- redactRegisteredSecrets,
2110
- redactString,
2111
- redactKnownSecrets,
2112
- redact
2113
- };
2114
- }
2115
2438
 
2116
2439
  // ../play-runtime/output-size-limits.ts
2117
2440
  var TERMINAL_RUN_RESULT_MAX_BYTES = 6 * 1024 * 1024;
@@ -2127,9 +2450,6 @@ var RUNTIME_RECEIPT_WRITER_TARGET_BATCH_BYTES = 8 * 1024 * 1024;
2127
2450
  var RUNNER_POST_TERMINAL_DIAGNOSTIC_MAX_BYTES = 64 * 1024;
2128
2451
  var JSON_SIZE_LIMIT_REACHED = Symbol("JSON_SIZE_LIMIT_REACHED");
2129
2452
 
2130
- // ../play-runtime/ledger-safe-payload.ts
2131
- var ledgerIngressRedactor = createSecretRedactionContext();
2132
-
2133
2453
  // ../play-runtime/docflow-node-io.ts
2134
2454
  var utf8Encoder = new TextEncoder();
2135
2455
  var PLAY_DATASET_BRAND = Symbol.for("deepline.play.dataset");
@@ -2319,7 +2639,7 @@ var TERMINAL_STATUS_BY_EVENT_TYPE = {
2319
2639
 
2320
2640
  // ../play-runtime/run-snapshot-stream.ts
2321
2641
  function isTerminalPlayRunLiveStatus(status) {
2322
- return _chunkUHNDVD3Pjs.isTerminalPlayRunLifecycleStatus.call(void 0, status);
2642
+ return _chunk2H4EY7KHjs.isTerminalPlayRunLifecycleStatus.call(void 0, status);
2323
2643
  }
2324
2644
  function makeRunStreamEvent(input) {
2325
2645
  return {
@@ -2349,10 +2669,10 @@ function getStepStatusSignature(snapshot) {
2349
2669
  _nullishCoalesce(state.artifactTableNamespace, () => ( "")),
2350
2670
  _nullishCoalesce(state.startedAt, () => ( "")),
2351
2671
  _nullishCoalesce(state.completedAt, () => ( "")),
2352
- _nullishCoalesce(_optionalChain([state, 'access', _32 => _32.progress, 'optionalAccess', _33 => _33.startedAt]), () => ( "")),
2353
- _nullishCoalesce(_optionalChain([state, 'access', _34 => _34.progress, 'optionalAccess', _35 => _35.completedAt]), () => ( "")),
2672
+ _nullishCoalesce(_optionalChain([state, 'access', _74 => _74.progress, 'optionalAccess', _75 => _75.startedAt]), () => ( "")),
2673
+ _nullishCoalesce(_optionalChain([state, 'access', _76 => _76.progress, 'optionalAccess', _77 => _77.completedAt]), () => ( "")),
2354
2674
  _nullishCoalesce(state.updatedAt, () => ( "")),
2355
- _nullishCoalesce(_optionalChain([state, 'access', _36 => _36.progress, 'optionalAccess', _37 => _37.updatedAt]), () => ( ""))
2675
+ _nullishCoalesce(_optionalChain([state, 'access', _78 => _78.progress, 'optionalAccess', _79 => _79.updatedAt]), () => ( ""))
2356
2676
  ].join(":")
2357
2677
  ).join("|");
2358
2678
  }
@@ -2361,11 +2681,11 @@ function getStepProgressSignature(snapshot) {
2361
2681
  snapshot.nodeStates.map((state) => [
2362
2682
  state.nodeId,
2363
2683
  projectPlayStepProgressCounters(_nullishCoalesce(state.progress, () => ( {}))),
2364
- _nullishCoalesce(_optionalChain([state, 'access', _38 => _38.progress, 'optionalAccess', _39 => _39.artifactTableNamespace]), () => ( "")),
2365
- _nullishCoalesce(_optionalChain([state, 'access', _40 => _40.progress, 'optionalAccess', _41 => _41.startedAt]), () => ( "")),
2366
- _nullishCoalesce(_optionalChain([state, 'access', _42 => _42.progress, 'optionalAccess', _43 => _43.completedAt]), () => ( "")),
2367
- _nullishCoalesce(_optionalChain([state, 'access', _44 => _44.progress, 'optionalAccess', _45 => _45.updatedAt]), () => ( "")),
2368
- _nullishCoalesce(_optionalChain([state, 'access', _46 => _46.progress, 'optionalAccess', _47 => _47.message]), () => ( ""))
2684
+ _nullishCoalesce(_optionalChain([state, 'access', _80 => _80.progress, 'optionalAccess', _81 => _81.artifactTableNamespace]), () => ( "")),
2685
+ _nullishCoalesce(_optionalChain([state, 'access', _82 => _82.progress, 'optionalAccess', _83 => _83.startedAt]), () => ( "")),
2686
+ _nullishCoalesce(_optionalChain([state, 'access', _84 => _84.progress, 'optionalAccess', _85 => _85.completedAt]), () => ( "")),
2687
+ _nullishCoalesce(_optionalChain([state, 'access', _86 => _86.progress, 'optionalAccess', _87 => _87.updatedAt]), () => ( "")),
2688
+ _nullishCoalesce(_optionalChain([state, 'access', _88 => _88.progress, 'optionalAccess', _89 => _89.message]), () => ( ""))
2369
2689
  ])
2370
2690
  );
2371
2691
  }
@@ -2435,8 +2755,8 @@ function diffPlayRunStreamEvents(input) {
2435
2755
  if (state.status === "idle") {
2436
2756
  continue;
2437
2757
  }
2438
- const persistedStartedAt = _nullishCoalesce(_nullishCoalesce(state.startedAt, () => ( _optionalChain([state, 'access', _48 => _48.progress, 'optionalAccess', _49 => _49.startedAt]))), () => ( null));
2439
- const persistedCompletedAt = _nullishCoalesce(_nullishCoalesce(state.completedAt, () => ( _optionalChain([state, 'access', _50 => _50.progress, 'optionalAccess', _51 => _51.completedAt]))), () => ( null));
2758
+ const persistedStartedAt = _nullishCoalesce(_nullishCoalesce(state.startedAt, () => ( _optionalChain([state, 'access', _90 => _90.progress, 'optionalAccess', _91 => _91.startedAt]))), () => ( null));
2759
+ const persistedCompletedAt = _nullishCoalesce(_nullishCoalesce(state.completedAt, () => ( _optionalChain([state, 'access', _92 => _92.progress, 'optionalAccess', _93 => _93.completedAt]))), () => ( null));
2440
2760
  events.push(
2441
2761
  makeRunStreamEvent({
2442
2762
  cursor,
@@ -2450,7 +2770,7 @@ function diffPlayRunStreamEvents(input) {
2450
2770
  ...resolveTimingWindow({
2451
2771
  startedAt: persistedStartedAt,
2452
2772
  completedAt: persistedCompletedAt,
2453
- updatedAt: _nullishCoalesce(_nullishCoalesce(_nullishCoalesce(state.updatedAt, () => ( _optionalChain([state, 'access', _52 => _52.progress, 'optionalAccess', _53 => _53.updatedAt]))), () => ( snapshot.updatedAt)), () => ( null))
2773
+ updatedAt: _nullishCoalesce(_nullishCoalesce(_nullishCoalesce(state.updatedAt, () => ( _optionalChain([state, 'access', _94 => _94.progress, 'optionalAccess', _95 => _95.updatedAt]))), () => ( snapshot.updatedAt)), () => ( null))
2454
2774
  })
2455
2775
  }
2456
2776
  })
@@ -2504,9 +2824,9 @@ function diffPlayRunStreamEvents(input) {
2504
2824
  if (next.snapshotSignature !== previous.snapshotSignature) {
2505
2825
  const enrichedNodeStates = snapshot.nodeStates.map((state) => {
2506
2826
  const timing = resolveTimingWindow({
2507
- startedAt: _nullishCoalesce(_nullishCoalesce(state.startedAt, () => ( _optionalChain([state, 'access', _54 => _54.progress, 'optionalAccess', _55 => _55.startedAt]))), () => ( null)),
2508
- completedAt: _nullishCoalesce(_nullishCoalesce(state.completedAt, () => ( _optionalChain([state, 'access', _56 => _56.progress, 'optionalAccess', _57 => _57.completedAt]))), () => ( null)),
2509
- updatedAt: _nullishCoalesce(_nullishCoalesce(_nullishCoalesce(state.updatedAt, () => ( _optionalChain([state, 'access', _58 => _58.progress, 'optionalAccess', _59 => _59.updatedAt]))), () => ( snapshot.updatedAt)), () => ( null))
2827
+ startedAt: _nullishCoalesce(_nullishCoalesce(state.startedAt, () => ( _optionalChain([state, 'access', _96 => _96.progress, 'optionalAccess', _97 => _97.startedAt]))), () => ( null)),
2828
+ completedAt: _nullishCoalesce(_nullishCoalesce(state.completedAt, () => ( _optionalChain([state, 'access', _98 => _98.progress, 'optionalAccess', _99 => _99.completedAt]))), () => ( null)),
2829
+ updatedAt: _nullishCoalesce(_nullishCoalesce(_nullishCoalesce(state.updatedAt, () => ( _optionalChain([state, 'access', _100 => _100.progress, 'optionalAccess', _101 => _101.updatedAt]))), () => ( snapshot.updatedAt)), () => ( null))
2510
2830
  });
2511
2831
  return {
2512
2832
  ...state,
@@ -2550,19 +2870,21 @@ function diffPlayRunStreamEvents(input) {
2550
2870
 
2551
2871
  // src/runs/watch-polling.ts
2552
2872
  var RUN_WATCH_POLL_INTERVAL_MS = 2e3;
2873
+ var RUN_WATCH_STARTUP_POLL_INTERVAL_MS = 500;
2874
+ var RUN_WATCH_STARTUP_WINDOW_MS = 6e3;
2553
2875
  function waitForNextPoll(ms, signal) {
2554
- if (_optionalChain([signal, 'optionalAccess', _60 => _60.aborted])) {
2876
+ if (_optionalChain([signal, 'optionalAccess', _102 => _102.aborted])) {
2555
2877
  return Promise.resolve(false);
2556
2878
  }
2557
2879
  return new Promise((resolve) => {
2558
2880
  const finish = (elapsed) => {
2559
2881
  clearTimeout(timeout);
2560
- _optionalChain([signal, 'optionalAccess', _61 => _61.removeEventListener, 'call', _62 => _62("abort", onAbort)]);
2882
+ _optionalChain([signal, 'optionalAccess', _103 => _103.removeEventListener, 'call', _104 => _104("abort", onAbort)]);
2561
2883
  resolve(elapsed);
2562
2884
  };
2563
2885
  const onAbort = () => finish(false);
2564
2886
  const timeout = setTimeout(() => finish(true), ms);
2565
- _optionalChain([signal, 'optionalAccess', _63 => _63.addEventListener, 'call', _64 => _64("abort", onAbort, { once: true })]);
2887
+ _optionalChain([signal, 'optionalAccess', _105 => _105.addEventListener, 'call', _106 => _106("abort", onAbort, { once: true })]);
2566
2888
  });
2567
2889
  }
2568
2890
  function readSnapshotResponse(response, runId) {
@@ -2576,7 +2898,16 @@ function readSnapshotResponse(response, runId) {
2576
2898
  ) || typeof snapshot.totalLogCount !== "number" || !Array.isArray(snapshot.nodeStates)) {
2577
2899
  throw new Error(`Run watch returned an invalid snapshot for ${runId}.`);
2578
2900
  }
2579
- return { runId, snapshot };
2901
+ if (record.terminalStatus !== void 0 && (!record.terminalStatus || typeof record.terminalStatus !== "object" || Array.isArray(record.terminalStatus) || !isTerminalPlayRunLiveStatus(snapshot.status))) {
2902
+ throw new Error(
2903
+ `Run watch returned an invalid terminal status for ${runId}.`
2904
+ );
2905
+ }
2906
+ return {
2907
+ runId,
2908
+ snapshot,
2909
+ ...record.terminalStatus !== void 0 ? { terminalStatus: record.terminalStatus } : {}
2910
+ };
2580
2911
  }
2581
2912
  async function backfillRotatedLogTail(input) {
2582
2913
  if (!input.previous.runSignature || input.snapshot.logsUnavailable) {
@@ -2613,26 +2944,71 @@ async function backfillRotatedLogTail(input) {
2613
2944
  }
2614
2945
  async function* watchRunEvents(options) {
2615
2946
  const { http, runId, signal } = options;
2616
- const path = `/api/v2/runs/${encodeURIComponent(runId)}?watchSnapshot=true`;
2947
+ const params = new URLSearchParams({ watchSnapshot: "true" });
2948
+ if (options.deferLogs) params.set("deferLogs", "true");
2949
+ if (options.omitTerminalLogs) params.set("omitTerminalLogs", "true");
2950
+ if (options.terminalStatus) {
2951
+ params.set(
2952
+ "terminalStatus",
2953
+ options.terminalStatus.full ? "full" : "compact"
2954
+ );
2955
+ if (options.terminalStatus.billing === false)
2956
+ params.set("billing", "false");
2957
+ if (options.terminalStatus.runStatus)
2958
+ params.set("terminalRunStatus", "true");
2959
+ }
2960
+ const path = `/api/v2/runs/${encodeURIComponent(runId)}?${params}`;
2617
2961
  const streamId = `play-run-watch:${runId}`;
2618
- const pollIntervalMs = _nullishCoalesce(options.pollIntervalMs, () => ( RUN_WATCH_POLL_INTERVAL_MS));
2962
+ const watchStartedAt = Date.now();
2619
2963
  let previous = EMPTY_PLAY_RUN_STREAM_DIFF_STATE;
2620
2964
  let consecutiveFailures = 0;
2621
2965
  let outageNoticeSent = false;
2622
- while (!_optionalChain([signal, 'optionalAccess', _65 => _65.aborted])) {
2966
+ let pollCount = 0;
2967
+ while (!_optionalChain([signal, 'optionalAccess', _107 => _107.aborted])) {
2623
2968
  const pollStartedAt = Date.now();
2969
+ const poll = ++pollCount;
2970
+ const pollIntervalMs = _nullishCoalesce(options.pollIntervalMs, () => ( (pollStartedAt - watchStartedAt < RUN_WATCH_STARTUP_WINDOW_MS ? RUN_WATCH_STARTUP_POLL_INTERVAL_MS : RUN_WATCH_POLL_INTERVAL_MS)));
2624
2971
  let snapshot;
2972
+ let terminalStatus;
2973
+ let responseStatus;
2974
+ let serverTiming;
2975
+ let pollReported = false;
2976
+ const reportPoll = () => {
2977
+ if (!options.onPoll || pollReported) return;
2978
+ pollReported = true;
2979
+ try {
2980
+ options.onPoll({
2981
+ poll,
2982
+ durationMs: Date.now() - pollStartedAt,
2983
+ ...responseStatus !== void 0 ? { status: responseStatus } : {},
2984
+ ...serverTiming ? { serverTiming } : {}
2985
+ });
2986
+ } catch (e6) {
2987
+ }
2988
+ };
2625
2989
  try {
2626
- const response = await http.get(path, { signal });
2627
- snapshot = await backfillRotatedLogTail({
2990
+ const response = await http.get(path, {
2991
+ signal,
2992
+ ...options.onPoll ? {
2993
+ onResponse: (response2) => {
2994
+ responseStatus = response2.status;
2995
+ serverTiming = _nullishCoalesce(response2.headers.get("server-timing"), () => ( void 0));
2996
+ }
2997
+ } : {}
2998
+ });
2999
+ const parsed = readSnapshotResponse(response, runId);
3000
+ terminalStatus = parsed.terminalStatus;
3001
+ snapshot = options.deferLogs ? parsed.snapshot : await backfillRotatedLogTail({
2628
3002
  http,
2629
3003
  runId,
2630
- snapshot: readSnapshotResponse(response, runId).snapshot,
3004
+ snapshot: parsed.snapshot,
2631
3005
  previous,
2632
3006
  signal
2633
3007
  });
3008
+ reportPoll();
2634
3009
  } catch (error) {
2635
- if (_optionalChain([signal, 'optionalAccess', _66 => _66.aborted])) {
3010
+ reportPoll();
3011
+ if (_optionalChain([signal, 'optionalAccess', _108 => _108.aborted])) {
2636
3012
  return;
2637
3013
  }
2638
3014
  if (!isTransientPlayRunReadError(error)) {
@@ -2641,13 +3017,13 @@ async function* watchRunEvents(options) {
2641
3017
  consecutiveFailures += 1;
2642
3018
  const reason = error instanceof Error ? error.message : String(error);
2643
3019
  if (!outageNoticeSent) {
2644
- _optionalChain([options, 'access', _67 => _67.onRetry, 'optionalCall', _68 => _68({
3020
+ _optionalChain([options, 'access', _109 => _109.onRetry, 'optionalCall', _110 => _110({
2645
3021
  attempt: consecutiveFailures,
2646
3022
  delayMs: pollIntervalMs,
2647
3023
  reason
2648
3024
  })]);
2649
- _optionalChain([options, 'access', _69 => _69.onNotice, 'optionalCall', _70 => _70(
2650
- `[watch] run snapshot request failed; retrying every ${pollIntervalMs / 1e3}s (${reason})`
3025
+ _optionalChain([options, 'access', _111 => _111.onNotice, 'optionalCall', _112 => _112(
3026
+ `[watch] run snapshot request failed; retrying snapshot polling (${reason})`
2651
3027
  )]);
2652
3028
  outageNoticeSent = true;
2653
3029
  }
@@ -2661,77 +3037,63 @@ async function* watchRunEvents(options) {
2661
3037
  continue;
2662
3038
  }
2663
3039
  if (outageNoticeSent) {
2664
- _optionalChain([options, 'access', _71 => _71.onNotice, 'optionalCall', _72 => _72("[watch] run snapshot polling recovered")]);
3040
+ _optionalChain([options, 'access', _113 => _113.onNotice, 'optionalCall', _114 => _114("[watch] run snapshot polling recovered")]);
2665
3041
  outageNoticeSent = false;
2666
3042
  }
2667
3043
  consecutiveFailures = 0;
3044
+ if (terminalStatus) {
3045
+ await _optionalChain([options, 'access', _115 => _115.terminalStatus, 'optionalAccess', _116 => _116.onStatus, 'call', _117 => _117(terminalStatus, snapshot.status)]);
3046
+ }
2668
3047
  const diff = diffPlayRunStreamEvents({
2669
3048
  streamId,
2670
3049
  snapshot,
2671
3050
  previous
2672
3051
  });
2673
- previous = diff.next;
2674
- for (const event of diff.events) {
2675
- yield event;
2676
- }
2677
- if (isTerminalPlayRunLiveStatus(snapshot.status)) {
2678
- return;
2679
- }
2680
- const remaining = Math.max(
2681
- 0,
2682
- pollIntervalMs - (Date.now() - pollStartedAt)
2683
- );
2684
- if (!await waitForNextPoll(remaining, signal)) {
2685
- return;
2686
- }
2687
- }
2688
- }
2689
-
2690
- // ../play-runtime/runtime-environment.ts
2691
- var PLAY_RUNTIME_ENVIRONMENTS = ["preview"];
2692
- var PLAY_RUNTIME_NAMESPACE_PATTERN = /^[a-z][a-z0-9-]{0,30}$/;
2693
- var PLAY_RUNTIME_SANDBOX_PLACEMENT_POLICY_PATTERN = /^[a-z][a-z0-9_]*@[1-9][0-9]*$/;
2694
- function normalizePlayRuntimeNamespace(value) {
2695
- if (typeof value !== "string") return null;
2696
- const normalized = value.trim();
2697
- return PLAY_RUNTIME_NAMESPACE_PATTERN.test(normalized) ? normalized : null;
2698
- }
2699
- function normalizePlayRuntimeSandboxPlacementPolicy(value) {
2700
- if (typeof value !== "string") return null;
2701
- const normalized = value.trim();
2702
- return PLAY_RUNTIME_SANDBOX_PLACEMENT_POLICY_PATTERN.test(normalized) ? normalized : null;
2703
- }
2704
- function normalizePlayRuntimeSelection(value) {
2705
- if (!value || typeof value !== "object" || Array.isArray(value)) return null;
2706
- const record = value;
2707
- if (Object.keys(record).some(
2708
- (key) => key !== "environment" && key !== "namespace" && key !== "backend" && key !== "sandboxPlacementPolicy"
2709
- ) || record.environment !== "preview") {
2710
- return null;
2711
- }
2712
- const namespace = normalizePlayRuntimeNamespace(record.namespace);
2713
- if (!namespace) return null;
2714
- const sandboxPlacementPolicy = record.sandboxPlacementPolicy === void 0 ? void 0 : normalizePlayRuntimeSandboxPlacementPolicy(
2715
- record.sandboxPlacementPolicy
2716
- );
2717
- if (record.sandboxPlacementPolicy !== void 0 && sandboxPlacementPolicy === null) {
2718
- return null;
2719
- }
2720
- if (record.backend !== void 0 && record.backend !== _chunkS6R3OX7Bjs.PLAY_RUNTIME_BACKENDS.daytona && record.backend !== _chunkS6R3OX7Bjs.PLAY_RUNTIME_BACKENDS.modal) {
2721
- return null;
3052
+ previous = diff.next;
3053
+ for (const event of diff.events) {
3054
+ yield event;
3055
+ }
3056
+ if (isTerminalPlayRunLiveStatus(snapshot.status)) {
3057
+ return;
3058
+ }
3059
+ const remaining = Math.max(
3060
+ 0,
3061
+ pollIntervalMs - (Date.now() - pollStartedAt)
3062
+ );
3063
+ if (!await waitForNextPoll(remaining, signal)) {
3064
+ return;
3065
+ }
2722
3066
  }
2723
- return {
2724
- environment: "preview",
2725
- namespace,
2726
- ...record.backend === void 0 ? {} : { backend: record.backend },
2727
- ...sandboxPlacementPolicy ? { sandboxPlacementPolicy } : {}
2728
- };
2729
- }
2730
- function normalizePlayRuntimeEnvironment(value) {
2731
- return typeof value === "string" && PLAY_RUNTIME_ENVIRONMENTS.includes(value) ? value : null;
2732
3067
  }
2733
3068
 
2734
3069
  // src/client.ts
3070
+ function invalidToolDiscoveryResponse() {
3071
+ return new (0, _chunkPPDBRJRWjs.DeeplineError)(
3072
+ "The server returned an invalid tool discovery response.",
3073
+ 502,
3074
+ "INVALID_TOOL_DISCOVERY_RESPONSE"
3075
+ );
3076
+ }
3077
+ function readToolCategorySummaries(value) {
3078
+ if (!Array.isArray(value)) throw invalidToolDiscoveryResponse();
3079
+ const seen = /* @__PURE__ */ new Set();
3080
+ return value.map((item) => {
3081
+ if (!item || typeof item !== "object" || !("name" in item) || typeof item.name !== "string" || !item.name.trim() || seen.has(item.name) || !("count" in item) || typeof item.count !== "number" || !Number.isSafeInteger(item.count) || item.count < 0) {
3082
+ throw invalidToolDiscoveryResponse();
3083
+ }
3084
+ seen.add(item.name);
3085
+ return { name: item.name, count: item.count };
3086
+ });
3087
+ }
3088
+ function summarizeToolCategories(tools) {
3089
+ const counts = /* @__PURE__ */ new Map();
3090
+ for (const tool of tools) {
3091
+ for (const category of _nullishCoalesce(tool.categories, () => ( []))) {
3092
+ counts.set(category, (_nullishCoalesce(counts.get(category), () => ( 0))) + 1);
3093
+ }
3094
+ }
3095
+ return [...counts].map(([name, count]) => ({ name, count })).sort((a, b) => b.count - a.count || a.name.localeCompare(b.name));
3096
+ }
2735
3097
  var MAX_NOTIFICATION_GROUP_CREATE_TARGETS = 50;
2736
3098
  function parseNotificationGroupTarget(value) {
2737
3099
  const normalized = value.trim();
@@ -2744,7 +3106,7 @@ function parseNotificationGroupTarget(value) {
2744
3106
  }
2745
3107
  return { kind: "email", email };
2746
3108
  }
2747
- const slack = _optionalChain([/^slack:(.+)$/i, 'access', _73 => _73.exec, 'call', _74 => _74(normalized), 'optionalAccess', _75 => _75[1], 'optionalAccess', _76 => _76.trim, 'call', _77 => _77()]);
3109
+ const slack = _optionalChain([/^slack:(.+)$/i, 'access', _118 => _118.exec, 'call', _119 => _119(normalized), 'optionalAccess', _120 => _120[1], 'optionalAccess', _121 => _121.trim, 'call', _122 => _122()]);
2748
3110
  if (!slack) {
2749
3111
  const provider = normalized.split(":", 1)[0] || normalized;
2750
3112
  throw new Error(
@@ -2752,7 +3114,7 @@ function parseNotificationGroupTarget(value) {
2752
3114
  );
2753
3115
  }
2754
3116
  const member = /^member:([UW][A-Z0-9]{8,})$/i.exec(slack);
2755
- if (_optionalChain([member, 'optionalAccess', _78 => _78[1]])) {
3117
+ if (_optionalChain([member, 'optionalAccess', _123 => _123[1]])) {
2756
3118
  return { kind: "slack", memberId: member[1].toUpperCase() };
2757
3119
  }
2758
3120
  if (slack.toLowerCase().startsWith("member:")) {
@@ -2776,170 +3138,26 @@ var COMPILE_MANIFEST_RETRY_DELAYS_MS = [250, 1e3];
2776
3138
  var REGISTER_PLAY_ARTIFACTS_COMPILE_CONCURRENCY = 3;
2777
3139
  var REGISTER_PLAY_ARTIFACTS_MAX_BATCH_COUNT = 3;
2778
3140
  var REGISTER_PLAY_ARTIFACTS_MAX_BATCH_BYTES = 25e5;
2779
- function normalizePlayRunIntegrationMode(value) {
2780
- if (value === "live" || value === "eval_stub" || value === "fixture") {
2781
- return value;
2782
- }
2783
- return void 0;
2784
- }
2785
- function resolvePlayRunIntegrationMode(request, env) {
2786
- return normalizePlayRunIntegrationMode(
2787
- _nullishCoalesce(request.integrationMode, () => ( env.DEEPLINE_EVAL_INTEGRATION_MODE))
2788
- );
2789
- }
2790
- function resolvePlayRunRuntimeSelection(request, env) {
2791
- if (request.runtime !== void 0) {
2792
- const runtime = normalizePlayRuntimeSelection(request.runtime);
2793
- if (!runtime) {
2794
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
2795
- 'runtime must be { environment: "preview", namespace, backend?: "daytona" | "modal", sandboxPlacementPolicy?: "policy_name@1" } with namespace matching ^[a-z][a-z0-9-]{0,30}$.',
2796
- void 0,
2797
- "INVALID_RUNTIME_SELECTION"
2798
- );
2799
- }
2800
- return runtime;
2801
- }
2802
- const configured = _optionalChain([env, 'access', _79 => _79.DEEPLINE_RUNTIME_ENVIRONMENT, 'optionalAccess', _80 => _80.trim, 'call', _81 => _81()]);
2803
- const configuredNamespace = _optionalChain([env, 'access', _82 => _82.DEEPLINE_RUNTIME_NAMESPACE, 'optionalAccess', _83 => _83.trim, 'call', _84 => _84()]);
2804
- const configuredToken = _optionalChain([env, 'access', _85 => _85.DEEPLINE_RUNTIME_ENVIRONMENT_TOKEN, 'optionalAccess', _86 => _86.trim, 'call', _87 => _87()]);
2805
- const configuredPlacementPolicy = _optionalChain([env, 'access', _88 => _88.DEEPLINE_RUNTIME_SANDBOX_PLACEMENT_POLICY, 'optionalAccess', _89 => _89.trim, 'call', _90 => _90()]);
2806
- if (!configured) {
2807
- if (configuredNamespace || configuredToken || configuredPlacementPolicy) {
2808
- const present = [];
2809
- if (configuredNamespace) present.push("DEEPLINE_RUNTIME_NAMESPACE");
2810
- if (configuredToken) present.push("DEEPLINE_RUNTIME_ENVIRONMENT_TOKEN");
2811
- if (configuredPlacementPolicy) {
2812
- present.push("DEEPLINE_RUNTIME_SANDBOX_PLACEMENT_POLICY");
2813
- }
2814
- const isPlural = present.length > 1;
2815
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
2816
- [
2817
- `Incomplete play runtime selection: ${present.join(" and ")} ${isPlural ? "are" : "is"} set but DEEPLINE_RUNTIME_ENVIRONMENT is not.`,
2818
- "Preview routing requires DEEPLINE_RUNTIME_ENVIRONMENT=preview together with DEEPLINE_RUNTIME_NAMESPACE; the token alone authorizes nothing.",
2819
- `If you did not export ${isPlural ? "these" : "this"} yourself, ${isPlural ? "they were" : "it was"} most likely auto-loaded from a .env or .env.local in the current directory (bun loads those automatically, and in a git worktree .env.local is usually a symlink to the main checkout).`,
2820
- `To run against the app-native runtime, clear ${isPlural ? "them" : "it"} for this command: ${present.map((name) => `${name}=`).join(" ")} <your deepline command>`
2821
- ].join("\n"),
2822
- void 0,
2823
- "INVALID_RUNTIME_ENVIRONMENT"
2824
- );
2825
- }
2826
- return void 0;
2827
- }
2828
- const environment = normalizePlayRuntimeEnvironment(configured);
2829
- if (!environment) {
2830
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
2831
- `DEEPLINE_RUNTIME_ENVIRONMENT supports only explicit preview selection. Received "${configured}". Omit it to use the app-native runtime.`,
2832
- void 0,
2833
- "INVALID_RUNTIME_ENVIRONMENT"
2834
- );
2835
- }
2836
- const namespace = normalizePlayRuntimeNamespace(configuredNamespace);
2837
- if (!namespace) {
2838
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
2839
- "DEEPLINE_RUNTIME_NAMESPACE is required for preview and must match ^[a-z][a-z0-9-]{0,30}$.",
2840
- void 0,
2841
- "INVALID_RUNTIME_NAMESPACE"
2842
- );
2843
- }
2844
- const configuredBackendValue = _optionalChain([env, 'access', _91 => _91.DEEPLINE_PLAY_RUNNER_BACKEND, 'optionalAccess', _92 => _92.trim, 'call', _93 => _93()]);
2845
- const configuredBackend = configuredBackendValue === "daytona" || configuredBackendValue === "modal" ? configuredBackendValue : void 0;
2846
- if (configuredBackendValue && !configuredBackend) {
2847
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
2848
- `DEEPLINE_PLAY_RUNNER_BACKEND must be daytona or modal for preview runtime selection. Received "${configuredBackendValue}".`,
2849
- void 0,
2850
- "INVALID_RUNTIME_BACKEND"
2851
- );
2852
- }
2853
- if (configuredPlacementPolicy && !normalizePlayRuntimeSandboxPlacementPolicy(configuredPlacementPolicy)) {
2854
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
2855
- `DEEPLINE_RUNTIME_SANDBOX_PLACEMENT_POLICY must be a versioned placement policy id such as daytona_only@1. Received "${configuredPlacementPolicy}".`,
2856
- void 0,
2857
- "INVALID_RUNTIME_SANDBOX_PLACEMENT_POLICY"
2858
- );
2859
- }
2860
- return {
2861
- environment,
2862
- namespace,
2863
- ...configuredBackend ? { backend: configuredBackend } : {},
2864
- ...configuredPlacementPolicy ? { sandboxPlacementPolicy: configuredPlacementPolicy } : {}
2865
- };
2866
- }
2867
- function resolveStartPlayRunRequest(request, env) {
2868
- const integrationMode = resolvePlayRunIntegrationMode(request, env);
2869
- const testPolicyOverrides = _nullishCoalesce(request.testPolicyOverrides, () => ( parseEnvTestPolicyOverrides(env)));
2870
- const runtime = resolvePlayRunRuntimeSelection(request, env);
2871
- const resolved = { ...request };
2872
- delete resolved.integrationMode;
2873
- delete resolved.runtime;
2874
- delete resolved.testPolicyOverrides;
2875
- if (integrationMode) resolved.integrationMode = integrationMode;
2876
- if (runtime) resolved.runtime = runtime;
2877
- if (testPolicyOverrides) resolved.testPolicyOverrides = testPolicyOverrides;
2878
- return { request: resolved, runtime };
2879
- }
2880
- function runtimeSelectionHeaders(runtime, env) {
2881
- if (!runtime) return void 0;
2882
- const token = _optionalChain([env, 'access', _94 => _94.DEEPLINE_RUNTIME_ENVIRONMENT_TOKEN, 'optionalAccess', _95 => _95.trim, 'call', _96 => _96()]);
2883
- if (!token) {
2884
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
2885
- "DEEPLINE_RUNTIME_ENVIRONMENT_TOKEN is required for explicit preview runtime selection.",
2886
- void 0,
2887
- "RUNTIME_ENVIRONMENT_TOKEN_REQUIRED"
2888
- );
2889
- }
2890
- const receivers = _optionalChain([env, 'access', _97 => _97.DEEPLINE_RUNTIME_RETAINED_PIPELINE_RECEIVERS, 'optionalAccess', _98 => _98.trim, 'call', _99 => _99()]);
2891
- return {
2892
- [_chunkFJCIUF34js.RUNTIME_ENVIRONMENT_TOKEN_HEADER]: token,
2893
- ...receivers ? { [_chunkFJCIUF34js.RETAINED_PIPELINE_RECEIVERS_HEADER]: receivers } : {}
2894
- };
2895
- }
2896
3141
  function isolatedCiRuntimeEventReadHeaders(env) {
2897
- const schema = _optionalChain([env, 'access', _100 => _100.DEEPLINE_RUNTIME_SCHEDULER_SCHEMA, 'optionalAccess', _101 => _101.trim, 'call', _102 => _102()]);
2898
- if (_optionalChain([env, 'access', _103 => _103.DEEPLINE_SYNTHETIC_RUN, 'optionalAccess', _104 => _104.trim, 'call', _105 => _105()]) !== "1" || !schema || !/^fly_absurd_pr_\d+_\d+(?:_\d+)?$/.test(schema)) {
3142
+ const schema = _optionalChain([env, 'access', _124 => _124.DEEPLINE_RUNTIME_SCHEDULER_SCHEMA, 'optionalAccess', _125 => _125.trim, 'call', _126 => _126()]);
3143
+ if (_optionalChain([env, 'access', _127 => _127.DEEPLINE_SYNTHETIC_RUN, 'optionalAccess', _128 => _128.trim, 'call', _129 => _129()]) !== "1" || !schema || !/^fly_absurd_pr_\d+_\d+(?:_\d+)?$/.test(schema)) {
2899
3144
  return void 0;
2900
3145
  }
2901
- const token = _optionalChain([env, 'access', _106 => _106.DEEPLINE_INTERNAL_TOKEN, 'optionalAccess', _107 => _107.trim, 'call', _108 => _108()]);
3146
+ const token = _optionalChain([env, 'access', _130 => _130.DEEPLINE_INTERNAL_TOKEN, 'optionalAccess', _131 => _131.trim, 'call', _132 => _132()]);
2902
3147
  if (!token) {
2903
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
3148
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
2904
3149
  "DEEPLINE_INTERNAL_TOKEN is required for isolated CI runtime event reads.",
2905
3150
  void 0,
2906
3151
  "RUNTIME_EVENT_INTERNAL_TOKEN_REQUIRED"
2907
3152
  );
2908
3153
  }
2909
- return { [_chunkFJCIUF34js.COORDINATOR_INTERNAL_TOKEN_HEADER]: token };
2910
- }
2911
- function normalizeTestPolicyOverrides(value, source) {
2912
- if (value && typeof value === "object" && !Array.isArray(value)) {
2913
- return value;
2914
- }
2915
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
2916
- `${source} must be a JSON object.`,
2917
- void 0,
2918
- "INVALID_TEST_POLICY_OVERRIDES"
2919
- );
2920
- }
2921
- function parseEnvTestPolicyOverrides(env) {
2922
- const raw = env.DEEPLINE_TEST_POLICY_OVERRIDES;
2923
- const trimmed = _optionalChain([raw, 'optionalAccess', _109 => _109.trim, 'call', _110 => _110()]);
2924
- if (!trimmed) return void 0;
2925
- let parsed;
2926
- try {
2927
- parsed = JSON.parse(trimmed);
2928
- } catch (error) {
2929
- const detail = error instanceof Error ? ` ${error.message}` : "";
2930
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
2931
- `DEEPLINE_TEST_POLICY_OVERRIDES must be valid JSON.${detail}`,
2932
- void 0,
2933
- "INVALID_TEST_POLICY_OVERRIDES"
2934
- );
2935
- }
2936
- return normalizeTestPolicyOverrides(parsed, "DEEPLINE_TEST_POLICY_OVERRIDES");
3154
+ return { [_chunkFVLNYDI4js.COORDINATOR_INTERNAL_TOKEN_HEADER]: token };
2937
3155
  }
2938
3156
  function sleep(ms) {
2939
3157
  return new Promise((resolve) => setTimeout(resolve, ms));
2940
3158
  }
2941
3159
  function isTransientCompileManifestError(error) {
2942
- if (error instanceof _chunk7P5AA3SNjs.DeeplineError && typeof error.statusCode === "number") {
3160
+ if (error instanceof _chunkPPDBRJRWjs.DeeplineError && typeof error.statusCode === "number") {
2943
3161
  return error.statusCode === 408 || error.statusCode === 425 || error.statusCode === 499 || error.statusCode >= 500 && error.statusCode < 600;
2944
3162
  }
2945
3163
  const message = error instanceof Error ? error.message : String(error);
@@ -2948,9 +3166,9 @@ function isTransientCompileManifestError(error) {
2948
3166
  );
2949
3167
  }
2950
3168
  function requireCompileManifestResponse(response, playName) {
2951
- const compilerManifest = _optionalChain([response, 'optionalAccess', _111 => _111.compilerManifest]);
3169
+ const compilerManifest = _optionalChain([response, 'optionalAccess', _133 => _133.compilerManifest]);
2952
3170
  if (!compilerManifest || typeof compilerManifest !== "object" || Array.isArray(compilerManifest)) {
2953
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
3171
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
2954
3172
  `Compile manifest response did not include compilerManifest for ${playName}.`,
2955
3173
  502,
2956
3174
  "API_RESPONSE_INVALID",
@@ -3000,7 +3218,7 @@ function chunkRegisterPlayArtifacts(artifacts) {
3000
3218
  }
3001
3219
  function searchParams(options) {
3002
3220
  const params = new URLSearchParams();
3003
- params.set("q", _nullishCoalesce(_optionalChain([options, 'access', _112 => _112.query, 'optionalAccess', _113 => _113.trim, 'call', _114 => _114()]), () => ( "")));
3221
+ params.set("q", _nullishCoalesce(_optionalChain([options, 'access', _134 => _134.query, 'optionalAccess', _135 => _135.trim, 'call', _136 => _136()]), () => ( "")));
3004
3222
  params.set(
3005
3223
  "include_search_debug",
3006
3224
  options.includeSearchDebug ? "true" : "false"
@@ -3010,13 +3228,13 @@ function searchParams(options) {
3010
3228
  if (options.offset !== void 0) {
3011
3229
  params.set("offset", String(options.offset));
3012
3230
  }
3013
- if (_optionalChain([options, 'access', _115 => _115.categories, 'optionalAccess', _116 => _116.trim, 'call', _117 => _117()])) {
3231
+ if (_optionalChain([options, 'access', _137 => _137.categories, 'optionalAccess', _138 => _138.trim, 'call', _139 => _139()])) {
3014
3232
  params.set("categories", options.categories.trim());
3015
3233
  }
3016
- if (_optionalChain([options, 'access', _118 => _118.searchTerms, 'optionalAccess', _119 => _119.trim, 'call', _120 => _120()])) {
3234
+ if (_optionalChain([options, 'access', _140 => _140.searchTerms, 'optionalAccess', _141 => _141.trim, 'call', _142 => _142()])) {
3017
3235
  params.set("search_terms", options.searchTerms.trim());
3018
3236
  }
3019
- if (_optionalChain([options, 'access', _121 => _121.task, 'optionalAccess', _122 => _122.trim, 'call', _123 => _123()])) params.set("task", options.task.trim());
3237
+ if (_optionalChain([options, 'access', _143 => _143.task, 'optionalAccess', _144 => _144.trim, 'call', _145 => _145()])) params.set("task", options.task.trim());
3020
3238
  return params;
3021
3239
  }
3022
3240
  var RUNS_FAILED_LOG_LIMIT = 20;
@@ -3042,7 +3260,7 @@ var MONITOR_JOB_RECONCILIATION_STATES = [
3042
3260
  "partial",
3043
3261
  "mismatched"
3044
3262
  ];
3045
- function isRecord2(value) {
3263
+ function isRecord3(value) {
3046
3264
  return Boolean(value && typeof value === "object" && !Array.isArray(value));
3047
3265
  }
3048
3266
  function isPrebuiltPlayDescription(play) {
@@ -3053,33 +3271,6 @@ function preferPrebuiltPlayDescriptions(plays) {
3053
3271
  (left, right) => Number(right.play.pinned) - Number(left.play.pinned) || Number(isPrebuiltPlayDescription(right.play)) - Number(isPrebuiltPlayDescription(left.play)) || left.index - right.index
3054
3272
  ).map(({ play }) => play);
3055
3273
  }
3056
- function normalizePlayStatus(raw) {
3057
- const runPackage = _chunkUHNDVD3Pjs.isPlayRunPackage.call(void 0, raw) ? raw : _chunkUHNDVD3Pjs.isPlayRunPackage.call(void 0, raw.package) ? raw.package : null;
3058
- const packageRun = _optionalChain([runPackage, 'optionalAccess', _124 => _124.run]);
3059
- const rawStatus = typeof raw.status === "string" ? raw.status : typeof _optionalChain([packageRun, 'optionalAccess', _125 => _125.status]) === "string" ? packageRun.status : null;
3060
- const status = _chunkUHNDVD3Pjs.decodePlayRunPublicStatus.call(void 0, rawStatus);
3061
- if (!status) {
3062
- throw new Error(
3063
- `Invalid play run lifecycle status in API response: ${JSON.stringify(rawStatus)}.`
3064
- );
3065
- }
3066
- const runId = typeof raw.runId === "string" ? raw.runId : typeof raw.workflowId === "string" ? raw.workflowId : _nullishCoalesce(_optionalChain([packageRun, 'optionalAccess', _126 => _126.id]), () => ( ""));
3067
- const legacyOverview = _nullishCoalesce(_optionalChain([runPackage, 'optionalAccess', _127 => _127.overview]), () => ( raw.overview));
3068
- const runStatus = _nullishCoalesce(_optionalChain([runPackage, 'optionalAccess', _128 => _128.runStatus]), () => ( raw.runStatus));
3069
- return {
3070
- ...raw,
3071
- runId,
3072
- ...isRecord2(legacyOverview) ? {
3073
- overview: legacyOverview
3074
- } : {},
3075
- ...isRecord2(runStatus) ? { runStatus } : {},
3076
- ...runPackage ? {
3077
- package: runPackage,
3078
- outputs: runPackage.outputs
3079
- } : {},
3080
- status
3081
- };
3082
- }
3083
3274
  function readStringArray(value) {
3084
3275
  return Array.isArray(value) ? value.filter((line) => typeof line === "string") : [];
3085
3276
  }
@@ -3091,7 +3282,7 @@ function playLiveRunStatus(event) {
3091
3282
  return null;
3092
3283
  }
3093
3284
  const payload = getPlayLiveEventPayload(event);
3094
- return _nullishCoalesce(_chunkUHNDVD3Pjs.decodePlayRunPublicStatus.call(void 0, payload.status), () => ( (_chunkUHNDVD3Pjs.isPlayRunPackage.call(void 0, payload) ? _chunkUHNDVD3Pjs.decodePlayRunPublicStatus.call(void 0, payload.run.status) : null)));
3285
+ return _nullishCoalesce(_chunk2H4EY7KHjs.decodePlayRunPublicStatus.call(void 0, payload.status), () => ( (_chunk2H4EY7KHjs.isPlayRunPackage.call(void 0, payload) ? _chunk2H4EY7KHjs.decodePlayRunPublicStatus.call(void 0, payload.run.status) : null)));
3095
3286
  }
3096
3287
  function appendPlayLiveLogLines(state, payload) {
3097
3288
  const lines = readStringArray(payload.lines);
@@ -3123,9 +3314,9 @@ function updatePlayLiveStatusState(state, event) {
3123
3314
  if (event.type !== "play.run.snapshot" && event.type !== "play.run.status" && event.type !== "play.run.final_status") {
3124
3315
  return null;
3125
3316
  }
3126
- const runId = typeof payload.runId === "string" && payload.runId ? payload.runId : _chunkUHNDVD3Pjs.isPlayRunPackage.call(void 0, payload) ? payload.run.id : state.runId;
3317
+ const runId = typeof payload.runId === "string" && payload.runId ? payload.runId : _chunk2H4EY7KHjs.isPlayRunPackage.call(void 0, payload) ? payload.run.id : state.runId;
3127
3318
  const status = _nullishCoalesce(playLiveRunStatus(event), () => ( state.status));
3128
- const progressPayload = isRecord2(payload.progress) ? payload.progress : {};
3319
+ const progressPayload = isRecord3(payload.progress) ? payload.progress : {};
3129
3320
  if (event.type === "play.run.final_status" && state.logs.length === 0 && state.lastLogSeq === 0) {
3130
3321
  const payloadLogs = readStringArray(payload.logs);
3131
3322
  const progressLogs = readStringArray(progressPayload.logs);
@@ -3136,7 +3327,7 @@ function updatePlayLiveStatusState(state, event) {
3136
3327
  }
3137
3328
  if ("result" in payload) {
3138
3329
  state.result = payload.result;
3139
- } else if (_chunkUHNDVD3Pjs.isPlayRunPackage.call(void 0, payload)) {
3330
+ } else if (_chunk2H4EY7KHjs.isPlayRunPackage.call(void 0, payload)) {
3140
3331
  state.result = payload;
3141
3332
  }
3142
3333
  if (typeof payload.error === "string" && payload.error.trim()) {
@@ -3149,7 +3340,7 @@ function updatePlayLiveStatusState(state, event) {
3149
3340
  ...payload,
3150
3341
  runId,
3151
3342
  status,
3152
- ..._chunkUHNDVD3Pjs.isPlayRunPackage.call(void 0, payload) ? { package: payload, outputs: payload.outputs } : {},
3343
+ ..._chunk2H4EY7KHjs.isPlayRunPackage.call(void 0, payload) ? { package: payload, outputs: payload.outputs } : {},
3153
3344
  progress: {
3154
3345
  ...progressRecord,
3155
3346
  status: typeof progressRecord.status === "string" ? progressRecord.status : status,
@@ -3167,9 +3358,9 @@ function playRunResultFromStatus(status, startedAt, fallbackRunId) {
3167
3358
  runId: status.runId || fallbackRunId,
3168
3359
  result: _nullishCoalesce(status.package, () => ( status.result)),
3169
3360
  ...status.package ? { package: status.package } : {},
3170
- logs: _nullishCoalesce(_optionalChain([status, 'access', _129 => _129.progress, 'optionalAccess', _130 => _130.logs]), () => ( [])),
3361
+ logs: _nullishCoalesce(_optionalChain([status, 'access', _146 => _146.progress, 'optionalAccess', _147 => _147.logs]), () => ( [])),
3171
3362
  durationMs: Date.now() - startedAt,
3172
- error: _nullishCoalesce(_optionalChain([status, 'access', _131 => _131.progress, 'optionalAccess', _132 => _132.error]), () => ( (status.status !== "completed" ? status.status : void 0)))
3363
+ error: _nullishCoalesce(_optionalChain([status, 'access', _148 => _148.progress, 'optionalAccess', _149 => _149.error]), () => ( (status.status !== "completed" ? status.status : void 0)))
3173
3364
  };
3174
3365
  }
3175
3366
  var DeeplineClient = (_class = class _DeeplineClient {
@@ -3177,6 +3368,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
3177
3368
 
3178
3369
 
3179
3370
 
3371
+
3180
3372
  /** Canonical run lifecycle namespace backed by `/api/v2/runs`. */
3181
3373
 
3182
3374
  /** Current mutable customer database namespace backed by `/api/v2/db/query`. */
@@ -3197,13 +3389,14 @@ var DeeplineClient = (_class = class _DeeplineClient {
3197
3389
  * @throws {@link ConfigError} if no API key can be resolved from any source.
3198
3390
  */
3199
3391
  constructor(options) {
3200
- this.config = _chunkFJCIUF34js.resolveConfig.call(void 0, options);
3392
+ this.config = _chunkFVLNYDI4js.resolveConfig.call(void 0, options);
3201
3393
  this.environment = _nullishCoalesce(this.config.environment, () => ( process.env));
3202
- this.http = new (0, _chunkFJCIUF34js.HttpClient)(this.config);
3394
+ this.http = new (0, _chunkFVLNYDI4js.HttpClient)(this.config);
3395
+ this.playClient = new PlayClient(this.http, this.environment);
3203
3396
  this.toolCalls = new ToolCalls(
3204
3397
  this.http,
3205
3398
  this.config.timeout,
3206
- _optionalChain([options, 'optionalAccess', _133 => _133.timeout])
3399
+ _optionalChain([options, 'optionalAccess', _150 => _150.timeout])
3207
3400
  );
3208
3401
  this.runs = {
3209
3402
  getReceipts: (runId, options2) => this.getRunReceipts(runId, options2),
@@ -3240,7 +3433,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
3240
3433
  };
3241
3434
  this.db = {
3242
3435
  query: (input) => this.queryDb(input),
3243
- planQuery: (input) => planCustomerDbQuery(input)
3436
+ planQuery: (input) => planCustomerDbQuery(input, this.config.maxRetries)
3244
3437
  };
3245
3438
  this.billing = {
3246
3439
  quote: (input) => this.http.post("/api/v2/billing/quote", input),
@@ -3266,7 +3459,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
3266
3459
  {},
3267
3460
  {
3268
3461
  "Idempotency-Key": requireBillingIdempotencyKey(
3269
- _nullishCoalesce(_optionalChain([options2, 'optionalAccess', _134 => _134.idempotencyKey]), () => ( globalThis.crypto.randomUUID()))
3462
+ _nullishCoalesce(_optionalChain([options2, 'optionalAccess', _151 => _151.idempotencyKey]), () => ( globalThis.crypto.randomUUID()))
3270
3463
  )
3271
3464
  }
3272
3465
  ),
@@ -3285,7 +3478,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
3285
3478
  available: (toolIdOrOptions, options2) => this.getMonitorsAvailable(toolIdOrOptions, options2),
3286
3479
  check: (definition) => this.checkMonitor(definition),
3287
3480
  deploy: (definition, options2) => this.deployMonitor(definition, options2),
3288
- sync: (definition, options2) => _optionalChain([options2, 'optionalAccess', _135 => _135.dryRun]) ? this.deployMonitor(definition, { dryRun: true }) : this.syncScalarMonitor(definition, options2),
3481
+ sync: (definition, options2) => _optionalChain([options2, 'optionalAccess', _152 => _152.dryRun]) ? this.deployMonitor(definition, { dryRun: true }) : this.syncScalarMonitor(definition, options2),
3289
3482
  list: (options2) => this.listMonitors(options2),
3290
3483
  get: (key) => this.getMonitor(key),
3291
3484
  test: (key, payload, options2) => this.testMonitorWebhook(key, payload, options2),
@@ -3294,13 +3487,13 @@ var DeeplineClient = (_class = class _DeeplineClient {
3294
3487
  update: (key, patch) => this.updateMonitor(key, patch),
3295
3488
  delete: (key, options2) => this.deleteMonitor(key, options2),
3296
3489
  reactivate: (key, options2) => this.reactivateMonitor(key, options2),
3297
- start: (key, options2) => _optionalChain([options2, 'optionalAccess', _136 => _136.dryRun]) ? this.submitMonitorBatch({
3490
+ start: (key, options2) => _optionalChain([options2, 'optionalAccess', _153 => _153.dryRun]) ? this.submitMonitorBatch({
3298
3491
  kind: "reactivate",
3299
3492
  scope: { kind: "keys", monitorKeys: [key] },
3300
3493
  dryRun: true,
3301
3494
  idempotencyKey: _nullishCoalesce(options2.idempotencyKey, () => ( this.monitorJobIdempotencyKey(`start-${key}`)))
3302
3495
  }) : this.submitScalarMonitorLifecycle(key, "start", options2),
3303
- stop: (key, options2) => _optionalChain([options2, 'optionalAccess', _137 => _137.dryRun]) ? this.submitMonitorBatch({
3496
+ stop: (key, options2) => _optionalChain([options2, 'optionalAccess', _154 => _154.dryRun]) ? this.submitMonitorBatch({
3304
3497
  kind: "deactivate",
3305
3498
  scope: { kind: "keys", monitorKeys: [key] },
3306
3499
  dryRun: true,
@@ -3404,26 +3597,65 @@ var DeeplineClient = (_class = class _DeeplineClient {
3404
3597
  */
3405
3598
  async listTools(options) {
3406
3599
  const params = new URLSearchParams();
3407
- if (_optionalChain([options, 'optionalAccess', _138 => _138.categories, 'optionalAccess', _139 => _139.trim, 'call', _140 => _140()])) {
3600
+ if (_optionalChain([options, 'optionalAccess', _155 => _155.categories, 'optionalAccess', _156 => _156.trim, 'call', _157 => _157()])) {
3408
3601
  params.set("categories", options.categories.trim());
3409
3602
  }
3410
- if (_optionalChain([options, 'optionalAccess', _141 => _141.tags, 'optionalAccess', _142 => _142.trim, 'call', _143 => _143()])) {
3603
+ if (_optionalChain([options, 'optionalAccess', _158 => _158.tags, 'optionalAccess', _159 => _159.trim, 'call', _160 => _160()])) {
3411
3604
  params.set("tags", options.tags.trim());
3412
3605
  }
3413
- if (_optionalChain([options, 'optionalAccess', _144 => _144.grep, 'optionalAccess', _145 => _145.trim, 'call', _146 => _146()])) {
3606
+ if (_optionalChain([options, 'optionalAccess', _161 => _161.grep, 'optionalAccess', _162 => _162.trim, 'call', _163 => _163()])) {
3414
3607
  params.set("grep", options.grep.trim());
3415
3608
  params.set("grep_mode", _nullishCoalesce(options.grepMode, () => ( "all")));
3416
3609
  }
3417
- params.set("compact", _optionalChain([options, 'optionalAccess', _147 => _147.compact]) === true ? "true" : "false");
3610
+ params.set("compact", _optionalChain([options, 'optionalAccess', _164 => _164.compact]) === true ? "true" : "false");
3418
3611
  const suffix = params.toString() ? `?${params.toString()}` : "";
3419
3612
  const res = await this.http.get(
3420
3613
  `/api/v2/tools${suffix}`
3421
3614
  );
3422
3615
  return res.tools;
3423
3616
  }
3617
+ /** List category counts without downloading tool definitions. */
3618
+ async listToolCategories() {
3619
+ const response = await this.http.get(
3620
+ "/api/v2/tools?view=categories&compact=true"
3621
+ );
3622
+ if (response.view === "categories") {
3623
+ return readToolCategorySummaries(response.categories);
3624
+ }
3625
+ if (response.view === void 0 && Array.isArray(response.tools)) {
3626
+ return summarizeToolCategories(response.tools);
3627
+ }
3628
+ throw invalidToolDiscoveryResponse();
3629
+ }
3630
+ /** Read one complete category and its live category counts in one request. */
3631
+ async listToolsInCategory(category, options) {
3632
+ const normalizedCategory = category.trim();
3633
+ if (!normalizedCategory || category.includes(",")) {
3634
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
3635
+ "Provide one non-empty tool category.",
3636
+ 400,
3637
+ "INVALID_TOOL_CATEGORY"
3638
+ );
3639
+ }
3640
+ const params = new URLSearchParams({
3641
+ view: "category",
3642
+ categories: normalizedCategory,
3643
+ compact: _optionalChain([options, 'optionalAccess', _165 => _165.compact]) === true ? "true" : "false"
3644
+ });
3645
+ const response = await this.http.get(
3646
+ `/api/v2/tools?${params}`
3647
+ );
3648
+ if (!Array.isArray(response.tools) || response.view !== "category" && response.view !== void 0) {
3649
+ throw invalidToolDiscoveryResponse();
3650
+ }
3651
+ return {
3652
+ tools: response.tools,
3653
+ categories: response.view === "category" ? readToolCategorySummaries(response.categories) : await this.listToolCategories()
3654
+ };
3655
+ }
3424
3656
  /** List discoverable providers without requiring a local plugin catalog. */
3425
3657
  async listProviders(options) {
3426
- const suffix = _optionalChain([options, 'optionalAccess', _148 => _148.changed]) ? "?changed=true" : "";
3658
+ const suffix = _optionalChain([options, 'optionalAccess', _166 => _166.changed]) ? "?changed=true" : "";
3427
3659
  const res = await this.http.get(
3428
3660
  `/api/v2/tools/providers${suffix}`
3429
3661
  );
@@ -3454,8 +3686,8 @@ var DeeplineClient = (_class = class _DeeplineClient {
3454
3686
  */
3455
3687
  async search(options = {}) {
3456
3688
  const params = searchParams(options);
3457
- if (_optionalChain([options, 'access', _149 => _149.types, 'optionalAccess', _150 => _150.length])) params.set("types", options.types.join(","));
3458
- if (_optionalChain([options, 'access', _151 => _151.exclude, 'optionalAccess', _152 => _152.length])) {
3689
+ if (_optionalChain([options, 'access', _167 => _167.types, 'optionalAccess', _168 => _168.length])) params.set("types", options.types.join(","));
3690
+ if (_optionalChain([options, 'access', _169 => _169.exclude, 'optionalAccess', _170 => _170.length])) {
3459
3691
  params.set("exclude", options.exclude.join(","));
3460
3692
  }
3461
3693
  return this.http.get(`/api/v2/search?${params.toString()}`);
@@ -3477,7 +3709,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
3477
3709
  * ```
3478
3710
  */
3479
3711
  async getTool(toolId, options) {
3480
- if (_optionalChain([options, 'optionalAccess', _153 => _153.cliInvocationId]) !== void 0) {
3712
+ if (_optionalChain([options, 'optionalAccess', _171 => _171.cliInvocationId]) !== void 0) {
3481
3713
  validateCliInvocationId(options.cliInvocationId);
3482
3714
  }
3483
3715
  return this.http.request(
@@ -3490,7 +3722,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
3490
3722
  retryApiErrors: true,
3491
3723
  headers: {
3492
3724
  "x-deepline-tool-meta-only": "1",
3493
- ..._optionalChain([options, 'optionalAccess', _154 => _154.cliInvocationId]) !== void 0 ? { "x-deepline-cli-invocation-id": options.cliInvocationId } : {}
3725
+ ..._optionalChain([options, 'optionalAccess', _172 => _172.cliInvocationId]) !== void 0 ? { "x-deepline-cli-invocation-id": options.cliInvocationId } : {}
3494
3726
  }
3495
3727
  }
3496
3728
  );
@@ -3559,7 +3791,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
3559
3791
  return this.executeTool(toolId, input, options);
3560
3792
  }
3561
3793
  async queryDb(input) {
3562
- return queryCustomerDatabase(this.http, input);
3794
+ return queryCustomerDatabase(this.http, input, this.config.maxRetries);
3563
3795
  }
3564
3796
  /**
3565
3797
  * Run a bounded SQL query against the current mutable customer database.
@@ -3581,7 +3813,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
3581
3813
  return this.http.post(
3582
3814
  "/api/v2/ingestion/repair",
3583
3815
  {
3584
- ..._optionalChain([input, 'optionalAccess', _155 => _155.provider]) ? { provider: input.provider } : {}
3816
+ ..._optionalChain([input, 'optionalAccess', _173 => _173.provider]) ? { provider: input.provider } : {}
3585
3817
  }
3586
3818
  );
3587
3819
  }
@@ -3625,13 +3857,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
3625
3857
  * ```
3626
3858
  */
3627
3859
  async startPlayRun(request, options) {
3628
- const resolved = resolveStartPlayRunRequest(request, this.environment);
3629
- return _chunkUHNDVD3Pjs.startPlayRun.call(void 0,
3630
- this.http,
3631
- resolved.request,
3632
- runtimeSelectionHeaders(resolved.runtime, this.environment),
3633
- _optionalChain([options, 'optionalAccess', _156 => _156.onSubmission])
3634
- );
3860
+ return this.playClient.startPlayRun(request, options);
3635
3861
  }
3636
3862
  /**
3637
3863
  * Prepare a tenant-scoped start intent without executing it. Its stream
@@ -3639,10 +3865,10 @@ var DeeplineClient = (_class = class _DeeplineClient {
3639
3865
  */
3640
3866
  async preparePlayRunAdmission(request, options) {
3641
3867
  const resolved = resolveStartPlayRunRequest(request, this.environment);
3642
- const prepared = await _chunkUHNDVD3Pjs.preparePlayRunAdmission.call(void 0,
3868
+ const prepared = await _chunk2H4EY7KHjs.preparePlayRunAdmission.call(void 0,
3643
3869
  this.http,
3644
3870
  resolved.request,
3645
- _optionalChain([options, 'optionalAccess', _157 => _157.onSubmission])
3871
+ _optionalChain([options, 'optionalAccess', _174 => _174.onSubmission])
3646
3872
  );
3647
3873
  const bodyJson = JSON.stringify(prepared.body);
3648
3874
  const headers = runtimeSelectionHeaders(resolved.runtime, this.environment);
@@ -3652,30 +3878,35 @@ var DeeplineClient = (_class = class _DeeplineClient {
3652
3878
  ...prepared,
3653
3879
  async *startStream(streamOptions) {
3654
3880
  if (submitted && !prepared.supportsCallerIntent) {
3655
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
3881
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
3656
3882
  "This server has not enabled caller-owned admission recovery. Do not retry an ambiguous start.",
3657
3883
  409,
3658
3884
  "PLAY_RUN_ADMISSION_RECOVERY_UNSUPPORTED"
3659
3885
  );
3660
3886
  }
3661
3887
  if (submitted) {
3662
- await _chunkUHNDVD3Pjs.preparePlayRunAdmission.call(void 0,
3888
+ await _chunk2H4EY7KHjs.preparePlayRunAdmission.call(void 0,
3663
3889
  http,
3664
3890
  JSON.parse(bodyJson)
3665
3891
  );
3666
3892
  }
3667
3893
  submitted = true;
3668
- for await (const event of http.streamSse(
3669
- _chunkUHNDVD3Pjs.PLAY_RUN_START_STREAM_PATH,
3670
- {
3894
+ const streamPath = _optionalChain([options, 'optionalAccess', _175 => _175.cliAdmission]) ? _chunk2H4EY7KHjs.CLI_PLAY_RUN_START_STREAM_PATH : _chunk2H4EY7KHjs.PLAY_RUN_START_STREAM_PATH;
3895
+ try {
3896
+ for await (const event of http.streamSse(streamPath, {
3671
3897
  method: "POST",
3672
3898
  body: JSON.parse(bodyJson),
3673
3899
  headers,
3674
- signal: _optionalChain([streamOptions, 'optionalAccess', _158 => _158.signal]),
3900
+ signal: _optionalChain([streamOptions, 'optionalAccess', _176 => _176.signal]),
3675
3901
  exactUrlOnly: true
3902
+ })) {
3903
+ if (event.scope === "play") yield event;
3676
3904
  }
3677
- )) {
3678
- if (event.scope === "play") yield event;
3905
+ } catch (error) {
3906
+ if (_optionalChain([options, 'optionalAccess', _177 => _177.cliAdmission]) && error instanceof _chunkPPDBRJRWjs.DeeplineError && (error.statusCode === 404 || error.statusCode === 405)) {
3907
+ throw new (0, _chunk2H4EY7KHjs.CliPlayAdmissionUnsupportedError)(error.statusCode);
3908
+ }
3909
+ throw error;
3679
3910
  }
3680
3911
  }
3681
3912
  };
@@ -3695,7 +3926,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
3695
3926
  */
3696
3927
  async *startPlayRunStream(request, options) {
3697
3928
  const prepared = await this.preparePlayRunAdmission(request, options);
3698
- yield* prepared.startStream({ signal: _optionalChain([options, 'optionalAccess', _159 => _159.signal]) });
3929
+ yield* prepared.startStream({ signal: _optionalChain([options, 'optionalAccess', _178 => _178.signal]) });
3699
3930
  }
3700
3931
  /**
3701
3932
  * Register a bundled play artifact.
@@ -3848,7 +4079,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
3848
4079
  compilerManifest,
3849
4080
  ...input.input ? { input: input.input } : {},
3850
4081
  ...input.inputFile ? { inputFile: input.inputFile } : {},
3851
- ..._optionalChain([input, 'access', _160 => _160.packagedFiles, 'optionalAccess', _161 => _161.length]) ? { packagedFiles: input.packagedFiles } : {},
4082
+ ..._optionalChain([input, 'access', _179 => _179.packagedFiles, 'optionalAccess', _180 => _180.length]) ? { packagedFiles: input.packagedFiles } : {},
3852
4083
  ...input.force ? { force: true } : {},
3853
4084
  ...input.forceToolRefresh ? { forceToolRefresh: true } : {}
3854
4085
  });
@@ -3878,29 +4109,29 @@ var DeeplineClient = (_class = class _DeeplineClient {
3878
4109
  * ```
3879
4110
  */
3880
4111
  async submitPlay(code, csvPath, name, options) {
3881
- const runtimeInput = _optionalChain([options, 'optionalAccess', _162 => _162.input]) ? { ...options.input } : {};
4112
+ const runtimeInput = _optionalChain([options, 'optionalAccess', _181 => _181.input]) ? { ...options.input } : {};
3882
4113
  if (csvPath) {
3883
4114
  runtimeInput.file = csvPath;
3884
4115
  }
3885
- const sourceCode = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _163 => _163.sourceCode]), () => ( code));
3886
- const artifact = _optionalChain([options, 'optionalAccess', _164 => _164.artifact]);
3887
- if (!_optionalChain([name, 'optionalAccess', _165 => _165.trim, 'call', _166 => _166()])) {
4116
+ const sourceCode = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _182 => _182.sourceCode]), () => ( code));
4117
+ const artifact = _optionalChain([options, 'optionalAccess', _183 => _183.artifact]);
4118
+ if (!_optionalChain([name, 'optionalAccess', _184 => _184.trim, 'call', _185 => _185()])) {
3888
4119
  throw new Error("submitPlay requires a play name.");
3889
4120
  }
3890
4121
  if (!artifact) {
3891
4122
  throw new Error("submitPlay requires a bundled play artifact.");
3892
4123
  }
3893
- const compilerManifest = await _asyncNullishCoalesce(await _asyncOptionalChain([options, 'optionalAccess', async _167 => _167.compilerManifest]), async () => ( await this.compilePlayManifest({
4124
+ const compilerManifest = await _asyncNullishCoalesce(await _asyncOptionalChain([options, 'optionalAccess', async _186 => _186.compilerManifest]), async () => ( await this.compilePlayManifest({
3894
4125
  name,
3895
4126
  sourceCode,
3896
- sourceFiles: _optionalChain([options, 'optionalAccess', _168 => _168.sourceFiles]),
4127
+ sourceFiles: _optionalChain([options, 'optionalAccess', _187 => _187.sourceFiles]),
3897
4128
  artifact
3898
4129
  })));
3899
4130
  const registeredArtifact = await this.registerPlayArtifact({
3900
4131
  name,
3901
4132
  sourceCode,
3902
- sourceFiles: _optionalChain([options, 'optionalAccess', _169 => _169.sourceFiles]),
3903
- description: _optionalChain([options, 'optionalAccess', _170 => _170.description]),
4133
+ sourceFiles: _optionalChain([options, 'optionalAccess', _188 => _188.sourceFiles]),
4134
+ description: _optionalChain([options, 'optionalAccess', _189 => _189.description]),
3904
4135
  artifact,
3905
4136
  compilerManifest,
3906
4137
  publish: false
@@ -3914,17 +4145,17 @@ var DeeplineClient = (_class = class _DeeplineClient {
3914
4145
  name,
3915
4146
  artifactStorageKey: registeredArtifact.artifactStorageKey,
3916
4147
  sourceCode,
3917
- description: _optionalChain([options, 'optionalAccess', _171 => _171.description]),
4148
+ description: _optionalChain([options, 'optionalAccess', _190 => _190.description]),
3918
4149
  staticPipeline: _nullishCoalesce(registeredArtifact.staticPipeline, () => ( null)),
3919
4150
  artifactHash: typeof artifact.artifactHash === "string" ? artifact.artifactHash : void 0,
3920
4151
  graphHash: typeof artifact.graphHash === "string" ? artifact.graphHash : void 0,
3921
4152
  runtimeArtifact: artifact,
3922
4153
  compilerManifest,
3923
4154
  ...Object.keys(runtimeInput).length > 0 ? { input: runtimeInput } : {},
3924
- ..._optionalChain([options, 'optionalAccess', _172 => _172.inputFile]) ? { inputFile: options.inputFile } : {},
3925
- ..._optionalChain([options, 'optionalAccess', _173 => _173.packagedFiles, 'optionalAccess', _174 => _174.length]) ? { packagedFiles: options.packagedFiles } : {},
3926
- ..._optionalChain([options, 'optionalAccess', _175 => _175.force]) ? { force: true } : {},
3927
- ..._optionalChain([options, 'optionalAccess', _176 => _176.forceToolRefresh]) ? { forceToolRefresh: true } : {}
4155
+ ..._optionalChain([options, 'optionalAccess', _191 => _191.inputFile]) ? { inputFile: options.inputFile } : {},
4156
+ ..._optionalChain([options, 'optionalAccess', _192 => _192.packagedFiles, 'optionalAccess', _193 => _193.length]) ? { packagedFiles: options.packagedFiles } : {},
4157
+ ..._optionalChain([options, 'optionalAccess', _194 => _194.force]) ? { force: true } : {},
4158
+ ..._optionalChain([options, 'optionalAccess', _195 => _195.forceToolRefresh]) ? { forceToolRefresh: true } : {}
3928
4159
  });
3929
4160
  }
3930
4161
  /**
@@ -3952,7 +4183,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
3952
4183
  * ```
3953
4184
  */
3954
4185
  async stagePlayFiles(files) {
3955
- return _chunkUHNDVD3Pjs.stagePlayFiles.call(void 0, this.http, files);
4186
+ return _chunk2H4EY7KHjs.stagePlayFiles.call(void 0, this.http, files);
3956
4187
  }
3957
4188
  /**
3958
4189
  * Mint short-lived presigned upload targets for staged play files.
@@ -3961,7 +4192,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
3961
4192
  * For other files, the server returns a presigned PUT URL. Upload the file body to that URL.
3962
4193
  */
3963
4194
  async mintStagedPlayFileUploads(files) {
3964
- return _chunkUHNDVD3Pjs.mintStagedPlayFileUploads.call(void 0, this.http, files);
4195
+ return _chunk2H4EY7KHjs.mintStagedPlayFileUploads.call(void 0, this.http, files);
3965
4196
  }
3966
4197
  /**
3967
4198
  * Resolve staged play files by content hash without uploading bytes.
@@ -3991,27 +4222,35 @@ var DeeplineClient = (_class = class _DeeplineClient {
3991
4222
  * ```
3992
4223
  */
3993
4224
  async getPlayStatus(workflowId, options) {
3994
- const params = new URLSearchParams();
3995
- if (_optionalChain([options, 'optionalAccess', _177 => _177.billing]) === false) {
3996
- params.set("billing", "false");
3997
- }
3998
- if (_optionalChain([options, 'optionalAccess', _178 => _178.full]) === true) {
3999
- params.set("full", "true");
4000
- }
4001
- const query = params.size > 0 ? `?${params.toString()}` : "";
4002
- const response = await this.http.get(
4003
- `/api/v2/runs/${encodeURIComponent(workflowId)}${query}`
4004
- );
4005
- return normalizePlayStatus(response);
4225
+ return this.playClient.getPlayStatus(workflowId, options);
4006
4226
  }
4007
- /** Poll authenticated run snapshots every two seconds and emit changed events. */
4227
+ /**
4228
+ * Poll authenticated snapshots and emit changes; `deferLogs` delays terminal logs; `omitTerminalLogs` skips them.
4229
+ */
4008
4230
  async *watchRunEvents(workflowId, options) {
4009
4231
  for await (const event of watchRunEvents({
4010
4232
  http: this.http,
4011
4233
  runId: workflowId,
4012
- signal: _optionalChain([options, 'optionalAccess', _179 => _179.signal]),
4013
- onNotice: _optionalChain([options, 'optionalAccess', _180 => _180.onNotice]),
4014
- onRetry: _optionalChain([options, 'optionalAccess', _181 => _181.onRetry])
4234
+ signal: _optionalChain([options, 'optionalAccess', _196 => _196.signal]),
4235
+ onNotice: _optionalChain([options, 'optionalAccess', _197 => _197.onNotice]),
4236
+ onRetry: _optionalChain([options, 'optionalAccess', _198 => _198.onRetry]),
4237
+ deferLogs: _optionalChain([options, 'optionalAccess', _199 => _199.deferLogs]),
4238
+ omitTerminalLogs: _optionalChain([options, 'optionalAccess', _200 => _200.omitTerminalLogs]),
4239
+ onPoll: _optionalChain([options, 'optionalAccess', _201 => _201.onPoll]),
4240
+ ..._optionalChain([options, 'optionalAccess', _202 => _202.terminalStatus]) ? {
4241
+ terminalStatus: {
4242
+ ...options.terminalStatus,
4243
+ onStatus: async (raw, expectedStatus) => {
4244
+ const status = normalizePlayStatus(raw);
4245
+ if (status.runId !== workflowId || status.status !== expectedStatus) {
4246
+ throw new Error(
4247
+ `Run watch returned a mismatched terminal status for ${workflowId}.`
4248
+ );
4249
+ }
4250
+ await _optionalChain([options, 'access', _203 => _203.terminalStatus, 'optionalAccess', _204 => _204.onStatus, 'call', _205 => _205(status)]);
4251
+ }
4252
+ }
4253
+ } : {}
4015
4254
  })) {
4016
4255
  yield event;
4017
4256
  }
@@ -4023,12 +4262,12 @@ var DeeplineClient = (_class = class _DeeplineClient {
4023
4262
  * @deprecated Use `watchRunEvents` for ordinary run watching.
4024
4263
  */
4025
4264
  async *streamPlayRunEvents(workflowId, options) {
4026
- const headers = _optionalChain([options, 'optionalAccess', _182 => _182.lastEventId]) && options.lastEventId.trim() ? { "Last-Event-ID": options.lastEventId.trim() } : void 0;
4265
+ const headers = _optionalChain([options, 'optionalAccess', _206 => _206.lastEventId]) && options.lastEventId.trim() ? { "Last-Event-ID": options.lastEventId.trim() } : void 0;
4027
4266
  const params = new URLSearchParams();
4028
- params.set("mode", _nullishCoalesce(_optionalChain([options, 'optionalAccess', _183 => _183.mode]), () => ( "cli")));
4267
+ params.set("mode", _nullishCoalesce(_optionalChain([options, 'optionalAccess', _207 => _207.mode]), () => ( "cli")));
4029
4268
  for await (const event of this.http.streamSse(
4030
4269
  `/api/v2/runs/${encodeURIComponent(workflowId)}/tail?${params.toString()}`,
4031
- { signal: _optionalChain([options, 'optionalAccess', _184 => _184.signal]), headers }
4270
+ { signal: _optionalChain([options, 'optionalAccess', _208 => _208.signal]), headers }
4032
4271
  )) {
4033
4272
  if (event.scope === "play") {
4034
4273
  yield event;
@@ -4044,31 +4283,38 @@ var DeeplineClient = (_class = class _DeeplineClient {
4044
4283
  */
4045
4284
  async *observeRunEvents(runId, options) {
4046
4285
  yield* this.watchRunEvents(runId, {
4047
- signal: _optionalChain([options, 'optionalAccess', _185 => _185.signal]),
4048
- onNotice: _optionalChain([options, 'optionalAccess', _186 => _186.onNotice])
4286
+ signal: _optionalChain([options, 'optionalAccess', _209 => _209.signal]),
4287
+ onNotice: _optionalChain([options, 'optionalAccess', _210 => _210.onNotice])
4049
4288
  });
4050
4289
  }
4051
4290
  /** Poll snapshots to terminal status and return the durable package. */
4052
4291
  async watchRunToTerminal(runId, options) {
4053
4292
  let terminalObserved = false;
4293
+ let terminalStatus = null;
4054
4294
  for await (const event of this.watchRunEvents(runId, {
4055
- signal: _optionalChain([options, 'optionalAccess', _187 => _187.signal]),
4056
- onNotice: _optionalChain([options, 'optionalAccess', _188 => _188.onNotice]),
4057
- onRetry: _nullishCoalesce(_optionalChain([options, 'optionalAccess', _189 => _189.onRetry]), () => ( _optionalChain([options, 'optionalAccess', _190 => _190.onReconnect])))
4295
+ signal: _optionalChain([options, 'optionalAccess', _211 => _211.signal]),
4296
+ onNotice: _optionalChain([options, 'optionalAccess', _212 => _212.onNotice]),
4297
+ onRetry: _nullishCoalesce(_optionalChain([options, 'optionalAccess', _213 => _213.onRetry]), () => ( _optionalChain([options, 'optionalAccess', _214 => _214.onReconnect]))),
4298
+ terminalStatus: {
4299
+ runStatus: true,
4300
+ onStatus: (status) => {
4301
+ terminalStatus = status;
4302
+ }
4303
+ }
4058
4304
  })) {
4059
- _optionalChain([options, 'optionalAccess', _191 => _191.onEvent, 'optionalCall', _192 => _192(event)]);
4060
- if (_chunkUHNDVD3Pjs.isTerminalPlayRunLifecycleStatus.call(void 0, playLiveRunStatus(event))) {
4305
+ _optionalChain([options, 'optionalAccess', _215 => _215.onEvent, 'optionalCall', _216 => _216(event)]);
4306
+ if (_chunk2H4EY7KHjs.isTerminalPlayRunLifecycleStatus.call(void 0, playLiveRunStatus(event))) {
4061
4307
  terminalObserved = true;
4062
4308
  }
4063
4309
  }
4064
- if (_optionalChain([options, 'optionalAccess', _193 => _193.signal, 'optionalAccess', _194 => _194.aborted])) {
4065
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)("Run watch aborted.", void 0, "ABORTED");
4310
+ if (_optionalChain([options, 'optionalAccess', _217 => _217.signal, 'optionalAccess', _218 => _218.aborted])) {
4311
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)("Run watch aborted.", void 0, "ABORTED");
4066
4312
  }
4067
- const refreshed = await this.getRunStatus(runId);
4068
- if (terminalObserved || _chunkUHNDVD3Pjs.isTerminalPlayRunLifecycleStatus.call(void 0, refreshed.status)) {
4313
+ const refreshed = await _asyncNullishCoalesce(terminalStatus, async () => ( await this.getRunStatus(runId)));
4314
+ if (terminalObserved || _chunk2H4EY7KHjs.isTerminalPlayRunLifecycleStatus.call(void 0, refreshed.status)) {
4069
4315
  return refreshed;
4070
4316
  }
4071
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
4317
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
4072
4318
  `Run watch for ${runId} ended before a terminal status.`,
4073
4319
  void 0,
4074
4320
  "PLAY_WATCH_ENDED"
@@ -4101,10 +4347,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
4101
4347
  * ```
4102
4348
  */
4103
4349
  async cancelPlay(workflowId) {
4104
- await this.http.request(
4105
- `/api/v2/runs/${encodeURIComponent(workflowId)}/stop`,
4106
- { method: "POST" }
4107
- );
4350
+ return this.playClient.cancelPlay(workflowId);
4108
4351
  }
4109
4352
  /**
4110
4353
  * Stop a running play execution, including open HITL waits.
@@ -4113,10 +4356,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
4113
4356
  * @param options.reason - Optional audit/debug reason
4114
4357
  */
4115
4358
  async stopPlay(workflowId, options) {
4116
- return this.http.post(
4117
- `/api/v2/runs/${encodeURIComponent(workflowId)}/stop`,
4118
- _optionalChain([options, 'optionalAccess', _195 => _195.reason]) ? { reason: options.reason } : {}
4119
- );
4359
+ return this.playClient.stopPlay(workflowId, options);
4120
4360
  }
4121
4361
  /**
4122
4362
  * List recent runs for a named play.
@@ -4136,11 +4376,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
4136
4376
  * ```
4137
4377
  */
4138
4378
  async listPlayRuns(playName) {
4139
- const encodedName = encodeURIComponent(playName);
4140
- const response = await this.http.get(
4141
- `/api/v2/plays/${encodedName}/runs`
4142
- );
4143
- return _nullishCoalesce(response.runs, () => ( []));
4379
+ return this.playClient.listPlayRuns(playName);
4144
4380
  }
4145
4381
  // ---------------------------------------------------------------------------
4146
4382
  // Legacy workflows (double-shipped). Thin pass-throughs over the live cloud
@@ -4151,7 +4387,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
4151
4387
  /** List the org's workflows. `GET /api/v2/workflows`. */
4152
4388
  async listWorkflows(options) {
4153
4389
  const params = new URLSearchParams();
4154
- if (typeof _optionalChain([options, 'optionalAccess', _196 => _196.limit]) === "number") {
4390
+ if (typeof _optionalChain([options, 'optionalAccess', _219 => _219.limit]) === "number") {
4155
4391
  params.set("limit", String(options.limit));
4156
4392
  }
4157
4393
  const query = params.size > 0 ? `?${params.toString()}` : "";
@@ -4204,7 +4440,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
4204
4440
  /** List a workflow's runs. `GET /api/v2/workflows/:id/runs`. */
4205
4441
  async listWorkflowRuns(id, options) {
4206
4442
  const params = new URLSearchParams();
4207
- if (typeof _optionalChain([options, 'optionalAccess', _197 => _197.limit]) === "number") {
4443
+ if (typeof _optionalChain([options, 'optionalAccess', _220 => _220.limit]) === "number") {
4208
4444
  params.set("limit", String(options.limit));
4209
4445
  }
4210
4446
  const query = params.size > 0 ? `?${params.toString()}` : "";
@@ -4240,10 +4476,10 @@ var DeeplineClient = (_class = class _DeeplineClient {
4240
4476
  */
4241
4477
  async getRunStatus(runId, options) {
4242
4478
  const params = new URLSearchParams();
4243
- if (_optionalChain([options, 'optionalAccess', _198 => _198.full]) === true) {
4479
+ if (_optionalChain([options, 'optionalAccess', _221 => _221.full]) === true) {
4244
4480
  params.set("full", "true");
4245
4481
  }
4246
- if (_optionalChain([options, 'optionalAccess', _199 => _199.configuration]) === true) {
4482
+ if (_optionalChain([options, 'optionalAccess', _222 => _222.configuration]) === true) {
4247
4483
  params.set("include", "configuration");
4248
4484
  }
4249
4485
  const query = params.size > 0 ? `?${params.toString()}` : "";
@@ -4251,15 +4487,15 @@ var DeeplineClient = (_class = class _DeeplineClient {
4251
4487
  `/api/v2/runs/${encodeURIComponent(runId)}${query}`,
4252
4488
  { headers: { "x-deepline-run-status": "1" } }
4253
4489
  );
4254
- if (_optionalChain([options, 'optionalAccess', _200 => _200.configuration]) === true && !Object.hasOwn(response, "contract")) {
4255
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
4490
+ if (_optionalChain([options, 'optionalAccess', _223 => _223.configuration]) === true && !Object.hasOwn(response, "contract")) {
4491
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
4256
4492
  "This server does not support recorded configuration reads.",
4257
4493
  void 0,
4258
4494
  "RUN_CONFIGURATION_UNAVAILABLE"
4259
4495
  );
4260
4496
  }
4261
4497
  const status = normalizePlayStatus(response);
4262
- if (_optionalChain([options, 'optionalAccess', _201 => _201.failedLogs]) !== true || status.status !== "failed") {
4498
+ if (_optionalChain([options, 'optionalAccess', _224 => _224.failedLogs]) !== true || status.status !== "failed") {
4263
4499
  return status;
4264
4500
  }
4265
4501
  const requestedFailedLogLimit = typeof options.failedLogLimit === "number" && Number.isFinite(options.failedLogLimit) ? Math.max(1, Math.floor(options.failedLogLimit)) : RUNS_FAILED_LOG_LIMIT;
@@ -4303,14 +4539,14 @@ var DeeplineClient = (_class = class _DeeplineClient {
4303
4539
  async getRunChildren(parentRunId, options) {
4304
4540
  const launchKey = options.launchKey.trim();
4305
4541
  if (!launchKey) {
4306
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
4542
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
4307
4543
  "runs.children requires a nonempty launchKey.",
4308
4544
  void 0,
4309
4545
  "INVALID_CHILD_RUN_LAUNCH_KEY"
4310
4546
  );
4311
4547
  }
4312
4548
  if (options.limit !== void 0 && (!Number.isInteger(options.limit) || options.limit < 1 || options.limit > 50)) {
4313
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
4549
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
4314
4550
  "runs.children limit must be an integer from 1 to 50.",
4315
4551
  void 0,
4316
4552
  "INVALID_CHILD_RUN_PAGE_LIMIT"
@@ -4348,7 +4584,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
4348
4584
  /** The same tenant-scoped run history searched by the dashboard and CLI. */
4349
4585
  async getRunsHistory(options = {}) {
4350
4586
  const params = new URLSearchParams();
4351
- const search = _optionalChain([options, 'access', _202 => _202.search, 'optionalAccess', _203 => _203.trim, 'call', _204 => _204()]);
4587
+ const search = _optionalChain([options, 'access', _225 => _225.search, 'optionalAccess', _226 => _226.trim, 'call', _227 => _227()]);
4352
4588
  if (search && search.length > 200) {
4353
4589
  throw new Error("Run search must be at most 200 characters.");
4354
4590
  }
@@ -4374,16 +4610,16 @@ var DeeplineClient = (_class = class _DeeplineClient {
4374
4610
  }
4375
4611
  /** Read one run page without discarding server pagination metadata. */
4376
4612
  async listRunsPage(options) {
4377
- const playName = _optionalChain([options, 'access', _205 => _205.play, 'optionalAccess', _206 => _206.trim, 'call', _207 => _207()]);
4613
+ const playName = _optionalChain([options, 'access', _228 => _228.play, 'optionalAccess', _229 => _229.trim, 'call', _230 => _230()]);
4378
4614
  const params = new URLSearchParams();
4379
4615
  if (playName) {
4380
4616
  params.set("play", playName);
4381
4617
  }
4382
- const status = _optionalChain([options, 'access', _208 => _208.status, 'optionalAccess', _209 => _209.trim, 'call', _210 => _210()]);
4618
+ const status = _optionalChain([options, 'access', _231 => _231.status, 'optionalAccess', _232 => _232.trim, 'call', _233 => _233()]);
4383
4619
  if (status) {
4384
4620
  params.set("status", status);
4385
4621
  }
4386
- const node = _optionalChain([options, 'access', _211 => _211.node, 'optionalAccess', _212 => _212.trim, 'call', _213 => _213()]);
4622
+ const node = _optionalChain([options, 'access', _234 => _234.node, 'optionalAccess', _235 => _235.trim, 'call', _236 => _236()]);
4387
4623
  if (node) {
4388
4624
  if (!playName)
4389
4625
  throw new Error("runs.list options.node requires options.play.");
@@ -4457,9 +4693,9 @@ var DeeplineClient = (_class = class _DeeplineClient {
4457
4693
  * A different key starts another rerun.
4458
4694
  */
4459
4695
  async rerun(runId, options) {
4460
- const idempotencyKey = _optionalChain([options, 'optionalAccess', _214 => _214.idempotencyKey, 'optionalAccess', _215 => _215.trim, 'call', _216 => _216()]);
4461
- if (_optionalChain([options, 'optionalAccess', _217 => _217.idempotencyKey]) !== void 0 && !idempotencyKey) {
4462
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
4696
+ const idempotencyKey = _optionalChain([options, 'optionalAccess', _237 => _237.idempotencyKey, 'optionalAccess', _238 => _238.trim, 'call', _239 => _239()]);
4697
+ if (_optionalChain([options, 'optionalAccess', _240 => _240.idempotencyKey]) !== void 0 && !idempotencyKey) {
4698
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
4463
4699
  "runs.rerun idempotencyKey must not be empty.",
4464
4700
  void 0,
4465
4701
  "INVALID_IDEMPOTENCY_KEY"
@@ -4467,7 +4703,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
4467
4703
  }
4468
4704
  return this.http.post(
4469
4705
  `/api/v2/runs/${encodeURIComponent(runId)}/rerun`,
4470
- _optionalChain([options, 'optionalAccess', _218 => _218.inputOverrides]) ? { inputOverrides: options.inputOverrides } : {},
4706
+ _optionalChain([options, 'optionalAccess', _241 => _241.inputOverrides]) ? { inputOverrides: options.inputOverrides } : {},
4471
4707
  { "Idempotency-Key": idempotencyKey || globalThis.crypto.randomUUID() }
4472
4708
  );
4473
4709
  }
@@ -4481,21 +4717,21 @@ var DeeplineClient = (_class = class _DeeplineClient {
4481
4717
  * ```
4482
4718
  */
4483
4719
  async getRunLogs(runId, options) {
4484
- if (_optionalChain([options, 'optionalAccess', _219 => _219.all]) === true && options.failed === true) {
4485
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
4720
+ if (_optionalChain([options, 'optionalAccess', _242 => _242.all]) === true && options.failed === true) {
4721
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
4486
4722
  "runs.logs cannot combine all and failed views.",
4487
4723
  void 0,
4488
4724
  "INVALID_RUN_LOG_VIEW"
4489
4725
  );
4490
4726
  }
4491
- if (_optionalChain([options, 'optionalAccess', _220 => _220.cursor]) !== void 0 && options.failed === true) {
4492
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
4727
+ if (_optionalChain([options, 'optionalAccess', _243 => _243.cursor]) !== void 0 && options.failed === true) {
4728
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
4493
4729
  "runs.logs cannot combine failed with cursor.",
4494
4730
  void 0,
4495
4731
  "INVALID_RUN_LOG_VIEW"
4496
4732
  );
4497
4733
  }
4498
- if (_optionalChain([options, 'optionalAccess', _221 => _221.failed]) === true) {
4734
+ if (_optionalChain([options, 'optionalAccess', _244 => _244.failed]) === true) {
4499
4735
  const requestedLimit = typeof options.limit === "number" && Number.isFinite(options.limit) && options.limit > 0 ? Math.trunc(options.limit) : RUNS_FAILED_LOG_LIMIT;
4500
4736
  const failedLimit = Math.min(RUNS_FAILED_LOG_LIMIT, requestedLimit);
4501
4737
  const page = await this.http.get(
@@ -4520,18 +4756,18 @@ var DeeplineClient = (_class = class _DeeplineClient {
4520
4756
  ...page.logsTruncated ? { logsTruncated: true } : {}
4521
4757
  };
4522
4758
  }
4523
- const beforeSequence = _optionalChain([options, 'optionalAccess', _222 => _222.cursor]) !== void 0 ? parseRunLogsCursor(options.cursor) : null;
4524
- const limit = _optionalChain([options, 'optionalAccess', _223 => _223.all]) ? Number.MAX_SAFE_INTEGER : typeof _optionalChain([options, 'optionalAccess', _224 => _224.limit]) === "number" && Number.isFinite(options.limit) && options.limit > 0 ? Math.trunc(options.limit) : 200;
4759
+ const beforeSequence = _optionalChain([options, 'optionalAccess', _245 => _245.cursor]) !== void 0 ? parseRunLogsCursor(options.cursor) : null;
4760
+ const limit = _optionalChain([options, 'optionalAccess', _246 => _246.all]) ? Number.MAX_SAFE_INTEGER : typeof _optionalChain([options, 'optionalAccess', _247 => _247.limit]) === "number" && Number.isFinite(options.limit) && options.limit > 0 ? Math.trunc(options.limit) : 200;
4525
4761
  const fetchPage = (afterSeq2, pageLimit) => this.http.get(
4526
4762
  `/api/v2/runs/${encodeURIComponent(runId)}/logs?afterSeq=${afterSeq2}&limit=${pageLimit}`,
4527
4763
  { retryApiErrors: true }
4528
4764
  );
4529
4765
  const probe = await fetchPage(0, 1);
4530
4766
  const lastStoredSeq = probe.lastStoredSeq;
4531
- const oldestStoredSeq = _nullishCoalesce(_optionalChain([probe, 'access', _225 => _225.entries, 'access', _226 => _226[0], 'optionalAccess', _227 => _227.seq]), () => ( null));
4767
+ const oldestStoredSeq = _nullishCoalesce(_optionalChain([probe, 'access', _248 => _248.entries, 'access', _249 => _249[0], 'optionalAccess', _250 => _250.seq]), () => ( null));
4532
4768
  const upperSeq = beforeSequence === null ? Number.POSITIVE_INFINITY : Math.min(beforeSequence - 1, lastStoredSeq);
4533
4769
  const windowEndSeq = Math.min(upperSeq, lastStoredSeq);
4534
- let afterSeq = _optionalChain([options, 'optionalAccess', _228 => _228.all]) ? 0 : Math.max(0, windowEndSeq - limit);
4770
+ let afterSeq = _optionalChain([options, 'optionalAccess', _251 => _251.all]) ? 0 : Math.max(0, windowEndSeq - limit);
4535
4771
  const entries = [];
4536
4772
  while (entries.length < limit && afterSeq < upperSeq) {
4537
4773
  const page = await fetchPage(
@@ -4565,7 +4801,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
4565
4801
  hasMore: olderLinesExist,
4566
4802
  nextCursor: olderLinesExist ? encodeRunLogsCursor(firstSequence) : null,
4567
4803
  entries: entries.map((entry) => entry.line),
4568
- view: _optionalChain([options, 'optionalAccess', _229 => _229.all]) ? "all" : "tail",
4804
+ view: _optionalChain([options, 'optionalAccess', _252 => _252.all]) ? "all" : "tail",
4569
4805
  ...probe.logsTruncated ? { logsTruncated: true } : {}
4570
4806
  };
4571
4807
  }
@@ -4639,7 +4875,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
4639
4875
  if (selection !== void 0) {
4640
4876
  const runtime = normalizePlayRuntimeSelection(selection);
4641
4877
  if (!runtime) {
4642
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
4878
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
4643
4879
  "Run event queries require a valid Preview runtime selection.",
4644
4880
  void 0,
4645
4881
  "INVALID_RUNTIME_SELECTION"
@@ -4696,7 +4932,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
4696
4932
  if (options.runtime !== void 0) {
4697
4933
  const runtime = normalizePlayRuntimeSelection(options.runtime);
4698
4934
  if (!runtime) {
4699
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
4935
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
4700
4936
  "runs.searchEvents runtime must be a valid Preview selection.",
4701
4937
  void 0,
4702
4938
  "INVALID_RUNTIME_SELECTION"
@@ -4741,7 +4977,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
4741
4977
  limit: String(_nullishCoalesce(input.limit, () => ( 5e3))),
4742
4978
  offset: String(_nullishCoalesce(input.offset, () => ( 0)))
4743
4979
  });
4744
- if (_optionalChain([input, 'access', _230 => _230.runId, 'optionalAccess', _231 => _231.trim, 'call', _232 => _232()])) {
4980
+ if (_optionalChain([input, 'access', _253 => _253.runId, 'optionalAccess', _254 => _254.trim, 'call', _255 => _255()])) {
4745
4981
  params.set("runId", input.runId.trim());
4746
4982
  }
4747
4983
  if (input.rowMode === "all" || input.rowMode === "live") {
@@ -4751,9 +4987,9 @@ var DeeplineClient = (_class = class _DeeplineClient {
4751
4987
  `/api/v2/plays/${encodeURIComponent(input.playName)}/sheet?${params.toString()}`,
4752
4988
  { signal: input.signal }
4753
4989
  );
4754
- const requestedRunId = _optionalChain([input, 'access', _233 => _233.runId, 'optionalAccess', _234 => _234.trim, 'call', _235 => _235()]) || "";
4990
+ const requestedRunId = _optionalChain([input, 'access', _256 => _256.runId, 'optionalAccess', _257 => _257.trim, 'call', _258 => _258()]) || "";
4755
4991
  if (requestedRunId) {
4756
- const confirmedRunId = _optionalChain([result, 'access', _236 => _236.scope, 'optionalAccess', _237 => _237.kind]) === "run" ? result.scope.runId.trim() : "";
4992
+ const confirmedRunId = _optionalChain([result, 'access', _259 => _259.scope, 'optionalAccess', _260 => _260.kind]) === "run" ? result.scope.runId.trim() : "";
4757
4993
  const foreignRowRunIds = [
4758
4994
  ...new Set(
4759
4995
  result.rows.map(
@@ -4761,8 +4997,8 @@ var DeeplineClient = (_class = class _DeeplineClient {
4761
4997
  ).filter((runId) => runId && runId !== requestedRunId)
4762
4998
  )
4763
4999
  ];
4764
- if (_optionalChain([result, 'access', _238 => _238.scope, 'optionalAccess', _239 => _239.kind]) !== "run" || confirmedRunId !== requestedRunId || foreignRowRunIds.length > 0) {
4765
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
5000
+ if (_optionalChain([result, 'access', _261 => _261.scope, 'optionalAccess', _262 => _262.kind]) !== "run" || confirmedRunId !== requestedRunId || foreignRowRunIds.length > 0) {
5001
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
4766
5002
  `Run-scoped dataset export was not confirmed for ${requestedRunId}; no rows were returned to the caller. Update Deepline, then retry the same export command. Do not rerun the play.`,
4767
5003
  void 0,
4768
5004
  "RUN_EXPORT_SCOPE_MISMATCH",
@@ -4790,7 +5026,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
4790
5026
  async stopRun(runId, options) {
4791
5027
  return this.http.post(
4792
5028
  `/api/v2/runs/${encodeURIComponent(runId)}/stop`,
4793
- _optionalChain([options, 'optionalAccess', _240 => _240.reason]) ? { reason: options.reason } : {}
5029
+ _optionalChain([options, 'optionalAccess', _263 => _263.reason]) ? { reason: options.reason } : {}
4794
5030
  );
4795
5031
  }
4796
5032
  /**
@@ -4808,16 +5044,16 @@ var DeeplineClient = (_class = class _DeeplineClient {
4808
5044
  * The method clears workspace run-slot state without requiring each run ID.
4809
5045
  */
4810
5046
  async stopAllRuns(options) {
4811
- const dryRun = _optionalChain([options, 'optionalAccess', _241 => _241.dryRun]) === true;
5047
+ const dryRun = _optionalChain([options, 'optionalAccess', _264 => _264.dryRun]) === true;
4812
5048
  const result = await this.http.post(
4813
5049
  "/api/v2/runs/stop-all",
4814
5050
  {
4815
- ..._optionalChain([options, 'optionalAccess', _242 => _242.reason]) ? { reason: options.reason } : {},
5051
+ ..._optionalChain([options, 'optionalAccess', _265 => _265.reason]) ? { reason: options.reason } : {},
4816
5052
  ...dryRun ? { dryRun: true } : {}
4817
5053
  }
4818
5054
  );
4819
5055
  if (dryRun && !isStopAllPlayRunsDryRunResult(result)) {
4820
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
5056
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
4821
5057
  "This Deepline server does not support runs stop-all --dry-run and performed a real stop-all. Update the server before using --dry-run.",
4822
5058
  void 0,
4823
5059
  "STOP_ALL_DRY_RUN_UNSUPPORTED"
@@ -4833,7 +5069,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
4833
5069
  * `origin: "owned"` for org-owned plays.
4834
5070
  */
4835
5071
  async listPlays(options) {
4836
- if (!_optionalChain([options, 'optionalAccess', _243 => _243.grep, 'optionalAccess', _244 => _244.trim, 'call', _245 => _245()])) {
5072
+ if (!_optionalChain([options, 'optionalAccess', _266 => _266.grep, 'optionalAccess', _267 => _267.trim, 'call', _268 => _268()])) {
4837
5073
  return (await this.requestPlaysPage(options, false)).plays;
4838
5074
  }
4839
5075
  const plays = [];
@@ -4855,45 +5091,45 @@ var DeeplineClient = (_class = class _DeeplineClient {
4855
5091
  }
4856
5092
  async requestPlaysPage(options, paginateInventory = true) {
4857
5093
  const params = new URLSearchParams();
4858
- if (paginateInventory && !_optionalChain([options, 'optionalAccess', _246 => _246.grep, 'optionalAccess', _247 => _247.trim, 'call', _248 => _248()]))
5094
+ if (paginateInventory && !_optionalChain([options, 'optionalAccess', _269 => _269.grep, 'optionalAccess', _270 => _270.trim, 'call', _271 => _271()]))
4859
5095
  params.set("inventory_paginated", "1");
4860
- if (_optionalChain([options, 'optionalAccess', _249 => _249.origin])) params.set("origin", options.origin);
4861
- if (_optionalChain([options, 'optionalAccess', _250 => _250.categories])) {
5096
+ if (_optionalChain([options, 'optionalAccess', _272 => _272.origin])) params.set("origin", options.origin);
5097
+ if (_optionalChain([options, 'optionalAccess', _273 => _273.categories])) {
4862
5098
  params.set(
4863
5099
  "categories",
4864
5100
  Array.isArray(options.categories) ? options.categories.join(",") : options.categories
4865
5101
  );
4866
5102
  }
4867
- if (_optionalChain([options, 'optionalAccess', _251 => _251.categories]) || _optionalChain([options, 'optionalAccess', _252 => _252.includeToolCategories])) {
5103
+ if (_optionalChain([options, 'optionalAccess', _274 => _274.categories]) || _optionalChain([options, 'optionalAccess', _275 => _275.includeToolCategories])) {
4868
5104
  params.set("include_tool_categories", "1");
4869
5105
  }
4870
- if (_optionalChain([options, 'optionalAccess', _253 => _253.tags])) {
5106
+ if (_optionalChain([options, 'optionalAccess', _276 => _276.tags])) {
4871
5107
  params.set(
4872
5108
  "tags",
4873
5109
  Array.isArray(options.tags) ? options.tags.join(",") : options.tags
4874
5110
  );
4875
5111
  }
4876
- if (_optionalChain([options, 'optionalAccess', _254 => _254.includeArchived])) params.set("include_archived", "1");
4877
- if (_optionalChain([options, 'optionalAccess', _255 => _255.includeCostEstimates])) {
5112
+ if (_optionalChain([options, 'optionalAccess', _277 => _277.includeArchived])) params.set("include_archived", "1");
5113
+ if (_optionalChain([options, 'optionalAccess', _278 => _278.includeCostEstimates])) {
4878
5114
  params.set("include_cost_estimates", "1");
4879
5115
  }
4880
- if (_optionalChain([options, 'optionalAccess', _256 => _256.grep, 'optionalAccess', _257 => _257.trim, 'call', _258 => _258()])) {
5116
+ if (_optionalChain([options, 'optionalAccess', _279 => _279.grep, 'optionalAccess', _280 => _280.trim, 'call', _281 => _281()])) {
4881
5117
  params.set("grep", options.grep.trim());
4882
5118
  params.set("limit", "60");
4883
5119
  }
4884
- if (_optionalChain([options, 'optionalAccess', _259 => _259.limit]) !== void 0) {
5120
+ if (_optionalChain([options, 'optionalAccess', _282 => _282.limit]) !== void 0) {
4885
5121
  if (!Number.isSafeInteger(options.limit) || options.limit < 1) {
4886
5122
  throw new Error("Play page limit must be a positive integer");
4887
5123
  }
4888
5124
  params.set("limit", String(options.limit));
4889
5125
  }
4890
- if (_optionalChain([options, 'optionalAccess', _260 => _260.cursor])) params.set("cursor", options.cursor);
5126
+ if (_optionalChain([options, 'optionalAccess', _283 => _283.cursor])) params.set("cursor", options.cursor);
4891
5127
  const suffix = params.size ? `?${params.toString()}` : "";
4892
5128
  const response = await this.http.get(`/api/v2/plays${suffix}`);
4893
5129
  return {
4894
5130
  plays: _nullishCoalesce(response.plays, () => ( [])),
4895
- cursor: _nullishCoalesce(_nullishCoalesce(_optionalChain([response, 'access', _261 => _261.pagination, 'optionalAccess', _262 => _262.cursor]), () => ( response.cursor)), () => ( null)),
4896
- hasMore: Boolean(_nullishCoalesce(_optionalChain([response, 'access', _263 => _263.pagination, 'optionalAccess', _264 => _264.hasMore]), () => ( response.hasMore)))
5131
+ cursor: _nullishCoalesce(_nullishCoalesce(_optionalChain([response, 'access', _284 => _284.pagination, 'optionalAccess', _285 => _285.cursor]), () => ( response.cursor)), () => ( null)),
5132
+ hasMore: Boolean(_nullishCoalesce(_optionalChain([response, 'access', _286 => _286.pagination, 'optionalAccess', _287 => _287.hasMore]), () => ( response.hasMore)))
4897
5133
  };
4898
5134
  }
4899
5135
  /** Read definition-level settings, independently of code revisions. */
@@ -4950,8 +5186,8 @@ var DeeplineClient = (_class = class _DeeplineClient {
4950
5186
  return this.http.post("/api/v2/integrations/connect", {
4951
5187
  provider: "slack",
4952
5188
  scopes: [...PRODUCT_NOTIFICATION_SLACK_OAUTH_SCOPES],
4953
- ..._optionalChain([options, 'optionalAccess', _265 => _265.successUrl]) ? { success_url: options.successUrl } : {},
4954
- ..._optionalChain([options, 'optionalAccess', _266 => _266.failureUrl]) ? { failure_url: options.failureUrl } : {}
5189
+ ..._optionalChain([options, 'optionalAccess', _288 => _288.successUrl]) ? { success_url: options.successUrl } : {},
5190
+ ..._optionalChain([options, 'optionalAccess', _289 => _289.failureUrl]) ? { failure_url: options.failureUrl } : {}
4955
5191
  });
4956
5192
  }
4957
5193
  /** List Slack channels visible to the connected Deepline Slack app. */
@@ -5026,7 +5262,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
5026
5262
  }
5027
5263
  const targets = input.targets.map(parseNotificationGroupTarget);
5028
5264
  const legacyEvents = _nullishCoalesce(input.legacyEvents, () => ( []));
5029
- const legacyTarget = targets.length === 1 && _optionalChain([targets, 'access', _267 => _267[0], 'optionalAccess', _268 => _268.kind]) === "slack" && legacyEvents.length > 0 ? targets[0] : null;
5265
+ const legacyTarget = targets.length === 1 && _optionalChain([targets, 'access', _290 => _290[0], 'optionalAccess', _291 => _291.kind]) === "slack" && legacyEvents.length > 0 ? targets[0] : null;
5030
5266
  if (legacyEvents.length > 0 && !legacyTarget) {
5031
5267
  throw new Error(
5032
5268
  "--for is supported only by the legacy one-Slack-target form. Create the group first, then add rules in notification configuration."
@@ -5062,7 +5298,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
5062
5298
  const existingGroup = current.configuration.groups.find(
5063
5299
  (candidate) => candidate.name.toLowerCase() === name.toLowerCase()
5064
5300
  );
5065
- const groupKey = _nullishCoalesce(_optionalChain([existingGroup, 'optionalAccess', _269 => _269.groupKey]), () => ( notificationObjectKey("group")));
5301
+ const groupKey = _nullishCoalesce(_optionalChain([existingGroup, 'optionalAccess', _292 => _292.groupKey]), () => ( notificationObjectKey("group")));
5066
5302
  const group = _nullishCoalesce(existingGroup, () => ( {
5067
5303
  groupKey,
5068
5304
  name,
@@ -5281,14 +5517,12 @@ var DeeplineClient = (_class = class _DeeplineClient {
5281
5517
  * ```
5282
5518
  */
5283
5519
  async getPlay(name, options) {
5284
- const encodedName = encodeURIComponent(name);
5285
- const query = _optionalChain([options, 'optionalAccess', _270 => _270.source]) ? `?include=source&revision=${encodeURIComponent(options.source)}` : _optionalChain([options, 'optionalAccess', _271 => _271.guidance]) ? "?include=guidance" : "";
5286
- return this.http.get(`/api/v2/plays/${encodedName}${query}`);
5520
+ return this.playClient.getPlay(name, options);
5287
5521
  }
5288
5522
  /** Read one trigger inventory page without loading run histories. */
5289
5523
  async listPlayTriggerInventory(options) {
5290
5524
  const params = new URLSearchParams({ view: "inventory" });
5291
- if (_optionalChain([options, 'optionalAccess', _272 => _272.cursor])) params.set("cursor", options.cursor);
5525
+ if (_optionalChain([options, 'optionalAccess', _293 => _293.cursor])) params.set("cursor", options.cursor);
5292
5526
  return this.http.get(`/api/v2/plays/triggers?${params}`);
5293
5527
  }
5294
5528
  /** Read one trigger's recent runs, with an explicit partial-history flag. */
@@ -5297,7 +5531,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
5297
5531
  view: "history",
5298
5532
  binding_id: bindingId
5299
5533
  });
5300
- if (_optionalChain([options, 'optionalAccess', _273 => _273.limit]) !== void 0)
5534
+ if (_optionalChain([options, 'optionalAccess', _294 => _294.limit]) !== void 0)
5301
5535
  params.set("history_limit", String(options.limit));
5302
5536
  return this.http.get(`/api/v2/plays/triggers?${params}`);
5303
5537
  }
@@ -5329,11 +5563,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
5329
5563
  * the play definition or revisions.
5330
5564
  */
5331
5565
  async clearPlayHistory(name, request = {}) {
5332
- const encodedName = encodeURIComponent(name);
5333
- return this.http.post(
5334
- `/api/v2/plays/${encodedName}/history/clear`,
5335
- request
5336
- );
5566
+ return this.playClient.clearPlayHistory(name, request);
5337
5567
  }
5338
5568
  /**
5339
5569
  * List saved versions for a named play.
@@ -5345,12 +5575,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
5345
5575
  * @returns Version list (newest first)
5346
5576
  */
5347
5577
  async listPlayVersions(name, options) {
5348
- const encodedName = encodeURIComponent(name);
5349
- const suffix = _optionalChain([options, 'optionalAccess', _274 => _274.full]) ? "?full=true" : "";
5350
- const response = await this.http.get(
5351
- `/api/v2/plays/${encodedName}/versions${suffix}`
5352
- );
5353
- return _nullishCoalesce(response.versions, () => ( []));
5578
+ return this.playClient.listPlayVersions(name, options);
5354
5579
  }
5355
5580
  /**
5356
5581
  * Make a play revision live.
@@ -5371,11 +5596,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
5371
5596
  * ```
5372
5597
  */
5373
5598
  async publishPlayVersion(name, request = {}) {
5374
- const encodedName = encodeURIComponent(name);
5375
- return this.http.post(
5376
- `/api/v2/plays/${encodedName}/live`,
5377
- request
5378
- );
5599
+ return this.playClient.publishPlayVersion(name, request);
5379
5600
  }
5380
5601
  /**
5381
5602
  * Move an org-owned play to Trash. This disables its active triggers while
@@ -5498,14 +5719,14 @@ var DeeplineClient = (_class = class _DeeplineClient {
5498
5719
  */
5499
5720
  async runPlay(code, csvPath, name, options) {
5500
5721
  const { workflowId } = await this.submitPlay(code, csvPath, name, {
5501
- input: _optionalChain([options, 'optionalAccess', _275 => _275.input]),
5502
- sourceCode: _optionalChain([options, 'optionalAccess', _276 => _276.sourceCode]),
5503
- artifact: _optionalChain([options, 'optionalAccess', _277 => _277.artifact]),
5504
- compilerManifest: _optionalChain([options, 'optionalAccess', _278 => _278.compilerManifest]),
5505
- inputFile: _optionalChain([options, 'optionalAccess', _279 => _279.inputFile]),
5506
- packagedFiles: _optionalChain([options, 'optionalAccess', _280 => _280.packagedFiles]),
5507
- force: _optionalChain([options, 'optionalAccess', _281 => _281.force]),
5508
- forceToolRefresh: _optionalChain([options, 'optionalAccess', _282 => _282.forceToolRefresh])
5722
+ input: _optionalChain([options, 'optionalAccess', _295 => _295.input]),
5723
+ sourceCode: _optionalChain([options, 'optionalAccess', _296 => _296.sourceCode]),
5724
+ artifact: _optionalChain([options, 'optionalAccess', _297 => _297.artifact]),
5725
+ compilerManifest: _optionalChain([options, 'optionalAccess', _298 => _298.compilerManifest]),
5726
+ inputFile: _optionalChain([options, 'optionalAccess', _299 => _299.inputFile]),
5727
+ packagedFiles: _optionalChain([options, 'optionalAccess', _300 => _300.packagedFiles]),
5728
+ force: _optionalChain([options, 'optionalAccess', _301 => _301.force]),
5729
+ forceToolRefresh: _optionalChain([options, 'optionalAccess', _302 => _302.forceToolRefresh])
5509
5730
  });
5510
5731
  const start = Date.now();
5511
5732
  const state = {
@@ -5516,7 +5737,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
5516
5737
  latest: null
5517
5738
  };
5518
5739
  let terminalObserved = null;
5519
- if (_optionalChain([options, 'optionalAccess', _283 => _283.signal, 'optionalAccess', _284 => _284.aborted])) {
5740
+ if (_optionalChain([options, 'optionalAccess', _303 => _303.signal, 'optionalAccess', _304 => _304.aborted])) {
5520
5741
  await this.cancelPlay(workflowId);
5521
5742
  return {
5522
5743
  success: false,
@@ -5527,9 +5748,9 @@ var DeeplineClient = (_class = class _DeeplineClient {
5527
5748
  };
5528
5749
  }
5529
5750
  for await (const event of this.watchRunEvents(workflowId, {
5530
- signal: _optionalChain([options, 'optionalAccess', _285 => _285.signal])
5751
+ signal: _optionalChain([options, 'optionalAccess', _305 => _305.signal])
5531
5752
  })) {
5532
- if (_optionalChain([options, 'optionalAccess', _286 => _286.signal, 'optionalAccess', _287 => _287.aborted])) {
5753
+ if (_optionalChain([options, 'optionalAccess', _306 => _306.signal, 'optionalAccess', _307 => _307.aborted])) {
5533
5754
  await this.cancelPlay(workflowId);
5534
5755
  return {
5535
5756
  success: false,
@@ -5539,19 +5760,19 @@ var DeeplineClient = (_class = class _DeeplineClient {
5539
5760
  error: "Cancelled by user"
5540
5761
  };
5541
5762
  }
5542
- const previousStatus = _optionalChain([state, 'access', _288 => _288.latest, 'optionalAccess', _289 => _289.status]);
5763
+ const previousStatus = _optionalChain([state, 'access', _308 => _308.latest, 'optionalAccess', _309 => _309.status]);
5543
5764
  const status = updatePlayLiveStatusState(state, event);
5544
5765
  if (!status) {
5545
5766
  continue;
5546
5767
  }
5547
5768
  if (event.type !== "play.run.status" || status.status !== previousStatus) {
5548
- _optionalChain([options, 'optionalAccess', _290 => _290.onProgress, 'optionalCall', _291 => _291(status)]);
5769
+ _optionalChain([options, 'optionalAccess', _310 => _310.onProgress, 'optionalCall', _311 => _311(status)]);
5549
5770
  }
5550
- if (_chunkUHNDVD3Pjs.isTerminalPlayRunLifecycleStatus.call(void 0, status.status)) {
5771
+ if (_chunk2H4EY7KHjs.isTerminalPlayRunLifecycleStatus.call(void 0, status.status)) {
5551
5772
  terminalObserved = status;
5552
5773
  }
5553
5774
  }
5554
- if (_optionalChain([options, 'optionalAccess', _292 => _292.signal, 'optionalAccess', _293 => _293.aborted])) {
5775
+ if (_optionalChain([options, 'optionalAccess', _312 => _312.signal, 'optionalAccess', _313 => _313.aborted])) {
5555
5776
  await this.cancelPlay(workflowId);
5556
5777
  return {
5557
5778
  success: false,
@@ -5567,7 +5788,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
5567
5788
  ).catch(() => terminalObserved);
5568
5789
  return playRunResultFromStatus(finalStatus, start, workflowId);
5569
5790
  }
5570
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
5791
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
5571
5792
  `Run watch for ${workflowId} ended before the run reached a terminal state.`,
5572
5793
  void 0,
5573
5794
  "PLAY_RUN_STREAM_ENDED",
@@ -5595,7 +5816,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
5595
5816
  async getBillingUsageEvent(requestId) {
5596
5817
  const normalizedRequestId = requestId.trim();
5597
5818
  if (normalizedRequestId.length === 0 || normalizedRequestId.length > 200 || normalizedRequestId !== requestId) {
5598
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
5819
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
5599
5820
  "Usage request_id must contain 1\u2013200 characters with no leading or trailing whitespace.",
5600
5821
  void 0,
5601
5822
  "INVALID_USAGE_REQUEST_ID"
@@ -5604,9 +5825,9 @@ var DeeplineClient = (_class = class _DeeplineClient {
5604
5825
  const response = await this.http.get(
5605
5826
  `/api/v2/usage/events?request_id=${encodeURIComponent(normalizedRequestId)}`
5606
5827
  );
5607
- const event = _optionalChain([response, 'access', _294 => _294.entries, 'optionalAccess', _295 => _295[0]]);
5828
+ const event = _optionalChain([response, 'access', _314 => _314.entries, 'optionalAccess', _315 => _315[0]]);
5608
5829
  if (!event) {
5609
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
5830
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
5610
5831
  "No usage event was found for this request_id.",
5611
5832
  void 0,
5612
5833
  "USAGE_EVENT_NOT_FOUND"
@@ -5635,14 +5856,14 @@ var DeeplineClient = (_class = class _DeeplineClient {
5635
5856
  if (options.requestId !== void 0) {
5636
5857
  const requestId = options.requestId.trim();
5637
5858
  if (requestId.length === 0 || requestId.length > 200 || requestId !== options.requestId) {
5638
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
5859
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
5639
5860
  "Usage request_id must contain 1\u2013200 characters with no leading or trailing whitespace.",
5640
5861
  void 0,
5641
5862
  "INVALID_USAGE_REQUEST_ID"
5642
5863
  );
5643
5864
  }
5644
5865
  if (options.runId !== void 0 || options.cursor !== void 0 || options.offset !== void 0) {
5645
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
5866
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
5646
5867
  "requestId cannot be combined with runId, cursor, or offset.",
5647
5868
  void 0,
5648
5869
  "INVALID_USAGE_FILTERS"
@@ -5735,7 +5956,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
5735
5956
  async cancelBillingSubscription(options) {
5736
5957
  return this.http.post(
5737
5958
  "/api/v2/billing/subscription/cancel",
5738
- { action: _optionalChain([options, 'optionalAccess', _296 => _296.undo]) ? "undo_cancel" : "cancel" }
5959
+ { action: _optionalChain([options, 'optionalAccess', _316 => _316.undo]) ? "undo_cancel" : "cancel" }
5739
5960
  );
5740
5961
  }
5741
5962
  /**
@@ -5747,7 +5968,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
5747
5968
  */
5748
5969
  async listBillingInvoices(options) {
5749
5970
  const params = new URLSearchParams();
5750
- if (_optionalChain([options, 'optionalAccess', _297 => _297.limit]) !== void 0) {
5971
+ if (_optionalChain([options, 'optionalAccess', _317 => _317.limit]) !== void 0) {
5751
5972
  params.set("limit", String(options.limit));
5752
5973
  }
5753
5974
  const suffix = Array.from(params).length > 0 ? `?${params.toString()}` : "";
@@ -5805,7 +6026,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
5805
6026
  /** Recover only the original workspace, credit amount, and purchase key; never charge. */
5806
6027
  async recoverTargetBillingCreditPurchase(options) {
5807
6028
  if (typeof options.idempotencyKey !== "string") {
5808
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
6029
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
5809
6030
  "The original billing idempotencyKey is required.",
5810
6031
  void 0,
5811
6032
  "INVALID_BILLING_IDEMPOTENCY_KEY"
@@ -5815,14 +6036,14 @@ var DeeplineClient = (_class = class _DeeplineClient {
5815
6036
  options.idempotencyKey
5816
6037
  );
5817
6038
  if (!Number.isSafeInteger(options.credits) || options.credits <= 0) {
5818
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
6039
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
5819
6040
  "credits must be a positive safe integer.",
5820
6041
  void 0,
5821
6042
  "INVALID_CREDITS"
5822
6043
  );
5823
6044
  }
5824
6045
  if (typeof options.orgId !== "string" || !options.orgId.trim() || options.orgId !== options.orgId.trim()) {
5825
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
6046
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
5826
6047
  "The original orgId is required without surrounding whitespace.",
5827
6048
  void 0,
5828
6049
  "INVALID_ORG_ID"
@@ -5857,7 +6078,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
5857
6078
  /** Create a Stripe-hosted portal session for payment recovery and invoices. */
5858
6079
  async createTargetBillingPortalSession(options) {
5859
6080
  const response = await this.http.post(
5860
- _optionalChain([options, 'optionalAccess', _298 => _298.flow]) === "customer_update" ? "/api/v2/billing/portal-sessions?flow=customer_update" : "/api/v2/billing/portal-sessions",
6081
+ _optionalChain([options, 'optionalAccess', _318 => _318.flow]) === "customer_update" ? "/api/v2/billing/portal-sessions?flow=customer_update" : "/api/v2/billing/portal-sessions",
5861
6082
  {}
5862
6083
  );
5863
6084
  return response.data;
@@ -5907,8 +6128,8 @@ var DeeplineClient = (_class = class _DeeplineClient {
5907
6128
  return this.http.request("/api/v2/monitors/audit", {
5908
6129
  method: "POST",
5909
6130
  body: {
5910
- ..._optionalChain([options, 'optionalAccess', _299 => _299.fleetId]) ? { fleet_id: options.fleetId } : {},
5911
- ..._optionalChain([options, 'optionalAccess', _300 => _300.cursor]) ? { cursor: options.cursor } : {}
6131
+ ..._optionalChain([options, 'optionalAccess', _319 => _319.fleetId]) ? { fleet_id: options.fleetId } : {},
6132
+ ..._optionalChain([options, 'optionalAccess', _320 => _320.cursor]) ? { cursor: options.cursor } : {}
5912
6133
  },
5913
6134
  maxRetries: 0
5914
6135
  });
@@ -5918,8 +6139,8 @@ var DeeplineClient = (_class = class _DeeplineClient {
5918
6139
  return this.http.request("/api/v2/monitors/repair", {
5919
6140
  method: "POST",
5920
6141
  body: {
5921
- ..._optionalChain([options, 'optionalAccess', _301 => _301.fleetId]) ? { fleet_id: options.fleetId } : {},
5922
- ..._optionalChain([options, 'optionalAccess', _302 => _302.dryRun]) === void 0 ? {} : { dry_run: options.dryRun }
6142
+ ..._optionalChain([options, 'optionalAccess', _321 => _321.fleetId]) ? { fleet_id: options.fleetId } : {},
6143
+ ..._optionalChain([options, 'optionalAccess', _322 => _322.dryRun]) === void 0 ? {} : { dry_run: options.dryRun }
5923
6144
  },
5924
6145
  maxRetries: 0
5925
6146
  });
@@ -5927,7 +6148,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
5927
6148
  /** Delivery and convergence health. Prefer `client.monitors.health(...)`. */
5928
6149
  async readMonitorsHealth(options) {
5929
6150
  const params = new URLSearchParams();
5930
- if (_optionalChain([options, 'optionalAccess', _303 => _303.fleetId])) params.set("fleet_id", options.fleetId);
6151
+ if (_optionalChain([options, 'optionalAccess', _323 => _323.fleetId])) params.set("fleet_id", options.fleetId);
5931
6152
  const query = params.toString();
5932
6153
  const suffix = query ? `?${query}` : "";
5933
6154
  return this.http.request(
@@ -5939,7 +6160,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
5939
6160
  async submitMonitorBatch(options) {
5940
6161
  const idempotencyKey = options.idempotencyKey.trim();
5941
6162
  if (!idempotencyKey) {
5942
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
6163
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
5943
6164
  "Monitor batch idempotencyKey is required.",
5944
6165
  void 0,
5945
6166
  "INVALID_MONITOR_BATCH_IDEMPOTENCY_KEY"
@@ -5947,7 +6168,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
5947
6168
  }
5948
6169
  if (options.kind === "deploy") {
5949
6170
  if (!options.manifestNdjson.trim()) {
5950
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
6171
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
5951
6172
  "Monitor batch deploy requires a non-empty NDJSON manifest.",
5952
6173
  void 0,
5953
6174
  "INVALID_MONITOR_BATCH_MANIFEST"
@@ -5993,14 +6214,14 @@ var DeeplineClient = (_class = class _DeeplineClient {
5993
6214
  async getMonitorBatch(operationId, options) {
5994
6215
  const runId = operationId.trim();
5995
6216
  if (!runId) {
5996
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
6217
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
5997
6218
  "Monitor batch operation id is required.",
5998
6219
  void 0,
5999
6220
  "INVALID_MONITOR_BATCH_OPERATION_ID"
6000
6221
  );
6001
6222
  }
6002
6223
  const params = new URLSearchParams();
6003
- if (_optionalChain([options, 'optionalAccess', _304 => _304.cursor])) params.set("cursor", options.cursor);
6224
+ if (_optionalChain([options, 'optionalAccess', _324 => _324.cursor])) params.set("cursor", options.cursor);
6004
6225
  const suffix = params.size > 0 ? `?${params}` : "";
6005
6226
  return this.http.request(
6006
6227
  `/api/v2/monitors/batch/${encodeURIComponent(runId)}${suffix}`,
@@ -6044,7 +6265,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
6044
6265
  * `client.monitors.deploy(...)`.
6045
6266
  */
6046
6267
  async deployMonitor(definition, options) {
6047
- if (_optionalChain([options, 'optionalAccess', _305 => _305.dryRun])) {
6268
+ if (_optionalChain([options, 'optionalAccess', _325 => _325.dryRun])) {
6048
6269
  return this.http.request("/api/v2/monitors/check", {
6049
6270
  method: "POST",
6050
6271
  body: definition
@@ -6080,12 +6301,12 @@ var DeeplineClient = (_class = class _DeeplineClient {
6080
6301
  /** List deployed monitors. Prefer `client.monitors.list(...)`. */
6081
6302
  async listMonitors(options) {
6082
6303
  const params = new URLSearchParams();
6083
- if (_optionalChain([options, 'optionalAccess', _306 => _306.state])) params.set("state", options.state);
6084
- else if (_optionalChain([options, 'optionalAccess', _307 => _307.status])) params.set("status", options.status);
6085
- if (_optionalChain([options, 'optionalAccess', _308 => _308.limit]) !== void 0)
6304
+ if (_optionalChain([options, 'optionalAccess', _326 => _326.state])) params.set("state", options.state);
6305
+ else if (_optionalChain([options, 'optionalAccess', _327 => _327.status])) params.set("status", options.status);
6306
+ if (_optionalChain([options, 'optionalAccess', _328 => _328.limit]) !== void 0)
6086
6307
  params.set("limit", String(options.limit));
6087
- if (_optionalChain([options, 'optionalAccess', _309 => _309.cursor])) params.set("cursor", options.cursor);
6088
- if (_optionalChain([options, 'optionalAccess', _310 => _310.includeConsumers])) params.set("include_consumers", "true");
6308
+ if (_optionalChain([options, 'optionalAccess', _329 => _329.cursor])) params.set("cursor", options.cursor);
6309
+ if (_optionalChain([options, 'optionalAccess', _330 => _330.includeConsumers])) params.set("include_consumers", "true");
6089
6310
  const query = params.toString();
6090
6311
  const suffix = query ? `?${query}` : "";
6091
6312
  return this.http.request(
@@ -6101,8 +6322,8 @@ var DeeplineClient = (_class = class _DeeplineClient {
6101
6322
  );
6102
6323
  }
6103
6324
  async testMonitorWebhook(key, payload, options) {
6104
- if (_optionalChain([options, 'optionalAccess', _311 => _311.dispatch]) === true || _optionalChain([options, 'optionalAccess', _312 => _312.validationOnly]) === false) {
6105
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
6325
+ if (_optionalChain([options, 'optionalAccess', _331 => _331.dispatch]) === true || _optionalChain([options, 'optionalAccess', _332 => _332.validationOnly]) === false) {
6326
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
6106
6327
  "Monitor tests are validation-only and cannot dispatch events.",
6107
6328
  void 0,
6108
6329
  "MONITOR_TEST_DISPATCH_NOT_SUPPORTED"
@@ -6156,19 +6377,19 @@ var DeeplineClient = (_class = class _DeeplineClient {
6156
6377
  }
6157
6378
  /** Delete a deployed monitor and its upstream provider resource. `dryRun` returns the delete plan. Prefer `client.monitors.delete(...)`. */
6158
6379
  async deleteMonitor(key, options) {
6159
- if (_optionalChain([options, 'optionalAccess', _313 => _313.localOnly]) === true) {
6160
- throw new (0, _chunk7P5AA3SNjs.DeeplineError)(
6380
+ if (_optionalChain([options, 'optionalAccess', _333 => _333.localOnly]) === true) {
6381
+ throw new (0, _chunkPPDBRJRWjs.DeeplineError)(
6161
6382
  "localOnly monitor deletion is no longer supported. Monitor deletion always deprovisions the upstream provider resource.",
6162
6383
  void 0,
6163
6384
  "MONITOR_LOCAL_ONLY_DELETE_NOT_SUPPORTED"
6164
6385
  );
6165
6386
  }
6166
6387
  const params = new URLSearchParams();
6167
- if (_optionalChain([options, 'optionalAccess', _314 => _314.dryRun])) params.set("dry_run", "true");
6388
+ if (_optionalChain([options, 'optionalAccess', _334 => _334.dryRun])) params.set("dry_run", "true");
6168
6389
  const query = params.toString();
6169
6390
  return this.http.request(
6170
6391
  `/api/v2/monitors/deployed/${encodeURIComponent(key)}${query ? `?${query}` : ""}`,
6171
- _optionalChain([options, 'optionalAccess', _315 => _315.dryRun]) ? { method: "DELETE" } : {
6392
+ _optionalChain([options, 'optionalAccess', _335 => _335.dryRun]) ? { method: "DELETE" } : {
6172
6393
  method: "DELETE",
6173
6394
  // Deletion is a provider lifecycle operation. A timeout is an
6174
6395
  // unknown outcome, not authority to begin another delete attempt.
@@ -6181,10 +6402,10 @@ var DeeplineClient = (_class = class _DeeplineClient {
6181
6402
  * Prefer `client.monitors.reactivate(...)`.
6182
6403
  */
6183
6404
  async reactivateMonitor(key, options) {
6184
- const query = _optionalChain([options, 'optionalAccess', _316 => _316.dryRun]) ? "?dry_run=true" : "";
6405
+ const query = _optionalChain([options, 'optionalAccess', _336 => _336.dryRun]) ? "?dry_run=true" : "";
6185
6406
  return this.http.request(
6186
6407
  `/api/v2/monitors/deployed/${encodeURIComponent(key)}/reactivate${query}`,
6187
- _optionalChain([options, 'optionalAccess', _317 => _317.dryRun]) ? { method: "POST", body: {} } : {
6408
+ _optionalChain([options, 'optionalAccess', _337 => _337.dryRun]) ? { method: "POST", body: {} } : {
6188
6409
  method: "POST",
6189
6410
  body: {},
6190
6411
  // Reactivation can create an upstream resource, so it must not use
@@ -6198,7 +6419,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
6198
6419
  // ——————————————————————————————————————————————————————————
6199
6420
  static __initStatic() {this.MONITOR_JOB_IDEMPOTENCY_KEY_MAX_LENGTH = 96}
6200
6421
  monitorJobIdempotencyKey(operation) {
6201
- const uuid = _nullishCoalesce(_optionalChain([globalThis, 'access', _318 => _318.crypto, 'optionalAccess', _319 => _319.randomUUID, 'optionalCall', _320 => _320()]), () => ( `${Date.now()}-${Math.random().toString(36).slice(2)}`));
6422
+ const uuid = _nullishCoalesce(_optionalChain([globalThis, 'access', _338 => _338.crypto, 'optionalAccess', _339 => _339.randomUUID, 'optionalCall', _340 => _340()]), () => ( `${Date.now()}-${Math.random().toString(36).slice(2)}`));
6202
6423
  const prefix = "monitor-job-";
6203
6424
  const safeOperation = operation.replace(/[^A-Za-z0-9._-]/g, "-");
6204
6425
  const maxOperationLength = Math.max(
@@ -6209,7 +6430,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
6209
6430
  }
6210
6431
  monitorJobHeaders(operation, idempotencyKey) {
6211
6432
  return {
6212
- "Idempotency-Key": _optionalChain([idempotencyKey, 'optionalAccess', _321 => _321.trim, 'call', _322 => _322()]) || this.monitorJobIdempotencyKey(operation)
6433
+ "Idempotency-Key": _optionalChain([idempotencyKey, 'optionalAccess', _341 => _341.trim, 'call', _342 => _342()]) || this.monitorJobIdempotencyKey(operation)
6213
6434
  };
6214
6435
  }
6215
6436
  async deployMonitorBatch(definitions, options) {
@@ -6220,7 +6441,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
6220
6441
  body: { version: 1, kind: "batch", monitors: definitions },
6221
6442
  headers: this.monitorJobHeaders(
6222
6443
  "batch-deploy",
6223
- _optionalChain([options, 'optionalAccess', _323 => _323.idempotencyKey])
6444
+ _optionalChain([options, 'optionalAccess', _343 => _343.idempotencyKey])
6224
6445
  ),
6225
6446
  maxRetries: 0,
6226
6447
  exactUrlOnly: true
@@ -6239,11 +6460,11 @@ var DeeplineClient = (_class = class _DeeplineClient {
6239
6460
  version: 1,
6240
6461
  kind: "batch",
6241
6462
  monitors: definitions,
6242
- ..._optionalChain([options, 'optionalAccess', _324 => _324.expectedGeneration]) === void 0 ? {} : { expected_generation: options.expectedGeneration }
6463
+ ..._optionalChain([options, 'optionalAccess', _344 => _344.expectedGeneration]) === void 0 ? {} : { expected_generation: options.expectedGeneration }
6243
6464
  },
6244
6465
  headers: this.monitorJobHeaders(
6245
6466
  `batch-sync-${batchId}`,
6246
- _optionalChain([options, 'optionalAccess', _325 => _325.idempotencyKey])
6467
+ _optionalChain([options, 'optionalAccess', _345 => _345.idempotencyKey])
6247
6468
  ),
6248
6469
  maxRetries: 0,
6249
6470
  exactUrlOnly: true
@@ -6258,7 +6479,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
6258
6479
  body: {},
6259
6480
  headers: this.monitorJobHeaders(
6260
6481
  `batch-start-${batchId}`,
6261
- _optionalChain([options, 'optionalAccess', _326 => _326.idempotencyKey])
6482
+ _optionalChain([options, 'optionalAccess', _346 => _346.idempotencyKey])
6262
6483
  ),
6263
6484
  maxRetries: 0,
6264
6485
  exactUrlOnly: true
@@ -6273,7 +6494,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
6273
6494
  body: {},
6274
6495
  headers: this.monitorJobHeaders(
6275
6496
  `batch-stop-${batchId}`,
6276
- _optionalChain([options, 'optionalAccess', _327 => _327.idempotencyKey])
6497
+ _optionalChain([options, 'optionalAccess', _347 => _347.idempotencyKey])
6277
6498
  ),
6278
6499
  maxRetries: 0,
6279
6500
  exactUrlOnly: true
@@ -6294,7 +6515,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
6294
6515
  body: {},
6295
6516
  headers: this.monitorJobHeaders(
6296
6517
  `${action}-${monitorKey}`,
6297
- _optionalChain([options, 'optionalAccess', _328 => _328.idempotencyKey])
6518
+ _optionalChain([options, 'optionalAccess', _348 => _348.idempotencyKey])
6298
6519
  ),
6299
6520
  maxRetries: 0,
6300
6521
  exactUrlOnly: true
@@ -6307,7 +6528,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
6307
6528
  body: definition,
6308
6529
  headers: this.monitorJobHeaders(
6309
6530
  `sync-${definition.key}`,
6310
- _optionalChain([options, 'optionalAccess', _329 => _329.idempotencyKey])
6531
+ _optionalChain([options, 'optionalAccess', _349 => _349.idempotencyKey])
6311
6532
  ),
6312
6533
  maxRetries: 0,
6313
6534
  exactUrlOnly: true
@@ -6320,7 +6541,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
6320
6541
  );
6321
6542
  }
6322
6543
  async getMonitorJobLogs(jobId, options) {
6323
- const query = _optionalChain([options, 'optionalAccess', _330 => _330.limit]) === void 0 ? "" : `?limit=${encodeURIComponent(String(options.limit))}`;
6544
+ const query = _optionalChain([options, 'optionalAccess', _350 => _350.limit]) === void 0 ? "" : `?limit=${encodeURIComponent(String(options.limit))}`;
6324
6545
  return this.http.request(
6325
6546
  `/api/v2/monitors/jobs/${encodeURIComponent(jobId)}/logs${query}`,
6326
6547
  { method: "GET" }
@@ -6333,15 +6554,15 @@ var DeeplineClient = (_class = class _DeeplineClient {
6333
6554
  );
6334
6555
  }
6335
6556
  async waitForMonitorJob(jobId, options) {
6336
- const timeoutMs = Math.max(1, _nullishCoalesce(_optionalChain([options, 'optionalAccess', _331 => _331.timeoutMs]), () => ( 10 * 6e4)));
6337
- const pollIntervalMs = Math.max(1, _nullishCoalesce(_optionalChain([options, 'optionalAccess', _332 => _332.pollIntervalMs]), () => ( 2e3)));
6557
+ const timeoutMs = Math.max(1, _nullishCoalesce(_optionalChain([options, 'optionalAccess', _351 => _351.timeoutMs]), () => ( 10 * 6e4)));
6558
+ const pollIntervalMs = Math.max(1, _nullishCoalesce(_optionalChain([options, 'optionalAccess', _352 => _352.pollIntervalMs]), () => ( 2e3)));
6338
6559
  const terminal = /* @__PURE__ */ new Set(["succeeded", "failed", "cancelled"]);
6339
6560
  const startedAt = Date.now();
6340
6561
  let latest = await this.getMonitorJob(jobId);
6341
6562
  while (true) {
6342
- _optionalChain([options, 'optionalAccess', _333 => _333.onProgress, 'optionalCall', _334 => _334(latest)]);
6563
+ _optionalChain([options, 'optionalAccess', _353 => _353.onProgress, 'optionalCall', _354 => _354(latest)]);
6343
6564
  const job = latest.job;
6344
- const state = typeof _optionalChain([job, 'optionalAccess', _335 => _335.state]) === "string" ? job.state : void 0;
6565
+ const state = typeof _optionalChain([job, 'optionalAccess', _355 => _355.state]) === "string" ? job.state : void 0;
6345
6566
  if (state && terminal.has(state)) return latest;
6346
6567
  if (Date.now() - startedAt >= timeoutMs) return latest;
6347
6568
  await sleep(pollIntervalMs);
@@ -6352,12 +6573,12 @@ var DeeplineClient = (_class = class _DeeplineClient {
6352
6573
  // Monitor Fleets
6353
6574
  // ——————————————————————————————————————————————————————————
6354
6575
  monitorFleetIdempotencyKey(operation) {
6355
- const uuid = _optionalChain([globalThis, 'access', _336 => _336.crypto, 'optionalAccess', _337 => _337.randomUUID, 'optionalCall', _338 => _338()]);
6576
+ const uuid = _optionalChain([globalThis, 'access', _356 => _356.crypto, 'optionalAccess', _357 => _357.randomUUID, 'optionalCall', _358 => _358()]);
6356
6577
  return `monitor-fleet-${operation}-${_nullishCoalesce(uuid, () => ( `${Date.now()}-${Math.random().toString(36).slice(2)}`))}`;
6357
6578
  }
6358
6579
  monitorFleetHeaders(operation, idempotencyKey) {
6359
6580
  return {
6360
- "Idempotency-Key": _optionalChain([idempotencyKey, 'optionalAccess', _339 => _339.trim, 'call', _340 => _340()]) || this.monitorFleetIdempotencyKey(operation)
6581
+ "Idempotency-Key": _optionalChain([idempotencyKey, 'optionalAccess', _359 => _359.trim, 'call', _360 => _360()]) || this.monitorFleetIdempotencyKey(operation)
6361
6582
  };
6362
6583
  }
6363
6584
  monitorFleetPath(fleetId) {
@@ -6377,15 +6598,15 @@ var DeeplineClient = (_class = class _DeeplineClient {
6377
6598
  const fleetId = typeof definitionOrId === "string" ? definitionOrId : definitionOrId.id;
6378
6599
  const body = {
6379
6600
  ...typeof definitionOrId === "string" ? {} : { definition: definitionOrId },
6380
- ..._optionalChain([options, 'optionalAccess', _341 => _341.dryRun]) ? { dry_run: true } : {},
6381
- ..._optionalChain([options, 'optionalAccess', _342 => _342.expectedGeneration]) !== void 0 ? { expected_generation: options.expectedGeneration } : {}
6601
+ ..._optionalChain([options, 'optionalAccess', _361 => _361.dryRun]) ? { dry_run: true } : {},
6602
+ ..._optionalChain([options, 'optionalAccess', _362 => _362.expectedGeneration]) !== void 0 ? { expected_generation: options.expectedGeneration } : {}
6382
6603
  };
6383
6604
  return this.http.request(
6384
6605
  this.monitorFleetPath(fleetId),
6385
6606
  {
6386
6607
  method: "PUT",
6387
6608
  body,
6388
- headers: this.monitorFleetHeaders("sync", _optionalChain([options, 'optionalAccess', _343 => _343.idempotencyKey])),
6609
+ headers: this.monitorFleetHeaders("sync", _optionalChain([options, 'optionalAccess', _363 => _363.idempotencyKey])),
6389
6610
  maxRetries: 0,
6390
6611
  exactUrlOnly: true
6391
6612
  }
@@ -6398,8 +6619,8 @@ var DeeplineClient = (_class = class _DeeplineClient {
6398
6619
  }
6399
6620
  async getMonitorFleet(fleetId, options) {
6400
6621
  const params = new URLSearchParams();
6401
- if (_optionalChain([options, 'optionalAccess', _344 => _344.drift])) params.set("drift", "1");
6402
- if (_optionalChain([options, 'optionalAccess', _345 => _345.limit]) !== void 0)
6622
+ if (_optionalChain([options, 'optionalAccess', _364 => _364.drift])) params.set("drift", "1");
6623
+ if (_optionalChain([options, 'optionalAccess', _365 => _365.limit]) !== void 0)
6403
6624
  params.set("limit", String(options.limit));
6404
6625
  const query = params.toString();
6405
6626
  return this.http.request(
@@ -6412,10 +6633,10 @@ var DeeplineClient = (_class = class _DeeplineClient {
6412
6633
  this.monitorFleetPath(fleetId),
6413
6634
  {
6414
6635
  method: "DELETE",
6415
- body: _optionalChain([options, 'optionalAccess', _346 => _346.dryRun]) ? { dry_run: true } : {},
6636
+ body: _optionalChain([options, 'optionalAccess', _366 => _366.dryRun]) ? { dry_run: true } : {},
6416
6637
  headers: this.monitorFleetHeaders(
6417
6638
  "deactivate",
6418
- _optionalChain([options, 'optionalAccess', _347 => _347.idempotencyKey])
6639
+ _optionalChain([options, 'optionalAccess', _367 => _367.idempotencyKey])
6419
6640
  ),
6420
6641
  maxRetries: 0,
6421
6642
  exactUrlOnly: true
@@ -6430,7 +6651,7 @@ var DeeplineClient = (_class = class _DeeplineClient {
6430
6651
  body: {},
6431
6652
  headers: this.monitorFleetHeaders(
6432
6653
  "reactivate",
6433
- _optionalChain([options, 'optionalAccess', _348 => _348.idempotencyKey])
6654
+ _optionalChain([options, 'optionalAccess', _368 => _368.idempotencyKey])
6434
6655
  ),
6435
6656
  maxRetries: 0,
6436
6657
  exactUrlOnly: true
@@ -6447,13 +6668,13 @@ var DeeplineClient = (_class = class _DeeplineClient {
6447
6668
  * identical to "the request failed".
6448
6669
  */
6449
6670
  async waitForMonitorFleetConvergence(fleetId, options) {
6450
- const timeoutMs = Math.max(1, _nullishCoalesce(_optionalChain([options, 'optionalAccess', _349 => _349.timeoutMs]), () => ( 10 * 6e4)));
6451
- const pollIntervalMs = Math.max(1, _nullishCoalesce(_optionalChain([options, 'optionalAccess', _350 => _350.pollIntervalMs]), () => ( 2e3)));
6452
- const terminal = _optionalChain([options, 'optionalAccess', _351 => _351.until]) === "deactivated" ? /* @__PURE__ */ new Set(["deactivated", "degraded"]) : /* @__PURE__ */ new Set(["converged", "degraded", "deactivated"]);
6671
+ const timeoutMs = Math.max(1, _nullishCoalesce(_optionalChain([options, 'optionalAccess', _369 => _369.timeoutMs]), () => ( 10 * 6e4)));
6672
+ const pollIntervalMs = Math.max(1, _nullishCoalesce(_optionalChain([options, 'optionalAccess', _370 => _370.pollIntervalMs]), () => ( 2e3)));
6673
+ const terminal = _optionalChain([options, 'optionalAccess', _371 => _371.until]) === "deactivated" ? /* @__PURE__ */ new Set(["deactivated", "degraded"]) : /* @__PURE__ */ new Set(["converged", "degraded", "deactivated"]);
6453
6674
  const startedAt = Date.now();
6454
6675
  let latest = await this.getMonitorFleet(fleetId);
6455
6676
  while (true) {
6456
- _optionalChain([options, 'optionalAccess', _352 => _352.onProgress, 'optionalCall', _353 => _353(latest)]);
6677
+ _optionalChain([options, 'optionalAccess', _372 => _372.onProgress, 'optionalCall', _373 => _373(latest)]);
6457
6678
  const status = typeof latest.status === "string" ? latest.status : void 0;
6458
6679
  if (status && terminal.has(status)) return latest;
6459
6680
  if (Date.now() - startedAt >= timeoutMs) return latest;
@@ -6513,4 +6734,6 @@ var DeeplineClient = (_class = class _DeeplineClient {
6513
6734
 
6514
6735
 
6515
6736
 
6516
- exports.iterateCursorPages = iterateCursorPages; exports.requireBillingIdempotencyKey = requireBillingIdempotencyKey; exports.planCustomerDbQuery = planCustomerDbQuery; exports.validateExecutionIdempotencyKey = validateExecutionIdempotencyKey; exports.PRODUCT_NOTIFICATION_EVENT_CATALOG = PRODUCT_NOTIFICATION_EVENT_CATALOG; exports.resolveLegacySlackNotification = resolveLegacySlackNotification; exports.RUN_EVENT_SEARCH_KIND_VALUES = RUN_EVENT_SEARCH_KIND_VALUES; exports.logProvenanceReaches = logProvenanceReaches; exports.logLevelReaches = logLevelReaches; exports.parseLogLevel = parseLogLevel; exports.classifyLogLine = classifyLogLine; exports.isTransientPlayRunReadError = isTransientPlayRunReadError; exports.encodeRunLogsCursor = encodeRunLogsCursor; exports.isRunLogsCursor = isRunLogsCursor; exports.RunEventQueryInputError = RunEventQueryInputError; exports.normalizeRunEventOperationRequest = normalizeRunEventOperationRequest; exports.isStopAllPlayRunsDryRunResult = isStopAllPlayRunsDryRunResult; exports.MONITOR_JOB_STATES = MONITOR_JOB_STATES; exports.MONITOR_JOB_PHASES = MONITOR_JOB_PHASES; exports.MONITOR_JOB_RECONCILIATION_STATES = MONITOR_JOB_RECONCILIATION_STATES; exports.DeeplineClient = DeeplineClient;
6737
+
6738
+
6739
+ exports.iterateCursorPages = iterateCursorPages; exports.requireBillingIdempotencyKey = requireBillingIdempotencyKey; exports.planCustomerDbQuery = planCustomerDbQuery; exports.validateExecutionIdempotencyKey = validateExecutionIdempotencyKey; exports.normalizePlayStatus = normalizePlayStatus; exports.createPlayClient = createPlayClient; exports.PRODUCT_NOTIFICATION_EVENT_CATALOG = PRODUCT_NOTIFICATION_EVENT_CATALOG; exports.resolveLegacySlackNotification = resolveLegacySlackNotification; exports.RUN_EVENT_SEARCH_KIND_VALUES = RUN_EVENT_SEARCH_KIND_VALUES; exports.logProvenanceReaches = logProvenanceReaches; exports.logLevelReaches = logLevelReaches; exports.parseLogLevel = parseLogLevel; exports.classifyLogLine = classifyLogLine; exports.isTransientPlayRunReadError = isTransientPlayRunReadError; exports.encodeRunLogsCursor = encodeRunLogsCursor; exports.isRunLogsCursor = isRunLogsCursor; exports.RunEventQueryInputError = RunEventQueryInputError; exports.normalizeRunEventOperationRequest = normalizeRunEventOperationRequest; exports.isStopAllPlayRunsDryRunResult = isStopAllPlayRunsDryRunResult; exports.MONITOR_JOB_STATES = MONITOR_JOB_STATES; exports.MONITOR_JOB_PHASES = MONITOR_JOB_PHASES; exports.MONITOR_JOB_RECONCILIATION_STATES = MONITOR_JOB_RECONCILIATION_STATES; exports.DeeplineClient = DeeplineClient;