bunqueue 2.8.60 → 2.9.2

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 (427) hide show
  1. package/README.md +114 -78
  2. package/dist/application/background/dlq.js +2 -0
  3. package/dist/application/background/recovery/active.d.ts +1 -0
  4. package/dist/application/background/recovery/active.js +12 -0
  5. package/dist/application/background/recovery/index.js +3 -1
  6. package/dist/application/background/recovery/pending.js +1 -0
  7. package/dist/application/cleanupTasks.js +4 -16
  8. package/dist/application/contextFactory.js +8 -0
  9. package/dist/application/dlqManager.d.ts +10 -0
  10. package/dist/application/dlqManager.js +48 -9
  11. package/dist/application/dlqRetry.js +60 -38
  12. package/dist/application/eventsManager.d.ts +9 -2
  13. package/dist/application/eventsManager.js +106 -55
  14. package/dist/application/operations/ackHelpers.d.ts +1 -4
  15. package/dist/application/operations/ackHelpers.js +39 -14
  16. package/dist/application/operations/flowPush.js +1 -0
  17. package/dist/application/operations/flowValidation.js +4 -4
  18. package/dist/application/operations/jobManagement.d.ts +4 -0
  19. package/dist/application/operations/jobMoveOperations.js +9 -4
  20. package/dist/application/operations/pull.d.ts +7 -2
  21. package/dist/application/operations/pull.js +15 -57
  22. package/dist/application/operations/pullFinalization.d.ts +6 -0
  23. package/dist/application/operations/pullFinalization.js +69 -0
  24. package/dist/application/operations/pullStateTransition.d.ts +8 -7
  25. package/dist/application/operations/pullStateTransition.js +25 -18
  26. package/dist/application/operations/push.js +3 -0
  27. package/dist/application/operations/pushBatch.js +14 -7
  28. package/dist/application/operations/pushContext.d.ts +2 -1
  29. package/dist/application/postgres-queue-manager/batchSnapshot.d.ts +16 -0
  30. package/dist/application/postgres-queue-manager/batchSnapshot.js +17 -0
  31. package/dist/application/postgres-queue-manager/cloud.d.ts +30 -0
  32. package/dist/application/postgres-queue-manager/cloud.js +55 -0
  33. package/dist/application/postgres-queue-manager/config.d.ts +5 -0
  34. package/dist/application/postgres-queue-manager/config.js +1 -0
  35. package/dist/application/postgres-queue-manager/control.d.ts +30 -0
  36. package/dist/application/postgres-queue-manager/control.js +210 -0
  37. package/dist/application/postgres-queue-manager/deferredWrites.d.ts +13 -0
  38. package/dist/application/postgres-queue-manager/deferredWrites.js +60 -0
  39. package/dist/application/postgres-queue-manager/delivery.d.ts +20 -0
  40. package/dist/application/postgres-queue-manager/delivery.js +83 -0
  41. package/dist/application/postgres-queue-manager/groupQueries.d.ts +10 -0
  42. package/dist/application/postgres-queue-manager/groupQueries.js +40 -0
  43. package/dist/application/postgres-queue-manager/lease.d.ts +13 -0
  44. package/dist/application/postgres-queue-manager/lease.js +88 -0
  45. package/dist/application/postgres-queue-manager/lifetimeMetrics.d.ts +32 -0
  46. package/dist/application/postgres-queue-manager/lifetimeMetrics.js +53 -0
  47. package/dist/application/postgres-queue-manager/maintenance.d.ts +14 -0
  48. package/dist/application/postgres-queue-manager/maintenance.js +100 -0
  49. package/dist/application/postgres-queue-manager/operationGate.d.ts +26 -0
  50. package/dist/application/postgres-queue-manager/operationGate.js +96 -0
  51. package/dist/application/postgres-queue-manager/operations.d.ts +25 -0
  52. package/dist/application/postgres-queue-manager/operations.js +194 -0
  53. package/dist/application/postgres-queue-manager/projectionRefreshes.d.ts +43 -0
  54. package/dist/application/postgres-queue-manager/projectionRefreshes.js +170 -0
  55. package/dist/application/postgres-queue-manager/queries.d.ts +142 -0
  56. package/dist/application/postgres-queue-manager/queries.js +231 -0
  57. package/dist/application/postgres-queue-manager/relationships.d.ts +10 -0
  58. package/dist/application/postgres-queue-manager/relationships.js +45 -0
  59. package/dist/application/postgres-queue-manager/services.d.ts +31 -0
  60. package/dist/application/postgres-queue-manager/services.js +149 -0
  61. package/dist/application/postgres-queue-manager/snapshot.d.ts +51 -0
  62. package/dist/application/postgres-queue-manager/snapshot.js +236 -0
  63. package/dist/application/postgres-queue-manager/snapshotViews.d.ts +15 -0
  64. package/dist/application/postgres-queue-manager/snapshotViews.js +100 -0
  65. package/dist/application/postgres-queue-manager/startupEventBuffer.d.ts +12 -0
  66. package/dist/application/postgres-queue-manager/startupEventBuffer.js +36 -0
  67. package/dist/application/postgres-queue-manager/state.d.ts +47 -0
  68. package/dist/application/postgres-queue-manager/state.js +273 -0
  69. package/dist/application/postgres-queue-manager/terminalDelivery.d.ts +20 -0
  70. package/dist/application/postgres-queue-manager/terminalDelivery.js +100 -0
  71. package/dist/application/postgresQueueManager.d.ts +2 -0
  72. package/dist/application/postgresQueueManager.js +1 -0
  73. package/dist/application/queue-manager/control.js +1 -0
  74. package/dist/application/queue-manager/delivery.d.ts +5 -4
  75. package/dist/application/queue-manager/delivery.js +15 -8
  76. package/dist/application/queue-manager/flow-failures.js +4 -0
  77. package/dist/application/queue-manager/limits.d.ts +13 -0
  78. package/dist/application/queue-manager/limits.js +65 -0
  79. package/dist/application/queue-manager/observability.js +15 -3
  80. package/dist/application/queue-manager/queries.d.ts +7 -0
  81. package/dist/application/queue-manager/queries.js +9 -0
  82. package/dist/application/queue-manager/services.d.ts +1 -1
  83. package/dist/application/queue-manager/services.js +4 -2
  84. package/dist/application/queue-manager/state.js +17 -2
  85. package/dist/application/queueTelemetryJournal.d.ts +2 -0
  86. package/dist/application/queueTelemetryJournal.js +23 -0
  87. package/dist/application/types/ack.d.ts +3 -1
  88. package/dist/cli/commandRouter.d.ts +1 -1
  89. package/dist/cli/commands/server.js +1 -1
  90. package/dist/client/flowPush.js +6 -0
  91. package/dist/client/forwarder.d.ts +6 -4
  92. package/dist/client/forwarder.js +5 -3
  93. package/dist/client/groupId.d.ts +1 -0
  94. package/dist/client/groupId.js +1 -0
  95. package/dist/client/index.d.ts +1 -1
  96. package/dist/client/jobHelpers.js +1 -0
  97. package/dist/client/queue/dlq.d.ts +2 -0
  98. package/dist/client/queue/dlq.js +14 -0
  99. package/dist/client/queue/dlqOps.d.ts +2 -0
  100. package/dist/client/queue/dlqOps.js +4 -0
  101. package/dist/client/queue/helpers.js +2 -0
  102. package/dist/client/queue/operations/add/bulk.js +4 -4
  103. package/dist/client/queue/operations/add/payload.d.ts +1 -0
  104. package/dist/client/queue/operations/add/payload.js +7 -1
  105. package/dist/client/queue/operations/add/single.js +3 -3
  106. package/dist/client/queue/operations/groups.d.ts +21 -0
  107. package/dist/client/queue/operations/groups.js +88 -0
  108. package/dist/client/queue/runtime/configuration.d.ts +4 -0
  109. package/dist/client/queue/runtime/configuration.js +8 -0
  110. package/dist/client/queue/runtime/queries.d.ts +13 -0
  111. package/dist/client/queue/runtime/queries.js +31 -0
  112. package/dist/client/queue/runtime/state.d.ts +4 -0
  113. package/dist/client/queue/runtime/state.js +1 -0
  114. package/dist/client/types/index.d.ts +2 -2
  115. package/dist/client/types/options.d.ts +4 -0
  116. package/dist/client/types/worker.d.ts +8 -0
  117. package/dist/client/worker/runtime/execution.js +4 -8
  118. package/dist/client/worker/runtime/options.js +3 -0
  119. package/dist/client/worker/runtime/polling.d.ts +1 -0
  120. package/dist/client/worker/runtime/polling.js +9 -0
  121. package/dist/client/worker/types/options.d.ts +2 -1
  122. package/dist/client/worker/workerPull.d.ts +2 -0
  123. package/dist/client/worker/workerPull.js +6 -4
  124. package/dist/config/resolve.d.ts +14 -0
  125. package/dist/config/resolve.js +50 -5
  126. package/dist/config/types.d.ts +18 -0
  127. package/dist/domain/job/groupFifoOrder.d.ts +9 -0
  128. package/dist/domain/job/groupFifoOrder.js +26 -0
  129. package/dist/domain/queue/dlqShard.d.ts +2 -0
  130. package/dist/domain/queue/dlqShard.js +16 -0
  131. package/dist/domain/queue/groupLimiterManager.d.ts +23 -0
  132. package/dist/domain/queue/groupLimiterManager.js +107 -0
  133. package/dist/domain/queue/groupScheduler.d.ts +31 -0
  134. package/dist/domain/queue/groupScheduler.js +256 -0
  135. package/dist/domain/queue/groupSchedulerOrder.d.ts +6 -0
  136. package/dist/domain/queue/groupSchedulerOrder.js +30 -0
  137. package/dist/domain/queue/priorityQueue.d.ts +13 -23
  138. package/dist/domain/queue/priorityQueue.js +53 -42
  139. package/dist/domain/queue/shard/dlq.d.ts +1 -0
  140. package/dist/domain/queue/shard/dlq.js +3 -0
  141. package/dist/domain/queue/shard/keys.d.ts +1 -0
  142. package/dist/domain/queue/shard/keys.js +25 -2
  143. package/dist/domain/queue/shard/lifecycle.js +4 -0
  144. package/dist/domain/queue/shard/limits.d.ts +20 -1
  145. package/dist/domain/queue/shard/limits.js +56 -0
  146. package/dist/domain/queue/shard/state.d.ts +5 -0
  147. package/dist/domain/queue/shard/state.js +9 -1
  148. package/dist/domain/types/commands/core.d.ts +3 -0
  149. package/dist/domain/types/commands/dlq.d.ts +5 -0
  150. package/dist/domain/types/commands/limits.d.ts +41 -0
  151. package/dist/domain/types/commands/union.d.ts +1 -1
  152. package/dist/domain/types/cron.d.ts +5 -0
  153. package/dist/domain/types/cron.js +14 -3
  154. package/dist/domain/types/dlq.d.ts +1 -1
  155. package/dist/domain/types/dlq.js +1 -2
  156. package/dist/domain/types/group.d.ts +21 -0
  157. package/dist/domain/types/group.js +78 -0
  158. package/dist/domain/types/jobs/model.d.ts +1 -1
  159. package/dist/domain/types/priorityQueue.d.ts +1 -0
  160. package/dist/infrastructure/cloud/commandHandler.js +5 -3
  161. package/dist/infrastructure/cloud/commands/integrations.js +11 -11
  162. package/dist/infrastructure/cloud/commands/jobs.js +48 -40
  163. package/dist/infrastructure/cloud/commands/queues.js +61 -75
  164. package/dist/infrastructure/cloud/queueAdapter/local.d.ts +41 -0
  165. package/dist/infrastructure/cloud/queueAdapter/local.js +187 -0
  166. package/dist/infrastructure/cloud/queueAdapter/postgres.d.ts +42 -0
  167. package/dist/infrastructure/cloud/queueAdapter/postgres.js +188 -0
  168. package/dist/infrastructure/cloud/queueAdapter/registry.d.ts +4 -0
  169. package/dist/infrastructure/cloud/queueAdapter/registry.js +15 -0
  170. package/dist/infrastructure/cloud/queueAdapter/types.d.ts +87 -0
  171. package/dist/infrastructure/cloud/queueAdapter/types.js +1 -0
  172. package/dist/infrastructure/cloud/snapshot/analytics.d.ts +2 -0
  173. package/dist/infrastructure/cloud/snapshot/analytics.js +7 -0
  174. package/dist/infrastructure/cloud/snapshot/collector.d.ts +4 -0
  175. package/dist/infrastructure/cloud/snapshot/collector.js +39 -1
  176. package/dist/infrastructure/cloud/snapshot/config.d.ts +3 -0
  177. package/dist/infrastructure/cloud/snapshot/config.js +43 -0
  178. package/dist/infrastructure/cloud/snapshot/jobs.d.ts +3 -0
  179. package/dist/infrastructure/cloud/snapshot/jobs.js +32 -1
  180. package/dist/infrastructure/cloud/snapshotCollector.js +20 -35
  181. package/dist/infrastructure/cloud/snapshotHelpers.d.ts +3 -3
  182. package/dist/infrastructure/cloud/snapshotHelpers.js +3 -3
  183. package/dist/infrastructure/cloud/statsRefresh.js +2 -1
  184. package/dist/infrastructure/cloud/types/command.d.ts +2 -2
  185. package/dist/infrastructure/persistence/jobOptionsBlob.d.ts +1 -0
  186. package/dist/infrastructure/persistence/jobOptionsBlob.js +10 -2
  187. package/dist/infrastructure/persistence/migrations.js +11 -0
  188. package/dist/infrastructure/persistence/postgres/admission.d.ts +18 -0
  189. package/dist/infrastructure/persistence/postgres/admission.js +196 -0
  190. package/dist/infrastructure/persistence/postgres/admissionParent.d.ts +5 -0
  191. package/dist/infrastructure/persistence/postgres/admissionParent.js +35 -0
  192. package/dist/infrastructure/persistence/postgres/admissionResult.d.ts +9 -0
  193. package/dist/infrastructure/persistence/postgres/admissionResult.js +1 -0
  194. package/dist/infrastructure/persistence/postgres/admissionStore.d.ts +12 -0
  195. package/dist/infrastructure/persistence/postgres/admissionStore.js +101 -0
  196. package/dist/infrastructure/persistence/postgres/advisoryLocks.d.ts +2 -0
  197. package/dist/infrastructure/persistence/postgres/advisoryLocks.js +13 -0
  198. package/dist/infrastructure/persistence/postgres/batchAdmission.d.ts +11 -0
  199. package/dist/infrastructure/persistence/postgres/batchAdmission.js +128 -0
  200. package/dist/infrastructure/persistence/postgres/batchCompletion.d.ts +4 -0
  201. package/dist/infrastructure/persistence/postgres/batchCompletion.js +174 -0
  202. package/dist/infrastructure/persistence/postgres/batchEvents.d.ts +14 -0
  203. package/dist/infrastructure/persistence/postgres/batchEvents.js +72 -0
  204. package/dist/infrastructure/persistence/postgres/brokerSessions.d.ts +14 -0
  205. package/dist/infrastructure/persistence/postgres/brokerSessions.js +94 -0
  206. package/dist/infrastructure/persistence/postgres/claimBatch.d.ts +14 -0
  207. package/dist/infrastructure/persistence/postgres/claimBatch.js +69 -0
  208. package/dist/infrastructure/persistence/postgres/claimSelection.d.ts +11 -0
  209. package/dist/infrastructure/persistence/postgres/claimSelection.js +140 -0
  210. package/dist/infrastructure/persistence/postgres/claims.d.ts +10 -0
  211. package/dist/infrastructure/persistence/postgres/claims.js +153 -0
  212. package/dist/infrastructure/persistence/postgres/cloudReadModel.d.ts +26 -0
  213. package/dist/infrastructure/persistence/postgres/cloudReadModel.js +123 -0
  214. package/dist/infrastructure/persistence/postgres/codec.d.ts +30 -0
  215. package/dist/infrastructure/persistence/postgres/codec.js +82 -0
  216. package/dist/infrastructure/persistence/postgres/completionEvents.d.ts +11 -0
  217. package/dist/infrastructure/persistence/postgres/completionEvents.js +21 -0
  218. package/dist/infrastructure/persistence/postgres/completionLifecycle.d.ts +11 -0
  219. package/dist/infrastructure/persistence/postgres/completionLifecycle.js +145 -0
  220. package/dist/infrastructure/persistence/postgres/completionOutcome.d.ts +4 -0
  221. package/dist/infrastructure/persistence/postgres/completionOutcome.js +112 -0
  222. package/dist/infrastructure/persistence/postgres/completionQueries.d.ts +10 -0
  223. package/dist/infrastructure/persistence/postgres/completionQueries.js +87 -0
  224. package/dist/infrastructure/persistence/postgres/connection.d.ts +3 -0
  225. package/dist/infrastructure/persistence/postgres/connection.js +15 -0
  226. package/dist/infrastructure/persistence/postgres/context.d.ts +28 -0
  227. package/dist/infrastructure/persistence/postgres/context.js +74 -0
  228. package/dist/infrastructure/persistence/postgres/control.d.ts +23 -0
  229. package/dist/infrastructure/persistence/postgres/control.js +105 -0
  230. package/dist/infrastructure/persistence/postgres/crons.d.ts +18 -0
  231. package/dist/infrastructure/persistence/postgres/crons.js +205 -0
  232. package/dist/infrastructure/persistence/postgres/deduplication.d.ts +9 -0
  233. package/dist/infrastructure/persistence/postgres/deduplication.js +47 -0
  234. package/dist/infrastructure/persistence/postgres/dependencyDestruction.d.ts +14 -0
  235. package/dist/infrastructure/persistence/postgres/dependencyDestruction.js +74 -0
  236. package/dist/infrastructure/persistence/postgres/dependencyPromotion.d.ts +29 -0
  237. package/dist/infrastructure/persistence/postgres/dependencyPromotion.js +212 -0
  238. package/dist/infrastructure/persistence/postgres/destructiveMutations.d.ts +4 -0
  239. package/dist/infrastructure/persistence/postgres/destructiveMutations.js +111 -0
  240. package/dist/infrastructure/persistence/postgres/dlqLifecycle.d.ts +13 -0
  241. package/dist/infrastructure/persistence/postgres/dlqLifecycle.js +184 -0
  242. package/dist/infrastructure/persistence/postgres/dlqMaintenance.d.ts +6 -0
  243. package/dist/infrastructure/persistence/postgres/dlqMaintenance.js +36 -0
  244. package/dist/infrastructure/persistence/postgres/dlqRetryPlan.d.ts +21 -0
  245. package/dist/infrastructure/persistence/postgres/dlqRetryPlan.js +92 -0
  246. package/dist/infrastructure/persistence/postgres/eventCatchupCursors.d.ts +32 -0
  247. package/dist/infrastructure/persistence/postgres/eventCatchupCursors.js +66 -0
  248. package/dist/infrastructure/persistence/postgres/eventCommitGc.d.ts +27 -0
  249. package/dist/infrastructure/persistence/postgres/eventCommitGc.js +62 -0
  250. package/dist/infrastructure/persistence/postgres/eventJournal.d.ts +18 -0
  251. package/dist/infrastructure/persistence/postgres/eventJournal.js +76 -0
  252. package/dist/infrastructure/persistence/postgres/eventJournalSchema.d.ts +5 -0
  253. package/dist/infrastructure/persistence/postgres/eventJournalSchema.js +267 -0
  254. package/dist/infrastructure/persistence/postgres/eventPruneWatermarks.d.ts +26 -0
  255. package/dist/infrastructure/persistence/postgres/eventPruneWatermarks.js +129 -0
  256. package/dist/infrastructure/persistence/postgres/eventRetention.d.ts +18 -0
  257. package/dist/infrastructure/persistence/postgres/eventRetention.js +76 -0
  258. package/dist/infrastructure/persistence/postgres/events.d.ts +45 -0
  259. package/dist/infrastructure/persistence/postgres/events.js +276 -0
  260. package/dist/infrastructure/persistence/postgres/expiry.d.ts +3 -0
  261. package/dist/infrastructure/persistence/postgres/expiry.js +74 -0
  262. package/dist/infrastructure/persistence/postgres/flowFailures.d.ts +17 -0
  263. package/dist/infrastructure/persistence/postgres/flowFailures.js +199 -0
  264. package/dist/infrastructure/persistence/postgres/groupClaims.d.ts +15 -0
  265. package/dist/infrastructure/persistence/postgres/groupClaims.js +95 -0
  266. package/dist/infrastructure/persistence/postgres/groupSchema.d.ts +2 -0
  267. package/dist/infrastructure/persistence/postgres/groupSchema.js +155 -0
  268. package/dist/infrastructure/persistence/postgres/groupSchemaFingerprint.d.ts +3 -0
  269. package/dist/infrastructure/persistence/postgres/groupSchemaFingerprint.js +127 -0
  270. package/dist/infrastructure/persistence/postgres/groupStateRetention.d.ts +3 -0
  271. package/dist/infrastructure/persistence/postgres/groupStateRetention.js +93 -0
  272. package/dist/infrastructure/persistence/postgres/groups.d.ts +11 -0
  273. package/dist/infrastructure/persistence/postgres/groups.js +117 -0
  274. package/dist/infrastructure/persistence/postgres/jobData.d.ts +3 -0
  275. package/dist/infrastructure/persistence/postgres/jobData.js +32 -0
  276. package/dist/infrastructure/persistence/postgres/leaseRelease.d.ts +9 -0
  277. package/dist/infrastructure/persistence/postgres/leaseRelease.js +120 -0
  278. package/dist/infrastructure/persistence/postgres/leaseRenewal.d.ts +4 -0
  279. package/dist/infrastructure/persistence/postgres/leaseRenewal.js +35 -0
  280. package/dist/infrastructure/persistence/postgres/lifetimeMetrics.d.ts +15 -0
  281. package/dist/infrastructure/persistence/postgres/lifetimeMetrics.js +46 -0
  282. package/dist/infrastructure/persistence/postgres/lifetimeMetricsFinalizer.d.ts +4 -0
  283. package/dist/infrastructure/persistence/postgres/lifetimeMetricsFinalizer.js +13 -0
  284. package/dist/infrastructure/persistence/postgres/logs.d.ts +6 -0
  285. package/dist/infrastructure/persistence/postgres/logs.js +70 -0
  286. package/dist/infrastructure/persistence/postgres/maintenance.d.ts +6 -0
  287. package/dist/infrastructure/persistence/postgres/maintenance.js +138 -0
  288. package/dist/infrastructure/persistence/postgres/maintenanceFlights.d.ts +14 -0
  289. package/dist/infrastructure/persistence/postgres/maintenanceFlights.js +66 -0
  290. package/dist/infrastructure/persistence/postgres/metricWrites.d.ts +9 -0
  291. package/dist/infrastructure/persistence/postgres/metricWrites.js +94 -0
  292. package/dist/infrastructure/persistence/postgres/mutations.d.ts +9 -0
  293. package/dist/infrastructure/persistence/postgres/mutations.js +171 -0
  294. package/dist/infrastructure/persistence/postgres/outcomes.d.ts +4 -0
  295. package/dist/infrastructure/persistence/postgres/outcomes.js +194 -0
  296. package/dist/infrastructure/persistence/postgres/policies.d.ts +11 -0
  297. package/dist/infrastructure/persistence/postgres/policies.js +18 -0
  298. package/dist/infrastructure/persistence/postgres/postCommitMaintenance.d.ts +17 -0
  299. package/dist/infrastructure/persistence/postgres/postCommitMaintenance.js +117 -0
  300. package/dist/infrastructure/persistence/postgres/promotion.d.ts +3 -0
  301. package/dist/infrastructure/persistence/postgres/promotion.js +43 -0
  302. package/dist/infrastructure/persistence/postgres/queries.d.ts +22 -0
  303. package/dist/infrastructure/persistence/postgres/queries.js +152 -0
  304. package/dist/infrastructure/persistence/postgres/queueDestruction.d.ts +3 -0
  305. package/dist/infrastructure/persistence/postgres/queueDestruction.js +158 -0
  306. package/dist/infrastructure/persistence/postgres/queueLifecycle.d.ts +10 -0
  307. package/dist/infrastructure/persistence/postgres/queueLifecycle.js +60 -0
  308. package/dist/infrastructure/persistence/postgres/rateLimit.d.ts +6 -0
  309. package/dist/infrastructure/persistence/postgres/rateLimit.js +10 -0
  310. package/dist/infrastructure/persistence/postgres/readModels.d.ts +32 -0
  311. package/dist/infrastructure/persistence/postgres/readModels.js +72 -0
  312. package/dist/infrastructure/persistence/postgres/recovery.d.ts +3 -0
  313. package/dist/infrastructure/persistence/postgres/recovery.js +178 -0
  314. package/dist/infrastructure/persistence/postgres/relationships.d.ts +9 -0
  315. package/dist/infrastructure/persistence/postgres/relationships.js +201 -0
  316. package/dist/infrastructure/persistence/postgres/removeUnprocessedChildren.d.ts +4 -0
  317. package/dist/infrastructure/persistence/postgres/removeUnprocessedChildren.js +241 -0
  318. package/dist/infrastructure/persistence/postgres/repeatMutations.d.ts +5 -0
  319. package/dist/infrastructure/persistence/postgres/repeatMutations.js +37 -0
  320. package/dist/infrastructure/persistence/postgres/runtime.d.ts +45 -0
  321. package/dist/infrastructure/persistence/postgres/runtime.js +238 -0
  322. package/dist/infrastructure/persistence/postgres/runtimeConfig.d.ts +21 -0
  323. package/dist/infrastructure/persistence/postgres/runtimeConfig.js +39 -0
  324. package/dist/infrastructure/persistence/postgres/schema.d.ts +4 -0
  325. package/dist/infrastructure/persistence/postgres/schema.js +261 -0
  326. package/dist/infrastructure/persistence/postgres/schemaInitialization.d.ts +3 -0
  327. package/dist/infrastructure/persistence/postgres/schemaInitialization.js +226 -0
  328. package/dist/infrastructure/persistence/postgres/serialAdmission.d.ts +6 -0
  329. package/dist/infrastructure/persistence/postgres/serialAdmission.js +96 -0
  330. package/dist/infrastructure/persistence/postgres/snapshotBudget.d.ts +3 -0
  331. package/dist/infrastructure/persistence/postgres/snapshotBudget.js +83 -0
  332. package/dist/infrastructure/persistence/postgres/storageHealth.d.ts +10 -0
  333. package/dist/infrastructure/persistence/postgres/storageHealth.js +29 -0
  334. package/dist/infrastructure/persistence/postgres/store.d.ts +100 -0
  335. package/dist/infrastructure/persistence/postgres/store.js +180 -0
  336. package/dist/infrastructure/persistence/postgres/telemetry.d.ts +8 -0
  337. package/dist/infrastructure/persistence/postgres/telemetry.js +100 -0
  338. package/dist/infrastructure/persistence/postgres/terminal.d.ts +8 -0
  339. package/dist/infrastructure/persistence/postgres/terminal.js +137 -0
  340. package/dist/infrastructure/persistence/postgres/transactionRetry.d.ts +6 -0
  341. package/dist/infrastructure/persistence/postgres/transactionRetry.js +42 -0
  342. package/dist/infrastructure/persistence/postgres/types.d.ts +176 -0
  343. package/dist/infrastructure/persistence/postgres/types.js +1 -0
  344. package/dist/infrastructure/persistence/postgres/workers.d.ts +15 -0
  345. package/dist/infrastructure/persistence/postgres/workers.js +126 -0
  346. package/dist/infrastructure/persistence/postgres.d.ts +2 -0
  347. package/dist/infrastructure/persistence/postgres.js +1 -0
  348. package/dist/infrastructure/persistence/schema.d.ts +2 -2
  349. package/dist/infrastructure/persistence/schema.js +12 -1
  350. package/dist/infrastructure/persistence/sqlite/control.d.ts +14 -0
  351. package/dist/infrastructure/persistence/sqlite/control.js +69 -0
  352. package/dist/infrastructure/persistence/sqlite/jobs.d.ts +12 -0
  353. package/dist/infrastructure/persistence/sqlite/jobs.js +38 -0
  354. package/dist/infrastructure/persistence/sqlite/telemetry.d.ts +2 -1
  355. package/dist/infrastructure/persistence/sqlite/telemetry.js +5 -64
  356. package/dist/infrastructure/persistence/sqlite/telemetryWrites.d.ts +4 -0
  357. package/dist/infrastructure/persistence/sqlite/telemetryWrites.js +123 -0
  358. package/dist/infrastructure/persistence/sqliteSerializer.js +2 -0
  359. package/dist/infrastructure/scheduler/cron/persisted.d.ts +5 -0
  360. package/dist/infrastructure/scheduler/cron/persisted.js +27 -0
  361. package/dist/infrastructure/scheduler/cron/runtime.js +5 -10
  362. package/dist/infrastructure/scheduler/cron/validation.d.ts +3 -0
  363. package/dist/infrastructure/scheduler/cron/validation.js +11 -0
  364. package/dist/infrastructure/scheduler/cronParser.d.ts +1 -1
  365. package/dist/infrastructure/scheduler/cronParser.js +144 -11
  366. package/dist/infrastructure/server/bootstrap.d.ts +2 -3
  367. package/dist/infrastructure/server/bootstrap.js +33 -59
  368. package/dist/infrastructure/server/errors.d.ts +4 -0
  369. package/dist/infrastructure/server/errors.js +54 -0
  370. package/dist/infrastructure/server/handler-routes/control.d.ts +5 -5
  371. package/dist/infrastructure/server/handler-routes/control.js +16 -1
  372. package/dist/infrastructure/server/handler-routes/monitoring.d.ts +2 -2
  373. package/dist/infrastructure/server/handler.js +9 -11
  374. package/dist/infrastructure/server/handlers/advanced/dependencies.js +7 -6
  375. package/dist/infrastructure/server/handlers/advanced/jobs.js +19 -6
  376. package/dist/infrastructure/server/handlers/advanced/queue.d.ts +9 -9
  377. package/dist/infrastructure/server/handlers/advanced/queue.js +91 -27
  378. package/dist/infrastructure/server/handlers/core.d.ts +0 -5
  379. package/dist/infrastructure/server/handlers/core.js +47 -49
  380. package/dist/infrastructure/server/handlers/cron.d.ts +4 -4
  381. package/dist/infrastructure/server/handlers/cron.js +60 -59
  382. package/dist/infrastructure/server/handlers/dashboard.d.ts +1 -1
  383. package/dist/infrastructure/server/handlers/dashboard.js +21 -8
  384. package/dist/infrastructure/server/handlers/dlq.d.ts +6 -3
  385. package/dist/infrastructure/server/handlers/dlq.js +35 -9
  386. package/dist/infrastructure/server/handlers/flow.js +2 -1
  387. package/dist/infrastructure/server/handlers/groups.d.ts +11 -0
  388. package/dist/infrastructure/server/handlers/groups.js +55 -0
  389. package/dist/infrastructure/server/handlers/management.d.ts +5 -5
  390. package/dist/infrastructure/server/handlers/management.js +36 -9
  391. package/dist/infrastructure/server/handlers/monitoring/health.d.ts +5 -5
  392. package/dist/infrastructure/server/handlers/monitoring/health.js +45 -16
  393. package/dist/infrastructure/server/handlers/monitoring/operations.d.ts +1 -1
  394. package/dist/infrastructure/server/handlers/monitoring/operations.js +8 -1
  395. package/dist/infrastructure/server/handlers/monitoring/workers.d.ts +3 -3
  396. package/dist/infrastructure/server/handlers/monitoring/workers.js +31 -7
  397. package/dist/infrastructure/server/handlers/pushBatchValidation.d.ts +3 -1
  398. package/dist/infrastructure/server/handlers/pushBatchValidation.js +56 -8
  399. package/dist/infrastructure/server/handlers/query.d.ts +1 -1
  400. package/dist/infrastructure/server/handlers/query.js +5 -4
  401. package/dist/infrastructure/server/http.js +2 -2
  402. package/dist/infrastructure/server/httpDashboardEndpoints.d.ts +1 -1
  403. package/dist/infrastructure/server/httpDashboardEndpoints.js +19 -6
  404. package/dist/infrastructure/server/httpEndpoints.js +18 -7
  405. package/dist/infrastructure/server/httpRouteQueues.js +11 -1
  406. package/dist/infrastructure/server/protocol/validation.d.ts +1 -0
  407. package/dist/infrastructure/server/protocol/validation.js +1 -0
  408. package/dist/infrastructure/server/protocol.d.ts +1 -1
  409. package/dist/infrastructure/server/protocol.js +1 -1
  410. package/dist/infrastructure/server/shutdownCoordinator.d.ts +24 -0
  411. package/dist/infrastructure/server/shutdownCoordinator.js +106 -0
  412. package/dist/infrastructure/server/sseHandler.js +8 -3
  413. package/dist/infrastructure/server/storageAdapter.d.ts +29 -0
  414. package/dist/infrastructure/server/storageAdapter.js +61 -0
  415. package/dist/infrastructure/server/storageManager.d.ts +12 -0
  416. package/dist/infrastructure/server/storageManager.js +102 -0
  417. package/dist/infrastructure/server/tcp.js +2 -3
  418. package/dist/infrastructure/server/ws/snapshots.d.ts +1 -1
  419. package/dist/infrastructure/server/ws/snapshots.js +19 -4
  420. package/dist/infrastructure/server/wsHandler.js +10 -5
  421. package/dist/main.js +1 -1
  422. package/dist/mcp/backend/embedded/services.js +2 -1
  423. package/dist/mcp/index.d.ts +2 -2
  424. package/dist/mcp/index.js +2 -2
  425. package/dist/shared/storageHealth.d.ts +9 -0
  426. package/dist/shared/storageHealth.js +12 -0
  427. package/package.json +75 -65
