@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
@@ -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"] })
@@ -239,6 +244,23 @@ exports.introspectionController = new elysia_1.Elysia({ tags: ["Introspection"]
239
244
  }, {
240
245
  params: elysia_1.t.Object({ id: elysia_1.t.String() }),
241
246
  detail: { summary: "Get job" },
247
+ })
248
+ /**
249
+ * GET /_archlast/introspect/http-routes-runtime
250
+ * Runtime HTTP router routes (admin only)
251
+ */
252
+ .get("/introspect/http-routes-runtime", async (ctx) => {
253
+ const { request, set, httpRouter } = (0, context_helper_js_1.getCtx)(ctx);
254
+ const auth = await (0, role_helpers_js_1.requireAdmin)((0, context_helper_js_1.getBetterAuth)(), request);
255
+ if (!auth) {
256
+ set.status = 401;
257
+ return { error: "Unauthorized" };
258
+ }
259
+ return {
260
+ routes: httpRouter ? httpRouter.listRoutes() : [],
261
+ };
262
+ }, {
263
+ detail: { summary: "List runtime HTTP router routes" },
242
264
  })
243
265
  /**
244
266
  * POST /_archlast/jobs/trigger
@@ -354,5 +376,611 @@ exports.introspectionController = new elysia_1.Elysia({ tags: ["Introspection"]
354
376
  return introspectionService.getWebhooks({ deploymentHandler });
355
377
  }, {
356
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" },
357
985
  });
358
986
  //# sourceMappingURL=introspection.controller.js.map