bunqueue 2.8.53 → 2.8.56

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 (747) hide show
  1. package/dist/application/background/dlq.d.ts +2 -0
  2. package/dist/application/background/dlq.js +26 -0
  3. package/dist/application/background/lifecycle.d.ts +4 -0
  4. package/dist/application/background/lifecycle.js +90 -0
  5. package/dist/application/background/recovery/active.d.ts +4 -0
  6. package/dist/application/background/recovery/active.js +69 -0
  7. package/dist/application/background/recovery/index.d.ts +2 -0
  8. package/dist/application/background/recovery/index.js +22 -0
  9. package/dist/application/background/recovery/pending.d.ts +3 -0
  10. package/dist/application/background/recovery/pending.js +69 -0
  11. package/dist/application/background/recovery/restore.d.ts +5 -0
  12. package/dist/application/background/recovery/restore.js +58 -0
  13. package/dist/application/background/recovery/shared.d.ts +6 -0
  14. package/dist/application/background/recovery/shared.js +15 -0
  15. package/dist/application/background/timeouts.d.ts +25 -0
  16. package/dist/application/background/timeouts.js +191 -0
  17. package/dist/application/backgroundTasks.d.ts +7 -31
  18. package/dist/application/backgroundTasks.js +6 -438
  19. package/dist/application/cleanupTasks.js +2 -1
  20. package/dist/application/clientTracking.js +3 -1
  21. package/dist/application/contextFactory.d.ts +13 -90
  22. package/dist/application/contextFactory.js +9 -0
  23. package/dist/application/dependencyResultTracker.d.ts +1 -0
  24. package/dist/application/dependencyResultTracker.js +3 -0
  25. package/dist/application/dlqManager.d.ts +9 -9
  26. package/dist/application/dlqManager.js +49 -167
  27. package/dist/application/dlqRetry.d.ts +12 -0
  28. package/dist/application/dlqRetry.js +97 -0
  29. package/dist/application/lockManager.js +24 -4
  30. package/dist/application/lockOperations.js +16 -3
  31. package/dist/application/operations/ack/batch.d.ts +8 -0
  32. package/dist/application/operations/ack/batch.js +64 -0
  33. package/dist/application/operations/ack/completion.d.ts +3 -0
  34. package/dist/application/operations/ack/completion.js +74 -0
  35. package/dist/application/operations/ack/failure.d.ts +3 -0
  36. package/dist/application/operations/ack/failure.js +160 -0
  37. package/dist/application/operations/ack.d.ts +5 -79
  38. package/dist/application/operations/ack.js +4 -319
  39. package/dist/application/operations/ackHelpers.d.ts +3 -52
  40. package/dist/application/operations/ackHelpers.js +11 -4
  41. package/dist/application/operations/customId.d.ts +18 -5
  42. package/dist/application/operations/customId.js +36 -25
  43. package/dist/application/operations/flowValidation.js +9 -4
  44. package/dist/application/operations/jobManagement.js +50 -11
  45. package/dist/application/operations/jobMoveOperations.js +3 -3
  46. package/dist/application/operations/jobStateTransitions.d.ts +1 -1
  47. package/dist/application/operations/jobStateTransitions.js +16 -2
  48. package/dist/application/operations/parentLink.d.ts +36 -0
  49. package/dist/application/operations/parentLink.js +153 -0
  50. package/dist/application/operations/parentLinkInput.d.ts +8 -0
  51. package/dist/application/operations/parentLinkInput.js +23 -0
  52. package/dist/application/operations/push.d.ts +5 -44
  53. package/dist/application/operations/push.js +62 -152
  54. package/dist/application/operations/pushAdmission.d.ts +32 -0
  55. package/dist/application/operations/pushAdmission.js +38 -0
  56. package/dist/application/operations/pushBatch.d.ts +4 -0
  57. package/dist/application/operations/pushBatch.js +136 -0
  58. package/dist/application/operations/pushContext.d.ts +39 -0
  59. package/dist/application/operations/pushContext.js +1 -0
  60. package/dist/application/operations/pushDeduplication.d.ts +42 -0
  61. package/dist/application/operations/pushDeduplication.js +131 -0
  62. package/dist/application/operations/pushInsert.d.ts +13 -1
  63. package/dist/application/operations/pushInsert.js +33 -17
  64. package/dist/application/operations/pushLocks.js +13 -9
  65. package/dist/application/operations/query/collect.d.ts +12 -0
  66. package/dist/application/operations/query/collect.js +118 -0
  67. package/dist/application/operations/query/jobLookup.d.ts +9 -0
  68. package/dist/application/operations/query/jobLookup.js +110 -0
  69. package/dist/application/operations/query/pagination.d.ts +8 -0
  70. package/dist/application/operations/query/pagination.js +90 -0
  71. package/dist/application/operations/query/state.d.ts +4 -0
  72. package/dist/application/operations/query/state.js +63 -0
  73. package/dist/application/operations/queryOperations.d.ts +5 -50
  74. package/dist/application/operations/queryOperations.js +4 -474
  75. package/dist/application/queue-manager/ack.d.ts +23 -0
  76. package/dist/application/queue-manager/ack.js +242 -0
  77. package/dist/application/queue-manager/configuration.d.ts +27 -0
  78. package/dist/application/queue-manager/configuration.js +84 -0
  79. package/dist/application/queue-manager/context.d.ts +5 -0
  80. package/dist/application/queue-manager/context.js +61 -0
  81. package/dist/application/queue-manager/control.d.ts +17 -0
  82. package/dist/application/queue-manager/control.js +133 -0
  83. package/dist/application/queue-manager/delivery.d.ts +32 -0
  84. package/dist/application/queue-manager/delivery.js +143 -0
  85. package/dist/application/queue-manager/dependencies.d.ts +8 -0
  86. package/dist/application/queue-manager/dependencies.js +127 -0
  87. package/dist/application/queue-manager/dependency-runtime.d.ts +8 -0
  88. package/dist/application/queue-manager/dependency-runtime.js +40 -0
  89. package/dist/application/queue-manager/flow-failures.d.ts +18 -0
  90. package/dist/application/queue-manager/flow-failures.js +107 -0
  91. package/dist/application/queue-manager/flow-options.d.ts +8 -0
  92. package/dist/application/queue-manager/flow-options.js +129 -0
  93. package/dist/application/queue-manager/job-management.d.ts +17 -0
  94. package/dist/application/queue-manager/job-management.js +100 -0
  95. package/dist/application/queue-manager/lifecycle.d.ts +4 -0
  96. package/dist/application/queue-manager/lifecycle.js +41 -0
  97. package/dist/application/queue-manager/limits.d.ts +41 -0
  98. package/dist/application/queue-manager/limits.js +108 -0
  99. package/dist/application/queue-manager/locks.d.ts +21 -0
  100. package/dist/application/queue-manager/locks.js +59 -0
  101. package/dist/application/queue-manager/observability.d.ts +16 -0
  102. package/dist/application/queue-manager/observability.js +44 -0
  103. package/dist/application/queue-manager/queries.d.ts +17 -0
  104. package/dist/application/queue-manager/queries.js +118 -0
  105. package/dist/application/queue-manager/repeat.d.ts +4 -0
  106. package/dist/application/queue-manager/repeat.js +26 -0
  107. package/dist/application/queue-manager/services.d.ts +19 -0
  108. package/dist/application/queue-manager/services.js +80 -0
  109. package/dist/application/queue-manager/state.d.ts +92 -0
  110. package/dist/application/queue-manager/state.js +144 -0
  111. package/dist/application/queue-manager/stats.d.ts +28 -0
  112. package/dist/application/queue-manager/stats.js +52 -0
  113. package/dist/application/queueManager.d.ts +4 -380
  114. package/dist/application/queueManager.js +3 -1880
  115. package/dist/application/queueTelemetryJournal.d.ts +20 -0
  116. package/dist/application/queueTelemetryJournal.js +133 -0
  117. package/dist/application/repeatJobs.d.ts +7 -0
  118. package/dist/application/repeatJobs.js +132 -0
  119. package/dist/application/stallDetection.js +9 -4
  120. package/dist/application/types/ack.d.ts +132 -0
  121. package/dist/application/types/ack.js +1 -0
  122. package/dist/application/types/background.d.ts +18 -0
  123. package/dist/application/types/background.js +1 -0
  124. package/dist/application/types/config.d.ts +37 -0
  125. package/dist/application/types/config.js +15 -0
  126. package/dist/application/types/contextFactory.d.ts +83 -0
  127. package/dist/application/types/contextFactory.js +1 -0
  128. package/dist/application/types/contexts.d.ts +110 -0
  129. package/dist/application/types/contexts.js +1 -0
  130. package/dist/application/types/index.d.ts +7 -0
  131. package/dist/application/types/index.js +1 -0
  132. package/dist/application/types/query.d.ts +23 -0
  133. package/dist/application/types/query.js +1 -0
  134. package/dist/application/types/queueManager.d.ts +94 -0
  135. package/dist/application/types/queueManager.js +1 -0
  136. package/dist/cli/commandRouter.d.ts +1 -1
  137. package/dist/cli/commands/core.js +1 -0
  138. package/dist/cli/output/collections.d.ts +8 -0
  139. package/dist/cli/output/collections.js +131 -0
  140. package/dist/cli/output/jobs.d.ts +2 -0
  141. package/dist/cli/output/jobs.js +61 -0
  142. package/dist/cli/output/style.d.ts +14 -0
  143. package/dist/cli/output/style.js +28 -0
  144. package/dist/cli/output/success.d.ts +1 -0
  145. package/dist/cli/output/success.js +108 -0
  146. package/dist/cli/output.d.ts +1 -6
  147. package/dist/cli/output.js +7 -395
  148. package/dist/client/bunqueue/dlqRateLimit.d.ts +8 -0
  149. package/dist/client/bunqueue/dlqRateLimit.js +24 -0
  150. package/dist/client/bunqueue/runtime.d.ts +35 -0
  151. package/dist/client/bunqueue/runtime.js +138 -0
  152. package/dist/client/bunqueue.d.ts +19 -34
  153. package/dist/client/bunqueue.js +45 -166
  154. package/dist/client/dlqConversion.d.ts +5 -0
  155. package/dist/client/dlqConversion.js +28 -0
  156. package/dist/client/events.d.ts +7 -56
  157. package/dist/client/events.js +38 -15
  158. package/dist/client/flow.d.ts +6 -12
  159. package/dist/client/flow.js +16 -34
  160. package/dist/client/flowJobDependencies.js +3 -1
  161. package/dist/client/flowJobFactory.d.ts +9 -1
  162. package/dist/client/flowJobFactory.js +25 -9
  163. package/dist/client/flowJobMoveMethods.d.ts +5 -5
  164. package/dist/client/flowJobMoveMethods.js +37 -17
  165. package/dist/client/flowLegacyPlan.js +22 -8
  166. package/dist/client/flowOptions.d.ts +1 -1
  167. package/dist/client/flowOptions.js +2 -1
  168. package/dist/client/flowPlan.js +2 -3
  169. package/dist/client/flowPush.d.ts +1 -0
  170. package/dist/client/flowPush.js +5 -1
  171. package/dist/client/flowReader.js +5 -5
  172. package/dist/client/flowResults.d.ts +11 -0
  173. package/dist/client/flowResults.js +42 -0
  174. package/dist/client/index.d.ts +3 -1
  175. package/dist/client/jobConversion.d.ts +3 -7
  176. package/dist/client/jobConversion.js +36 -33
  177. package/dist/client/jobConversionHelpers.d.ts +19 -3
  178. package/dist/client/jobConversionHelpers.js +20 -16
  179. package/dist/client/jobConversionTypes.d.ts +8 -0
  180. package/dist/client/jobDeduplication.d.ts +6 -0
  181. package/dist/client/jobDeduplication.js +14 -0
  182. package/dist/client/jobHelpers.d.ts +7 -2
  183. package/dist/client/jobHelpers.js +16 -8
  184. package/dist/client/queue/bullmqCompat.d.ts +18 -8
  185. package/dist/client/queue/bullmqCompat.js +39 -71
  186. package/dist/client/queue/deduplication.d.ts +2 -0
  187. package/dist/client/queue/deduplication.js +20 -11
  188. package/dist/client/queue/dlq.d.ts +11 -6
  189. package/dist/client/queue/dlq.js +57 -16
  190. package/dist/client/queue/dlqJobMethods.d.ts +9 -0
  191. package/dist/client/queue/dlqJobMethods.js +177 -0
  192. package/dist/client/queue/dlqOps.d.ts +2 -1
  193. package/dist/client/queue/dlqOps.js +4 -10
  194. package/dist/client/queue/dlqStats.d.ts +3 -0
  195. package/dist/client/queue/dlqStats.js +21 -0
  196. package/dist/client/queue/job-proxy/dependencies.d.ts +9 -0
  197. package/dist/client/queue/job-proxy/dependencies.js +67 -0
  198. package/dist/client/queue/job-proxy/reflection.d.ts +2 -0
  199. package/dist/client/queue/job-proxy/reflection.js +18 -0
  200. package/dist/client/queue/job-proxy/simple.d.ts +3 -0
  201. package/dist/client/queue/job-proxy/simple.js +316 -0
  202. package/dist/client/queue/job-proxy/tcp.d.ts +4 -0
  203. package/dist/client/queue/job-proxy/tcp.js +191 -0
  204. package/dist/client/queue/jobMetadata.d.ts +10 -0
  205. package/dist/client/queue/jobMetadata.js +24 -0
  206. package/dist/client/queue/jobMove.d.ts +4 -4
  207. package/dist/client/queue/jobMove.js +87 -24
  208. package/dist/client/queue/jobProxy.d.ts +4 -50
  209. package/dist/client/queue/jobProxy.js +3 -511
  210. package/dist/client/queue/operations/add/bulk.d.ts +7 -0
  211. package/dist/client/queue/operations/add/bulk.js +129 -0
  212. package/dist/client/queue/operations/add/payload.d.ts +24 -0
  213. package/dist/client/queue/operations/add/payload.js +85 -0
  214. package/dist/client/queue/operations/add/single.d.ts +3 -0
  215. package/dist/client/queue/operations/add/single.js +107 -0
  216. package/dist/client/queue/operations/add.d.ts +2 -47
  217. package/dist/client/queue/operations/add.js +2 -347
  218. package/dist/client/queue/operations/index.d.ts +1 -0
  219. package/dist/client/queue/operations/index.js +1 -0
  220. package/dist/client/queue/operations/management.d.ts +0 -4
  221. package/dist/client/queue/operations/management.js +35 -6
  222. package/dist/client/queue/operations/query.d.ts +1 -20
  223. package/dist/client/queue/operations/query.js +38 -116
  224. package/dist/client/queue/operations/queryStates.d.ts +13 -0
  225. package/dist/client/queue/operations/queryStates.js +32 -0
  226. package/dist/client/queue/operations/queryTcpPages.d.ts +14 -0
  227. package/dist/client/queue/operations/queryTcpPages.js +40 -0
  228. package/dist/client/queue/queue.d.ts +6 -189
  229. package/dist/client/queue/queue.js +6 -547
  230. package/dist/client/queue/rateLimit.d.ts +4 -4
  231. package/dist/client/queue/rateLimit.js +17 -8
  232. package/dist/client/queue/runtime/compatibility.d.ts +13 -0
  233. package/dist/client/queue/runtime/compatibility.js +38 -0
  234. package/dist/client/queue/runtime/configuration.d.ts +42 -0
  235. package/dist/client/queue/runtime/configuration.js +109 -0
  236. package/dist/client/queue/runtime/connection.d.ts +6 -0
  237. package/dist/client/queue/runtime/connection.js +16 -0
  238. package/dist/client/queue/runtime/control.d.ts +41 -0
  239. package/dist/client/queue/runtime/control.js +87 -0
  240. package/dist/client/queue/runtime/queries.d.ts +48 -0
  241. package/dist/client/queue/runtime/queries.js +95 -0
  242. package/dist/client/queue/runtime/scheduling.d.ts +33 -0
  243. package/dist/client/queue/runtime/scheduling.js +56 -0
  244. package/dist/client/queue/runtime/state.d.ts +96 -0
  245. package/dist/client/queue/runtime/state.js +149 -0
  246. package/dist/client/queue/scheduler.d.ts +2 -5
  247. package/dist/client/queue/scheduler.js +25 -23
  248. package/dist/client/queue/schedulerPagination.d.ts +7 -0
  249. package/dist/client/queue/schedulerPagination.js +10 -0
  250. package/dist/client/queue/types/add.d.ts +40 -0
  251. package/dist/client/queue/types/add.js +1 -0
  252. package/dist/client/queue/types/contexts.d.ts +33 -0
  253. package/dist/client/queue/types/contexts.js +5 -0
  254. package/dist/client/queue/types/index.d.ts +3 -0
  255. package/dist/client/queue/types/index.js +1 -0
  256. package/dist/client/queue/types/job.d.ts +50 -0
  257. package/dist/client/queue/types/job.js +1 -0
  258. package/dist/client/queue/types/runtime.d.ts +35 -0
  259. package/dist/client/queue/types/runtime.js +1 -0
  260. package/dist/client/queue/workers.d.ts +16 -8
  261. package/dist/client/queue/workers.js +42 -16
  262. package/dist/client/queue-events/tcpSubscription.d.ts +23 -0
  263. package/dist/client/queue-events/tcpSubscription.js +99 -0
  264. package/dist/client/queueGroup.d.ts +11 -0
  265. package/dist/client/queueGroup.js +28 -1
  266. package/dist/client/sandboxed/queueOps.d.ts +2 -2
  267. package/dist/client/sandboxed/queueOps.js +32 -5
  268. package/dist/client/sandboxed/runtime/dispatch.d.ts +13 -0
  269. package/dist/client/sandboxed/runtime/dispatch.js +186 -0
  270. package/dist/client/sandboxed/runtime/lifecycle.d.ts +20 -0
  271. package/dist/client/sandboxed/runtime/lifecycle.js +95 -0
  272. package/dist/client/sandboxed/runtime/log.d.ts +1 -0
  273. package/dist/client/sandboxed/runtime/log.js +15 -0
  274. package/dist/client/sandboxed/runtime/pool.d.ts +11 -0
  275. package/dist/client/sandboxed/runtime/pool.js +121 -0
  276. package/dist/client/sandboxed/runtime/recovery.d.ts +11 -0
  277. package/dist/client/sandboxed/runtime/recovery.js +122 -0
  278. package/dist/client/sandboxed/runtime/state.d.ts +39 -0
  279. package/dist/client/sandboxed/runtime/state.js +59 -0
  280. package/dist/client/sandboxed/types/index.d.ts +2 -0
  281. package/dist/client/sandboxed/types/index.js +1 -0
  282. package/dist/client/sandboxed/types/options.d.ts +27 -0
  283. package/dist/client/sandboxed/types/options.js +1 -0
  284. package/dist/client/sandboxed/types/process.d.ts +30 -0
  285. package/dist/client/sandboxed/types/process.js +1 -0
  286. package/dist/client/sandboxed/worker.d.ts +3 -85
  287. package/dist/client/sandboxed/worker.js +3 -557
  288. package/dist/client/sandboxed/wrapper.js +1 -0
  289. package/dist/client/tcp/client.d.ts +5 -112
  290. package/dist/client/tcp/client.js +5 -481
  291. package/dist/client/tcp/commandQueue.d.ts +23 -0
  292. package/dist/client/tcp/commandQueue.js +89 -0
  293. package/dist/client/tcp/connection.d.ts +4 -85
  294. package/dist/client/tcp/connection.js +3 -315
  295. package/dist/client/tcp/errors.d.ts +6 -0
  296. package/dist/client/tcp/errors.js +18 -0
  297. package/dist/client/tcp/runtime/commands.d.ts +9 -0
  298. package/dist/client/tcp/runtime/commands.js +124 -0
  299. package/dist/client/tcp/runtime/connectivity.d.ts +13 -0
  300. package/dist/client/tcp/runtime/connectivity.js +77 -0
  301. package/dist/client/tcp/runtime/health.d.ts +14 -0
  302. package/dist/client/tcp/runtime/health.js +127 -0
  303. package/dist/client/tcp/runtime/lifecycle.d.ts +8 -0
  304. package/dist/client/tcp/runtime/lifecycle.js +32 -0
  305. package/dist/client/tcp/runtime/state.d.ts +50 -0
  306. package/dist/client/tcp/runtime/state.js +45 -0
  307. package/dist/client/tcp/transport.d.ts +18 -0
  308. package/dist/client/tcp/transport.js +158 -0
  309. package/dist/client/tcp/types/command.d.ts +9 -0
  310. package/dist/client/tcp/types/command.js +1 -0
  311. package/dist/client/tcp/types/connection.d.ts +31 -0
  312. package/dist/client/tcp/types/connection.js +17 -0
  313. package/dist/client/tcp/types/index.d.ts +5 -0
  314. package/dist/client/tcp/types/index.js +1 -0
  315. package/dist/client/tcp/types/socket.d.ts +8 -0
  316. package/dist/client/tcp/types/socket.js +1 -0
  317. package/dist/client/tcp/types/tls.d.ts +4 -0
  318. package/dist/client/tcp/types/tls.js +1 -0
  319. package/dist/client/tcp/types.d.ts +2 -106
  320. package/dist/client/tcp/types.js +2 -22
  321. package/dist/client/types/connection.d.ts +29 -0
  322. package/dist/client/types/connection.js +1 -0
  323. package/dist/client/types/dlq.d.ts +45 -0
  324. package/dist/client/types/dlq.js +1 -0
  325. package/dist/client/types/events.d.ts +54 -0
  326. package/dist/client/types/events.js +1 -0
  327. package/dist/client/types/flow.d.ts +10 -0
  328. package/dist/client/types/flow.js +1 -0
  329. package/dist/client/types/index.d.ts +10 -0
  330. package/dist/client/types/index.js +1 -0
  331. package/dist/client/types/job.d.ts +127 -0
  332. package/dist/client/types/job.js +1 -0
  333. package/dist/client/types/metrics.d.ts +1 -0
  334. package/dist/client/types/metrics.js +1 -0
  335. package/dist/client/types/options.d.ts +62 -0
  336. package/dist/client/types/options.js +1 -0
  337. package/dist/client/types/worker.d.ts +38 -0
  338. package/dist/client/types/worker.js +1 -0
  339. package/dist/client/types.d.ts +2 -583
  340. package/dist/client/types.js +2 -6
  341. package/dist/client/worker/ackBatcher.d.ts +1 -1
  342. package/dist/client/worker/ackBatcher.js +17 -5
  343. package/dist/client/worker/ackOutcome.d.ts +8 -0
  344. package/dist/client/worker/ackOutcome.js +58 -0
  345. package/dist/client/worker/constants.d.ts +7 -0
  346. package/dist/client/worker/constants.js +7 -0
  347. package/dist/client/worker/groupConcurrency.js +3 -0
  348. package/dist/client/worker/handlers/completion.d.ts +28 -0
  349. package/dist/client/worker/handlers/completion.js +68 -0
  350. package/dist/client/worker/handlers/dependencies.d.ts +11 -0
  351. package/dist/client/worker/handlers/dependencies.js +107 -0
  352. package/dist/client/worker/handlers/mutations.d.ts +23 -0
  353. package/dist/client/worker/handlers/mutations.js +211 -0
  354. package/dist/client/worker/handlers/queries.d.ts +15 -0
  355. package/dist/client/worker/handlers/queries.js +100 -0
  356. package/dist/client/worker/index.d.ts +2 -2
  357. package/dist/client/worker/index.js +1 -1
  358. package/dist/client/worker/jobParser.js +4 -2
  359. package/dist/client/worker/processor.d.ts +2 -15
  360. package/dist/client/worker/processor.js +68 -125
  361. package/dist/client/worker/processorHandlers.d.ts +4 -65
  362. package/dist/client/worker/processorHandlers.js +4 -400
  363. package/dist/client/worker/processorOutcome.d.ts +14 -0
  364. package/dist/client/worker/processorOutcome.js +125 -0
  365. package/dist/client/worker/runtime/buffer.d.ts +8 -0
  366. package/dist/client/worker/runtime/buffer.js +50 -0
  367. package/dist/client/worker/runtime/control.d.ts +26 -0
  368. package/dist/client/worker/runtime/control.js +175 -0
  369. package/dist/client/worker/runtime/execution.d.ts +11 -0
  370. package/dist/client/worker/runtime/execution.js +123 -0
  371. package/dist/client/worker/runtime/lifecycle.d.ts +7 -0
  372. package/dist/client/worker/runtime/lifecycle.js +114 -0
  373. package/dist/client/worker/runtime/manual.d.ts +10 -0
  374. package/dist/client/worker/runtime/manual.js +137 -0
  375. package/dist/client/worker/runtime/options.d.ts +5 -0
  376. package/dist/client/worker/runtime/options.js +39 -0
  377. package/dist/client/worker/runtime/polling.d.ts +12 -0
  378. package/dist/client/worker/runtime/polling.js +123 -0
  379. package/dist/client/worker/runtime/state.d.ts +110 -0
  380. package/dist/client/worker/runtime/state.js +156 -0
  381. package/dist/client/worker/types/index.d.ts +5 -0
  382. package/dist/client/worker/types/index.js +1 -0
  383. package/dist/client/worker/types/manual.d.ts +7 -0
  384. package/dist/client/worker/types/manual.js +1 -0
  385. package/dist/client/worker/types/options.d.ts +24 -0
  386. package/dist/client/worker/types/options.js +1 -0
  387. package/dist/client/worker/types/outcome.d.ts +23 -0
  388. package/dist/client/worker/types/outcome.js +1 -0
  389. package/dist/client/worker/types/processor.d.ts +22 -0
  390. package/dist/client/worker/types/processor.js +1 -0
  391. package/dist/client/worker/types/transport.d.ts +11 -0
  392. package/dist/client/worker/types/transport.js +1 -0
  393. package/dist/client/worker/worker.d.ts +3 -160
  394. package/dist/client/worker/worker.js +3 -904
  395. package/dist/client/worker/workerRateLimiter.d.ts +5 -1
  396. package/dist/client/worker/workerRateLimiter.js +40 -20
  397. package/dist/client/worker.d.ts +1 -0
  398. package/dist/client/workflow/compensationChild.d.ts +2 -1
  399. package/dist/client/workflow/compensationChild.js +1 -1
  400. package/dist/client/workflow/compensationClaim.d.ts +11 -0
  401. package/dist/client/workflow/compensationClaim.js +30 -0
  402. package/dist/client/workflow/compensator.d.ts +7 -2
  403. package/dist/client/workflow/compensator.js +5 -11
  404. package/dist/client/workflow/recovery.js +25 -2
  405. package/dist/client/workflow/rollbackControl.js +1 -1
  406. package/dist/domain/job/constants.d.ts +12 -0
  407. package/dist/domain/job/constants.js +12 -0
  408. package/dist/domain/job/create.d.ts +2 -0
  409. package/dist/domain/job/create.js +103 -0
  410. package/dist/domain/job/ids.d.ts +5 -0
  411. package/dist/domain/job/ids.js +12 -0
  412. package/dist/domain/job/locks.d.ts +4 -0
  413. package/dist/domain/job/locks.js +23 -0
  414. package/dist/domain/job/payload.d.ts +18 -0
  415. package/dist/domain/job/payload.js +43 -0
  416. package/dist/domain/job/state.d.ts +8 -0
  417. package/dist/domain/job/state.js +51 -0
  418. package/dist/domain/job/terminal.d.ts +3 -0
  419. package/dist/domain/job/terminal.js +9 -0
  420. package/dist/domain/queue/dlqShard.d.ts +2 -0
  421. package/dist/domain/queue/dlqShard.js +34 -9
  422. package/dist/domain/queue/limiterManager.d.ts +11 -0
  423. package/dist/domain/queue/limiterManager.js +28 -0
  424. package/dist/domain/queue/priorityQueue.js +3 -39
  425. package/dist/domain/queue/priorityQueueOrder.d.ts +3 -0
  426. package/dist/domain/queue/priorityQueueOrder.js +21 -0
  427. package/dist/domain/queue/shard/dependencies.d.ts +11 -0
  428. package/dist/domain/queue/shard/dependencies.js +22 -0
  429. package/dist/domain/queue/shard/dlq.d.ts +25 -0
  430. package/dist/domain/queue/shard/dlq.js +71 -0
  431. package/dist/domain/queue/shard/keys.d.ts +18 -0
  432. package/dist/domain/queue/shard/keys.js +45 -0
  433. package/dist/domain/queue/shard/lifecycle.d.ts +10 -0
  434. package/dist/domain/queue/shard/lifecycle.js +43 -0
  435. package/dist/domain/queue/shard/limits.d.ts +24 -0
  436. package/dist/domain/queue/shard/limits.js +57 -0
  437. package/dist/domain/queue/shard/metrics.d.ts +32 -0
  438. package/dist/domain/queue/shard/metrics.js +72 -0
  439. package/dist/domain/queue/shard/state.d.ts +34 -0
  440. package/dist/domain/queue/shard/state.js +80 -0
  441. package/dist/domain/queue/shard.d.ts +5 -137
  442. package/dist/domain/queue/shard.js +4 -390
  443. package/dist/domain/queue/uniqueKeyManager.d.ts +3 -1
  444. package/dist/domain/queue/uniqueKeyManager.js +9 -1
  445. package/dist/domain/response/builders.d.ts +15 -0
  446. package/dist/domain/response/builders.js +39 -0
  447. package/dist/domain/types/command.d.ts +2 -522
  448. package/dist/domain/types/command.js +2 -5
  449. package/dist/domain/types/commands/base.d.ts +5 -0
  450. package/dist/domain/types/commands/base.js +1 -0
  451. package/dist/domain/types/commands/core.d.ts +106 -0
  452. package/dist/domain/types/commands/core.js +1 -0
  453. package/dist/domain/types/commands/cron.d.ts +36 -0
  454. package/dist/domain/types/commands/cron.js +1 -0
  455. package/dist/domain/types/commands/dashboard.d.ts +13 -0
  456. package/dist/domain/types/commands/dashboard.js +1 -0
  457. package/dist/domain/types/commands/dlq.d.ts +39 -0
  458. package/dist/domain/types/commands/dlq.js +1 -0
  459. package/dist/domain/types/commands/extended.d.ts +63 -0
  460. package/dist/domain/types/commands/extended.js +1 -0
  461. package/dist/domain/types/commands/index.d.ts +12 -0
  462. package/dist/domain/types/commands/index.js +12 -0
  463. package/dist/domain/types/commands/limits.d.ts +54 -0
  464. package/dist/domain/types/commands/limits.js +1 -0
  465. package/dist/domain/types/commands/management.d.ts +73 -0
  466. package/dist/domain/types/commands/management.js +1 -0
  467. package/dist/domain/types/commands/monitoring.d.ts +49 -0
  468. package/dist/domain/types/commands/monitoring.js +1 -0
  469. package/dist/domain/types/commands/protocol.d.ts +20 -0
  470. package/dist/domain/types/commands/protocol.js +1 -0
  471. package/dist/domain/types/commands/query.d.ts +46 -0
  472. package/dist/domain/types/commands/query.js +1 -0
  473. package/dist/domain/types/commands/union.d.ts +13 -0
  474. package/dist/domain/types/commands/union.js +1 -0
  475. package/dist/domain/types/commands/workers.d.ts +39 -0
  476. package/dist/domain/types/commands/workers.js +1 -0
  477. package/dist/domain/types/cron.d.ts +4 -2
  478. package/dist/domain/types/cron.js +3 -0
  479. package/dist/domain/types/dlq.d.ts +17 -0
  480. package/dist/domain/types/dlq.js +70 -14
  481. package/dist/domain/types/index.d.ts +2 -0
  482. package/dist/domain/types/index.js +1 -0
  483. package/dist/domain/types/job.d.ts +8 -269
  484. package/dist/domain/types/job.js +8 -234
  485. package/dist/domain/types/jobs/model.d.ts +152 -0
  486. package/dist/domain/types/jobs/model.js +1 -0
  487. package/dist/domain/types/metrics.d.ts +16 -0
  488. package/dist/domain/types/metrics.js +1 -0
  489. package/dist/domain/types/priorityQueue.d.ts +12 -0
  490. package/dist/domain/types/priorityQueue.js +1 -0
  491. package/dist/domain/types/protocol.d.ts +5 -0
  492. package/dist/domain/types/protocol.js +4 -0
  493. package/dist/domain/types/queue.d.ts +7 -0
  494. package/dist/domain/types/queue.js +13 -0
  495. package/dist/domain/types/response.d.ts +3 -192
  496. package/dist/domain/types/response.js +3 -101
  497. package/dist/domain/types/responses/model.d.ts +152 -0
  498. package/dist/domain/types/responses/model.js +1 -0
  499. package/dist/domain/types/shard.d.ts +4 -0
  500. package/dist/domain/types/shard.js +1 -0
  501. package/dist/infrastructure/cloud/cloudAgent.js +6 -0
  502. package/dist/infrastructure/cloud/commandHandler.d.ts +2 -41
  503. package/dist/infrastructure/cloud/commandHandler.js +1 -1
  504. package/dist/infrastructure/cloud/commands/integrations.d.ts +2 -0
  505. package/dist/infrastructure/cloud/commands/integrations.js +31 -0
  506. package/dist/infrastructure/cloud/commands/jobMapper.d.ts +56 -0
  507. package/dist/infrastructure/cloud/commands/jobMapper.js +72 -0
  508. package/dist/infrastructure/cloud/commands/jobs.d.ts +2 -0
  509. package/dist/infrastructure/cloud/commands/jobs.js +111 -0
  510. package/dist/infrastructure/cloud/commands/queues.d.ts +2 -0
  511. package/dist/infrastructure/cloud/commands/queues.js +126 -0
  512. package/dist/infrastructure/cloud/commands.d.ts +3 -10
  513. package/dist/infrastructure/cloud/commands.js +7 -344
  514. package/dist/infrastructure/cloud/snapshot/analytics.d.ts +16 -0
  515. package/dist/infrastructure/cloud/snapshot/analytics.js +132 -0
  516. package/dist/infrastructure/cloud/snapshot/collector.d.ts +24 -0
  517. package/dist/infrastructure/cloud/snapshot/collector.js +105 -0
  518. package/dist/infrastructure/cloud/snapshot/config.d.ts +5 -0
  519. package/dist/infrastructure/cloud/snapshot/config.js +86 -0
  520. package/dist/infrastructure/cloud/snapshot/jobs.d.ts +5 -0
  521. package/dist/infrastructure/cloud/snapshot/jobs.js +148 -0
  522. package/dist/infrastructure/cloud/snapshot/stalls.d.ts +3 -0
  523. package/dist/infrastructure/cloud/snapshot/stalls.js +34 -0
  524. package/dist/infrastructure/cloud/snapshotCollector.d.ts +2 -53
  525. package/dist/infrastructure/cloud/snapshotCollector.js +5 -107
  526. package/dist/infrastructure/cloud/snapshotHelpers.d.ts +5 -45
  527. package/dist/infrastructure/cloud/snapshotHelpers.js +4 -426
  528. package/dist/infrastructure/cloud/types/collector.d.ts +54 -0
  529. package/dist/infrastructure/cloud/types/collector.js +1 -0
  530. package/dist/infrastructure/cloud/types/command.d.ts +44 -0
  531. package/dist/infrastructure/cloud/types/command.js +1 -0
  532. package/dist/infrastructure/cloud/types/config.d.ts +18 -0
  533. package/dist/infrastructure/cloud/types/config.js +1 -0
  534. package/dist/infrastructure/cloud/types/event.d.ts +14 -0
  535. package/dist/infrastructure/cloud/types/event.js +1 -0
  536. package/dist/infrastructure/cloud/types/redact.d.ts +4 -0
  537. package/dist/infrastructure/cloud/types/redact.js +1 -0
  538. package/dist/infrastructure/cloud/types/snapshot.d.ts +52 -0
  539. package/dist/infrastructure/cloud/types/snapshot.js +1 -0
  540. package/dist/infrastructure/cloud/types/snapshotCore.d.ts +125 -0
  541. package/dist/infrastructure/cloud/types/snapshotCore.js +1 -0
  542. package/dist/infrastructure/cloud/types/snapshotJobs.d.ts +124 -0
  543. package/dist/infrastructure/cloud/types/snapshotJobs.js +1 -0
  544. package/dist/infrastructure/cloud/types/snapshotTelemetry.d.ts +100 -0
  545. package/dist/infrastructure/cloud/types/snapshotTelemetry.js +1 -0
  546. package/dist/infrastructure/cloud/types.d.ts +3 -445
  547. package/dist/infrastructure/cloud/types.js +0 -4
  548. package/dist/infrastructure/persistence/batchInsert.d.ts +13 -0
  549. package/dist/infrastructure/persistence/batchInsert.js +96 -0
  550. package/dist/infrastructure/persistence/jobOptionsBlob.d.ts +18 -0
  551. package/dist/infrastructure/persistence/jobOptionsBlob.js +56 -0
  552. package/dist/infrastructure/persistence/legacyNameMigration.d.ts +5 -0
  553. package/dist/infrastructure/persistence/legacyNameMigration.js +42 -0
  554. package/dist/infrastructure/persistence/migrations.d.ts +3 -0
  555. package/dist/infrastructure/persistence/migrations.js +120 -0
  556. package/dist/infrastructure/persistence/schema.d.ts +3 -5
  557. package/dist/infrastructure/persistence/schema.js +40 -136
  558. package/dist/infrastructure/persistence/sqlite/admission.d.ts +9 -0
  559. package/dist/infrastructure/persistence/sqlite/admission.js +34 -0
  560. package/dist/infrastructure/persistence/sqlite/control.d.ts +32 -0
  561. package/dist/infrastructure/persistence/sqlite/control.js +90 -0
  562. package/dist/infrastructure/persistence/sqlite/flows.d.ts +26 -0
  563. package/dist/infrastructure/persistence/sqlite/flows.js +167 -0
  564. package/dist/infrastructure/persistence/sqlite/jobs.d.ts +23 -0
  565. package/dist/infrastructure/persistence/sqlite/jobs.js +166 -0
  566. package/dist/infrastructure/persistence/sqlite/lifecycle.d.ts +6 -0
  567. package/dist/infrastructure/persistence/sqlite/lifecycle.js +30 -0
  568. package/dist/infrastructure/persistence/sqlite/mutations.d.ts +20 -0
  569. package/dist/infrastructure/persistence/sqlite/mutations.js +149 -0
  570. package/dist/infrastructure/persistence/sqlite/queries.d.ts +23 -0
  571. package/dist/infrastructure/persistence/sqlite/queries.js +89 -0
  572. package/dist/infrastructure/persistence/sqlite/records.d.ts +24 -0
  573. package/dist/infrastructure/persistence/sqlite/records.js +115 -0
  574. package/dist/infrastructure/persistence/sqlite/state.d.ts +36 -0
  575. package/dist/infrastructure/persistence/sqlite/state.js +207 -0
  576. package/dist/infrastructure/persistence/sqlite/telemetry.d.ts +16 -0
  577. package/dist/infrastructure/persistence/sqlite/telemetry.js +126 -0
  578. package/dist/infrastructure/persistence/sqlite.d.ts +5 -276
  579. package/dist/infrastructure/persistence/sqlite.js +3 -997
  580. package/dist/infrastructure/persistence/sqliteBatch.d.ts +4 -121
  581. package/dist/infrastructure/persistence/sqliteBatch.js +3 -422
  582. package/dist/infrastructure/persistence/sqliteSerializer.d.ts +6 -1
  583. package/dist/infrastructure/persistence/sqliteSerializer.js +33 -11
  584. package/dist/infrastructure/persistence/statements.d.ts +5 -1
  585. package/dist/infrastructure/persistence/statements.js +14 -9
  586. package/dist/infrastructure/persistence/types/admission.d.ts +8 -0
  587. package/dist/infrastructure/persistence/types/admission.js +1 -0
  588. package/dist/infrastructure/persistence/types/batch.d.ts +12 -0
  589. package/dist/infrastructure/persistence/types/batch.js +1 -0
  590. package/dist/infrastructure/persistence/types/sqlite.d.ts +17 -0
  591. package/dist/infrastructure/persistence/types/sqlite.js +1 -0
  592. package/dist/infrastructure/persistence/writeBuffer.d.ts +38 -0
  593. package/dist/infrastructure/persistence/writeBuffer.js +221 -0
  594. package/dist/infrastructure/scheduler/cron/execution.d.ts +12 -0
  595. package/dist/infrastructure/scheduler/cron/execution.js +150 -0
  596. package/dist/infrastructure/scheduler/cron/runtime.d.ts +31 -0
  597. package/dist/infrastructure/scheduler/cron/runtime.js +143 -0
  598. package/dist/infrastructure/scheduler/cronScheduler.d.ts +4 -117
  599. package/dist/infrastructure/scheduler/cronScheduler.js +3 -436
  600. package/dist/infrastructure/scheduler/types/cronScheduler.d.ts +16 -0
  601. package/dist/infrastructure/scheduler/types/cronScheduler.js +1 -0
  602. package/dist/infrastructure/server/bootstrap.js +3 -0
  603. package/dist/infrastructure/server/handler-routes/control.d.ts +8 -0
  604. package/dist/infrastructure/server/handler-routes/control.js +82 -0
  605. package/dist/infrastructure/server/handler-routes/jobs.d.ts +6 -0
  606. package/dist/infrastructure/server/handler-routes/jobs.js +110 -0
  607. package/dist/infrastructure/server/handler-routes/monitoring.d.ts +5 -0
  608. package/dist/infrastructure/server/handler-routes/monitoring.js +65 -0
  609. package/dist/infrastructure/server/handlerRoutes.d.ts +3 -26
  610. package/dist/infrastructure/server/handlerRoutes.js +3 -257
  611. package/dist/infrastructure/server/handlers/advanced/configNumbers.d.ts +2 -0
  612. package/dist/infrastructure/server/handlers/advanced/configNumbers.js +26 -0
  613. package/dist/infrastructure/server/handlers/advanced/dependencies.d.ts +15 -0
  614. package/dist/infrastructure/server/handlers/advanced/dependencies.js +38 -0
  615. package/dist/infrastructure/server/handlers/advanced/jobs.d.ts +33 -0
  616. package/dist/infrastructure/server/handlers/advanced/jobs.js +136 -0
  617. package/dist/infrastructure/server/handlers/advanced/queue.d.ts +42 -0
  618. package/dist/infrastructure/server/handlers/advanced/queue.js +111 -0
  619. package/dist/infrastructure/server/handlers/advanced.d.ts +3 -121
  620. package/dist/infrastructure/server/handlers/advanced.js +3 -336
  621. package/dist/infrastructure/server/handlers/core.d.ts +1 -4
  622. package/dist/infrastructure/server/handlers/core.js +37 -20
  623. package/dist/infrastructure/server/handlers/cron.js +9 -1
  624. package/dist/infrastructure/server/handlers/dlq.d.ts +3 -0
  625. package/dist/infrastructure/server/handlers/dlq.js +18 -4
  626. package/dist/infrastructure/server/handlers/flow.js +6 -1
  627. package/dist/infrastructure/server/handlers/introspection.d.ts +19 -0
  628. package/dist/infrastructure/server/handlers/introspection.js +21 -0
  629. package/dist/infrastructure/server/handlers/management.d.ts +8 -0
  630. package/dist/infrastructure/server/handlers/management.js +30 -0
  631. package/dist/infrastructure/server/handlers/monitoring/health.d.ts +13 -0
  632. package/dist/infrastructure/server/handlers/monitoring/health.js +61 -0
  633. package/dist/infrastructure/server/handlers/monitoring/operations.d.ts +8 -0
  634. package/dist/infrastructure/server/handlers/monitoring/operations.js +28 -0
  635. package/dist/infrastructure/server/handlers/monitoring/webhooks.d.ts +7 -0
  636. package/dist/infrastructure/server/handlers/monitoring/webhooks.js +56 -0
  637. package/dist/infrastructure/server/handlers/monitoring/workers.d.ts +6 -0
  638. package/dist/infrastructure/server/handlers/monitoring/workers.js +57 -0
  639. package/dist/infrastructure/server/handlers/monitoring.d.ts +4 -30
  640. package/dist/infrastructure/server/handlers/monitoring.js +4 -222
  641. package/dist/infrastructure/server/handlers/pushBatchValidation.d.ts +1 -1
  642. package/dist/infrastructure/server/handlers/pushBatchValidation.js +7 -0
  643. package/dist/infrastructure/server/handlers/query.js +13 -4
  644. package/dist/infrastructure/server/http-routes/jobAdvanced.d.ts +2 -0
  645. package/dist/infrastructure/server/http-routes/jobAdvanced.js +106 -0
  646. package/dist/infrastructure/server/http-routes/jobManagement.d.ts +2 -0
  647. package/dist/infrastructure/server/http-routes/jobManagement.js +74 -0
  648. package/dist/infrastructure/server/http-routes/queueJobs.d.ts +2 -0
  649. package/dist/infrastructure/server/http-routes/queueJobs.js +108 -0
  650. package/dist/infrastructure/server/httpRouteJobs.d.ts +1 -8
  651. package/dist/infrastructure/server/httpRouteJobs.js +33 -222
  652. package/dist/infrastructure/server/httpRouteQueues.d.ts +1 -6
  653. package/dist/infrastructure/server/httpRouteQueues.js +51 -217
  654. package/dist/infrastructure/server/httpRouteResources.js +1 -0
  655. package/dist/infrastructure/server/protocol/commands.d.ts +8 -0
  656. package/dist/infrastructure/server/protocol/commands.js +31 -0
  657. package/dist/infrastructure/server/protocol/frameParser.d.ts +16 -0
  658. package/dist/infrastructure/server/protocol/frameParser.js +65 -0
  659. package/dist/infrastructure/server/protocol/lineBuffer.d.ts +6 -0
  660. package/dist/infrastructure/server/protocol/lineBuffer.js +21 -0
  661. package/dist/infrastructure/server/protocol/validation.d.ts +9 -0
  662. package/dist/infrastructure/server/protocol/validation.js +75 -0
  663. package/dist/infrastructure/server/protocol.d.ts +5 -77
  664. package/dist/infrastructure/server/protocol.js +4 -265
  665. package/dist/infrastructure/server/rateLimiter.js +1 -0
  666. package/dist/infrastructure/server/socketWriteQueue.d.ts +1 -1
  667. package/dist/infrastructure/server/socketWriteQueue.js +8 -5
  668. package/dist/infrastructure/server/sse/constants.d.ts +5 -0
  669. package/dist/infrastructure/server/sse/constants.js +5 -0
  670. package/dist/infrastructure/server/sse/eventBuffer.d.ts +3 -0
  671. package/dist/infrastructure/server/sse/eventBuffer.js +21 -0
  672. package/dist/infrastructure/server/sseHandler.d.ts +2 -6
  673. package/dist/infrastructure/server/sseHandler.js +20 -96
  674. package/dist/infrastructure/server/tcp/clientRelease.d.ts +2 -0
  675. package/dist/infrastructure/server/tcp/clientRelease.js +18 -0
  676. package/dist/infrastructure/server/tcp/connections.d.ts +24 -0
  677. package/dist/infrastructure/server/tcp/connections.js +162 -0
  678. package/dist/infrastructure/server/tcp/constants.d.ts +3 -0
  679. package/dist/infrastructure/server/tcp/constants.js +3 -0
  680. package/dist/infrastructure/server/tcp/eventSubscriptions.d.ts +10 -0
  681. package/dist/infrastructure/server/tcp/eventSubscriptions.js +17 -0
  682. package/dist/infrastructure/server/tcp/responses.d.ts +3 -0
  683. package/dist/infrastructure/server/tcp/responses.js +8 -0
  684. package/dist/infrastructure/server/tcp.d.ts +10 -68
  685. package/dist/infrastructure/server/tcp.js +47 -256
  686. package/dist/infrastructure/server/types/protocol.d.ts +4 -0
  687. package/dist/infrastructure/server/types/protocol.js +1 -0
  688. package/dist/infrastructure/server/types/sse.d.ts +11 -0
  689. package/dist/infrastructure/server/types/sse.js +1 -0
  690. package/dist/infrastructure/server/types/tcpServer.d.ts +25 -0
  691. package/dist/infrastructure/server/types/tcpServer.js +1 -0
  692. package/dist/infrastructure/server/types/ws.d.ts +6 -0
  693. package/dist/infrastructure/server/types/ws.js +1 -0
  694. package/dist/infrastructure/server/ws/constants.d.ts +6 -0
  695. package/dist/infrastructure/server/ws/constants.js +130 -0
  696. package/dist/infrastructure/server/ws/snapshots.d.ts +4 -0
  697. package/dist/infrastructure/server/ws/snapshots.js +52 -0
  698. package/dist/infrastructure/server/ws/subscriptions.d.ts +10 -0
  699. package/dist/infrastructure/server/ws/subscriptions.js +39 -0
  700. package/dist/infrastructure/server/wsHandler.d.ts +2 -10
  701. package/dist/infrastructure/server/wsHandler.js +12 -237
  702. package/dist/mcp/adapter.d.ts +5 -403
  703. package/dist/mcp/adapter.js +6 -778
  704. package/dist/mcp/backend/embedded/base.d.ts +7 -0
  705. package/dist/mcp/backend/embedded/base.js +15 -0
  706. package/dist/mcp/backend/embedded/index.d.ts +14 -0
  707. package/dist/mcp/backend/embedded/index.js +22 -0
  708. package/dist/mcp/backend/embedded/jobs.d.ts +44 -0
  709. package/dist/mcp/backend/embedded/jobs.js +98 -0
  710. package/dist/mcp/backend/embedded/queues.d.ts +27 -0
  711. package/dist/mcp/backend/embedded/queues.js +84 -0
  712. package/dist/mcp/backend/embedded/services.d.ts +29 -0
  713. package/dist/mcp/backend/embedded/services.js +107 -0
  714. package/dist/mcp/backend/serializers.d.ts +7 -0
  715. package/dist/mcp/backend/serializers.js +32 -0
  716. package/dist/mcp/backend/tcp/base.d.ts +19 -0
  717. package/dist/mcp/backend/tcp/base.js +54 -0
  718. package/dist/mcp/backend/tcp/index.d.ts +14 -0
  719. package/dist/mcp/backend/tcp/index.js +20 -0
  720. package/dist/mcp/backend/tcp/jobs.d.ts +44 -0
  721. package/dist/mcp/backend/tcp/jobs.js +122 -0
  722. package/dist/mcp/backend/tcp/queues.d.ts +27 -0
  723. package/dist/mcp/backend/tcp/queues.js +89 -0
  724. package/dist/mcp/backend/tcp/services.d.ts +30 -0
  725. package/dist/mcp/backend/tcp/services.js +161 -0
  726. package/dist/mcp/types/adapter.d.ts +176 -0
  727. package/dist/mcp/types/adapter.js +1 -0
  728. package/dist/shared/asyncLock.d.ts +13 -0
  729. package/dist/shared/asyncLock.js +65 -0
  730. package/dist/shared/lock.d.ts +10 -72
  731. package/dist/shared/lock.js +7 -231
  732. package/dist/shared/lockError.d.ts +3 -0
  733. package/dist/shared/lockError.js +6 -0
  734. package/dist/shared/lockTimeout.d.ts +2 -0
  735. package/dist/shared/lockTimeout.js +2 -0
  736. package/dist/shared/rwLock.d.ts +22 -0
  737. package/dist/shared/rwLock.js +124 -0
  738. package/dist/shared/serialization.js +1 -0
  739. package/dist/shared/skipList.d.ts +0 -5
  740. package/dist/shared/skipList.js +10 -57
  741. package/dist/shared/skipListNodes.d.ts +6 -0
  742. package/dist/shared/skipListNodes.js +43 -0
  743. package/dist/shared/types/lock.d.ts +7 -0
  744. package/dist/shared/types/lock.js +1 -0
  745. package/dist/shared/types/skipList.d.ts +4 -0
  746. package/dist/shared/types/skipList.js +1 -0
  747. package/package.json +2 -1