@@ -0,0 +1,188 @@
1
+ import { DEFAULT_DLQ_CONFIG } from '../../../domain/types/dlq';
2
+ import { DEFAULT_STALL_CONFIG } from '../../../domain/types/stall';
3
+ const EMPTY_COUNTS = {
4
+ waiting: 0,
5
+ prioritized: 0,
6
+ delayed: 0,
7
+ active: 0,
8
+ completed: 0,
9
+ failed: 0,
10
+ waitingChildren: 0,
11
+ };
12
+ function queueCounts(model) {
13
+ const result = new Map();
14
+ for (const row of model.counts) {
15
+ const counts = result.get(row.queue) ?? { ...EMPTY_COUNTS };
16
+ if (row.state === 'waiting-children')
17
+ counts.waitingChildren = row.count;
18
+ else
19
+ counts[row.state] = row.count;
20
+ result.set(row.queue, counts);
21
+ }
22
+ return result;
23
+ }
24
+ function queueTotals(model) {
25
+ const result = new Map();
26
+ for (const row of model.totals) {
27
+ const totals = result.get(row.queue) ?? { completed: 0n, failed: 0n };
28
+ totals[row.metricType] = row.count;
29
+ result.set(row.queue, totals);
30
+ }
31
+ return result;
32
+ }
33
+ function cloudCounts(counts, totals) {
34
+ return {
35
+ waiting: counts.waiting,
36
+ prioritized: counts.prioritized,
37
+ delayed: counts.delayed,
38
+ active: counts.active,
39
+ completed: counts.completed,
40
+ failed: counts.failed,
41
+ 'waiting-children': counts.waitingChildren,
42
+ totalCompleted: Number(totals.completed),
43
+ totalFailed: Number(totals.failed),
44
+ };
45
+ }
46
+ function defaultQueueState(queue) {
47
+ return {
48
+ queue,
49
+ paused: false,
50
+ rateLimit: null,
51
+ rateDurationMs: null,
52
+ rateWindowStartedAt: null,
53
+ rateExpiresAt: null,
54
+ rateCount: 0,
55
+ concurrencyLimit: null,
56
+ stallConfig: DEFAULT_STALL_CONFIG,
57
+ dlqConfig: DEFAULT_DLQ_CONFIG,
58
+ };
59
+ }
60
+ /** PostgreSQL Cloud strategy; every shared surface goes through durable APIs. */
61
+ export class PostgresCloudQueueAdapter {
62
+ manager;
63
+ constructor(manager) {
64
+ this.manager = manager;
65
+ }
66
+ pause = (queue, paused) => this.manager.pauseDurable(queue, paused);
67
+ drain = (queue) => this.manager.drainDurable(queue);
68
+ clean = (queue, graceMs, state, limit) => this.manager.cleanDurable(queue, graceMs, state, limit);
69
+ obliterate = (queue) => this.manager.obliterateDurable(queue);
70
+ promoteAll = (queue, limit) => this.manager.promoteJobs(queue, limit);
71
+ retryCompleted = (queue) => this.manager.retryCompletedDurable(queue);
72
+ setRateLimit = (queue, limit) => this.manager.setRateLimitDurable(queue, limit, null);
73
+ setConcurrency = (queue, limit) => this.manager.setConcurrencyDurable(queue, limit);
74
+ setStallConfig = (queue, patch) => this.manager.setStallConfigDurable(queue, patch);
75
+ setDlqConfig = (queue, patch) => this.manager.setDlqConfigDurable(queue, patch);
76
+ listJobs = (queue, options) => this.manager.listCloudJobsDurable(queue, options);
77
+ getJob = (id) => this.manager.getJob(id);
78
+ getLogs = (id) => this.manager.getLogsDurable(id);
79
+ getResult = (id) => this.manager.getCloudResultDurable(id);
80
+ clearLogs = (id, keepLogs) => this.manager.clearLogsDurable(id, keepLogs);
81
+ retryDlq = (queue, id) => this.manager.retryDlqDurable(queue, id);
82
+ purgeDlq = (queue) => this.manager.purgeDlqDurable(queue);
83
+ push = (queue, input) => this.manager.push(queue, input);
84
+ cancel = (id) => this.manager.cancel(id);
85
+ promote = (id) => this.manager.promote(id);
86
+ changePriority = (id, priority) => this.manager.changePriority(id, priority);
87
+ discard = (id) => this.manager.discard(id);
88
+ changeDelay = (id, delay) => this.manager.changeDelay(id, delay);
89
+ updateData = (id, data) => this.manager.updateJobData(id, data);
90
+ addCron = (input) => this.manager.addCronDurable(input);
91
+ removeCron = (name) => this.manager.removeCronDurable(name);
92
+ async readSnapshotSource(requestedQueues = []) {
93
+ const model = await this.manager.readCloudSnapshotDurable();
94
+ const counts = queueCounts(model);
95
+ const totals = queueTotals(model);
96
+ const names = new Set([
97
+ ...model.queueStates.map(({ queue }) => queue),
98
+ ...counts.keys(),
99
+ ...totals.keys(),
100
+ ...model.jobs.map(({ job }) => job.queue),
101
+ ...requestedQueues,
102
+ ]);
103
+ const states = new Map(model.queueStates.map((state) => [state.queue, state]));
104
+ const queues = [...names].sort().map((name) => {
105
+ const state = states.get(name) ?? defaultQueueState(name);
106
+ const rateExpired = state.rateExpiresAt !== null && state.rateExpiresAt <= Date.now();
107
+ return {
108
+ name,
109
+ counts: cloudCounts(counts.get(name) ?? EMPTY_COUNTS, totals.get(name) ?? { completed: 0n, failed: 0n }),
110
+ paused: state.paused,
111
+ rateLimit: rateExpired ? null : state.rateLimit,
112
+ concurrencyLimit: state.concurrencyLimit,
113
+ stallConfig: state.stallConfig,
114
+ dlqConfig: state.dlqConfig,
115
+ };
116
+ });
117
+ return this.toSnapshotSource(model, queues);
118
+ }
119
+ toSnapshotSource(model, queues) {
120
+ const aggregate = [...queueCounts(model).values()].reduce((sum, counts) => ({
121
+ waiting: sum.waiting + counts.waiting,
122
+ prioritized: sum.prioritized + counts.prioritized,
123
+ delayed: sum.delayed + counts.delayed,
124
+ active: sum.active + counts.active,
125
+ completed: sum.completed + counts.completed,
126
+ failed: sum.failed + counts.failed,
127
+ waitingChildren: sum.waitingChildren + counts.waitingChildren,
128
+ }), { ...EMPTY_COUNTS });
129
+ const durableTotals = [...queueTotals(model).values()].reduce((sum, item) => ({
130
+ completed: sum.completed + item.completed,
131
+ failed: sum.failed + item.failed,
132
+ }), { completed: 0n, failed: 0n });
133
+ const localStats = this.manager.getCloudProcessStats();
134
+ const now = Date.now();
135
+ const activeWorkers = model.workers.filter((worker) => now - worker.lastSeen < 30_000);
136
+ const workerStats = {
137
+ total: model.workers.length,
138
+ active: activeWorkers.length,
139
+ totalProcessed: model.workers.reduce((sum, worker) => sum + worker.processedJobs, 0),
140
+ totalFailed: model.workers.reduce((sum, worker) => sum + worker.failedJobs, 0),
141
+ activeJobs: model.workers.reduce((sum, worker) => sum + worker.activeJobs, 0),
142
+ concurrencySlots: activeWorkers.reduce((sum, worker) => sum + worker.concurrency, 0),
143
+ };
144
+ const jobResults = new Map(model.results.map(({ jobId: id, result }) => [String(id), result]));
145
+ return {
146
+ stats: {
147
+ ...localStats,
148
+ waiting: aggregate.waiting,
149
+ prioritized: aggregate.prioritized,
150
+ delayed: aggregate.delayed,
151
+ active: aggregate.active,
152
+ completed: aggregate.completed,
153
+ dlq: aggregate.failed,
154
+ 'waiting-children': aggregate.waitingChildren,
155
+ totalCompleted: durableTotals.completed,
156
+ totalFailed: durableTotals.failed,
157
+ cronJobs: model.crons.length,
158
+ cronPending: model.crons.filter((cron) => cron.nextRun <= now).length,
159
+ },
160
+ queues,
161
+ jobs: model.jobs.map((row) => ({ job: row.job, state: row.state })),
162
+ dlqEntries: model.jobs.flatMap((row) => (row.dlqEntry ? [row.dlqEntry] : [])),
163
+ workers: model.workers,
164
+ workerStats,
165
+ crons: model.crons,
166
+ jobResults,
167
+ jobLogs: model.logs,
168
+ activeLocks: model.jobs.flatMap((row) => {
169
+ if (row.state !== 'active' || !row.token || !row.leaseOwner || row.leaseUntil === null) {
170
+ return [];
171
+ }
172
+ const lastRenewalAt = row.job.lastHeartbeat || row.job.startedAt || row.job.createdAt;
173
+ return [
174
+ {
175
+ jobId: String(row.job.id),
176
+ owner: row.leaseOwner,
177
+ token: row.token,
178
+ createdAt: row.job.startedAt ?? row.job.createdAt,
179
+ expiresAt: row.leaseUntil,
180
+ lastRenewalAt,
181
+ renewalCount: row.leaseRenewals,
182
+ ttl: Math.max(0, row.leaseUntil - lastRenewalAt),
183
+ },
184
+ ];
185
+ }),
186
+ };
187
+ }
188
+ }
@@ -0,0 +1,4 @@
1
+ import type { QueueManager } from '../../../application/queueManager';
2
+ import type { CloudQueueAdapter } from './types';
3
+ /** Resolve one complete engine strategy and cache it for the manager lifetime. */
4
+ export declare function resolveCloudQueueAdapter(manager: QueueManager): CloudQueueAdapter;
@@ -0,0 +1,15 @@
1
+ import { PostgresQueueManager } from '../../../application/postgresQueueManager';
2
+ import { LocalCloudQueueAdapter } from './local';
3
+ import { PostgresCloudQueueAdapter } from './postgres';
4
+ const adapters = new WeakMap();
5
+ /** Resolve one complete engine strategy and cache it for the manager lifetime. */
6
+ export function resolveCloudQueueAdapter(manager) {
7
+ const existing = adapters.get(manager);
8
+ if (existing)
9
+ return existing;
10
+ const adapter = manager instanceof PostgresQueueManager
11
+ ? new PostgresCloudQueueAdapter(manager)
12
+ : new LocalCloudQueueAdapter(manager);
13
+ adapters.set(manager, adapter);
14
+ return adapter;
15
+ }
@@ -0,0 +1,87 @@
1
+ import type { QueueManager } from '../../../application/queueManager';
2
+ import type { CronJob, CronJobInput } from '../../../domain/types/cron';
3
+ import type { DlqConfig, DlqEntry } from '../../../domain/types/dlq';
4
+ import type { Job, JobId } from '../../../domain/types/job';
5
+ import type { StallConfig } from '../../../domain/types/stall';
6
+ import type { JobLogEntry, Worker } from '../../../domain/types/worker';
7
+ export interface CloudQueueCounts {
8
+ waiting: number;
9
+ prioritized: number;
10
+ delayed: number;
11
+ active: number;
12
+ completed: number;
13
+ failed: number;
14
+ 'waiting-children': number;
15
+ totalCompleted: number;
16
+ totalFailed: number;
17
+ }
18
+ export interface CloudQueueSource {
19
+ readonly name: string;
20
+ readonly counts: CloudQueueCounts;
21
+ readonly paused: boolean;
22
+ readonly rateLimit: number | null;
23
+ readonly concurrencyLimit: number | null;
24
+ readonly stallConfig: StallConfig;
25
+ readonly dlqConfig: DlqConfig;
26
+ }
27
+ export interface CloudSourceJob {
28
+ readonly job: Job;
29
+ readonly state: string;
30
+ }
31
+ export interface CloudSourceLock {
32
+ readonly jobId: string;
33
+ readonly owner: string;
34
+ readonly token: string;
35
+ readonly createdAt: number;
36
+ readonly expiresAt: number;
37
+ readonly lastRenewalAt: number;
38
+ readonly renewalCount: number;
39
+ readonly ttl: number;
40
+ }
41
+ export interface CloudSnapshotSource {
42
+ readonly stats: ReturnType<QueueManager['getStats']>;
43
+ readonly queues: readonly CloudQueueSource[];
44
+ readonly jobs: readonly CloudSourceJob[];
45
+ readonly dlqEntries: readonly DlqEntry[];
46
+ readonly workers: readonly Worker[];
47
+ readonly workerStats: ReturnType<QueueManager['workerManager']['getStats']>;
48
+ readonly crons: readonly CronJob[];
49
+ readonly jobResults: ReadonlyMap<string, unknown>;
50
+ readonly jobLogs: ReadonlyMap<string, readonly JobLogEntry[]>;
51
+ readonly activeLocks: readonly CloudSourceLock[];
52
+ }
53
+ export interface CloudQueueAdapter {
54
+ readonly manager: QueueManager;
55
+ pause(queue: string, paused: boolean): Promise<void>;
56
+ drain(queue: string): Promise<number>;
57
+ clean(queue: string, graceMs: number, state?: string, limit?: number): Promise<JobId[]>;
58
+ obliterate(queue: string): Promise<void>;
59
+ promoteAll(queue: string, limit: number): Promise<number>;
60
+ retryCompleted(queue: string): Promise<number>;
61
+ setRateLimit(queue: string, limit: number | null): Promise<void>;
62
+ setConcurrency(queue: string, limit: number | null): Promise<void>;
63
+ setStallConfig(queue: string, patch: Record<string, unknown>): Promise<void>;
64
+ setDlqConfig(queue: string, patch: Record<string, unknown>): Promise<void>;
65
+ listJobs(queue: string, options?: {
66
+ state?: string | string[];
67
+ start?: number;
68
+ end?: number;
69
+ asc?: boolean;
70
+ }): Promise<Job[]>;
71
+ getJob(id: JobId): Promise<Job | null>;
72
+ getLogs(id: JobId): Promise<JobLogEntry[]>;
73
+ getResult(id: JobId): Promise<unknown>;
74
+ clearLogs(id: JobId, keepLogs?: number): Promise<void>;
75
+ retryDlq(queue: string, id?: JobId): Promise<number>;
76
+ purgeDlq(queue: string): Promise<number>;
77
+ push(queue: string, input: Parameters<QueueManager['push']>[1]): Promise<Job>;
78
+ cancel(id: JobId): Promise<boolean>;
79
+ promote(id: JobId): Promise<boolean>;
80
+ changePriority(id: JobId, priority: number): Promise<boolean>;
81
+ discard(id: JobId): Promise<boolean>;
82
+ changeDelay(id: JobId, delay: number): Promise<boolean>;
83
+ updateData(id: JobId, data: unknown): Promise<boolean>;
84
+ addCron(input: CronJobInput): Promise<CronJob>;
85
+ removeCron(name: string): Promise<boolean>;
86
+ readSnapshotSource(requestedQueues?: readonly string[]): Promise<CloudSnapshotSource>;
87
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,11 +1,13 @@
1
1
  import type { QueueManager } from '../../../application/queueManager';
2
2
  import type { CloudSnapshot } from '../types';
3
+ import type { CloudSnapshotSource } from '../queueAdapter/types';
3
4
  export declare function collectQueueThroughput(queues: Array<{
4
5
  name: string;
5
6
  totalCompleted: number;
6
7
  totalFailed: number;
7
8
  }>): CloudSnapshot['queueThroughput'];
8
9
  export declare function collectWorkerUtilization(queueManager: QueueManager): CloudSnapshot['workerUtilization'];
10
+ export declare function mapSnapshotWorkerUtilization(workers: CloudSnapshotSource['workers']): CloudSnapshot['workerUtilization'];
9
11
  export declare function collectDurationHistogram(recentJobs: CloudSnapshot['recentJobs']): CloudSnapshot['durationHistogram'];
10
12
  export declare function collectQueueWaitTime(recentJobs: CloudSnapshot['recentJobs']): CloudSnapshot['queueWaitTime'];
11
13
  export declare function collectQueueRetryRate(recentJobs: CloudSnapshot['recentJobs']): CloudSnapshot['queueRetryRate'];
@@ -35,6 +35,13 @@ export function collectWorkerUtilization(queueManager) {
35
35
  utilization: worker.concurrency > 0 ? Math.round((worker.activeJobs / worker.concurrency) * 100) / 100 : 0,
36
36
  }));
