@archlast/server 0.1.7 → 0.1.9

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 (372) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +14 -10
  3. package/dist/admin/auth.d.ts +24 -5
  4. package/dist/admin/auth.js +49 -25
  5. package/dist/admin/schema.d.ts +122 -32
  6. package/dist/admin/schema.js +131 -95
  7. package/dist/admin/seed.d.ts +1 -1
  8. package/dist/admin/seed.js +79 -47
  9. package/dist/auth/api-key-resolver.d.ts +1 -1
  10. package/dist/auth/api-key-resolver.js +7 -3
  11. package/dist/auth/archlast-auth-adapter.d.ts +2 -5
  12. package/dist/auth/archlast-auth-adapter.js +1 -1
  13. package/dist/auth/better-auth-adapter.d.ts.map +1 -1
  14. package/dist/auth/better-auth-adapter.js +41 -26
  15. package/dist/auth/better-auth-adapter.js.map +1 -1
  16. package/dist/auth/better-auth-admin.d.ts.map +1 -1
  17. package/dist/auth/better-auth-admin.js +1 -1
  18. package/dist/auth/better-auth-admin.js.map +1 -1
  19. package/dist/auth/better-auth-api-key-resolver.js +1 -1
  20. package/dist/auth/better-auth-api-key-resolver.js.map +1 -1
  21. package/dist/auth/better-auth-instance.d.ts +247 -303
  22. package/dist/auth/better-auth-instance.d.ts.map +1 -1
  23. package/dist/auth/better-auth-instance.js +11 -0
  24. package/dist/auth/better-auth-instance.js.map +1 -1
  25. package/dist/auth/better-auth-seed.d.ts +5 -2
  26. package/dist/auth/better-auth-seed.js +31 -22
  27. package/dist/auth/better-auth-session-adapter.d.ts.map +1 -1
  28. package/dist/auth/better-auth-session-adapter.js +14 -10
  29. package/dist/auth/better-auth-session-adapter.js.map +1 -1
  30. package/dist/auth/errors.d.ts.map +1 -1
  31. package/dist/auth/errors.js +11 -11
  32. package/dist/auth/errors.js.map +1 -1
  33. package/dist/auth/oauth-proxy.d.ts +5 -2
  34. package/dist/auth/oauth-proxy.js +23 -27
  35. package/dist/auth/resolver.d.ts.map +1 -1
  36. package/dist/auth/resolver.js.map +1 -1
  37. package/dist/auth/role-helpers.d.ts +1 -1
  38. package/dist/auth/role-helpers.d.ts.map +1 -1
  39. package/dist/auth/role-helpers.js.map +1 -1
  40. package/dist/auth/session-manager.d.ts +2 -5
  41. package/dist/auth/session-manager.js +16 -6
  42. package/dist/auth/system/better-auth-schema.d.ts.map +1 -1
  43. package/dist/auth/system/better-auth-schema.js +6 -23
  44. package/dist/auth/system/better-auth-schema.js.map +1 -1
  45. package/dist/cache/circuit-breaker.d.ts +81 -0
  46. package/dist/cache/circuit-breaker.d.ts.map +1 -0
  47. package/dist/cache/circuit-breaker.js +170 -0
  48. package/dist/cache/circuit-breaker.js.map +1 -0
  49. package/dist/cache/client.d.ts +6 -3
  50. package/dist/cache/client.d.ts.map +1 -1
  51. package/dist/cache/client.js +12 -53
  52. package/dist/cache/client.js.map +1 -1
  53. package/dist/cache/index.d.ts +2 -0
  54. package/dist/cache/index.d.ts.map +1 -1
  55. package/dist/cache/index.js +5 -1
  56. package/dist/cache/index.js.map +1 -1
  57. package/dist/cache/invalidation-queue.d.ts +63 -0
  58. package/dist/cache/invalidation-queue.d.ts.map +1 -0
  59. package/dist/cache/invalidation-queue.js +196 -0
  60. package/dist/cache/invalidation-queue.js.map +1 -0
  61. package/dist/cache/layers.d.ts +14 -4
  62. package/dist/cache/layers.d.ts.map +1 -1
  63. package/dist/cache/layers.js +66 -72
  64. package/dist/cache/layers.js.map +1 -1
  65. package/dist/cache/manager.d.ts.map +1 -1
  66. package/dist/cache/manager.js +6 -41
  67. package/dist/cache/manager.js.map +1 -1
  68. package/dist/cache/protocol.d.ts +4 -39
  69. package/dist/cache/protocol.d.ts.map +1 -1
  70. package/dist/cache/protocol.js.map +1 -1
  71. package/dist/cache/redis-adapter.d.ts +103 -0
  72. package/dist/cache/redis-adapter.d.ts.map +1 -0
  73. package/dist/cache/redis-adapter.js +424 -0
  74. package/dist/cache/redis-adapter.js.map +1 -0
  75. package/dist/cache/run-sidecar.js +10 -1
  76. package/dist/cache/run-sidecar.js.map +1 -1
  77. package/dist/cache/sidecar-server.d.ts +51 -1
  78. package/dist/cache/sidecar-server.d.ts.map +1 -1
  79. package/dist/cache/sidecar-server.js +368 -22
  80. package/dist/cache/sidecar-server.js.map +1 -1
  81. package/dist/cache/store.d.ts +43 -0
  82. package/dist/cache/store.d.ts.map +1 -1
  83. package/dist/cache/store.js +69 -76
  84. package/dist/cache/store.js.map +1 -1
  85. package/dist/cache/strategies.d.ts +2 -9
  86. package/dist/cache/strategies.d.ts.map +1 -1
  87. package/dist/cache/types.d.ts +130 -0
  88. package/dist/cache/types.d.ts.map +1 -0
  89. package/dist/cache/types.js +60 -0
  90. package/dist/cache/types.js.map +1 -0
  91. package/dist/config/bullmq.d.ts +16 -0
  92. package/dist/config/bullmq.d.ts.map +1 -0
  93. package/dist/config/bullmq.js +103 -0
  94. package/dist/config/bullmq.js.map +1 -0
  95. package/dist/config/index.d.ts +1 -0
  96. package/dist/config/index.d.ts.map +1 -1
  97. package/dist/config/index.js +1 -0
  98. package/dist/config/index.js.map +1 -1
  99. package/dist/config/schema.d.ts +80 -6
  100. package/dist/config/schema.d.ts.map +1 -1
  101. package/dist/config/schema.js +71 -6
  102. package/dist/config/schema.js.map +1 -1
  103. package/dist/config/service.d.ts +54 -4
  104. package/dist/config/service.d.ts.map +1 -1
  105. package/dist/config/service.js +56 -2
  106. package/dist/config/service.js.map +1 -1
  107. package/dist/controllers/admin/admin-tokens.controller.d.ts +131 -115
  108. package/dist/controllers/admin/admin-tokens.controller.js +117 -98
  109. package/dist/controllers/admin/api-keys.controller.d.ts +1 -1
  110. package/dist/controllers/admin/api-keys.controller.d.ts.map +1 -1
  111. package/dist/controllers/admin/api-keys.controller.js.map +1 -1
  112. package/dist/controllers/admin/app-users.controller.d.ts +274 -243
  113. package/dist/controllers/admin/app-users.controller.js +301 -257
  114. package/dist/controllers/admin/auth.controller.d.ts +260 -236
  115. package/dist/controllers/admin/auth.controller.js +197 -174
  116. package/dist/controllers/admin/backup.controller.d.ts.map +1 -1
  117. package/dist/controllers/admin/backup.controller.js.map +1 -1
  118. package/dist/controllers/admin/settings.controller.d.ts +1 -1
  119. package/dist/controllers/admin/storage-stats.controller.d.ts +63 -0
  120. package/dist/controllers/admin/storage-stats.controller.d.ts.map +1 -0
  121. package/dist/controllers/admin/storage-stats.controller.js +33 -0
  122. package/dist/controllers/admin/storage-stats.controller.js.map +1 -0
  123. package/dist/controllers/admin/tenants.controller.d.ts.map +1 -1
  124. package/dist/controllers/admin/tenants.controller.js.map +1 -1
  125. package/dist/controllers/admin/users.controller.d.ts +1 -1
  126. package/dist/controllers/admin/users.controller.d.ts.map +1 -1
  127. package/dist/controllers/admin/users.controller.js.map +1 -1
  128. package/dist/controllers/auth.controller.d.ts +289 -271
  129. package/dist/controllers/auth.controller.js +275 -226
  130. package/dist/controllers/crud-generator.controller.d.ts.map +1 -1
  131. package/dist/controllers/crud-generator.controller.js +4 -2
  132. package/dist/controllers/crud-generator.controller.js.map +1 -1
  133. package/dist/controllers/index.d.ts +1 -1
  134. package/dist/controllers/index.d.ts.map +1 -1
  135. package/dist/controllers/index.js.map +1 -1
  136. package/dist/controllers/introspection.controller.d.ts +666 -0
  137. package/dist/controllers/introspection.controller.d.ts.map +1 -1
  138. package/dist/controllers/introspection.controller.js +628 -0
  139. package/dist/controllers/introspection.controller.js.map +1 -1
  140. package/dist/controllers/invite.controller.d.ts +190 -170
  141. package/dist/controllers/invite.controller.js +183 -164
  142. package/dist/controllers/mfa.controller.d.ts +205 -183
  143. package/dist/controllers/mfa.controller.js +131 -111
  144. package/dist/controllers/otp.controller.d.ts +194 -171
  145. package/dist/controllers/otp.controller.js +192 -175
  146. package/dist/controllers/storage.controller.d.ts.map +1 -1
  147. package/dist/controllers/storage.controller.js.map +1 -1
  148. package/dist/controllers/system.controller.d.ts +21 -3
  149. package/dist/controllers/system.controller.d.ts.map +1 -1
  150. package/dist/controllers/system.controller.js +32 -2
  151. package/dist/controllers/system.controller.js.map +1 -1
  152. package/dist/controllers/tenant.controller.d.ts +258 -227
  153. package/dist/controllers/tenant.controller.js +224 -200
  154. package/dist/db/cachedclient.d.ts +6 -11
  155. package/dist/db/cachedclient.d.ts.map +1 -1
  156. package/dist/db/cachedclient.js +79 -43
  157. package/dist/db/cachedclient.js.map +1 -1
  158. package/dist/db/distributed-client.d.ts +79 -24
  159. package/dist/db/distributed-client.js +23 -24
  160. package/dist/db/factory.d.ts +3 -8
  161. package/dist/db/factory.d.ts.map +1 -1
  162. package/dist/db/factory.js +3 -22
  163. package/dist/db/factory.js.map +1 -1
  164. package/dist/db/socket-client.d.ts +7 -0
  165. package/dist/db/socket-client.d.ts.map +1 -1
  166. package/dist/db/socket-client.js +140 -11
  167. package/dist/db/socket-client.js.map +1 -1
  168. package/dist/deployment/handler.d.ts +10 -2
  169. package/dist/deployment/handler.d.ts.map +1 -1
  170. package/dist/deployment/handler.js +103 -21
  171. package/dist/deployment/handler.js.map +1 -1
  172. package/dist/deployment/persistence.d.ts.map +1 -1
  173. package/dist/deployment/persistence.js +6 -1
  174. package/dist/deployment/persistence.js.map +1 -1
  175. package/dist/docker/compose.d.ts.map +1 -1
  176. package/dist/docker/compose.js +76 -0
  177. package/dist/docker/compose.js.map +1 -1
  178. package/dist/engine/runner.d.ts.map +1 -1
  179. package/dist/engine/runner.js +0 -43
  180. package/dist/engine/runner.js.map +1 -1
  181. package/dist/functions/built-in/auth-apikey.d.ts.map +1 -1
  182. package/dist/functions/built-in/auth-apikey.js.map +1 -1
  183. package/dist/functions/built-in/system-cache.d.ts.map +1 -1
  184. package/dist/functions/built-in/system-cache.js +6 -31
  185. package/dist/functions/built-in/system-cache.js.map +1 -1
  186. package/dist/functions/built-in/system-data.d.ts.map +1 -1
  187. package/dist/functions/built-in/system-data.js +4 -2
  188. package/dist/functions/built-in/system-data.js.map +1 -1
  189. package/dist/functions/definition.d.ts.map +1 -1
  190. package/dist/functions/definition.js +6 -2
  191. package/dist/functions/definition.js.map +1 -1
  192. package/dist/http/router.d.ts +1 -0
  193. package/dist/http/router.d.ts.map +1 -1
  194. package/dist/http/router.js +14 -3
  195. package/dist/http/router.js.map +1 -1
  196. package/dist/http/routes/metrics.d.ts +42 -0
  197. package/dist/http/routes/metrics.d.ts.map +1 -0
  198. package/dist/http/routes/metrics.js +29 -0
  199. package/dist/http/routes/metrics.js.map +1 -0
  200. package/dist/http/server.d.ts +1 -0
  201. package/dist/http/server.d.ts.map +1 -1
  202. package/dist/http/server.js +63 -22
  203. package/dist/http/server.js.map +1 -1
  204. package/dist/ipc/socket-bridge.d.ts +1 -0
  205. package/dist/ipc/socket-bridge.d.ts.map +1 -1
  206. package/dist/ipc/socket-bridge.js +5 -1
  207. package/dist/ipc/socket-bridge.js.map +1 -1
  208. package/dist/jobs/bullmq-adapter.d.ts +154 -0
  209. package/dist/jobs/bullmq-adapter.d.ts.map +1 -0
  210. package/dist/jobs/bullmq-adapter.js +688 -0
  211. package/dist/jobs/bullmq-adapter.js.map +1 -0
  212. package/dist/jobs/bullmq-circuit-breaker.d.ts +133 -0
  213. package/dist/jobs/bullmq-circuit-breaker.d.ts.map +1 -0
  214. package/dist/jobs/bullmq-circuit-breaker.js +323 -0
  215. package/dist/jobs/bullmq-circuit-breaker.js.map +1 -0
  216. package/dist/jobs/bullmq-dlq-manager.d.ts +155 -0
  217. package/dist/jobs/bullmq-dlq-manager.d.ts.map +1 -0
  218. package/dist/jobs/bullmq-dlq-manager.js +325 -0
  219. package/dist/jobs/bullmq-dlq-manager.js.map +1 -0
  220. package/dist/jobs/bullmq-metrics.d.ts +104 -0
  221. package/dist/jobs/bullmq-metrics.d.ts.map +1 -0
  222. package/dist/jobs/bullmq-metrics.js +323 -0
  223. package/dist/jobs/bullmq-metrics.js.map +1 -0
  224. package/dist/jobs/bullmq-priority-service.d.ts +173 -0
  225. package/dist/jobs/bullmq-priority-service.d.ts.map +1 -0
  226. package/dist/jobs/bullmq-priority-service.js +390 -0
  227. package/dist/jobs/bullmq-priority-service.js.map +1 -0
  228. package/dist/jobs/bullmq-scheduler.d.ts +111 -0
  229. package/dist/jobs/bullmq-scheduler.d.ts.map +1 -0
  230. package/dist/jobs/bullmq-scheduler.js +300 -0
  231. package/dist/jobs/bullmq-scheduler.js.map +1 -0
  232. package/dist/jobs/bullmq-worker.d.ts +155 -0
  233. package/dist/jobs/bullmq-worker.d.ts.map +1 -0
  234. package/dist/jobs/bullmq-worker.js +651 -0
  235. package/dist/jobs/bullmq-worker.js.map +1 -0
  236. package/dist/jobs/circuit-breaker.d.ts +120 -0
  237. package/dist/jobs/circuit-breaker.d.ts.map +1 -0
  238. package/dist/jobs/circuit-breaker.js +262 -0
  239. package/dist/jobs/circuit-breaker.js.map +1 -0
  240. package/dist/jobs/index.d.ts +1 -1
  241. package/dist/jobs/index.d.ts.map +1 -1
  242. package/dist/jobs/index.js.map +1 -1
  243. package/dist/jobs/queue.d.ts +120 -1
  244. package/dist/jobs/queue.d.ts.map +1 -1
  245. package/dist/jobs/queue.js +487 -9
  246. package/dist/jobs/queue.js.map +1 -1
  247. package/dist/jobs/redis-connection.d.ts +50 -0
  248. package/dist/jobs/redis-connection.d.ts.map +1 -0
  249. package/dist/jobs/redis-connection.js +123 -0
  250. package/dist/jobs/redis-connection.js.map +1 -0
  251. package/dist/jobs/run-scheduler.js +163 -10
  252. package/dist/jobs/run-scheduler.js.map +1 -1
  253. package/dist/jobs/run-worker.js +101 -9
  254. package/dist/jobs/run-worker.js.map +1 -1
  255. package/dist/jobs/worker-thread.d.ts +6 -0
  256. package/dist/jobs/worker-thread.d.ts.map +1 -1
  257. package/dist/jobs/worker-thread.js +37 -8
  258. package/dist/jobs/worker-thread.js.map +1 -1
  259. package/dist/jobs/worker.d.ts +33 -0
  260. package/dist/jobs/worker.d.ts.map +1 -1
  261. package/dist/jobs/worker.js +358 -115
  262. package/dist/jobs/worker.js.map +1 -1
  263. package/dist/linq/async-enumerable.d.ts.map +1 -1
  264. package/dist/linq/async-enumerable.js.map +1 -1
  265. package/dist/linq/enumerable.d.ts.map +1 -1
  266. package/dist/linq/enumerable.js +10 -10
  267. package/dist/linq/enumerable.js.map +1 -1
  268. package/dist/metrics/collector.d.ts +26 -0
  269. package/dist/metrics/collector.d.ts.map +1 -0
  270. package/dist/metrics/collector.js +103 -0
  271. package/dist/metrics/collector.js.map +1 -0
  272. package/dist/polling/updates.controller.d.ts +57 -0
  273. package/dist/polling/updates.controller.d.ts.map +1 -0
  274. package/dist/polling/updates.controller.js +70 -0
  275. package/dist/polling/updates.controller.js.map +1 -0
  276. package/dist/repository/db-set.d.ts.map +1 -1
  277. package/dist/repository/db-set.js +12 -8
  278. package/dist/repository/db-set.js.map +1 -1
  279. package/dist/repository/ef-core.d.ts.map +1 -1
  280. package/dist/repository/ef-core.js +6 -6
  281. package/dist/repository/ef-core.js.map +1 -1
  282. package/dist/repository/factory.d.ts +1 -1
  283. package/dist/repository/factory.d.ts.map +1 -1
  284. package/dist/repository/factory.js.map +1 -1
  285. package/dist/repository/interfaces.d.ts.map +1 -1
  286. package/dist/repository/interfaces.js.map +1 -1
  287. package/dist/repository/queryable.d.ts.map +1 -1
  288. package/dist/repository/queryable.js.map +1 -1
  289. package/dist/rpc/adapter.d.ts.map +1 -1
  290. package/dist/rpc/adapter.js.map +1 -1
  291. package/dist/rpc/router.d.ts +2 -2
  292. package/dist/rpc/router.d.ts.map +1 -1
  293. package/dist/rpc/router.js +1 -1
  294. package/dist/rpc/router.js.map +1 -1
  295. package/dist/schema/input-types.d.ts +1 -1
  296. package/dist/schema/input-types.d.ts.map +1 -1
  297. package/dist/schema/input-types.js +4 -3
  298. package/dist/schema/input-types.js.map +1 -1
  299. package/dist/schema/modifiers.d.ts +2 -1
  300. package/dist/schema/modifiers.d.ts.map +1 -1
  301. package/dist/schema/modifiers.js +41 -5
  302. package/dist/schema/modifiers.js.map +1 -1
  303. package/dist/schema/relationship-types.d.ts +7 -2
  304. package/dist/schema/relationship-types.js +1 -1
  305. package/dist/schema/type-helpers.d.ts +35 -0
  306. package/dist/schema/type-helpers.d.ts.map +1 -1
  307. package/dist/schema/type-helpers.js +32 -21
  308. package/dist/schema/type-helpers.js.map +1 -1
  309. package/dist/schema/types.d.ts.map +1 -1
  310. package/dist/schema/validators.d.ts +1 -1
  311. package/dist/schema/validators.d.ts.map +1 -1
  312. package/dist/schema/validators.js +27 -16
  313. package/dist/schema/validators.js.map +1 -1
  314. package/dist/services/admin/app-users.service.d.ts +1 -1
  315. package/dist/services/admin/app-users.service.js +31 -38
  316. package/dist/services/admin/auth.service.d.ts +1 -1
  317. package/dist/services/admin/auth.service.js +11 -5
  318. package/dist/services/admin/backup/BackupOrchestrator.d.ts.map +1 -1
  319. package/dist/services/admin/backup/BackupOrchestrator.js +4 -7
  320. package/dist/services/admin/backup/BackupOrchestrator.js.map +1 -1
  321. package/dist/services/admin/backup/StorageStreamer.d.ts +3 -3
  322. package/dist/services/admin/backup/StorageStreamer.d.ts.map +1 -1
  323. package/dist/services/admin/backup/StorageStreamer.js +16 -55
  324. package/dist/services/admin/backup/StorageStreamer.js.map +1 -1
  325. package/dist/services/admin/backup/ZipComposer.d.ts +2 -0
  326. package/dist/services/admin/backup/ZipComposer.d.ts.map +1 -1
  327. package/dist/services/admin/backup/ZipComposer.js +23 -0
  328. package/dist/services/admin/backup/ZipComposer.js.map +1 -1
  329. package/dist/services/admin/backup.service.d.ts.map +1 -1
  330. package/dist/services/admin/backup.service.js.map +1 -1
  331. package/dist/services/admin/data.service.d.ts.map +1 -1
  332. package/dist/services/admin/data.service.js +287 -286
  333. package/dist/services/admin/data.service.js.map +1 -1
  334. package/dist/services/admin/tenants.service.d.ts.map +1 -1
  335. package/dist/services/admin/tenants.service.js.map +1 -1
  336. package/dist/services/auth.service.d.ts +2 -3
  337. package/dist/services/auth.service.js +16 -16
  338. package/dist/services/introspection.service.d.ts.map +1 -1
  339. package/dist/services/introspection.service.js +6 -3
  340. package/dist/services/introspection.service.js.map +1 -1
  341. package/dist/services/invite.service.d.ts +1 -1
  342. package/dist/services/invite.service.js +17 -15
  343. package/dist/services/storage.service.d.ts.map +1 -1
  344. package/dist/services/storage.service.js +35 -4
  345. package/dist/services/storage.service.js.map +1 -1
  346. package/dist/services/system.service.d.ts +4 -0
  347. package/dist/services/system.service.d.ts.map +1 -1
  348. package/dist/services/system.service.js +43 -1
  349. package/dist/services/system.service.js.map +1 -1
  350. package/dist/services/tenant.service.d.ts +1 -1
  351. package/dist/services/tenant.service.js +43 -31
  352. package/dist/sse/subscriptions.controller.d.ts +57 -0
  353. package/dist/sse/subscriptions.controller.d.ts.map +1 -0
  354. package/dist/sse/subscriptions.controller.js +127 -0
  355. package/dist/sse/subscriptions.controller.js.map +1 -0
  356. package/dist/startup/bootstrap.d.ts +13 -2
  357. package/dist/startup/bootstrap.d.ts.map +1 -1
  358. package/dist/startup/bootstrap.js +85 -13
  359. package/dist/startup/bootstrap.js.map +1 -1
  360. package/dist/storage/s3-backend.d.ts.map +1 -1
  361. package/dist/storage/s3-backend.js +3 -3
  362. package/dist/storage/s3-backend.js.map +1 -1
  363. package/dist/websocket/server.d.ts.map +1 -1
  364. package/dist/websocket/server.js +14 -3
  365. package/dist/websocket/server.js.map +1 -1
  366. package/docker/README.md +299 -1
  367. package/package.json +5 -1
  368. package/templates/.env.example +76 -16
  369. package/templates/archlast.config.js +15 -1
  370. package/templates/docker-compose.dev.yml +8 -8
  371. package/templates/docker-compose.prod.yml +29 -12
  372. package/templates/docker-compose.yml +112 -28