@@ -1,998 +1,4 @@
1
- /**
2
- * SQLite Storage Implementation
3
- * Persistence layer using Bun's native SQLite
4
- * Uses MessagePack for ~2-3x faster serialization than JSON
5
- */
6
- import { Database } from 'bun:sqlite';
7
- import { createDlqEntry, } from '../../domain/types/dlq';
8
- import { PRAGMA_SETTINGS, SCHEMA, MIGRATION_TABLE, SCHEMA_VERSION, MIGRATIONS } from './schema';
9
- import { prepareStatements, } from './statements';
10
- import { pack, persistedInitialState, persistedStallCount, reconstructDlqEntry, rowToJob, unpack, } from './sqliteSerializer';
11
- import { BatchInsertManager, WriteBuffer } from './sqliteBatch';
12
- import { storageLog } from '../../shared/logger';
13
- import { DependencyCompletionStore, } from './dependencyCompletionStore';
14
- /** Check if an error is a SQLITE_FULL (disk full) error */
15
- function isSqliteFullError(err) {
16
- if (!(err instanceof Error))
17
- return false;
18
- const msg = err.message;
19
- return msg.includes('SQLITE_FULL') || msg.includes('database or disk is full');
20
- }
21
- /**
22
- * SQLite Storage class with write buffering for high throughput
23
- */
24
- export class SqliteStorage {
25
- db;
26
- statements;
27
- batchManager;
28
- writeBuffer;
29
- dependencyCompletionStore;
30
- _diskFull = false;
31
- _lastDiskFullError = null;
32
- _lastDiskFullAt = null;
33
- _criticalLosses = [];
34
- _onCriticalLoss;
35
- /** Cap on retained critical-loss records to prevent unbounded growth */
36
- static MAX_RETAINED_LOSSES = 100;
37
- constructor(config) {
38
- this.db = new Database(config.path, { create: true });
39
- // PRAGMA settings are performance/optimization hints, not correctness
40
- // requirements. A transient filesystem IOERR (e.g. SQLITE_IOERR_FSTAT from
41
- // `mmap_size` calling fstat() on the fd during a restart/cleanup race) must
42
- // NOT propagate out of the constructor — in a deferred/async context Bun
43
- // reports it as an "Unhandled error between tests" and tears down CI.
44
- try {
45
- this.db.run(PRAGMA_SETTINGS);
46
- }
47
- catch (err) {
48
- storageLog.error('Failed to apply PRAGMA settings', {
49
- error: err instanceof Error ? err.message : String(err),
50
- });
51
- }
52
- this.migrate();
53
- this.dependencyCompletionStore = new DependencyCompletionStore(this.db);
54
- this.statements = prepareStatements(this.db);
55
- this._onCriticalLoss = config.onCriticalLoss;
56
- // Initialize batch manager and write buffer
57
- this.batchManager = new BatchInsertManager(this.db);
58
- this.writeBuffer = new WriteBuffer(this.batchManager, config.writeBufferSize ?? 100, config.writeBufferFlushMs ?? 10, (err, jobCount) => {
59
- if (isSqliteFullError(err)) {
60
- this.setDiskFull(err.message);
61
- }
62
- // A constraint violation (e.g. duplicate jobs.id) is a PERMANENT per-row
63
- // rejection that the WriteBuffer isolated and dropped — sibling valid jobs
64
- // in the same flush were still persisted. Log it distinctly from a
65
- // transient flush failure (and never route it to the DLQ, which would
66
- // resurrect a duplicate).
67
- if (/constraint failed/i.test(err.message)) {
68
- storageLog.error('Write buffer rejected jobs (constraint violation, dropped)', {
69
- rejectedJobCount: jobCount,
70
- error: err.message,
71
- });
72
- }
73
- else {
74
- storageLog.error('Write buffer flush failed', {
75
- jobCount,
76
- error: err.message,
77
- diskFull: this._diskFull,
78
- });
79
- }
80
- }, (jobs, lastError, attempts) => {
81
- this.handleCriticalLoss(jobs, lastError, attempts);
82
- });
83
- }
84
- /**
85
- * Default handler for WriteBuffer critical loss. Logs every dropped job so
86
- * ops can recover from logs, retains the last MAX_RETAINED_LOSSES records
87
- * for programmatic inspection, and forwards to a user-provided callback.
88
- *
89
- * Without this handler the dropped jobs would be silently discarded by
90
- * sqliteBatch.ts:209-223 (no callback = no recovery path).
91
- */
92
- handleCriticalLoss(jobs, lastError, attempts) {
93
- storageLog.error('CRITICAL: WriteBuffer dropped jobs after exhausting retries', {
94
- lostJobCount: jobs.length,
95
- attempts,
96
- error: lastError.message,
97
- diskFull: this._diskFull,
98
- });
99
- for (const job of jobs) {
100
- storageLog.error('Lost job (recover from this log if needed)', {
101
- id: String(job.id),
102
- queue: job.queue,
103
- customId: job.customId,
104
- priority: job.priority,
105
- createdAt: job.createdAt,
106
- attempts: job.attempts,
107
- // Data preview (truncated to avoid log spam from huge payloads)
108
- dataPreview: this.previewJobData(job.data),
109
- });
110
- }
111
- this._criticalLosses.push({
112
- jobs,
113
- error: lastError.message,
114
- attempts,
115
- at: Date.now(),
116
- });
117
- // Bound retention
118
- while (this._criticalLosses.length > SqliteStorage.MAX_RETAINED_LOSSES) {
119
- this._criticalLosses.shift();
120
- }
121
- // Durably persist each lost job to the DLQ table so it survives a restart
122
- // and is recoverable via the normal DLQ path (getDlqEntry / loadDlq).
123
- // saveDlqEntry() writes directly via the prepared `insertDlq` statement
124
- // (NOT through the WriteBuffer that just exhausted its retries), so this
125
- // cannot recurse back into the failing flush path.
126
- for (const job of jobs) {
127
- try {
128
- this.saveDlqEntry(createDlqEntry(job, "unknown" /* FailureReason.Unknown */, lastError.message));
129
- }
130
- catch (err) {
131
- storageLog.error('Failed to persist lost job to DLQ', {
132
- id: String(job.id),
133
- queue: job.queue,
134
- error: err instanceof Error ? err.message : String(err),
135
- });
136
- }
137
- }
138
- // Forward to user-supplied callback if provided
139
- if (this._onCriticalLoss) {
140
- try {
141
- this._onCriticalLoss(jobs, lastError, attempts);
142
- }
143
- catch (err) {
144
- storageLog.error('onCriticalLoss callback threw', {
145
- error: err instanceof Error ? err.message : String(err),
146
- });
147
- }
148
- }
149
- }
150
- /** Truncate job data preview to keep logs readable. */
151
- previewJobData(data) {
152
- try {
153
- const s = JSON.stringify(data);
154
- return s.length > 500 ? s.slice(0, 500) + '...[truncated]' : s;
155
- }
156
- catch {
157
- return '[unserializable]';
158
- }
159
- }
160
- /** Retrieve retained critical-loss records (most recent last). */
161
- getCriticalLosses() {
162
- return this._criticalLosses;
163
- }
164
- /** Clear retained critical-loss records (e.g. after operator acknowledgement). */
165
- clearCriticalLosses() {
166
- this._criticalLosses.length = 0;
167
- }
168
- /** Mark disk as full and log */
169
- setDiskFull(message) {
170
- if (!this._diskFull) {
171
- storageLog.error('DISK FULL: SQLite cannot write, persistence degraded', { error: message });
172
- }
173
- this._diskFull = true;
174
- this._lastDiskFullError = message;
175
- this._lastDiskFullAt = Date.now();
176
- }
177
- /** Execute a write operation with SQLITE_FULL detection */
178
- safeWrite(fn) {
179
- try {
180
- fn();
181
- // Clear disk full flag on successful write
182
- if (this._diskFull) {
183
- this._diskFull = false;
184
- this._lastDiskFullError = null;
185
- storageLog.info('Disk full condition cleared - writes succeeding again');
186
- }
187
- }
188
- catch (err) {
189
- if (isSqliteFullError(err)) {
190
- this.setDiskFull(err instanceof Error ? err.message : String(err));
191
- }
192
- throw err;
193
- }
194
- }
195
- /** Check if storage is in disk-full state */
196
- get diskFull() {
197
- return this._diskFull;
198
- }
199
- /** Get disk full error details */
200
- getDiskFullStatus() {
201
- return {
202
- diskFull: this._diskFull,
203
- error: this._lastDiskFullError,
204
- since: this._lastDiskFullAt,
205
- };
206
- }
207
- /** Flush write buffer to disk. Returns number of jobs flushed. */
208
- flushWriteBuffer() {
209
- const flushed = this.writeBuffer.flush();
210
- const pending = this.writeBuffer.pendingCount;
211
- if (pending > 0) {
212
- throw new Error(`Cannot create a consistent backup while ${pending} write${pending === 1 ? '' : 's'} remains buffered`);
213
- }
214
- return flushed;
215
- }
216
- migrate() {
217
- this.db.run(MIGRATION_TABLE);
218
- const currentVersion = this.db.query('SELECT MAX(version) as version FROM migrations').get()
219
- ?.version ?? 0;
220
- if (currentVersion < SCHEMA_VERSION) {
221
- this.db.run(SCHEMA);
222
- // Apply incremental migrations for existing databases
223
- for (const [ver, sql] of Object.entries(MIGRATIONS)) {
224
- const v = Number(ver);
225
- if (v > currentVersion && v > 1) {
226
- try {
227
- this.db.run(sql);
228
- }
229
- catch {
230
- // Column/index may already exist from SCHEMA creation
231
- }
232
- }
233
- }
234
- this.db
235
- .prepare('INSERT INTO migrations (version, applied_at) VALUES (?, ?)')
236
- .run(SCHEMA_VERSION, Date.now());
237
- }
238
- }
239
- // ============ Job Operations ============
240
- /**
241
- * Insert job using write buffer for better throughput.
242
- * @param job The job to insert
243
- * @param durable If true, bypasses write buffer and writes immediately to disk
244
- */
245
- insertJob(job, durable) {
246
- if (durable) {
247
- this.insertJobImmediate(job);
248
- return;
249
- }
250
- this.writeBuffer.add(job);
251
- }
252
- /** Insert job immediately (bypass buffer) */
253
- insertJobImmediate(job) {
254
- this.safeWrite(() => {
255
- this.runInsertJobStmt(job);
256
- });
257
- }
258
- /** Run the insertJob statement for one job (no safeWrite/transaction wrapper). */
259
- runInsertJobStmt(job) {
260
- this.statements
261
- .get('insertJob')
262
- .run(job.id, job.queue, pack(job.data), job.priority, job.createdAt, job.runAt, job.attempts, job.maxAttempts, job.backoff, job.ttl, job.timeout, job.uniqueKey, job.customId, job.dependsOn.length > 0 ? pack(job.dependsOn) : null, job.parentId, job.childrenIds.length > 0 ? pack(job.childrenIds) : null, job.tags.length > 0 ? pack(job.tags) : null, persistedInitialState(job), job.lifo ? 1 : 0, job.groupId, job.removeOnComplete ? 1 : 0, job.removeOnFail ? 1 : 0, job.failParentOnFailure ? 1 : 0, job.removeDependencyOnFailure ? 1 : 0, job.continueParentOnFailure ? 1 : 0, job.ignoreDependencyOnFailure ? 1 : 0, job.stallTimeout, persistedStallCount(job), job.timeline.length > 0 ? pack(job.timeline) : null);
263
- }
264
- /**
265
- * Ensure a job's buffered INSERT has been written to disk before issuing a
266
- * state-mutating UPDATE. Without this, markActive/markCompleted's UPDATE
267
- * would silently match 0 rows and the state change would be overwritten
268
- * when the buffered INSERT eventually fires with the original
269
- * 'waiting'/'delayed' state baked at insert time.
270
- */
271
- flushIfBuffered(jobId) {
272
- if (this.writeBuffer.hasPending(String(jobId))) {
273
- try {
274
- this.writeBuffer.flush();
275
- }
276
- catch {
277
- // Flush errors are already routed through onError/onCriticalLoss.
278
- // Proceed to UPDATE — if the row really isn't there the UPDATE will
279
- // no-op and the caller's in-memory state stays authoritative until
280
- // the next successful flush or recovery cycle.
281
- }
282
- }
283
- }
284
- markActive(jobId, startedAt, timeline) {
285
- this.flushIfBuffered(jobId);
286
- this.safeWrite(() => {
287
- this.statements
288
- .get('updateJobState')
289
- .run('active', startedAt, timeline && timeline.length > 0 ? pack(timeline) : null, jobId);
290
- });
291
- }
292
- markCompleted(jobId, completedAt, timeline) {
293
- this.flushIfBuffered(jobId);
294
- this.safeWrite(() => {
295
- this.statements
296
- .get('completeJob')
297
- .run('completed', completedAt, timeline && timeline.length > 0 ? pack(timeline) : null, jobId);
298
- });
299
- }
300
- markFailed(job, error) {
301
- this.flushIfBuffered(job.id);
302
- this.safeWrite(() => {
303
- this.statements.get('insertDlq').run(job.id, job.queue, pack({ job, error }), Date.now());
304
- });
305
- }
306
- /** Save DLQ entry with full metadata */
307
- saveDlqEntry(entry) {
308
- this.safeWrite(() => {
309
- this.statements
310
- .get('insertDlq')
311
- .run(entry.job.id, entry.job.queue, pack(entry), entry.enteredAt);
312
- });
313
- }
314
- /**
315
- * Commit a terminal child outcome, its optional DLQ row, and its flow outbox
316
- * record together. Recovery therefore never observes only half the transition.
317
- */
318
- commitFailedJob(jobId, entry, flowFailure) {
319
- this.writeBuffer.removePending(jobId);
320
- this.safeWrite(() => {
321
- const tx = this.db.transaction(() => {
322
- if (entry) {
323
- this.statements
324
- .get('insertDlq')
325
- .run(entry.job.id, entry.job.queue, pack(entry), entry.enteredAt);
326
- }
327
- if (flowFailure) {
328
- this.db
329
- .prepare(`INSERT INTO flow_failures
330
- (parent_id, child_id, child_queue, mode, error, created_at)
331
- VALUES (?, ?, ?, ?, ?, ?)
332
- ON CONFLICT(parent_id, child_id) DO UPDATE SET
333
- child_queue=excluded.child_queue, mode=excluded.mode,
334
- error=excluded.error, created_at=excluded.created_at`)
335
- .run(flowFailure.parentId, flowFailure.childId, flowFailure.childQueue, flowFailure.mode, flowFailure.error, flowFailure.createdAt);
336
- }
337
- this.statements.get('deleteJob').run(jobId);
338
- this.statements.get('deleteJobResult').run(jobId);
339
- });
340
- tx();
341
- });
342
- }
343
- /** Delete DLQ entry by job ID */
344
- deleteDlqEntry(jobId) {
345
- this.safeWrite(() => {
346
- this.statements.get('deleteDlqEntry').run(jobId);
347
- });
348
- }
349
- /** Clear all DLQ entries for a queue */
350
- clearDlqQueue(queue) {
351
- this.safeWrite(() => {
352
- this.statements.get('clearDlqQueue').run(queue);
353
- });
354
- }
355
- /**
356
- * Permanently purge terminal DLQ jobs in one transaction.
357
- * Pending buffered inserts are removed first so a purged job cannot be
358
- * written back after the transaction commits.
359
- */
360
- purgeDlqEntries(queue, dlqJobIds, terminalJobIds, clearQueue) {
361
- for (const jobId of terminalJobIds)
362
- this.writeBuffer.removePending(jobId);
363
- this.safeWrite(() => {
364
- const deleteDlq = this.statements.get('deleteDlqEntryForQueue');
365
- const clearDlq = this.statements.get('clearDlqQueue');
366
- const deleteJob = this.statements.get('deleteJob');
367
- const deleteResult = this.statements.get('deleteJobResult');
368
- const tx = this.db.transaction(() => {
369
- if (clearQueue) {
370
- clearDlq.run(queue);
371
- }
372
- else {
373
- for (const jobId of dlqJobIds)
374
- deleteDlq.run(jobId, queue);
375
- }
376
- for (const jobId of terminalJobIds) {
377
- deleteJob.run(jobId);
378
- deleteResult.run(jobId);
379
- }
380
- });
381
- tx();
382
- });
383
- }
384
- /** Load all DLQ entries */
385
- loadDlq() {
386
- const rows = this.statements.get('loadDlq').all();
387
- const result = new Map();
388
- for (const row of rows) {
389
- const entry = unpack(row.entry, null, `loadDlq:${row.job_id}`);
390
- if (!entry?.job)
391
- continue;
392
- const reconstructedEntry = reconstructDlqEntry(entry);
393
- let queueEntries = result.get(row.queue);
394
- if (!queueEntries) {
395
- queueEntries = [];
396
- result.set(row.queue, queueEntries);
397
- }
398
- queueEntries.push(reconstructedEntry);
399
- }
400
- return result;
401
- }
402
- updateForRetry(job) {
403
- this.safeWrite(() => {
404
- this.db
405
- .prepare('UPDATE jobs SET attempts = ?, stall_count = ?, run_at = ?, state = ?, timeline = ?, stacktrace = ? WHERE id = ?')
406
- .run(job.attempts, persistedStallCount(job), job.runAt, 'waiting', job.timeline.length > 0 ? pack(job.timeline) : null, job.stacktrace && job.stacktrace.length > 0 ? pack(job.stacktrace) : null, job.id);
407
- });
408
- }
409
- deleteJob(jobId) {
410
- this.writeBuffer.removePending(jobId);
411
- this.safeWrite(() => {
412
- // Atomic cascade: job row + result must succeed or fail together so
413
- // cleanAsync cannot leave orphan job_results rows (issue #84).
414
- // DLQ is NOT cascaded here: moveFailedJobToDlq() intentionally calls
415
- // saveDlqEntry() then deleteJob() to drop the jobs row while keeping
416
- // the DLQ entry. Callers that want DLQ cleanup (e.g. cleanFailed)
417
- // explicitly call deleteDlqEntry() before deleteJob().
418
- const deleteStmt = this.statements.get('deleteJob');
419
- const deleteResultStmt = this.statements.get('deleteJobResult');
420
- const tx = this.db.transaction((id) => {
421
- deleteStmt.run(id);
422
- deleteResultStmt.run(id);
423
- this.db.prepare('DELETE FROM flow_failures WHERE parent_id = ?').run(id);
424
- });
425
- tx(jobId);
426
- });
427
- }
428
- /** Update a job's data blob (e.g. after adding __parentId) */
429
- updateJobData(jobId, data) {
430
- this.flushIfBuffered(jobId);
431
- this.safeWrite(() => {
432
- this.db.prepare('UPDATE jobs SET data = ? WHERE id = ?').run(pack(data), jobId);
433
- });
434
- }
435
- /** Persist priority ordering, including its LIFO tie-break, across recovery. */
436
- updateJobPriority(jobId, priority, lifo) {
437
- this.flushIfBuffered(jobId);
438
- this.safeWrite(() => {
439
- this.db
440
- .prepare('UPDATE jobs SET priority = ?, lifo = ? WHERE id = ?')
441
- .run(priority, lifo ? 1 : 0, jobId);
442
- });
443
- }
444
- /** Persist progress and its heartbeat as one active-job mutation. */
445
- updateJobProgress(jobId, progress, message, lastHeartbeat) {
446
- this.flushIfBuffered(jobId);
447
- this.safeWrite(() => {
448
- this.statements.get('updateJobProgress').run(progress, message, lastHeartbeat, jobId);
449
- });
450
- }
451
- /**
452
- * Persist a delay change (moveToDelayed / changeDelay) so the new `run_at`
453
- * survives a restart. Without this the delay lives only in the in-memory heap:
454
- * recovery reloads the stale on-disk `run_at` and the job is immediately
455
- * pullable again. State is re-derived from `run_at` (future → 'delayed'),
456
- * mirroring the insert convention; `started_at` is cleared because a job moved
457
- * back to the queue from `active` is no longer running.
458
- */
459
- updateRunAt(jobId, runAt) {
460
- // Flush a still-buffered insert first (like markActive/markCompleted/markFailed)
461
- // so the UPDATE lands on a real row — otherwise the delay would be lost across a
462
- // restart when the job was added (non-durable) and re-delayed within the same
463
- // ~10ms write-buffer window.
464
- this.flushIfBuffered(jobId);
465
- this.safeWrite(() => {
466
- const state = runAt > Date.now() ? 'delayed' : 'waiting';
467
- this.db
468
- .prepare('UPDATE jobs SET run_at = ?, state = ?, started_at = NULL WHERE id = ?')
469
- .run(runAt, state, jobId);
470
- });
471
- }
472
- /** Update a job's children_ids blob and parent_id */
473
- updateJobChildrenIds(jobId, childrenIds) {
474
- this.flushIfBuffered(jobId);
475
- this.safeWrite(() => {
476
- this.db
477
- .prepare('UPDATE jobs SET children_ids = ? WHERE id = ?')
478
- .run(childrenIds.length > 0 ? pack(childrenIds) : null, jobId);
479
- });
480
- }
481
- /** Persist both sides of a legacy parent link in one SQLite transaction. */
482
- updateFlowLink(child, parent, parentState) {
483
- this.flushIfBuffered(child.id);
484
- this.flushIfBuffered(parent.id);
485
- this.safeWrite(() => {
486
- const tx = this.db.transaction(() => {
487
- this.db
488
- .prepare('UPDATE jobs SET parent_id = ?, data = ? WHERE id = ?')
489
- .run(child.parentId, pack(child.data), child.id);
490
- this.db
491
- .prepare('UPDATE jobs SET children_ids = ?, depends_on = ?, data = ?, state = ? WHERE id = ?')
492
- .run(parent.childrenIds.length > 0 ? pack(parent.childrenIds) : null, parent.dependsOn.length > 0 ? pack(parent.dependsOn) : null, pack(parent.data), parentState, parent.id);
493
- });
494
- tx();
495
- });
496
- }
497
- /**
498
- * Persist a legacy SDK parent-id backpatch without changing parent state.
499
- *
500
- * A fast child can finish before the SDK sends UpdateParent. Completed jobs
501
- * remain in `jobs`, while failed jobs live only in the serialized DLQ entry.
502
- * The failure outbox is re-keyed in the same transaction so a crash between
503
- * this write and in-memory propagation still targets the real parent.
504
- */
505
- backpatchFlowChild(child, previousParentId) {
506
- this.flushIfBuffered(child.id);
507
- this.safeWrite(() => {
508
- const tx = this.db.transaction(() => {
509
- let persisted = this.db
510
- .prepare('UPDATE jobs SET parent_id = ?, data = ? WHERE id = ?')
511
- .run(child.parentId, pack(child.data), child.id).changes > 0;
512
- const dlqRows = this.db
513
- .query('SELECT id, entry FROM dlq WHERE job_id = ?')
514
- .all(String(child.id));
515
- for (const row of dlqRows) {
516
- const entry = unpack(row.entry, null, `backpatchFlowChild:${String(child.id)}`);
517
- if (!entry?.job)
518
- continue;
519
- const updated = {
520
- ...entry,
521
- job: { ...entry.job, parentId: child.parentId, data: child.data },
522
- };
523
- this.db.prepare('UPDATE dlq SET entry = ? WHERE id = ?').run(pack(updated), row.id);
524
- persisted = true;
525
- }
526
- if (!persisted) {
527
- throw new Error(`Flow child is no longer persisted: ${String(child.id)}`);
528
- }
529
- if (previousParentId && child.parentId && previousParentId !== child.parentId) {
530
- const failure = this.db
531
- .query(`SELECT child_queue, mode, error, created_at
532
- FROM flow_failures
533
- WHERE parent_id = ? AND child_id = ?`)
534
- .get(String(previousParentId), String(child.id));
535
- if (failure) {
536
- this.db
537
- .prepare(`INSERT INTO flow_failures
538
- (parent_id, child_id, child_queue, mode, error, created_at)
539
- VALUES (?, ?, ?, ?, ?, ?)
540
- ON CONFLICT(parent_id, child_id) DO UPDATE SET
541
- child_queue=excluded.child_queue, mode=excluded.mode,
542
- error=excluded.error, created_at=excluded.created_at`)
543
- .run(child.parentId, child.id, failure.child_queue, failure.mode, failure.error, failure.created_at);
544
- this.db
545
- .prepare('DELETE FROM flow_failures WHERE parent_id = ? AND child_id = ?')
546
- .run(previousParentId, child.id);
547
- }
548
- }
549
- });
550
- tx();
551
- });
552
- }
553
- /** Persist both sides of a removed parent/child relationship atomically. */
554
- removeFlowLink(child, parent, parentState) {
555
- this.flushIfBuffered(child.id);
556
- this.flushIfBuffered(parent.id);
557
- this.safeWrite(() => {
558
- const tx = this.db.transaction(() => {
559
- this.db
560
- .prepare('UPDATE jobs SET parent_id = ?, data = ? WHERE id = ?')
561
- .run(child.parentId, pack(child.data), child.id);
562
- this.db
563
- .prepare(`UPDATE jobs
564
- SET children_ids = ?, depends_on = ?, data = ?, run_at = ?, state = ?
565
- WHERE id = ?`)
566
- .run(parent.childrenIds.length > 0 ? pack(parent.childrenIds) : null, parent.dependsOn.length > 0 ? pack(parent.dependsOn) : null, pack(parent.data), parent.runAt, parentState, parent.id);
567
- this.db
568
- .prepare('DELETE FROM flow_failures WHERE parent_id = ? AND child_id = ?')
569
- .run(parent.id, child.id);
570
- });
571
- tx();
572
- });
573
- }
574
- /** Record terminal child propagation before applying its parent-side effect. */
575
- saveFlowFailure(record) {
576
- this.safeWrite(() => {
577
- this.db
578
- .prepare(`INSERT INTO flow_failures
579
- (parent_id, child_id, child_queue, mode, error, created_at)
580
- VALUES (?, ?, ?, ?, ?, ?)
581
- ON CONFLICT(parent_id, child_id) DO UPDATE SET
582
- child_queue=excluded.child_queue, mode=excluded.mode,
583
- error=excluded.error, created_at=excluded.created_at`)
584
- .run(record.parentId, record.childId, record.childQueue, record.mode, record.error, record.createdAt);
585
- });
586
- }
587
- loadFlowFailures() {
588
- const rows = this.db
589
- .query('SELECT * FROM flow_failures ORDER BY created_at, parent_id, child_id')
590
- .all();
591
- return rows.map((row) => ({
592
- parentId: row.parent_id,
593
- childId: row.child_id,
594
- childQueue: row.child_queue,
595
- mode: row.mode,
596
- error: row.error,
597
- createdAt: row.created_at,
598
- }));
599
- }
600
- deleteFlowFailure(parentId, childId) {
601
- this.safeWrite(() => {
602
- if (childId) {
603
- this.db
604
- .prepare('DELETE FROM flow_failures WHERE parent_id = ? AND child_id = ?')
605
- .run(parentId, childId);
606
- }
607
- else {
608
- this.db.prepare('DELETE FROM flow_failures WHERE parent_id = ?').run(parentId);
609
- }
610
- });
611
- }
612
- /** Persist dependency removal/promotion as one parent-side recovery checkpoint. */
613
- updateFlowParentResolution(job, stateOverride) {
614
- this.flushIfBuffered(job.id);
615
- const state = stateOverride ??
616
- (job.dependsOn.length > 0
617
- ? 'waiting-children'
618
- : job.runAt > Date.now()
619
- ? 'delayed'
620
- : job.priority > 0
621
- ? 'prioritized'
622
- : 'waiting');
623
- this.safeWrite(() => {
624
- this.db
625
- .prepare('UPDATE jobs SET depends_on = ?, run_at = ?, state = ?, timeline = ? WHERE id = ?')
626
- .run(job.dependsOn.length > 0 ? pack(job.dependsOn) : null, job.runAt, state, job.timeline.length > 0 ? pack(job.timeline) : null, job.id);
627
- });
628
- }
629
- getJob(id) {
630
- const row = this.statements.get('getJob').get(id);
631
- return row ? rowToJob(row) : null;
632
- }
633
- storeResult(jobId, result) {
634
- this.safeWrite(() => {
635
- this.statements.get('insertResult').run(jobId, pack(result), Date.now());
636
- });
637
- }
638
- getResult(jobId) {
639
- const row = this.statements.get('getResult').get(jobId);
640
- return row ? unpack(row.result, null, `getResult:${jobId}`) : null;
641
- }
642
- /** Check if a job result exists (for dependency checking during recovery) */
643
- hasResult(jobId) {
644
- const row = this.db
645
- .query('SELECT job_id FROM job_results WHERE job_id = ?')
646
- .get(String(jobId));
647
- return row !== null;
648
- }
649
- /** Check if a job has a DLQ entry (used for state/job fallback after restart) */
650
- hasDlqEntry(jobId) {
651
- const row = this.db
652
- .query('SELECT job_id FROM dlq WHERE job_id = ? LIMIT 1')
653
- .get(String(jobId));
654
- return row !== null;
655
- }
656
- /** Get latest DLQ entry for a job (used for getJob fallback after restart) */
657
- getDlqEntry(jobId) {
658
- const row = this.db
659
- .query('SELECT entry FROM dlq WHERE job_id = ? ORDER BY entered_at DESC LIMIT 1')
660
- .get(String(jobId));
661
- if (!row)
662
- return null;
663
- const entry = unpack(row.entry, null, `getDlqEntry:${String(jobId)}`);
664
- return entry?.job ? reconstructDlqEntry(entry) : null;
665
- }
666
- /** Load all DLQ job IDs (used by recovery to skip stale active rows) */
667
- loadDlqJobIds() {
668
- const rows = this.db.query('SELECT job_id FROM dlq').all();
669
- return new Set(rows.map((r) => r.job_id));
670
- }
671
- /** Get the persisted `state` column for a job. Returns null if the row is missing. */
672
- getJobStateRaw(jobId) {
673
- const row = this.db
674
- .query('SELECT state FROM jobs WHERE id = ?')
675
- .get(String(jobId));
676
- return row?.state ?? null;
677
- }
678
- /** Load all completed job IDs (for dependency recovery) */
679
- loadCompletedJobIds() {
680
- // `jobs.state` is the completion authority. A result row can exist while its
681
- // job is still active if a process dies between the two legacy writes, so it
682
- // must never release a dependency by itself.
683
- const ids = new Set();
684
- const stateRows = this.db
685
- .query("SELECT id FROM jobs WHERE state = 'completed'")
686
- .all();
687
- for (const r of stateRows)
688
- ids.add(r.id);
689
- for (const record of this.dependencyCompletionStore.load())
690
- ids.add(record.jobId);
691
- return ids;
692
- }
693
- /** Atomically replace a removed completed job with payload-free dependency evidence. */
694
- commitRemovedCompletion(job, retentionLimit, pinned, completedAt = Date.now()) {
695
- this.writeBuffer.removePending(job.id);
696
- this.safeWrite(() => {
697
- this.dependencyCompletionStore.commit({ jobId: job.id, queue: job.queue, completedAt, pinned }, retentionLimit);
698
- });
699
- }
700
- loadDependencyCompletions() {
701
- return this.dependencyCompletionStore.load();
702
- }
703
- pinDependencyCompletions(jobIds) {
704
- this.safeWrite(() => {
705
- this.dependencyCompletionStore.pin(jobIds);
706
- });
707
- }
708
- unpinDependencyCompletions(jobIds, retentionLimit) {
709
- let records = [];
710
- this.safeWrite(() => {
711
- records = this.dependencyCompletionStore.unpin(jobIds, retentionLimit);
712
- });
713
- return records;
714
- }
715
- reconcileDependencyCompletionPins(referenced, retentionLimit) {
716
- let records = [];
717
- this.safeWrite(() => {
718
- records = this.dependencyCompletionStore.reconcilePins(referenced, retentionLimit);
719
- });
720
- return records;
721
- }
722
- deleteDependencyCompletion(jobId) {
723
- let deleted = false;
724
- this.safeWrite(() => {
725
- deleted = this.dependencyCompletionStore.delete(jobId);
726
- });
727
- return deleted;
728
- }
729
- deleteDependencyCompletionsForQueue(queue) {
730
- let deleted = [];
731
- this.safeWrite(() => {
732
- deleted = this.dependencyCompletionStore.deleteForQueue(queue);
733
- });
734
- return deleted;
735
- }
736
- // ============ Bulk Operations ============
737
- /**
738
- * Insert batch of jobs. By default the jobs go through the write buffer.
739
- * When `durable` is true they bypass the buffer and are written to disk
740
- * immediately (matching single-push durable semantics) — used for addBulk
741
- * jobs flagged `durable: true`.
742
- */
743
- insertJobsBatch(jobs, durable) {
744
- if (durable) {
745
- // Atomic immediate write: every row hits disk in ONE transaction, so a
746
- // mid-batch failure rolls back the whole batch (no partial on-disk state)
747
- // — bypassing the write buffer to honor the durable contract.
748
- this.safeWrite(() => {
749
- const tx = this.db.transaction((batch) => {
750
- for (const job of batch)
751
- this.runInsertJobStmt(job);
752
- });
753
- tx(jobs);
754
- });
755
- return;
756
- }
757
- this.writeBuffer.addBatch(jobs);
758
- }
759
- // ============ Query Operations ============
760
- /**
761
- * Query jobs by queue with optional state filter and pagination.
762
- * This is the raw persisted-state query. Logical waiting/prioritized/delayed
763
- * views should use queryJobsByLogicalStates().
764
- */
765
- queryJobs(queue, options) {
766
- const order = options.asc ? 'ASC' : 'DESC';
767
- let rows;
768
- if (options.states && options.states.length > 0) {
769
- const placeholders = options.states.map(() => '?').join(',');
770
- rows = this.db
771
- .query(`SELECT * FROM jobs WHERE queue = ? AND state IN (${placeholders}) ORDER BY created_at ${order}, id ${order} LIMIT ? OFFSET ?`)
772
- .all(queue, ...options.states, options.limit, options.offset);
773
- }
774
- else if (options.state) {
775
- rows = this.db
776
- .query(`SELECT * FROM jobs WHERE queue = ? AND state = ? ORDER BY created_at ${order}, id ${order} LIMIT ? OFFSET ?`)
777
- .all(queue, options.state, options.limit, options.offset);
778
- }
779
- else {
780
- rows = this.db
781
- .query(`SELECT * FROM jobs WHERE queue = ? ORDER BY created_at ${order}, id ${order} LIMIT ? OFFSET ?`)
782
- .all(queue, options.limit, options.offset);
783
- }
784
- return rows.map((row) => rowToJob(row));
785
- }
786
- /**
787
- * Query public/logical job states before applying pagination.
788
- *
789
- * SQLite persists pending jobs as waiting/delayed, while the public state is
790
- * time-dependent: a delayed row becomes waiting or prioritized once run_at
791
- * is reached. Keeping these predicates in SQL makes OFFSET count the logical
792
- * result rather than the unfiltered persisted rows.
793
- */
794
- queryJobsByLogicalStates(queue, states, options) {
795
- const uniqueStates = Array.from(new Set(states));
796
- if (uniqueStates.length === 0)
797
- return [];
798
- const predicates = [];
799
- const predicateParams = [];
800
- const requested = new Set(uniqueStates);
801
- if (requested.has('waiting')) {
802
- predicates.push("(state IN ('waiting', 'prioritized', 'delayed') AND run_at <= ? AND priority <= 0)");
803
- predicateParams.push(options.now);
804
- }
805
- if (requested.has('prioritized')) {
806
- predicates.push("(state IN ('waiting', 'prioritized', 'delayed') AND run_at <= ? AND priority > 0)");
807
- predicateParams.push(options.now);
808
- }
809
- if (requested.has('delayed')) {
810
- predicates.push("(state IN ('waiting', 'prioritized', 'delayed') AND run_at > ?)");
811
- predicateParams.push(options.now);
812
- }
813
- const persistedStates = uniqueStates.filter((state) => state !== 'waiting' && state !== 'prioritized' && state !== 'delayed');
814
- if (persistedStates.length > 0) {
815
- predicates.push(`state IN (${persistedStates.map(() => '?').join(',')})`);
816
- predicateParams.push(...persistedStates);
817
- }
818
- const order = options.asc ? 'ASC' : 'DESC';
819
- const rows = this.db
820
- .query(`SELECT * FROM jobs INDEXED BY idx_jobs_queue_created
821
- WHERE queue = ? AND (${predicates.join(' OR ')})
822
- ORDER BY created_at ${order}, id ${order}
823
- LIMIT ? OFFSET ?`)
824
- .all(queue, ...predicateParams, options.limit, options.offset);
825
- return rows.map((row) => rowToJob(row));
826
- }
827
- /**
828
- * Load pending jobs with pagination for efficient recovery.
829
- * Orders by priority (desc), run_at (asc), and id (asc) so page boundaries
830
- * remain deterministic when scheduling fields compare equal.
831
- * @param limit Max jobs to return (default: 10000)
832
- * @param offset Skip first N jobs (default: 0)
833
- */
834
- loadPendingJobs(limit = 10000, offset = 0) {
835
- const rows = this.db
836
- .query("SELECT * FROM jobs WHERE state IN ('waiting', 'prioritized', 'waiting-children', 'delayed') ORDER BY priority DESC, run_at ASC, id ASC LIMIT ? OFFSET ?")
837
- .all(limit, offset);
838
- return rows.map((row) => rowToJob(row));
839
- }
840
- /**
841
- * Load active jobs with pagination.
842
- * @param limit Max jobs to return (default: 10000)
843
- * @param offset Skip first N jobs (default: 0)
844
- */
845
- loadActiveJobs(limit = 10000, offset = 0) {
846
- const rows = this.db
847
- .query("SELECT * FROM jobs WHERE state = 'active' ORDER BY started_at ASC LIMIT ? OFFSET ?")
848
- .all(limit, offset);
849
- return rows.map((row) => rowToJob(row));
850
- }
851
- /**
852
- * Load completed jobs with pagination.
853
- * Uses job_results join to get only jobs that were successfully completed.
854
- * @param limit Max jobs to return (default: 10000)
855
- * @param offset Skip first N jobs (default: 0)
856
- */
857
- loadCompletedJobs(limit = 10000, offset = 0) {
858
- const rows = this.db
859
- .query("SELECT * FROM jobs WHERE state = 'completed' ORDER BY completed_at DESC LIMIT ? OFFSET ?")
860
- .all(limit, offset);
861
- return rows.map((row) => rowToJob(row));
862
- }
863
- /**
864
- * Count pending jobs (for pagination)
865
- */
866
- countPendingJobs() {
867
- const result = this.db
868
- .query("SELECT COUNT(*) as count FROM jobs WHERE state IN ('waiting', 'prioritized', 'waiting-children', 'delayed')")
869
- .get();
870
- return result?.count ?? 0;
871
- }
872
- /**
873
- * Count active jobs (for pagination)
874
- */
875
- countActiveJobs() {
876
- const result = this.db
877
- .query("SELECT COUNT(*) as count FROM jobs WHERE state = 'active'")
878
- .get();
879
- return result?.count ?? 0;
880
- }
881
- // ============ Cron Operations ============
882
- saveCron(cron) {
883
- this.safeWrite(() => {
884
- this.statements
885
- .get('insertCron')
886
- .run(cron.name, cron.queue, pack(cron.data), cron.schedule, cron.repeatEvery, cron.priority, cron.nextRun, cron.executions, cron.maxLimit, cron.timezone, cron.uniqueKey, cron.dedup ? pack(cron.dedup) : null, cron.skipMissedOnRestart ? 1 : 0, cron.skipIfNoWorker ? 1 : 0, cron.preventOverlap ? 1 : 0, cron.jobOptions ? pack(cron.jobOptions) : null);
887
- });
888
- }
889
- loadCronJobs() {
890
- const rows = this.db.query('SELECT * FROM cron_jobs').all();
891
- return rows.map((row) => ({
892
- name: row.name,
893
- queue: row.queue,
894
- data: unpack(row.data, {}, `loadCronJobs:${row.name}`),
895
- schedule: row.schedule,
896
- repeatEvery: row.repeat_every,
897
- priority: row.priority,
898
- timezone: row.timezone,
899
- nextRun: row.next_run,
900
- executions: row.executions,
901
- maxLimit: row.max_limit,
902
- uniqueKey: row.unique_key ?? null,
903
- dedup: row.dedup
904
- ? unpack(row.dedup, null, `loadCronDedup:${row.name}`)
905
- : null,
906
- skipMissedOnRestart: row.skip_missed_on_restart === 1,
907
- skipIfNoWorker: row.skip_if_no_worker === 1,
908
- preventOverlap: row.prevent_overlap === 1,
909
- jobOptions: row.job_options
910
- ? unpack(row.job_options, null, `loadCronJobOptions:${row.name}`)
911
- : null,
912
- }));
913
- }
914
- deleteCron(name) {
915
- this.safeWrite(() => {
916
- this.db.prepare('DELETE FROM cron_jobs WHERE name = ?').run(name);
917
- });
918
- }
919
- /** Update cron job execution state (executions count and next run time) */
920
- updateCron(name, executions, nextRun) {
921
- this.safeWrite(() => {
922
- this.statements.get('updateCron').run(executions, nextRun, name);
923
- });
924
- }
925
- // ============ Queue Control-State (#100) ============
926
- /**
927
- * Persist a queue's control-state (paused / rate-limit / concurrency) so it
928
- * survives a server restart. Write-through on every pause/resume/limit change.
929
- */
930
- saveQueueState(name, state) {
931
- this.safeWrite(() => {
932
- this.statements
933
- .get('upsertQueueState')
934
- .run(name, state.paused ? 1 : 0, state.rateLimit, state.concurrencyLimit, state.rateLimitDuration ?? null, state.rateLimitExpiresAt ?? null, state.stallConfig === null || state.stallConfig === undefined
935
- ? null
936
- : state.stallConfig.enabled
937
- ? 1
938
- : 0, state.stallConfig?.stallInterval ?? null, state.stallConfig?.maxStalls ?? null, state.stallConfig?.gracePeriod ?? null, state.dlqConfig ? pack(state.dlqConfig) : null);
939
- });
940
- }
941
- /** Load all persisted queue control-state rows (used by recover() on boot). */
942
- loadQueueState() {
943
- const rows = this.statements.get('loadQueueState').all();
944
- return rows.map((row) => ({
945
- name: row.name,
946
- paused: row.paused === 1,
947
- rateLimit: row.rate_limit,
948
- concurrencyLimit: row.concurrency_limit,
949
- rateLimitDuration: row.rate_limit_duration ?? null,
950
- rateLimitExpiresAt: row.rate_limit_expires_at ?? null,
951
- stallConfig: row.stall_enabled === null ||
952
- row.stall_interval === null ||
953
- row.max_stalls === null ||
954
- row.stall_grace_period === null
955
- ? null
956
- : {
957
- enabled: row.stall_enabled === 1,
958
- stallInterval: row.stall_interval,
959
- maxStalls: row.max_stalls,
960
- gracePeriod: row.stall_grace_period,
961
- },
962
- dlqConfig: unpack(row.dlq_config, null, `loadQueueDlqConfig:${row.name}`),
963
- }));
964
- }
965
- /** Drop a queue's persisted control-state (e.g. on obliterate). */
966
- deleteQueueState(name) {
967
- this.safeWrite(() => {
968
- this.statements.get('deleteQueueState').run(name);
969
- });
970
- }
971
- // ============ Utilities ============
972
- close() {
973
- this.writeBuffer.stop();
974
- try {
975
- this.writeBuffer.flush();
976
- }
977
- catch (err) {
978
- storageLog.error('Failed to flush write buffer on close', {
979
- bufferedJobs: this.writeBuffer.pendingCount,
980
- error: err instanceof Error ? err.message : String(err),
981
- });
982
- }
983
- // WAL checkpoint before close to prevent stale locks on restart
984
- try {
985
- this.db.run('PRAGMA wal_checkpoint(TRUNCATE)');
986
- }
987
- catch (err) {
988
- storageLog.error('WAL checkpoint failed on close', {
989
- error: err instanceof Error ? err.message : String(err),
990
- });
991
- }
992
- this.db.close();
993
- }
994
- getSize() {
995
- const file = Bun.file(this.db.filename);
996
- return file.size;
997
- }
1
+ import { SqliteLifecycle } from './sqlite/lifecycle';
2
+ /** SQLite persistence façade. Implementation is split by responsibility. */
3
+ export class SqliteStorage extends SqliteLifecycle {
998
4
  }