37
37
  }
38
+ export function mapSnapshotWorkerUtilization(workers) {
39
+ return workers.map((worker) => ({
40
+ id: worker.id,
41
+ name: worker.name,
42
+ utilization: worker.concurrency > 0 ? Math.round((worker.activeJobs / worker.concurrency) * 100) / 100 : 0,
43
+ }));
44
+ }
38
45
  export function collectDurationHistogram(recentJobs) {
39
46
  const histogram = { lt100ms: 0, lt1s: 0, lt10s: 0, lt60s: 0, gt60s: 0 };
40
47
  for (const job of recentJobs) {
@@ -1,6 +1,7 @@
1
1
  import type { QueueManager } from '../../../application/queueManager';
2
2
  import type { CloudSnapshot } from '../types';
3
3
  import type { CollectSnapshotParams } from '../types/collector';
4
+ import type { CloudSnapshotSource } from '../queueAdapter/types';
4
5
  /** Cached host and runtime metadata. */
5
6
  export declare const SNAPSHOT_HOST: string;
6
7
  export declare const SNAPSHOT_RUNTIME: {
@@ -16,9 +17,12 @@ export declare function resolveRedaction(params: CollectSnapshotParams): {
16
17
  };
17
18
  /** Map cron definitions to their snapshot shape. */
18
19
  export declare function collectCrons(queueManager: QueueManager): CloudSnapshot['crons'];
20
+ export declare function mapSnapshotCrons(crons: CloudSnapshotSource['crons']): CloudSnapshot['crons'];
19
21
  /** Back-fill failed-job timing from the last DLQ attempt. */
20
22
  export declare function enrichFailedJobDurations(recentJobs: CloudSnapshot['recentJobs'], dlqEntries: CloudSnapshot['dlqEntries']): void;
21
23
  /** Collect worker registry details and derived health fields. */
22
24
  export declare function collectWorkerDetails(queueManager: QueueManager, now: number): CloudSnapshot['workerDetails'];
25
+ export declare function mapSnapshotWorkers(workers: CloudSnapshotSource['workers'], now: number): CloudSnapshot['workerDetails'];
23
26
  /** Collect results, logs, and active locks for the snapshot. */
24
27
  export declare function collectJobArtifacts(queueManager: QueueManager): Pick<CloudSnapshot, 'jobResults' | 'jobLogEntries' | 'activeLocks'>;
28
+ export declare function mapSnapshotJobArtifacts(source: CloudSnapshotSource): Pick<CloudSnapshot, 'jobResults' | 'jobLogEntries' | 'activeLocks'>;
@@ -16,7 +16,10 @@ export function resolveRedaction(params) {
16
16
  }
17
17
  /** Map cron definitions to their snapshot shape. */
18
18
  export function collectCrons(queueManager) {
19
- return queueManager.listCrons().map((cron) => ({
19
+ return mapSnapshotCrons(queueManager.listCrons());
20
+ }
21
+ export function mapSnapshotCrons(crons) {
22
+ return crons.map((cron) => ({
20
23
  name: cron.name,
21
24
  queue: cron.queue,
22
25
  schedule: cron.schedule ?? null,
@@ -83,6 +86,34 @@ export function collectWorkerDetails(queueManager, now) {
83
86
  };
84
87
  });
85
88
  }
89
+ export function mapSnapshotWorkers(workers, now) {
90
+ const workerTimeoutMs = 30_000;
91
+ return workers.map((worker) => {
92
+ const totalJobs = worker.processedJobs + worker.failedJobs;
93
+ return {
94
+ id: worker.id,
95
+ name: worker.name,
96
+ queues: worker.queues,
97
+ concurrency: worker.concurrency,
98
+ hostname: worker.hostname,
99
+ pid: worker.pid,
100
+ registeredAt: worker.registeredAt,
101
+ lastSeen: worker.lastSeen,
102
+ activeJobs: worker.activeJobs,
103
+ processedJobs: worker.processedJobs,
104
+ failedJobs: worker.failedJobs,
105
+ currentJob: worker.currentJob,
106
+ uptime: now - worker.registeredAt,
107
+ status: now - worker.lastSeen > workerTimeoutMs
108
+ ? 'stalled'
109
+ : worker.activeJobs > 0
110
+ ? 'active'
111
+ : 'idle',
112
+ errorRate: totalJobs > 0 ? +(worker.failedJobs / totalJobs).toFixed(4) : 0,
113
+ utilization: worker.concurrency > 0 ? +(worker.activeJobs / worker.concurrency).toFixed(4) : 0,
114
+ };
115
+ });
116
+ }
86
117
  /** Collect results, logs, and active locks for the snapshot. */
87
118
  export function collectJobArtifacts(queueManager) {
88
119
  const jobResults = {};
@@ -103,3 +134,10 @@ export function collectJobArtifacts(queueManager) {
103
134
  }));
104
135
  return { jobResults, jobLogEntries, activeLocks };
105
136
  }
137
+ export function mapSnapshotJobArtifacts(source) {
138
+ return {
139
+ jobResults: Object.fromEntries(source.jobResults),
140
+ jobLogEntries: Object.fromEntries([...source.jobLogs].map(([id, logs]) => [id, [...logs]])),
141
+ activeLocks: [...source.activeLocks],
142
+ };
143
+ }
@@ -1,5 +1,8 @@
1
1
  import type { QueueManager } from '../../../application/queueManager';
2
2
  import type { CloudSnapshot } from '../types';
3
+ import type { CloudSnapshotSource } from '../queueAdapter/types';
3
4
  export declare function collectQueueConfigs(queueManager: QueueManager, queueNames: Set<string>): CloudSnapshot['queueConfigs'];
5
+ export declare function mapSnapshotQueueConfigs(queues: CloudSnapshotSource['queues']): CloudSnapshot['queueConfigs'];
4
6
  export declare function collectWebhooks(queueManager: QueueManager): CloudSnapshot['webhooks'];
5
7
  export declare function collectTopErrors(queueManager: QueueManager, dlqQueueNames: string[]): CloudSnapshot['topErrors'];
8
+ export declare function mapSnapshotTopErrors(entries: CloudSnapshotSource['dlqEntries']): CloudSnapshot['topErrors'];
@@ -33,6 +33,30 @@ export function collectQueueConfigs(queueManager, queueNames) {
33
33
  }
34
34
  return configs;
35
35
  }
36
+ export function mapSnapshotQueueConfigs(queues) {
37
+ return Object.fromEntries(queues.map((queue) => [
38
+ queue.name,
39
+ {
40
+ paused: queue.paused,
41
+ rateLimit: queue.rateLimit,
42
+ concurrencyLimit: queue.concurrencyLimit,
43
+ concurrencyActive: queue.counts.active,
44
+ stallConfig: {
45
+ enabled: queue.stallConfig.enabled,
46
+ stallInterval: queue.stallConfig.stallInterval,
47
+ maxStalls: queue.stallConfig.maxStalls,
48
+ gracePeriod: queue.stallConfig.gracePeriod,
49
+ },
50
+ dlqConfig: {
51
+ autoRetry: queue.dlqConfig.autoRetry,
52
+ autoRetryInterval: queue.dlqConfig.autoRetryInterval,
53
+ maxRetries: queue.dlqConfig.maxAutoRetries,
54
+ maxAge: queue.dlqConfig.maxAge ?? 0,
55
+ maxEntries: queue.dlqConfig.maxEntries,
56
+ },
57
+ },
58
+ ]));
59
+ }
36
60
  export function collectWebhooks(queueManager) {
37
61
  try {
38
62
  return queueManager.webhookManager.list().map((webhook) => ({
@@ -84,3 +108,22 @@ export function collectTopErrors(queueManager, dlqQueueNames) {
84
108
  .map(([message, data]) => ({ message, ...data }))
85
109
  .sort((a, b) => b.count - a.count);
86
110
  }
111
+ export function mapSnapshotTopErrors(entries) {
112
+ const errors = new Map();
113
+ for (const entry of entries) {
114
+ const message = entry.error ?? entry.reason;
115
+ const current = errors.get(message);
116
+ if (!current) {
117
+ errors.set(message, { count: 1, queue: entry.job.queue, lastSeen: entry.enteredAt });
118
+ continue;
119
+ }
120
+ current.count++;
121
+ if (entry.enteredAt > current.lastSeen) {
122
+ current.lastSeen = entry.enteredAt;
123
+ current.queue = entry.job.queue;
124
+ }
125
+ }
126
+ return [...errors]
127
+ .map(([message, data]) => ({ message, ...data }))
128
+ .sort((a, b) => b.count - a.count);
129
+ }
@@ -1,5 +1,8 @@
1
1
  import type { QueueManager } from '../../../application/queueManager';
2
2
  import type { CloudSnapshot } from '../types';
3
3
  import type { RedactOptions } from '../types/redact';
4
+ import type { CloudSnapshotSource } from '../queueAdapter/types';
5
+ export declare function mapSnapshotJobs(jobs: CloudSnapshotSource['jobs'], redact: RedactOptions): CloudSnapshot['recentJobs'];
6
+ export declare function mapSnapshotDlqEntries(source: CloudSnapshotSource['dlqEntries'], redact: RedactOptions): CloudSnapshot['dlqEntries'];
4
7
  export declare function collectLiveJobs(queueManager: QueueManager, queueNames: string[], redact: RedactOptions): CloudSnapshot['recentJobs'];
5
8
  export declare function collectDlqEntries(queueManager: QueueManager, dlqQueueNames: string[], redact: RedactOptions): CloudSnapshot['dlqEntries'];
@@ -87,6 +87,37 @@ function mapJobExtended(job) {
87
87
  function mapJobToSnapshot(job, state, redact) {
88
88
  return { ...mapJobCore(job, state, redact), ...mapJobExtended(job) };
89
89
  }
90
+ export function mapSnapshotJobs(jobs, redact) {
91
+ return jobs.map(({ job, state }) => mapJobToSnapshot(job, state, redact));
92
+ }
93
+ export function mapSnapshotDlqEntries(source, redact) {
94
+ return source
95
+ .map((entry) => ({
96
+ jobId: String(entry.job.id),
97
+ queue: entry.job.queue,
98
+ reason: entry.reason,
99
+ error: entry.error,
100
+ enteredAt: entry.enteredAt,
101
+ retryCount: entry.retryCount,
102
+ lastRetryAt: entry.lastRetryAt ?? undefined,
103
+ nextRetryAt: entry.nextRetryAt ?? undefined,
104
+ expiresAt: entry.expiresAt ?? undefined,
105
+ jobAttempts: entry.job.attempts,
106
+ jobMaxAttempts: entry.job.maxAttempts,
107
+ jobData: redact.includeJobData ? redactData(entry.job.data, redact.redactFields) : undefined,
108
+ jobCreatedAt: entry.job.createdAt,
109
+ jobPriority: entry.job.priority,
110
+ attemptHistory: entry.attempts.map((attempt) => ({
111
+ attempt: attempt.attempt,
112
+ startedAt: attempt.startedAt,
113
+ failedAt: attempt.failedAt,
114
+ reason: attempt.reason,
115
+ error: attempt.error,
116
+ duration: attempt.duration,
117
+ })),
118
+ }))
119
+ .sort((left, right) => right.enteredAt - left.enteredAt);
120
+ }
90
121
  export function collectLiveJobs(queueManager, queueNames, redact) {
91
122
  if (queueNames.length === 0)
92
123
  return [];
@@ -94,7 +125,7 @@ export function collectLiveJobs(queueManager, queueNames, redact) {
94
125
  for (const name of queueNames) {
95
126
  for (const state of ALL_STATES) {
96
127
  try {
97
- const queueJobs = queueManager.getJobs(name, { state: [state], start: 0, end: 999 });
128
+ const queueJobs = queueManager.getJobs(name, { state: [state], start: 0, end: 1000 });
98
129
  for (const job of queueJobs)
99
130
  jobs.push(mapJobToSnapshot(job, state, redact));
100
131
  }
@@ -9,63 +9,48 @@ import { throughputTracker } from '../../application/throughputTracker';
9
9
  import { latencyTracker } from '../../application/latencyTracker';
10
10
  import { getTaskErrorStats } from '../../application/backgroundTasks';
11
11
  import { VERSION } from '../../shared/version';
12
+ import { clientStorageStatus } from '../../shared/storageHealth';
12
13
  import { cloudLog } from './logger';
13
- import { SNAPSHOT_HOST, SNAPSHOT_RUNTIME, collectCrons, collectJobArtifacts, collectWorkerDetails, enrichFailedJobDurations, resolveRedaction, } from './snapshot/collector';
14
- import { collectLiveJobs, collectDlqEntries, collectTopErrors, collectQueueConfigs, collectWebhooks, collectQueueThroughput, collectWorkerUtilization, collectDurationHistogram, collectQueueWaitTime, collectQueueRetryRate, collectBacklogVelocity, collectStallDetails, collectPriorityDistribution, } from './snapshotHelpers';
14
+ import { SNAPSHOT_HOST, SNAPSHOT_RUNTIME, enrichFailedJobDurations, mapSnapshotCrons, mapSnapshotJobArtifacts, mapSnapshotWorkers, resolveRedaction, } from './snapshot/collector';
15
+ import { collectWebhooks, collectQueueThroughput, collectDurationHistogram, collectQueueWaitTime, collectQueueRetryRate, collectBacklogVelocity, collectStallDetails, collectPriorityDistribution, mapSnapshotDlqEntries, mapSnapshotJobs, mapSnapshotQueueConfigs, mapSnapshotTopErrors, mapSnapshotWorkerUtilization, } from './snapshotHelpers';
16
+ import { resolveCloudQueueAdapter } from './queueAdapter/registry';
15
17
  /** Collect a snapshot. Light data always fresh, heavy data cached between refreshes. */
16
18
  export async function collectSnapshot(params) {
17
19
  const t0 = performance.now();
18
20
  const { queueManager, instanceId, instanceName, startedAt, sequenceId, serverHandles } = params;
19
21
  const { redactFields, includeJobData } = resolveRedaction(params);
22
+ const source = await resolveCloudQueueAdapter(queueManager).readSnapshotSource();
20
23
  // ─── MCP operations (drain buffer into snapshot) ───
21
24
  const mcpData = serverHandles?.getMcpOperations?.();
22
25
  // ─── Light data (O(SHARD_COUNT), every snapshot) ───
23
- const stats = queueManager.getStats();
26
+ const stats = source.stats;
24
27
  const memStats = queueManager.getMemoryStats();
25
- const workerStats = queueManager.workerManager.getStats();
28
+ const workerStats = source.workerStats;
26
29
  const rates = throughputTracker.getRates();
27
30
  const percentiles = latencyTracker.getPercentiles();
28
31
  const averages = latencyTracker.getAverages();
29
- const storage = queueManager.getStorageStatus();
32
+ const storage = clientStorageStatus(queueManager.getStorageStatus());
30
33
  const mem = process.memoryUsage();
31
- const queueNames = queueManager.listQueues();
32
- const countsByQueue = queueManager.getAllQueueJobCounts();
33
- const queues = queueNames.flatMap((name) => {
34
- const counts = countsByQueue.get(name);
35
- if (!counts)
36
- return [];
37
- return {
38
- name,
39
- waiting: counts.waiting,
40
- prioritized: counts.prioritized,
41
- delayed: counts.delayed,
42
- active: counts.active,
43
- completed: counts.completed,
44
- failed: counts.failed,
45
- 'waiting-children': counts['waiting-children'],
46
- paused: queueManager.isPaused(name),
47
- totalCompleted: counts.totalCompleted,
48
- totalFailed: counts.totalFailed,
49
- };
50
- });
51
- const crons = collectCrons(queueManager);
34
+ const queues = source.queues.map(({ name, counts, paused }) => ({ name, ...counts, paused }));
35
+ const crons = mapSnapshotCrons(source.crons);
52
36
  // ─── Full data (every snapshot) ───
53
37
  const allQueueNames = queues.map((q) => q.name);
54
- const dlqQueues = queues.filter((q) => q.failed > 0);
55
- // Live jobs: waiting/active/delayed/failed — bounded by processing capacity
56
- const recentJobs = collectLiveJobs(queueManager, allQueueNames, {
38
+ const recentJobs = mapSnapshotJobs(source.jobs, {
39
+ redactFields,
40
+ includeJobData,
41
+ });
42
+ const dlqEntries = mapSnapshotDlqEntries(source.dlqEntries, {
57
43
  redactFields,
58
44
  includeJobData,
59
45
  });
60
- const dlqEntries = collectDlqEntries(queueManager, dlqQueues.map((q) => q.name), { redactFields, includeJobData });
61
46
  enrichFailedJobDurations(recentJobs, dlqEntries);
62
- const topErrors = collectTopErrors(queueManager, dlqQueues.map((q) => q.name));
63
- const workerDetails = collectWorkerDetails(queueManager, Date.now());
64
- const queueConfigs = collectQueueConfigs(queueManager, new Set(queueNames));
47
+ const topErrors = mapSnapshotTopErrors(source.dlqEntries);
48
+ const workerDetails = mapSnapshotWorkers(source.workers, Date.now());
49
+ const queueConfigs = mapSnapshotQueueConfigs(source.queues);
65
50
  const webhooks = collectWebhooks(queueManager);
66
51
  const s3Backup = serverHandles?.getBackupStatus?.() ?? null;
67
52
  const telemetry = queueManager.getCloudTelemetry(allQueueNames);
68
- const { jobResults, jobLogEntries, activeLocks } = collectJobArtifacts(queueManager);
53
+ const { jobResults, jobLogEntries, activeLocks } = mapSnapshotJobArtifacts(source);
69
54
  const result = {
70
55
  instanceId,
71
56
  instanceName,
@@ -126,7 +111,7 @@ export async function collectSnapshot(params) {
126
111
  // Analytics
127
112
  queueThroughput: collectQueueThroughput(queues),
128
113
  durationHistogram: collectDurationHistogram(recentJobs),
129
- workerUtilization: collectWorkerUtilization(queueManager),
114
+ workerUtilization: mapSnapshotWorkerUtilization(source.workers),
130
115
  sqliteStats: serverHandles?.getSqliteStats?.() ?? null,
131
116
  runtime: SNAPSHOT_RUNTIME,
132
117
  queueWaitTime: collectQueueWaitTime(recentJobs),
@@ -1,5 +1,5 @@
1
- export { collectBacklogVelocity, collectDurationHistogram, collectPriorityDistribution, collectQueueRetryRate, collectQueueThroughput, collectQueueWaitTime, collectWorkerUtilization, } from './snapshot/analytics';
2
- export { collectQueueConfigs, collectTopErrors, collectWebhooks } from './snapshot/config';
3
- export { collectDlqEntries, collectLiveJobs } from './snapshot/jobs';
1
+ export { collectBacklogVelocity, collectDurationHistogram, collectPriorityDistribution, collectQueueRetryRate, collectQueueThroughput, collectQueueWaitTime, collectWorkerUtilization, mapSnapshotWorkerUtilization, } from './snapshot/analytics';
2
+ export { collectQueueConfigs, collectTopErrors, collectWebhooks, mapSnapshotQueueConfigs, mapSnapshotTopErrors, } from './snapshot/config';
3
+ export { collectDlqEntries, collectLiveJobs, mapSnapshotDlqEntries, mapSnapshotJobs, } from './snapshot/jobs';
4
4
  export { collectStallDetails } from './snapshot/stalls';
5
5
  export type { RedactOptions } from './types/redact';
@@ -1,4 +1,4 @@
1
- export { collectBacklogVelocity, collectDurationHistogram, collectPriorityDistribution, collectQueueRetryRate, collectQueueThroughput, collectQueueWaitTime, collectWorkerUtilization, } from './snapshot/analytics';
2
- export { collectQueueConfigs, collectTopErrors, collectWebhooks } from './snapshot/config';
3
- export { collectDlqEntries, collectLiveJobs } from './snapshot/jobs';
1
+ export { collectBacklogVelocity, collectDurationHistogram, collectPriorityDistribution, collectQueueRetryRate, collectQueueThroughput, collectQueueWaitTime, collectWorkerUtilization, mapSnapshotWorkerUtilization, } from './snapshot/analytics';
2
+ export { collectQueueConfigs, collectTopErrors, collectWebhooks, mapSnapshotQueueConfigs, mapSnapshotTopErrors, } from './snapshot/config';
3
+ export { collectDlqEntries, collectLiveJobs, mapSnapshotDlqEntries, mapSnapshotJobs, } from './snapshot/jobs';
4
4
  export { collectStallDetails } from './snapshot/stalls';