@lostgradient/weft 0.3.0 → 0.4.0

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 (508) hide show
  1. package/README.md +79 -24
  2. package/dist/cli/conformance.js +7 -1
  3. package/dist/cli/generated/operation-client.generated.d.ts +28 -13
  4. package/dist/cli/generated/operation-client.generated.js +1 -0
  5. package/dist/cli/help-text.d.ts +1 -1
  6. package/dist/cli/help-text.js +1 -0
  7. package/dist/cli/operation-catalog-snapshot.d.ts +8 -0
  8. package/dist/cli/operation-catalog-snapshot.js +11 -0
  9. package/dist/cli/parse-schedule-arguments.js +3 -1
  10. package/dist/cli/schedule.js +2 -1
  11. package/dist/cli/types.d.ts +1 -0
  12. package/dist/cli-main.js +79 -78
  13. package/dist/client/handle-delegation.d.ts +3 -2
  14. package/dist/client/handle-delegation.js +3 -1
  15. package/dist/client/http-client-requests.d.ts +2 -1
  16. package/dist/client/http-client-requests.js +7 -0
  17. package/dist/client/http-client.d.ts +9 -6
  18. package/dist/client/http-client.js +10 -1
  19. package/dist/client/http-request.d.ts +11 -1
  20. package/dist/client/http-request.js +17 -7
  21. package/dist/client/index.d.ts +1 -1
  22. package/dist/client/interface.d.ts +46 -5
  23. package/dist/client/local.d.ts +4 -1
  24. package/dist/client/local.js +12 -4
  25. package/dist/client/start-body.d.ts +4 -3
  26. package/dist/core/byte-arrays.d.ts +5 -0
  27. package/dist/core/byte-arrays.js +5 -0
  28. package/dist/core/checkpoint/lifecycle.d.ts +3 -0
  29. package/dist/core/checkpoint/lifecycle.js +9 -4
  30. package/dist/core/checkpoint/serialization.js +12 -5
  31. package/dist/core/codec/extension-codec.d.ts +16 -0
  32. package/dist/core/codec/extension-codec.js +100 -6
  33. package/dist/core/context/activity-retry-state.d.ts +38 -0
  34. package/dist/core/context/activity-retry-state.js +89 -0
  35. package/dist/core/context/activity-schedule-to-close.d.ts +159 -0
  36. package/dist/core/context/activity-schedule-to-close.js +69 -0
  37. package/dist/core/context/child-workflow-pipe.d.ts +5 -5
  38. package/dist/core/context/child-workflow-pipe.js +15 -2
  39. package/dist/core/context/context-presence.d.ts +19 -0
  40. package/dist/core/context/context-presence.js +13 -0
  41. package/dist/core/context/durable-operations.d.ts +25 -0
  42. package/dist/core/context/durable-operations.js +64 -0
  43. package/dist/core/context/index.d.ts +9 -5
  44. package/dist/core/context/index.js +17 -12
  45. package/dist/core/context/internals.d.ts +20 -0
  46. package/dist/core/context/internals.js +3 -1
  47. package/dist/core/context/operation-request.d.ts +35 -0
  48. package/dist/core/context/parallel-cache-entry.d.ts +14 -5
  49. package/dist/core/context/run-operation.d.ts +6 -1
  50. package/dist/core/context/run-operation.js +41 -87
  51. package/dist/core/context/session-state.js +7 -8
  52. package/dist/core/context/speculative-child.js +2 -0
  53. package/dist/core/context/types.d.ts +15 -0
  54. package/dist/core/context/version-patching.d.ts +8 -0
  55. package/dist/core/context/version-patching.js +40 -0
  56. package/dist/core/context/workflow-logger.d.ts +98 -0
  57. package/dist/core/context/workflow-logger.js +68 -0
  58. package/dist/core/engine/activity-heartbeat-tracking.d.ts +64 -0
  59. package/dist/core/engine/activity-heartbeat-tracking.js +42 -0
  60. package/dist/core/engine/activity-per-attempt-timeout.d.ts +41 -0
  61. package/dist/core/engine/activity-per-attempt-timeout.js +36 -0
  62. package/dist/core/engine/activity-reconciliation.d.ts +1 -0
  63. package/dist/core/engine/activity-reconciliation.js +12 -1
  64. package/dist/core/engine/activity-resolution.d.ts +23 -0
  65. package/dist/core/engine/activity-resolution.js +37 -0
  66. package/dist/core/engine/aggregate.js +66 -30
  67. package/dist/core/engine/async-activity-completion.d.ts +23 -6
  68. package/dist/core/engine/async-activity-completion.js +53 -12
  69. package/dist/core/engine/attributes-tags.js +9 -4
  70. package/dist/core/engine/bulk-operations-purge.d.ts +26 -0
  71. package/dist/core/engine/bulk-operations-purge.js +38 -3
  72. package/dist/core/engine/bulk-operations-shared.d.ts +2 -0
  73. package/dist/core/engine/bulk-operations-shared.js +8 -2
  74. package/dist/core/engine/bulk-operations.d.ts +4 -1
  75. package/dist/core/engine/bulk-operations.js +235 -24
  76. package/dist/core/engine/callback-creators-bundles.d.ts +9 -0
  77. package/dist/core/engine/callback-creators-bundles.js +30 -2
  78. package/dist/core/engine/callback-creators-core.js +6 -4
  79. package/dist/core/engine/callback-creators-router.js +10 -0
  80. package/dist/core/engine/callback-creators-schedule.d.ts +2 -2
  81. package/dist/core/engine/callback-creators-schedule.js +12 -8
  82. package/dist/core/engine/candidate-read-batching.d.ts +6 -0
  83. package/dist/core/engine/candidate-read-batching.js +1 -0
  84. package/dist/core/engine/checkpoint-io.js +61 -25
  85. package/dist/core/engine/checkpoint-reads.js +3 -2
  86. package/dist/core/engine/checkpoint-replay.d.ts +20 -0
  87. package/dist/core/engine/checkpoint-replay.js +242 -0
  88. package/dist/core/engine/checkpoint-side-effects.d.ts +23 -0
  89. package/dist/core/engine/checkpoint-side-effects.js +35 -0
  90. package/dist/core/engine/child-workflow-cancellation.d.ts +10 -0
  91. package/dist/core/engine/child-workflow-cancellation.js +40 -0
  92. package/dist/core/engine/child-workflow.js +27 -4
  93. package/dist/core/engine/condition-waiters.d.ts +14 -0
  94. package/dist/core/engine/condition-waiters.js +5 -0
  95. package/dist/core/engine/construction.d.ts +3 -0
  96. package/dist/core/engine/construction.js +21 -8
  97. package/dist/core/engine/coordination-branch-executors.d.ts +70 -0
  98. package/dist/core/engine/coordination-branch-executors.js +107 -0
  99. package/dist/core/engine/deferred-consume-envelope.d.ts +59 -0
  100. package/dist/core/engine/deferred-consume-envelope.js +14 -0
  101. package/dist/core/engine/disposal.js +13 -0
  102. package/dist/core/engine/engine-create-types.d.ts +14 -4
  103. package/dist/core/engine/engine-internal-types.d.ts +26 -3
  104. package/dist/core/engine/errors.d.ts +47 -0
  105. package/dist/core/engine/errors.js +20 -0
  106. package/dist/core/engine/event-log-compaction.d.ts +8 -0
  107. package/dist/core/engine/event-log-compaction.js +20 -2
  108. package/dist/core/engine/fenced-write.d.ts +65 -0
  109. package/dist/core/engine/fenced-write.js +71 -0
  110. package/dist/core/engine/finalizer-state.d.ts +28 -0
  111. package/dist/core/engine/finalizer-state.js +16 -0
  112. package/dist/core/engine/handles.d.ts +8 -0
  113. package/dist/core/engine/index.d.ts +34 -16
  114. package/dist/core/engine/index.js +133 -8
  115. package/dist/core/engine/inline-parking.js +3 -2
  116. package/dist/core/engine/internals.d.ts +107 -3
  117. package/dist/core/engine/lease-codec.d.ts +35 -0
  118. package/dist/core/engine/lease-codec.js +32 -0
  119. package/dist/core/engine/lease-deposition.d.ts +66 -0
  120. package/dist/core/engine/lease-deposition.js +10 -0
  121. package/dist/core/engine/lease-errors.d.ts +99 -0
  122. package/dist/core/engine/lease-errors.js +30 -0
  123. package/dist/core/engine/lease-manager.d.ts +114 -0
  124. package/dist/core/engine/lease-manager.js +135 -0
  125. package/dist/core/engine/lifecycle/persist.js +10 -32
  126. package/dist/core/engine/lifecycle/recovered-services.d.ts +8 -6
  127. package/dist/core/engine/lifecycle/recovered-services.js +18 -3
  128. package/dist/core/engine/lifecycle/resume.js +16 -9
  129. package/dist/core/engine/lifecycle/shared.d.ts +8 -1
  130. package/dist/core/engine/lifecycle/start-batch.d.ts +1 -1
  131. package/dist/core/engine/lifecycle/start-batch.js +2 -1
  132. package/dist/core/engine/lifecycle/start-commit.d.ts +9 -0
  133. package/dist/core/engine/lifecycle/start-commit.js +50 -8
  134. package/dist/core/engine/lifecycle/start-or-signal-create.d.ts +58 -0
  135. package/dist/core/engine/lifecycle/start-or-signal-create.js +95 -0
  136. package/dist/core/engine/lifecycle/start-or-signal.d.ts +3 -2
  137. package/dist/core/engine/lifecycle/start-or-signal.js +11 -81
  138. package/dist/core/engine/lifecycle/start-terminal-conflict-purge.d.ts +39 -0
  139. package/dist/core/engine/lifecycle/start-terminal-conflict-purge.js +28 -0
  140. package/dist/core/engine/lifecycle/start.d.ts +4 -4
  141. package/dist/core/engine/lifecycle/start.js +17 -9
  142. package/dist/core/engine/lifecycle/transition.js +17 -5
  143. package/dist/core/engine/lifecycle.d.ts +1 -1
  144. package/dist/core/engine/list-candidate-resolution.js +2 -2
  145. package/dist/core/engine/listing.js +9 -5
  146. package/dist/core/engine/operations-activity.d.ts +4 -11
  147. package/dist/core/engine/operations-activity.js +22 -49
  148. package/dist/core/engine/operations-coordination.d.ts +10 -0
  149. package/dist/core/engine/operations-coordination.js +43 -8
  150. package/dist/core/engine/operations-router.d.ts +6 -0
  151. package/dist/core/engine/operations-router.js +2 -0
  152. package/dist/core/engine/operations-speculate.js +6 -2
  153. package/dist/core/engine/operations-stream.js +12 -2
  154. package/dist/core/engine/operations-time.d.ts +4 -2
  155. package/dist/core/engine/operations-time.js +14 -2
  156. package/dist/core/engine/operations-wait-condition.d.ts +23 -0
  157. package/dist/core/engine/operations-wait-condition.js +62 -0
  158. package/dist/core/engine/ownership-options.d.ts +23 -0
  159. package/dist/core/engine/ownership-options.js +26 -0
  160. package/dist/core/engine/payload-size-policy.d.ts +3 -0
  161. package/dist/core/engine/payload-size-policy.js +4 -0
  162. package/dist/core/engine/pending-updates.d.ts +17 -0
  163. package/dist/core/engine/pending-updates.js +33 -11
  164. package/dist/core/engine/queries.js +1 -1
  165. package/dist/core/engine/registration.d.ts +1 -0
  166. package/dist/core/engine/registration.js +18 -3
  167. package/dist/core/engine/schedule-jitter.d.ts +5 -0
  168. package/dist/core/engine/schedule-jitter.js +10 -0
  169. package/dist/core/engine/schedule-run.d.ts +17 -0
  170. package/dist/core/engine/schedule-run.js +38 -0
  171. package/dist/core/engine/schedule-timer.js +81 -17
  172. package/dist/core/engine/schedules.d.ts +7 -4
  173. package/dist/core/engine/schedules.js +37 -16
  174. package/dist/core/engine/search-attribute-records.d.ts +4 -0
  175. package/dist/core/engine/search-attribute-records.js +17 -0
  176. package/dist/core/engine/signals.d.ts +18 -2
  177. package/dist/core/engine/signals.js +42 -21
  178. package/dist/core/engine/state-utilities.d.ts +49 -2
  179. package/dist/core/engine/state-utilities.js +114 -3
  180. package/dist/core/engine/storage-io.d.ts +16 -2
  181. package/dist/core/engine/storage-io.js +26 -5
  182. package/dist/core/engine/stream-chunk-loading.d.ts +2 -0
  183. package/dist/core/engine/stream-chunk-loading.js +24 -1
  184. package/dist/core/engine/sub-operation.js +22 -3
  185. package/dist/core/engine/termination/cleanup.d.ts +3 -1
  186. package/dist/core/engine/termination/cleanup.js +25 -1
  187. package/dist/core/engine/termination/complete.js +44 -6
  188. package/dist/core/engine/termination/finalizer-activity.d.ts +53 -0
  189. package/dist/core/engine/termination/finalizer-activity.js +30 -0
  190. package/dist/core/engine/termination/finalizer-claim.d.ts +110 -0
  191. package/dist/core/engine/termination/finalizer-claim.js +80 -0
  192. package/dist/core/engine/termination/finalizer.d.ts +48 -0
  193. package/dist/core/engine/termination/finalizer.js +159 -0
  194. package/dist/core/engine/termination/suspend.d.ts +3 -1
  195. package/dist/core/engine/termination.d.ts +1 -0
  196. package/dist/core/engine/termination.js +4 -0
  197. package/dist/core/engine/updates.js +5 -25
  198. package/dist/core/engine/validation/schedule.d.ts +2 -1
  199. package/dist/core/engine/validation/schedule.js +51 -2
  200. package/dist/core/engine/validation.js +32 -5
  201. package/dist/core/engine/waiting-update-response.d.ts +8 -0
  202. package/dist/core/engine/waiting-update-response.js +22 -0
  203. package/dist/core/engine/workflow-concurrency.d.ts +10 -0
  204. package/dist/core/engine/workflow-concurrency.js +136 -0
  205. package/dist/core/engine/workflow-feed.d.ts +4 -5
  206. package/dist/core/engine/workflow-feed.js +4 -1
  207. package/dist/core/engine/workflow-indexes.d.ts +9 -0
  208. package/dist/core/engine/workflow-indexes.js +10 -0
  209. package/dist/core/engine/workflow-state-stream.js +33 -13
  210. package/dist/core/engine/workflow-visibility-queries.d.ts +2 -2
  211. package/dist/core/engine-helpers.js +1 -0
  212. package/dist/core/events/activity-events.d.ts +43 -12
  213. package/dist/core/events/activity-events.js +28 -0
  214. package/dist/core/events/attribute-events.d.ts +2 -3
  215. package/dist/core/events/event-map.d.ts +18 -12
  216. package/dist/core/events/index.d.ts +1 -0
  217. package/dist/core/events/index.js +1 -0
  218. package/dist/core/events/schedule-events.d.ts +71 -0
  219. package/dist/core/events/schedule-events.js +29 -0
  220. package/dist/core/events/signal-events.d.ts +4 -6
  221. package/dist/core/events/system-events.d.ts +29 -19
  222. package/dist/core/events/system-events.js +26 -0
  223. package/dist/core/events/update-events.d.ts +6 -8
  224. package/dist/core/events/workflow-events.d.ts +88 -23
  225. package/dist/core/events/workflow-events.js +26 -0
  226. package/dist/core/failure-categories.js +5 -17
  227. package/dist/core/fault-code.d.ts +9 -3
  228. package/dist/core/fault-code.js +1 -0
  229. package/dist/core/inline-execution-strategy.context-options.d.ts +69 -0
  230. package/dist/core/inline-execution-strategy.context-options.js +56 -0
  231. package/dist/core/inline-execution-strategy.d.ts +31 -36
  232. package/dist/core/inline-execution-strategy.js +16 -27
  233. package/dist/core/list-filter-validation.d.ts +1 -1
  234. package/dist/core/payload-size.d.ts +1 -1
  235. package/dist/core/persisted-data-incompatible-error.d.ts +9 -7
  236. package/dist/core/review/events.d.ts +6 -8
  237. package/dist/core/scheduler/scheduler-class.d.ts +10 -1
  238. package/dist/core/scheduler/scheduler-class.js +38 -11
  239. package/dist/core/scheduler/timer-batch.js +9 -1
  240. package/dist/core/scheduler/timer-sources.d.ts +1 -0
  241. package/dist/core/scheduler/timer-sources.js +11 -5
  242. package/dist/core/session-state.d.ts +0 -1
  243. package/dist/core/session-state.js +2 -2
  244. package/dist/core/start-workflow-validation.d.ts +34 -0
  245. package/dist/core/start-workflow-validation.js +19 -0
  246. package/dist/core/types/activity-verification.d.ts +67 -0
  247. package/dist/core/types/activity-verification.js +0 -0
  248. package/dist/core/types/activity.d.ts +80 -61
  249. package/dist/core/types/bulk.d.ts +50 -9
  250. package/dist/core/types/checkpoint.d.ts +44 -8
  251. package/dist/core/types/list-options.d.ts +146 -0
  252. package/dist/core/types/list-options.js +0 -0
  253. package/dist/core/types/options.d.ts +121 -165
  254. package/dist/core/types/schedules.d.ts +39 -3
  255. package/dist/core/types/services-resolution.d.ts +2 -2
  256. package/dist/core/types/workflow-builder-runtime.d.ts +12 -3
  257. package/dist/core/types/workflow-builder-runtime.js +11 -2
  258. package/dist/core/types/workflow-builder.d.ts +42 -11
  259. package/dist/core/types/workflow-concurrency.d.ts +39 -0
  260. package/dist/core/types/workflow-concurrency.js +0 -0
  261. package/dist/core/types/workflow-context.d.ts +157 -14
  262. package/dist/core/types/workflow-definition.d.ts +53 -10
  263. package/dist/core/types/workflow-function.d.ts +84 -9
  264. package/dist/core/types/workflow-log.d.ts +98 -0
  265. package/dist/core/types/workflow-log.js +0 -0
  266. package/dist/core/types/workflow-registries.d.ts +14 -3
  267. package/dist/core/types/workflow-registry.d.ts +3 -0
  268. package/dist/core/types.d.ts +4 -0
  269. package/dist/core/types.js +4 -0
  270. package/dist/core/versioning.d.ts +9 -39
  271. package/dist/core/versioning.js +2 -12
  272. package/dist/core/weft-error.d.ts +44 -1
  273. package/dist/core/weft-error.js +16 -0
  274. package/dist/core/worker-execution-strategy-options.d.ts +26 -0
  275. package/dist/core/worker-execution-strategy.js +40 -36
  276. package/dist/core/worker-inbound-message.d.ts +38 -0
  277. package/dist/core/worker-inbound-message.js +37 -0
  278. package/dist/core/worker-log-abuse-counter.d.ts +175 -0
  279. package/dist/core/worker-log-abuse-counter.js +107 -0
  280. package/dist/core/worker-message-helpers.d.ts +47 -0
  281. package/dist/core/worker-message-helpers.js +26 -0
  282. package/dist/core/worker-protocol-guard.js +1 -1
  283. package/dist/core/worker-protocol-log.d.ts +56 -0
  284. package/dist/core/worker-protocol-log.js +18 -0
  285. package/dist/core/worker-protocol.d.ts +23 -0
  286. package/dist/core/worker-protocol.js +12 -2
  287. package/dist/core/workflow-version-tuple.d.ts +3 -9
  288. package/dist/core/workflow-version-tuple.js +2 -3
  289. package/dist/diagnostics/format.js +1 -6
  290. package/dist/diagnostics/types.d.ts +4 -5
  291. package/dist/diagnostics/validate.d.ts +0 -1
  292. package/dist/diagnostics/version-check.d.ts +1 -1
  293. package/dist/diagnostics/version-check.js +4 -9
  294. package/dist/index.d.ts +12 -10
  295. package/dist/index.js +29 -3
  296. package/dist/json-schema.js +3 -3
  297. package/dist/mcp/cli.js +27 -27
  298. package/dist/mcp/dispatcher.js +1 -1
  299. package/dist/mcp/http.js +16 -6
  300. package/dist/mcp/protocol.d.ts +2 -0
  301. package/dist/mcp/protocol.js +1 -1
  302. package/dist/mcp/session.d.ts +16 -0
  303. package/dist/mcp/session.js +59 -6
  304. package/dist/mcp/tools.js +73 -6
  305. package/dist/observability/index.js +2 -2
  306. package/dist/server/asyncapi-channels.js +5 -2
  307. package/dist/server/attribute-filters.d.ts +8 -3
  308. package/dist/server/attribute-filters.js +6 -1
  309. package/dist/server/authentication/api-key.d.ts +2 -1
  310. package/dist/server/authentication/api-key.js +5 -2
  311. package/dist/server/authentication/constant-time-api-key.d.ts +15 -0
  312. package/dist/server/authentication/constant-time-api-key.js +24 -0
  313. package/dist/server/authentication/index.d.ts +1 -1
  314. package/dist/server/authentication/index.js +7 -4
  315. package/dist/server/authentication/rotating-api-key-store.d.ts +5 -3
  316. package/dist/server/authentication/rotating-api-key-store.js +19 -11
  317. package/dist/server/engine-event-feed-backend.d.ts +4 -5
  318. package/dist/server/fault-to-http.js +8 -1
  319. package/dist/server/fault-to-json-rpc.js +1 -0
  320. package/dist/server/fleet-event-feed.d.ts +31 -0
  321. package/dist/server/fleet-event-feed.js +157 -0
  322. package/dist/server/handler/index.js +1 -1
  323. package/dist/server/handler/response-helpers.js +2 -1
  324. package/dist/server/handler/route-dispatch.d.ts +6 -3
  325. package/dist/server/handler/route-dispatch.js +2 -2
  326. package/dist/server/handler.js +23 -23
  327. package/dist/server/index.d.ts +32 -2
  328. package/dist/server/index.js +26 -26
  329. package/dist/server/json-rpc-transport-helpers.d.ts +1 -0
  330. package/dist/server/json-rpc-transport-helpers.js +2 -1
  331. package/dist/server/json-rpc-websocket-runtime.d.ts +11 -2
  332. package/dist/server/json-rpc-websocket-runtime.js +1 -0
  333. package/dist/server/json-rpc-websocket-subscriptions.d.ts +10 -0
  334. package/dist/server/json-rpc-websocket-subscriptions.js +29 -0
  335. package/dist/server/json-rpc-websocket-types.d.ts +22 -0
  336. package/dist/server/json-rpc-websocket-types.js +0 -0
  337. package/dist/server/json-rpc-websocket-validation.js +20 -4
  338. package/dist/server/json-rpc-websocket.d.ts +2 -43
  339. package/dist/server/json-rpc-websocket.js +57 -74
  340. package/dist/server/openapi.d.ts +2 -1
  341. package/dist/server/openapi.js +1 -3
  342. package/dist/server/openrpc-document-schema.d.ts +78 -0
  343. package/dist/server/openrpc-document-schema.js +27 -1
  344. package/dist/server/openrpc-errors.d.ts +3 -0
  345. package/dist/server/openrpc-errors.js +2 -1
  346. package/dist/server/openrpc.js +32 -0
  347. package/dist/server/operation-catalog/index.d.ts +1 -1
  348. package/dist/server/operation-catalog/pipeline-helpers.js +1 -0
  349. package/dist/server/operation-catalog/pipeline-stages.js +26 -12
  350. package/dist/server/operation-catalog/pipeline.js +8 -1
  351. package/dist/server/operation-catalog/registry.js +13 -0
  352. package/dist/server/operation-catalog/types.d.ts +20 -9
  353. package/dist/server/operation-fault.d.ts +10 -0
  354. package/dist/server/operation-fault.js +2 -0
  355. package/dist/server/operation-registry.d.ts +12 -11
  356. package/dist/server/operation-registry.js +12 -3
  357. package/dist/server/operations/aggregate-workflows.d.ts +15 -15
  358. package/dist/server/operations/async-activity.d.ts +2 -2
  359. package/dist/server/operations/async-activity.js +12 -7
  360. package/dist/server/operations/bulk-cancel-workflows.d.ts +1 -1
  361. package/dist/server/operations/bulk-cancel-workflows.js +2 -2
  362. package/dist/server/operations/bulk-delete-workflows.d.ts +1 -1
  363. package/dist/server/operations/bulk-delete-workflows.js +2 -2
  364. package/dist/server/operations/bulk-filter-helpers.d.ts +8 -6
  365. package/dist/server/operations/bulk-filter-helpers.js +54 -24
  366. package/dist/server/operations/bulk-mutate-workflow-tags.d.ts +11 -9
  367. package/dist/server/operations/bulk-mutate-workflow-tags.js +2 -2
  368. package/dist/server/operations/bulk-operation-helpers.d.ts +2 -2
  369. package/dist/server/operations/bulk-retry-failed-workflows.d.ts +7 -0
  370. package/dist/server/operations/bulk-retry-failed-workflows.js +64 -0
  371. package/dist/server/operations/bulk-signal-workflows.d.ts +11 -9
  372. package/dist/server/operations/bulk-signal-workflows.js +2 -2
  373. package/dist/server/operations/cancel-schedule.d.ts +1 -1
  374. package/dist/server/operations/create-schedule.d.ts +3 -1
  375. package/dist/server/operations/create-schedule.js +29 -11
  376. package/dist/server/operations/fleet-events-subscription.d.ts +54 -0
  377. package/dist/server/operations/fleet-events-subscription.js +99 -0
  378. package/dist/server/operations/fork-workflow.d.ts +1 -1
  379. package/dist/server/operations/fork-workflow.js +3 -2
  380. package/dist/server/operations/get-checkpoint-at.d.ts +1 -1
  381. package/dist/server/operations/get-registry.d.ts +1 -1
  382. package/dist/server/operations/get-retention-overview.d.ts +1 -1
  383. package/dist/server/operations/get-review.d.ts +1 -1
  384. package/dist/server/operations/get-schedule.d.ts +1 -1
  385. package/dist/server/operations/get-stream-chunks.d.ts +1 -1
  386. package/dist/server/operations/get-system-metrics.d.ts +2 -2
  387. package/dist/server/operations/get-task-diagnostics.d.ts +45 -6
  388. package/dist/server/operations/get-task-diagnostics.js +101 -7
  389. package/dist/server/operations/get-update-result.d.ts +1 -1
  390. package/dist/server/operations/get-workflow-attributes.d.ts +1 -1
  391. package/dist/server/operations/get-workflow-events.d.ts +1 -1
  392. package/dist/server/operations/get-workflow-result.d.ts +1 -1
  393. package/dist/server/operations/get-workflow-timeline.d.ts +1 -1
  394. package/dist/server/operations/get-workflow.d.ts +1 -1
  395. package/dist/server/operations/list-checkpoints.d.ts +1 -1
  396. package/dist/server/operations/list-reviews.d.ts +1 -1
  397. package/dist/server/operations/list-schedules.d.ts +1 -1
  398. package/dist/server/operations/list-task-queues.d.ts +2 -2
  399. package/dist/server/operations/list-workers.d.ts +2 -2
  400. package/dist/server/operations/list-workflows.d.ts +1 -1
  401. package/dist/server/operations/operation-helpers.d.ts +16 -1
  402. package/dist/server/operations/operation-helpers.js +15 -3
  403. package/dist/server/operations/pause-schedule.d.ts +1 -1
  404. package/dist/server/operations/purge-workflows.d.ts +5 -5
  405. package/dist/server/operations/purge-workflows.js +2 -2
  406. package/dist/server/operations/query-workflow.d.ts +1 -1
  407. package/dist/server/operations/query-workflow.js +3 -2
  408. package/dist/server/operations/recover-all.d.ts +1 -1
  409. package/dist/server/operations/replay-workflow.d.ts +1 -1
  410. package/dist/server/operations/resume-schedule.d.ts +1 -1
  411. package/dist/server/operations/set-workflow-attributes.d.ts +1 -1
  412. package/dist/server/operations/set-workflow-attributes.js +6 -3
  413. package/dist/server/operations/signal-workflow.js +8 -3
  414. package/dist/server/operations/single-workflow-tag-mutation.js +13 -3
  415. package/dist/server/operations/start-or-signal-workflow.d.ts +6 -1
  416. package/dist/server/operations/start-or-signal-workflow.js +14 -24
  417. package/dist/server/operations/start-workflow-options.d.ts +6 -0
  418. package/dist/server/operations/start-workflow-rest-input.d.ts +14 -0
  419. package/dist/server/operations/start-workflow-rest-input.js +31 -0
  420. package/dist/server/operations/start-workflow.d.ts +1 -1
  421. package/dist/server/operations/start-workflow.js +8 -23
  422. package/dist/server/operations/storage.d.ts +6 -6
  423. package/dist/server/operations/storage.js +24 -14
  424. package/dist/server/operations/stream-workflow-sse.d.ts +1 -1
  425. package/dist/server/operations/submit-review-decision.d.ts +1 -1
  426. package/dist/server/operations/submit-review-decision.js +6 -3
  427. package/dist/server/operations/update-schedule.d.ts +1 -1
  428. package/dist/server/operations/update-schedule.js +7 -4
  429. package/dist/server/operations/update-workflow.d.ts +1 -1
  430. package/dist/server/operations/update-workflow.js +7 -3
  431. package/dist/server/operations/worker-drain.d.ts +8 -8
  432. package/dist/server/operations/worker-drain.js +11 -8
  433. package/dist/server/operations/workflow-events-subscription.d.ts +7 -8
  434. package/dist/server/operations/workflow-events-subscription.js +43 -8
  435. package/dist/server/rest-binding.d.ts +3 -1
  436. package/dist/server/rest-bindings.js +12 -0
  437. package/dist/server/rest-body.d.ts +10 -0
  438. package/dist/server/rest-body.js +80 -0
  439. package/dist/server/runtime/authentication-bridge.d.ts +1 -0
  440. package/dist/server/runtime/authentication-bridge.js +33 -6
  441. package/dist/server/runtime/client-visible-events.d.ts +3 -0
  442. package/dist/server/runtime/client-visible-events.js +65 -0
  443. package/dist/server/runtime/context.d.ts +7 -0
  444. package/dist/server/runtime/event-broadcasting.d.ts +6 -0
  445. package/dist/server/runtime/event-broadcasting.js +72 -38
  446. package/dist/server/runtime/retry.d.ts +1 -0
  447. package/dist/server/runtime/retry.js +14 -0
  448. package/dist/server/runtime/shutdown.d.ts +7 -6
  449. package/dist/server/runtime/shutdown.js +6 -1
  450. package/dist/server/runtime/task-polling.js +61 -20
  451. package/dist/server/runtime/task-reconciliation.js +9 -1
  452. package/dist/server/runtime/task-result-resolution.d.ts +15 -0
  453. package/dist/server/runtime/task-result-resolution.js +81 -0
  454. package/dist/server/runtime/websocket-stream.d.ts +20 -1
  455. package/dist/server/runtime/websocket-stream.js +173 -7
  456. package/dist/server/runtime/websocket-upgrade.js +22 -3
  457. package/dist/server/runtime/websocket-worker.d.ts +1 -1
  458. package/dist/server/runtime/websocket-worker.js +38 -30
  459. package/dist/server/serve-internals.d.ts +3 -1
  460. package/dist/server/serve-internals.js +18 -2
  461. package/dist/server/task-state.d.ts +30 -0
  462. package/dist/server/task-state.js +28 -0
  463. package/dist/server/workflow-event-feed.d.ts +36 -115
  464. package/dist/server/workflow-event-feed.js +92 -27
  465. package/dist/service-worker/index.js +30 -30
  466. package/dist/storage/auto.js +1 -1
  467. package/dist/storage/bun-sql.js +24 -0
  468. package/dist/storage/compressed-storage.js +1 -1
  469. package/dist/storage/default-scope.d.ts +7 -4
  470. package/dist/storage/http.js +2 -2
  471. package/dist/storage/index.d.ts +76 -4
  472. package/dist/storage/indexeddb.js +1 -1
  473. package/dist/storage/interface.d.ts +163 -0
  474. package/dist/storage/interface.js +1 -1
  475. package/dist/storage/key-prefixes.d.ts +1 -1
  476. package/dist/storage/key-prefixes.js +10 -0
  477. package/dist/storage/lmdb.d.ts +4 -3
  478. package/dist/storage/lmdb.js +1 -1
  479. package/dist/storage/memory.js +1 -1
  480. package/dist/storage/neon-batch.d.ts +30 -0
  481. package/dist/storage/neon-batch.js +30 -0
  482. package/dist/storage/neon-value-mapping.d.ts +30 -3
  483. package/dist/storage/neon-value-mapping.js +12 -0
  484. package/dist/storage/neon.d.ts +16 -0
  485. package/dist/storage/neon.js +9 -4
  486. package/dist/storage/node-sqlite.js +23 -0
  487. package/dist/storage/postgres-key-value-queries.d.ts +69 -44
  488. package/dist/storage/postgres-key-value-queries.js +62 -24
  489. package/dist/storage/resolve.js +1 -1
  490. package/dist/storage/scoped-storage.js +1 -1
  491. package/dist/storage/testing.d.ts +168 -0
  492. package/dist/storage/testing.js +2 -0
  493. package/dist/storage/turso.d.ts +8 -0
  494. package/dist/storage/turso.js +2 -2
  495. package/dist/storage/typed-storage.js +1 -1
  496. package/dist/storage/web-extension.js +1 -1
  497. package/dist/testing/index.js +28 -28
  498. package/dist/version.d.ts +1 -1
  499. package/dist/version.js +1 -1
  500. package/dist/worker/protocol.js +1 -1
  501. package/dist/workers/worker-replay-state.d.ts +32 -0
  502. package/dist/workers/worker-replay-state.js +35 -0
  503. package/dist/workers/worker-state-namespace.d.ts +21 -0
  504. package/dist/workers/worker-state-namespace.js +13 -0
  505. package/dist/workers/workflow-runner.d.ts +19 -15
  506. package/dist/workers/workflow-runner.js +72 -60
  507. package/dist/workers/workflow-worker-entry.js +5 -2
  508. package/package.json +5 -1
