@archlast/server 0.1.8 → 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 (347) hide show
  1. package/README.md +104 -100
  2. package/dist/admin/auth.d.ts +24 -5
  3. package/dist/admin/auth.js +49 -25
  4. package/dist/admin/schema.d.ts +122 -32
  5. package/dist/admin/schema.js +131 -95
  6. package/dist/admin/seed.d.ts +1 -1
  7. package/dist/admin/seed.js +79 -47
  8. package/dist/auth/api-key-resolver.d.ts +1 -1
  9. package/dist/auth/api-key-resolver.js +7 -3
  10. package/dist/auth/archlast-auth-adapter.d.ts +2 -5
  11. package/dist/auth/archlast-auth-adapter.js +1 -1
  12. package/dist/auth/better-auth-adapter.d.ts.map +1 -1
  13. package/dist/auth/better-auth-adapter.js +41 -26
  14. package/dist/auth/better-auth-adapter.js.map +1 -1
  15. package/dist/auth/better-auth-admin.d.ts.map +1 -1
  16. package/dist/auth/better-auth-admin.js +1 -1
  17. package/dist/auth/better-auth-admin.js.map +1 -1
  18. package/dist/auth/better-auth-api-key-resolver.js +1 -1
  19. package/dist/auth/better-auth-api-key-resolver.js.map +1 -1
  20. package/dist/auth/better-auth-instance.d.ts +249 -301
  21. package/dist/auth/better-auth-instance.d.ts.map +1 -1
  22. package/dist/auth/better-auth-instance.js +11 -0
  23. package/dist/auth/better-auth-instance.js.map +1 -1
  24. package/dist/auth/better-auth-seed.d.ts +5 -2
  25. package/dist/auth/better-auth-seed.js +31 -22
  26. package/dist/auth/better-auth-session-adapter.d.ts.map +1 -1
  27. package/dist/auth/better-auth-session-adapter.js +14 -10
  28. package/dist/auth/better-auth-session-adapter.js.map +1 -1
  29. package/dist/auth/errors.d.ts.map +1 -1
  30. package/dist/auth/errors.js +11 -11
  31. package/dist/auth/errors.js.map +1 -1
  32. package/dist/auth/oauth-proxy.d.ts +5 -2
  33. package/dist/auth/oauth-proxy.js +23 -27
  34. package/dist/auth/resolver.d.ts.map +1 -1
  35. package/dist/auth/resolver.js.map +1 -1
  36. package/dist/auth/role-helpers.d.ts +1 -1
  37. package/dist/auth/role-helpers.d.ts.map +1 -1
  38. package/dist/auth/role-helpers.js.map +1 -1
  39. package/dist/auth/session-manager.d.ts +2 -5
  40. package/dist/auth/session-manager.js +16 -6
  41. package/dist/auth/system/better-auth-schema.d.ts.map +1 -1
  42. package/dist/auth/system/better-auth-schema.js +6 -23
  43. package/dist/auth/system/better-auth-schema.js.map +1 -1
  44. package/dist/cache/circuit-breaker.d.ts +81 -0
  45. package/dist/cache/circuit-breaker.d.ts.map +1 -0
  46. package/dist/cache/circuit-breaker.js +170 -0
  47. package/dist/cache/circuit-breaker.js.map +1 -0
  48. package/dist/cache/client.d.ts +6 -3
  49. package/dist/cache/client.d.ts.map +1 -1
  50. package/dist/cache/client.js +12 -53
  51. package/dist/cache/client.js.map +1 -1
  52. package/dist/cache/index.d.ts +2 -0
  53. package/dist/cache/index.d.ts.map +1 -1
  54. package/dist/cache/index.js +5 -1
  55. package/dist/cache/index.js.map +1 -1
  56. package/dist/cache/invalidation-queue.d.ts +63 -0
  57. package/dist/cache/invalidation-queue.d.ts.map +1 -0
  58. package/dist/cache/invalidation-queue.js +196 -0
  59. package/dist/cache/invalidation-queue.js.map +1 -0
  60. package/dist/cache/layers.d.ts +14 -4
  61. package/dist/cache/layers.d.ts.map +1 -1
  62. package/dist/cache/layers.js +66 -72
  63. package/dist/cache/layers.js.map +1 -1
  64. package/dist/cache/manager.d.ts.map +1 -1
  65. package/dist/cache/manager.js +6 -41
  66. package/dist/cache/manager.js.map +1 -1
  67. package/dist/cache/protocol.d.ts +4 -39
  68. package/dist/cache/protocol.d.ts.map +1 -1
  69. package/dist/cache/protocol.js.map +1 -1
  70. package/dist/cache/redis-adapter.d.ts +103 -0
  71. package/dist/cache/redis-adapter.d.ts.map +1 -0
  72. package/dist/cache/redis-adapter.js +424 -0
  73. package/dist/cache/redis-adapter.js.map +1 -0
  74. package/dist/cache/run-sidecar.js +10 -1
  75. package/dist/cache/run-sidecar.js.map +1 -1
  76. package/dist/cache/sidecar-server.d.ts +51 -1
  77. package/dist/cache/sidecar-server.d.ts.map +1 -1
  78. package/dist/cache/sidecar-server.js +368 -22
  79. package/dist/cache/sidecar-server.js.map +1 -1
  80. package/dist/cache/store.d.ts +43 -0
  81. package/dist/cache/store.d.ts.map +1 -1
  82. package/dist/cache/store.js +69 -76
  83. package/dist/cache/store.js.map +1 -1
  84. package/dist/cache/strategies.d.ts +2 -9
  85. package/dist/cache/strategies.d.ts.map +1 -1
  86. package/dist/cache/types.d.ts +130 -0
  87. package/dist/cache/types.d.ts.map +1 -0
  88. package/dist/cache/types.js +60 -0
  89. package/dist/cache/types.js.map +1 -0
  90. package/dist/config/bullmq.d.ts +16 -0
  91. package/dist/config/bullmq.d.ts.map +1 -0
  92. package/dist/config/bullmq.js +103 -0
  93. package/dist/config/bullmq.js.map +1 -0
  94. package/dist/config/index.d.ts +1 -0
  95. package/dist/config/index.d.ts.map +1 -1
  96. package/dist/config/index.js +1 -0
  97. package/dist/config/index.js.map +1 -1
  98. package/dist/config/schema.d.ts +80 -6
  99. package/dist/config/schema.d.ts.map +1 -1
  100. package/dist/config/schema.js +71 -6
  101. package/dist/config/schema.js.map +1 -1
  102. package/dist/config/service.d.ts +54 -4
  103. package/dist/config/service.d.ts.map +1 -1
  104. package/dist/config/service.js +56 -2
  105. package/dist/config/service.js.map +1 -1
  106. package/dist/controllers/admin/admin-tokens.controller.d.ts +131 -115
  107. package/dist/controllers/admin/admin-tokens.controller.js +117 -98
  108. package/dist/controllers/admin/api-keys.controller.d.ts +1 -1
  109. package/dist/controllers/admin/api-keys.controller.d.ts.map +1 -1
  110. package/dist/controllers/admin/api-keys.controller.js.map +1 -1
  111. package/dist/controllers/admin/app-users.controller.d.ts +274 -243
  112. package/dist/controllers/admin/app-users.controller.js +301 -257
  113. package/dist/controllers/admin/auth.controller.d.ts +260 -236
  114. package/dist/controllers/admin/auth.controller.js +197 -174
  115. package/dist/controllers/admin/backup.controller.d.ts.map +1 -1
  116. package/dist/controllers/admin/backup.controller.js.map +1 -1
  117. package/dist/controllers/admin/settings.controller.d.ts +1 -1
  118. package/dist/controllers/admin/storage-stats.controller.d.ts +63 -0
  119. package/dist/controllers/admin/storage-stats.controller.d.ts.map +1 -0
  120. package/dist/controllers/admin/storage-stats.controller.js +33 -0
  121. package/dist/controllers/admin/storage-stats.controller.js.map +1 -0
  122. package/dist/controllers/admin/tenants.controller.d.ts.map +1 -1
  123. package/dist/controllers/admin/tenants.controller.js.map +1 -1
  124. package/dist/controllers/admin/users.controller.d.ts +1 -1
  125. package/dist/controllers/admin/users.controller.d.ts.map +1 -1
  126. package/dist/controllers/admin/users.controller.js.map +1 -1
  127. package/dist/controllers/auth.controller.d.ts +289 -271
  128. package/dist/controllers/auth.controller.js +275 -226
  129. package/dist/controllers/crud-generator.controller.d.ts.map +1 -1
  130. package/dist/controllers/crud-generator.controller.js +127 -125
  131. package/dist/controllers/crud-generator.controller.js.map +1 -1
  132. package/dist/controllers/index.d.ts +1 -1
  133. package/dist/controllers/index.d.ts.map +1 -1
  134. package/dist/controllers/index.js.map +1 -1
  135. package/dist/controllers/introspection.controller.d.ts +642 -0
  136. package/dist/controllers/introspection.controller.d.ts.map +1 -1
  137. package/dist/controllers/introspection.controller.js +611 -0
  138. package/dist/controllers/introspection.controller.js.map +1 -1
  139. package/dist/controllers/invite.controller.d.ts +190 -170
  140. package/dist/controllers/invite.controller.js +183 -164
  141. package/dist/controllers/mfa.controller.d.ts +205 -183
  142. package/dist/controllers/mfa.controller.js +131 -111
  143. package/dist/controllers/otp.controller.d.ts +194 -171
  144. package/dist/controllers/otp.controller.js +192 -175
  145. package/dist/controllers/storage.controller.d.ts.map +1 -1
  146. package/dist/controllers/storage.controller.js.map +1 -1
  147. package/dist/controllers/system.controller.d.ts +5 -3
  148. package/dist/controllers/system.controller.d.ts.map +1 -1
  149. package/dist/controllers/system.controller.js +4 -2
  150. package/dist/controllers/system.controller.js.map +1 -1
  151. package/dist/controllers/tenant.controller.d.ts +258 -227
  152. package/dist/controllers/tenant.controller.js +224 -200
  153. package/dist/db/cachedclient.d.ts +6 -11
  154. package/dist/db/cachedclient.d.ts.map +1 -1
  155. package/dist/db/cachedclient.js +79 -43
  156. package/dist/db/cachedclient.js.map +1 -1
  157. package/dist/db/distributed-client.d.ts +79 -24
  158. package/dist/db/distributed-client.js +23 -24
  159. package/dist/db/factory.d.ts +3 -8
  160. package/dist/db/factory.d.ts.map +1 -1
  161. package/dist/db/factory.js +3 -22
  162. package/dist/db/factory.js.map +1 -1
  163. package/dist/db/socket-client.d.ts +7 -0
  164. package/dist/db/socket-client.d.ts.map +1 -1
  165. package/dist/db/socket-client.js +140 -11
  166. package/dist/db/socket-client.js.map +1 -1
  167. package/dist/deployment/handler.d.ts +10 -2
  168. package/dist/deployment/handler.d.ts.map +1 -1
  169. package/dist/deployment/handler.js +70 -15
  170. package/dist/deployment/handler.js.map +1 -1
  171. package/dist/deployment/persistence.d.ts.map +1 -1
  172. package/dist/deployment/persistence.js +6 -1
  173. package/dist/deployment/persistence.js.map +1 -1
  174. package/dist/docker/compose.d.ts.map +1 -1
  175. package/dist/docker/compose.js +76 -0
  176. package/dist/docker/compose.js.map +1 -1
  177. package/dist/engine/runner.d.ts.map +1 -1
  178. package/dist/engine/runner.js +0 -43
  179. package/dist/engine/runner.js.map +1 -1
  180. package/dist/functions/built-in/auth-apikey.d.ts.map +1 -1
  181. package/dist/functions/built-in/auth-apikey.js.map +1 -1
  182. package/dist/functions/built-in/system-cache.d.ts.map +1 -1
  183. package/dist/functions/built-in/system-cache.js +6 -31
  184. package/dist/functions/built-in/system-cache.js.map +1 -1
  185. package/dist/functions/built-in/system-data.d.ts.map +1 -1
  186. package/dist/functions/built-in/system-data.js +4 -2
  187. package/dist/functions/built-in/system-data.js.map +1 -1
  188. package/dist/functions/definition.d.ts.map +1 -1
  189. package/dist/functions/definition.js +6 -2
  190. package/dist/functions/definition.js.map +1 -1
  191. package/dist/http/routes/metrics.d.ts +42 -0
  192. package/dist/http/routes/metrics.d.ts.map +1 -0
  193. package/dist/http/routes/metrics.js +29 -0
  194. package/dist/http/routes/metrics.js.map +1 -0
  195. package/dist/http/server.d.ts +1 -0
  196. package/dist/http/server.d.ts.map +1 -1
  197. package/dist/http/server.js +41 -3
  198. package/dist/http/server.js.map +1 -1
  199. package/dist/ipc/socket-bridge.d.ts +1 -0
  200. package/dist/ipc/socket-bridge.d.ts.map +1 -1
  201. package/dist/ipc/socket-bridge.js +5 -1
  202. package/dist/ipc/socket-bridge.js.map +1 -1
  203. package/dist/jobs/bullmq-adapter.d.ts +154 -0
  204. package/dist/jobs/bullmq-adapter.d.ts.map +1 -0
  205. package/dist/jobs/bullmq-adapter.js +688 -0
  206. package/dist/jobs/bullmq-adapter.js.map +1 -0
  207. package/dist/jobs/bullmq-circuit-breaker.d.ts +133 -0
  208. package/dist/jobs/bullmq-circuit-breaker.d.ts.map +1 -0
  209. package/dist/jobs/bullmq-circuit-breaker.js +323 -0
  210. package/dist/jobs/bullmq-circuit-breaker.js.map +1 -0
  211. package/dist/jobs/bullmq-dlq-manager.d.ts +155 -0
  212. package/dist/jobs/bullmq-dlq-manager.d.ts.map +1 -0
  213. package/dist/jobs/bullmq-dlq-manager.js +325 -0
  214. package/dist/jobs/bullmq-dlq-manager.js.map +1 -0
  215. package/dist/jobs/bullmq-metrics.d.ts +104 -0
  216. package/dist/jobs/bullmq-metrics.d.ts.map +1 -0
  217. package/dist/jobs/bullmq-metrics.js +323 -0
  218. package/dist/jobs/bullmq-metrics.js.map +1 -0
  219. package/dist/jobs/bullmq-priority-service.d.ts +173 -0
  220. package/dist/jobs/bullmq-priority-service.d.ts.map +1 -0
  221. package/dist/jobs/bullmq-priority-service.js +390 -0
  222. package/dist/jobs/bullmq-priority-service.js.map +1 -0
  223. package/dist/jobs/bullmq-scheduler.d.ts +111 -0
  224. package/dist/jobs/bullmq-scheduler.d.ts.map +1 -0
  225. package/dist/jobs/bullmq-scheduler.js +300 -0
  226. package/dist/jobs/bullmq-scheduler.js.map +1 -0
  227. package/dist/jobs/bullmq-worker.d.ts +155 -0
  228. package/dist/jobs/bullmq-worker.d.ts.map +1 -0
  229. package/dist/jobs/bullmq-worker.js +651 -0
  230. package/dist/jobs/bullmq-worker.js.map +1 -0
  231. package/dist/jobs/circuit-breaker.d.ts +120 -0
  232. package/dist/jobs/circuit-breaker.d.ts.map +1 -0
  233. package/dist/jobs/circuit-breaker.js +262 -0
  234. package/dist/jobs/circuit-breaker.js.map +1 -0
  235. package/dist/jobs/index.d.ts +1 -1
  236. package/dist/jobs/index.d.ts.map +1 -1
  237. package/dist/jobs/index.js.map +1 -1
  238. package/dist/jobs/queue.d.ts +120 -1
  239. package/dist/jobs/queue.d.ts.map +1 -1
  240. package/dist/jobs/queue.js +487 -9
  241. package/dist/jobs/queue.js.map +1 -1
  242. package/dist/jobs/redis-connection.d.ts +50 -0
  243. package/dist/jobs/redis-connection.d.ts.map +1 -0
  244. package/dist/jobs/redis-connection.js +123 -0
  245. package/dist/jobs/redis-connection.js.map +1 -0
  246. package/dist/jobs/run-scheduler.js +163 -10
  247. package/dist/jobs/run-scheduler.js.map +1 -1
  248. package/dist/jobs/run-worker.js +101 -9
  249. package/dist/jobs/run-worker.js.map +1 -1
  250. package/dist/jobs/worker-thread.d.ts +6 -0
  251. package/dist/jobs/worker-thread.d.ts.map +1 -1
  252. package/dist/jobs/worker-thread.js +37 -8
  253. package/dist/jobs/worker-thread.js.map +1 -1
  254. package/dist/jobs/worker.d.ts +33 -0
  255. package/dist/jobs/worker.d.ts.map +1 -1
  256. package/dist/jobs/worker.js +358 -115
  257. package/dist/jobs/worker.js.map +1 -1
  258. package/dist/linq/async-enumerable.d.ts.map +1 -1
  259. package/dist/linq/async-enumerable.js.map +1 -1
  260. package/dist/linq/enumerable.d.ts.map +1 -1
  261. package/dist/linq/enumerable.js +10 -10
  262. package/dist/linq/enumerable.js.map +1 -1
  263. package/dist/metrics/collector.d.ts +26 -0
  264. package/dist/metrics/collector.d.ts.map +1 -0
  265. package/dist/metrics/collector.js +103 -0
  266. package/dist/metrics/collector.js.map +1 -0
  267. package/dist/polling/updates.controller.d.ts +57 -0
  268. package/dist/polling/updates.controller.d.ts.map +1 -0
  269. package/dist/polling/updates.controller.js +70 -0
  270. package/dist/polling/updates.controller.js.map +1 -0
  271. package/dist/repository/db-set.d.ts.map +1 -1
  272. package/dist/repository/db-set.js +12 -8
  273. package/dist/repository/db-set.js.map +1 -1
  274. package/dist/repository/ef-core.d.ts.map +1 -1
  275. package/dist/repository/ef-core.js +6 -6
  276. package/dist/repository/ef-core.js.map +1 -1
  277. package/dist/repository/factory.d.ts +1 -1
  278. package/dist/repository/factory.d.ts.map +1 -1
  279. package/dist/repository/factory.js.map +1 -1
  280. package/dist/repository/interfaces.d.ts.map +1 -1
  281. package/dist/repository/interfaces.js.map +1 -1
  282. package/dist/repository/queryable.d.ts.map +1 -1
  283. package/dist/repository/queryable.js.map +1 -1
  284. package/dist/rpc/adapter.d.ts.map +1 -1
  285. package/dist/rpc/adapter.js.map +1 -1
  286. package/dist/rpc/router.d.ts +2 -2
  287. package/dist/rpc/router.d.ts.map +1 -1
  288. package/dist/rpc/router.js +1 -1
  289. package/dist/rpc/router.js.map +1 -1
  290. package/dist/schema/relationship-types.d.ts +7 -2
  291. package/dist/schema/relationship-types.js +1 -1
  292. package/dist/schema/types.d.ts.map +1 -1
  293. package/dist/services/admin/app-users.service.d.ts +1 -1
  294. package/dist/services/admin/app-users.service.js +31 -38
  295. package/dist/services/admin/auth.service.d.ts +1 -1
  296. package/dist/services/admin/auth.service.js +11 -5
  297. package/dist/services/admin/backup/BackupOrchestrator.d.ts.map +1 -1
  298. package/dist/services/admin/backup/BackupOrchestrator.js +4 -7
  299. package/dist/services/admin/backup/BackupOrchestrator.js.map +1 -1
  300. package/dist/services/admin/backup/SqliteGenerator.js +8 -8
  301. package/dist/services/admin/backup/StorageStreamer.d.ts +3 -3
  302. package/dist/services/admin/backup/StorageStreamer.d.ts.map +1 -1
  303. package/dist/services/admin/backup/StorageStreamer.js +16 -55
  304. package/dist/services/admin/backup/StorageStreamer.js.map +1 -1
  305. package/dist/services/admin/backup/ZipComposer.d.ts +2 -0
  306. package/dist/services/admin/backup/ZipComposer.d.ts.map +1 -1
  307. package/dist/services/admin/backup/ZipComposer.js +23 -0
  308. package/dist/services/admin/backup/ZipComposer.js.map +1 -1
  309. package/dist/services/admin/backup.service.d.ts.map +1 -1
  310. package/dist/services/admin/backup.service.js.map +1 -1
  311. package/dist/services/admin/data.service.d.ts.map +1 -1
  312. package/dist/services/admin/data.service.js +287 -286
  313. package/dist/services/admin/data.service.js.map +1 -1
  314. package/dist/services/admin/tenants.service.d.ts.map +1 -1
  315. package/dist/services/admin/tenants.service.js.map +1 -1
  316. package/dist/services/auth.service.d.ts +2 -3
  317. package/dist/services/auth.service.js +16 -16
  318. package/dist/services/invite.service.d.ts +1 -1
  319. package/dist/services/invite.service.js +17 -15
  320. package/dist/services/storage.service.d.ts.map +1 -1
  321. package/dist/services/storage.service.js +35 -4
  322. package/dist/services/storage.service.js.map +1 -1
  323. package/dist/services/system.service.d.ts.map +1 -1
  324. package/dist/services/system.service.js +1 -1
  325. package/dist/services/system.service.js.map +1 -1
  326. package/dist/services/tenant.service.d.ts +1 -1
  327. package/dist/services/tenant.service.js +43 -31
  328. package/dist/sse/subscriptions.controller.d.ts +57 -0
  329. package/dist/sse/subscriptions.controller.d.ts.map +1 -0
  330. package/dist/sse/subscriptions.controller.js +127 -0
  331. package/dist/sse/subscriptions.controller.js.map +1 -0
  332. package/dist/startup/bootstrap.d.ts +13 -2
  333. package/dist/startup/bootstrap.d.ts.map +1 -1
  334. package/dist/startup/bootstrap.js +85 -13
  335. package/dist/startup/bootstrap.js.map +1 -1
  336. package/dist/storage/s3-backend.d.ts.map +1 -1
  337. package/dist/storage/s3-backend.js +3 -3
  338. package/dist/storage/s3-backend.js.map +1 -1
  339. package/dist/websocket/server.d.ts.map +1 -1
  340. package/dist/websocket/server.js +14 -3
  341. package/dist/websocket/server.js.map +1 -1
  342. package/docker/README.md +309 -11
  343. package/package.json +214 -210
  344. package/templates/.env.example +115 -55
  345. package/templates/archlast.config.js +51 -37
  346. package/templates/docker-compose.prod.yml +32 -15
  347. package/templates/docker-compose.yml +117 -33