@@ -0,0 +1,155 @@
1
+ import { Queue, Job } from "bullmq";
2
+ import type Redis from "ioredis";
3
+ /**
4
+ * Dead Letter Queue entry with rich metadata
5
+ * Provides comprehensive information about failed jobs beyond BullMQ's built-in failed jobs
6
+ */
7
+ export interface DLQEntry {
8
+ /** Original job ID reference */
9
+ originalJobId: string;
10
+ /** Name of the queue the job came from */
11
+ queueName: string;
12
+ /** Name of the job handler/function */
13
+ jobName: string;
14
+ /** Original job payload */
15
+ payload: unknown;
16
+ /** Timestamp when job was moved to DLQ */
17
+ deadLetteredAt: number;
18
+ /** Error categorization for filtering and analysis */
19
+ errorCategory: "timeout" | "validation" | "dependency" | "system";
20
+ /** Detailed diagnostic information */
21
+ diagnostics: {
22
+ /** Error message */
23
+ message: string;
24
+ /** Stack trace (if available) */
25
+ stack?: string;
26
+ /** Timestamp when the error occurred */
27
+ timestamp: number;
28
+ /** Number of attempts made before failing */
29
+ attempts: number;
30
+ };
31
+ /** Number of times this entry has been reprocessed */
32
+ reprocessCount: number;
33
+ /** Whether the entry has been archived (marked as reviewed) */
34
+ archived: boolean;
35
+ }
36
+ /**
37
+ * Options for filtering DLQ entries
38
+ */
39
+ export interface DLQFilterOptions {
40
+ /** Maximum number of entries to return */
41
+ limit?: number;
42
+ /** Number of entries to skip (for pagination) */
43
+ offset?: number;
44
+ /** Filter by error category */
45
+ errorCategory?: string;
46
+ /** Filter by job name */
47
+ jobName?: string;
48
+ /** Filter by archived status */
49
+ archived?: boolean;
50
+ }
51
+ /**
52
+ * Options for reprocessing a DLQ entry
53
+ */
54
+ export interface ReprocessOptions {
55
+ /** New maximum attempts for the reprocessed job */
56
+ newMaxAttempts?: number;
57
+ /** Priority for the reprocessed job */
58
+ priority?: number;
59
+ }
60
+ /**
61
+ * DLQ statistics
62
+ */
63
+ export interface DLQStatistics {
64
+ /** Total number of entries in DLQ */
65
+ total: number;
66
+ /** Count grouped by error category */
67
+ byCategory: Record<string, number>;
68
+ /** Count grouped by job name */
69
+ byJobName: Record<string, number>;
70
+ /** Number of failures in the last 24 hours */
71
+ recentFailures24h: number;
72
+ /** Timestamp of the oldest failure (null if no entries) */
73
+ oldestFailure: number | null;
74
+ }
75
+ /**
76
+ * BullMQ-based Dead Letter Queue Manager
77
+ * Provides rich metadata and management capabilities for failed jobs
78
+ */
79
+ export declare class BullMQDLQManager {
80
+ private dlqQueue;
81
+ private mainQueueName;
82
+ /**
83
+ * Creates a new DLQ manager
84
+ * @param mainQueueName - Name of the main queue (DLQ will be {mainQueueName}-dlq)
85
+ * @param connection - Redis connection for BullMQ
86
+ */
87
+ constructor(mainQueueName: string, connection: Redis);
88
+ /**
89
+ * Add a failed job to the DLQ with rich metadata
90
+ * @param job - The BullMQ job that failed
91
+ * @param error - The error that caused the failure
92
+ * @param errorCategory - Category of the error
93
+ * @returns ID of the created DLQ entry
94
+ */
95
+ addToDLQ(job: Job, error: Error, errorCategory: DLQEntry["errorCategory"]): Promise<string>;
96
+ /**
97
+ * Get DLQ entries with optional filtering
98
+ * @param options - Filter and pagination options
99
+ * @returns Array of DLQ entries matching the criteria
100
+ */
101
+ getDLQJobs(options?: DLQFilterOptions): Promise<DLQEntry[]>;
102
+ /**
103
+ * Get a single DLQ entry by ID
104
+ * @param id - DLQ entry ID
105
+ * @returns DLQ entry or null if not found
106
+ */
107
+ getDLQEntry(id: string): Promise<DLQEntry | null>;
108
+ /**
109
+ * Reprocess a DLQ entry back to the main queue
110
+ * @param dlqEntryId - ID of the DLQ entry to reprocess
111
+ * @param mainQueue - The main BullMQ queue to add the job to
112
+ * @param options - Reprocessing options
113
+ * @returns ID of the new job in the main queue
114
+ */
115
+ reprocessEntry(dlqEntryId: string, mainQueue: Queue, options?: ReprocessOptions): Promise<string>;
116
+ /**
117
+ * Delete a DLQ entry permanently
118
+ * @param id - ID of the DLQ entry to delete
119
+ */
120
+ deleteEntry(id: string): Promise<void>;
121
+ /**
122
+ * Archive a DLQ entry (mark as reviewed)
123
+ * @param id - ID of the DLQ entry to archive
124
+ */
125
+ archiveEntry(id: string): Promise<void>;
126
+ /**
127
+ * Purge old DLQ entries
128
+ * @param olderThanMs - Age threshold in milliseconds (default: 30 days)
129
+ * @returns Number of entries purged
130
+ */
131
+ purgeEntries(olderThanMs?: number): Promise<number>;
132
+ /**
133
+ * Get DLQ statistics
134
+ * @returns Statistics about DLQ entries
135
+ */
136
+ getDLQStats(): Promise<DLQStatistics>;
137
+ /**
138
+ * Map a BullMQ Job to DLQEntry
139
+ * @param job - BullMQ job from the DLQ queue
140
+ * @returns DLQEntry or null if invalid
141
+ */
142
+ private mapJobToDLQEntry;
143
+ /**
144
+ * Close the DLQ queue connection
145
+ */
146
+ dispose(): Promise<void>;
147
+ }
148
+ /**
149
+ * Categorize an error based on its message
150
+ * @param error - Error to categorize
151
+ * @returns Error category: 'timeout' | 'validation' | 'dependency' | 'system'
152
+ */
153
+ export declare function categorizeError(error: Error): DLQEntry["errorCategory"];
154
+ export default BullMQDLQManager;
155
+ //# sourceMappingURL=bullmq-dlq-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bullmq-dlq-manager.d.ts","sourceRoot":"","sources":["../../src/jobs/bullmq-dlq-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,325 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BullMQDLQManager = void 0;
4
+ exports.categorizeError = categorizeError;
5
+ const bullmq_1 = require("bullmq");
6
+ const cuid2_1 = require("@paralleldrive/cuid2");
7
+ const logger_js_1 = require("../logging/logger.js");
8
+ /**
9
+ * BullMQ-based Dead Letter Queue Manager
10
+ * Provides rich metadata and management capabilities for failed jobs
11
+ */
12
+ class BullMQDLQManager {
13
+ dlqQueue;
14
+ mainQueueName;
15
+ /**
16
+ * Creates a new DLQ manager
17
+ * @param mainQueueName - Name of the main queue (DLQ will be {mainQueueName}-dlq)
18
+ * @param connection - Redis connection for BullMQ
19
+ */
20
+ constructor(mainQueueName, connection) {
21
+ this.mainQueueName = mainQueueName;
22
+ const dlqQueueName = `${mainQueueName}-dlq`;
23
+ this.dlqQueue = new bullmq_1.Queue(dlqQueueName, {
24
+ connection,
25
+ defaultJobOptions: {
26
+ removeOnComplete: false,
27
+ removeOnFail: false,
28
+ },
29
+ });
30
+ logger_js_1.logger.log({
31
+ timestamp: Date.now(),
32
+ level: "info",
33
+ kind: "system",
34
+ message: `[BullMQDLQManager] Initialized DLQ queue: ${dlqQueueName}`,
35
+ });
36
+ }
37
+ /**
38
+ * Add a failed job to the DLQ with rich metadata
39
+ * @param job - The BullMQ job that failed
40
+ * @param error - The error that caused the failure
41
+ * @param errorCategory - Category of the error
42
+ * @returns ID of the created DLQ entry
43
+ */
44
+ async addToDLQ(job, error, errorCategory) {
45
+ const now = Date.now();
46
+ const originalJobId = job.id ?? (0, cuid2_1.createId)();
47
+ const dlqEntry = {
48
+ originalJobId,
49
+ queueName: this.mainQueueName,
50
+ jobName: job.name,
51
+ payload: job.data,
52
+ deadLetteredAt: now,
53
+ errorCategory,
54
+ diagnostics: {
55
+ message: error.message,
56
+ stack: error.stack,
57
+ timestamp: now,
58
+ attempts: job.attemptsMade,
59
+ },
60
+ reprocessCount: 0,
61
+ archived: false,
62
+ };
63
+ // Store as BullMQ job in DLQ queue using original job ID for easy lookup
64
+ const dlqJob = await this.dlqQueue.add("dlq-entry", dlqEntry, {
65
+ jobId: originalJobId,
66
+ });
67
+ const dlqEntryId = dlqJob.id ?? originalJobId;
68
+ logger_js_1.logger.log({
69
+ timestamp: Date.now(),
70
+ level: "error",
71
+ kind: "system",
72
+ message: `[BullMQDLQManager] Job added to DLQ: ${dlqEntryId} (${job.name}) - ${errorCategory}: ${error.message}`,
73
+ });
74
+ return dlqEntryId;
75
+ }
76
+ /**
77
+ * Get DLQ entries with optional filtering
78
+ * @param options - Filter and pagination options
79
+ * @returns Array of DLQ entries matching the criteria
80
+ */
81
+ async getDLQJobs(options = {}) {
82
+ const { limit = 100, offset = 0, errorCategory, jobName, archived } = options;
83
+ // Get all DLQ jobs (BullMQ doesn't support offset/limit natively for getJobs)
84
+ const jobs = await this.dlqQueue.getJobs(["waiting", "active", "completed", "failed"]);
85
+ // Map and filter
86
+ let dlqEntries = jobs
87
+ .map((job) => this.mapJobToDLQEntry(job))
88
+ .filter((entry) => entry !== null);
89
+ if (errorCategory) {
90
+ dlqEntries = dlqEntries.filter((entry) => entry.errorCategory === errorCategory);
91
+ }
92
+ if (jobName) {
93
+ dlqEntries = dlqEntries.filter((entry) => entry.jobName === jobName);
94
+ }
95
+ if (archived !== undefined) {
96
+ dlqEntries = dlqEntries.filter((entry) => entry.archived === archived);
97
+ }
98
+ // Sort by deadLetteredAt descending (newest first)
99
+ dlqEntries.sort((a, b) => b.deadLetteredAt - a.deadLetteredAt);
100
+ // Apply pagination
101
+ const paginatedEntries = dlqEntries.slice(offset, offset + limit);
102
+ logger_js_1.logger.log({
103
+ timestamp: Date.now(),
104
+ level: "info",
105
+ kind: "system",
106
+ message: `[BullMQDLQManager] Retrieved ${paginatedEntries.length} DLQ entries (total: ${dlqEntries.length})`,
107
+ });
108
+ return paginatedEntries;
109
+ }
110
+ /**
111
+ * Get a single DLQ entry by ID
112
+ * @param id - DLQ entry ID
113
+ * @returns DLQ entry or null if not found
114
+ */
115
+ async getDLQEntry(id) {
116
+ const job = await this.dlqQueue.getJob(id);
117
+ if (!job)
118
+ return null;
119
+ return this.mapJobToDLQEntry(job);
120
+ }
121
+ /**
122
+ * Reprocess a DLQ entry back to the main queue
123
+ * @param dlqEntryId - ID of the DLQ entry to reprocess
124
+ * @param mainQueue - The main BullMQ queue to add the job to
125
+ * @param options - Reprocessing options
126
+ * @returns ID of the new job in the main queue
127
+ */
128
+ async reprocessEntry(dlqEntryId, mainQueue, options = {}) {
129
+ // Get DLQ entry
130
+ const dlqJob = await this.dlqQueue.getJob(dlqEntryId);
131
+ if (!dlqJob) {
132
+ throw new Error(`DLQ entry not found: ${dlqEntryId}`);
133
+ }
134
+ const dlqEntry = this.mapJobToDLQEntry(dlqJob);
135
+ if (!dlqEntry) {
136
+ throw new Error(`Invalid DLQ entry data for: ${dlqEntryId}`);
137
+ }
138
+ // Add to main queue with same name and payload
139
+ const newJob = await mainQueue.add(dlqEntry.jobName, dlqEntry.payload, {
140
+ attempts: options.newMaxAttempts ?? 5,
141
+ priority: options.priority,
142
+ });
143
+ const newJobId = newJob.id ?? (0, cuid2_1.createId)();
144
+ // Update reprocess count in DLQ entry
145
+ dlqEntry.reprocessCount++;
146
+ // Note: BullMQ doesn't support updating job data directly in a clean way,
147
+ // so we track the reprocess count in memory. For persistence, we would need
148
+ // to remove and re-add, but that changes the ID.
149
+ logger_js_1.logger.log({
150
+ timestamp: Date.now(),
151
+ level: "info",
152
+ kind: "system",
153
+ message: `[BullMQDLQManager] Reprocessed DLQ entry ${dlqEntryId} -> new job ${newJobId}`,
154
+ });
155
+ return newJobId;
156
+ }
157
+ /**
158
+ * Delete a DLQ entry permanently
159
+ * @param id - ID of the DLQ entry to delete
160
+ */
161
+ async deleteEntry(id) {
162
+ const job = await this.dlqQueue.getJob(id);
163
+ if (!job) {
164
+ throw new Error(`DLQ entry not found: ${id}`);
165
+ }
166
+ await job.remove();
167
+ logger_js_1.logger.log({
168
+ timestamp: Date.now(),
169
+ level: "info",
170
+ kind: "system",
171
+ message: `[BullMQDLQManager] Deleted DLQ entry: ${id}`,
172
+ });
173
+ }
174
+ /**
175
+ * Archive a DLQ entry (mark as reviewed)
176
+ * @param id - ID of the DLQ entry to archive
177
+ */
178
+ async archiveEntry(id) {
179
+ const job = await this.dlqQueue.getJob(id);
180
+ if (!job) {
181
+ throw new Error(`DLQ entry not found: ${id}`);
182
+ }
183
+ const entry = job.data;
184
+ entry.archived = true;
185
+ // Note: Similar to reprocess count, we modify in memory
186
+ // A full implementation would need to remove and re-add the job
187
+ logger_js_1.logger.log({
188
+ timestamp: Date.now(),
189
+ level: "info",
190
+ kind: "system",
191
+ message: `[BullMQDLQManager] Archived DLQ entry: ${id}`,
192
+ });
193
+ }
194
+ /**
195
+ * Purge old DLQ entries
196
+ * @param olderThanMs - Age threshold in milliseconds (default: 30 days)
197
+ * @returns Number of entries purged
198
+ */
199
+ async purgeEntries(olderThanMs = 30 * 24 * 60 * 60 * 1000) {
200
+ const now = Date.now();
201
+ const cutoffTime = now - olderThanMs;
202
+ // Get all DLQ jobs
203
+ const jobs = await this.dlqQueue.getJobs(["waiting", "active", "completed", "failed"]);
204
+ // Filter jobs older than cutoff
205
+ const toDelete = jobs.filter((job) => {
206
+ const entry = job.data;
207
+ return entry.deadLetteredAt < cutoffTime;
208
+ });
209
+ // Delete each job
210
+ for (const job of toDelete) {
211
+ await job.remove();
212
+ }
213
+ logger_js_1.logger.log({
214
+ timestamp: Date.now(),
215
+ level: "info",
216
+ kind: "system",
217
+ message: `[BullMQDLQManager] Purged ${toDelete.length} DLQ entries older than ${olderThanMs}ms`,
218
+ });
219
+ return toDelete.length;
220
+ }
221
+ /**
222
+ * Get DLQ statistics
223
+ * @returns Statistics about DLQ entries
224
+ */
225
+ async getDLQStats() {
226
+ const jobs = await this.dlqQueue.getJobs(["waiting", "active", "completed", "failed"]);
227
+ const byCategory = {};
228
+ const byJobName = {};
229
+ const now = Date.now();
230
+ const twentyFourHoursAgo = now - 24 * 60 * 60 * 1000;
231
+ let oldestFailure = null;
232
+ let recentFailures24h = 0;
233
+ for (const job of jobs) {
234
+ const entry = job.data;
235
+ // Count by category
236
+ const category = entry.errorCategory ?? "system";
237
+ byCategory[category] = (byCategory[category] ?? 0) + 1;
238
+ // Count by job name
239
+ const name = entry.jobName ?? "unnamed";
240
+ byJobName[name] = (byJobName[name] ?? 0) + 1;
241
+ // Track oldest failure
242
+ const deadLetteredAt = entry.deadLetteredAt ?? now;
243
+ if (oldestFailure === null || deadLetteredAt < oldestFailure) {
244
+ oldestFailure = deadLetteredAt;
245
+ }
246
+ // Count recent failures
247
+ if (deadLetteredAt >= twentyFourHoursAgo) {
248
+ recentFailures24h++;
249
+ }
250
+ }
251
+ return {
252
+ total: jobs.length,
253
+ byCategory,
254
+ byJobName,
255
+ recentFailures24h,
256
+ oldestFailure,
257
+ };
258
+ }
259
+ /**
260
+ * Map a BullMQ Job to DLQEntry
261
+ * @param job - BullMQ job from the DLQ queue
262
+ * @returns DLQEntry or null if invalid
263
+ */
264
+ mapJobToDLQEntry(job) {
265
+ const data = job.data;
266
+ if (!data || typeof data !== "object") {
267
+ return null;
268
+ }
269
+ return {
270
+ originalJobId: data.originalJobId ?? job.id ?? (0, cuid2_1.createId)(),
271
+ queueName: data.queueName ?? this.mainQueueName,
272
+ jobName: data.jobName ?? "unknown",
273
+ payload: data.payload,
274
+ deadLetteredAt: data.deadLetteredAt ?? Date.now(),
275
+ errorCategory: data.errorCategory ?? "system",
276
+ diagnostics: data.diagnostics ?? {
277
+ message: "Unknown error",
278
+ timestamp: Date.now(),
279
+ attempts: 0,
280
+ },
281
+ reprocessCount: data.reprocessCount ?? 0,
282
+ archived: data.archived ?? false,
283
+ };
284
+ }
285
+ /**
286
+ * Close the DLQ queue connection
287
+ */
288
+ async dispose() {
289
+ await this.dlqQueue.close();
290
+ logger_js_1.logger.log({
291
+ timestamp: Date.now(),
292
+ level: "info",
293
+ kind: "system",
294
+ message: `[BullMQDLQManager] Disposed DLQ queue: ${this.mainQueueName}-dlq`,
295
+ });
296
+ }
297
+ }
298
+ exports.BullMQDLQManager = BullMQDLQManager;
299
+ /**
300
+ * Categorize an error based on its message
301
+ * @param error - Error to categorize
302
+ * @returns Error category: 'timeout' | 'validation' | 'dependency' | 'system'
303
+ */
304
+ function categorizeError(error) {
305
+ if (!error || !error.message) {
306
+ return "system";
307
+ }
308
+ const message = error.message.toLowerCase();
309
+ // Check for timeout errors
310
+ if (message.includes("timeout") || message.includes("timed out")) {
311
+ return "timeout";
312
+ }
313
+ // Check for validation errors
314
+ if (message.includes("validation") || message.includes("invalid")) {
315
+ return "validation";
316
+ }
317
+ // Check for dependency errors
318
+ if (message.includes("dependency") || message.includes("depends on")) {
319
+ return "dependency";
320
+ }
321
+ // Default to system error
322
+ return "system";
323
+ }
324
+ exports.default = BullMQDLQManager;
325
+ //# sourceMappingURL=bullmq-dlq-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bullmq-dlq-manager.js","sourceRoot":"","sources":["../../src/jobs/bullmq-dlq-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ import type { Redis } from "ioredis";
2
+ import { Registry } from "prom-client";
3
+ /**
4
+ * Metrics data structure for BullMQ queue operations
5
+ */
6
+ export interface BullMQMetrics {
7
+ jobsCompleted: number;
8
+ jobsFailed: number;
9
+ jobsDelayed: number;
10
+ jobsStalled: number;
11
+ processingTimeMs: number[];
12
+ queueWaitTimeMs: number[];
13
+ pendingJobs: number;
14
+ activeJobs: number;
15
+ completedJobs: number;
16
+ failedJobs: number;
17
+ delayedJobs: number;
18
+ errorTypes: Record<string, number>;
19
+ }
20
+ /**
21
+ * Options for the BullMQMetricsCollector
22
+ */
23
+ export interface BullMQMetricsCollectorOptions {
24
+ /** Prometheus registry to register metrics with */
25
+ prometheusRegistry?: Registry;
26
+ /** Enable histogram collection for timing metrics */
27
+ enableHistograms?: boolean;
28
+ /** Interval in ms for updating gauge values (default: 10000) */
29
+ gaugeUpdateIntervalMs?: number;
30
+ }
31
+ /**
32
+ * Collects metrics from BullMQ queues and exports to Prometheus.
33
+ * Tracks job lifecycle events, processing times, and queue state.
34
+ */
35
+ export declare class BullMQMetricsCollector {
36
+ private queueEvents;
37
+ private metrics;
38
+ private startTimes;
39
+ private queue;
40
+ private gaugeUpdateInterval;
41
+ private options;
42
+ private prometheusMetrics;
43
+ constructor(queueName: string, connection: Redis, options?: BullMQMetricsCollectorOptions);
44
+ /**
45
+ * Creates an empty metrics object with initial values
46
+ */
47
+ private createEmptyMetrics;
48
+ /**
49
+ * Sets up Prometheus metrics with the registry
50
+ */
51
+ private setupPrometheusMetrics;
52
+ /**
53
+ * Categorizes error messages into types for metrics
54
+ */
55
+ private categorizeError;
56
+ /**
57
+ * Gets the job name from the job object or returns 'unknown'
58
+ */
59
+ private getJobName;
60
+ /**
61
+ * Starts collecting metrics from the queue.
62
+ * Sets up event listeners and begins periodic gauge updates.
63
+ */
64
+ start(): Promise<void>;
65
+ /**
66
+ * Stops collecting metrics and cleans up resources.
67
+ */
68
+ stop(): Promise<void>;
69
+ /**
70
+ * Gets a snapshot of the current metrics.
71
+ */
72
+ getMetrics(): BullMQMetrics;
73
+ /**
74
+ * Resets all metrics to their initial values.
75
+ */
76
+ reset(): void;
77
+ /**
78
+ * Updates gauge values by fetching current queue state.
79
+ */
80
+ updateGauges(): Promise<void>;
81
+ /**
82
+ * Gets the Prometheus registry associated with this collector.
83
+ */
84
+ getPrometheusRegistry(): Registry;
85
+ }
86
+ /**
87
+ * Convenience function to set up a BullMQ metrics collector with Prometheus export.
88
+ *
89
+ * @param queueName - Name of the BullMQ queue to monitor
90
+ * @param connection - Redis connection (optional, will create default if not provided)
91
+ * @param register - Prometheus registry to use
92
+ * @returns Configured BullMQMetricsCollector instance
93
+ *
94
+ * @example
95
+ * ```typescript
96
+ * const collector = setupBullMQPrometheusExporter('my-queue', redis, register);
97
+ * await collector.start();
98
+ *
99
+ * // Later...
100
+ * await collector.stop();
101
+ * ```
102
+ */
103
+ export declare function setupBullMQPrometheusExporter(queueName: string, connection: Redis, register: Registry): BullMQMetricsCollector;
104
+ //# sourceMappingURL=bullmq-metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bullmq-metrics.d.ts","sourceRoot":"","sources":["../../src/jobs/bullmq-metrics.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAA6B,MAAM,aAAa,CAAC;AAGlE;;GAEG;AACH,MAAM,WAAW,aAAa;IAE1B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IAGpB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,eAAe,EAAE,MAAM,EAAE,CAAC;IAG1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IAGpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC1C,mDAAmD;IACnD,kBAAkB,CAAC,EAAE,QAAQ,CAAC;IAC9B,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gEAAgE;IAChE,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED;;;GAGG;AACH,qBAAa,sBAAsB;IAC/B,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,mBAAmB,CAA+B;IAC1D,OAAO,CAAC,OAAO,CAA0C;IAGzD,OAAO,CAAC,iBAAiB,CAUT;gBAEJ,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,GAAE,6BAAkC;IAc7F;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAuE9B;;OAEG;IACH,OAAO,CAAC,eAAe;IAsBvB;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmH5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB3B;;OAEG;IACH,UAAU,IAAI,aAAa;IAI3B;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BnC;;OAEG;IACH,qBAAqB,IAAI,QAAQ;CAGpC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,6BAA6B,CACzC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,KAAK,EACjB,QAAQ,EAAE,QAAQ,GACnB,sBAAsB,CAKxB"}