@@ -1,10 +1,15 @@
1
1
  // @bun
2
- var $W=Object.defineProperty;var YW=(W)=>W;function jW(W,E){this[W]=YW.bind(null,E)}var zW=(W,E)=>{for(var F in E)$W(W,F,{get:E[F],enumerable:!0,configurable:!0,set:jW.bind(E,F)})};var j=(W,E)=>()=>(W&&(E=W(W=0)),E);function N(W,E,F){if(!W.capabilities()[E])throw Error(`Feature "${F}" requires storage capability "${E}", but this storage backend does not provide it.`)}function MW(W){let E=W.capabilities(),F=[];if(E.persistence!=="local"&&E.persistence!=="remote")F.push(`persistence must be "local" or "remote" (got "${E.persistence}")`);if(E.readAfterWrite!=="linearizable")F.push(`readAfterWrite must be "linearizable" (got "${E.readAfterWrite}")`);if(E.scanConsistency!=="snapshot")F.push(`scanConsistency must be "snapshot" (got "${E.scanConsistency}")`);if(!E.atomicBatch)F.push("atomicBatch must be true");if(!E.conditionalBatch)F.push("conditionalBatch must be true");if(F.length>0)throw Error(`Storage is not durable enough for recovery: ${F.join("; ")}.`)}var L="default";async function h(W,E){return await W.get(E)!==null}async function*U(W,E,F){for await(let[X]of W.scan(E,F))yield X}async function b(W,E){let F=0;for await(let X of U(W,E))F++;return F}async function C(W,E){let F=[];for await(let X of U(W,E))F.push({type:"delete",key:X});if(F.length===0)return 0;return await W.batch(F),F.length}async function K(W,E,F){let X=[];for await(let J of U(W,E,F))X.push({type:"delete",key:J});if(X.length===0)return 0;return await W.batch(X),X.length}var UW;var S=j(()=>{UW=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","ev:","idx:","liveness:","offload:","op:","review:","schedule:","schedule-due:","schedule-run:","sig:","sigres:","sigseq:","start-idem:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-deadline:","wf-delayed:","wf-has-services:","wf-headers:","wf-idx-","wf-terminal:"]});function I(W){return W.length>0?W.slice(0,-1)+String.fromCharCode(W.charCodeAt(W.length-1)+1):"\xFF"}function IW(W,E={}){if(E.gt!==void 0&&W<=E.gt)return!1;if(E.gte!==void 0&&W<E.gte)return!1;if(E.lt!==void 0&&W>=E.lt)return!1;if(E.lte!==void 0&&W>E.lte)return!1;return!0}function x(W,E){if(W===null||E===null)return W===E;if(W.byteLength!==E.byteLength)return!1;for(let F=0;F<W.byteLength;F++)if(W[F]!==E[F])return!1;return!0}async function u(W,E){if(W.has)return W.has(E);return h(W,E)}function k(W,E,F){if(W.keys)return W.keys(E,F);return U(W,E,F)}async function c(W,E){if(W.count)return W.count(E);return b(W,E)}async function w(W,E){if(W.deletePrefix)return W.deletePrefix(E);return C(W,E)}async function y(W,E,F){if(N(W,"conditionalBatch","storageConditionalBatch"),!W.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return W.conditionalBatch(E,F)}function _(W){return encodeURIComponent(W)}function xW(W){return decodeURIComponent(W)}function uW(W){try{return decodeURIComponent(W)}catch{return null}}var Y=(W)=>String(W).padStart(16,"0"),kW;var H=j(()=>{S();kW={workflow:(W)=>`wf:${_(W)}`,checkpoint:(W)=>`wf:${_(W)}:ckpt`,checkpointHistory:(W,E)=>`wf:${_(W)}:ckpt:${String(E).padStart(10,"0")}`,timelinePrefix:(W)=>`wf:${_(W)}:timeline:`,timeline:(W,E)=>`wf:${_(W)}:timeline:${String(E).padStart(10,"0")}`,schedule:(W)=>`schedule:${_(W)}`,scheduleTick:(W,E)=>`schedule-due:${String(W).padStart(16,"0")}:${_(E)}`,scheduleRun:(W)=>`schedule-run:${_(W)}`,operation:(W,E,F)=>`op:${W}:${Y(E)}:${F}`,operationInflight:(W)=>`op:inflight:${W}`,operationQueued:(W)=>`op:queued:${W}`,operationResolved:(W)=>`op:resolved:${W}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(W,E,F)=>`audit:bulk:${Y(W)}:${_(E)}:${_(F)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(W,E)=>`op:resolved-by-time:${Y(W)}:${_(E)}`,asyncActivity:(W,E)=>`async-act:v1:${_(W)}:${_(E)}`,activityReconciliationPrefix:(W)=>`actrec:v1:${_(W)}:`,activityReconciliation:(W,E,F)=>`actrec:v1:${_(W)}:${_(E)}:${F}`,eventPrefix:(W)=>`ev:${_(W)}:`,event:(W,E)=>`ev:${_(W)}:${String(E).padStart(10,"0")}`,eventHead:(W)=>`ev:${_(W)}:head`,eventWatermark:(W)=>`ev:${_(W)}:watermark`,signal:(W,E,F)=>`sig:${_(W)}:${E}:${_(F)}`,signalSequence:(W)=>`sigseq:v1:${_(W)}`,signalAcceptedResponsePrefix:(W)=>`sigres:v1:${_(W)}:`,signalAcceptedResponse:(W,E,F)=>`sigres:v1:${_(W)}:${_(E)}:${_(F)}`,deadline:(W,E)=>`wf-deadline:${Y(W)}:${_(E)}`,terminalCleanup:(W,E)=>`wf-cleanup:${Y(W)}:${_(E)}`,delayedStart:(W,E)=>`wf-delayed:${Y(W)}:${_(E)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(W,E)=>`wf-terminal:${Y(W)}:${_(E)}`,attribute:(W)=>`attr:${_(W)}`,attributeIndex:(W,E,F)=>`idx:${W}:${E}:${_(F)}`,tagIndex:(W,E)=>`tag:${_(W)}:${_(E)}`,updatePrefix:(W)=>`upd:${_(W)}:`,update:(W,E)=>`upd:${_(W)}:${E}`,updateResponse:(W)=>`upr:${W}`,updateIdempotency:(W,E)=>`upk:${_(W)}:${E}`,startIdempotency:(W)=>`start-idem:${_(W)}`,startIdempotencySignalId:(W)=>`start-idem:${W}`,livenessPrefix:()=>"liveness:",liveness:(W)=>`liveness:${_(W)}`,budget:(W,E,F)=>`budget:${W}:${E}:${F}`,review:(W,E)=>`review:${_(W)}:${E}`,workflowHeaders:(W)=>`wf-headers:${_(W)}`,terminalCleanupNeeded:(W)=>`wf-cleanup-needed:${_(W)}`,workflowHasServices:(W)=>`wf-has-services:${_(W)}`,offload:(W,E)=>`offload:${_(W)}:${E}`,archive:(W,E)=>`archive:${_(W)}:${E}`,stateExecution:(W,E)=>`state:execution:${_(W)}:${_(E)}`,stateWorkflow:(W,E)=>`state:workflow-scope:${L}:${_(W)}:${_(E)}`,streamChunkPrefix:(W,E)=>`blob:${_(W)}:${E}:chunk:`,streamChunk:(W,E,F)=>`blob:${_(W)}:${E}:chunk:${String(F).padStart(10,"0")}`,streamMetadata:(W,E)=>`blob:${_(W)}:${E}:meta`,budgetCharged:(W)=>`budget-charged:${W}`,toolEffect:(W,E,F)=>`tool-effect:${_(W)}:${E}:${F}`,workflowVisibilityStatus:(W,E)=>`wf-idx-status:${_(W)}:${_(E)}`,workflowVisibilityType:(W,E)=>`wf-idx-type:${_(W)}:${_(E)}`,workflowVisibilityCreated:(W,E)=>`wf-idx-created:${Y(W)}:${_(E)}`,workflowVisibilityUpdated:(W,E)=>`wf-idx-updated:${Y(W)}:${_(E)}`,workflowVisibilityDeadline:(W,E)=>`wf-idx-deadline:${Y(W)}:${_(E)}`,workflowVisibilityManifest:(W)=>`wf-idx-manifest:${_(W)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"}});function VW(W){if(W===void 0)return;if(typeof W!=="number"||!Number.isInteger(W)||W<0)throw Error("deleteRange limit must be a finite non-negative integer");return W===0?0:W}function V(W){let E={},F=!1;for(let J of["gt","gte","lt","lte"]){let Q=W[J];if(Q===void 0)continue;if(typeof Q!=="string")throw Error("deleteRange bounds must be strings");E[J]=Q,F=!0}if(!F)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let X=VW(W.limit);if(X!==void 0)E.limit=X;return E}async function f(W,E,F){let X=V(F);if(W.deleteRange)return W.deleteRange(E,X);return K(W,E,X)}var B=()=>{};function R(W){return W.replaceAll(/:+$/g,"")}function HW(W,E){let F=R(W),X=R(E);if(F.length===0)return X;if(X.length===0)return F;return`${F}:${X}`}function m(W,E){return new A(W,E)}var A;var g=j(()=>{B();H();A=class A{#W;#_;constructor(W,E){this.#W=W,this.#_=R(E)}#E(W){if(this.#_.length===0)return W;return W.length===0?`${this.#_}:`:`${this.#_}:${W}`}#X(W){if(this.#_.length===0)return W;return W.slice(this.#_.length+1)}#F(W={}){let E={};if(W.limit!==void 0)E.limit=W.limit;if(W.reverse!==void 0)E.reverse=W.reverse;if(W.gt!==void 0)E.gt=this.#E(W.gt);if(W.gte!==void 0)E.gte=this.#E(W.gte);if(W.lt!==void 0)E.lt=this.#E(W.lt);if(W.lte!==void 0)E.lte=this.#E(W.lte);return E}#J(W){let E={};if(W.limit!==void 0)E.limit=W.limit;if(W.gt!==void 0)E.gt=this.#E(W.gt);if(W.gte!==void 0)E.gte=this.#E(W.gte);if(W.lt!==void 0)E.lt=this.#E(W.lt);if(W.lte!==void 0)E.lte=this.#E(W.lte);return E}capabilities(){return this.#W.capabilities()}scoped(W){return new A(this.#W,HW(this.#_,W))}async get(W){return this.#W.get(this.#E(W))}async put(W,E){await this.#W.put(this.#E(W),E)}async delete(W){await this.#W.delete(this.#E(W))}async*scan(W,E){for await(let[F,X]of this.#W.scan(this.#E(W),this.#F(E)))yield[this.#X(F),X]}async batch(W){await this.#W.batch(W.map((E)=>{if(E.type==="put")return{type:"put",key:this.#E(E.key),value:E.value};return{type:"delete",key:this.#E(E.key)}}))}async conditionalBatch(W,E){return y(this.#W,W.map((F)=>({key:this.#E(F.key),expectedValue:F.expectedValue})),E.map((F)=>{if(F.type==="put")return{type:"put",key:this.#E(F.key),value:F.value};return{type:"delete",key:this.#E(F.key)}}))}async has(W){return u(this.#W,this.#E(W))}async deletePrefix(W){return w(this.#W,this.#E(W))}async deleteRange(W,E){let F=this.#J(V(E));return f(this.#W,this.#E(W),F)}async*keys(W,E){for await(let F of k(this.#W,this.#E(W),this.#F(E)))yield this.#X(F)}async count(W){return c(this.#W,this.#E(W))}[Symbol.dispose](){this.#W[Symbol.dispose]()}}});function LW(W){return W.trim().replace(/;+\s*$/u,"").trim()}function BW(W){return DW.test(W)}function _W(W){let E=LW(W);if(E.length===0)throw Error("Storage query must not be empty.");if(E.includes(";"))throw Error("Storage query must contain exactly one read-only statement.");if(NW.test(E))return;if(GW.test(E)&&BW(E))return;throw Error("Storage query only supports read-only SELECT and PRAGMA statements.")}var GW,DW,NW;var XW=j(()=>{GW=/^PRAGMA\b/iu,DW=/^PRAGMA\s+(?:[A-Z_][A-Z0-9_]*\.)?[A-Z_][A-Z0-9_]*\s*$/iu,NW=/^SELECT\b/iu});B();H();import{Pool as RW}from"@neondatabase/serverless";function O(W){return W.rowCount??W.affectedRows??W.rows.length}function G(W){if(W instanceof Uint8Array)return new Uint8Array(W);return new Uint8Array(W)}function q(W){return Buffer.from(W)}H();var d=`CREATE TABLE IF NOT EXISTS kv (
2
+ var U_=Object.defineProperty;var Z_=(_)=>_;function G_(_,E){this[_]=Z_.bind(null,E)}var z_=(_,E)=>{for(var F in E)U_(_,F,{get:E[F],enumerable:!0,configurable:!0,set:G_.bind(E,F)})};var M=(_,E)=>()=>(_&&(E=_(_=0)),E);var v_=(_,E,F)=>{if(E!=null){if(typeof E!=="object"&&typeof E!=="function")throw TypeError('Object expected to be assigned to "using" declaration');let W;if(F)W=E[Symbol.asyncDispose];if(W===void 0)W=E[Symbol.dispose];if(typeof W!=="function")throw TypeError("Object not disposable");_.push([F,W,E])}else if(F)_.push([F]);return E},P_=(_,E,F)=>{let W=(Y)=>E=F?new SuppressedError(Y,E,"An error was suppressed during disposal"):(F=!0,Y),J=(Y)=>{while(Y=_.pop())try{var Q=Y[1]&&Y[1].call(Y[2]);if(Y[0])return Promise.resolve(Q).then(J,(U)=>(W(U),J()))}catch(U){W(U)}if(F)throw E};return J()};function N(_,E,F){if(!_.capabilities()[E])throw Error(`Feature "${F}" requires storage capability "${E}", but this storage backend does not provide it.`)}function M_(_){let E=_.capabilities(),F=[];if(E.persistence!=="local"&&E.persistence!=="remote")F.push(`persistence must be "local" or "remote" (got "${E.persistence}")`);if(E.readAfterWrite!=="linearizable")F.push(`readAfterWrite must be "linearizable" (got "${E.readAfterWrite}")`);if(E.scanConsistency!=="snapshot")F.push(`scanConsistency must be "snapshot" (got "${E.scanConsistency}")`);if(!E.atomicBatch)F.push("atomicBatch must be true");if(!E.conditionalBatch)F.push("conditionalBatch must be true");if(F.length>0)throw Error(`Storage is not durable enough for recovery: ${F.join("; ")}.`)}var C="default";async function q(_,E){return await _.get(E)!==null}async function*H(_,E,F){for await(let[W]of _.scan(E,F))yield W}async function h(_,E){let F=0;for await(let W of H(_,E))F++;return F}async function b(_,E){let F=[];for await(let W of H(_,E))F.push({type:"delete",key:W});if(F.length===0)return 0;return await _.batch(F),F.length}async function x(_,E,F){let W=[];for await(let J of H(_,E,F))W.push({type:"delete",key:J});if(W.length===0)return 0;return await _.batch(W),W.length}var $_;var y=M(()=>{$_=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","ev:","fleet-event-by-workflow:","fleet-event:","fleet-event-tail","idx:","lease:","liveness:","offload:","op:","review:","schedule:","schedule-due:","schedule-run:","sig:","sigres:","sigseq:","start-idem:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-concurrency:","wf-concurrency-holder:","wf-deadline:","wf-delayed:","wf-finalizer-state:","wf-has-services:","wf-headers:","wf-idx-","wf-teardown:","wf-teardown-deadletter:","wf-teardown-needed:","wf-terminal:"]});function G(_,E){if(E>A)throw new m(_,E)}function g(_){return _.length>0?_.slice(0,-1)+String.fromCharCode(_.charCodeAt(_.length-1)+1):"\xFF"}function u_(_,E={}){if(E.gt!==void 0&&_<=E.gt)return!1;if(E.gte!==void 0&&_<E.gte)return!1;if(E.lt!==void 0&&_>=E.lt)return!1;if(E.lte!==void 0&&_>E.lte)return!1;return!0}function u(_,E){if(_===null||E===null)return _===E;if(_.byteLength!==E.byteLength)return!1;for(let F=0;F<_.byteLength;F++)if(_[F]!==E[F])return!1;return!0}async function c(_,E){if(_.has)return _.has(E);return q(_,E)}function k(_,E,F){if(_.keys)return _.keys(E,F);return H(_,E,F)}async function w(_,E){if(_.count)return _.count(E);return h(_,E)}async function f(_,E){if(_.deletePrefix)return _.deletePrefix(E);return b(_,E)}async function c_(_,E){G("batch operations",E.length),await _.batch(E)}async function d(_,E,F){if(G("conditionalBatch conditions",E.length),G("conditionalBatch operations",F.length),N(_,"conditionalBatch","storageConditionalBatch"),!_.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return _.conditionalBatch(E,F)}function X(_){return encodeURIComponent(_)}function k_(_){return decodeURIComponent(_)}function w_(_){try{return decodeURIComponent(_)}catch{return null}}var A=1e4,g_=1e4,m,Z=(_)=>String(_).padStart(16,"0"),H_="0",V_="1",I=(_,E,F,W)=>`sig:${X(_)}:${X(E)}:${W}:${X(F)}`,f_;var V=M(()=>{y();m=class m extends Error{code="StorageBatchOperationLimitExceededError";cap=A;count;target;constructor(_,E){super(`${_} count ${E} exceeds MAX_BATCH_OPERATIONS (${A}).`);this.name="StorageBatchOperationLimitExceededError",this.target=_,this.count=E}};f_={workflow:(_)=>`wf:${X(_)}`,checkpoint:(_)=>`wf:${X(_)}:ckpt`,checkpointHistory:(_,E)=>`wf:${X(_)}:ckpt:${String(E).padStart(10,"0")}`,timelinePrefix:(_)=>`wf:${X(_)}:timeline:`,timeline:(_,E)=>`wf:${X(_)}:timeline:${String(E).padStart(10,"0")}`,schedule:(_)=>`schedule:${X(_)}`,scheduleTick:(_,E)=>`schedule-due:${String(_).padStart(16,"0")}:${X(E)}`,scheduleRun:(_)=>`schedule-run:${X(_)}`,operation:(_,E,F)=>`op:${_}:${Z(E)}:${F}`,operationInflight:(_)=>`op:inflight:${_}`,operationQueued:(_)=>`op:queued:${_}`,operationResolved:(_)=>`op:resolved:${_}`,operationDeadLetterPrefix:()=>"op:dead-letter:",operationDeadLetter:(_)=>`op:dead-letter:${_}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(_,E,F)=>`audit:bulk:${Z(_)}:${X(E)}:${X(F)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(_,E)=>`op:resolved-by-time:${Z(_)}:${X(E)}`,asyncActivity:(_,E)=>`async-act:v1:${X(_)}:${X(E)}`,activityReconciliationPrefix:(_)=>`actrec:v1:${X(_)}:`,activityReconciliation:(_,E,F)=>`actrec:v1:${X(_)}:${X(E)}:${F}`,eventPrefix:(_)=>`ev:${X(_)}:`,event:(_,E)=>`ev:${X(_)}:${String(E).padStart(10,"0")}`,eventHead:(_)=>`ev:${X(_)}:head`,eventWatermark:(_)=>`ev:${X(_)}:watermark`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(_)=>`fleet-event:${String(_).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventByWorkflowPrefix:(_)=>`fleet-event-by-workflow:${X(_)}:`,fleetEventByWorkflow:(_,E)=>`fleet-event-by-workflow:${X(_)}:${String(E).padStart(10,"0")}`,signal:(_,E,F)=>I(_,E,F,V_),startSignal:(_,E,F)=>I(_,E,F,H_),signalSequence:(_)=>`sigseq:v1:${X(_)}`,signalAcceptedResponsePrefix:(_)=>`sigres:v1:${X(_)}:`,signalAcceptedResponse:(_,E,F)=>`sigres:v1:${X(_)}:${X(E)}:${X(F)}`,deadline:(_,E)=>`wf-deadline:${Z(_)}:${X(E)}`,terminalCleanup:(_,E)=>`wf-cleanup:${Z(_)}:${X(E)}`,teardownTimer:(_,E)=>`wf-teardown:${Z(_)}:${X(E)}`,delayedStart:(_,E)=>`wf-delayed:${Z(_)}:${X(E)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(_,E)=>`wf-terminal:${Z(_)}:${X(E)}`,attribute:(_)=>`attr:${X(_)}`,attributeIndex:(_,E,F)=>`idx:${_}:${E}:${X(F)}`,tagIndex:(_,E)=>`tag:${X(_)}:${X(E)}`,updatePrefix:(_)=>`upd:${X(_)}:`,update:(_,E)=>`upd:${X(_)}:${E}`,updateResponse:(_)=>`upr:${_}`,updateIdempotency:(_,E)=>`upk:${X(_)}:${E}`,startIdempotency:(_)=>`start-idem:${X(_)}`,startIdempotencySignalId:(_)=>`start-idem:${_}`,livenessPrefix:()=>"liveness:",liveness:(_)=>`liveness:${X(_)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",budget:(_,E,F)=>`budget:${_}:${E}:${F}`,review:(_,E)=>`review:${X(_)}:${E}`,workflowHeaders:(_)=>`wf-headers:${X(_)}`,childCancellationPrefix:(_)=>`child-cancel:${X(_)}:`,childCancellation:(_,E)=>`child-cancel:${X(_)}:${X(E)}`,terminalCleanupNeeded:(_)=>`wf-cleanup-needed:${X(_)}`,workflowConcurrency:(_,E)=>`wf-concurrency:${X(_)}:${X(E)}`,workflowConcurrencyHolder:(_)=>`wf-concurrency-holder:${X(_)}`,workflowHasServices:(_)=>`wf-has-services:${X(_)}`,finalizerState:(_)=>`wf-finalizer-state:${X(_)}`,teardownOwed:(_)=>`wf-teardown-needed:${X(_)}`,teardownDeadLetter:(_)=>`wf-teardown-deadletter:${X(_)}`,offload:(_,E)=>`offload:${X(_)}:${E}`,archive:(_,E)=>`archive:${X(_)}:${E}`,stateExecution:(_,E)=>`state:execution:${X(_)}:${X(E)}`,stateWorkflow:(_,E)=>`state:workflow-scope:${C}:${X(_)}:${X(E)}`,streamChunkPrefix:(_,E)=>`blob:${X(_)}:${E}:chunk:`,streamChunk:(_,E,F)=>`blob:${X(_)}:${E}:chunk:${String(F).padStart(10,"0")}`,streamTail:(_,E)=>`blob:${X(_)}:${E}:tail`,streamMetadata:(_,E)=>`blob:${X(_)}:${E}:meta`,budgetCharged:(_)=>`budget-charged:${_}`,toolEffect:(_,E,F)=>`tool-effect:${X(_)}:${E}:${F}`,workflowVisibilityStatus:(_,E)=>`wf-idx-status:${X(_)}:${X(E)}`,workflowVisibilityType:(_,E)=>`wf-idx-type:${X(_)}:${X(E)}`,workflowVisibilityCreated:(_,E)=>`wf-idx-created:${Z(_)}:${X(E)}`,workflowVisibilityUpdated:(_,E)=>`wf-idx-updated:${Z(_)}:${X(E)}`,workflowVisibilityDeadline:(_,E)=>`wf-idx-deadline:${Z(_)}:${X(E)}`,workflowVisibilityManifest:(_)=>`wf-idx-manifest:${X(_)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"}});function j_(_){if(_===void 0)return;if(typeof _!=="number"||!Number.isInteger(_)||_<0)throw Error("deleteRange limit must be a finite non-negative integer");return _===0?0:_}function j(_){let E={},F=!1;for(let J of["gt","gte","lt","lte"]){let Y=_[J];if(Y===void 0)continue;if(typeof Y!=="string")throw Error("deleteRange bounds must be strings");E[J]=Y,F=!0}if(!F)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let W=j_(_.limit);if(W!==void 0)E.limit=W;return E}async function l(_,E,F){let W=j(F);if(_.deleteRange)return _.deleteRange(E,W);return x(_,E,W)}var S=()=>{};function T(_){return _.replaceAll(/:+$/g,"")}function L_(_,E){let F=T(_),W=T(E);if(F.length===0)return W;if(W.length===0)return F;return`${F}:${W}`}function p(_,E){return new K(_,E)}var K;var a=M(()=>{S();V();K=class K{#_;#E;constructor(_,E){this.#_=_,this.#E=T(E)}#F(_){if(this.#E.length===0)return _;return _.length===0?`${this.#E}:`:`${this.#E}:${_}`}#X(_){if(this.#E.length===0)return _;return _.slice(this.#E.length+1)}#Y(_={}){let E={};if(_.limit!==void 0)E.limit=_.limit;if(_.reverse!==void 0)E.reverse=_.reverse;if(_.gt!==void 0)E.gt=this.#F(_.gt);if(_.gte!==void 0)E.gte=this.#F(_.gte);if(_.lt!==void 0)E.lt=this.#F(_.lt);if(_.lte!==void 0)E.lte=this.#F(_.lte);return E}#J(_){let E={};if(_.limit!==void 0)E.limit=_.limit;if(_.gt!==void 0)E.gt=this.#F(_.gt);if(_.gte!==void 0)E.gte=this.#F(_.gte);if(_.lt!==void 0)E.lt=this.#F(_.lt);if(_.lte!==void 0)E.lte=this.#F(_.lte);return E}capabilities(){return this.#_.capabilities()}scoped(_){return new K(this.#_,L_(this.#E,_))}async get(_){return this.#_.get(this.#F(_))}async put(_,E){await this.#_.put(this.#F(_),E)}async delete(_){await this.#_.delete(this.#F(_))}async*scan(_,E){for await(let[F,W]of this.#_.scan(this.#F(_),this.#Y(E)))yield[this.#X(F),W]}async batch(_){G("batch operations",_.length),await this.#_.batch(_.map((E)=>{if(E.type==="put")return{type:"put",key:this.#F(E.key),value:E.value};return{type:"delete",key:this.#F(E.key)}}))}async conditionalBatch(_,E){return d(this.#_,_.map((F)=>({key:this.#F(F.key),expectedValue:F.expectedValue})),E.map((F)=>{if(F.type==="put")return{type:"put",key:this.#F(F.key),value:F.value};return{type:"delete",key:this.#F(F.key)}}))}async has(_){return c(this.#_,this.#F(_))}async deletePrefix(_){return f(this.#_,this.#F(_))}async deleteRange(_,E){let F=this.#J(j(E));return l(this.#_,this.#F(_),F)}async*keys(_,E){for await(let F of k(this.#_,this.#F(_),this.#Y(E)))yield this.#X(F)}async count(_){return w(this.#_,this.#F(_))}[Symbol.dispose](){this.#_[Symbol.dispose]()}}});function C_(_){return _.trim().replace(/;+\s*$/u,"").trim()}function A_(_){return B_.test(_)}function Y_(_){let E=C_(_);if(E.length===0)throw Error("Storage query must not be empty.");if(E.includes(";"))throw Error("Storage query must contain exactly one read-only statement.");if(N_.test(E))return;if(D_.test(E)&&A_(E))return;throw Error("Storage query only supports read-only SELECT and PRAGMA statements.")}var D_,B_,N_;var J_=M(()=>{D_=/^PRAGMA\b/iu,B_=/^PRAGMA\s+(?:[A-Z_][A-Z0-9_]*\.)?[A-Z_][A-Z0-9_]*\s*$/iu,N_=/^SELECT\b/iu});S();V();import{Pool as S_}from"@neondatabase/serverless";V();function O(_){return _.rowCount??_.affectedRows??_.rows.length}function L(_){if(_ instanceof Uint8Array)return new Uint8Array(_);return new Uint8Array(_)}function D(_){return Buffer.from(_)}function z(_){let E=new Map,F=new Set;for(let W of _)if(W.type==="put")F.delete(W.key),E.set(W.key,W.value);else E.delete(W.key),F.add(W.key);return{puts:E,deletes:F}}async function s(_,E,F){if(F.length===0)return!0;let W=F.map((Q)=>Q.key),J=await _.query(E.selectValuesByKeys,[W]),Y=new Map;for(let Q of J.rows){let U=Q.value;if(U!==null&&U!==void 0)Y.set(Q.key,L(U))}for(let Q of F){let U=Y.get(Q.key)??null;if(!u(U,Q.expectedValue))return!1}return!0}async function v(_,E,F){if(F.puts.size>0){let W=[],J=[];for(let[Y,Q]of F.puts)W.push(Y),J.push(D(Q));await _.query(E.upsertValuesByKeys,[W,J])}if(F.deletes.size>0)await _.query(E.deleteValuesByKeys,[[...F.deletes]])}V();var n="kv",i=/^[a-z_][a-z0-9_]*$/i;function P(_,E){if(!i.test(_))throw Error(`NeonStorage ${E} name "${_}" is not a valid Postgres identifier. Use only letters, digits, and underscores, starting with a letter or underscore (matching ${i.source}).`)}function t(_){let{schema:E,table:F}=_;if(E===void 0&&F===void 0)return n;let W=F??n;if(P(W,"table"),E===void 0)return`"${W}"`;return P(E,"schema"),`"${E}"."${W}"`}function B(_){return[_,g(_)]}function o(_,E){let{gt:F,gte:W,lt:J,lte:Y}=E,Q=B(_),U=["key >= $1 AND key < $2"];if(F!==void 0)Q.push(F),U.push(`key > $${Q.length}`);if(W!==void 0)Q.push(W),U.push(`key >= $${Q.length}`);if(J!==void 0)Q.push(J),U.push(`key < $${Q.length}`);if(Y!==void 0)Q.push(Y),U.push(`key <= $${Q.length}`);return{conditions:U,parameters:Q}}function r(_,E={}){let{limit:F,reverse:W}=E,{conditions:J,parameters:Y}=o(_,E),Q=W?"DESC":"ASC",U="";if(F!==void 0)Y.push(F),U=` LIMIT $${Y.length}`;return{parameters:Y,whereOrderLimit:`WHERE ${J.join(" AND ")} ORDER BY key ${Q}${U}`}}function e(_){let E=`CREATE TABLE IF NOT EXISTS ${_} (
3
3
  key TEXT COLLATE "C" PRIMARY KEY,
4
4
  value BYTEA NOT NULL
5
- )`,l=`
5
+ )`,F=`
6
6
  SELECT COALESCE(co.collname, 'default') AS collation
7
7
  FROM pg_attribute a
8
8
  LEFT JOIN pg_collation co ON co.oid = a.attcollation
9
- WHERE a.attrelid = to_regclass('kv') AND a.attname = 'key' AND a.attnum > 0
10
- `,p="BEGIN ISOLATION LEVEL SERIALIZABLE",s="BEGIN ISOLATION LEVEL READ COMMITTED",a="BEGIN READ ONLY",i="COMMIT",z="ROLLBACK",T="SELECT value FROM kv WHERE key = $1",v="INSERT INTO kv (key, value) VALUES ($1, $2) ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value",P="DELETE FROM kv WHERE key = $1",n="SELECT 1 AS present FROM kv WHERE key = $1 LIMIT 1",r="SELECT COUNT(*) AS count FROM kv WHERE key >= $1 AND key < $2",t="DELETE FROM kv WHERE key >= $1 AND key < $2";function D(W){return[W,I(W)]}function o(W,E){let{gt:F,gte:X,lt:J,lte:Q}=E,Z=D(W),$=["key >= $1 AND key < $2"];if(F!==void 0)Z.push(F),$.push(`key > $${Z.length}`);if(X!==void 0)Z.push(X),$.push(`key >= $${Z.length}`);if(J!==void 0)Z.push(J),$.push(`key < $${Z.length}`);if(Q!==void 0)Z.push(Q),$.push(`key <= $${Z.length}`);return{conditions:$,parameters:Z}}function e(W,E={}){let{limit:F,reverse:X}=E,{conditions:J,parameters:Q}=o(W,E),Z=X?"DESC":"ASC",$="";if(F!==void 0)Q.push(F),$=` LIMIT $${Q.length}`;return{parameters:Q,whereOrderLimit:`WHERE ${J.join(" AND ")} ORDER BY key ${Z}${$}`}}function WW(W,E={}){let{parameters:F,whereOrderLimit:X}=e(W,E);return{parameters:F,sql:`SELECT key, value FROM kv ${X}`}}function EW(W,E={}){let{parameters:F,whereOrderLimit:X}=e(W,E);return{parameters:F,sql:`SELECT key FROM kv ${X}`}}function FW(W,E){let{conditions:F,parameters:X}=o(W,E),J=F.join(" AND ");if(E.limit===void 0)return{parameters:X,sql:`DELETE FROM kv WHERE ${J}`};return X.push(E.limit),{parameters:X,sql:`DELETE FROM kv WHERE key IN (SELECT key FROM kv WHERE ${J} ORDER BY key ASC LIMIT $${X.length})`}}XW();g();var AW=new Set(["40001","40P01"]),JW=5;function OW(W){if(typeof W!=="object"||W===null||!("code"in W))return!1;let E=W.code;return typeof E==="string"&&AW.has(E)}class qW{#W;#_;#E;#X;constructor(W,E=(F)=>new RW({connectionString:F})){this.#E=W.pool===void 0,this.#W=W.pool??E(W.url)}capabilities(){return{persistence:"remote",readAfterWrite:"linearizable",scanConsistency:"snapshot",atomicBatch:!0,conditionalBatch:!0,boundedRangeDelete:!0}}#F(){return this.#_??=this.#J().catch((W)=>{throw this.#_=void 0,W}),this.#_}async#J(){await this.#W.query(d),await this.#$()}async#$(){let E=(await this.#W.query(l)).rows[0]?.collation;if(E==="C")return;let F=E===void 0?"no kv table":typeof E==="string"?`"${E}"`:"an unexpected collation value";throw Error(`NeonStorage requires the "kv" table's "key" column to use COLLATE "C" (found ${F}). A "kv" table created without COLLATE "C" sorts keys by the database locale, which breaks Weft's lexicographic prefix scans. Use a fresh database, or recreate the table as: CREATE TABLE kv (key TEXT COLLATE "C" PRIMARY KEY, value BYTEA NOT NULL).`)}async get(W){await this.#F();let F=(await this.#W.query(T,[W])).rows[0];if(F===void 0)return null;let X=F.value;if(X===null||X===void 0)return null;return G(X)}async put(W,E){await this.#F(),await this.#W.query(v,[W,q(E)])}async delete(W){await this.#F(),await this.#W.query(P,[W])}async has(W){return await this.#F(),(await this.#W.query(n,[W])).rows.length>0}async deletePrefix(W){await this.#F();let[E,F]=D(W),X=await this.#W.query(t,[E,F]);return O(X)}async deleteRange(W,E){await this.#F();let F=V(E),{parameters:X,sql:J}=FW(W,F),Q=await this.#W.query(J,X);return O(Q)}async*scan(W,E={}){await this.#F();let{parameters:F,sql:X}=WW(W,E),J=await this.#W.query(X,F);for(let Q of J.rows)yield[Q.key,G(Q.value)]}async*keys(W,E={}){await this.#F();let{parameters:F,sql:X}=EW(W,E),J=await this.#W.query(X,F);for(let Q of J.rows)yield Q.key}async count(W){await this.#F();let[E,F]=D(W),X=await this.#W.query(r,[E,F]);return Number(X.rows[0]?.count??0)}scoped(W){return m(this,W)}async#Q(W,E,F=()=>!0){let X=await this.#W.connect();try{await X.query(W);try{let J=await E(X);return await X.query(F(J)?i:z),J}catch(J){throw await X.query(z).catch(()=>{}),J}}finally{X.release()}}async batch(W){if(W.length===0)return;await this.#F(),await this.#Q(s,async(E)=>{await QW(E,W)})}async conditionalBatch(W,E){await this.#F();let F;for(let X=0;X<JW;X+=1)try{return await this.#Q(p,async(J)=>{for(let Q of W){let $=(await J.query(T,[Q.key])).rows[0]?.value,ZW=$===null||$===void 0?null:G($);if(!x(ZW,Q.expectedValue))return!1}return await QW(J,E),!0},(J)=>J)}catch(J){if(!OW(J))throw J;F=J}throw Error(`conditionalBatch exhausted ${JW} retries after retryable transaction failures`,{cause:F})}async query(W,E){return await this.#F(),_W(W),this.#Q(a,async(F)=>{return(await F.query(W,E??[])).rows})}#Z(){if(!this.#E)return Promise.resolve();return this.#X??=this.#W.end(),this.#X}[Symbol.dispose](){this.#Z().catch(()=>{})}async[Symbol.asyncDispose](){await this.#Z()}}async function QW(W,E){for(let F of E)if(F.type==="put")await W.query(v,[F.key,q(F.value)]);else await W.query(P,[F.key])}export{qW as NeonStorage};
9
+ WHERE a.attrelid = to_regclass($1) AND a.attname = 'key' AND a.attnum > 0
10
+ `;return{tableReference:_,createTable:E,selectKeyCollation:`
11
+ SELECT COALESCE(co.collname, 'default') AS collation
12
+ FROM pg_attribute a
13
+ LEFT JOIN pg_collation co ON co.oid = a.attcollation
14
+ WHERE a.attrelid = to_regclass($1) AND a.attname = 'key' AND a.attnum > 0
15
+ `,selectValueByKey:`SELECT value FROM ${_} WHERE key = $1`,upsertValueByKey:`INSERT INTO ${_} (key, value) VALUES ($1, $2) ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value`,deleteValueByKey:`DELETE FROM ${_} WHERE key = $1`,selectKeyPresence:`SELECT 1 AS present FROM ${_} WHERE key = $1 LIMIT 1`,countKeysByPrefix:`SELECT COUNT(*) AS count FROM ${_} WHERE key >= $1 AND key < $2`,deleteKeysByPrefix:`DELETE FROM ${_} WHERE key >= $1 AND key < $2`,selectValuesByKeys:`SELECT key, value FROM ${_} WHERE key = ANY($1)`,upsertValuesByKeys:`INSERT INTO ${_} (key, value) SELECT * FROM unnest($1::text[], $2::bytea[]) ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value`,deleteValuesByKeys:`DELETE FROM ${_} WHERE key = ANY($1)`,keyValueRangeSelect(W,J={}){let{parameters:Y,whereOrderLimit:Q}=r(W,J);return{parameters:Y,sql:`SELECT key, value FROM ${_} ${Q}`}},keyRangeSelect(W,J={}){let{parameters:Y,whereOrderLimit:Q}=r(W,J);return{parameters:Y,sql:`SELECT key FROM ${_} ${Q}`}},keyRangeDelete(W,J){let{conditions:Y,parameters:Q}=o(W,J),U=Y.join(" AND ");if(J.limit===void 0)return{parameters:Q,sql:`DELETE FROM ${_} WHERE ${U}`};return Q.push(J.limit),{parameters:Q,sql:`DELETE FROM ${_} WHERE key IN (SELECT key FROM ${_} WHERE ${U} ORDER BY key ASC LIMIT $${Q.length})`}}}}var __="BEGIN ISOLATION LEVEL SERIALIZABLE",E_="BEGIN ISOLATION LEVEL READ COMMITTED",F_="BEGIN READ ONLY",W_="COMMIT",R="ROLLBACK";function X_(_){return P(_,"schema"),`CREATE SCHEMA IF NOT EXISTS "${_}"`}J_();a();var T_=new Set(["40001","40P01"]),Q_=5;function K_(_){if(typeof _!=="object"||_===null||!("code"in _))return!1;let E=_.code;return typeof E==="string"&&T_.has(E)}class O_{#_;#E;#F;#X;#Y;#J;constructor(_,E=(F)=>new S_({connectionString:F})){this.#Y=_.pool===void 0,this.#_=_.pool??E(_.url),this.#F=_.schema;let F=t({schema:_.schema,table:_.table});this.#E=e(F)}capabilities(){return{persistence:"remote",readAfterWrite:"linearizable",scanConsistency:"snapshot",atomicBatch:!0,conditionalBatch:!0,boundedRangeDelete:!0}}#W(){return this.#X??=this.#Z().catch((_)=>{throw this.#X=void 0,_}),this.#X}async#Z(){if(this.#F!==void 0)await this.#_.query(X_(this.#F));await this.#_.query(this.#E.createTable),await this.#G()}async#G(){let E=(await this.#_.query(this.#E.selectKeyCollation,[this.#E.tableReference])).rows[0]?.collation;if(E==="C")return;let F=E===void 0?"no such table":typeof E==="string"?`"${E}"`:"an unexpected collation value";throw Error(`NeonStorage requires the ${this.#E.tableReference} table's "key" column to use COLLATE "C" (found ${F}). A table created without COLLATE "C" sorts keys by the database locale, which breaks Weft's lexicographic prefix scans. Use a fresh table, or recreate it as: CREATE TABLE ${this.#E.tableReference} (key TEXT COLLATE "C" PRIMARY KEY, value BYTEA NOT NULL).`)}async get(_){await this.#W();let F=(await this.#_.query(this.#E.selectValueByKey,[_])).rows[0];if(F===void 0)return null;let W=F.value;if(W===null||W===void 0)return null;return L(W)}async put(_,E){await this.#W(),await this.#_.query(this.#E.upsertValueByKey,[_,D(E)])}async delete(_){await this.#W(),await this.#_.query(this.#E.deleteValueByKey,[_])}async has(_){return await this.#W(),(await this.#_.query(this.#E.selectKeyPresence,[_])).rows.length>0}async deletePrefix(_){await this.#W();let[E,F]=B(_),W=await this.#_.query(this.#E.deleteKeysByPrefix,[E,F]);return O(W)}async deleteRange(_,E){await this.#W();let F=j(E),{parameters:W,sql:J}=this.#E.keyRangeDelete(_,F),Y=await this.#_.query(J,W);return O(Y)}async*scan(_,E={}){await this.#W();let{parameters:F,sql:W}=this.#E.keyValueRangeSelect(_,E),J=await this.#_.query(W,F);for(let Y of J.rows)yield[Y.key,L(Y.value)]}async*keys(_,E={}){await this.#W();let{parameters:F,sql:W}=this.#E.keyRangeSelect(_,E),J=await this.#_.query(W,F);for(let Y of J.rows)yield Y.key}async count(_){await this.#W();let[E,F]=B(_),W=await this.#_.query(this.#E.countKeysByPrefix,[E,F]);return Number(W.rows[0]?.count??0)}scoped(_){return p(this,_)}async#Q(_,E,F=()=>!0){let W=await this.#_.connect();try{await W.query(_);try{let J=await E(W);return await W.query(F(J)?W_:R),J}catch(J){throw await W.query(R).catch(()=>{}),J}}finally{W.release()}}async batch(_){if(G("batch operations",_.length),_.length===0)return;await this.#W(),await this.#Q(E_,async(E)=>{await v(E,this.#E,z(_))})}async conditionalBatch(_,E){G("conditionalBatch conditions",_.length),G("conditionalBatch operations",E.length),await this.#W();let F=z(E),W;for(let J=0;J<Q_;J+=1)try{return await this.#Q(__,async(Y)=>{if(!await s(Y,this.#E,_))return!1;return await v(Y,this.#E,F),!0},(Y)=>Y)}catch(Y){if(!K_(Y))throw Y;W=Y}throw Error(`conditionalBatch exhausted ${Q_} attempts after retryable transaction failures`,{cause:W})}async query(_,E){return await this.#W(),Y_(_),this.#Q(F_,async(F)=>{return(await F.query(_,E??[])).rows})}#U(){if(!this.#Y)return Promise.resolve();return this.#J??=this.#_.end(),this.#J}[Symbol.dispose](){this.#U().catch(()=>{})}async[Symbol.asyncDispose](){await this.#U()}}export{O_ as NeonStorage};
@@ -46,6 +46,24 @@ async function storageDeleteRangeCore(storage, prefix, options) {
46
46
  }
47
47
 
48
48
  // src/storage/interface.ts
49
+ var MAX_BATCH_OPERATIONS = 1e4;
50
+ class StorageBatchOperationLimitExceededError extends Error {
51
+ code = "StorageBatchOperationLimitExceededError";
52
+ cap = MAX_BATCH_OPERATIONS;
53
+ count;
54
+ target;
55
+ constructor(target, count) {
56
+ super(`${target} count ${count} exceeds MAX_BATCH_OPERATIONS (${MAX_BATCH_OPERATIONS}).`);
57
+ this.name = "StorageBatchOperationLimitExceededError";
58
+ this.target = target;
59
+ this.count = count;
60
+ }
61
+ }
62
+ function assertStorageBatchOperationCount(target, count) {
63
+ if (count > MAX_BATCH_OPERATIONS) {
64
+ throw new StorageBatchOperationLimitExceededError(target, count);
65
+ }
66
+ }
49
67
  function resolvePrefixRangeEnd(prefix) {
50
68
  return prefix.length > 0 ? prefix.slice(0, -1) + String.fromCharCode(prefix.charCodeAt(prefix.length - 1) + 1) : "\xFF";
51
69
  }
@@ -88,6 +106,8 @@ async function storageDeletePrefix(storage, prefix) {
88
106
  return storageDeletePrefixCore(storage, prefix);
89
107
  }
90
108
  async function storageConditionalBatch(storage, conditions, operations) {
109
+ assertStorageBatchOperationCount("conditionalBatch conditions", conditions.length);
110
+ assertStorageBatchOperationCount("conditionalBatch operations", operations.length);
91
111
  requireStorageCapability(storage, "conditionalBatch", "storageConditionalBatch");
92
112
  if (!storage.conditionalBatch) {
93
113
  throw new Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");
@@ -292,11 +312,14 @@ class NodeSQLiteStorage {
292
312
  }
293
313
  }
294
314
  async batch(operations) {
315
+ assertStorageBatchOperationCount("batch operations", operations.length);
295
316
  if (operations.length === 0)
296
317
  return;
297
318
  this.#batchTransaction(operations);
298
319
  }
299
320
  async conditionalBatch(conditions, operations) {
321
+ assertStorageBatchOperationCount("conditionalBatch conditions", conditions.length);
322
+ assertStorageBatchOperationCount("conditionalBatch operations", operations.length);
300
323
  const conditionalTransaction = this.#database.transaction((...arguments_) => {
301
324
  const pendingConditions = arguments_[0];
302
325
  const pendingOperations = arguments_[1];
@@ -14,24 +14,78 @@ import { type ScanOptions } from './interface.ts';
14
14
  * to the `C` collation restores byte-wise (codepoint) ordering, matching
15
15
  * SQLite's default `BINARY` collation and the engine's key-layout assumptions.
16
16
  *
17
+ * Every query is parameterized by a **table reference** so the adapter can point
18
+ * at a configured `"schema"."table"` instead of the default unqualified `kv`
19
+ * (see {@link buildPostgresKeyValueQueries}). The reference is interpolated once
20
+ * at construction, not per query.
21
+ *
17
22
  * @module storage/postgres-key-value-queries
18
23
  */
19
- export declare const PG_CREATE_KEY_VALUE_TABLE = "CREATE TABLE IF NOT EXISTS kv (\n key TEXT COLLATE \"C\" PRIMARY KEY,\n value BYTEA NOT NULL\n)";
24
+ /** The default unqualified table reference (resolves through `search_path`). */
25
+ export declare const DEFAULT_POSTGRES_TABLE_REFERENCE = "kv";
26
+ /**
27
+ * Validate a Postgres identifier (schema or table name) against a strict
28
+ * `[a-z_][a-z0-9_]*` pattern. Identifiers cannot be bound as `$n` parameters, so
29
+ * they must be interpolated into the SQL text — this validation, run once at
30
+ * construction, is the injection guard that makes interpolation safe. The strict
31
+ * pattern excludes the `"` quote character, so no quote-doubling is required.
32
+ */
33
+ export declare function assertPostgresIdentifier(value: string, role: 'schema' | 'table'): void;
34
+ /**
35
+ * Resolve the SQL table reference from optional schema/table names. With neither
36
+ * set, returns the bare unqualified `kv` so existing deployments emit
37
+ * byte-identical SQL (the default search-path-resolved table). With either set,
38
+ * returns a fully quoted `"schema"."table"` reference; both names are validated
39
+ * as strict identifiers first so the interpolation is injection-safe.
40
+ */
41
+ export declare function resolvePostgresTableReference(options: {
42
+ schema?: string | undefined;
43
+ table?: string | undefined;
44
+ }): string;
45
+ export type PostgresKeyRangeQueryParameter = string | number;
46
+ /** A fully-built SQL statement and its bound parameters (SELECT or DELETE). */
47
+ export type PostgresBuiltQuery = {
48
+ parameters: PostgresKeyRangeQueryParameter[];
49
+ sql: string;
50
+ };
51
+ export declare function buildPostgresPrefixRangeParameters(prefix: string): [string, string];
52
+ /**
53
+ * The complete set of SQL statements an adapter instance runs, all bound to one
54
+ * `tableReference`. Built once per {@link NeonStorage} via
55
+ * {@link buildPostgresKeyValueQueries}; the range builders close over the
56
+ * reference so callers never re-pass it.
57
+ */
58
+ export type PostgresKeyValueQueries = {
59
+ readonly tableReference: string;
60
+ readonly createTable: string;
61
+ readonly selectKeyCollation: string;
62
+ readonly selectValueByKey: string;
63
+ readonly upsertValueByKey: string;
64
+ readonly deleteValueByKey: string;
65
+ readonly selectKeyPresence: string;
66
+ readonly countKeysByPrefix: string;
67
+ readonly deleteKeysByPrefix: string;
68
+ /** One-statement condition read for `conditionalBatch`: `key = ANY($1)`. */
69
+ readonly selectValuesByKeys: string;
70
+ /** One-statement multi-row upsert for `batch`: `unnest($1::text[], $2::bytea[])`. */
71
+ readonly upsertValuesByKeys: string;
72
+ /** One-statement delete for `batch`: `key = ANY($1)`. */
73
+ readonly deleteValuesByKeys: string;
74
+ keyValueRangeSelect(prefix: string, options?: ScanOptions): PostgresBuiltQuery;
75
+ keyRangeSelect(prefix: string, options?: ScanOptions): PostgresBuiltQuery;
76
+ keyRangeDelete(prefix: string, options: NormalizedDeleteRangeOptions): PostgresBuiltQuery;
77
+ };
20
78
  /**
21
- * Introspect the collation of the `key` column on the `kv` table the adapter's
22
- * own unqualified queries resolve to. Returns one row with a `collation` field:
23
- * the named collation (`C` for a correctly-created table) or `default` when the
24
- * column inherits the database default collation. Returns zero rows when no `kv`
25
- * table is visible on the search path.
79
+ * Build the full query set for a `kv`-shaped table at `tableReference` (either
80
+ * the bare unqualified `kv` or a quoted `"schema"."table"`). The reference is
81
+ * already validated/quoted by {@link resolvePostgresTableReference}; this only
82
+ * interpolates it into statement text.
26
83
  *
27
- * `to_regclass('kv')` resolves the same search-path-visible relation that
28
- * unqualified DDL/DML hits, so a `kv` table in another schema cannot be inspected
29
- * by mistake (which would falsely pass a mis-collated active table or falsely
30
- * reject a valid one). Detects a pre-existing `kv` whose key collation would break
31
- * lexicographic prefix scans — a `CREATE TABLE IF NOT EXISTS` would otherwise
32
- * silently adopt it.
84
+ * The collation check uses `to_regclass($1)` with the resolved reference so it
85
+ * is scoped to the configured table — a `kv` table elsewhere on the search path
86
+ * can never be inspected by mistake.
33
87
  */
34
- export declare const PG_SELECT_KEY_COLLATION = "\n SELECT COALESCE(co.collname, 'default') AS collation\n FROM pg_attribute a\n LEFT JOIN pg_collation co ON co.oid = a.attcollation\n WHERE a.attrelid = to_regclass('kv') AND a.attname = 'key' AND a.attnum > 0\n";
88
+ export declare function buildPostgresKeyValueQueries(tableReference: string): PostgresKeyValueQueries;
35
89
  /** Begin a transaction at SERIALIZABLE isolation (conditionalBatch's CAS path). */
36
90
  export declare const PG_BEGIN_SERIALIZABLE = "BEGIN ISOLATION LEVEL SERIALIZABLE";
37
91
  /** Begin a transaction at READ COMMITTED isolation (the atomic batch() path). */
@@ -46,34 +100,5 @@ export declare const PG_BEGIN_READ_ONLY = "BEGIN READ ONLY";
46
100
  export declare const PG_COMMIT = "COMMIT";
47
101
  /** Roll back the current transaction. */
48
102
  export declare const PG_ROLLBACK = "ROLLBACK";
49
- export declare const PG_SELECT_VALUE_BY_KEY = "SELECT value FROM kv WHERE key = $1";
50
- export declare const PG_UPSERT_VALUE_BY_KEY = "INSERT INTO kv (key, value) VALUES ($1, $2) ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value";
51
- export declare const PG_DELETE_VALUE_BY_KEY = "DELETE FROM kv WHERE key = $1";
52
- export declare const PG_SELECT_KEY_PRESENCE = "SELECT 1 AS present FROM kv WHERE key = $1 LIMIT 1";
53
- export declare const PG_COUNT_KEYS_BY_PREFIX = "SELECT COUNT(*) AS count FROM kv WHERE key >= $1 AND key < $2";
54
- export declare const PG_DELETE_KEYS_BY_PREFIX = "DELETE FROM kv WHERE key >= $1 AND key < $2";
55
- export type PostgresKeyRangeQueryParameter = string | number;
56
- /** A fully-built SQL statement and its bound parameters (SELECT or DELETE). */
57
- export type PostgresBuiltQuery = {
58
- parameters: PostgresKeyRangeQueryParameter[];
59
- sql: string;
60
- };
61
- export declare function buildPostgresPrefixRangeParameters(prefix: string): [string, string];
62
- export declare function buildPostgresKeyValueRangeSelect(prefix: string, options?: ScanOptions): PostgresBuiltQuery;
63
- export declare function buildPostgresKeyRangeSelect(prefix: string, options?: ScanOptions): PostgresBuiltQuery;
64
- /**
65
- * Build a bounded-range `DELETE` for the `kv` table from already-validated
66
- * delete options.
67
- *
68
- * Without `limit`, emits `DELETE FROM kv WHERE <conditions>` — no ordering, since
69
- * order is meaningless when deleting the whole matched range. With `limit`, emits
70
- * a subquery form so the lowest (ascending) keys are deleted first:
71
- * `DELETE FROM kv WHERE key IN (SELECT key FROM kv WHERE <conditions> ORDER BY key
72
- * ASC LIMIT $n)`. Postgres does not support `DELETE ... ORDER BY ... LIMIT`
73
- * directly, so the subquery is the portable form.
74
- *
75
- * Requires {@link NormalizedDeleteRangeOptions}: the type guarantees at least one
76
- * bound is present and the prefix range is always the leading condition, so this
77
- * builder can never produce a whole-table wipe.
78
- */
79
- export declare function buildPostgresKeyRangeDelete(prefix: string, options: NormalizedDeleteRangeOptions): PostgresBuiltQuery;
103
+ /** Create the configured schema if it is absent (only when a schema is set). */
104
+ export declare function buildPostgresCreateSchema(schema: string): string;
@@ -1,13 +1,21 @@
1
1
  import { resolvePrefixRangeEnd } from "./interface.js";
2
- export const PG_CREATE_KEY_VALUE_TABLE = `CREATE TABLE IF NOT EXISTS kv (
3
- key TEXT COLLATE "C" PRIMARY KEY,
4
- value BYTEA NOT NULL
5
- )`, PG_SELECT_KEY_COLLATION = `
6
- SELECT COALESCE(co.collname, 'default') AS collation
7
- FROM pg_attribute a
8
- LEFT JOIN pg_collation co ON co.oid = a.attcollation
9
- WHERE a.attrelid = to_regclass('kv') AND a.attname = 'key' AND a.attnum > 0
10
- `, PG_BEGIN_SERIALIZABLE = "BEGIN ISOLATION LEVEL SERIALIZABLE", PG_BEGIN_READ_COMMITTED = "BEGIN ISOLATION LEVEL READ COMMITTED", PG_BEGIN_READ_ONLY = "BEGIN READ ONLY", PG_COMMIT = "COMMIT", PG_ROLLBACK = "ROLLBACK", PG_SELECT_VALUE_BY_KEY = "SELECT value FROM kv WHERE key = $1", PG_UPSERT_VALUE_BY_KEY = "INSERT INTO kv (key, value) VALUES ($1, $2) ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value", PG_DELETE_VALUE_BY_KEY = "DELETE FROM kv WHERE key = $1", PG_SELECT_KEY_PRESENCE = "SELECT 1 AS present FROM kv WHERE key = $1 LIMIT 1", PG_COUNT_KEYS_BY_PREFIX = "SELECT COUNT(*) AS count FROM kv WHERE key >= $1 AND key < $2", PG_DELETE_KEYS_BY_PREFIX = "DELETE FROM kv WHERE key >= $1 AND key < $2";
2
+ export const DEFAULT_POSTGRES_TABLE_REFERENCE = "kv";
3
+ const POSTGRES_IDENTIFIER_PATTERN = /^[a-z_][a-z0-9_]*$/i;
4
+ export function assertPostgresIdentifier(value, role) {
5
+ if (!POSTGRES_IDENTIFIER_PATTERN.test(value))
6
+ throw Error(`NeonStorage ${role} name "${value}" is not a valid Postgres identifier. Use only letters, digits, and underscores, starting with a letter or underscore (matching ${POSTGRES_IDENTIFIER_PATTERN.source}).`);
7
+ }
8
+ export function resolvePostgresTableReference(options) {
9
+ const { schema, table } = options;
10
+ if (schema === void 0 && table === void 0)
11
+ return DEFAULT_POSTGRES_TABLE_REFERENCE;
12
+ const tableName = table ?? DEFAULT_POSTGRES_TABLE_REFERENCE;
13
+ assertPostgresIdentifier(tableName, "table");
14
+ if (schema === void 0)
15
+ return `"${tableName}"`;
16
+ assertPostgresIdentifier(schema, "schema");
17
+ return `"${schema}"."${tableName}"`;
18
+ }
11
19
  export function buildPostgresPrefixRangeParameters(prefix) {
12
20
  return [prefix, resolvePrefixRangeEnd(prefix)];
13
21
  }
@@ -43,21 +51,51 @@ function buildPostgresKeyRangeQuery(prefix, options = {}) {
43
51
  whereOrderLimit: `WHERE ${conditions.join(" AND ")} ORDER BY key ${direction}${limitClause}`
44
52
  };
45
53
  }
46
- export function buildPostgresKeyValueRangeSelect(prefix, options = {}) {
47
- const { parameters, whereOrderLimit } = buildPostgresKeyRangeQuery(prefix, options);
48
- return { parameters, sql: `SELECT key, value FROM kv ${whereOrderLimit}` };
49
- }
50
- export function buildPostgresKeyRangeSelect(prefix, options = {}) {
51
- const { parameters, whereOrderLimit } = buildPostgresKeyRangeQuery(prefix, options);
52
- return { parameters, sql: `SELECT key FROM kv ${whereOrderLimit}` };
53
- }
54
- export function buildPostgresKeyRangeDelete(prefix, options) {
55
- const { conditions, parameters } = buildPostgresKeyRangeConditions(prefix, options), whereClause = conditions.join(" AND ");
56
- if (options.limit === void 0)
57
- return { parameters, sql: `DELETE FROM kv WHERE ${whereClause}` };
58
- parameters.push(options.limit);
54
+ export function buildPostgresKeyValueQueries(tableReference) {
55
+ const createTable = `CREATE TABLE IF NOT EXISTS ${tableReference} (
56
+ key TEXT COLLATE "C" PRIMARY KEY,
57
+ value BYTEA NOT NULL
58
+ )`;
59
59
  return {
60
- parameters,
61
- sql: `DELETE FROM kv WHERE key IN (SELECT key FROM kv WHERE ${whereClause} ORDER BY key ASC LIMIT $${parameters.length})`
60
+ tableReference,
61
+ createTable,
62
+ selectKeyCollation: `
63
+ SELECT COALESCE(co.collname, 'default') AS collation
64
+ FROM pg_attribute a
65
+ LEFT JOIN pg_collation co ON co.oid = a.attcollation
66
+ WHERE a.attrelid = to_regclass($1) AND a.attname = 'key' AND a.attnum > 0
67
+ `,
68
+ selectValueByKey: `SELECT value FROM ${tableReference} WHERE key = $1`,
69
+ upsertValueByKey: `INSERT INTO ${tableReference} (key, value) VALUES ($1, $2) ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value`,
70
+ deleteValueByKey: `DELETE FROM ${tableReference} WHERE key = $1`,
71
+ selectKeyPresence: `SELECT 1 AS present FROM ${tableReference} WHERE key = $1 LIMIT 1`,
72
+ countKeysByPrefix: `SELECT COUNT(*) AS count FROM ${tableReference} WHERE key >= $1 AND key < $2`,
73
+ deleteKeysByPrefix: `DELETE FROM ${tableReference} WHERE key >= $1 AND key < $2`,
74
+ selectValuesByKeys: `SELECT key, value FROM ${tableReference} WHERE key = ANY($1)`,
75
+ upsertValuesByKeys: `INSERT INTO ${tableReference} (key, value) SELECT * FROM unnest($1::text[], $2::bytea[]) ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value`,
76
+ deleteValuesByKeys: `DELETE FROM ${tableReference} WHERE key = ANY($1)`,
77
+ keyValueRangeSelect(prefix, options = {}) {
78
+ const { parameters, whereOrderLimit } = buildPostgresKeyRangeQuery(prefix, options);
79
+ return { parameters, sql: `SELECT key, value FROM ${tableReference} ${whereOrderLimit}` };
80
+ },
81
+ keyRangeSelect(prefix, options = {}) {
82
+ const { parameters, whereOrderLimit } = buildPostgresKeyRangeQuery(prefix, options);
83
+ return { parameters, sql: `SELECT key FROM ${tableReference} ${whereOrderLimit}` };
84
+ },
85
+ keyRangeDelete(prefix, options) {
86
+ const { conditions, parameters } = buildPostgresKeyRangeConditions(prefix, options), whereClause = conditions.join(" AND ");
87
+ if (options.limit === void 0)
88
+ return { parameters, sql: `DELETE FROM ${tableReference} WHERE ${whereClause}` };
89
+ parameters.push(options.limit);
90
+ return {
91
+ parameters,
92
+ sql: `DELETE FROM ${tableReference} WHERE key IN (SELECT key FROM ${tableReference} WHERE ${whereClause} ORDER BY key ASC LIMIT $${parameters.length})`
93
+ };
94
+ }
62
95
  };
63
96
  }
97
+ export const PG_BEGIN_SERIALIZABLE = "BEGIN ISOLATION LEVEL SERIALIZABLE", PG_BEGIN_READ_COMMITTED = "BEGIN ISOLATION LEVEL READ COMMITTED", PG_BEGIN_READ_ONLY = "BEGIN READ ONLY", PG_COMMIT = "COMMIT", PG_ROLLBACK = "ROLLBACK";
98
+ export function buildPostgresCreateSchema(schema) {
99
+ assertPostgresIdentifier(schema, "schema");
100
+ return `CREATE SCHEMA IF NOT EXISTS "${schema}"`;
101
+ }
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- var r=Object.defineProperty;var i=(F)=>F;function n(F,Y){this[F]=i.bind(null,Y)}var t=(F,Y)=>{for(var W in Y)r(F,W,{get:Y[W],enumerable:!0,configurable:!0,set:n.bind(Y,W)})};var U=(F,Y)=>()=>(F&&(Y=F(F=0)),Y);function N(F,Y,W){if(!F.capabilities()[Y])throw Error(`Feature "${W}" requires storage capability "${Y}", but this storage backend does not provide it.`)}function o(F){let Y=F.capabilities(),W=[];if(Y.persistence!=="local"&&Y.persistence!=="remote")W.push(`persistence must be "local" or "remote" (got "${Y.persistence}")`);if(Y.readAfterWrite!=="linearizable")W.push(`readAfterWrite must be "linearizable" (got "${Y.readAfterWrite}")`);if(Y.scanConsistency!=="snapshot")W.push(`scanConsistency must be "snapshot" (got "${Y.scanConsistency}")`);if(!Y.atomicBatch)W.push("atomicBatch must be true");if(!Y.conditionalBatch)W.push("conditionalBatch must be true");if(W.length>0)throw Error(`Storage is not durable enough for recovery: ${W.join("; ")}.`)}var P="default";async function b(F,Y){return await F.get(Y)!==null}async function*B(F,Y,W){for await(let[Z]of F.scan(Y,W))yield Z}async function v(F,Y){let W=0;for await(let Z of B(F,Y))W++;return W}async function C(F,Y){let W=[];for await(let Z of B(F,Y))W.push({type:"delete",key:Z});if(W.length===0)return 0;return await F.batch(W),W.length}async function K(F,Y,W){let Z=[];for await(let X of B(F,Y,W))Z.push({type:"delete",key:X});if(Z.length===0)return 0;return await F.batch(Z),Z.length}var e;var I=U(()=>{e=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","ev:","idx:","liveness:","offload:","op:","review:","schedule:","schedule-due:","schedule-run:","sig:","sigres:","sigseq:","start-idem:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-deadline:","wf-delayed:","wf-has-services:","wf-headers:","wf-idx-","wf-terminal:"]});function q(F){return F.length>0?F.slice(0,-1)+String.fromCharCode(F.charCodeAt(F.length-1)+1):"\xFF"}function A(F,Y={}){if(Y.gt!==void 0&&F<=Y.gt)return!1;if(Y.gte!==void 0&&F<Y.gte)return!1;if(Y.lt!==void 0&&F>=Y.lt)return!1;if(Y.lte!==void 0&&F>Y.lte)return!1;return!0}function x(F,Y){if(F===null||Y===null)return F===Y;if(F.byteLength!==Y.byteLength)return!1;for(let W=0;W<F.byteLength;W++)if(F[W]!==Y[W])return!1;return!0}async function w(F,Y){if(F.has)return F.has(Y);return b(F,Y)}function S(F,Y,W){if(F.keys)return F.keys(Y,W);return B(F,Y,W)}async function k(F,Y){if(F.count)return F.count(Y);return v(F,Y)}async function m(F,Y){if(F.deletePrefix)return F.deletePrefix(Y);return C(F,Y)}async function u(F,Y,W){if(N(F,"conditionalBatch","storageConditionalBatch"),!F.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return F.conditionalBatch(Y,W)}function J(F){return encodeURIComponent(F)}function CF(F){return decodeURIComponent(F)}function KF(F){try{return decodeURIComponent(F)}catch{return null}}var Q=(F)=>String(F).padStart(16,"0"),IF;var E=U(()=>{I();IF={workflow:(F)=>`wf:${J(F)}`,checkpoint:(F)=>`wf:${J(F)}:ckpt`,checkpointHistory:(F,Y)=>`wf:${J(F)}:ckpt:${String(Y).padStart(10,"0")}`,timelinePrefix:(F)=>`wf:${J(F)}:timeline:`,timeline:(F,Y)=>`wf:${J(F)}:timeline:${String(Y).padStart(10,"0")}`,schedule:(F)=>`schedule:${J(F)}`,scheduleTick:(F,Y)=>`schedule-due:${String(F).padStart(16,"0")}:${J(Y)}`,scheduleRun:(F)=>`schedule-run:${J(F)}`,operation:(F,Y,W)=>`op:${F}:${Q(Y)}:${W}`,operationInflight:(F)=>`op:inflight:${F}`,operationQueued:(F)=>`op:queued:${F}`,operationResolved:(F)=>`op:resolved:${F}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(F,Y,W)=>`audit:bulk:${Q(F)}:${J(Y)}:${J(W)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(F,Y)=>`op:resolved-by-time:${Q(F)}:${J(Y)}`,asyncActivity:(F,Y)=>`async-act:v1:${J(F)}:${J(Y)}`,activityReconciliationPrefix:(F)=>`actrec:v1:${J(F)}:`,activityReconciliation:(F,Y,W)=>`actrec:v1:${J(F)}:${J(Y)}:${W}`,eventPrefix:(F)=>`ev:${J(F)}:`,event:(F,Y)=>`ev:${J(F)}:${String(Y).padStart(10,"0")}`,eventHead:(F)=>`ev:${J(F)}:head`,eventWatermark:(F)=>`ev:${J(F)}:watermark`,signal:(F,Y,W)=>`sig:${J(F)}:${Y}:${J(W)}`,signalSequence:(F)=>`sigseq:v1:${J(F)}`,signalAcceptedResponsePrefix:(F)=>`sigres:v1:${J(F)}:`,signalAcceptedResponse:(F,Y,W)=>`sigres:v1:${J(F)}:${J(Y)}:${J(W)}`,deadline:(F,Y)=>`wf-deadline:${Q(F)}:${J(Y)}`,terminalCleanup:(F,Y)=>`wf-cleanup:${Q(F)}:${J(Y)}`,delayedStart:(F,Y)=>`wf-delayed:${Q(F)}:${J(Y)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(F,Y)=>`wf-terminal:${Q(F)}:${J(Y)}`,attribute:(F)=>`attr:${J(F)}`,attributeIndex:(F,Y,W)=>`idx:${F}:${Y}:${J(W)}`,tagIndex:(F,Y)=>`tag:${J(F)}:${J(Y)}`,updatePrefix:(F)=>`upd:${J(F)}:`,update:(F,Y)=>`upd:${J(F)}:${Y}`,updateResponse:(F)=>`upr:${F}`,updateIdempotency:(F,Y)=>`upk:${J(F)}:${Y}`,startIdempotency:(F)=>`start-idem:${J(F)}`,startIdempotencySignalId:(F)=>`start-idem:${F}`,livenessPrefix:()=>"liveness:",liveness:(F)=>`liveness:${J(F)}`,budget:(F,Y,W)=>`budget:${F}:${Y}:${W}`,review:(F,Y)=>`review:${J(F)}:${Y}`,workflowHeaders:(F)=>`wf-headers:${J(F)}`,terminalCleanupNeeded:(F)=>`wf-cleanup-needed:${J(F)}`,workflowHasServices:(F)=>`wf-has-services:${J(F)}`,offload:(F,Y)=>`offload:${J(F)}:${Y}`,archive:(F,Y)=>`archive:${J(F)}:${Y}`,stateExecution:(F,Y)=>`state:execution:${J(F)}:${J(Y)}`,stateWorkflow:(F,Y)=>`state:workflow-scope:${P}:${J(F)}:${J(Y)}`,streamChunkPrefix:(F,Y)=>`blob:${J(F)}:${Y}:chunk:`,streamChunk:(F,Y,W)=>`blob:${J(F)}:${Y}:chunk:${String(W).padStart(10,"0")}`,streamMetadata:(F,Y)=>`blob:${J(F)}:${Y}:meta`,budgetCharged:(F)=>`budget-charged:${F}`,toolEffect:(F,Y,W)=>`tool-effect:${J(F)}:${Y}:${W}`,workflowVisibilityStatus:(F,Y)=>`wf-idx-status:${J(F)}:${J(Y)}`,workflowVisibilityType:(F,Y)=>`wf-idx-type:${J(F)}:${J(Y)}`,workflowVisibilityCreated:(F,Y)=>`wf-idx-created:${Q(F)}:${J(Y)}`,workflowVisibilityUpdated:(F,Y)=>`wf-idx-updated:${Q(F)}:${J(Y)}`,workflowVisibilityDeadline:(F,Y)=>`wf-idx-deadline:${Q(F)}:${J(Y)}`,workflowVisibilityManifest:(F)=>`wf-idx-manifest:${J(F)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"}});function FF(F){if(F===void 0)return;if(typeof F!=="number"||!Number.isInteger(F)||F<0)throw Error("deleteRange limit must be a finite non-negative integer");return F===0?0:F}function L(F){let Y={},W=!1;for(let X of["gt","gte","lt","lte"]){let $=F[X];if($===void 0)continue;if(typeof $!=="string")throw Error("deleteRange bounds must be strings");Y[X]=$,W=!0}if(!W)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let Z=FF(F.limit);if(Z!==void 0)Y.limit=Z;return Y}async function y(F,Y,W){let Z=L(W);if(F.deleteRange)return F.deleteRange(Y,Z);return K(F,Y,Z)}var D=()=>{};function R(F){return F.replaceAll(/:+$/g,"")}function YF(F,Y){let W=R(F),Z=R(Y);if(W.length===0)return Z;if(Z.length===0)return W;return`${W}:${Z}`}function c(F,Y){return new M(F,Y)}var M;var l=U(()=>{D();E();M=class M{#F;#W;constructor(F,Y){this.#F=F,this.#W=R(Y)}#Y(F){if(this.#W.length===0)return F;return F.length===0?`${this.#W}:`:`${this.#W}:${F}`}#J(F){if(this.#W.length===0)return F;return F.slice(this.#W.length+1)}#Z(F={}){let Y={};if(F.limit!==void 0)Y.limit=F.limit;if(F.reverse!==void 0)Y.reverse=F.reverse;if(F.gt!==void 0)Y.gt=this.#Y(F.gt);if(F.gte!==void 0)Y.gte=this.#Y(F.gte);if(F.lt!==void 0)Y.lt=this.#Y(F.lt);if(F.lte!==void 0)Y.lte=this.#Y(F.lte);return Y}#$(F){let Y={};if(F.limit!==void 0)Y.limit=F.limit;if(F.gt!==void 0)Y.gt=this.#Y(F.gt);if(F.gte!==void 0)Y.gte=this.#Y(F.gte);if(F.lt!==void 0)Y.lt=this.#Y(F.lt);if(F.lte!==void 0)Y.lte=this.#Y(F.lte);return Y}capabilities(){return this.#F.capabilities()}scoped(F){return new M(this.#F,YF(this.#W,F))}async get(F){return this.#F.get(this.#Y(F))}async put(F,Y){await this.#F.put(this.#Y(F),Y)}async delete(F){await this.#F.delete(this.#Y(F))}async*scan(F,Y){for await(let[W,Z]of this.#F.scan(this.#Y(F),this.#Z(Y)))yield[this.#J(W),Z]}async batch(F){await this.#F.batch(F.map((Y)=>{if(Y.type==="put")return{type:"put",key:this.#Y(Y.key),value:Y.value};return{type:"delete",key:this.#Y(Y.key)}}))}async conditionalBatch(F,Y){return u(this.#F,F.map((W)=>({key:this.#Y(W.key),expectedValue:W.expectedValue})),Y.map((W)=>{if(W.type==="put")return{type:"put",key:this.#Y(W.key),value:W.value};return{type:"delete",key:this.#Y(W.key)}}))}async has(F){return w(this.#F,this.#Y(F))}async deletePrefix(F){return m(this.#F,this.#Y(F))}async deleteRange(F,Y){let W=this.#$(L(Y));return y(this.#F,this.#Y(F),W)}async*keys(F,Y){for await(let W of S(this.#F,this.#Y(F),this.#Z(Y)))yield this.#J(W)}async count(F){return k(this.#F,this.#Y(F))}[Symbol.dispose](){this.#F[Symbol.dispose]()}}});var WF={};t(WF,{MemoryStorage:()=>z});var z;var f=U(()=>{D();E();l();z=class z{#F;constructor(){this.#F=new Map}capabilities(){return{persistence:"ephemeral",readAfterWrite:"linearizable",scanConsistency:"snapshot",atomicBatch:!0,conditionalBatch:!0,boundedRangeDelete:!0}}#W(F,Y,W){return F>=Y&&F<W}#Y(F,Y){let W=[];for(let Z of this.#F.keys())if(this.#W(Z,F,Y))W.push(Z);return W.toSorted()}async get(F){return this.#F.get(F)??null}async put(F,Y){this.#F.set(F,Y)}async delete(F){this.#F.delete(F)}async*scan(F,Y={}){let{limit:W,reverse:Z}=Y,X=q(F),$=this.#Y(F,X);if($=$.filter((G)=>A(G,Y)),Z)$.reverse();let V=0;for(let G of $){if(W!==void 0&&V>=W)break;let h=this.#F.get(G);if(h!==void 0)yield[G,h],V++}}async batch(F){this.#J(F)}#J(F){for(let Y of F)if(Y.type==="put")this.#F.set(Y.key,Y.value);else this.#F.delete(Y.key)}async conditionalBatch(F,Y){for(let W of F){let Z=this.#F.get(W.key)??null;if(!x(Z,W.expectedValue))return!1}return this.#J(Y),!0}async has(F){return this.#F.has(F)}async deletePrefix(F){let Y=q(F),W=this.#Y(F,Y);for(let Z of W)this.#F.delete(Z);return W.length}async deleteRange(F,Y){let W=L(Y),Z=q(F),X=this.#Y(F,Z).filter((V)=>A(V,W)),$=W.limit===void 0?X:X.slice(0,W.limit);for(let V of $)this.#F.delete(V);return $.length}async*keys(F,Y={}){let{limit:W,reverse:Z}=Y,X=q(F),$=this.#Y(F,X);if($=$.filter((G)=>A(G,Y)),Z)$.reverse();let V=0;for(let G of $){if(W!==void 0&&V>=W)break;yield G,V++}}async count(F){let Y=q(F);return this.#Y(F,Y).length}scoped(F){return c(this,F)}get size(){return this.#F.size}clear(){this.#F.clear()}snapshot(){let F=new Map;for(let[Y,W]of this.#F)F.set(Y,new Uint8Array(W));return F}[Symbol.dispose](){this.#F.clear()}}});f();function H(F,Y){return import.meta.url.endsWith(".ts")?F:Y}async function j(F){return await import(F)}var JF=H("./bun-sql.ts","./bun-sql.js"),ZF=H("./node-sqlite.ts","./node-sqlite.js"),$F=H("./lmdb.ts","./lmdb.js"),XF=H("./turso.ts","./turso.js"),jF=H("./neon.ts","./neon.js"),g=H("./indexeddb.ts","./indexeddb.js"),d=H("./web-extension.ts","./web-extension.js"),QF=H("./http.ts","./http.js"),VF=H("./auto.ts","./auto.js");function s(){return typeof Bun<"u"}function p(){return typeof globalThis.process==="object"&&globalThis.process!==null&&typeof globalThis.process.versions==="object"&&typeof globalThis.process.versions.node==="string"}function HF(){let F=globalThis;return F.browser?.storage!==void 0||F.chrome?.storage!==void 0}function GF(){return typeof globalThis.indexedDB<"u"}async function qF(F){if(s()){let{BunSQLiteStorage:Y}=await j(JF);return new Y(F)}if(p()){let{NodeSQLiteStorage:Y}=await j(ZF);return new Y(F)}throw Error("SQLite storage is only available in Bun or Node runtimes.")}async function UF(){if(s()||p()){let{resolveDefaultStorage:F}=await j(VF);return F()}if(HF()){let{WebExtensionStorage:F}=await j(d);return new F}if(GF()){let{IndexedDBStorage:F}=await j(g);return new F}return new z}var a={memory:async(F)=>new z,sqlite:async(F)=>qF(F.path),lmdb:async(F)=>{let{LMDBStorage:Y}=await j($F);return new Y(F.path)},turso:async(F)=>{let{TursoStorage:Y}=await j(XF);return new Y({url:F.url,...F.authToken===void 0?{}:{authToken:F.authToken}})},neon:async(F)=>{let{NeonStorage:Y}=await j(jF);return new Y({url:F.url})},indexeddb:async(F)=>{let{IndexedDBStorage:Y}=await j(g);return new Y(F.databaseName)},"web-extension":async(F)=>{let{WebExtensionStorage:Y}=await j(d);return new Y(F.area===void 0?{}:{area:F.area})},http:async(F)=>{let{HTTPStorage:Y}=await j(QF);return new Y({baseUrl:F.baseUrl,...F.headers===void 0?{}:{headers:F.headers}})},auto:async(F)=>UF()};function _F(F){if(typeof F!=="object"||F===null)return"unknown";if(!("type"in F))return"unknown";return typeof F.type==="string"?F.type:"unknown"}function BF(F){if(typeof F!=="object"||F===null||Array.isArray(F))throw Error("Storage configuration must be an object.");return F}function T(F,Y,W){let Z=F[Y];if(typeof Z!=="string"||Z.length===0)throw Error(`${W} storage configuration requires "${Y}" as a string.`);return Z}function O(F,Y,W){let Z=F[Y];if(Z===void 0)return;if(typeof Z!=="string")throw Error(`${W} storage configuration field "${Y}" must be a string.`);return Z}function LF(F,Y,W){let Z=F[Y];if(typeof Z==="string"||Z instanceof URL)return Z;throw Error(`${W} storage configuration requires "${Y}" as a string or URL.`)}function zF(F){let Y=F.headers;if(Y===void 0)return;if(typeof Y!=="object"||Y===null||Array.isArray(Y))throw Error('HTTP storage configuration field "headers" must be a string record.');let W={};for(let[Z,X]of Object.entries(Y)){if(typeof X!=="string")throw Error('HTTP storage configuration field "headers" must be a string record.');W[Z]=X}return W}function AF(F){let Y=F.area;if(Y===void 0)return;if(Y==="local"||Y==="sync"||Y==="session"||Y==="managed")return Y;throw Error('WebExtension storage configuration field "area" must be one of local, sync, session, or managed.')}var NF={memory:(F)=>({type:"memory"}),sqlite:(F)=>{let Y=O(F,"path","SQLite");return Y===void 0?{type:"sqlite"}:{type:"sqlite",path:Y}},lmdb:(F)=>({type:"lmdb",path:T(F,"path","LMDB")}),turso:(F)=>{let Y=O(F,"authToken","Turso");return{type:"turso",url:T(F,"url","Turso"),...Y===void 0?{}:{authToken:Y}}},neon:(F)=>({type:"neon",url:T(F,"url","Neon")}),indexeddb:(F)=>{let Y=O(F,"databaseName","IndexedDB");return Y===void 0?{type:"indexeddb"}:{type:"indexeddb",databaseName:Y}},"web-extension":(F)=>{let Y=AF(F);return Y===void 0?{type:"web-extension"}:{type:"web-extension",area:Y}},http:(F)=>{let Y=zF(F);return{type:"http",baseUrl:LF(F,"baseUrl","HTTP"),...Y===void 0?{}:{headers:Y}}},auto:(F)=>({type:"auto"})};function PF(F,Y){return NF[Y](BF(F))}function EF(F){return Object.hasOwn(a,F)}async function pF(F){let Y=_F(F);if(!EF(Y))throw Error(`Unsupported storage configuration type: ${Y}`);let W=PF(F,Y),Z=a[Y];return Z(W)}export{pF as resolveStorage};
2
+ var e=Object.defineProperty;var o=(F)=>F;function FF(F,Y){this[F]=o.bind(null,Y)}var YF=(F,Y)=>{for(var J in Y)e(F,J,{get:Y[J],enumerable:!0,configurable:!0,set:FF.bind(Y,J)})};var q=(F,Y)=>()=>(F&&(Y=F(F=0)),Y);var hF=(F,Y,J)=>{if(Y!=null){if(typeof Y!=="object"&&typeof Y!=="function")throw TypeError('Object expected to be assigned to "using" declaration');let $;if(J)$=Y[Symbol.asyncDispose];if($===void 0)$=Y[Symbol.dispose];if(typeof $!=="function")throw TypeError("Object not disposable");F.push([J,$,Y])}else if(J)F.push([J]);return Y},bF=(F,Y,J)=>{let $=(W)=>Y=J?new SuppressedError(W,Y,"An error was suppressed during disposal"):(J=!0,W),X=(W)=>{while(W=F.pop())try{var V=W[1]&&W[1].call(W[2]);if(W[0])return Promise.resolve(V).then(X,(j)=>($(j),X()))}catch(j){$(j)}if(J)throw Y};return X()};function A(F,Y,J){if(!F.capabilities()[Y])throw Error(`Feature "${J}" requires storage capability "${Y}", but this storage backend does not provide it.`)}function JF(F){let Y=F.capabilities(),J=[];if(Y.persistence!=="local"&&Y.persistence!=="remote")J.push(`persistence must be "local" or "remote" (got "${Y.persistence}")`);if(Y.readAfterWrite!=="linearizable")J.push(`readAfterWrite must be "linearizable" (got "${Y.readAfterWrite}")`);if(Y.scanConsistency!=="snapshot")J.push(`scanConsistency must be "snapshot" (got "${Y.scanConsistency}")`);if(!Y.atomicBatch)J.push("atomicBatch must be true");if(!Y.conditionalBatch)J.push("conditionalBatch must be true");if(J.length>0)throw Error(`Storage is not durable enough for recovery: ${J.join("; ")}.`)}var T="default";async function O(F,Y){return await F.get(Y)!==null}async function*L(F,Y,J){for await(let[$]of F.scan(Y,J))yield $}async function v(F,Y){let J=0;for await(let $ of L(F,Y))J++;return J}async function S(F,Y){let J=[];for await(let $ of L(F,Y))J.push({type:"delete",key:$});if(J.length===0)return 0;return await F.batch(J),J.length}async function m(F,Y,J){let $=[];for await(let X of L(F,Y,J))$.push({type:"delete",key:X});if($.length===0)return 0;return await F.batch($),$.length}var ZF;var x=q(()=>{ZF=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","ev:","fleet-event-by-workflow:","fleet-event:","fleet-event-tail","idx:","lease:","liveness:","offload:","op:","review:","schedule:","schedule-due:","schedule-run:","sig:","sigres:","sigseq:","start-idem:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-concurrency:","wf-concurrency-holder:","wf-deadline:","wf-delayed:","wf-finalizer-state:","wf-has-services:","wf-headers:","wf-idx-","wf-teardown:","wf-teardown-deadletter:","wf-teardown-needed:","wf-terminal:"]});function G(F,Y){if(Y>N)throw new y(F,Y)}function _(F){return F.length>0?F.slice(0,-1)+String.fromCharCode(F.charCodeAt(F.length-1)+1):"\xFF"}function P(F,Y={}){if(Y.gt!==void 0&&F<=Y.gt)return!1;if(Y.gte!==void 0&&F<Y.gte)return!1;if(Y.lt!==void 0&&F>=Y.lt)return!1;if(Y.lte!==void 0&&F>Y.lte)return!1;return!0}function w(F,Y){if(F===null||Y===null)return F===Y;if(F.byteLength!==Y.byteLength)return!1;for(let J=0;J<F.byteLength;J++)if(F[J]!==Y[J])return!1;return!0}async function c(F,Y){if(F.has)return F.has(Y);return O(F,Y)}function k(F,Y,J){if(F.keys)return F.keys(Y,J);return L(F,Y,J)}async function u(F,Y){if(F.count)return F.count(Y);return v(F,Y)}async function g(F,Y){if(F.deletePrefix)return F.deletePrefix(Y);return S(F,Y)}async function kF(F,Y){G("batch operations",Y.length),await F.batch(Y)}async function l(F,Y,J){if(G("conditionalBatch conditions",Y.length),G("conditionalBatch operations",J.length),A(F,"conditionalBatch","storageConditionalBatch"),!F.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return F.conditionalBatch(Y,J)}function Z(F){return encodeURIComponent(F)}function uF(F){return decodeURIComponent(F)}function gF(F){try{return decodeURIComponent(F)}catch{return null}}var N=1e4,cF=1e4,y,Q=(F)=>String(F).padStart(16,"0"),$F="0",WF="1",I=(F,Y,J,$)=>`sig:${Z(F)}:${Z(Y)}:${$}:${Z(J)}`,lF;var E=q(()=>{x();y=class y extends Error{code="StorageBatchOperationLimitExceededError";cap=N;count;target;constructor(F,Y){super(`${F} count ${Y} exceeds MAX_BATCH_OPERATIONS (${N}).`);this.name="StorageBatchOperationLimitExceededError",this.target=F,this.count=Y}};lF={workflow:(F)=>`wf:${Z(F)}`,checkpoint:(F)=>`wf:${Z(F)}:ckpt`,checkpointHistory:(F,Y)=>`wf:${Z(F)}:ckpt:${String(Y).padStart(10,"0")}`,timelinePrefix:(F)=>`wf:${Z(F)}:timeline:`,timeline:(F,Y)=>`wf:${Z(F)}:timeline:${String(Y).padStart(10,"0")}`,schedule:(F)=>`schedule:${Z(F)}`,scheduleTick:(F,Y)=>`schedule-due:${String(F).padStart(16,"0")}:${Z(Y)}`,scheduleRun:(F)=>`schedule-run:${Z(F)}`,operation:(F,Y,J)=>`op:${F}:${Q(Y)}:${J}`,operationInflight:(F)=>`op:inflight:${F}`,operationQueued:(F)=>`op:queued:${F}`,operationResolved:(F)=>`op:resolved:${F}`,operationDeadLetterPrefix:()=>"op:dead-letter:",operationDeadLetter:(F)=>`op:dead-letter:${F}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(F,Y,J)=>`audit:bulk:${Q(F)}:${Z(Y)}:${Z(J)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(F,Y)=>`op:resolved-by-time:${Q(F)}:${Z(Y)}`,asyncActivity:(F,Y)=>`async-act:v1:${Z(F)}:${Z(Y)}`,activityReconciliationPrefix:(F)=>`actrec:v1:${Z(F)}:`,activityReconciliation:(F,Y,J)=>`actrec:v1:${Z(F)}:${Z(Y)}:${J}`,eventPrefix:(F)=>`ev:${Z(F)}:`,event:(F,Y)=>`ev:${Z(F)}:${String(Y).padStart(10,"0")}`,eventHead:(F)=>`ev:${Z(F)}:head`,eventWatermark:(F)=>`ev:${Z(F)}:watermark`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(F)=>`fleet-event:${String(F).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventByWorkflowPrefix:(F)=>`fleet-event-by-workflow:${Z(F)}:`,fleetEventByWorkflow:(F,Y)=>`fleet-event-by-workflow:${Z(F)}:${String(Y).padStart(10,"0")}`,signal:(F,Y,J)=>I(F,Y,J,WF),startSignal:(F,Y,J)=>I(F,Y,J,$F),signalSequence:(F)=>`sigseq:v1:${Z(F)}`,signalAcceptedResponsePrefix:(F)=>`sigres:v1:${Z(F)}:`,signalAcceptedResponse:(F,Y,J)=>`sigres:v1:${Z(F)}:${Z(Y)}:${Z(J)}`,deadline:(F,Y)=>`wf-deadline:${Q(F)}:${Z(Y)}`,terminalCleanup:(F,Y)=>`wf-cleanup:${Q(F)}:${Z(Y)}`,teardownTimer:(F,Y)=>`wf-teardown:${Q(F)}:${Z(Y)}`,delayedStart:(F,Y)=>`wf-delayed:${Q(F)}:${Z(Y)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(F,Y)=>`wf-terminal:${Q(F)}:${Z(Y)}`,attribute:(F)=>`attr:${Z(F)}`,attributeIndex:(F,Y,J)=>`idx:${F}:${Y}:${Z(J)}`,tagIndex:(F,Y)=>`tag:${Z(F)}:${Z(Y)}`,updatePrefix:(F)=>`upd:${Z(F)}:`,update:(F,Y)=>`upd:${Z(F)}:${Y}`,updateResponse:(F)=>`upr:${F}`,updateIdempotency:(F,Y)=>`upk:${Z(F)}:${Y}`,startIdempotency:(F)=>`start-idem:${Z(F)}`,startIdempotencySignalId:(F)=>`start-idem:${F}`,livenessPrefix:()=>"liveness:",liveness:(F)=>`liveness:${Z(F)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",budget:(F,Y,J)=>`budget:${F}:${Y}:${J}`,review:(F,Y)=>`review:${Z(F)}:${Y}`,workflowHeaders:(F)=>`wf-headers:${Z(F)}`,childCancellationPrefix:(F)=>`child-cancel:${Z(F)}:`,childCancellation:(F,Y)=>`child-cancel:${Z(F)}:${Z(Y)}`,terminalCleanupNeeded:(F)=>`wf-cleanup-needed:${Z(F)}`,workflowConcurrency:(F,Y)=>`wf-concurrency:${Z(F)}:${Z(Y)}`,workflowConcurrencyHolder:(F)=>`wf-concurrency-holder:${Z(F)}`,workflowHasServices:(F)=>`wf-has-services:${Z(F)}`,finalizerState:(F)=>`wf-finalizer-state:${Z(F)}`,teardownOwed:(F)=>`wf-teardown-needed:${Z(F)}`,teardownDeadLetter:(F)=>`wf-teardown-deadletter:${Z(F)}`,offload:(F,Y)=>`offload:${Z(F)}:${Y}`,archive:(F,Y)=>`archive:${Z(F)}:${Y}`,stateExecution:(F,Y)=>`state:execution:${Z(F)}:${Z(Y)}`,stateWorkflow:(F,Y)=>`state:workflow-scope:${T}:${Z(F)}:${Z(Y)}`,streamChunkPrefix:(F,Y)=>`blob:${Z(F)}:${Y}:chunk:`,streamChunk:(F,Y,J)=>`blob:${Z(F)}:${Y}:chunk:${String(J).padStart(10,"0")}`,streamTail:(F,Y)=>`blob:${Z(F)}:${Y}:tail`,streamMetadata:(F,Y)=>`blob:${Z(F)}:${Y}:meta`,budgetCharged:(F)=>`budget-charged:${F}`,toolEffect:(F,Y,J)=>`tool-effect:${Z(F)}:${Y}:${J}`,workflowVisibilityStatus:(F,Y)=>`wf-idx-status:${Z(F)}:${Z(Y)}`,workflowVisibilityType:(F,Y)=>`wf-idx-type:${Z(F)}:${Z(Y)}`,workflowVisibilityCreated:(F,Y)=>`wf-idx-created:${Q(F)}:${Z(Y)}`,workflowVisibilityUpdated:(F,Y)=>`wf-idx-updated:${Q(F)}:${Z(Y)}`,workflowVisibilityDeadline:(F,Y)=>`wf-idx-deadline:${Q(F)}:${Z(Y)}`,workflowVisibilityManifest:(F)=>`wf-idx-manifest:${Z(F)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"}});function XF(F){if(F===void 0)return;if(typeof F!=="number"||!Number.isInteger(F)||F<0)throw Error("deleteRange limit must be a finite non-negative integer");return F===0?0:F}function z(F){let Y={},J=!1;for(let X of["gt","gte","lt","lte"]){let W=F[X];if(W===void 0)continue;if(typeof W!=="string")throw Error("deleteRange bounds must be strings");Y[X]=W,J=!0}if(!J)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let $=XF(F.limit);if($!==void 0)Y.limit=$;return Y}async function f(F,Y,J){let $=z(J);if(F.deleteRange)return F.deleteRange(Y,$);return m(F,Y,$)}var K=()=>{};function D(F){return F.replaceAll(/:+$/g,"")}function jF(F,Y){let J=D(F),$=D(Y);if(J.length===0)return $;if($.length===0)return J;return`${J}:${$}`}function d(F,Y){return new R(F,Y)}var R;var p=q(()=>{K();E();R=class R{#F;#J;constructor(F,Y){this.#F=F,this.#J=D(Y)}#Y(F){if(this.#J.length===0)return F;return F.length===0?`${this.#J}:`:`${this.#J}:${F}`}#Z(F){if(this.#J.length===0)return F;return F.slice(this.#J.length+1)}#$(F={}){let Y={};if(F.limit!==void 0)Y.limit=F.limit;if(F.reverse!==void 0)Y.reverse=F.reverse;if(F.gt!==void 0)Y.gt=this.#Y(F.gt);if(F.gte!==void 0)Y.gte=this.#Y(F.gte);if(F.lt!==void 0)Y.lt=this.#Y(F.lt);if(F.lte!==void 0)Y.lte=this.#Y(F.lte);return Y}#W(F){let Y={};if(F.limit!==void 0)Y.limit=F.limit;if(F.gt!==void 0)Y.gt=this.#Y(F.gt);if(F.gte!==void 0)Y.gte=this.#Y(F.gte);if(F.lt!==void 0)Y.lt=this.#Y(F.lt);if(F.lte!==void 0)Y.lte=this.#Y(F.lte);return Y}capabilities(){return this.#F.capabilities()}scoped(F){return new R(this.#F,jF(this.#J,F))}async get(F){return this.#F.get(this.#Y(F))}async put(F,Y){await this.#F.put(this.#Y(F),Y)}async delete(F){await this.#F.delete(this.#Y(F))}async*scan(F,Y){for await(let[J,$]of this.#F.scan(this.#Y(F),this.#$(Y)))yield[this.#Z(J),$]}async batch(F){G("batch operations",F.length),await this.#F.batch(F.map((Y)=>{if(Y.type==="put")return{type:"put",key:this.#Y(Y.key),value:Y.value};return{type:"delete",key:this.#Y(Y.key)}}))}async conditionalBatch(F,Y){return l(this.#F,F.map((J)=>({key:this.#Y(J.key),expectedValue:J.expectedValue})),Y.map((J)=>{if(J.type==="put")return{type:"put",key:this.#Y(J.key),value:J.value};return{type:"delete",key:this.#Y(J.key)}}))}async has(F){return c(this.#F,this.#Y(F))}async deletePrefix(F){return g(this.#F,this.#Y(F))}async deleteRange(F,Y){let J=this.#W(z(Y));return f(this.#F,this.#Y(F),J)}async*keys(F,Y){for await(let J of k(this.#F,this.#Y(F),this.#$(Y)))yield this.#Z(J)}async count(F){return u(this.#F,this.#Y(F))}[Symbol.dispose](){this.#F[Symbol.dispose]()}}});var VF={};YF(VF,{MemoryStorage:()=>B});var B;var s=q(()=>{K();E();p();B=class B{#F;constructor(){this.#F=new Map}capabilities(){return{persistence:"ephemeral",readAfterWrite:"linearizable",scanConsistency:"snapshot",atomicBatch:!0,conditionalBatch:!0,boundedRangeDelete:!0}}#J(F,Y,J){return F>=Y&&F<J}#Y(F,Y){let J=[];for(let $ of this.#F.keys())if(this.#J($,F,Y))J.push($);return J.toSorted()}async get(F){return this.#F.get(F)??null}async put(F,Y){this.#F.set(F,Y)}async delete(F){this.#F.delete(F)}async*scan(F,Y={}){let{limit:J,reverse:$}=Y,X=_(F),W=this.#Y(F,X);if(W=W.filter((j)=>P(j,Y)),$)W.reverse();let V=0;for(let j of W){if(J!==void 0&&V>=J)break;let b=this.#F.get(j);if(b!==void 0)yield[j,b],V++}}async batch(F){G("batch operations",F.length),this.#Z(F)}#Z(F){for(let Y of F)if(Y.type==="put")this.#F.set(Y.key,Y.value);else this.#F.delete(Y.key)}async conditionalBatch(F,Y){G("conditionalBatch conditions",F.length),G("conditionalBatch operations",Y.length);for(let J of F){let $=this.#F.get(J.key)??null;if(!w($,J.expectedValue))return!1}return this.#Z(Y),!0}async has(F){return this.#F.has(F)}async deletePrefix(F){let Y=_(F),J=this.#Y(F,Y);for(let $ of J)this.#F.delete($);return J.length}async deleteRange(F,Y){let J=z(Y),$=_(F),X=this.#Y(F,$).filter((V)=>P(V,J)),W=J.limit===void 0?X:X.slice(0,J.limit);for(let V of W)this.#F.delete(V);return W.length}async*keys(F,Y={}){let{limit:J,reverse:$}=Y,X=_(F),W=this.#Y(F,X);if(W=W.filter((j)=>P(j,Y)),$)W.reverse();let V=0;for(let j of W){if(J!==void 0&&V>=J)break;yield j,V++}}async count(F){let Y=_(F);return this.#Y(F,Y).length}scoped(F){return d(this,F)}get size(){return this.#F.size}clear(){this.#F.clear()}snapshot(){let F=new Map;for(let[Y,J]of this.#F)F.set(Y,new Uint8Array(J));return F}[Symbol.dispose](){this.#F.clear()}}});s();function U(F,Y){return import.meta.url.endsWith(".ts")?F:Y}async function H(F){return await import(F)}var QF=U("./bun-sql.ts","./bun-sql.js"),HF=U("./node-sqlite.ts","./node-sqlite.js"),GF=U("./lmdb.ts","./lmdb.js"),UF=U("./turso.ts","./turso.js"),_F=U("./neon.ts","./neon.js"),a=U("./indexeddb.ts","./indexeddb.js"),n=U("./web-extension.ts","./web-extension.js"),qF=U("./http.ts","./http.js"),CF=U("./auto.ts","./auto.js");function t(){return typeof Bun<"u"}function r(){return typeof globalThis.process==="object"&&globalThis.process!==null&&typeof globalThis.process.versions==="object"&&typeof globalThis.process.versions.node==="string"}function LF(){let F=globalThis;return F.browser?.storage!==void 0||F.chrome?.storage!==void 0}function zF(){return typeof globalThis.indexedDB<"u"}async function BF(F){if(t()){let{BunSQLiteStorage:Y}=await H(QF);return new Y(F)}if(r()){let{NodeSQLiteStorage:Y}=await H(HF);return new Y(F)}throw Error("SQLite storage is only available in Bun or Node runtimes.")}async function PF(){if(t()||r()){let{resolveDefaultStorage:F}=await H(CF);return F()}if(LF()){let{WebExtensionStorage:F}=await H(n);return new F}if(zF()){let{IndexedDBStorage:F}=await H(a);return new F}return new B}var i={memory:async(F)=>new B,sqlite:async(F)=>BF(F.path),lmdb:async(F)=>{let{LMDBStorage:Y}=await H(GF);return new Y(F.path)},turso:async(F)=>{let{TursoStorage:Y}=await H(UF);return new Y({url:F.url,...F.authToken===void 0?{}:{authToken:F.authToken}})},neon:async(F)=>{let{NeonStorage:Y}=await H(_F);return new Y({url:F.url})},indexeddb:async(F)=>{let{IndexedDBStorage:Y}=await H(a);return new Y(F.databaseName)},"web-extension":async(F)=>{let{WebExtensionStorage:Y}=await H(n);return new Y(F.area===void 0?{}:{area:F.area})},http:async(F)=>{let{HTTPStorage:Y}=await H(qF);return new Y({baseUrl:F.baseUrl,...F.headers===void 0?{}:{headers:F.headers}})},auto:async(F)=>PF()};function AF(F){if(typeof F!=="object"||F===null)return"unknown";if(!("type"in F))return"unknown";return typeof F.type==="string"?F.type:"unknown"}function TF(F){if(typeof F!=="object"||F===null||Array.isArray(F))throw Error("Storage configuration must be an object.");return F}function M(F,Y,J){let $=F[Y];if(typeof $!=="string"||$.length===0)throw Error(`${J} storage configuration requires "${Y}" as a string.`);return $}function h(F,Y,J){let $=F[Y];if($===void 0)return;if(typeof $!=="string")throw Error(`${J} storage configuration field "${Y}" must be a string.`);return $}function NF(F,Y,J){let $=F[Y];if(typeof $==="string"||$ instanceof URL)return $;throw Error(`${J} storage configuration requires "${Y}" as a string or URL.`)}function EF(F){let Y=F.headers;if(Y===void 0)return;if(typeof Y!=="object"||Y===null||Array.isArray(Y))throw Error('HTTP storage configuration field "headers" must be a string record.');let J={};for(let[$,X]of Object.entries(Y)){if(typeof X!=="string")throw Error('HTTP storage configuration field "headers" must be a string record.');J[$]=X}return J}function KF(F){let Y=F.area;if(Y===void 0)return;if(Y==="local"||Y==="sync"||Y==="session"||Y==="managed")return Y;throw Error('WebExtension storage configuration field "area" must be one of local, sync, session, or managed.')}var DF={memory:(F)=>({type:"memory"}),sqlite:(F)=>{let Y=h(F,"path","SQLite");return Y===void 0?{type:"sqlite"}:{type:"sqlite",path:Y}},lmdb:(F)=>({type:"lmdb",path:M(F,"path","LMDB")}),turso:(F)=>{let Y=h(F,"authToken","Turso");return{type:"turso",url:M(F,"url","Turso"),...Y===void 0?{}:{authToken:Y}}},neon:(F)=>({type:"neon",url:M(F,"url","Neon")}),indexeddb:(F)=>{let Y=h(F,"databaseName","IndexedDB");return Y===void 0?{type:"indexeddb"}:{type:"indexeddb",databaseName:Y}},"web-extension":(F)=>{let Y=KF(F);return Y===void 0?{type:"web-extension"}:{type:"web-extension",area:Y}},http:(F)=>{let Y=EF(F);return{type:"http",baseUrl:NF(F,"baseUrl","HTTP"),...Y===void 0?{}:{headers:Y}}},auto:(F)=>({type:"auto"})};function RF(F,Y){return DF[Y](TF(F))}function MF(F){return Object.hasOwn(i,F)}async function JY(F){let Y=AF(F);if(!MF(Y))throw Error(`Unsupported storage configuration type: ${Y}`);let J=RF(F,Y),$=i[Y];return $(J)}export{JY as resolveStorage};
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- var b=Object.defineProperty;var u=(E)=>E;function C(E,_){this[E]=u.bind(null,_)}var k=(E,_)=>{for(var F in _)b(E,F,{get:_[F],enumerable:!0,configurable:!0,set:C.bind(_,F)})};var V=(E,_)=>()=>(E&&(_=E(E=0)),_);function $(E,_,F){if(!E.capabilities()[_])throw Error(`Feature "${F}" requires storage capability "${_}", but this storage backend does not provide it.`)}function S(E){let _=E.capabilities(),F=[];if(_.persistence!=="local"&&_.persistence!=="remote")F.push(`persistence must be "local" or "remote" (got "${_.persistence}")`);if(_.readAfterWrite!=="linearizable")F.push(`readAfterWrite must be "linearizable" (got "${_.readAfterWrite}")`);if(_.scanConsistency!=="snapshot")F.push(`scanConsistency must be "snapshot" (got "${_.scanConsistency}")`);if(!_.atomicBatch)F.push("atomicBatch must be true");if(!_.conditionalBatch)F.push("conditionalBatch must be true");if(F.length>0)throw Error(`Storage is not durable enough for recovery: ${F.join("; ")}.`)}var G="default";async function L(E,_){return await E.get(_)!==null}async function*Q(E,_,F){for await(let[Y]of E.scan(_,F))yield Y}async function B(E,_){let F=0;for await(let Y of Q(E,_))F++;return F}async function R(E,_){let F=[];for await(let Y of Q(E,_))F.push({type:"delete",key:Y});if(F.length===0)return 0;return await E.batch(F),F.length}async function q(E,_,F){let Y=[];for await(let U of Q(E,_,F))Y.push({type:"delete",key:U});if(Y.length===0)return 0;return await E.batch(Y),Y.length}var K;var N=V(()=>{K=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","ev:","idx:","liveness:","offload:","op:","review:","schedule:","schedule-due:","schedule-run:","sig:","sigres:","sigseq:","start-idem:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-deadline:","wf-delayed:","wf-has-services:","wf-headers:","wf-idx-","wf-terminal:"]});function p(E){return E.length>0?E.slice(0,-1)+String.fromCharCode(E.charCodeAt(E.length-1)+1):"\xFF"}function a(E,_={}){if(_.gt!==void 0&&E<=_.gt)return!1;if(_.gte!==void 0&&E<_.gte)return!1;if(_.lt!==void 0&&E>=_.lt)return!1;if(_.lte!==void 0&&E>_.lte)return!1;return!0}function i(E,_){if(E===null||_===null)return E===_;if(E.byteLength!==_.byteLength)return!1;for(let F=0;F<E.byteLength;F++)if(E[F]!==_[F])return!1;return!0}async function D(E,_){if(E.has)return E.has(_);return L(E,_)}function T(E,_,F){if(E.keys)return E.keys(_,F);return Q(E,_,F)}async function A(E,_){if(E.count)return E.count(_);return B(E,_)}async function O(E,_){if(E.deletePrefix)return E.deletePrefix(_);return R(E,_)}async function z(E,_,F){if($(E,"conditionalBatch","storageConditionalBatch"),!E.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return E.conditionalBatch(_,F)}function W(E){return encodeURIComponent(E)}function r(E){return decodeURIComponent(E)}function n(E){try{return decodeURIComponent(E)}catch{return null}}var X=(E)=>String(E).padStart(16,"0"),t;var P=V(()=>{N();t={workflow:(E)=>`wf:${W(E)}`,checkpoint:(E)=>`wf:${W(E)}:ckpt`,checkpointHistory:(E,_)=>`wf:${W(E)}:ckpt:${String(_).padStart(10,"0")}`,timelinePrefix:(E)=>`wf:${W(E)}:timeline:`,timeline:(E,_)=>`wf:${W(E)}:timeline:${String(_).padStart(10,"0")}`,schedule:(E)=>`schedule:${W(E)}`,scheduleTick:(E,_)=>`schedule-due:${String(E).padStart(16,"0")}:${W(_)}`,scheduleRun:(E)=>`schedule-run:${W(E)}`,operation:(E,_,F)=>`op:${E}:${X(_)}:${F}`,operationInflight:(E)=>`op:inflight:${E}`,operationQueued:(E)=>`op:queued:${E}`,operationResolved:(E)=>`op:resolved:${E}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(E,_,F)=>`audit:bulk:${X(E)}:${W(_)}:${W(F)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(E,_)=>`op:resolved-by-time:${X(E)}:${W(_)}`,asyncActivity:(E,_)=>`async-act:v1:${W(E)}:${W(_)}`,activityReconciliationPrefix:(E)=>`actrec:v1:${W(E)}:`,activityReconciliation:(E,_,F)=>`actrec:v1:${W(E)}:${W(_)}:${F}`,eventPrefix:(E)=>`ev:${W(E)}:`,event:(E,_)=>`ev:${W(E)}:${String(_).padStart(10,"0")}`,eventHead:(E)=>`ev:${W(E)}:head`,eventWatermark:(E)=>`ev:${W(E)}:watermark`,signal:(E,_,F)=>`sig:${W(E)}:${_}:${W(F)}`,signalSequence:(E)=>`sigseq:v1:${W(E)}`,signalAcceptedResponsePrefix:(E)=>`sigres:v1:${W(E)}:`,signalAcceptedResponse:(E,_,F)=>`sigres:v1:${W(E)}:${W(_)}:${W(F)}`,deadline:(E,_)=>`wf-deadline:${X(E)}:${W(_)}`,terminalCleanup:(E,_)=>`wf-cleanup:${X(E)}:${W(_)}`,delayedStart:(E,_)=>`wf-delayed:${X(E)}:${W(_)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(E,_)=>`wf-terminal:${X(E)}:${W(_)}`,attribute:(E)=>`attr:${W(E)}`,attributeIndex:(E,_,F)=>`idx:${E}:${_}:${W(F)}`,tagIndex:(E,_)=>`tag:${W(E)}:${W(_)}`,updatePrefix:(E)=>`upd:${W(E)}:`,update:(E,_)=>`upd:${W(E)}:${_}`,updateResponse:(E)=>`upr:${E}`,updateIdempotency:(E,_)=>`upk:${W(E)}:${_}`,startIdempotency:(E)=>`start-idem:${W(E)}`,startIdempotencySignalId:(E)=>`start-idem:${E}`,livenessPrefix:()=>"liveness:",liveness:(E)=>`liveness:${W(E)}`,budget:(E,_,F)=>`budget:${E}:${_}:${F}`,review:(E,_)=>`review:${W(E)}:${_}`,workflowHeaders:(E)=>`wf-headers:${W(E)}`,terminalCleanupNeeded:(E)=>`wf-cleanup-needed:${W(E)}`,workflowHasServices:(E)=>`wf-has-services:${W(E)}`,offload:(E,_)=>`offload:${W(E)}:${_}`,archive:(E,_)=>`archive:${W(E)}:${_}`,stateExecution:(E,_)=>`state:execution:${W(E)}:${W(_)}`,stateWorkflow:(E,_)=>`state:workflow-scope:${G}:${W(E)}:${W(_)}`,streamChunkPrefix:(E,_)=>`blob:${W(E)}:${_}:chunk:`,streamChunk:(E,_,F)=>`blob:${W(E)}:${_}:chunk:${String(F).padStart(10,"0")}`,streamMetadata:(E,_)=>`blob:${W(E)}:${_}:meta`,budgetCharged:(E)=>`budget-charged:${E}`,toolEffect:(E,_,F)=>`tool-effect:${W(E)}:${_}:${F}`,workflowVisibilityStatus:(E,_)=>`wf-idx-status:${W(E)}:${W(_)}`,workflowVisibilityType:(E,_)=>`wf-idx-type:${W(E)}:${W(_)}`,workflowVisibilityCreated:(E,_)=>`wf-idx-created:${X(E)}:${W(_)}`,workflowVisibilityUpdated:(E,_)=>`wf-idx-updated:${X(E)}:${W(_)}`,workflowVisibilityDeadline:(E,_)=>`wf-idx-deadline:${X(E)}:${W(_)}`,workflowVisibilityManifest:(E)=>`wf-idx-manifest:${W(E)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"}});function x(E){if(E===void 0)return;if(typeof E!=="number"||!Number.isInteger(E)||E<0)throw Error("deleteRange limit must be a finite non-negative integer");return E===0?0:E}function j(E){let _={},F=!1;for(let U of["gt","gte","lt","lte"]){let Z=E[U];if(Z===void 0)continue;if(typeof Z!=="string")throw Error("deleteRange bounds must be strings");_[U]=Z,F=!0}if(!F)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let Y=x(E.limit);if(Y!==void 0)_.limit=Y;return _}async function v(E,_,F){let Y=j(F);if(E.deleteRange)return E.deleteRange(_,Y);return q(E,_,Y)}var h=()=>{};function M(E){return E.replaceAll(/:+$/g,"")}function I(E,_){let F=M(E),Y=M(_);if(F.length===0)return Y;if(Y.length===0)return F;return`${F}:${Y}`}function JE(E,_){return new H(E,_)}var H;var c=V(()=>{h();P();H=class H{#_;#F;constructor(E,_){this.#_=E,this.#F=M(_)}#E(E){if(this.#F.length===0)return E;return E.length===0?`${this.#F}:`:`${this.#F}:${E}`}#W(E){if(this.#F.length===0)return E;return E.slice(this.#F.length+1)}#Y(E={}){let _={};if(E.limit!==void 0)_.limit=E.limit;if(E.reverse!==void 0)_.reverse=E.reverse;if(E.gt!==void 0)_.gt=this.#E(E.gt);if(E.gte!==void 0)_.gte=this.#E(E.gte);if(E.lt!==void 0)_.lt=this.#E(E.lt);if(E.lte!==void 0)_.lte=this.#E(E.lte);return _}#X(E){let _={};if(E.limit!==void 0)_.limit=E.limit;if(E.gt!==void 0)_.gt=this.#E(E.gt);if(E.gte!==void 0)_.gte=this.#E(E.gte);if(E.lt!==void 0)_.lt=this.#E(E.lt);if(E.lte!==void 0)_.lte=this.#E(E.lte);return _}capabilities(){return this.#_.capabilities()}scoped(E){return new H(this.#_,I(this.#F,E))}async get(E){return this.#_.get(this.#E(E))}async put(E,_){await this.#_.put(this.#E(E),_)}async delete(E){await this.#_.delete(this.#E(E))}async*scan(E,_){for await(let[F,Y]of this.#_.scan(this.#E(E),this.#Y(_)))yield[this.#W(F),Y]}async batch(E){await this.#_.batch(E.map((_)=>{if(_.type==="put")return{type:"put",key:this.#E(_.key),value:_.value};return{type:"delete",key:this.#E(_.key)}}))}async conditionalBatch(E,_){return z(this.#_,E.map((F)=>({key:this.#E(F.key),expectedValue:F.expectedValue})),_.map((F)=>{if(F.type==="put")return{type:"put",key:this.#E(F.key),value:F.value};return{type:"delete",key:this.#E(F.key)}}))}async has(E){return D(this.#_,this.#E(E))}async deletePrefix(E){return O(this.#_,this.#E(E))}async deleteRange(E,_){let F=this.#X(j(_));return v(this.#_,this.#E(E),F)}async*keys(E,_){for await(let F of T(this.#_,this.#E(E),this.#Y(_)))yield this.#W(F)}async count(E){return A(this.#_,this.#E(E))}[Symbol.dispose](){this.#_[Symbol.dispose]()}}});c();export{JE as scopedStorage,H as ScopedStorage};
2
+ var u=Object.defineProperty;var x=(E)=>E;function y(E,_){this[E]=x.bind(null,_)}var a=(E,_)=>{for(var F in _)u(E,F,{get:_[F],enumerable:!0,configurable:!0,set:y.bind(_,F)})};var Q=(E,_)=>()=>(E&&(_=E(E=0)),_);var p=(E,_,F)=>{if(_!=null){if(typeof _!=="object"&&typeof _!=="function")throw TypeError('Object expected to be assigned to "using" declaration');let Y;if(F)Y=_[Symbol.asyncDispose];if(Y===void 0)Y=_[Symbol.dispose];if(typeof Y!=="function")throw TypeError("Object not disposable");E.push([F,Y,_])}else if(F)E.push([F]);return _},s=(E,_,F)=>{let Y=(X)=>_=F?new SuppressedError(X,_,"An error was suppressed during disposal"):(F=!0,X),V=(X)=>{while(X=E.pop())try{var m=X[1]&&X[1].call(X[2]);if(X[0])return Promise.resolve(m).then(V,(Z)=>(Y(Z),V()))}catch(Z){Y(Z)}if(F)throw _};return V()};function $(E,_,F){if(!E.capabilities()[_])throw Error(`Feature "${F}" requires storage capability "${_}", but this storage backend does not provide it.`)}function g(E){let _=E.capabilities(),F=[];if(_.persistence!=="local"&&_.persistence!=="remote")F.push(`persistence must be "local" or "remote" (got "${_.persistence}")`);if(_.readAfterWrite!=="linearizable")F.push(`readAfterWrite must be "linearizable" (got "${_.readAfterWrite}")`);if(_.scanConsistency!=="snapshot")F.push(`scanConsistency must be "snapshot" (got "${_.scanConsistency}")`);if(!_.atomicBatch)F.push("atomicBatch must be true");if(!_.conditionalBatch)F.push("conditionalBatch must be true");if(F.length>0)throw Error(`Storage is not durable enough for recovery: ${F.join("; ")}.`)}var T="default";async function R(E,_){return await E.get(_)!==null}async function*J(E,_,F){for await(let[Y]of E.scan(_,F))yield Y}async function D(E,_){let F=0;for await(let Y of J(E,_))F++;return F}async function B(E,_){let F=[];for await(let Y of J(E,_))F.push({type:"delete",key:Y});if(F.length===0)return 0;return await E.batch(F),F.length}async function C(E,_,F){let Y=[];for await(let V of J(E,_,F))Y.push({type:"delete",key:V});if(Y.length===0)return 0;return await E.batch(Y),Y.length}var I;var N=Q(()=>{I=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","ev:","fleet-event-by-workflow:","fleet-event:","fleet-event-tail","idx:","lease:","liveness:","offload:","op:","review:","schedule:","schedule-due:","schedule-run:","sig:","sigres:","sigseq:","start-idem:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-concurrency:","wf-concurrency-holder:","wf-deadline:","wf-delayed:","wf-finalizer-state:","wf-has-services:","wf-headers:","wf-idx-","wf-teardown:","wf-teardown-deadletter:","wf-teardown-needed:","wf-terminal:"]});function M(E,_){if(_>j)throw new A(E,_)}function WE(E){return E.length>0?E.slice(0,-1)+String.fromCharCode(E.charCodeAt(E.length-1)+1):"\xFF"}function YE(E,_={}){if(_.gt!==void 0&&E<=_.gt)return!1;if(_.gte!==void 0&&E<_.gte)return!1;if(_.lt!==void 0&&E>=_.lt)return!1;if(_.lte!==void 0&&E>_.lte)return!1;return!0}function XE(E,_){if(E===null||_===null)return E===_;if(E.byteLength!==_.byteLength)return!1;for(let F=0;F<E.byteLength;F++)if(E[F]!==_[F])return!1;return!0}async function v(E,_){if(E.has)return E.has(_);return R(E,_)}function z(E,_,F){if(E.keys)return E.keys(_,F);return J(E,_,F)}async function h(E,_){if(E.count)return E.count(_);return D(E,_)}async function O(E,_){if(E.deletePrefix)return E.deletePrefix(_);return B(E,_)}async function UE(E,_){M("batch operations",_.length),await E.batch(_)}async function P(E,_,F){if(M("conditionalBatch conditions",_.length),M("conditionalBatch operations",F.length),$(E,"conditionalBatch","storageConditionalBatch"),!E.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return E.conditionalBatch(_,F)}function W(E){return encodeURIComponent(E)}function VE(E){return decodeURIComponent(E)}function GE(E){try{return decodeURIComponent(E)}catch{return null}}var j=1e4,FE=1e4,A,U=(E)=>String(E).padStart(16,"0"),k="0",f="1",q=(E,_,F,Y)=>`sig:${W(E)}:${W(_)}:${Y}:${W(F)}`,JE;var K=Q(()=>{N();A=class A extends Error{code="StorageBatchOperationLimitExceededError";cap=j;count;target;constructor(E,_){super(`${E} count ${_} exceeds MAX_BATCH_OPERATIONS (${j}).`);this.name="StorageBatchOperationLimitExceededError",this.target=E,this.count=_}};JE={workflow:(E)=>`wf:${W(E)}`,checkpoint:(E)=>`wf:${W(E)}:ckpt`,checkpointHistory:(E,_)=>`wf:${W(E)}:ckpt:${String(_).padStart(10,"0")}`,timelinePrefix:(E)=>`wf:${W(E)}:timeline:`,timeline:(E,_)=>`wf:${W(E)}:timeline:${String(_).padStart(10,"0")}`,schedule:(E)=>`schedule:${W(E)}`,scheduleTick:(E,_)=>`schedule-due:${String(E).padStart(16,"0")}:${W(_)}`,scheduleRun:(E)=>`schedule-run:${W(E)}`,operation:(E,_,F)=>`op:${E}:${U(_)}:${F}`,operationInflight:(E)=>`op:inflight:${E}`,operationQueued:(E)=>`op:queued:${E}`,operationResolved:(E)=>`op:resolved:${E}`,operationDeadLetterPrefix:()=>"op:dead-letter:",operationDeadLetter:(E)=>`op:dead-letter:${E}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(E,_,F)=>`audit:bulk:${U(E)}:${W(_)}:${W(F)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(E,_)=>`op:resolved-by-time:${U(E)}:${W(_)}`,asyncActivity:(E,_)=>`async-act:v1:${W(E)}:${W(_)}`,activityReconciliationPrefix:(E)=>`actrec:v1:${W(E)}:`,activityReconciliation:(E,_,F)=>`actrec:v1:${W(E)}:${W(_)}:${F}`,eventPrefix:(E)=>`ev:${W(E)}:`,event:(E,_)=>`ev:${W(E)}:${String(_).padStart(10,"0")}`,eventHead:(E)=>`ev:${W(E)}:head`,eventWatermark:(E)=>`ev:${W(E)}:watermark`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(E)=>`fleet-event:${String(E).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventByWorkflowPrefix:(E)=>`fleet-event-by-workflow:${W(E)}:`,fleetEventByWorkflow:(E,_)=>`fleet-event-by-workflow:${W(E)}:${String(_).padStart(10,"0")}`,signal:(E,_,F)=>q(E,_,F,f),startSignal:(E,_,F)=>q(E,_,F,k),signalSequence:(E)=>`sigseq:v1:${W(E)}`,signalAcceptedResponsePrefix:(E)=>`sigres:v1:${W(E)}:`,signalAcceptedResponse:(E,_,F)=>`sigres:v1:${W(E)}:${W(_)}:${W(F)}`,deadline:(E,_)=>`wf-deadline:${U(E)}:${W(_)}`,terminalCleanup:(E,_)=>`wf-cleanup:${U(E)}:${W(_)}`,teardownTimer:(E,_)=>`wf-teardown:${U(E)}:${W(_)}`,delayedStart:(E,_)=>`wf-delayed:${U(E)}:${W(_)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(E,_)=>`wf-terminal:${U(E)}:${W(_)}`,attribute:(E)=>`attr:${W(E)}`,attributeIndex:(E,_,F)=>`idx:${E}:${_}:${W(F)}`,tagIndex:(E,_)=>`tag:${W(E)}:${W(_)}`,updatePrefix:(E)=>`upd:${W(E)}:`,update:(E,_)=>`upd:${W(E)}:${_}`,updateResponse:(E)=>`upr:${E}`,updateIdempotency:(E,_)=>`upk:${W(E)}:${_}`,startIdempotency:(E)=>`start-idem:${W(E)}`,startIdempotencySignalId:(E)=>`start-idem:${E}`,livenessPrefix:()=>"liveness:",liveness:(E)=>`liveness:${W(E)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",budget:(E,_,F)=>`budget:${E}:${_}:${F}`,review:(E,_)=>`review:${W(E)}:${_}`,workflowHeaders:(E)=>`wf-headers:${W(E)}`,childCancellationPrefix:(E)=>`child-cancel:${W(E)}:`,childCancellation:(E,_)=>`child-cancel:${W(E)}:${W(_)}`,terminalCleanupNeeded:(E)=>`wf-cleanup-needed:${W(E)}`,workflowConcurrency:(E,_)=>`wf-concurrency:${W(E)}:${W(_)}`,workflowConcurrencyHolder:(E)=>`wf-concurrency-holder:${W(E)}`,workflowHasServices:(E)=>`wf-has-services:${W(E)}`,finalizerState:(E)=>`wf-finalizer-state:${W(E)}`,teardownOwed:(E)=>`wf-teardown-needed:${W(E)}`,teardownDeadLetter:(E)=>`wf-teardown-deadletter:${W(E)}`,offload:(E,_)=>`offload:${W(E)}:${_}`,archive:(E,_)=>`archive:${W(E)}:${_}`,stateExecution:(E,_)=>`state:execution:${W(E)}:${W(_)}`,stateWorkflow:(E,_)=>`state:workflow-scope:${T}:${W(E)}:${W(_)}`,streamChunkPrefix:(E,_)=>`blob:${W(E)}:${_}:chunk:`,streamChunk:(E,_,F)=>`blob:${W(E)}:${_}:chunk:${String(F).padStart(10,"0")}`,streamTail:(E,_)=>`blob:${W(E)}:${_}:tail`,streamMetadata:(E,_)=>`blob:${W(E)}:${_}:meta`,budgetCharged:(E)=>`budget-charged:${E}`,toolEffect:(E,_,F)=>`tool-effect:${W(E)}:${_}:${F}`,workflowVisibilityStatus:(E,_)=>`wf-idx-status:${W(E)}:${W(_)}`,workflowVisibilityType:(E,_)=>`wf-idx-type:${W(E)}:${W(_)}`,workflowVisibilityCreated:(E,_)=>`wf-idx-created:${U(E)}:${W(_)}`,workflowVisibilityUpdated:(E,_)=>`wf-idx-updated:${U(E)}:${W(_)}`,workflowVisibilityDeadline:(E,_)=>`wf-idx-deadline:${U(E)}:${W(_)}`,workflowVisibilityManifest:(E)=>`wf-idx-manifest:${W(E)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"}});function w(E){if(E===void 0)return;if(typeof E!=="number"||!Number.isInteger(E)||E<0)throw Error("deleteRange limit must be a finite non-negative integer");return E===0?0:E}function H(E){let _={},F=!1;for(let V of["gt","gte","lt","lte"]){let X=E[V];if(X===void 0)continue;if(typeof X!=="string")throw Error("deleteRange bounds must be strings");_[V]=X,F=!0}if(!F)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let Y=w(E.limit);if(Y!==void 0)_.limit=Y;return _}async function b(E,_,F){let Y=H(F);if(E.deleteRange)return E.deleteRange(_,Y);return C(E,_,Y)}var c=()=>{};function S(E){return E.replaceAll(/:+$/g,"")}function l(E,_){let F=S(E),Y=S(_);if(F.length===0)return Y;if(Y.length===0)return F;return`${F}:${Y}`}function LE(E,_){return new L(E,_)}var L;var d=Q(()=>{c();K();L=class L{#_;#F;constructor(E,_){this.#_=E,this.#F=S(_)}#E(E){if(this.#F.length===0)return E;return E.length===0?`${this.#F}:`:`${this.#F}:${E}`}#W(E){if(this.#F.length===0)return E;return E.slice(this.#F.length+1)}#Y(E={}){let _={};if(E.limit!==void 0)_.limit=E.limit;if(E.reverse!==void 0)_.reverse=E.reverse;if(E.gt!==void 0)_.gt=this.#E(E.gt);if(E.gte!==void 0)_.gte=this.#E(E.gte);if(E.lt!==void 0)_.lt=this.#E(E.lt);if(E.lte!==void 0)_.lte=this.#E(E.lte);return _}#X(E){let _={};if(E.limit!==void 0)_.limit=E.limit;if(E.gt!==void 0)_.gt=this.#E(E.gt);if(E.gte!==void 0)_.gte=this.#E(E.gte);if(E.lt!==void 0)_.lt=this.#E(E.lt);if(E.lte!==void 0)_.lte=this.#E(E.lte);return _}capabilities(){return this.#_.capabilities()}scoped(E){return new L(this.#_,l(this.#F,E))}async get(E){return this.#_.get(this.#E(E))}async put(E,_){await this.#_.put(this.#E(E),_)}async delete(E){await this.#_.delete(this.#E(E))}async*scan(E,_){for await(let[F,Y]of this.#_.scan(this.#E(E),this.#Y(_)))yield[this.#W(F),Y]}async batch(E){M("batch operations",E.length),await this.#_.batch(E.map((_)=>{if(_.type==="put")return{type:"put",key:this.#E(_.key),value:_.value};return{type:"delete",key:this.#E(_.key)}}))}async conditionalBatch(E,_){return P(this.#_,E.map((F)=>({key:this.#E(F.key),expectedValue:F.expectedValue})),_.map((F)=>{if(F.type==="put")return{type:"put",key:this.#E(F.key),value:F.value};return{type:"delete",key:this.#E(F.key)}}))}async has(E){return v(this.#_,this.#E(E))}async deletePrefix(E){return O(this.#_,this.#E(E))}async deleteRange(E,_){let F=this.#X(H(_));return b(this.#_,this.#E(E),F)}async*keys(E,_){for await(let F of z(this.#_,this.#E(E),this.#Y(_)))yield this.#W(F)}async count(E){return h(this.#_,this.#E(E))}[Symbol.dispose](){this.#_[Symbol.dispose]()}}});d();export{LE as scopedStorage,L as ScopedStorage};