@@ -13,6 +13,7 @@ const role_helpers_js_1 = require("../auth/role-helpers.js");
13
13
  const introspection_service_js_1 = require("../services/introspection.service.js");
14
14
  const context_helper_js_1 = require("../http/context-helper.js");
15
15
  const deployment_events_controller_js_1 = require("./deployment-events.controller.js");
16
+ const queue_js_1 = require("../jobs/queue.js");
16
17
  // Input schemas
17
18
  const TriggerJobSchema = elysia_1.t.Object({
18
19
  name: elysia_1.t.String(),
@@ -22,6 +23,10 @@ const TriggerJobSchema = elysia_1.t.Object({
22
23
  const UpdateSchemaBody = elysia_1.t.Object({
23
24
  source: elysia_1.t.String(),
24
25
  });
26
+ const UpdateJobPrioritySchema = elysia_1.t.Object({
27
+ jobId: elysia_1.t.String(),
28
+ priority: elysia_1.t.Number(),
29
+ });
25
30
  // Create singleton service instance
26
31
  const introspectionService = (0, introspection_service_js_1.createIntrospectionService)();
27
32
  exports.introspectionController = new elysia_1.Elysia({ tags: ["Introspection"] })
@@ -371,5 +376,611 @@ exports.introspectionController = new elysia_1.Elysia({ tags: ["Introspection"]
371
376
  return introspectionService.getWebhooks({ deploymentHandler });
372
377
  }, {
373
378
  detail: { summary: "List webhooks" },
379
+ })
380
+ /**
381
+ * GET /_archlast/introspect/jobs/dlq
382
+ * List DLQ jobs with filtering and pagination
383
+ */
384
+ .get("/introspect/jobs/dlq", async (ctx) => {
385
+ const { rawDb, query, request, set } = (0, context_helper_js_1.getCtx)(ctx);
386
+ const auth = await (0, role_helpers_js_1.requireAdmin)((0, context_helper_js_1.getBetterAuth)(), request);
387
+ if (!auth) {
388
+ set.status = 401;
389
+ return { error: "Unauthorized" };
390
+ }
391
+ try {
392
+ const queue = new queue_js_1.JobQueue({ db: rawDb });
393
+ const limit = query.limit ? parseInt(query.limit) : 50;
394
+ const offset = query.offset ? parseInt(query.offset) : 0;
395
+ const errorCategory = query.errorCategory;
396
+ const jobName = query.jobName;
397
+ // Validate limit and offset
398
+ if (isNaN(limit) || limit < 1 || limit > 100) {
399
+ set.status = 400;
400
+ return {
401
+ success: false,
402
+ error: "Invalid limit. Must be between 1 and 100.",
403
+ };
404
+ }
405
+ if (isNaN(offset) || offset < 0) {
406
+ set.status = 400;
407
+ return {
408
+ success: false,
409
+ error: "Invalid offset. Must be non-negative.",
410
+ };
411
+ }
412
+ const jobs = await queue.getDLQJobs({
413
+ limit,
414
+ offset,
415
+ errorCategory,
416
+ jobName,
417
+ });
418
+ return {
419
+ success: true,
420
+ data: jobs,
421
+ meta: {
422
+ limit,
423
+ offset,
424
+ count: jobs.length,
425
+ },
426
+ };
427
+ }
428
+ catch (error) {
429
+ set.status = 500;
430
+ return {
431
+ success: false,
432
+ error: error instanceof Error ? error.message : "Failed to list DLQ jobs",
433
+ };
434
+ }
435
+ }, {
436
+ query: elysia_1.t.Object({
437
+ limit: elysia_1.t.Optional(elysia_1.t.String()),
438
+ offset: elysia_1.t.Optional(elysia_1.t.String()),
439
+ errorCategory: elysia_1.t.Optional(elysia_1.t.String()),
440
+ jobName: elysia_1.t.Optional(elysia_1.t.String()),
441
+ }),
442
+ detail: { summary: "List DLQ jobs" },
443
+ })
444
+ /**
445
+ * GET /_archlast/introspect/jobs/dlq/stats
446
+ * Get DLQ statistics
447
+ */
448
+ .get("/introspect/jobs/dlq/stats", async (ctx) => {
449
+ const { rawDb, request, set } = (0, context_helper_js_1.getCtx)(ctx);
450
+ const auth = await (0, role_helpers_js_1.requireAdmin)((0, context_helper_js_1.getBetterAuth)(), request);
451
+ if (!auth) {
452
+ set.status = 401;
453
+ return { error: "Unauthorized" };
454
+ }
455
+ try {
456
+ const queue = new queue_js_1.JobQueue({ db: rawDb });
457
+ const stats = await queue.getDLQStats();
458
+ return {
459
+ success: true,
460
+ data: stats,
461
+ };
462
+ }
463
+ catch (error) {
464
+ set.status = 500;
465
+ return {
466
+ success: false,
467
+ error: error instanceof Error ? error.message : "Failed to get DLQ statistics",
468
+ };
469
+ }
470
+ }, {
471
+ detail: { summary: "Get DLQ statistics" },
472
+ })
473
+ /**
474
+ * GET /_archlast/introspect/jobs/dlq/:id
475
+ * Get specific DLQ job
476
+ */
477
+ .get("/introspect/jobs/dlq/:id", async (ctx) => {
478
+ const { rawDb, params, request, set } = (0, context_helper_js_1.getCtx)(ctx);
479
+ const auth = await (0, role_helpers_js_1.requireAdmin)((0, context_helper_js_1.getBetterAuth)(), request);
480
+ if (!auth) {
481
+ set.status = 401;
482
+ return { error: "Unauthorized" };
483
+ }
484
+ try {
485
+ const queue = new queue_js_1.JobQueue({ db: rawDb });
486
+ const job = await queue.getDLQJob(params.id);
487
+ if (!job) {
488
+ set.status = 404;
489
+ return {
490
+ success: false,
491
+ error: "DLQ job not found",
492
+ };
493
+ }
494
+ return {
495
+ success: true,
496
+ data: job,
497
+ };
498
+ }
499
+ catch (error) {
500
+ set.status = 500;
501
+ return {
502
+ success: false,
503
+ error: error instanceof Error ? error.message : "Failed to get DLQ job",
504
+ };
505
+ }
506
+ }, {
507
+ params: elysia_1.t.Object({ id: elysia_1.t.String() }),
508
+ detail: { summary: "Get DLQ job" },
509
+ })
510
+ /**
511
+ * POST /_archlast/introspect/jobs/dlq/:id/retry
512
+ * Reprocess DLQ job
513
+ */
514
+ .post("/introspect/jobs/dlq/:id/retry", async (ctx) => {
515
+ const { rawDb, params, body, request, set } = (0, context_helper_js_1.getCtx)(ctx);
516
+ const auth = await (0, role_helpers_js_1.requireAdmin)((0, context_helper_js_1.getBetterAuth)(), request);
517
+ if (!auth) {
518
+ set.status = 401;
519
+ return { error: "Unauthorized" };
520
+ }
521
+ try {
522
+ const queue = new queue_js_1.JobQueue({ db: rawDb });
523
+ // Validate priority if provided
524
+ if (body.priority !== undefined) {
525
+ if (typeof body.priority !== "number" || body.priority < 1 || body.priority > 20) {
526
+ set.status = 400;
527
+ return {
528
+ success: false,
529
+ error: "Invalid priority. Must be between 1 and 20.",
530
+ };
531
+ }
532
+ }
533
+ const newJobId = await queue.reprocessFromDLQ(params.id, {
534
+ newMaxAttempts: body.maxAttempts,
535
+ priority: body.priority,
536
+ });
537
+ return {
538
+ success: true,
539
+ data: {
540
+ originalDLQJobId: params.id,
541
+ newJobId,
542
+ },
543
+ };
544
+ }
545
+ catch (error) {
546
+ set.status = 500;
547
+ return {
548
+ success: false,
549
+ error: error instanceof Error ? error.message : "Failed to reprocess DLQ job",
550
+ };
551
+ }
552
+ }, {
553
+ params: elysia_1.t.Object({ id: elysia_1.t.String() }),
554
+ body: elysia_1.t.Object({
555
+ maxAttempts: elysia_1.t.Optional(elysia_1.t.Number()),
556
+ priority: elysia_1.t.Optional(elysia_1.t.Number()),
557
+ }),
558
+ detail: { summary: "Reprocess DLQ job" },
559
+ })
560
+ /**
561
+ * DELETE /_archlast/introspect/jobs/dlq/:id
562
+ * Delete DLQ job
563
+ */
564
+ .delete("/introspect/jobs/dlq/:id", async (ctx) => {
565
+ const { rawDb, params, request, set } = (0, context_helper_js_1.getCtx)(ctx);
566
+ const auth = await (0, role_helpers_js_1.requireAdmin)((0, context_helper_js_1.getBetterAuth)(), request);
567
+ if (!auth) {
568
+ set.status = 401;
569
+ return { error: "Unauthorized" };
570
+ }
571
+ try {
572
+ const queue = new queue_js_1.JobQueue({ db: rawDb });
573
+ await queue.deleteFromDLQ(params.id);
574
+ return {
575
+ success: true,
576
+ message: "DLQ job deleted",
577
+ };
578
+ }
579
+ catch (error) {
580
+ set.status = 500;
581
+ return {
582
+ success: false,
583
+ error: error instanceof Error ? error.message : "Failed to delete DLQ job",
584
+ };
585
+ }
586
+ }, {
587
+ params: elysia_1.t.Object({ id: elysia_1.t.String() }),
588
+ detail: { summary: "Delete DLQ job" },
589
+ })
590
+ /**
591
+ * POST /_archlast/introspect/jobs/dlq/purge
592
+ * Purge old DLQ jobs
593
+ */
594
+ .post("/introspect/jobs/dlq/purge", async (ctx) => {
595
+ const { rawDb, body, request, set } = (0, context_helper_js_1.getCtx)(ctx);
596
+ const auth = await (0, role_helpers_js_1.requireAdmin)((0, context_helper_js_1.getBetterAuth)(), request);
597
+ if (!auth) {
598
+ set.status = 401;
599
+ return { error: "Unauthorized" };
600
+ }
601
+ try {
602
+ const queue = new queue_js_1.JobQueue({ db: rawDb });
603
+ // Validate olderThanDays if provided
604
+ if (body.olderThanDays !== undefined) {
605
+ if (typeof body.olderThanDays !== "number" || body.olderThanDays <= 0) {
606
+ set.status = 400;
607
+ return {
608
+ success: false,
609
+ error: "Invalid olderThanDays. Must be a positive number.",
610
+ };
611
+ }
612
+ }
613
+ const olderThanMs = body.olderThanDays
614
+ ? body.olderThanDays * 24 * 60 * 60 * 1000
615
+ : undefined;
616
+ const purgedCount = await queue.purgeDLQ(olderThanMs);
617
+ return {
618
+ success: true,
619
+ data: {
620
+ purgedCount,
621
+ },
622
+ };
623
+ }
624
+ catch (error) {
625
+ set.status = 500;
626
+ return {
627
+ success: false,
628
+ error: error instanceof Error ? error.message : "Failed to purge DLQ jobs",
629
+ };
630
+ }
631
+ }, {
632
+ body: elysia_1.t.Object({
633
+ olderThanDays: elysia_1.t.Optional(elysia_1.t.Number()),
634
+ }),
635
+ detail: { summary: "Purge DLQ jobs" },
636
+ })
637
+ /**
638
+ * POST /_archlast/introspect/jobs/priority
639
+ * Update job priority
640
+ */
641
+ .post("/introspect/jobs/priority", async (ctx) => {
642
+ const { db, body, request, set } = (0, context_helper_js_1.getCtx)(ctx);
643
+ const auth = await (0, role_helpers_js_1.requireAdmin)((0, context_helper_js_1.getBetterAuth)(), request);
644
+ if (!auth) {
645
+ set.status = 401;
646
+ return { error: "Unauthorized" };
647
+ }
648
+ try {
649
+ // Validate priority range (1-20)
650
+ if (body.priority < 1 || body.priority > 20) {
651
+ set.status = 400;
652
+ return {
653
+ success: false,
654
+ error: "Priority must be between 1 and 20",
655
+ };
656
+ }
657
+ // Validate jobId
658
+ if (!body.jobId || typeof body.jobId !== "string") {
659
+ set.status = 400;
660
+ return {
661
+ success: false,
662
+ error: "Invalid jobId. Must be a non-empty string.",
663
+ };
664
+ }
665
+ const queue = new queue_js_1.JobQueue({ db });
666
+ await queue.updateJobPriority(body.jobId, body.priority);
667
+ return {
668
+ success: true,
669
+ message: "Job priority updated",
670
+ data: {
671
+ jobId: body.jobId,
672
+ newPriority: body.priority,
673
+ },
674
+ };
675
+ }
676
+ catch (error) {
677
+ if (error instanceof Error && error.message.includes("not found")) {
678
+ set.status = 404;
679
+ return {
680
+ success: false,
681
+ error: error.message,
682
+ };
683
+ }
684
+ set.status = 500;
685
+ return {
686
+ success: false,
687
+ error: error instanceof Error ? error.message : "Failed to update job priority",
688
+ };
689
+ }
690
+ }, {
691
+ body: UpdateJobPrioritySchema,
692
+ detail: { summary: "Update job priority" },
693
+ })
694
+ /**
695
+ * GET /_archlast/introspect/jobs/stats
696
+ * Get queue statistics
697
+ */
698
+ .get("/introspect/jobs/stats", async (ctx) => {
699
+ const { db, request, set } = (0, context_helper_js_1.getCtx)(ctx);
700
+ const auth = await (0, role_helpers_js_1.requireAdmin)((0, context_helper_js_1.getBetterAuth)(), request);
701
+ if (!auth) {
702
+ set.status = 401;
703
+ return { error: "Unauthorized" };
704
+ }
705
+ try {
706
+ const queue = new queue_js_1.JobQueue({ db });
707
+ const stats = await queue.getQueueStats();
708
+ return {
709
+ success: true,
710
+ data: stats,
711
+ };
712
+ }
713
+ catch (error) {
714
+ set.status = 500;
715
+ return {
716
+ success: false,
717
+ error: error instanceof Error ? error.message : "Failed to get queue stats",
718
+ };
719
+ }
720
+ }, {
721
+ detail: { summary: "Get queue statistics" },
722
+ })
723
+ /**
724
+ * GET /_archlast/introspect/jobs/depth
725
+ * Get queue depth by priority level
726
+ */
727
+ .get("/introspect/jobs/depth", async (ctx) => {
728
+ const { db, request, set } = (0, context_helper_js_1.getCtx)(ctx);
729
+ const auth = await (0, role_helpers_js_1.requireAdmin)((0, context_helper_js_1.getBetterAuth)(), request);
730
+ if (!auth) {
731
+ set.status = 401;
732
+ return { error: "Unauthorized" };
733
+ }
734
+ try {
735
+ const queue = new queue_js_1.JobQueue({ db });
736
+ const depth = await queue.getQueueDepthByPriority();
737
+ return {
738
+ success: true,
739
+ data: depth,
740
+ };
741
+ }
742
+ catch (error) {
743
+ set.status = 500;
744
+ return {
745
+ success: false,
746
+ error: error instanceof Error ? error.message : "Failed to get queue depth",
747
+ };
748
+ }
749
+ }, {
750
+ detail: { summary: "Get queue depth by priority" },
751
+ })
752
+ /**
753
+ * GET /_archlast/introspect/workers/health
754
+ * Get worker health status
755
+ */
756
+ .get("/introspect/workers/health", async (ctx) => {
757
+ const { request, set } = (0, context_helper_js_1.getCtx)(ctx);
758
+ const auth = await (0, role_helpers_js_1.requireAdmin)((0, context_helper_js_1.getBetterAuth)(), request);
759
+ if (!auth) {
760
+ set.status = 401;
761
+ return { error: "Unauthorized" };
762
+ }
763
+ try {
764
+ // Dynamically import worker to avoid circular dependencies
765
+ const worker = await import("../jobs/worker.js");
766
+ const health = {
767
+ activeJobs: worker.getActiveJobsCount(),
768
+ activeJobIds: worker.getActiveJobIds(),
769
+ isStopped: worker.isStopped(),
770
+ uptime: process.uptime(),
771
+ memory: process.memoryUsage(),
772
+ cpu: process.cpuUsage(),
773
+ };
774
+ return {
775
+ success: true,
776
+ data: health,
777
+ };
778
+ }
779
+ catch (error) {
780
+ set.status = 500;
781
+ return {
782
+ success: false,
783
+ error: error instanceof Error ? error.message : "Failed to get worker health",
784
+ };
785
+ }
786
+ }, {
787
+ detail: { summary: "Get worker health status" },
788
+ })
789
+ /**
790
+ * GET /_archlast/introspect/jobs/circuit-breakers
791
+ * Get all circuit breaker states
792
+ */
793
+ .get("/introspect/jobs/circuit-breakers", async (ctx) => {
794
+ const { request, set } = (0, context_helper_js_1.getCtx)(ctx);
795
+ const auth = await (0, role_helpers_js_1.requireAdmin)((0, context_helper_js_1.getBetterAuth)(), request);
796
+ if (!auth) {
797
+ set.status = 401;
798
+ return { error: "Unauthorized" };
799
+ }
800
+ try {
801
+ // Dynamically import worker to access circuit breaker
802
+ const worker = await import("../jobs/worker.js");
803
+ const circuitBreaker = worker.getCircuitBreaker();
804
+ if (!circuitBreaker) {
805
+ return {
806
+ success: true,
807
+ data: [],
808
+ message: "Circuit breaker is disabled",
809
+ };
810
+ }
811
+ const states = circuitBreaker.getAllStates();
812
+ // Convert Map to array for JSON serialization
813
+ const breakerStates = Array.from(states.entries()).map(([jobName, state]) => ({
814
+ jobName,
815
+ state: state.state,
816
+ failureCount: state.failureCount,
817
+ successCount: state.successCount,
818
+ lastFailureTime: state.lastFailureTime,
819
+ lastStateChange: state.lastStateChange,
820
+ }));
821
+ return {
822
+ success: true,
823
+ data: breakerStates,
824
+ };
825
+ }
826
+ catch (error) {
827
+ set.status = 500;
828
+ return {
829
+ success: false,
830
+ error: error instanceof Error ? error.message : "Failed to get circuit breaker states",
831
+ };
832
+ }
833
+ }, {
834
+ detail: { summary: "Get circuit breaker states" },
835
+ })
836
+ /**
837
+ * POST /_archlast/introspect/jobs/circuit-breakers/:jobName/reset
838
+ * Reset circuit breaker for specific job type
839
+ */
840
+ .post("/introspect/jobs/circuit-breakers/:jobName/reset", async (ctx) => {
841
+ const { params, request, set } = (0, context_helper_js_1.getCtx)(ctx);
842
+ const auth = await (0, role_helpers_js_1.requireAdmin)((0, context_helper_js_1.getBetterAuth)(), request);
843
+ if (!auth) {
844
+ set.status = 401;
845
+ return { error: "Unauthorized" };
846
+ }
847
+ try {
848
+ // Validate jobName
849
+ if (!params.jobName || typeof params.jobName !== "string" || params.jobName.trim() === "") {
850
+ set.status = 400;
851
+ return {
852
+ success: false,
853
+ error: "Invalid jobName. Must be a non-empty string.",
854
+ };
855
+ }
856
+ // Dynamically import worker to access circuit breaker
857
+ const worker = await import("../jobs/worker.js");
858
+ const circuitBreaker = worker.getCircuitBreaker();
859
+ if (!circuitBreaker) {
860
+ set.status = 400;
861
+ return {
862
+ success: false,
863
+ error: "Circuit breaker is disabled",
864
+ };
865
+ }
866
+ circuitBreaker.reset(params.jobName);
867
+ return {
868
+ success: true,
869
+ message: `Circuit breaker reset for ${params.jobName}`,
870
+ };
871
+ }
872
+ catch (error) {
873
+ set.status = 500;
874
+ return {
875
+ success: false,
876
+ error: error instanceof Error ? error.message : "Failed to reset circuit breaker",
877
+ };
878
+ }
879
+ }, {
880
+ params: elysia_1.t.Object({ jobName: elysia_1.t.String() }),
881
+ detail: { summary: "Reset circuit breaker" },
882
+ })
883
+ /**
884
+ * GET /_archlast/introspect/jobs/stuck
885
+ * Find jobs stuck in "active" status (worker terminated)
886
+ */
887
+ .get("/introspect/jobs/stuck", async (ctx) => {
888
+ const { rawDb, query, request, set } = (0, context_helper_js_1.getCtx)(ctx);
889
+ const auth = await (0, role_helpers_js_1.requireAdmin)((0, context_helper_js_1.getBetterAuth)(), request);
890
+ if (!auth) {
891
+ set.status = 401;
892
+ return { error: "Unauthorized" };
893
+ }
894
+ try {
895
+ const queue = new queue_js_1.JobQueue({ db: rawDb });
896
+ const timeoutMs = query.timeout ? Number(query.timeout) : 300000; // Default 5 minutes
897
+ const stuckJobs = await queue.findStuckJobs(timeoutMs);
898
+ return {
899
+ success: true,
900
+ data: {
901
+ stuckJobs: stuckJobs.map(job => ({
902
+ ...job,
903
+ id: job._id, // Ensure id field is set for frontend compatibility
904
+ })),
905
+ count: stuckJobs.length,
906
+ timeoutMs,
907
+ },
908
+ };
909
+ }
910
+ catch (error) {
911
+ set.status = 500;
912
+ return {
913
+ success: false,
914
+ error: error instanceof Error ? error.message : "Failed to find stuck jobs",
915
+ };
916
+ }
917
+ }, {
918
+ query: elysia_1.t.Object({
919
+ timeout: elysia_1.t.Optional(elysia_1.t.String()),
920
+ }),
921
+ detail: { summary: "Find stuck jobs" },
922
+ })
923
+ /**
924
+ * POST /_archlast/introspect/jobs/:id/reset
925
+ * Reset a stuck job from "active" to "pending"
926
+ */
927
+ .post("/introspect/jobs/:id/reset", async (ctx) => {
928
+ const { rawDb, params, request, set } = (0, context_helper_js_1.getCtx)(ctx);
929
+ const auth = await (0, role_helpers_js_1.requireAdmin)((0, context_helper_js_1.getBetterAuth)(), request);
930
+ if (!auth) {
931
+ set.status = 401;
932
+ return { error: "Unauthorized" };
933
+ }
934
+ try {
935
+ const queue = new queue_js_1.JobQueue({ db: rawDb });
936
+ await queue.resetStuckJob(params.id);
937
+ return {
938
+ success: true,
939
+ message: `Job ${params.id} reset from active to pending`,
940
+ };
941
+ }
942
+ catch (error) {
943
+ set.status = 500;
944
+ return {
945
+ success: false,
946
+ error: error instanceof Error ? error.message : "Failed to reset job",
947
+ };
948
+ }
949
+ }, {
950
+ params: elysia_1.t.Object({ id: elysia_1.t.String() }),
951
+ detail: { summary: "Reset stuck job" },
952
+ })
953
+ /**
954
+ * POST /_archlast/introspect/jobs/stuck/reset-batch
955
+ * Bulk reset multiple stuck jobs
956
+ */
957
+ .post("/introspect/jobs/stuck/reset-batch", async (ctx) => {
958
+ const { rawDb, body, request, set } = (0, context_helper_js_1.getCtx)(ctx);
959
+ const auth = await (0, role_helpers_js_1.requireAdmin)((0, context_helper_js_1.getBetterAuth)(), request);
960
+ if (!auth) {
961
+ set.status = 401;
962
+ return { error: "Unauthorized" };
963
+ }
964
+ try {
965
+ const queue = new queue_js_1.JobQueue({ db: rawDb });
966
+ const result = await queue.resetStuckJobs(body.jobIds);
967
+ return {
968
+ success: true,
969
+ data: result,
970
+ message: `Reset ${result.reset} jobs, ${result.failed} failed`,
971
+ };
972
+ }
973
+ catch (error) {
974
+ set.status = 500;
975
+ return {
976
+ success: false,
977
+ error: error instanceof Error ? error.message : "Failed to reset jobs",
978
+ };
979
+ }
980
+ }, {
981
+ body: elysia_1.t.Object({
982
+ jobIds: elysia_1.t.Array(elysia_1.t.String()),
983
+ }),
984
+ detail: { summary: "Batch reset stuck jobs" },
374
985
  });
375
986
  //# sourceMappingURL=introspection.controller.js.map