alepha 0.19.1 → 0.19.3

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 (531) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +6 -9
  3. package/dist/api/audits/index.d.ts +378 -346
  4. package/dist/api/audits/index.d.ts.map +1 -1
  5. package/dist/api/files/index.d.ts +216 -184
  6. package/dist/api/files/index.d.ts.map +1 -1
  7. package/dist/api/jobs/index.d.ts +534 -502
  8. package/dist/api/jobs/index.d.ts.map +1 -1
  9. package/dist/api/jobs/index.js +13 -7
  10. package/dist/api/jobs/index.js.map +1 -1
  11. package/dist/api/keys/index.d.ts +202 -202
  12. package/dist/api/keys/index.d.ts.map +1 -1
  13. package/dist/api/notifications/index.d.ts +152 -152
  14. package/dist/api/notifications/index.d.ts.map +1 -1
  15. package/dist/api/organizations/index.browser.js +48 -0
  16. package/dist/api/organizations/index.browser.js.map +1 -0
  17. package/dist/api/organizations/index.d.ts +516 -0
  18. package/dist/api/organizations/index.d.ts.map +1 -0
  19. package/dist/api/organizations/index.js +202 -0
  20. package/dist/api/organizations/index.js.map +1 -0
  21. package/dist/api/parameters/index.d.ts +391 -358
  22. package/dist/api/parameters/index.d.ts.map +1 -1
  23. package/dist/api/parameters/index.js +5 -1
  24. package/dist/api/parameters/index.js.map +1 -1
  25. package/dist/api/users/index.browser.js +7 -5
  26. package/dist/api/users/index.browser.js.map +1 -1
  27. package/dist/api/users/index.d.ts +986 -931
  28. package/dist/api/users/index.d.ts.map +1 -1
  29. package/dist/api/users/index.js +160 -112
  30. package/dist/api/users/index.js.map +1 -1
  31. package/dist/api/verifications/index.d.ts +137 -137
  32. package/dist/api/verifications/index.d.ts.map +1 -1
  33. package/dist/api/verifications/index.js +2 -2
  34. package/dist/api/verifications/index.js.map +1 -1
  35. package/dist/batch/index.d.ts +6 -6
  36. package/dist/batch/index.d.ts.map +1 -1
  37. package/dist/billing/index.d.ts +1048 -0
  38. package/dist/billing/index.d.ts.map +1 -0
  39. package/dist/billing/index.js +713 -0
  40. package/dist/billing/index.js.map +1 -0
  41. package/dist/bin/index.js +0 -2
  42. package/dist/bin/index.js.map +1 -1
  43. package/dist/bucket/index.d.ts +10 -10
  44. package/dist/bucket/index.d.ts.map +1 -1
  45. package/dist/bucket/index.js +2 -2
  46. package/dist/bucket/index.js.map +1 -1
  47. package/dist/cache/core/index.d.ts +9 -9
  48. package/dist/cache/core/index.d.ts.map +1 -1
  49. package/dist/cache/core/index.js +2 -2
  50. package/dist/cache/core/index.js.map +1 -1
  51. package/dist/cache/core/index.workerd.js +2 -2
  52. package/dist/cache/core/index.workerd.js.map +1 -1
  53. package/dist/cache/redis/index.d.ts +6 -6
  54. package/dist/cache/redis/index.d.ts.map +1 -1
  55. package/dist/cache/redis/index.js +2 -2
  56. package/dist/cache/redis/index.js.map +1 -1
  57. package/dist/cli/config/index.d.ts +6 -18
  58. package/dist/cli/config/index.d.ts.map +1 -1
  59. package/dist/cli/config/index.js +5 -6
  60. package/dist/cli/config/index.js.map +1 -1
  61. package/dist/cli/core/index.d.ts +11811 -323
  62. package/dist/cli/core/index.d.ts.map +1 -1
  63. package/dist/cli/core/index.js +324 -98
  64. package/dist/cli/core/index.js.map +1 -1
  65. package/dist/cli/devtools/index.d.ts +50 -0
  66. package/dist/cli/devtools/index.d.ts.map +1 -0
  67. package/dist/cli/devtools/index.js +174 -0
  68. package/dist/cli/devtools/index.js.map +1 -0
  69. package/dist/cli/platform/index.d.ts +438 -542
  70. package/dist/cli/platform/index.d.ts.map +1 -1
  71. package/dist/cli/platform/index.js +46 -511
  72. package/dist/cli/platform/index.js.map +1 -1
  73. package/dist/cli/vendor/index.d.ts +201 -0
  74. package/dist/cli/vendor/index.d.ts.map +1 -0
  75. package/dist/cli/vendor/index.js +388 -0
  76. package/dist/cli/vendor/index.js.map +1 -0
  77. package/dist/command/index.d.ts +18 -18
  78. package/dist/command/index.d.ts.map +1 -1
  79. package/dist/command/index.js +2 -2
  80. package/dist/command/index.js.map +1 -1
  81. package/dist/core/index.browser.js +4 -4
  82. package/dist/core/index.browser.js.map +1 -1
  83. package/dist/core/index.d.ts +10 -10
  84. package/dist/core/index.d.ts.map +1 -1
  85. package/dist/core/index.js +8 -4
  86. package/dist/core/index.js.map +1 -1
  87. package/dist/core/index.native.js +8 -4
  88. package/dist/core/index.native.js.map +1 -1
  89. package/dist/core/index.workerd.js +8 -4
  90. package/dist/core/index.workerd.js.map +1 -1
  91. package/dist/crypto/index.d.ts +7 -7
  92. package/dist/crypto/index.d.ts.map +1 -1
  93. package/dist/datetime/index.d.ts +4 -4
  94. package/dist/datetime/index.d.ts.map +1 -1
  95. package/dist/email/brevo/index.d.ts +4 -4
  96. package/dist/email/brevo/index.d.ts.map +1 -1
  97. package/dist/email/core/index.d.ts +15 -11
  98. package/dist/email/core/index.d.ts.map +1 -1
  99. package/dist/email/core/index.js +12 -35
  100. package/dist/email/core/index.js.map +1 -1
  101. package/dist/email/smtp/index.d.ts +12 -12
  102. package/dist/email/smtp/index.d.ts.map +1 -1
  103. package/dist/email/smtp/index.js +7 -4
  104. package/dist/email/smtp/index.js.map +1 -1
  105. package/dist/fake/index.d.ts +4 -8
  106. package/dist/fake/index.d.ts.map +1 -1
  107. package/dist/fake/index.js +55 -889
  108. package/dist/fake/index.js.map +1 -1
  109. package/dist/lock/core/index.d.ts +13 -13
  110. package/dist/lock/core/index.d.ts.map +1 -1
  111. package/dist/lock/core/index.js +2 -2
  112. package/dist/lock/core/index.js.map +1 -1
  113. package/dist/lock/redis/index.d.ts +4 -4
  114. package/dist/lock/redis/index.d.ts.map +1 -1
  115. package/dist/logger/index.d.ts +16 -15
  116. package/dist/logger/index.d.ts.map +1 -1
  117. package/dist/logger/index.js +6 -3
  118. package/dist/logger/index.js.map +1 -1
  119. package/dist/mcp/index.d.ts +11 -11
  120. package/dist/mcp/index.d.ts.map +1 -1
  121. package/dist/mcp/index.js +2 -2
  122. package/dist/mcp/index.js.map +1 -1
  123. package/dist/orm/core/index.browser.js +11 -1
  124. package/dist/orm/core/index.browser.js.map +1 -1
  125. package/dist/orm/core/index.bun.js +78 -72
  126. package/dist/orm/core/index.bun.js.map +1 -1
  127. package/dist/orm/core/index.d.ts +103 -69
  128. package/dist/orm/core/index.d.ts.map +1 -1
  129. package/dist/orm/core/index.js +80 -70
  130. package/dist/orm/core/index.js.map +1 -1
  131. package/dist/orm/postgres/index.d.ts +19 -17
  132. package/dist/orm/postgres/index.d.ts.map +1 -1
  133. package/dist/queue/core/index.d.ts +14 -14
  134. package/dist/queue/core/index.d.ts.map +1 -1
  135. package/dist/queue/core/index.js +2 -2
  136. package/dist/queue/core/index.js.map +1 -1
  137. package/dist/queue/core/index.workerd.js +2 -2
  138. package/dist/queue/core/index.workerd.js.map +1 -1
  139. package/dist/queue/redis/index.d.ts +4 -4
  140. package/dist/queue/redis/index.d.ts.map +1 -1
  141. package/dist/queue/redis/index.js +2 -2
  142. package/dist/queue/redis/index.js.map +1 -1
  143. package/dist/react/auth/index.d.ts +9 -9
  144. package/dist/react/auth/index.d.ts.map +1 -1
  145. package/dist/react/core/index.d.ts +6 -6
  146. package/dist/react/core/index.d.ts.map +1 -1
  147. package/dist/react/core/index.js +5 -4
  148. package/dist/react/core/index.js.map +1 -1
  149. package/dist/react/form/index.d.ts +4 -4
  150. package/dist/react/form/index.d.ts.map +1 -1
  151. package/dist/react/head/index.d.ts +4 -4
  152. package/dist/react/head/index.d.ts.map +1 -1
  153. package/dist/react/i18n/index.d.ts +9 -9
  154. package/dist/react/i18n/index.d.ts.map +1 -1
  155. package/dist/react/intro/index.d.ts +2 -2
  156. package/dist/react/intro/index.d.ts.map +1 -1
  157. package/dist/react/intro/index.js +1 -1
  158. package/dist/react/intro/index.js.map +1 -1
  159. package/dist/react/router/index.browser.js +4 -5
  160. package/dist/react/router/index.browser.js.map +1 -1
  161. package/dist/react/router/index.d.ts +215 -215
  162. package/dist/react/router/index.d.ts.map +1 -1
  163. package/dist/react/router/index.js +6 -7
  164. package/dist/react/router/index.js.map +1 -1
  165. package/dist/react/testing/index.d.ts +2 -2
  166. package/dist/react/testing/index.d.ts.map +1 -1
  167. package/dist/react/testing/index.js +2 -4
  168. package/dist/react/testing/index.js.map +1 -1
  169. package/dist/redis/index.d.ts +19 -19
  170. package/dist/redis/index.d.ts.map +1 -1
  171. package/dist/retry/index.d.ts +4 -4
  172. package/dist/retry/index.d.ts.map +1 -1
  173. package/dist/scheduler/index.d.ts +13 -13
  174. package/dist/scheduler/index.d.ts.map +1 -1
  175. package/dist/scheduler/index.js +2 -2
  176. package/dist/scheduler/index.js.map +1 -1
  177. package/dist/scheduler/index.workerd.js +2 -2
  178. package/dist/scheduler/index.workerd.js.map +1 -1
  179. package/dist/security/index.browser.js +1 -1
  180. package/dist/security/index.browser.js.map +1 -1
  181. package/dist/security/index.d.ts +47 -47
  182. package/dist/security/index.d.ts.map +1 -1
  183. package/dist/security/index.js +9 -12
  184. package/dist/security/index.js.map +1 -1
  185. package/dist/server/auth/index.d.ts +170 -169
  186. package/dist/server/auth/index.d.ts.map +1 -1
  187. package/dist/server/auth/index.js +16 -2
  188. package/dist/server/auth/index.js.map +1 -1
  189. package/dist/server/cookies/index.d.ts +7 -7
  190. package/dist/server/cookies/index.d.ts.map +1 -1
  191. package/dist/server/core/index.d.ts +76 -76
  192. package/dist/server/core/index.d.ts.map +1 -1
  193. package/dist/server/core/index.js +23 -17
  194. package/dist/server/core/index.js.map +1 -1
  195. package/dist/server/cors/index.d.ts +13 -13
  196. package/dist/server/cors/index.d.ts.map +1 -1
  197. package/dist/server/cors/index.js +2 -2
  198. package/dist/server/cors/index.js.map +1 -1
  199. package/dist/server/etag/index.d.ts +9 -9
  200. package/dist/server/etag/index.d.ts.map +1 -1
  201. package/dist/server/health/index.d.ts +20 -20
  202. package/dist/server/health/index.d.ts.map +1 -1
  203. package/dist/server/links/index.browser.js +2 -2
  204. package/dist/server/links/index.browser.js.map +1 -1
  205. package/dist/server/links/index.d.ts +66 -66
  206. package/dist/server/links/index.d.ts.map +1 -1
  207. package/dist/server/links/index.js +4 -4
  208. package/dist/server/links/index.js.map +1 -1
  209. package/dist/server/metrics/index.d.ts +7 -7
  210. package/dist/server/metrics/index.d.ts.map +1 -1
  211. package/dist/server/proxy/index.d.ts +5 -5
  212. package/dist/server/proxy/index.d.ts.map +1 -1
  213. package/dist/server/rate-limit/index.d.ts +12 -12
  214. package/dist/server/rate-limit/index.d.ts.map +1 -1
  215. package/dist/server/rate-limit/index.js +2 -2
  216. package/dist/server/rate-limit/index.js.map +1 -1
  217. package/dist/server/static/index.d.ts +5 -5
  218. package/dist/server/static/index.d.ts.map +1 -1
  219. package/dist/server/swagger/index.d.ts +7 -7
  220. package/dist/server/swagger/index.d.ts.map +1 -1
  221. package/dist/server/swagger/index.js +2 -2
  222. package/dist/server/swagger/index.js.map +1 -1
  223. package/dist/sms/index.d.ts +11 -7
  224. package/dist/sms/index.d.ts.map +1 -1
  225. package/dist/sms/index.js +9 -15
  226. package/dist/sms/index.js.map +1 -1
  227. package/dist/system/index.d.ts +4 -4
  228. package/dist/system/index.d.ts.map +1 -1
  229. package/dist/topic/core/index.d.ts +6 -6
  230. package/dist/topic/core/index.d.ts.map +1 -1
  231. package/dist/topic/redis/index.d.ts +7 -7
  232. package/dist/topic/redis/index.d.ts.map +1 -1
  233. package/dist/topic/redis/index.js +2 -2
  234. package/dist/topic/redis/index.js.map +1 -1
  235. package/dist/websocket/index.d.ts +36 -36
  236. package/dist/websocket/index.d.ts.map +1 -1
  237. package/dist/websocket/index.js +2 -2
  238. package/dist/websocket/index.js.map +1 -1
  239. package/package.json +37 -15
  240. package/src/api/jobs/{services → __tests__}/JobService.spec.ts +1 -1
  241. package/src/api/jobs/providers/JobProvider.ts +13 -9
  242. package/src/api/keys/{services → __tests__}/ApiKeyService.spec.ts +1 -1
  243. package/src/api/organizations/__tests__/OrganizationService.spec.ts +193 -0
  244. package/src/api/organizations/controllers/AdminOrganizationController.ts +103 -0
  245. package/src/api/organizations/entities/organizations.ts +20 -0
  246. package/src/api/organizations/index.browser.ts +10 -0
  247. package/src/api/organizations/index.ts +31 -0
  248. package/src/api/organizations/schemas/createOrganizationSchema.ts +10 -0
  249. package/src/api/organizations/schemas/organizationQuerySchema.ts +10 -0
  250. package/src/api/organizations/schemas/organizationResourceSchema.ts +6 -0
  251. package/src/api/organizations/schemas/updateOrganizationSchema.ts +7 -0
  252. package/src/api/organizations/services/OrganizationService.ts +75 -0
  253. package/src/api/parameters/services/ParameterProvider.ts +6 -1
  254. package/src/api/users/{services → __tests__}/SessionService.spec.ts +67 -0
  255. package/src/api/users/{jobs → __tests__}/UserJobs.spec.ts +1 -1
  256. package/src/api/users/entities/users.ts +9 -3
  257. package/src/api/users/index.ts +23 -4
  258. package/src/api/users/primitives/$realm.ts +6 -4
  259. package/src/api/users/providers/RealmProvider.ts +1 -1
  260. package/src/api/users/services/RegistrationService.ts +1 -1
  261. package/src/api/users/services/SessionService.ts +92 -5
  262. package/src/api/users/services/UserService.ts +1 -1
  263. package/src/api/verifications/{jobs → __tests__}/VerificationJobs.spec.ts +4 -2
  264. package/src/api/verifications/parameters/VerificationParameters.ts +2 -2
  265. package/src/billing/__tests__/BillingService.spec.ts +136 -0
  266. package/src/billing/__tests__/PaymentMethodService.spec.ts +78 -0
  267. package/src/billing/controllers/AdminBillingController.ts +149 -0
  268. package/src/billing/controllers/BillingController.ts +108 -0
  269. package/src/billing/entities/paymentIntents.ts +34 -0
  270. package/src/billing/entities/paymentMethods.ts +24 -0
  271. package/src/billing/entities/refunds.ts +22 -0
  272. package/src/billing/errors/BillingError.ts +5 -0
  273. package/src/billing/index.ts +76 -0
  274. package/src/billing/providers/BillingProvider.ts +79 -0
  275. package/src/billing/providers/MemoryBillingProvider.ts +139 -0
  276. package/src/billing/schemas/intentSchemas.ts +60 -0
  277. package/src/billing/schemas/paymentMethodSchemas.ts +13 -0
  278. package/src/billing/schemas/refundSchemas.ts +6 -0
  279. package/src/billing/services/BillingService.ts +325 -0
  280. package/src/billing/services/PaymentMethodService.ts +82 -0
  281. package/src/bin/index.ts +0 -2
  282. package/src/bucket/providers/LocalFileStorageProvider.ts +2 -2
  283. package/src/cache/core/{primitives → __tests__}/$cache.middleware.spec.ts +1 -1
  284. package/src/cache/core/{providers → __tests__}/MemoryCacheProvider.spec.ts +1 -1
  285. package/src/cache/core/primitives/$cache.ts +2 -2
  286. package/src/cache/redis/providers/RedisCacheProvider.ts +2 -2
  287. package/src/cli/config/defineConfig.ts +17 -26
  288. package/src/cli/core/{services → __tests__}/ProjectScaffolder.spec.ts +1 -1
  289. package/src/cli/core/{commands/gen → __tests__}/changelog.spec.ts +1 -1
  290. package/src/cli/core/{commands → __tests__}/init.spec.ts +2 -8
  291. package/src/cli/core/atoms/devOptions.ts +0 -5
  292. package/src/cli/core/commands/build.ts +2 -2
  293. package/src/cli/core/commands/dev.ts +165 -30
  294. package/src/cli/core/commands/gen/changelog.ts +2 -2
  295. package/src/cli/core/commands/init.ts +2 -7
  296. package/src/cli/core/commands/verify.ts +0 -1
  297. package/src/cli/core/providers/AppEntryProvider.ts +2 -2
  298. package/src/cli/core/providers/ViteDevServerProvider.ts +99 -69
  299. package/src/cli/core/services/PackageManagerUtils.ts +8 -1
  300. package/src/cli/core/services/ProjectScaffolder.ts +23 -23
  301. package/src/cli/core/tasks/BuildClientTask.ts +8 -0
  302. package/src/cli/core/tasks/BuildServerTask.ts +17 -4
  303. package/src/cli/core/templates/agentMd.ts +14 -5
  304. package/src/cli/core/templates/alephaConfigTs.ts +0 -6
  305. package/src/cli/core/templates/webAdminDashboardTsx.ts +17 -0
  306. package/src/cli/core/templates/webAppRouterTs.ts +85 -2
  307. package/src/cli/devtools/atoms/devtoolsOptions.ts +26 -0
  308. package/src/cli/devtools/index.ts +214 -0
  309. package/src/cli/platform/{adapters → __tests__}/CloudflareAdapter.spec.ts +2 -2
  310. package/src/cli/platform/{providers → __tests__}/GitHubSecretStore.spec.ts +1 -1
  311. package/src/cli/platform/{services → __tests__}/NamingService.spec.ts +1 -1
  312. package/src/cli/platform/{providers → __tests__}/PlatformCacheProvider.spec.ts +1 -1
  313. package/src/cli/platform/{services → __tests__}/PlatformInspector.spec.ts +1 -1
  314. package/src/cli/platform/{services → __tests__}/PlatformOrchestrator.spec.ts +3 -3
  315. package/src/cli/platform/{services → __tests__}/SecretFilterService.spec.ts +1 -1
  316. package/src/cli/platform/{commands → __tests__}/SecretsCommand.spec.ts +1 -1
  317. package/src/cli/platform/{adapters → __tests__}/VercelAdapter.spec.ts +2 -2
  318. package/src/cli/platform/atoms/platformOptions.ts +2 -10
  319. package/src/cli/platform/commands/SecretsCommand.ts +2 -2
  320. package/src/cli/platform/commands/platform.ts +2 -11
  321. package/src/cli/platform/index.ts +55 -11
  322. package/src/cli/platform/services/PlatformInspector.ts +2 -2
  323. package/src/cli/platform/services/PlatformOrchestrator.ts +0 -9
  324. package/src/cli/vendor/__tests__/VendorService.spec.ts +407 -0
  325. package/src/cli/vendor/atoms/vendorOptions.ts +41 -0
  326. package/src/cli/vendor/commands/VendorCommand.ts +204 -0
  327. package/src/cli/vendor/index.ts +60 -0
  328. package/src/cli/vendor/services/VendorService.ts +338 -0
  329. package/src/command/{providers → __tests__}/CliProvider.spec.ts +1 -1
  330. package/src/command/{helpers → __tests__}/EnvUtils.spec.ts +1 -1
  331. package/src/command/providers/CliProvider.ts +2 -2
  332. package/src/core/Alepha.ts +10 -0
  333. package/src/core/{primitives → __tests__}/$atom.spec.ts +2 -2
  334. package/src/core/{primitives → __tests__}/$memoize.spec.ts +1 -1
  335. package/src/core/{primitives → __tests__}/$mode.spec.ts +1 -1
  336. package/src/core/{primitives → __tests__}/$pipeline.spec.ts +1 -1
  337. package/src/core/{primitives → __tests__}/$scope.spec.ts +2 -2
  338. package/src/core/{providers → __tests__}/KeylessJsonSchemaCodec.spec.ts +1 -1
  339. package/src/core/{providers → __tests__}/SchemaValidator.spec.ts +1 -1
  340. package/src/core/{helpers → __tests__}/jsonSchemaToTypeBox.spec.ts +1 -1
  341. package/src/core/index.shared.ts +1 -1
  342. package/src/core/primitives/{$use.ts → $state.ts} +4 -4
  343. package/src/crypto/{providers → __tests__}/BrowserCryptoProvider.browser.spec.ts +1 -1
  344. package/src/crypto/{providers → __tests__}/CryptoProvider.spec.ts +1 -1
  345. package/src/datetime/{primitives → __tests__}/$debounce.spec.ts +1 -1
  346. package/src/datetime/{primitives → __tests__}/$throttle.spec.ts +1 -1
  347. package/src/datetime/{primitives → __tests__}/$timeout.spec.ts +1 -1
  348. package/src/email/brevo/{providers → __tests__}/BrevoEmailProvider.spec.ts +1 -1
  349. package/src/email/core/{providers → __tests__}/LocalEmailProvider.spec.ts +39 -150
  350. package/src/email/core/providers/LocalEmailProvider.ts +13 -51
  351. package/src/email/smtp/providers/NodemailerEmailProvider.ts +2 -2
  352. package/src/lock/core/{primitives → __tests__}/$lock.middleware.spec.ts +1 -1
  353. package/src/lock/core/primitives/$lock.ts +2 -2
  354. package/src/logger/index.ts +16 -5
  355. package/src/mcp/transports/SseMcpTransport.ts +2 -2
  356. package/src/orm/__tests__/ModelBuilder-tests.ts +53 -0
  357. package/src/orm/__tests__/ModelBuilder.spec.ts +80 -0
  358. package/src/orm/__tests__/organization-tests.ts +200 -0
  359. package/src/orm/__tests__/organization.spec.ts +103 -0
  360. package/src/orm/core/{providers/drivers → __tests__}/BunSqliteProvider.bun.spec.ts +5 -2
  361. package/src/orm/core/constants/PG_SYMBOLS.ts +2 -0
  362. package/src/orm/core/index.shared.ts +1 -0
  363. package/src/orm/core/primitives/$entity.ts +31 -0
  364. package/src/orm/core/providers/DatabaseTypeProvider.ts +11 -0
  365. package/src/orm/core/providers/DrizzleKitProvider.ts +57 -106
  366. package/src/orm/core/providers/drivers/BunSqliteProvider.ts +2 -2
  367. package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +3 -3
  368. package/src/orm/core/services/ModelBuilder.ts +11 -0
  369. package/src/orm/core/services/QueryManager.ts +16 -2
  370. package/src/orm/core/services/Repository.ts +70 -10
  371. package/src/orm/postgres/{providers → __tests__}/BunPostgresProvider.bun.spec.ts +1 -1
  372. package/src/queue/core/providers/WorkerProvider.ts +2 -2
  373. package/src/queue/redis/providers/RedisQueueProvider.ts +2 -2
  374. package/src/react/core/{hooks → __tests__}/useAction.browser.spec.tsx +1 -1
  375. package/src/react/core/hooks/useAction.ts +7 -6
  376. package/src/react/head/{providers → __tests__}/BrowserHeadProvider.browser.spec.ts +1 -1
  377. package/src/react/head/{helpers → __tests__}/SeoExpander.spec.ts +1 -1
  378. package/src/react/i18n/{providers → __tests__}/I18nProvider.spec.ts +1 -1
  379. package/src/react/i18n/{hooks → __tests__}/useI18n.browser.spec.tsx +1 -1
  380. package/src/react/intro/components/GettingStartedDevtoolsSlide.tsx +1 -1
  381. package/src/react/router/{providers → __tests__}/ReactBrowserProvider.browser.spec.ts +1 -1
  382. package/src/react/router/providers/ReactBrowserProvider.ts +2 -2
  383. package/src/react/router/providers/ReactPageProvider.ts +2 -2
  384. package/src/react/router/providers/ReactServerProvider.ts +3 -3
  385. package/src/redis/{providers → __tests__}/BunRedisProvider.bun.spec.ts +4 -4
  386. package/src/retry/{primitives → __tests__}/$retry.middleware.spec.ts +1 -1
  387. package/src/router/{TemplatedPathParser.spec.ts → __tests__/TemplatedPathParser.spec.ts} +1 -1
  388. package/src/scheduler/primitives/$scheduler.ts +2 -2
  389. package/src/security/{primitives → __tests__}/$secure-browser.spec.ts +1 -1
  390. package/src/security/{primitives → __tests__}/$secure.spec.ts +1 -1
  391. package/src/security/primitives/$issuer.ts +1 -1
  392. package/src/security/providers/JwtProvider.ts +6 -10
  393. package/src/security/providers/SecurityProvider.ts +6 -11
  394. package/src/security/schemas/userAccountInfoSchema.ts +3 -3
  395. package/src/server/auth/providers/ServerAuthProvider.ts +24 -2
  396. package/src/server/cookies/{services → __tests__}/CookieParser.spec.ts +1 -1
  397. package/src/server/core/{primitives → __tests__}/$circuit.spec.ts +1 -1
  398. package/src/server/core/{providers → __tests__}/NodeHttpServerProvider.spec.ts +1 -1
  399. package/src/server/core/{providers → __tests__}/ServerBodyParserProvider.spec.ts +31 -1
  400. package/src/server/core/{providers → __tests__}/ServerCompressProvider.spec.ts +1 -1
  401. package/src/server/core/{providers → __tests__}/ServerHelmetProvider.spec.ts +4 -1
  402. package/src/server/core/{providers → __tests__}/ServerMultipartProvider.spec.ts +1 -1
  403. package/src/server/core/{services → __tests__}/ServerRequestParser.spec.ts +1 -1
  404. package/src/server/core/primitives/$action.ts +2 -2
  405. package/src/server/core/primitives/$sse.ts +2 -2
  406. package/src/server/core/providers/ServerBodyParserProvider.ts +21 -12
  407. package/src/server/core/providers/ServerCompressProvider.ts +2 -2
  408. package/src/server/core/providers/ServerHelmetProvider.ts +2 -2
  409. package/src/server/core/providers/ServerMultipartProvider.ts +2 -2
  410. package/src/server/core/providers/ServerRouterProvider.ts +1 -5
  411. package/src/server/cors/{primitives → __tests__}/$cors.spec.ts +1 -1
  412. package/src/server/cors/providers/ServerCorsProvider.ts +2 -2
  413. package/src/server/links/{services → __tests__}/BatchCollector.spec.ts +1 -1
  414. package/src/server/links/providers/LinkProvider.ts +2 -2
  415. package/src/server/links/providers/RemotePrimitiveProvider.ts +2 -2
  416. package/src/server/links/providers/ServerLinksProvider.ts +2 -2
  417. package/src/server/rate-limit/{primitives → __tests__}/$rateLimit.spec.ts +1 -1
  418. package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +2 -2
  419. package/src/server/swagger/providers/ServerSwaggerProvider.ts +2 -2
  420. package/src/sms/{providers → __tests__}/LocalSmsProvider.spec.ts +35 -29
  421. package/src/sms/providers/LocalSmsProvider.ts +13 -24
  422. package/src/system/{providers → __tests__}/MemoryFileSystemProvider.spec.ts +1 -1
  423. package/src/system/{providers → __tests__}/MemoryShellProvider.spec.ts +1 -1
  424. package/src/topic/redis/providers/RedisTopicProvider.ts +2 -2
  425. package/src/websocket/{services → __tests__}/RoomManager.spec.ts +1 -1
  426. package/src/websocket/providers/NodeWebSocketServerProvider.ts +2 -2
  427. package/src/cli/platform/adapters/DockerAdapter.spec.ts +0 -378
  428. package/src/cli/platform/adapters/DockerAdapter.ts +0 -417
  429. package/src/cli/platform/services/DockerComposeGenerator.spec.ts +0 -490
  430. package/src/cli/platform/services/DockerComposeGenerator.ts +0 -353
  431. package/src/cli/platform/services/DockerSshService.spec.ts +0 -47
  432. package/src/cli/platform/services/DockerSshService.ts +0 -61
  433. /package/src/api/audits/{primitives → __tests__}/$audit.spec.ts +0 -0
  434. /package/src/api/audits/{services → __tests__}/AuditService.spec.ts +0 -0
  435. /package/src/api/files/{controllers → __tests__}/AdminFileStatsController.spec.ts +0 -0
  436. /package/src/api/files/{controllers → __tests__}/FileController.spec.ts +0 -0
  437. /package/src/api/files/{jobs → __tests__}/FileJobs.spec.ts +0 -0
  438. /package/src/api/files/{services → __tests__}/FileService.spec.ts +0 -0
  439. /package/src/api/jobs/{primitives → __tests__}/$job-middleware.spec.ts +0 -0
  440. /package/src/api/parameters/{primitives → __tests__}/$parameter.spec.ts +0 -0
  441. /package/src/api/users/{primitives → __tests__}/$realm.spec.ts +0 -0
  442. /package/src/api/users/{controllers → __tests__}/AdminIdentityController.spec.ts +0 -0
  443. /package/src/api/users/{controllers → __tests__}/AdminSessionController.spec.ts +0 -0
  444. /package/src/api/users/{controllers → __tests__}/AdminUserController.spec.ts +0 -0
  445. /package/src/api/users/{services → __tests__}/CredentialService.spec.ts +0 -0
  446. /package/src/api/users/{providers → __tests__}/RealmProvider.spec.ts +0 -0
  447. /package/src/api/users/{services → __tests__}/RegistrationService.spec.ts +0 -0
  448. /package/src/batch/{primitives → __tests__}/$batch.spec.ts +0 -0
  449. /package/src/batch/{providers → __tests__}/BatchProvider.spec.ts +0 -0
  450. /package/src/bucket/{primitives → __tests__}/$bucket.spec.ts +0 -0
  451. /package/src/bucket/{providers → __tests__}/FileStorageProvider.spec.ts +0 -0
  452. /package/src/bucket/{providers → __tests__}/LocalFileStorageProvider.spec.ts +0 -0
  453. /package/src/bucket/{providers → __tests__}/MemoryFileStorageProvider.spec.ts +0 -0
  454. /package/src/cache/core/{primitives → __tests__}/$cache.spec.ts +0 -0
  455. /package/src/cache/redis/{providers → __tests__}/RedisCacheProvider.spec.ts +0 -0
  456. /package/src/command/{primitives → __tests__}/$command.spec.ts +0 -0
  457. /package/src/command/{helpers → __tests__}/Asker.spec.ts +0 -0
  458. /package/src/command/{helpers → __tests__}/Runner.spec.ts +0 -0
  459. /package/src/core/{primitives → __tests__}/$context.spec.ts +0 -0
  460. /package/src/core/{primitives → __tests__}/$env.spec.ts +0 -0
  461. /package/src/core/{primitives → __tests__}/$hook.spec.ts +0 -0
  462. /package/src/core/{primitives → __tests__}/$inject.spec.ts +0 -0
  463. /package/src/core/{primitives → __tests__}/$module.spec.ts +0 -0
  464. /package/src/core/{providers → __tests__}/CodecManager.spec.ts +0 -0
  465. /package/src/core/{providers → __tests__}/EventManager.spec.ts +0 -0
  466. /package/src/core/{providers → __tests__}/StateManager.spec.ts +0 -0
  467. /package/src/core/{providers → __tests__}/TypeProvider.spec.ts +0 -0
  468. /package/src/datetime/{primitives → __tests__}/$interval.spec.ts +0 -0
  469. /package/src/datetime/{providers → __tests__}/DateTimeProvider.spec.ts +0 -0
  470. /package/src/email/core/{primitives → __tests__}/$email.spec.ts +0 -0
  471. /package/src/fake/{providers → __tests__}/FakeProvider.spec.ts +0 -0
  472. /package/src/lock/core/{providers → __tests__}/MemoryLockProvider.spec.ts +0 -0
  473. /package/src/lock/redis/{providers → __tests__}/RedisLockProvider.spec.ts +0 -0
  474. /package/src/logger/{primitives → __tests__}/$logger.spec.ts +0 -0
  475. /package/src/logger/{services → __tests__}/Logger.spec.ts +0 -0
  476. /package/src/mcp/{primitives → __tests__}/$prompt.spec.ts +0 -0
  477. /package/src/mcp/{primitives → __tests__}/$resource.spec.ts +0 -0
  478. /package/src/mcp/{primitives → __tests__}/$tool.spec.ts +0 -0
  479. /package/src/mcp/{providers → __tests__}/McpServerProvider.spec.ts +0 -0
  480. /package/src/mcp/{helpers → __tests__}/jsonrpc.spec.ts +0 -0
  481. /package/src/orm/core/{helpers → __tests__}/parseQueryString.spec.ts +0 -0
  482. /package/src/queue/core/{primitives → __tests__}/$consumer.spec.ts +0 -0
  483. /package/src/queue/core/{providers → __tests__}/MemoryQueueProvider.spec.ts +0 -0
  484. /package/src/queue/core/{providers → __tests__}/WorkerProvider.spec.ts +0 -0
  485. /package/src/queue/redis/{providers → __tests__}/RedisQueueProvider.spec.ts +0 -0
  486. /package/src/react/form/{hooks → __tests__}/useForm.browser.spec.tsx +0 -0
  487. /package/src/react/head/{hooks → __tests__}/useHead.spec.tsx +0 -0
  488. /package/src/react/i18n/{components → __tests__}/Localize.spec.tsx +0 -0
  489. /package/src/react/router/{primitives → __tests__}/$page.browser.spec.tsx +0 -0
  490. /package/src/react/router/{primitives → __tests__}/$page.middleware.spec.tsx +0 -0
  491. /package/src/react/router/{primitives → __tests__}/$page.spec.tsx +0 -0
  492. /package/src/react/router/{providers → __tests__}/ReactPreloadProvider.spec.ts +0 -0
  493. /package/src/react/router/{providers → __tests__}/ReactServerProvider.spec.tsx +0 -0
  494. /package/src/react/router/{providers → __tests__}/ReactServerTemplateProvider.spec.ts +0 -0
  495. /package/src/retry/{primitives → __tests__}/$retry.spec.ts +0 -0
  496. /package/src/retry/{providers → __tests__}/RetryProvider.spec.ts +0 -0
  497. /package/src/router/{providers → __tests__}/RouterProvider.spec.ts +0 -0
  498. /package/src/security/{primitives → __tests__}/$issuer.spec.ts +0 -0
  499. /package/src/security/{primitives → __tests__}/$permission.spec.ts +0 -0
  500. /package/src/security/{primitives → __tests__}/$role.spec.ts +0 -0
  501. /package/src/security/{primitives → __tests__}/$serviceAccount.spec.ts +0 -0
  502. /package/src/security/{providers → __tests__}/SecurityProvider.spec.ts +0 -0
  503. /package/src/server/cookies/{providers → __tests__}/ServerCookiesProvider.spec.ts +0 -0
  504. /package/src/server/core/{primitives → __tests__}/$action.spec.ts +0 -0
  505. /package/src/server/core/{primitives → __tests__}/$middleware.spec.ts +0 -0
  506. /package/src/server/core/{primitives → __tests__}/$route.spec.ts +0 -0
  507. /package/src/server/core/{primitives → __tests__}/$sse.spec.ts +0 -0
  508. /package/src/server/core/{providers → __tests__}/BunHttpServerProvider.bun.spec.ts +0 -0
  509. /package/src/server/core/{services → __tests__}/HttpClient.spec.ts +0 -0
  510. /package/src/server/core/{providers → __tests__}/ServerLoggerProvider.spec.ts +0 -0
  511. /package/src/server/core/{services → __tests__}/UserAgentParser.spec.ts +0 -0
  512. /package/src/server/cors/{providers → __tests__}/ServerCorsProvider.spec.ts +0 -0
  513. /package/src/server/etag/{providers → __tests__}/ServerEtagProvider.spec.ts +0 -0
  514. /package/src/server/health/{providers → __tests__}/ServerHealthProvider.spec.ts +0 -0
  515. /package/src/server/links/{primitives → __tests__}/$remote.spec.ts +0 -0
  516. /package/src/server/links/{services → __tests__}/BatchEndpoint.spec.ts +0 -0
  517. /package/src/server/links/{providers → __tests__}/LinkProvider.spec.ts +0 -0
  518. /package/src/server/links/{providers → __tests__}/ServerLinksProvider.spec.ts +0 -0
  519. /package/src/server/metrics/{providers → __tests__}/ServerMetricsProvider.spec.ts +0 -0
  520. /package/src/server/proxy/{primitives → __tests__}/$proxy.spec.ts +0 -0
  521. /package/src/server/rate-limit/{providers → __tests__}/ServerRateLimitProvider.spec.ts +0 -0
  522. /package/src/server/static/{primitives → __tests__}/$serve.spec.ts +0 -0
  523. /package/src/server/swagger/{primitives → __tests__}/$swagger.spec.ts +0 -0
  524. /package/src/sms/{primitives → __tests__}/$sms.spec.ts +0 -0
  525. /package/src/sms/{providers → __tests__}/MemorySmsProvider.spec.ts +0 -0
  526. /package/src/system/{services → __tests__}/FileDetector.spec.ts +0 -0
  527. /package/src/system/{providers → __tests__}/NodeFileSystemProvider.spec.ts +0 -0
  528. /package/src/topic/core/{primitives → __tests__}/$subscriber.spec.ts +0 -0
  529. /package/src/topic/core/{providers → __tests__}/MemoryTopicProvider.spec.ts +0 -0
  530. /package/src/topic/redis/{providers → __tests__}/RedisTopicProvider.spec.ts +0 -0
  531. /package/src/websocket/{primitives → __tests__}/$channel.spec.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/orm/core/schemas/insertSchema.ts","../../../src/orm/core/schemas/updateSchema.ts","../../../src/orm/core/primitives/$entity.ts","../../../src/orm/core/constants/PG_SYMBOLS.ts","../../../src/orm/core/helpers/pgAttr.ts","../../../src/orm/core/schemas/databaseEnvSchema.ts","../../../src/api/jobs/primitives/$job.ts","../../../src/api/jobs/providers/JobProvider.ts","../../../src/api/jobs/schemas/jobActivitySchema.ts","../../../src/api/jobs/schemas/jobCronInfoSchema.ts","../../../src/api/jobs/schemas/jobExecutionQuerySchema.ts","../../../src/api/jobs/schemas/jobFailureSchema.ts","../../../src/api/jobs/schemas/jobQueueDepthSchema.ts","../../../src/api/jobs/schemas/jobRegistrationSchema.ts","../../../src/api/jobs/schemas/jobStatsSchema.ts","../../../src/api/jobs/services/JobService.ts","../../../src/api/jobs/controllers/AdminJobController.ts","../../../src/api/jobs/entities/jobExecutionEntity.ts","../../../src/api/jobs/entities/jobExecutionLogEntity.ts","../../../src/api/jobs/providers/JobQueueProvider.ts","../../../src/api/jobs/schemas/jobConfigAtom.ts","../../../src/api/jobs/schemas/jobExecutionDetailResourceSchema.ts","../../../src/api/jobs/schemas/jobExecutionResourceSchema.ts","../../../src/api/jobs/schemas/triggerJobSchema.ts","../../../src/api/jobs/index.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/orm/core/schemas/insertSchema.ts","../../../src/orm/core/schemas/updateSchema.ts","../../../src/orm/core/primitives/$entity.ts","../../../src/orm/core/constants/PG_SYMBOLS.ts","../../../src/orm/core/helpers/pgAttr.ts","../../../src/orm/core/schemas/databaseEnvSchema.ts","../../../src/api/jobs/primitives/$job.ts","../../../src/api/jobs/providers/JobProvider.ts","../../../src/api/jobs/schemas/jobActivitySchema.ts","../../../src/api/jobs/schemas/jobCronInfoSchema.ts","../../../src/api/jobs/schemas/jobExecutionQuerySchema.ts","../../../src/api/jobs/schemas/jobFailureSchema.ts","../../../src/api/jobs/schemas/jobQueueDepthSchema.ts","../../../src/api/jobs/schemas/jobRegistrationSchema.ts","../../../src/api/jobs/schemas/jobStatsSchema.ts","../../../src/api/jobs/services/JobService.ts","../../../src/api/jobs/controllers/AdminJobController.ts","../../../src/api/jobs/entities/jobExecutionEntity.ts","../../../src/api/jobs/entities/jobExecutionLogEntity.ts","../../../src/api/jobs/providers/JobQueueProvider.ts","../../../src/api/jobs/schemas/jobConfigAtom.ts","../../../src/api/jobs/schemas/jobExecutionDetailResourceSchema.ts","../../../src/api/jobs/schemas/jobExecutionResourceSchema.ts","../../../src/api/jobs/schemas/triggerJobSchema.ts","../../../src/api/jobs/index.ts"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { $atom, $hook, $inject, $module, $use, Alepha, AlephaError, KIND, PipelinePrimitive, createPrimitive, t } from "alepha";
1
+ import { $atom, $hook, $inject, $module, $state, Alepha, AlephaError, KIND, PipelinePrimitive, createPrimitive, t } from "alepha";
2
2
  import { AlephaBatch } from "alepha/batch";
3
3
  import { AlephaLock } from "alepha/lock";
4
4
  import { $queue, AlephaQueue } from "alepha/queue";
@@ -256,7 +256,7 @@ var JobProvider = class JobProvider {
256
256
  alepha = $inject(Alepha);
257
257
  dt = $inject(DateTimeProvider);
258
258
  cronProvider = $inject(CronProvider);
259
- config = $use(jobConfig);
259
+ config = $state(jobConfig);
260
260
  log = $logger();
261
261
  executions = $repository(jobExecutionEntity);
262
262
  executionLogs = $repository(jobExecutionLogEntity);
@@ -282,10 +282,16 @@ var JobProvider = class JobProvider {
282
282
  priority: options.priority ?? "normal",
283
283
  retries: options.retry?.retries ?? 0
284
284
  });
285
- if (options.cron) this.cronProvider.createCronJob(name, options.cron, () => this.trigger(name, {
286
- triggeredBy: "system",
287
- triggeredByName: "system (cron)"
288
- }));
285
+ if (options.cron) this.cronProvider.createCronJob(name, options.cron, async () => {
286
+ try {
287
+ await this.trigger(name, {
288
+ triggeredBy: "system",
289
+ triggeredByName: "system (cron)"
290
+ });
291
+ } catch (error) {
292
+ this.log.error(`Cron trigger failed for job '${name}'`, error);
293
+ }
294
+ });
289
295
  }
290
296
  /**
291
297
  * Get all registered job definitions.
@@ -693,7 +699,7 @@ var JobProvider = class JobProvider {
693
699
  on: "start",
694
700
  handler: async () => {
695
701
  this.workerId = crypto.randomUUID().slice(0, 12);
696
- this.log.info(`Job system started`, {
702
+ this.log.info(`Job system OK`, {
697
703
  workerId: this.workerId,
698
704
  dispatch: this.queueDispatch ? "queue" : "inline"
699
705
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/api/jobs/schemas/jobActivitySchema.ts","../../../src/api/jobs/schemas/jobCronInfoSchema.ts","../../../src/api/jobs/entities/jobExecutionEntity.ts","../../../src/api/jobs/schemas/jobExecutionResourceSchema.ts","../../../src/api/jobs/schemas/jobExecutionDetailResourceSchema.ts","../../../src/api/jobs/schemas/jobExecutionQuerySchema.ts","../../../src/api/jobs/schemas/jobFailureSchema.ts","../../../src/api/jobs/schemas/jobQueueDepthSchema.ts","../../../src/api/jobs/schemas/jobRegistrationSchema.ts","../../../src/api/jobs/schemas/jobStatsSchema.ts","../../../src/api/jobs/schemas/triggerJobSchema.ts","../../../src/api/jobs/entities/jobExecutionLogEntity.ts","../../../src/api/jobs/schemas/jobConfigAtom.ts","../../../src/api/jobs/providers/JobProvider.ts","../../../src/api/jobs/primitives/$job.ts","../../../src/api/jobs/services/JobService.ts","../../../src/api/jobs/controllers/AdminJobController.ts","../../../src/api/jobs/providers/JobQueueProvider.ts","../../../src/api/jobs/index.ts"],"sourcesContent":["import { type Static, t } from \"alepha\";\n\nexport const jobActivityPointSchema = t.object({\n date: t.text(),\n completed: t.integer(),\n failed: t.integer(),\n});\n\nexport type JobActivityPoint = Static<typeof jobActivityPointSchema>;\n\nexport const jobActivityQuerySchema = t.object({\n days: t.optional(t.integer({ minimum: 1, maximum: 90 })),\n});\n\nexport type JobActivityQuery = Static<typeof jobActivityQuerySchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const jobCronInfoSchema = t.object({\n name: t.text(),\n cron: t.text(),\n lock: t.boolean(),\n priority: t.enum([\"critical\", \"high\", \"normal\", \"low\"]),\n concurrency: t.integer(),\n hasSchema: t.boolean(),\n lastExecution: t.optional(\n t.object({\n id: t.uuid(),\n status: t.text(),\n startedAt: t.optional(t.datetime()),\n completedAt: t.optional(t.datetime()),\n error: t.optional(t.text()),\n }),\n ),\n});\n\nexport type JobCronInfo = Static<typeof jobCronInfoSchema>;\n","import { type Static, t } from \"alepha\";\nimport { $entity, db } from \"alepha/orm\";\n\nexport const jobExecutionEntity = $entity({\n name: \"job_executions\",\n schema: t.object({\n id: db.primaryKey(t.uuid()),\n createdAt: db.createdAt(),\n updatedAt: db.updatedAt(),\n\n jobName: t.text(),\n key: t.optional(t.nullable(t.text())),\n\n payload: t.optional(t.record(t.text(), t.any())),\n status: db.default(\n t.enum([\n \"pending\",\n \"scheduled\",\n \"retrying\",\n \"running\",\n \"completed\",\n \"failed\",\n \"dead\",\n \"cancelled\",\n ]),\n \"pending\",\n ),\n priority: db.default(t.integer({ minimum: 0, maximum: 3 }), 2),\n\n attempt: db.default(t.integer(), 0),\n maxAttempts: db.default(t.integer(), 1),\n\n scheduledAt: t.optional(t.datetime()),\n startedAt: t.optional(t.datetime()),\n completedAt: t.optional(t.datetime()),\n\n result: t.optional(t.record(t.text(), t.any())),\n error: t.optional(t.text()),\n workerId: t.optional(t.text()),\n\n triggeredBy: t.optional(t.text()),\n triggeredByName: t.optional(t.text()),\n cancelledBy: t.optional(t.text()),\n cancelledByName: t.optional(t.text()),\n }),\n indexes: [\n { columns: [\"jobName\", \"status\", \"priority\", \"scheduledAt\"] },\n { columns: [\"jobName\", \"status\", \"startedAt\"] },\n { columns: [\"jobName\", \"completedAt\"] },\n { columns: [\"jobName\", \"key\"], unique: true },\n ],\n});\n\nexport type JobExecutionEntity = Static<typeof jobExecutionEntity.schema>;\n\nexport type JobStatus =\n | \"pending\"\n | \"scheduled\"\n | \"retrying\"\n | \"running\"\n | \"completed\"\n | \"failed\"\n | \"dead\"\n | \"cancelled\";\n","import { type Static, t } from \"alepha\";\nimport { jobExecutionEntity } from \"../entities/jobExecutionEntity.ts\";\n\nexport const jobExecutionCanSchema = t.object({\n retry: t.boolean(),\n cancel: t.boolean(),\n});\n\nexport const jobExecutionResourceSchema = t.extend(\n jobExecutionEntity.schema,\n {\n can: jobExecutionCanSchema,\n },\n {\n title: \"JobExecutionResource\",\n description: \"A job execution resource.\",\n },\n);\n\nexport type JobExecutionResource = Static<typeof jobExecutionResourceSchema>;\n","import { type Static, t } from \"alepha\";\nimport { logEntrySchema } from \"alepha/logger\";\nimport { jobExecutionEntity } from \"../entities/jobExecutionEntity.ts\";\nimport { jobExecutionCanSchema } from \"./jobExecutionResourceSchema.ts\";\n\nexport const jobExecutionDetailResourceSchema = t.extend(\n jobExecutionEntity.schema,\n {\n can: jobExecutionCanSchema,\n logs: t.optional(t.array(logEntrySchema)),\n },\n {\n title: \"JobExecutionDetailResource\",\n description: \"A job execution resource with logs.\",\n },\n);\n\nexport type JobExecutionDetailResource = Static<\n typeof jobExecutionDetailResourceSchema\n>;\n","import { type Static, t } from \"alepha\";\nimport { pageQuerySchema } from \"alepha/orm\";\n\nexport const jobExecutionQuerySchema = t.extend(pageQuerySchema, {\n job: t.optional(\n t.text({\n description: \"Filter by job name\",\n }),\n ),\n status: t.optional(\n t.enum([\n \"pending\",\n \"scheduled\",\n \"retrying\",\n \"running\",\n \"completed\",\n \"failed\",\n \"dead\",\n \"cancelled\",\n ]),\n ),\n priority: t.optional(t.enum([\"critical\", \"high\", \"normal\", \"low\"])),\n from: t.optional(\n t.datetime({\n description: \"From date (ISO)\",\n }),\n ),\n to: t.optional(\n t.datetime({\n description: \"To date (ISO)\",\n }),\n ),\n});\n\nexport type JobExecutionQuery = Static<typeof jobExecutionQuerySchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const jobFailureSchema = t.object({\n jobName: t.text(),\n failures: t.integer(),\n lastError: t.optional(t.text()),\n});\n\nexport type JobFailure = Static<typeof jobFailureSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const jobQueueDepthSchema = t.object({\n jobName: t.text(),\n pending: t.integer(),\n running: t.integer(),\n scheduled: t.integer(),\n retrying: t.integer(),\n dead: t.integer(),\n concurrency: t.integer(),\n});\n\nexport type JobQueueDepth = Static<typeof jobQueueDepthSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const jobRegistrationSchema = t.object({\n name: t.text(),\n type: t.enum([\"cron\", \"push\", \"both\"]),\n priority: t.enum([\"critical\", \"high\", \"normal\", \"low\"]),\n concurrency: t.integer(),\n hasSchema: t.boolean(),\n cron: t.optional(t.text()),\n timeout: t.optional(t.text()),\n retry: t.optional(\n t.object({\n retries: t.integer(),\n hasBackoff: t.boolean(),\n }),\n ),\n batch: t.optional(\n t.object({\n size: t.integer(),\n window: t.text(),\n }),\n ),\n});\n\nexport type JobRegistration = Static<typeof jobRegistrationSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const jobStatsSchema = t.object({\n registered: t.integer(),\n running: t.integer(),\n pending: t.integer(),\n scheduled: t.integer(),\n retrying: t.integer(),\n dead: t.integer(),\n completed: t.integer(),\n failed: t.integer(),\n});\n\nexport type JobStats = Static<typeof jobStatsSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const triggerJobSchema = t.object({\n name: t.text(),\n payload: t.optional(t.record(t.text(), t.any())),\n});\n\nexport type TriggerJob = Static<typeof triggerJobSchema>;\n","import { type Static, t } from \"alepha\";\nimport { logEntrySchema } from \"alepha/logger\";\nimport { $entity, db } from \"alepha/orm\";\n\nexport const jobExecutionLogEntity = $entity({\n name: \"job_execution_logs\",\n schema: t.object({\n id: db.primaryKey(t.uuid()),\n logs: t.array(logEntrySchema),\n }),\n});\n\nexport type JobExecutionLogEntity = Static<typeof jobExecutionLogEntity.schema>;\n","import { $atom, type Static, t } from \"alepha\";\n\nexport const jobConfig = $atom({\n name: \"alepha.jobs\",\n description: \"Configuration for the $job v2 primitive.\",\n schema: t.object({\n recovery: t.object({\n interval: t.integer({ description: \"Sweep interval (ms).\" }),\n staleThreshold: t.integer({\n description: \"Pending age (ms) before re-dispatch.\",\n }),\n runTimeout: t.integer({\n description:\n \"Running age (ms) before assumed crash. Used as fallback when no per-job timeout is set.\",\n }),\n }),\n delayed: t.object({\n interval: t.integer({ description: \"Sweep interval (ms).\" }),\n }),\n logRetentionDays: t.integer({\n description: \"Days to keep completed/dead executions.\",\n }),\n logMaxEntries: t.integer({\n description: \"Max log entries captured per execution.\",\n }),\n }),\n default: {\n recovery: {\n interval: 300_000,\n staleThreshold: 300_000,\n runTimeout: 1_800_000,\n },\n delayed: {\n interval: 300_000,\n },\n logRetentionDays: 30,\n logMaxEntries: 100,\n },\n});\n\nexport type JobConfig = Static<typeof jobConfig.schema>;\n\ndeclare module \"alepha\" {\n interface State {\n [jobConfig.key]: JobConfig;\n }\n}\n","import {\n $hook,\n $inject,\n $use,\n Alepha,\n AlephaError,\n type Static,\n type TSchema,\n} from \"alepha\";\nimport { DateTimeProvider, type DurationLike } from \"alepha/datetime\";\nimport type { LogEntry } from \"alepha/logger\";\nimport { $logger } from \"alepha/logger\";\nimport { $repository } from \"alepha/orm\";\nimport { CronProvider } from \"alepha/scheduler\";\nimport {\n type JobStatus,\n jobExecutionEntity,\n} from \"../entities/jobExecutionEntity.ts\";\nimport { jobExecutionLogEntity } from \"../entities/jobExecutionLogEntity.ts\";\nimport type {\n JobItem,\n JobPrimitiveOptions,\n JobPriority,\n JobRetryBackoff,\n JobRetryOptions,\n} from \"../primitives/$job.ts\";\nimport { jobConfig } from \"../schemas/jobConfigAtom.ts\";\n\n// -----------------------------------------------------------------------------------------------------------------\n\nconst PRIORITY_MAP: Record<string, number> = {\n critical: 0,\n high: 1,\n normal: 2,\n low: 3,\n};\n\nconst PRIORITY_REVERSE: Record<number, JobPriority> = {\n 0: \"critical\",\n 1: \"high\",\n 2: \"normal\",\n 3: \"low\",\n};\n\n// -----------------------------------------------------------------------------------------------------------------\n\nexport interface PushOptions {\n delay?: DurationLike;\n key?: string;\n priority?: JobPriority;\n scheduledAt?: Date;\n}\n\nexport interface PushManyItem<T extends TSchema = TSchema> {\n payload: Static<T>;\n key?: string;\n delay?: DurationLike;\n priority?: JobPriority;\n scheduledAt?: Date;\n}\n\nexport interface JobTriggerContext {\n payload?: Record<string, unknown>;\n triggeredBy?: string;\n triggeredByName?: string;\n}\n\nexport interface CancelContext {\n cancelledBy?: string;\n cancelledByName?: string;\n}\n\ninterface JobRegistration {\n name: string;\n options: JobPrimitiveOptions;\n}\n\n// -----------------------------------------------------------------------------------------------------------------\n\nexport class JobProvider {\n protected readonly alepha = $inject(Alepha);\n protected readonly dt = $inject(DateTimeProvider);\n protected readonly cronProvider = $inject(CronProvider);\n protected readonly config = $use(jobConfig);\n protected readonly log = $logger();\n protected readonly executions = $repository(jobExecutionEntity);\n protected readonly executionLogs = $repository(jobExecutionLogEntity);\n\n protected readonly jobs = new Map<string, JobRegistration>();\n\n /**\n * When set, job executions are dispatched through a queue (e.g. `JobQueueProvider`).\n * When null, jobs execute inline (fire-and-forget). Useful for serverless environments.\n */\n public queueDispatch:\n | ((jobName: string, executionId: string) => Promise<void>)\n | null = null;\n protected readonly logs = new Map<string, LogEntry[]>();\n protected readonly abortControllers = new Map<string, AbortController>();\n protected static readonly SWEEP_CRON = \"*/5 * * * *\";\n protected stopping = false;\n protected workerId = \"\";\n\n // --- Registration ---\n\n public registerJob(name: string, options: JobPrimitiveOptions): void {\n if (this.jobs.has(name)) {\n throw new AlephaError(`Job already registered: ${name}`);\n }\n\n this.jobs.set(name, { name, options });\n this.log.debug(`Registered job '${name}'`, {\n cron: options.cron,\n priority: options.priority ?? \"normal\",\n retries: options.retry?.retries ?? 0,\n });\n\n if (options.cron) {\n this.cronProvider.createCronJob(name, options.cron, () =>\n this.trigger(name, {\n triggeredBy: \"system\",\n triggeredByName: \"system (cron)\",\n }),\n );\n }\n }\n\n /**\n * Get all registered job definitions.\n */\n public getRegisteredJobs(): Map<string, JobRegistration> {\n return this.jobs;\n }\n\n // --- Push ---\n\n public async push(\n name: string,\n payload: unknown,\n options?: PushOptions,\n ): Promise<string> {\n const registration = this.getRegistration(name);\n const opts = registration.options;\n\n if (!opts.schema) {\n throw new AlephaError(\n `Cannot push to job '${name}': no schema defined. Use trigger() for cron-only jobs.`,\n );\n }\n\n const validated = this.alepha.codec.validate(opts.schema, payload);\n\n const priority =\n PRIORITY_MAP[options?.priority ?? opts.priority ?? \"normal\"];\n const maxAttempts = (opts.retry?.retries ?? 0) + 1;\n\n const isDelayed = options?.delay || options?.scheduledAt;\n const status: JobStatus = isDelayed ? \"scheduled\" : \"pending\";\n\n let scheduledAt: string | undefined;\n if (options?.scheduledAt) {\n scheduledAt = options.scheduledAt.toISOString();\n } else if (options?.delay) {\n const now = this.dt.now();\n scheduledAt = now.add(this.dt.duration(options.delay)).toISOString();\n }\n\n // Keyed path: atomic upsert to avoid race between concurrent pushes\n if (options?.key) {\n const now = this.dt.nowISOString();\n const execution = await this.executions.upsert(\n {\n jobName: name,\n key: options.key,\n payload: validated as Record<string, unknown>,\n status,\n priority,\n maxAttempts,\n scheduledAt,\n createdAt: now,\n updatedAt: now,\n },\n { target: [\"jobName\", \"key\"], set: {}, now },\n );\n\n // Fresh insert: both timestamps equal the explicit `now` value.\n // Conflict: updatedAt was bumped by the ON CONFLICT SET clause, so they differ.\n if (\n execution.createdAt === execution.updatedAt &&\n status === \"pending\" &&\n !this.stopping\n ) {\n await this.scheduleProcessing(name, execution.id);\n }\n\n return execution.id;\n }\n\n const execution = await this.executions.create({\n jobName: name,\n payload: validated as Record<string, unknown>,\n status,\n priority,\n maxAttempts,\n scheduledAt,\n });\n\n this.log.debug(`Pushed job '${name}'`, {\n executionId: execution.id,\n status,\n priority: PRIORITY_REVERSE[priority],\n });\n\n // Dispatch to processing if immediate\n if (status === \"pending\" && !this.stopping) {\n await this.scheduleProcessing(name, execution.id);\n }\n\n return execution.id;\n }\n\n public async pushMany(\n name: string,\n items: Array<PushManyItem>,\n ): Promise<string[]> {\n const ids: string[] = [];\n for (const item of items) {\n const id = await this.push(name, item.payload, {\n key: item.key,\n delay: item.delay,\n priority: item.priority,\n scheduledAt: item.scheduledAt,\n });\n ids.push(id);\n }\n return ids;\n }\n\n // --- Trigger (manual / cron) ---\n\n public async trigger(\n name: string,\n context?: JobTriggerContext,\n ): Promise<void> {\n const registration = this.getRegistration(name);\n const opts = registration.options;\n\n if (context?.payload && opts.schema) {\n // Push-based trigger with payload\n const id = await this.push(name, context.payload, {});\n // Update trigger info\n await this.executions.updateById(id, {\n triggeredBy: context?.triggeredBy,\n triggeredByName: context?.triggeredByName,\n });\n return;\n }\n\n // Cron-style or manual trigger without payload\n const maxAttempts = (opts.retry?.retries ?? 0) + 1;\n const priority = PRIORITY_MAP[opts.priority ?? \"normal\"];\n\n const execution = await this.executions.create({\n jobName: name,\n status: \"pending\",\n priority,\n maxAttempts,\n triggeredBy: context?.triggeredBy,\n triggeredByName: context?.triggeredByName,\n });\n\n this.log.debug(`Triggered job '${name}'`, {\n executionId: execution.id,\n triggeredBy: context?.triggeredByName ?? context?.triggeredBy,\n });\n\n if (!this.stopping) {\n await this.scheduleProcessing(name, execution.id);\n }\n }\n\n // --- Cancel ---\n\n public async cancel(\n executionId: string,\n context?: CancelContext,\n ): Promise<void> {\n const execution = await this.executions.findById(executionId);\n if (!execution) {\n throw new AlephaError(`Execution not found: ${executionId}`);\n }\n\n if (\n execution.status === \"completed\" ||\n execution.status === \"dead\" ||\n execution.status === \"cancelled\"\n ) {\n throw new AlephaError(\n `Cannot cancel execution in '${execution.status}' status`,\n );\n }\n\n // If running, trigger the AbortSignal\n const controller = this.abortControllers.get(executionId);\n if (controller) {\n controller.abort();\n }\n\n await this.executions.updateById(executionId, {\n status: \"cancelled\",\n key: null,\n cancelledBy: context?.cancelledBy,\n cancelledByName: context?.cancelledByName,\n completedAt: this.dt.nowISOString(),\n });\n\n this.log.info(`Cancelled execution ${executionId}`, {\n jobName: execution.jobName,\n cancelledBy: context?.cancelledByName ?? context?.cancelledBy,\n });\n }\n\n // --- Execution ---\n\n protected async scheduleProcessing(\n jobName: string,\n executionId: string,\n ): Promise<void> {\n if (this.queueDispatch) {\n this.log.debug(`Dispatching job '${jobName}' via queue`, { executionId });\n await this.queueDispatch(jobName, executionId);\n } else {\n this.log.debug(`Executing job '${jobName}' inline`, { executionId });\n await this.processExecution(jobName, executionId);\n }\n }\n\n public async processExecution(\n jobName: string,\n executionId: string,\n ): Promise<void> {\n const registration = this.getRegistration(jobName);\n\n // Claim the execution atomically\n const claimed = await this.claim(executionId);\n if (!claimed) {\n this.log.debug(`Execution ${executionId} already claimed, skipping`);\n return;\n }\n\n const context = this.alepha.context.createContextId();\n this.logs.set(context, []);\n\n this.log.debug(`Started processing job '${jobName}'`, { executionId });\n\n try {\n await this.alepha.context.run(\n async () => {\n // Create AbortController for timeout + cancellation\n const abortController = new AbortController();\n this.abortControllers.set(executionId, abortController);\n\n // Set up timeout if configured\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const opts = registration.options;\n if (opts.timeout) {\n const ms = this.dt.duration(opts.timeout).as(\"milliseconds\");\n timeoutId = setTimeout(() => abortController.abort(), ms);\n }\n\n const now = this.dt.now();\n\n await this.alepha.events.emit(\"job:begin\", {\n name: jobName,\n now,\n executionId,\n });\n\n try {\n // Build items array\n const execution = await this.executions.findById(executionId);\n const items: Array<JobItem> = [];\n if (execution?.payload) {\n items.push({\n id: executionId,\n payload: execution.payload,\n attempt: execution.attempt,\n });\n }\n\n // Execute handler\n this.log.debug(`Running job '${jobName}'`, {\n executionId,\n attempt: execution?.attempt,\n items: items.length,\n });\n\n await opts.handler({\n items,\n now,\n signal: abortController.signal,\n });\n\n // Success\n await this.executions.updateById(executionId, {\n status: \"completed\",\n completedAt: this.dt.nowISOString(),\n key: null,\n });\n\n this.log.info(`Job '${jobName}' completed`, { executionId });\n\n // Write logs to cold table\n await this.writeLogs(executionId, context);\n\n await this.alepha.events.emit(\n \"job:success\",\n { name: jobName, executionId },\n { catch: true },\n );\n } catch (error) {\n const err =\n error instanceof Error ? error : new Error(String(error));\n\n // Check if this was a cancellation\n if (abortController.signal.aborted) {\n // Already marked as cancelled by cancel() or it's a timeout\n const currentExecution =\n await this.executions.findById(executionId);\n if (currentExecution?.status !== \"cancelled\") {\n // Timeout — treat as failure\n await this.handleFailure(executionId, jobName, err, context);\n } else {\n // Was cancelled explicitly — just write logs\n await this.writeLogs(executionId, context);\n await this.alepha.events.emit(\n \"job:cancel\",\n { name: jobName, executionId },\n { catch: true },\n );\n }\n } else {\n await this.handleFailure(executionId, jobName, err, context);\n }\n } finally {\n if (timeoutId) clearTimeout(timeoutId);\n this.abortControllers.delete(executionId);\n\n await this.alepha.events.emit(\n \"job:end\",\n { name: jobName, executionId },\n { catch: true },\n );\n }\n },\n { context },\n );\n } finally {\n this.logs.delete(context);\n }\n }\n\n protected async claim(executionId: string): Promise<boolean> {\n const execution = await this.executions.findById(executionId);\n if (!execution) return false;\n\n try {\n await this.executions.updateOne(\n { id: { eq: executionId }, status: { eq: \"pending\" } },\n {\n status: \"running\",\n attempt: execution.attempt + 1,\n startedAt: this.dt.nowISOString(),\n workerId: this.workerId,\n },\n );\n return true;\n } catch {\n return false;\n }\n }\n\n protected async handleFailure(\n executionId: string,\n jobName: string,\n error: Error,\n context: string,\n ): Promise<void> {\n const execution = await this.executions.findById(executionId);\n if (!execution) return;\n\n const registration = this.getRegistration(jobName);\n const opts = registration.options;\n const retryOpts = opts.retry;\n\n const canRetry =\n retryOpts &&\n execution.attempt < execution.maxAttempts &&\n (retryOpts.when ? retryOpts.when(error) : true);\n\n if (canRetry) {\n // Compute next scheduledAt from backoff\n const nextScheduledAt = this.computeBackoff(retryOpts, execution.attempt);\n\n this.log.info(\n `Job '${jobName}' failed, scheduling retry ${execution.attempt}/${execution.maxAttempts}`,\n { executionId, error: error.message, nextScheduledAt },\n );\n\n await this.executions.updateById(executionId, {\n status: \"retrying\",\n error: error.message,\n scheduledAt: nextScheduledAt,\n });\n\n await this.writeLogs(executionId, context);\n\n // Optimistic dispatch: schedule a timeout for the exact backoff delay.\n // The delayed dispatch sweep is the safety net in case of crash.\n const delayMs = Math.max(\n 0,\n new Date(nextScheduledAt).getTime() - this.dt.nowMillis(),\n );\n this.dt.createTimeout(\n () => void this.dispatchRetrying(jobName, executionId),\n delayMs,\n );\n } else {\n // Dead — all retries exhausted or predicate returned false\n this.log.info(\n `Job '${jobName}' is dead after ${execution.attempt} attempt(s)`,\n { executionId, error: error.message },\n );\n\n await this.executions.updateById(executionId, {\n status: \"dead\",\n error: error.message,\n completedAt: this.dt.nowISOString(),\n key: null,\n });\n\n await this.writeLogs(executionId, context);\n }\n\n await this.alepha.events.emit(\n \"job:error\",\n { name: jobName, error, executionId },\n { catch: true },\n );\n }\n\n protected computeBackoff(\n retryOpts: JobRetryOptions,\n attempt: number,\n ): string {\n const now = this.dt.now();\n\n if (!retryOpts.backoff) {\n // Default: 1 second fixed\n return now.add(1, \"second\").toISOString();\n }\n\n // Fixed backoff shorthand: [5, \"second\"]\n if (Array.isArray(retryOpts.backoff)) {\n const delay = this.dt.duration(retryOpts.backoff);\n return now.add(delay).toISOString();\n }\n\n // Exponential backoff\n const backoff = retryOpts.backoff as JobRetryBackoff;\n const initial = this.dt.duration(backoff.initial).as(\"milliseconds\");\n const factor = backoff.factor ?? 2;\n let delayMs = initial * factor ** (attempt - 1);\n\n if (backoff.max) {\n const maxMs = this.dt.duration(backoff.max).as(\"milliseconds\");\n delayMs = Math.min(delayMs, maxMs);\n }\n\n if (backoff.jitter) {\n // Add up to 25% random jitter\n delayMs = delayMs * (0.75 + Math.random() * 0.5);\n }\n\n return now.add(delayMs, \"millisecond\").toISOString();\n }\n\n protected async writeLogs(\n executionId: string,\n context: string,\n ): Promise<void> {\n const entries = this.logs.get(context);\n if (!entries || entries.length === 0) return;\n\n const maxEntries = this.config.logMaxEntries;\n if (maxEntries === 0) return;\n\n let logs = entries;\n if (logs.length > maxEntries) {\n logs = logs.slice(0, maxEntries);\n logs.push({\n level: \"WARN\",\n message: `Log entries truncated at ${maxEntries}`,\n timestamp: this.dt.nowMillis(),\n service: \"alepha.jobs\",\n module: \"JobProvider\",\n } as LogEntry);\n }\n\n try {\n await this.executionLogs.create({\n id: executionId,\n logs,\n });\n } catch {\n // Log write failure is not critical\n this.log.warn(`Failed to write logs for execution ${executionId}`);\n }\n }\n\n protected async dispatchRetrying(\n jobName: string,\n executionId: string,\n ): Promise<void> {\n if (this.stopping) return;\n try {\n await this.executions.updateOne(\n { id: { eq: executionId }, status: { eq: \"retrying\" } },\n { status: \"pending\" },\n );\n await this.scheduleProcessing(jobName, executionId);\n } catch {\n // Already transitioned by another worker or sweep\n }\n }\n\n // --- Internal system sweeps (Section 5 of spec) ---\n\n /**\n * Recovery Sweep (Section 5.1)\n *\n * Runs every `recovery.interval` (default: 1 minute).\n * - Stale `pending` jobs older than `staleThreshold` → re-dispatch.\n * - Crashed `running` jobs older than `max(job.timeout * 2, recovery.runTimeout)` → mark failed, apply retry policy.\n */\n protected async recoverySweep(): Promise<void> {\n this.log.trace(\"Starting recovery sweep\");\n if (this.stopping) return;\n try {\n const now = this.dt.now();\n\n // 1. Stale pending jobs\n const staleThreshold = now\n .subtract(this.config.recovery.staleThreshold, \"millisecond\")\n .toISOString();\n\n const pendingWhere = this.executions.createQueryWhere();\n pendingWhere.status = { eq: \"pending\" };\n pendingWhere.createdAt = { lte: staleThreshold };\n\n const stalePending = await this.executions.findMany({\n where: pendingWhere,\n });\n\n for (const exec of stalePending) {\n if (!this.jobs.has(exec.jobName)) continue;\n this.log.debug(\n `Recovery sweep: re-dispatching stale pending job ${exec.jobName} (${exec.id})`,\n );\n await this.scheduleProcessing(exec.jobName, exec.id);\n }\n\n // 2. Crashed running jobs\n const runningWhere = this.executions.createQueryWhere();\n runningWhere.status = { eq: \"running\" };\n\n const running = await this.executions.findMany({ where: runningWhere });\n const nowMs = now.valueOf();\n\n for (const exec of running) {\n const registration = this.jobs.get(exec.jobName);\n if (!registration) continue;\n\n // If this worker owns it and has an active AbortController, skip (still alive)\n if (this.abortControllers.has(exec.id)) continue;\n\n const opts = registration.options;\n let crashThresholdMs: number;\n if (opts.timeout) {\n crashThresholdMs =\n this.dt.duration(opts.timeout).as(\"milliseconds\") * 2;\n } else {\n crashThresholdMs = this.config.recovery.runTimeout;\n }\n\n const startedAt = exec.startedAt\n ? new Date(exec.startedAt).getTime()\n : 0;\n if (startedAt > 0 && nowMs - startedAt > crashThresholdMs) {\n this.log.warn(\n `Recovery sweep: marking crashed job ${exec.jobName} (${exec.id}) as failed`,\n );\n const error = new Error(\n \"Execution assumed crashed (recovered by sweep)\",\n );\n await this.handleFailure(exec.id, exec.jobName, error, \"\");\n }\n }\n } catch (e) {\n this.log.error(\"Recovery sweep failed\", { error: e });\n }\n }\n\n /**\n * Delayed Dispatch Sweep (Section 5.2)\n *\n * Runs every `delayed.interval` (default: 30 seconds).\n * Scans for `scheduled` and `retrying` jobs where `scheduledAt <= now`,\n * moves them to `pending`, and dispatches to the queue layer.\n */\n protected async delayedDispatchSweep(): Promise<void> {\n this.log.trace(\"Starting delayed dispatch sweep\");\n if (this.stopping) return;\n try {\n const now = this.dt.nowISOString();\n\n const where = this.executions.createQueryWhere();\n where.status = { inArray: [\"scheduled\", \"retrying\"] };\n where.scheduledAt = { lte: now };\n\n const ready = await this.executions.findMany({ where });\n\n for (const exec of ready) {\n if (!this.jobs.has(exec.jobName)) continue;\n await this.executions.updateById(exec.id, { status: \"pending\" });\n await this.scheduleProcessing(exec.jobName, exec.id);\n }\n } catch (e) {\n this.log.error(\"Delayed dispatch sweep failed\", { error: e });\n }\n }\n\n /**\n * Log Purge (Section 5.3)\n *\n * Runs daily at 03:00 via cron.\n * Deletes completed/dead/cancelled execution records older than `logRetentionDays`.\n */\n protected async logPurge(): Promise<void> {\n if (this.stopping) return;\n try {\n const cutoff = this.dt\n .now()\n .subtract(this.config.logRetentionDays, \"day\")\n .toISOString();\n\n const where = this.executions.createQueryWhere();\n where.status = { inArray: [\"completed\", \"dead\", \"cancelled\"] };\n where.completedAt = { lte: cutoff };\n\n const old = await this.executions.findMany({ where });\n\n for (const exec of old) {\n try {\n await this.executionLogs.deleteById(exec.id);\n } catch {\n // Log record may not exist\n }\n await this.executions.deleteById(exec.id);\n }\n\n if (old.length > 0) {\n this.log.info(`Log purge: deleted ${old.length} old execution records`);\n }\n } catch (e) {\n this.log.error(\"Log purge failed\", { error: e });\n }\n }\n\n // --- Lifecycle hooks ---\n\n protected readonly onStart = $hook({\n on: \"start\",\n handler: async () => {\n this.workerId = crypto.randomUUID().slice(0, 12);\n this.log.info(`Job system started`, {\n workerId: this.workerId,\n dispatch: this.queueDispatch ? \"queue\" : \"inline\",\n });\n\n // Set up log capture listener (once)\n this.alepha.events.on(\"log\", ({ entry }) => {\n const ctx = entry.context;\n if (!ctx) return;\n const entries = this.logs.get(ctx);\n if (!entries) return;\n entries.push(entry);\n });\n\n // Run initial sweeps to recover from previous crashes.\n // Skipped on serverless — cron triggers handle periodic sweeps instead.\n if (!this.alepha.isServerless()) {\n await this.delayedDispatchSweep();\n await this.recoverySweep();\n }\n\n // Periodic sweeps via cron (works in serverless environments like Cloudflare Workers)\n this.cronProvider.createCronJob(\n \"_alepha:jobs:recovery\",\n JobProvider.SWEEP_CRON,\n async () => {\n await this.recoverySweep();\n },\n true,\n );\n this.cronProvider.createCronJob(\n \"_alepha:jobs:dispatch\",\n JobProvider.SWEEP_CRON,\n async () => {\n await this.delayedDispatchSweep();\n },\n true,\n );\n\n // Daily log purge\n this.cronProvider.createCronJob(\n \"_alepha:jobs:log-purge\",\n \"0 0 * * *\",\n async () => {\n await this.logPurge();\n },\n true,\n );\n },\n });\n\n protected readonly onStop = $hook({\n on: \"stop\",\n handler: async () => {\n this.stopping = true;\n\n // Abort any running executions\n for (const controller of this.abortControllers.values()) {\n controller.abort();\n }\n },\n });\n\n // --- Helpers ---\n\n protected getRegistration(name: string): JobRegistration {\n const registration = this.jobs.get(name);\n if (!registration) {\n throw new AlephaError(`Job not registered: ${name}`);\n }\n return registration;\n }\n}\n","import {\n $inject,\n type Async,\n createPrimitive,\n KIND,\n PipelinePrimitive,\n type PipelinePrimitiveOptions,\n type Static,\n type TSchema,\n} from \"alepha\";\nimport type { DateTime, DurationLike } from \"alepha/datetime\";\nimport {\n JobProvider,\n type JobTriggerContext,\n type PushManyItem,\n type PushOptions,\n} from \"../providers/JobProvider.ts\";\n\n/**\n * Job primitive for defining scheduled and on-demand tasks with payload validation, retry policies, and batching.\n */\nexport const $job = <T extends TSchema = TSchema>(\n options: JobPrimitiveOptions<T>,\n): JobPrimitive<T> => {\n return createPrimitive(JobPrimitive<T>, options);\n};\n\n// -----------------------------------------------------------------------------------------------------------------\n\nexport interface JobItem<T extends TSchema = TSchema> {\n id: string;\n payload: Static<T>;\n attempt: number;\n}\n\nexport interface JobHandlerArgs<T extends TSchema = TSchema> {\n items: Array<JobItem<T>>;\n now: DateTime;\n signal: AbortSignal;\n}\n\nexport interface JobRetryBackoff {\n initial: DurationLike;\n factor?: number;\n max?: DurationLike;\n jitter?: boolean;\n}\n\nexport interface JobRetryOptions {\n retries: number;\n backoff?: DurationLike | JobRetryBackoff;\n when?: (error: Error) => boolean;\n}\n\nexport interface JobBatchOptions {\n size: number;\n window: DurationLike;\n}\n\nexport type JobPriority = \"critical\" | \"high\" | \"normal\" | \"low\";\n\nexport interface JobPrimitiveOptions<T extends TSchema = TSchema>\n extends PipelinePrimitiveOptions {\n /**\n * Payload schema (TypeBox). Optional for cron-only jobs.\n */\n schema?: T;\n\n /**\n * Cron expression for automatic scheduling.\n */\n cron?: string;\n\n /**\n * Whether to use a distributed lock for cron execution.\n * @default true\n */\n lock?: boolean;\n\n /**\n * Retry policy for failed executions.\n */\n retry?: JobRetryOptions;\n\n /**\n * Max execution time per attempt.\n */\n timeout?: DurationLike;\n\n /**\n * Max parallel executions.\n * @default 1\n */\n concurrency?: number;\n\n /**\n * Consumer batching configuration.\n */\n batch?: JobBatchOptions;\n\n /**\n * Default priority for pushed jobs.\n * @default \"normal\"\n */\n priority?: JobPriority;\n\n /**\n * Handler function for job execution.\n */\n handler: (args: JobHandlerArgs<T>) => Async<void>;\n}\n\n// -----------------------------------------------------------------------------------------------------------------\n\nexport class JobPrimitive<\n T extends TSchema = TSchema,\n> extends PipelinePrimitive<JobPrimitiveOptions<T>> {\n protected readonly jobProvider = $inject(JobProvider);\n\n public get name(): string {\n return `${this.config.service.name}.${this.config.propertyKey}`;\n }\n\n protected onInit() {\n const handler = this.handler.run.bind(this.handler);\n this.jobProvider.registerJob(this.name, { ...this.options, handler });\n }\n\n /**\n * Push a single payload or an array of payloads.\n */\n public async push(\n payload: Static<T> | Array<Static<T>>,\n options?: PushOptions,\n ): Promise<string | string[]> {\n if (Array.isArray(payload)) {\n const ids = await Promise.all(\n payload.map((p) => this.jobProvider.push(this.name, p, options)),\n );\n return ids;\n }\n return this.jobProvider.push(this.name, payload, options);\n }\n\n /**\n * Push multiple payloads with per-item options.\n */\n public async pushMany(items: Array<PushManyItem<T>>): Promise<string[]> {\n return this.jobProvider.pushMany(this.name, items);\n }\n\n /**\n * Cancel a running or pending execution.\n */\n public async cancel(executionId: string): Promise<void> {\n return this.jobProvider.cancel(executionId);\n }\n\n /**\n * Manually trigger the job (admin / CLI).\n */\n public async trigger(context?: JobTriggerContext): Promise<void> {\n return this.jobProvider.trigger(this.name, context);\n }\n}\n\n$job[KIND] = JobPrimitive;\n","import { $inject, Alepha, AlephaError, t } from \"alepha\";\nimport { DateTimeProvider } from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport { $repository, DatabaseProvider, sql } from \"alepha/orm\";\nimport { NotFoundError } from \"alepha/server\";\nimport type { JobExecutionEntity } from \"../entities/jobExecutionEntity.ts\";\nimport { jobExecutionEntity } from \"../entities/jobExecutionEntity.ts\";\nimport { jobExecutionLogEntity } from \"../entities/jobExecutionLogEntity.ts\";\nimport { $job } from \"../primitives/$job.ts\";\nimport type { JobTriggerContext } from \"../providers/JobProvider.ts\";\nimport { JobProvider } from \"../providers/JobProvider.ts\";\nimport type { JobActivityPoint } from \"../schemas/jobActivitySchema.ts\";\nimport type { JobCronInfo } from \"../schemas/jobCronInfoSchema.ts\";\nimport type { JobExecutionQuery } from \"../schemas/jobExecutionQuerySchema.ts\";\nimport type { JobFailure } from \"../schemas/jobFailureSchema.ts\";\nimport type { JobQueueDepth } from \"../schemas/jobQueueDepthSchema.ts\";\nimport type { JobRegistration } from \"../schemas/jobRegistrationSchema.ts\";\nimport type { JobStats } from \"../schemas/jobStatsSchema.ts\";\n\n// -----------------------------------------------------------------------------------------------------------------\n\nexport class JobService {\n protected readonly alepha = $inject(Alepha);\n protected readonly dt = $inject(DateTimeProvider);\n protected readonly log = $logger();\n protected readonly jobProvider = $inject(JobProvider);\n protected readonly database = $inject(DatabaseProvider);\n protected readonly executions = $repository(jobExecutionEntity);\n protected readonly executionLogs = $repository(jobExecutionLogEntity);\n\n protected computeCan(status: string) {\n return {\n retry: status === \"dead\" || status === \"cancelled\",\n cancel:\n status === \"pending\" ||\n status === \"running\" ||\n status === \"scheduled\" ||\n status === \"retrying\",\n };\n }\n\n /**\n * Convert an ISO date string to the raw SQL parameter format\n * expected by the current database dialect.\n *\n * - PostgreSQL: ISO string (timestamp comparison)\n * - SQLite: epoch milliseconds (integer comparison)\n */\n protected toRawDate(iso: string): string | number {\n return this.database.dialect === \"sqlite\" ? new Date(iso).getTime() : iso;\n }\n\n public async getStats(days?: number): Promise<JobStats> {\n const jobs = this.jobProvider.getRegisteredJobs();\n const periodAgo = this.toRawDate(\n this.dt\n .now()\n .subtract(days ?? 1, \"day\")\n .toISOString(),\n );\n\n const rows = await this.executions.query(\n (e) => sql`\n SELECT\n COUNT(*) FILTER (WHERE ${e.status} = 'running') AS running,\n COUNT(*) FILTER (WHERE ${e.status} = 'pending') AS pending,\n COUNT(*) FILTER (WHERE ${e.status} = 'scheduled') AS scheduled,\n COUNT(*) FILTER (WHERE ${e.status} = 'retrying') AS retrying,\n COUNT(*) FILTER (WHERE ${e.status} = 'dead') AS dead,\n COUNT(*) FILTER (WHERE ${e.status} = 'completed' AND ${e.completedAt} >= ${periodAgo}) AS completed_24h,\n COUNT(*) FILTER (WHERE ${e.status} IN ('dead', 'failed') AND ${e.completedAt} >= ${periodAgo}) AS failed_24h\n FROM ${e}\n `,\n t.object({\n running: t.string(),\n pending: t.string(),\n scheduled: t.string(),\n retrying: t.string(),\n dead: t.string(),\n completed_24h: t.string(),\n failed_24h: t.string(),\n }),\n );\n\n const row = rows[0];\n return {\n registered: jobs.size,\n running: Number(row.running),\n pending: Number(row.pending),\n scheduled: Number(row.scheduled),\n retrying: Number(row.retrying),\n dead: Number(row.dead),\n completed: Number(row.completed_24h),\n failed: Number(row.failed_24h),\n };\n }\n\n public getRegistry(): JobRegistration[] {\n const jobs = this.jobProvider.getRegisteredJobs();\n const result: JobRegistration[] = [];\n\n for (const [name, reg] of jobs) {\n const opts = reg.options;\n const hasCron = Boolean(opts.cron);\n const hasSchema = Boolean(opts.schema);\n\n let type: \"cron\" | \"push\" | \"both\";\n if (hasCron && hasSchema) {\n type = \"both\";\n } else if (hasCron) {\n type = \"cron\";\n } else {\n type = \"push\";\n }\n\n const registration: JobRegistration = {\n name,\n type,\n priority: (opts.priority ?? \"normal\") as JobRegistration[\"priority\"],\n concurrency: opts.concurrency ?? 1,\n hasSchema,\n cron: opts.cron,\n timeout: opts.timeout ? String(opts.timeout) : undefined,\n retry: opts.retry\n ? {\n retries: opts.retry.retries,\n hasBackoff: Boolean(opts.retry.backoff),\n }\n : undefined,\n batch: opts.batch\n ? {\n size: opts.batch.size,\n window: String(opts.batch.window),\n }\n : undefined,\n };\n\n result.push(registration);\n }\n\n return result;\n }\n\n public async findExecutions(query: JobExecutionQuery = {}) {\n query.sort ??= \"-createdAt\";\n\n const where = this.executions.createQueryWhere();\n\n if (query.job) {\n where.jobName = { eq: query.job };\n }\n\n if (query.status) {\n where.status = { eq: query.status };\n }\n\n if (query.priority) {\n const priorityMap: Record<string, number> = {\n critical: 0,\n high: 1,\n normal: 2,\n low: 3,\n };\n where.priority = { eq: priorityMap[query.priority] };\n }\n\n if (query.from) {\n where.createdAt = { gte: query.from };\n }\n\n if (query.to) {\n where.createdAt = {\n ...(where.createdAt as object),\n lte: query.to,\n };\n }\n\n const page = await this.executions.paginate(\n query,\n { where },\n { count: true },\n );\n return {\n ...page,\n content: page.content.map((exec: JobExecutionEntity) => ({\n ...exec,\n can: this.computeCan(exec.status),\n })),\n };\n }\n\n public async getExecution(id: string) {\n const execution = await this.executions.findById(id);\n if (!execution) {\n throw new NotFoundError(`Execution not found: ${id}`);\n }\n\n const logRecord = await this.executionLogs.findById(id);\n\n return {\n ...execution,\n can: this.computeCan(execution.status),\n logs: logRecord?.logs,\n };\n }\n\n public async triggerJob(\n name: string,\n context?: JobTriggerContext,\n ): Promise<{ ok: boolean }> {\n const jobPrimitives = this.alepha.primitives($job);\n const job = jobPrimitives.find((j) => j.name === name);\n\n if (!job) {\n throw new NotFoundError(`Job not found: ${name}`);\n }\n\n this.log.info(`Triggering job '${name}'`, {\n triggeredBy: context?.triggeredByName ?? context?.triggeredBy,\n });\n\n await job.trigger(context);\n return { ok: true };\n }\n\n public async retryExecution(\n id: string,\n context?: { triggeredBy?: string; triggeredByName?: string },\n ): Promise<{ ok: boolean }> {\n const execution = await this.executions.findById(id);\n if (!execution) {\n throw new NotFoundError(`Execution not found: ${id}`);\n }\n\n if (execution.status !== \"dead\" && execution.status !== \"cancelled\") {\n throw new AlephaError(\n `Cannot retry execution in '${execution.status}' status`,\n );\n }\n\n this.log.info(`Retrying execution ${id}`, {\n jobName: execution.jobName,\n previousStatus: execution.status,\n triggeredBy: context?.triggeredByName ?? context?.triggeredBy,\n });\n\n const jobPrimitives = this.alepha.primitives($job);\n const job = jobPrimitives.find((j) => j.name === execution.jobName);\n\n if (!job) {\n throw new NotFoundError(`Job not found: ${execution.jobName}`);\n }\n\n if (execution.payload) {\n await job.push(execution.payload, {});\n } else {\n await job.trigger({\n triggeredBy: context?.triggeredBy,\n triggeredByName: context?.triggeredByName,\n });\n }\n\n return { ok: true };\n }\n\n public async cancelExecution(\n id: string,\n context?: { cancelledBy?: string; cancelledByName?: string },\n ): Promise<{ ok: boolean }> {\n this.log.info(`Cancelling execution ${id}`, {\n cancelledBy: context?.cancelledByName ?? context?.cancelledBy,\n });\n\n await this.jobProvider.cancel(id, {\n cancelledBy: context?.cancelledBy,\n cancelledByName: context?.cancelledByName,\n });\n return { ok: true };\n }\n\n public async getCronJobs(): Promise<JobCronInfo[]> {\n const jobs = this.jobProvider.getRegisteredJobs();\n const cronJobNames: string[] = [];\n\n for (const [name, reg] of jobs) {\n if (reg.options.cron) cronJobNames.push(name);\n }\n\n const lastByJob = await this.getLastExecutionPerJob(cronJobNames);\n\n const result: JobCronInfo[] = [];\n for (const name of cronJobNames) {\n const reg = jobs.get(name)!;\n const opts = reg.options;\n const last = lastByJob.get(name);\n\n result.push({\n name,\n cron: opts.cron!,\n lock: opts.lock !== false,\n priority: (opts.priority ?? \"normal\") as JobCronInfo[\"priority\"],\n concurrency: opts.concurrency ?? 1,\n hasSchema: Boolean(opts.schema),\n lastExecution: last\n ? {\n id: last.id,\n status: last.status,\n startedAt: last.started_at ?? undefined,\n completedAt: last.completed_at ?? undefined,\n error: last.error ?? undefined,\n }\n : undefined,\n });\n }\n\n return result;\n }\n\n public async getQueueDepth(): Promise<JobQueueDepth[]> {\n const jobs = this.jobProvider.getRegisteredJobs();\n\n const rows = await this.executions.query(\n (e) => sql`\n SELECT\n ${e.jobName} AS job_name,\n COUNT(*) FILTER (WHERE ${e.status} = 'pending') AS pending,\n COUNT(*) FILTER (WHERE ${e.status} = 'running') AS running,\n COUNT(*) FILTER (WHERE ${e.status} = 'scheduled') AS scheduled,\n COUNT(*) FILTER (WHERE ${e.status} = 'retrying') AS retrying,\n COUNT(*) FILTER (WHERE ${e.status} = 'dead') AS dead\n FROM ${e}\n WHERE ${e.status} IN ('pending', 'running', 'scheduled', 'retrying', 'dead')\n GROUP BY ${e.jobName}\n `,\n t.object({\n job_name: t.string(),\n pending: t.string(),\n running: t.string(),\n scheduled: t.string(),\n retrying: t.string(),\n dead: t.string(),\n }),\n );\n\n const counts = new Map(rows.map((r) => [r.job_name, r]));\n\n const result: JobQueueDepth[] = [];\n for (const [name, reg] of jobs) {\n const row = counts.get(name);\n result.push({\n jobName: name,\n pending: Number(row?.pending ?? 0),\n running: Number(row?.running ?? 0),\n scheduled: Number(row?.scheduled ?? 0),\n retrying: Number(row?.retrying ?? 0),\n dead: Number(row?.dead ?? 0),\n concurrency: reg.options.concurrency ?? 1,\n });\n }\n\n return result;\n }\n\n public async getActivity(days = 14): Promise<JobActivityPoint[]> {\n if (this.database.dialect === \"sqlite\") {\n return this.getActivitySqlite(days);\n }\n\n const rows = await this.executions.query(\n (e) => sql`\n WITH date_series AS (\n SELECT generate_series(\n CURRENT_DATE - ${days - 1}::int,\n CURRENT_DATE,\n '1 day'::interval\n )::date AS date\n )\n SELECT\n ds.date::text AS date,\n COALESCE(COUNT(*) FILTER (WHERE ${e.status} = 'completed'), 0) AS completed,\n COALESCE(COUNT(*) FILTER (WHERE ${e.status} IN ('dead', 'failed')), 0) AS failed\n FROM date_series ds\n LEFT JOIN ${e} ON DATE(${e.completedAt}) = ds.date\n AND ${e.status} IN ('completed', 'dead', 'failed')\n GROUP BY ds.date\n ORDER BY ds.date ASC\n `,\n t.object({\n date: t.string(),\n completed: t.string(),\n failed: t.string(),\n }),\n );\n\n return rows.map((row) => ({\n date: row.date,\n completed: Number(row.completed),\n failed: Number(row.failed),\n }));\n }\n\n protected async getActivitySqlite(days = 14): Promise<JobActivityPoint[]> {\n const now = this.dt.now();\n const startDate = now.subtract(days - 1, \"day\");\n\n const where = this.executions.createQueryWhere();\n where.status = { inArray: [\"completed\", \"dead\", \"failed\"] };\n where.completedAt = { gte: startDate.startOf(\"day\").toISOString() };\n\n const executions = await this.executions.findMany({ where });\n\n // Build date → counts map\n const byDate = new Map<string, { completed: number; failed: number }>();\n for (let i = 0; i < days; i++) {\n const date = startDate.add(i, \"day\").format(\"YYYY-MM-DD\");\n byDate.set(date, { completed: 0, failed: 0 });\n }\n\n for (const exec of executions) {\n if (!exec.completedAt) continue;\n const date = this.dt.of(exec.completedAt).format(\"YYYY-MM-DD\");\n const entry = byDate.get(date);\n if (!entry) continue;\n if (exec.status === \"completed\") entry.completed++;\n else entry.failed++;\n }\n\n return [...byDate.entries()].map(([date, counts]) => ({\n date,\n ...counts,\n }));\n }\n\n public async getTopFailures(days?: number): Promise<JobFailure[]> {\n const periodAgoIso = this.dt\n .now()\n .subtract(days ?? 7, \"day\")\n .toISOString();\n\n if (this.database.dialect === \"sqlite\") {\n return this.getTopFailuresSqlite(periodAgoIso);\n }\n\n const rows = await this.executions.query(\n (e) => sql`\n SELECT\n ${e.jobName} AS job_name,\n COUNT(*) AS failures,\n (ARRAY_AGG(${e.error} ORDER BY ${e.completedAt} DESC))[1] AS last_error\n FROM ${e}\n WHERE ${e.status} IN ('dead', 'failed')\n AND ${e.completedAt} >= ${periodAgoIso}\n GROUP BY ${e.jobName}\n ORDER BY failures DESC\n `,\n t.object({\n job_name: t.string(),\n failures: t.string(),\n last_error: t.optional(t.nullable(t.string())),\n }),\n );\n\n return rows.map((row) => ({\n jobName: row.job_name,\n failures: Number(row.failures),\n lastError: row.last_error ?? undefined,\n }));\n }\n\n protected async getTopFailuresSqlite(\n periodAgoIso: string,\n ): Promise<JobFailure[]> {\n const where = this.executions.createQueryWhere();\n where.status = { inArray: [\"dead\", \"failed\"] };\n where.completedAt = { gte: periodAgoIso };\n\n const failures = await this.executions.findMany({\n where,\n orderBy: { column: \"completedAt\", direction: \"desc\" },\n });\n\n const byJob = new Map<string, { failures: number; lastError?: string }>();\n for (const exec of failures) {\n const entry = byJob.get(exec.jobName) ?? { failures: 0 };\n entry.failures++;\n if (!entry.lastError) entry.lastError = exec.error ?? undefined;\n byJob.set(exec.jobName, entry);\n }\n\n return [...byJob.entries()]\n .map(([jobName, data]) => ({\n jobName,\n failures: data.failures,\n lastError: data.lastError,\n }))\n .sort((a, b) => b.failures - a.failures);\n }\n\n /**\n * Fetch the most recent execution per job name.\n *\n * - PostgreSQL: uses `DISTINCT ON` for a single-pass query\n * - SQLite: uses ORM queries (one per job name) since `DISTINCT ON` is not supported\n */\n protected async getLastExecutionPerJob(jobNames: string[]): Promise<\n Map<\n string,\n {\n id: string;\n job_name: string;\n status: string;\n started_at?: string | null;\n completed_at?: string | null;\n error?: string | null;\n }\n >\n > {\n if (jobNames.length === 0) {\n return new Map();\n }\n\n if (this.database.dialect === \"sqlite\") {\n const result = new Map<string, any>();\n for (const name of jobNames) {\n const rows = await this.executions.findMany({\n where: { jobName: { eq: name } },\n orderBy: { column: \"createdAt\", direction: \"desc\" },\n limit: 1,\n });\n if (rows[0]) {\n result.set(name, {\n id: rows[0].id,\n job_name: rows[0].jobName,\n status: rows[0].status,\n started_at: rows[0].startedAt,\n completed_at: rows[0].completedAt,\n error: rows[0].error,\n });\n }\n }\n return result;\n }\n\n const schema = t.object({\n id: t.string(),\n job_name: t.string(),\n status: t.string(),\n started_at: t.optional(t.nullable(t.string())),\n completed_at: t.optional(t.nullable(t.string())),\n error: t.optional(t.nullable(t.string())),\n });\n\n const rows = await this.executions.query(\n (e) => sql`\n SELECT DISTINCT ON (${e.jobName})\n ${e.id}, ${e.jobName} AS job_name, ${e.status},\n ${e.startedAt} AS started_at, ${e.completedAt} AS completed_at, ${e.error}\n FROM ${e}\n WHERE ${e.jobName} IN (${sql.join(\n jobNames.map((n) => sql`${n}`),\n sql`, `,\n )})\n ORDER BY ${e.jobName}, ${e.createdAt} DESC\n `,\n schema,\n );\n\n return new Map(rows.map((r) => [r.job_name, r]));\n }\n}\n","import { $inject, t } from \"alepha\";\nimport { $secure } from \"alepha/security\";\nimport { $action, okSchema } from \"alepha/server\";\nimport {\n jobActivityPointSchema,\n jobActivityQuerySchema,\n} from \"../schemas/jobActivitySchema.ts\";\nimport { jobCronInfoSchema } from \"../schemas/jobCronInfoSchema.ts\";\nimport { jobExecutionDetailResourceSchema } from \"../schemas/jobExecutionDetailResourceSchema.ts\";\nimport { jobExecutionQuerySchema } from \"../schemas/jobExecutionQuerySchema.ts\";\nimport { jobExecutionResourceSchema } from \"../schemas/jobExecutionResourceSchema.ts\";\nimport { jobFailureSchema } from \"../schemas/jobFailureSchema.ts\";\nimport { jobQueueDepthSchema } from \"../schemas/jobQueueDepthSchema.ts\";\nimport { jobRegistrationSchema } from \"../schemas/jobRegistrationSchema.ts\";\nimport { jobStatsSchema } from \"../schemas/jobStatsSchema.ts\";\nimport { triggerJobSchema } from \"../schemas/triggerJobSchema.ts\";\nimport { JobService } from \"../services/JobService.ts\";\n\nexport class AdminJobController {\n protected readonly url: string = \"/jobs\";\n protected readonly group: string = \"admin:jobs\";\n protected readonly jobService = $inject(JobService);\n\n public readonly getJobStats = $action({\n path: `${this.url}/stats`,\n group: this.group,\n use: [$secure({ permissions: [\"admin:job:read\"] })],\n schema: {\n query: jobActivityQuerySchema,\n response: jobStatsSchema,\n },\n handler: ({ query }) => this.jobService.getStats(query.days),\n });\n\n public readonly getJobRegistry = $action({\n path: this.url,\n group: this.group,\n use: [$secure({ permissions: [\"admin:job:read\"] })],\n schema: {\n response: t.array(jobRegistrationSchema),\n },\n handler: () => this.jobService.getRegistry(),\n });\n\n public readonly findJobExecutions = $action({\n path: `${this.url}/executions`,\n group: this.group,\n use: [$secure({ permissions: [\"admin:job:read\"] })],\n schema: {\n query: jobExecutionQuerySchema,\n response: t.page(jobExecutionResourceSchema),\n },\n handler: ({ query }) => this.jobService.findExecutions(query),\n });\n\n public readonly getJobExecution = $action({\n path: `${this.url}/executions/:id`,\n group: this.group,\n use: [$secure({ permissions: [\"admin:job:read\"] })],\n schema: {\n params: t.object({\n id: t.uuid(),\n }),\n response: jobExecutionDetailResourceSchema,\n },\n handler: ({ params }) => this.jobService.getExecution(params.id),\n });\n\n public readonly triggerJob = $action({\n method: \"POST\",\n path: `${this.url}/trigger`,\n group: this.group,\n use: [$secure({ permissions: [\"admin:job:trigger\"] })],\n schema: {\n body: triggerJobSchema,\n response: okSchema,\n },\n handler: async ({ body, user }) => {\n return this.jobService.triggerJob(body.name, {\n payload: body.payload,\n triggeredBy: user?.id,\n triggeredByName: user?.name,\n });\n },\n });\n\n public readonly retryJobExecution = $action({\n method: \"POST\",\n path: `${this.url}/executions/:id/retry`,\n group: this.group,\n use: [$secure({ permissions: [\"admin:job:trigger\"] })],\n schema: {\n params: t.object({\n id: t.uuid(),\n }),\n response: okSchema,\n },\n handler: async ({ params, user }) => {\n return this.jobService.retryExecution(params.id, {\n triggeredBy: user?.id,\n triggeredByName: user?.name,\n });\n },\n });\n\n public readonly cancelJobExecution = $action({\n method: \"POST\",\n path: `${this.url}/executions/:id/cancel`,\n group: this.group,\n use: [$secure({ permissions: [\"admin:job:cancel\"] })],\n schema: {\n params: t.object({\n id: t.uuid(),\n }),\n response: okSchema,\n },\n handler: async ({ params, user }) => {\n return this.jobService.cancelExecution(params.id, {\n cancelledBy: user?.id,\n cancelledByName: user?.name,\n });\n },\n });\n\n public readonly getJobActivity = $action({\n path: `${this.url}/activity`,\n group: this.group,\n use: [$secure({ permissions: [\"admin:job:read\"] })],\n schema: {\n query: jobActivityQuerySchema,\n response: t.array(jobActivityPointSchema),\n },\n handler: ({ query }) => this.jobService.getActivity(query.days),\n });\n\n public readonly getCronJobs = $action({\n path: `${this.url}/cron`,\n group: this.group,\n use: [$secure({ permissions: [\"admin:job:read\"] })],\n schema: {\n response: t.array(jobCronInfoSchema),\n },\n handler: () => this.jobService.getCronJobs(),\n });\n\n public readonly getJobQueueDepth = $action({\n path: `${this.url}/queue`,\n group: this.group,\n use: [$secure({ permissions: [\"admin:job:read\"] })],\n schema: {\n response: t.array(jobQueueDepthSchema),\n },\n handler: () => this.jobService.getQueueDepth(),\n });\n\n public readonly getJobTopFailures = $action({\n path: `${this.url}/failures`,\n group: this.group,\n use: [$secure({ permissions: [\"admin:job:read\"] })],\n schema: {\n query: jobActivityQuerySchema,\n response: t.array(jobFailureSchema),\n },\n handler: ({ query }) => this.jobService.getTopFailures(query.days),\n });\n}\n","import { $hook, $inject, t } from \"alepha\";\nimport { $queue } from \"alepha/queue\";\nimport { JobProvider } from \"./JobProvider.ts\";\n\n// -----------------------------------------------------------------------------------------------------------------\n\n/**\n * Optional queue-backed dispatch for the job system.\n *\n * When registered, `JobProvider` will push work through this queue instead of\n * executing inline. This is the default for long-running (non-serverless) environments.\n * In serverless environments (Cloudflare Workers, Vercel), this provider is typically\n * omitted so jobs execute inline without requiring an external queue resource.\n */\nexport class JobQueueProvider {\n protected readonly jobProvider = $inject(JobProvider);\n\n protected readonly queue = $queue({\n name: \"_alepha:jobs:dispatch\",\n schema: t.object({ jobName: t.text(), executionId: t.text() }),\n handler: async (msg) => {\n await this.jobProvider.processExecution(\n msg.payload.jobName,\n msg.payload.executionId,\n );\n },\n });\n\n protected readonly onStart = $hook({\n on: \"start\",\n handler: async () => {\n this.jobProvider.queueDispatch = (jobName, executionId) =>\n this.push(jobName, executionId);\n },\n });\n\n /**\n * Push a job execution onto the queue for async processing.\n */\n public async push(jobName: string, executionId: string): Promise<void> {\n await this.queue.push({ jobName, executionId });\n }\n}\n","import { $module, type Alepha, type Static, t } from \"alepha\";\nimport { AlephaBatch } from \"alepha/batch\";\nimport type { DateTime } from \"alepha/datetime\";\nimport { AlephaLock } from \"alepha/lock\";\nimport { AlephaQueue } from \"alepha/queue\";\nimport { AlephaScheduler } from \"alepha/scheduler\";\nimport { AdminJobController } from \"./controllers/AdminJobController.ts\";\nimport { JobProvider } from \"./providers/JobProvider.ts\";\nimport { JobQueueProvider } from \"./providers/JobQueueProvider.ts\";\nimport { JobService } from \"./services/JobService.ts\";\n\n// -----------------------------------------------------------------------------------------------------------------\n\nexport * from \"./controllers/AdminJobController.ts\";\nexport * from \"./entities/jobExecutionEntity.ts\";\nexport * from \"./entities/jobExecutionLogEntity.ts\";\nexport * from \"./primitives/$job.ts\";\nexport * from \"./providers/JobProvider.ts\";\nexport * from \"./providers/JobQueueProvider.ts\";\nexport * from \"./schemas/jobActivitySchema.ts\";\nexport * from \"./schemas/jobConfigAtom.ts\";\nexport * from \"./schemas/jobCronInfoSchema.ts\";\nexport * from \"./schemas/jobExecutionDetailResourceSchema.ts\";\nexport * from \"./schemas/jobExecutionQuerySchema.ts\";\nexport * from \"./schemas/jobExecutionResourceSchema.ts\";\nexport * from \"./schemas/jobFailureSchema.ts\";\nexport * from \"./schemas/jobQueueDepthSchema.ts\";\nexport * from \"./schemas/jobRegistrationSchema.ts\";\nexport * from \"./schemas/jobStatsSchema.ts\";\nexport * from \"./schemas/triggerJobSchema.ts\";\nexport * from \"./services/JobService.ts\";\n\n// -----------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha\" {\n interface Env extends Partial<Static<typeof jobEnvSchema>> {}\n\n interface Hooks {\n \"job:begin\": { name: string; now: DateTime; executionId: string };\n \"job:success\": { name: string; executionId: string };\n \"job:error\": { name: string; error: Error; executionId: string };\n \"job:cancel\": { name: string; executionId: string };\n \"job:end\": { name: string; executionId: string };\n }\n}\n\n// -----------------------------------------------------------------------------------------------------------------\n\nconst jobEnvSchema = t.object({\n /**\n * Controls whether the job system dispatches work through a queue or executes inline.\n *\n * - `1` — always use queue (force queue even in serverless)\n * - `0` — never use queue (force inline, useful for testing)\n * - not set — auto: use queue when NOT serverless (default)\n */\n ALEPHA_JOBS_QUEUE: t.optional(\n t.integer({\n description:\n \"Set to 1 to always use queue, 0 to disable queue (default: auto-detect based on environment)\",\n }),\n ),\n});\n\n// -----------------------------------------------------------------------------------------------------------------\n\n/**\n * Job execution framework — unified primitive for deferred, scheduled, and queued work.\n *\n * **Features:**\n * - Push-based jobs with typed payloads\n * - Cron scheduling with execution tracking\n * - Retry with exponential backoff\n * - Priority, delay, cancellation\n * - Deduplication via unique keys\n * - Per-execution log capture\n *\n * @module alepha.api.jobs\n */\nexport const AlephaApiJobs = $module({\n name: \"alepha.api.jobs\",\n services: [\n AlephaQueue,\n AlephaScheduler,\n AlephaLock,\n AlephaBatch,\n JobProvider,\n JobQueueProvider,\n JobService,\n AdminJobController,\n ],\n register: (alepha: Alepha) => {\n const env = alepha.parseEnv(jobEnvSchema);\n const useQueue =\n env.ALEPHA_JOBS_QUEUE === 1\n ? true\n : env.ALEPHA_JOBS_QUEUE === 0\n ? false\n : !alepha.isServerless();\n\n alepha.with(AlephaScheduler);\n alepha.with(AlephaLock);\n alepha.with(AlephaBatch);\n alepha.with(JobProvider);\n alepha.with(JobService);\n alepha.with(AdminJobController);\n\n if (useQueue) {\n alepha.with(AlephaQueue);\n alepha.with(JobQueueProvider);\n }\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/api/jobs/schemas/jobActivitySchema.ts","../../../src/api/jobs/schemas/jobCronInfoSchema.ts","../../../src/api/jobs/entities/jobExecutionEntity.ts","../../../src/api/jobs/schemas/jobExecutionResourceSchema.ts","../../../src/api/jobs/schemas/jobExecutionDetailResourceSchema.ts","../../../src/api/jobs/schemas/jobExecutionQuerySchema.ts","../../../src/api/jobs/schemas/jobFailureSchema.ts","../../../src/api/jobs/schemas/jobQueueDepthSchema.ts","../../../src/api/jobs/schemas/jobRegistrationSchema.ts","../../../src/api/jobs/schemas/jobStatsSchema.ts","../../../src/api/jobs/schemas/triggerJobSchema.ts","../../../src/api/jobs/entities/jobExecutionLogEntity.ts","../../../src/api/jobs/schemas/jobConfigAtom.ts","../../../src/api/jobs/providers/JobProvider.ts","../../../src/api/jobs/primitives/$job.ts","../../../src/api/jobs/services/JobService.ts","../../../src/api/jobs/controllers/AdminJobController.ts","../../../src/api/jobs/providers/JobQueueProvider.ts","../../../src/api/jobs/index.ts"],"sourcesContent":["import { type Static, t } from \"alepha\";\n\nexport const jobActivityPointSchema = t.object({\n date: t.text(),\n completed: t.integer(),\n failed: t.integer(),\n});\n\nexport type JobActivityPoint = Static<typeof jobActivityPointSchema>;\n\nexport const jobActivityQuerySchema = t.object({\n days: t.optional(t.integer({ minimum: 1, maximum: 90 })),\n});\n\nexport type JobActivityQuery = Static<typeof jobActivityQuerySchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const jobCronInfoSchema = t.object({\n name: t.text(),\n cron: t.text(),\n lock: t.boolean(),\n priority: t.enum([\"critical\", \"high\", \"normal\", \"low\"]),\n concurrency: t.integer(),\n hasSchema: t.boolean(),\n lastExecution: t.optional(\n t.object({\n id: t.uuid(),\n status: t.text(),\n startedAt: t.optional(t.datetime()),\n completedAt: t.optional(t.datetime()),\n error: t.optional(t.text()),\n }),\n ),\n});\n\nexport type JobCronInfo = Static<typeof jobCronInfoSchema>;\n","import { type Static, t } from \"alepha\";\nimport { $entity, db } from \"alepha/orm\";\n\nexport const jobExecutionEntity = $entity({\n name: \"job_executions\",\n schema: t.object({\n id: db.primaryKey(t.uuid()),\n createdAt: db.createdAt(),\n updatedAt: db.updatedAt(),\n\n jobName: t.text(),\n key: t.optional(t.nullable(t.text())),\n\n payload: t.optional(t.record(t.text(), t.any())),\n status: db.default(\n t.enum([\n \"pending\",\n \"scheduled\",\n \"retrying\",\n \"running\",\n \"completed\",\n \"failed\",\n \"dead\",\n \"cancelled\",\n ]),\n \"pending\",\n ),\n priority: db.default(t.integer({ minimum: 0, maximum: 3 }), 2),\n\n attempt: db.default(t.integer(), 0),\n maxAttempts: db.default(t.integer(), 1),\n\n scheduledAt: t.optional(t.datetime()),\n startedAt: t.optional(t.datetime()),\n completedAt: t.optional(t.datetime()),\n\n result: t.optional(t.record(t.text(), t.any())),\n error: t.optional(t.text()),\n workerId: t.optional(t.text()),\n\n triggeredBy: t.optional(t.text()),\n triggeredByName: t.optional(t.text()),\n cancelledBy: t.optional(t.text()),\n cancelledByName: t.optional(t.text()),\n }),\n indexes: [\n { columns: [\"jobName\", \"status\", \"priority\", \"scheduledAt\"] },\n { columns: [\"jobName\", \"status\", \"startedAt\"] },\n { columns: [\"jobName\", \"completedAt\"] },\n { columns: [\"jobName\", \"key\"], unique: true },\n ],\n});\n\nexport type JobExecutionEntity = Static<typeof jobExecutionEntity.schema>;\n\nexport type JobStatus =\n | \"pending\"\n | \"scheduled\"\n | \"retrying\"\n | \"running\"\n | \"completed\"\n | \"failed\"\n | \"dead\"\n | \"cancelled\";\n","import { type Static, t } from \"alepha\";\nimport { jobExecutionEntity } from \"../entities/jobExecutionEntity.ts\";\n\nexport const jobExecutionCanSchema = t.object({\n retry: t.boolean(),\n cancel: t.boolean(),\n});\n\nexport const jobExecutionResourceSchema = t.extend(\n jobExecutionEntity.schema,\n {\n can: jobExecutionCanSchema,\n },\n {\n title: \"JobExecutionResource\",\n description: \"A job execution resource.\",\n },\n);\n\nexport type JobExecutionResource = Static<typeof jobExecutionResourceSchema>;\n","import { type Static, t } from \"alepha\";\nimport { logEntrySchema } from \"alepha/logger\";\nimport { jobExecutionEntity } from \"../entities/jobExecutionEntity.ts\";\nimport { jobExecutionCanSchema } from \"./jobExecutionResourceSchema.ts\";\n\nexport const jobExecutionDetailResourceSchema = t.extend(\n jobExecutionEntity.schema,\n {\n can: jobExecutionCanSchema,\n logs: t.optional(t.array(logEntrySchema)),\n },\n {\n title: \"JobExecutionDetailResource\",\n description: \"A job execution resource with logs.\",\n },\n);\n\nexport type JobExecutionDetailResource = Static<\n typeof jobExecutionDetailResourceSchema\n>;\n","import { type Static, t } from \"alepha\";\nimport { pageQuerySchema } from \"alepha/orm\";\n\nexport const jobExecutionQuerySchema = t.extend(pageQuerySchema, {\n job: t.optional(\n t.text({\n description: \"Filter by job name\",\n }),\n ),\n status: t.optional(\n t.enum([\n \"pending\",\n \"scheduled\",\n \"retrying\",\n \"running\",\n \"completed\",\n \"failed\",\n \"dead\",\n \"cancelled\",\n ]),\n ),\n priority: t.optional(t.enum([\"critical\", \"high\", \"normal\", \"low\"])),\n from: t.optional(\n t.datetime({\n description: \"From date (ISO)\",\n }),\n ),\n to: t.optional(\n t.datetime({\n description: \"To date (ISO)\",\n }),\n ),\n});\n\nexport type JobExecutionQuery = Static<typeof jobExecutionQuerySchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const jobFailureSchema = t.object({\n jobName: t.text(),\n failures: t.integer(),\n lastError: t.optional(t.text()),\n});\n\nexport type JobFailure = Static<typeof jobFailureSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const jobQueueDepthSchema = t.object({\n jobName: t.text(),\n pending: t.integer(),\n running: t.integer(),\n scheduled: t.integer(),\n retrying: t.integer(),\n dead: t.integer(),\n concurrency: t.integer(),\n});\n\nexport type JobQueueDepth = Static<typeof jobQueueDepthSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const jobRegistrationSchema = t.object({\n name: t.text(),\n type: t.enum([\"cron\", \"push\", \"both\"]),\n priority: t.enum([\"critical\", \"high\", \"normal\", \"low\"]),\n concurrency: t.integer(),\n hasSchema: t.boolean(),\n cron: t.optional(t.text()),\n timeout: t.optional(t.text()),\n retry: t.optional(\n t.object({\n retries: t.integer(),\n hasBackoff: t.boolean(),\n }),\n ),\n batch: t.optional(\n t.object({\n size: t.integer(),\n window: t.text(),\n }),\n ),\n});\n\nexport type JobRegistration = Static<typeof jobRegistrationSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const jobStatsSchema = t.object({\n registered: t.integer(),\n running: t.integer(),\n pending: t.integer(),\n scheduled: t.integer(),\n retrying: t.integer(),\n dead: t.integer(),\n completed: t.integer(),\n failed: t.integer(),\n});\n\nexport type JobStats = Static<typeof jobStatsSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const triggerJobSchema = t.object({\n name: t.text(),\n payload: t.optional(t.record(t.text(), t.any())),\n});\n\nexport type TriggerJob = Static<typeof triggerJobSchema>;\n","import { type Static, t } from \"alepha\";\nimport { logEntrySchema } from \"alepha/logger\";\nimport { $entity, db } from \"alepha/orm\";\n\nexport const jobExecutionLogEntity = $entity({\n name: \"job_execution_logs\",\n schema: t.object({\n id: db.primaryKey(t.uuid()),\n logs: t.array(logEntrySchema),\n }),\n});\n\nexport type JobExecutionLogEntity = Static<typeof jobExecutionLogEntity.schema>;\n","import { $atom, type Static, t } from \"alepha\";\n\nexport const jobConfig = $atom({\n name: \"alepha.jobs\",\n description: \"Configuration for the $job v2 primitive.\",\n schema: t.object({\n recovery: t.object({\n interval: t.integer({ description: \"Sweep interval (ms).\" }),\n staleThreshold: t.integer({\n description: \"Pending age (ms) before re-dispatch.\",\n }),\n runTimeout: t.integer({\n description:\n \"Running age (ms) before assumed crash. Used as fallback when no per-job timeout is set.\",\n }),\n }),\n delayed: t.object({\n interval: t.integer({ description: \"Sweep interval (ms).\" }),\n }),\n logRetentionDays: t.integer({\n description: \"Days to keep completed/dead executions.\",\n }),\n logMaxEntries: t.integer({\n description: \"Max log entries captured per execution.\",\n }),\n }),\n default: {\n recovery: {\n interval: 300_000,\n staleThreshold: 300_000,\n runTimeout: 1_800_000,\n },\n delayed: {\n interval: 300_000,\n },\n logRetentionDays: 30,\n logMaxEntries: 100,\n },\n});\n\nexport type JobConfig = Static<typeof jobConfig.schema>;\n\ndeclare module \"alepha\" {\n interface State {\n [jobConfig.key]: JobConfig;\n }\n}\n","import {\n $hook,\n $inject,\n $state,\n Alepha,\n AlephaError,\n type Static,\n type TSchema,\n} from \"alepha\";\nimport { DateTimeProvider, type DurationLike } from \"alepha/datetime\";\nimport type { LogEntry } from \"alepha/logger\";\nimport { $logger } from \"alepha/logger\";\nimport { $repository } from \"alepha/orm\";\nimport { CronProvider } from \"alepha/scheduler\";\nimport {\n type JobStatus,\n jobExecutionEntity,\n} from \"../entities/jobExecutionEntity.ts\";\nimport { jobExecutionLogEntity } from \"../entities/jobExecutionLogEntity.ts\";\nimport type {\n JobItem,\n JobPrimitiveOptions,\n JobPriority,\n JobRetryBackoff,\n JobRetryOptions,\n} from \"../primitives/$job.ts\";\nimport { jobConfig } from \"../schemas/jobConfigAtom.ts\";\n\n// -----------------------------------------------------------------------------------------------------------------\n\nconst PRIORITY_MAP: Record<string, number> = {\n critical: 0,\n high: 1,\n normal: 2,\n low: 3,\n};\n\nconst PRIORITY_REVERSE: Record<number, JobPriority> = {\n 0: \"critical\",\n 1: \"high\",\n 2: \"normal\",\n 3: \"low\",\n};\n\n// -----------------------------------------------------------------------------------------------------------------\n\nexport interface PushOptions {\n delay?: DurationLike;\n key?: string;\n priority?: JobPriority;\n scheduledAt?: Date;\n}\n\nexport interface PushManyItem<T extends TSchema = TSchema> {\n payload: Static<T>;\n key?: string;\n delay?: DurationLike;\n priority?: JobPriority;\n scheduledAt?: Date;\n}\n\nexport interface JobTriggerContext {\n payload?: Record<string, unknown>;\n triggeredBy?: string;\n triggeredByName?: string;\n}\n\nexport interface CancelContext {\n cancelledBy?: string;\n cancelledByName?: string;\n}\n\ninterface JobRegistration {\n name: string;\n options: JobPrimitiveOptions;\n}\n\n// -----------------------------------------------------------------------------------------------------------------\n\nexport class JobProvider {\n protected readonly alepha = $inject(Alepha);\n protected readonly dt = $inject(DateTimeProvider);\n protected readonly cronProvider = $inject(CronProvider);\n protected readonly config = $state(jobConfig);\n protected readonly log = $logger();\n protected readonly executions = $repository(jobExecutionEntity);\n protected readonly executionLogs = $repository(jobExecutionLogEntity);\n\n protected readonly jobs = new Map<string, JobRegistration>();\n\n /**\n * When set, job executions are dispatched through a queue (e.g. `JobQueueProvider`).\n * When null, jobs execute inline (fire-and-forget). Useful for serverless environments.\n */\n public queueDispatch:\n | ((jobName: string, executionId: string) => Promise<void>)\n | null = null;\n protected readonly logs = new Map<string, LogEntry[]>();\n protected readonly abortControllers = new Map<string, AbortController>();\n protected static readonly SWEEP_CRON = \"*/5 * * * *\";\n protected stopping = false;\n protected workerId = \"\";\n\n // --- Registration ---\n\n public registerJob(name: string, options: JobPrimitiveOptions): void {\n if (this.jobs.has(name)) {\n throw new AlephaError(`Job already registered: ${name}`);\n }\n\n this.jobs.set(name, { name, options });\n this.log.debug(`Registered job '${name}'`, {\n cron: options.cron,\n priority: options.priority ?? \"normal\",\n retries: options.retry?.retries ?? 0,\n });\n\n if (options.cron) {\n this.cronProvider.createCronJob(name, options.cron, async () => {\n try {\n await this.trigger(name, {\n triggeredBy: \"system\",\n triggeredByName: \"system (cron)\",\n });\n } catch (error) {\n this.log.error(`Cron trigger failed for job '${name}'`, error);\n }\n });\n }\n }\n\n /**\n * Get all registered job definitions.\n */\n public getRegisteredJobs(): Map<string, JobRegistration> {\n return this.jobs;\n }\n\n // --- Push ---\n\n public async push(\n name: string,\n payload: unknown,\n options?: PushOptions,\n ): Promise<string> {\n const registration = this.getRegistration(name);\n const opts = registration.options;\n\n if (!opts.schema) {\n throw new AlephaError(\n `Cannot push to job '${name}': no schema defined. Use trigger() for cron-only jobs.`,\n );\n }\n\n const validated = this.alepha.codec.validate(opts.schema, payload);\n\n const priority =\n PRIORITY_MAP[options?.priority ?? opts.priority ?? \"normal\"];\n const maxAttempts = (opts.retry?.retries ?? 0) + 1;\n\n const isDelayed = options?.delay || options?.scheduledAt;\n const status: JobStatus = isDelayed ? \"scheduled\" : \"pending\";\n\n let scheduledAt: string | undefined;\n if (options?.scheduledAt) {\n scheduledAt = options.scheduledAt.toISOString();\n } else if (options?.delay) {\n const now = this.dt.now();\n scheduledAt = now.add(this.dt.duration(options.delay)).toISOString();\n }\n\n // Keyed path: atomic upsert to avoid race between concurrent pushes\n if (options?.key) {\n const now = this.dt.nowISOString();\n const execution = await this.executions.upsert(\n {\n jobName: name,\n key: options.key,\n payload: validated as Record<string, unknown>,\n status,\n priority,\n maxAttempts,\n scheduledAt,\n createdAt: now,\n updatedAt: now,\n },\n { target: [\"jobName\", \"key\"], set: {}, now },\n );\n\n // Fresh insert: both timestamps equal the explicit `now` value.\n // Conflict: updatedAt was bumped by the ON CONFLICT SET clause, so they differ.\n if (\n execution.createdAt === execution.updatedAt &&\n status === \"pending\" &&\n !this.stopping\n ) {\n await this.scheduleProcessing(name, execution.id);\n }\n\n return execution.id;\n }\n\n const execution = await this.executions.create({\n jobName: name,\n payload: validated as Record<string, unknown>,\n status,\n priority,\n maxAttempts,\n scheduledAt,\n });\n\n this.log.debug(`Pushed job '${name}'`, {\n executionId: execution.id,\n status,\n priority: PRIORITY_REVERSE[priority],\n });\n\n // Dispatch to processing if immediate\n if (status === \"pending\" && !this.stopping) {\n await this.scheduleProcessing(name, execution.id);\n }\n\n return execution.id;\n }\n\n public async pushMany(\n name: string,\n items: Array<PushManyItem>,\n ): Promise<string[]> {\n const ids: string[] = [];\n for (const item of items) {\n const id = await this.push(name, item.payload, {\n key: item.key,\n delay: item.delay,\n priority: item.priority,\n scheduledAt: item.scheduledAt,\n });\n ids.push(id);\n }\n return ids;\n }\n\n // --- Trigger (manual / cron) ---\n\n public async trigger(\n name: string,\n context?: JobTriggerContext,\n ): Promise<void> {\n const registration = this.getRegistration(name);\n const opts = registration.options;\n\n if (context?.payload && opts.schema) {\n // Push-based trigger with payload\n const id = await this.push(name, context.payload, {});\n // Update trigger info\n await this.executions.updateById(id, {\n triggeredBy: context?.triggeredBy,\n triggeredByName: context?.triggeredByName,\n });\n return;\n }\n\n // Cron-style or manual trigger without payload\n const maxAttempts = (opts.retry?.retries ?? 0) + 1;\n const priority = PRIORITY_MAP[opts.priority ?? \"normal\"];\n\n const execution = await this.executions.create({\n jobName: name,\n status: \"pending\",\n priority,\n maxAttempts,\n triggeredBy: context?.triggeredBy,\n triggeredByName: context?.triggeredByName,\n });\n\n this.log.debug(`Triggered job '${name}'`, {\n executionId: execution.id,\n triggeredBy: context?.triggeredByName ?? context?.triggeredBy,\n });\n\n if (!this.stopping) {\n await this.scheduleProcessing(name, execution.id);\n }\n }\n\n // --- Cancel ---\n\n public async cancel(\n executionId: string,\n context?: CancelContext,\n ): Promise<void> {\n const execution = await this.executions.findById(executionId);\n if (!execution) {\n throw new AlephaError(`Execution not found: ${executionId}`);\n }\n\n if (\n execution.status === \"completed\" ||\n execution.status === \"dead\" ||\n execution.status === \"cancelled\"\n ) {\n throw new AlephaError(\n `Cannot cancel execution in '${execution.status}' status`,\n );\n }\n\n // If running, trigger the AbortSignal\n const controller = this.abortControllers.get(executionId);\n if (controller) {\n controller.abort();\n }\n\n await this.executions.updateById(executionId, {\n status: \"cancelled\",\n key: null,\n cancelledBy: context?.cancelledBy,\n cancelledByName: context?.cancelledByName,\n completedAt: this.dt.nowISOString(),\n });\n\n this.log.info(`Cancelled execution ${executionId}`, {\n jobName: execution.jobName,\n cancelledBy: context?.cancelledByName ?? context?.cancelledBy,\n });\n }\n\n // --- Execution ---\n\n protected async scheduleProcessing(\n jobName: string,\n executionId: string,\n ): Promise<void> {\n if (this.queueDispatch) {\n this.log.debug(`Dispatching job '${jobName}' via queue`, { executionId });\n await this.queueDispatch(jobName, executionId);\n } else {\n this.log.debug(`Executing job '${jobName}' inline`, { executionId });\n await this.processExecution(jobName, executionId);\n }\n }\n\n public async processExecution(\n jobName: string,\n executionId: string,\n ): Promise<void> {\n const registration = this.getRegistration(jobName);\n\n // Claim the execution atomically\n const claimed = await this.claim(executionId);\n if (!claimed) {\n this.log.debug(`Execution ${executionId} already claimed, skipping`);\n return;\n }\n\n const context = this.alepha.context.createContextId();\n this.logs.set(context, []);\n\n this.log.debug(`Started processing job '${jobName}'`, { executionId });\n\n try {\n await this.alepha.context.run(\n async () => {\n // Create AbortController for timeout + cancellation\n const abortController = new AbortController();\n this.abortControllers.set(executionId, abortController);\n\n // Set up timeout if configured\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const opts = registration.options;\n if (opts.timeout) {\n const ms = this.dt.duration(opts.timeout).as(\"milliseconds\");\n timeoutId = setTimeout(() => abortController.abort(), ms);\n }\n\n const now = this.dt.now();\n\n await this.alepha.events.emit(\"job:begin\", {\n name: jobName,\n now,\n executionId,\n });\n\n try {\n // Build items array\n const execution = await this.executions.findById(executionId);\n const items: Array<JobItem> = [];\n if (execution?.payload) {\n items.push({\n id: executionId,\n payload: execution.payload,\n attempt: execution.attempt,\n });\n }\n\n // Execute handler\n this.log.debug(`Running job '${jobName}'`, {\n executionId,\n attempt: execution?.attempt,\n items: items.length,\n });\n\n await opts.handler({\n items,\n now,\n signal: abortController.signal,\n });\n\n // Success\n await this.executions.updateById(executionId, {\n status: \"completed\",\n completedAt: this.dt.nowISOString(),\n key: null,\n });\n\n this.log.info(`Job '${jobName}' completed`, { executionId });\n\n // Write logs to cold table\n await this.writeLogs(executionId, context);\n\n await this.alepha.events.emit(\n \"job:success\",\n { name: jobName, executionId },\n { catch: true },\n );\n } catch (error) {\n const err =\n error instanceof Error ? error : new Error(String(error));\n\n // Check if this was a cancellation\n if (abortController.signal.aborted) {\n // Already marked as cancelled by cancel() or it's a timeout\n const currentExecution =\n await this.executions.findById(executionId);\n if (currentExecution?.status !== \"cancelled\") {\n // Timeout — treat as failure\n await this.handleFailure(executionId, jobName, err, context);\n } else {\n // Was cancelled explicitly — just write logs\n await this.writeLogs(executionId, context);\n await this.alepha.events.emit(\n \"job:cancel\",\n { name: jobName, executionId },\n { catch: true },\n );\n }\n } else {\n await this.handleFailure(executionId, jobName, err, context);\n }\n } finally {\n if (timeoutId) clearTimeout(timeoutId);\n this.abortControllers.delete(executionId);\n\n await this.alepha.events.emit(\n \"job:end\",\n { name: jobName, executionId },\n { catch: true },\n );\n }\n },\n { context },\n );\n } finally {\n this.logs.delete(context);\n }\n }\n\n protected async claim(executionId: string): Promise<boolean> {\n const execution = await this.executions.findById(executionId);\n if (!execution) return false;\n\n try {\n await this.executions.updateOne(\n { id: { eq: executionId }, status: { eq: \"pending\" } },\n {\n status: \"running\",\n attempt: execution.attempt + 1,\n startedAt: this.dt.nowISOString(),\n workerId: this.workerId,\n },\n );\n return true;\n } catch {\n return false;\n }\n }\n\n protected async handleFailure(\n executionId: string,\n jobName: string,\n error: Error,\n context: string,\n ): Promise<void> {\n const execution = await this.executions.findById(executionId);\n if (!execution) return;\n\n const registration = this.getRegistration(jobName);\n const opts = registration.options;\n const retryOpts = opts.retry;\n\n const canRetry =\n retryOpts &&\n execution.attempt < execution.maxAttempts &&\n (retryOpts.when ? retryOpts.when(error) : true);\n\n if (canRetry) {\n // Compute next scheduledAt from backoff\n const nextScheduledAt = this.computeBackoff(retryOpts, execution.attempt);\n\n this.log.info(\n `Job '${jobName}' failed, scheduling retry ${execution.attempt}/${execution.maxAttempts}`,\n { executionId, error: error.message, nextScheduledAt },\n );\n\n await this.executions.updateById(executionId, {\n status: \"retrying\",\n error: error.message,\n scheduledAt: nextScheduledAt,\n });\n\n await this.writeLogs(executionId, context);\n\n // Optimistic dispatch: schedule a timeout for the exact backoff delay.\n // The delayed dispatch sweep is the safety net in case of crash.\n const delayMs = Math.max(\n 0,\n new Date(nextScheduledAt).getTime() - this.dt.nowMillis(),\n );\n this.dt.createTimeout(\n () => void this.dispatchRetrying(jobName, executionId),\n delayMs,\n );\n } else {\n // Dead — all retries exhausted or predicate returned false\n this.log.info(\n `Job '${jobName}' is dead after ${execution.attempt} attempt(s)`,\n { executionId, error: error.message },\n );\n\n await this.executions.updateById(executionId, {\n status: \"dead\",\n error: error.message,\n completedAt: this.dt.nowISOString(),\n key: null,\n });\n\n await this.writeLogs(executionId, context);\n }\n\n await this.alepha.events.emit(\n \"job:error\",\n { name: jobName, error, executionId },\n { catch: true },\n );\n }\n\n protected computeBackoff(\n retryOpts: JobRetryOptions,\n attempt: number,\n ): string {\n const now = this.dt.now();\n\n if (!retryOpts.backoff) {\n // Default: 1 second fixed\n return now.add(1, \"second\").toISOString();\n }\n\n // Fixed backoff shorthand: [5, \"second\"]\n if (Array.isArray(retryOpts.backoff)) {\n const delay = this.dt.duration(retryOpts.backoff);\n return now.add(delay).toISOString();\n }\n\n // Exponential backoff\n const backoff = retryOpts.backoff as JobRetryBackoff;\n const initial = this.dt.duration(backoff.initial).as(\"milliseconds\");\n const factor = backoff.factor ?? 2;\n let delayMs = initial * factor ** (attempt - 1);\n\n if (backoff.max) {\n const maxMs = this.dt.duration(backoff.max).as(\"milliseconds\");\n delayMs = Math.min(delayMs, maxMs);\n }\n\n if (backoff.jitter) {\n // Add up to 25% random jitter\n delayMs = delayMs * (0.75 + Math.random() * 0.5);\n }\n\n return now.add(delayMs, \"millisecond\").toISOString();\n }\n\n protected async writeLogs(\n executionId: string,\n context: string,\n ): Promise<void> {\n const entries = this.logs.get(context);\n if (!entries || entries.length === 0) return;\n\n const maxEntries = this.config.logMaxEntries;\n if (maxEntries === 0) return;\n\n let logs = entries;\n if (logs.length > maxEntries) {\n logs = logs.slice(0, maxEntries);\n logs.push({\n level: \"WARN\",\n message: `Log entries truncated at ${maxEntries}`,\n timestamp: this.dt.nowMillis(),\n service: \"alepha.jobs\",\n module: \"JobProvider\",\n } as LogEntry);\n }\n\n try {\n await this.executionLogs.create({\n id: executionId,\n logs,\n });\n } catch {\n // Log write failure is not critical\n this.log.warn(`Failed to write logs for execution ${executionId}`);\n }\n }\n\n protected async dispatchRetrying(\n jobName: string,\n executionId: string,\n ): Promise<void> {\n if (this.stopping) return;\n try {\n await this.executions.updateOne(\n { id: { eq: executionId }, status: { eq: \"retrying\" } },\n { status: \"pending\" },\n );\n await this.scheduleProcessing(jobName, executionId);\n } catch {\n // Already transitioned by another worker or sweep\n }\n }\n\n // --- Internal system sweeps (Section 5 of spec) ---\n\n /**\n * Recovery Sweep (Section 5.1)\n *\n * Runs every `recovery.interval` (default: 1 minute).\n * - Stale `pending` jobs older than `staleThreshold` → re-dispatch.\n * - Crashed `running` jobs older than `max(job.timeout * 2, recovery.runTimeout)` → mark failed, apply retry policy.\n */\n protected async recoverySweep(): Promise<void> {\n this.log.trace(\"Starting recovery sweep\");\n if (this.stopping) return;\n try {\n const now = this.dt.now();\n\n // 1. Stale pending jobs\n const staleThreshold = now\n .subtract(this.config.recovery.staleThreshold, \"millisecond\")\n .toISOString();\n\n const pendingWhere = this.executions.createQueryWhere();\n pendingWhere.status = { eq: \"pending\" };\n pendingWhere.createdAt = { lte: staleThreshold };\n\n const stalePending = await this.executions.findMany({\n where: pendingWhere,\n });\n\n for (const exec of stalePending) {\n if (!this.jobs.has(exec.jobName)) continue;\n this.log.debug(\n `Recovery sweep: re-dispatching stale pending job ${exec.jobName} (${exec.id})`,\n );\n await this.scheduleProcessing(exec.jobName, exec.id);\n }\n\n // 2. Crashed running jobs\n const runningWhere = this.executions.createQueryWhere();\n runningWhere.status = { eq: \"running\" };\n\n const running = await this.executions.findMany({ where: runningWhere });\n const nowMs = now.valueOf();\n\n for (const exec of running) {\n const registration = this.jobs.get(exec.jobName);\n if (!registration) continue;\n\n // If this worker owns it and has an active AbortController, skip (still alive)\n if (this.abortControllers.has(exec.id)) continue;\n\n const opts = registration.options;\n let crashThresholdMs: number;\n if (opts.timeout) {\n crashThresholdMs =\n this.dt.duration(opts.timeout).as(\"milliseconds\") * 2;\n } else {\n crashThresholdMs = this.config.recovery.runTimeout;\n }\n\n const startedAt = exec.startedAt\n ? new Date(exec.startedAt).getTime()\n : 0;\n if (startedAt > 0 && nowMs - startedAt > crashThresholdMs) {\n this.log.warn(\n `Recovery sweep: marking crashed job ${exec.jobName} (${exec.id}) as failed`,\n );\n const error = new Error(\n \"Execution assumed crashed (recovered by sweep)\",\n );\n await this.handleFailure(exec.id, exec.jobName, error, \"\");\n }\n }\n } catch (e) {\n this.log.error(\"Recovery sweep failed\", { error: e });\n }\n }\n\n /**\n * Delayed Dispatch Sweep (Section 5.2)\n *\n * Runs every `delayed.interval` (default: 30 seconds).\n * Scans for `scheduled` and `retrying` jobs where `scheduledAt <= now`,\n * moves them to `pending`, and dispatches to the queue layer.\n */\n protected async delayedDispatchSweep(): Promise<void> {\n this.log.trace(\"Starting delayed dispatch sweep\");\n if (this.stopping) return;\n try {\n const now = this.dt.nowISOString();\n\n const where = this.executions.createQueryWhere();\n where.status = { inArray: [\"scheduled\", \"retrying\"] };\n where.scheduledAt = { lte: now };\n\n const ready = await this.executions.findMany({ where });\n\n for (const exec of ready) {\n if (!this.jobs.has(exec.jobName)) continue;\n await this.executions.updateById(exec.id, { status: \"pending\" });\n await this.scheduleProcessing(exec.jobName, exec.id);\n }\n } catch (e) {\n this.log.error(\"Delayed dispatch sweep failed\", { error: e });\n }\n }\n\n /**\n * Log Purge (Section 5.3)\n *\n * Runs daily at 03:00 via cron.\n * Deletes completed/dead/cancelled execution records older than `logRetentionDays`.\n */\n protected async logPurge(): Promise<void> {\n if (this.stopping) return;\n try {\n const cutoff = this.dt\n .now()\n .subtract(this.config.logRetentionDays, \"day\")\n .toISOString();\n\n const where = this.executions.createQueryWhere();\n where.status = { inArray: [\"completed\", \"dead\", \"cancelled\"] };\n where.completedAt = { lte: cutoff };\n\n const old = await this.executions.findMany({ where });\n\n for (const exec of old) {\n try {\n await this.executionLogs.deleteById(exec.id);\n } catch {\n // Log record may not exist\n }\n await this.executions.deleteById(exec.id);\n }\n\n if (old.length > 0) {\n this.log.info(`Log purge: deleted ${old.length} old execution records`);\n }\n } catch (e) {\n this.log.error(\"Log purge failed\", { error: e });\n }\n }\n\n // --- Lifecycle hooks ---\n\n protected readonly onStart = $hook({\n on: \"start\",\n handler: async () => {\n this.workerId = crypto.randomUUID().slice(0, 12);\n this.log.info(`Job system OK`, {\n workerId: this.workerId,\n dispatch: this.queueDispatch ? \"queue\" : \"inline\",\n });\n\n // Set up log capture listener (once)\n this.alepha.events.on(\"log\", ({ entry }) => {\n const ctx = entry.context;\n if (!ctx) return;\n const entries = this.logs.get(ctx);\n if (!entries) return;\n entries.push(entry);\n });\n\n // Run initial sweeps to recover from previous crashes.\n // Skipped on serverless — cron triggers handle periodic sweeps instead.\n if (!this.alepha.isServerless()) {\n await this.delayedDispatchSweep();\n await this.recoverySweep();\n }\n\n // Periodic sweeps via cron (works in serverless environments like Cloudflare Workers)\n this.cronProvider.createCronJob(\n \"_alepha:jobs:recovery\",\n JobProvider.SWEEP_CRON,\n async () => {\n await this.recoverySweep();\n },\n true,\n );\n this.cronProvider.createCronJob(\n \"_alepha:jobs:dispatch\",\n JobProvider.SWEEP_CRON,\n async () => {\n await this.delayedDispatchSweep();\n },\n true,\n );\n\n // Daily log purge\n this.cronProvider.createCronJob(\n \"_alepha:jobs:log-purge\",\n \"0 0 * * *\",\n async () => {\n await this.logPurge();\n },\n true,\n );\n },\n });\n\n protected readonly onStop = $hook({\n on: \"stop\",\n handler: async () => {\n this.stopping = true;\n\n // Abort any running executions\n for (const controller of this.abortControllers.values()) {\n controller.abort();\n }\n },\n });\n\n // --- Helpers ---\n\n protected getRegistration(name: string): JobRegistration {\n const registration = this.jobs.get(name);\n if (!registration) {\n throw new AlephaError(`Job not registered: ${name}`);\n }\n return registration;\n }\n}\n","import {\n $inject,\n type Async,\n createPrimitive,\n KIND,\n PipelinePrimitive,\n type PipelinePrimitiveOptions,\n type Static,\n type TSchema,\n} from \"alepha\";\nimport type { DateTime, DurationLike } from \"alepha/datetime\";\nimport {\n JobProvider,\n type JobTriggerContext,\n type PushManyItem,\n type PushOptions,\n} from \"../providers/JobProvider.ts\";\n\n/**\n * Job primitive for defining scheduled and on-demand tasks with payload validation, retry policies, and batching.\n */\nexport const $job = <T extends TSchema = TSchema>(\n options: JobPrimitiveOptions<T>,\n): JobPrimitive<T> => {\n return createPrimitive(JobPrimitive<T>, options);\n};\n\n// -----------------------------------------------------------------------------------------------------------------\n\nexport interface JobItem<T extends TSchema = TSchema> {\n id: string;\n payload: Static<T>;\n attempt: number;\n}\n\nexport interface JobHandlerArgs<T extends TSchema = TSchema> {\n items: Array<JobItem<T>>;\n now: DateTime;\n signal: AbortSignal;\n}\n\nexport interface JobRetryBackoff {\n initial: DurationLike;\n factor?: number;\n max?: DurationLike;\n jitter?: boolean;\n}\n\nexport interface JobRetryOptions {\n retries: number;\n backoff?: DurationLike | JobRetryBackoff;\n when?: (error: Error) => boolean;\n}\n\nexport interface JobBatchOptions {\n size: number;\n window: DurationLike;\n}\n\nexport type JobPriority = \"critical\" | \"high\" | \"normal\" | \"low\";\n\nexport interface JobPrimitiveOptions<T extends TSchema = TSchema>\n extends PipelinePrimitiveOptions {\n /**\n * Payload schema (TypeBox). Optional for cron-only jobs.\n */\n schema?: T;\n\n /**\n * Cron expression for automatic scheduling.\n */\n cron?: string;\n\n /**\n * Whether to use a distributed lock for cron execution.\n * @default true\n */\n lock?: boolean;\n\n /**\n * Retry policy for failed executions.\n */\n retry?: JobRetryOptions;\n\n /**\n * Max execution time per attempt.\n */\n timeout?: DurationLike;\n\n /**\n * Max parallel executions.\n * @default 1\n */\n concurrency?: number;\n\n /**\n * Consumer batching configuration.\n */\n batch?: JobBatchOptions;\n\n /**\n * Default priority for pushed jobs.\n * @default \"normal\"\n */\n priority?: JobPriority;\n\n /**\n * Handler function for job execution.\n */\n handler: (args: JobHandlerArgs<T>) => Async<void>;\n}\n\n// -----------------------------------------------------------------------------------------------------------------\n\nexport class JobPrimitive<\n T extends TSchema = TSchema,\n> extends PipelinePrimitive<JobPrimitiveOptions<T>> {\n protected readonly jobProvider = $inject(JobProvider);\n\n public get name(): string {\n return `${this.config.service.name}.${this.config.propertyKey}`;\n }\n\n protected onInit() {\n const handler = this.handler.run.bind(this.handler);\n this.jobProvider.registerJob(this.name, { ...this.options, handler });\n }\n\n /**\n * Push a single payload or an array of payloads.\n */\n public async push(\n payload: Static<T> | Array<Static<T>>,\n options?: PushOptions,\n ): Promise<string | string[]> {\n if (Array.isArray(payload)) {\n const ids = await Promise.all(\n payload.map((p) => this.jobProvider.push(this.name, p, options)),\n );\n return ids;\n }\n return this.jobProvider.push(this.name, payload, options);\n }\n\n /**\n * Push multiple payloads with per-item options.\n */\n public async pushMany(items: Array<PushManyItem<T>>): Promise<string[]> {\n return this.jobProvider.pushMany(this.name, items);\n }\n\n /**\n * Cancel a running or pending execution.\n */\n public async cancel(executionId: string): Promise<void> {\n return this.jobProvider.cancel(executionId);\n }\n\n /**\n * Manually trigger the job (admin / CLI).\n */\n public async trigger(context?: JobTriggerContext): Promise<void> {\n return this.jobProvider.trigger(this.name, context);\n }\n}\n\n$job[KIND] = JobPrimitive;\n","import { $inject, Alepha, AlephaError, t } from \"alepha\";\nimport { DateTimeProvider } from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport { $repository, DatabaseProvider, sql } from \"alepha/orm\";\nimport { NotFoundError } from \"alepha/server\";\nimport type { JobExecutionEntity } from \"../entities/jobExecutionEntity.ts\";\nimport { jobExecutionEntity } from \"../entities/jobExecutionEntity.ts\";\nimport { jobExecutionLogEntity } from \"../entities/jobExecutionLogEntity.ts\";\nimport { $job } from \"../primitives/$job.ts\";\nimport type { JobTriggerContext } from \"../providers/JobProvider.ts\";\nimport { JobProvider } from \"../providers/JobProvider.ts\";\nimport type { JobActivityPoint } from \"../schemas/jobActivitySchema.ts\";\nimport type { JobCronInfo } from \"../schemas/jobCronInfoSchema.ts\";\nimport type { JobExecutionQuery } from \"../schemas/jobExecutionQuerySchema.ts\";\nimport type { JobFailure } from \"../schemas/jobFailureSchema.ts\";\nimport type { JobQueueDepth } from \"../schemas/jobQueueDepthSchema.ts\";\nimport type { JobRegistration } from \"../schemas/jobRegistrationSchema.ts\";\nimport type { JobStats } from \"../schemas/jobStatsSchema.ts\";\n\n// -----------------------------------------------------------------------------------------------------------------\n\nexport class JobService {\n protected readonly alepha = $inject(Alepha);\n protected readonly dt = $inject(DateTimeProvider);\n protected readonly log = $logger();\n protected readonly jobProvider = $inject(JobProvider);\n protected readonly database = $inject(DatabaseProvider);\n protected readonly executions = $repository(jobExecutionEntity);\n protected readonly executionLogs = $repository(jobExecutionLogEntity);\n\n protected computeCan(status: string) {\n return {\n retry: status === \"dead\" || status === \"cancelled\",\n cancel:\n status === \"pending\" ||\n status === \"running\" ||\n status === \"scheduled\" ||\n status === \"retrying\",\n };\n }\n\n /**\n * Convert an ISO date string to the raw SQL parameter format\n * expected by the current database dialect.\n *\n * - PostgreSQL: ISO string (timestamp comparison)\n * - SQLite: epoch milliseconds (integer comparison)\n */\n protected toRawDate(iso: string): string | number {\n return this.database.dialect === \"sqlite\" ? new Date(iso).getTime() : iso;\n }\n\n public async getStats(days?: number): Promise<JobStats> {\n const jobs = this.jobProvider.getRegisteredJobs();\n const periodAgo = this.toRawDate(\n this.dt\n .now()\n .subtract(days ?? 1, \"day\")\n .toISOString(),\n );\n\n const rows = await this.executions.query(\n (e) => sql`\n SELECT\n COUNT(*) FILTER (WHERE ${e.status} = 'running') AS running,\n COUNT(*) FILTER (WHERE ${e.status} = 'pending') AS pending,\n COUNT(*) FILTER (WHERE ${e.status} = 'scheduled') AS scheduled,\n COUNT(*) FILTER (WHERE ${e.status} = 'retrying') AS retrying,\n COUNT(*) FILTER (WHERE ${e.status} = 'dead') AS dead,\n COUNT(*) FILTER (WHERE ${e.status} = 'completed' AND ${e.completedAt} >= ${periodAgo}) AS completed_24h,\n COUNT(*) FILTER (WHERE ${e.status} IN ('dead', 'failed') AND ${e.completedAt} >= ${periodAgo}) AS failed_24h\n FROM ${e}\n `,\n t.object({\n running: t.string(),\n pending: t.string(),\n scheduled: t.string(),\n retrying: t.string(),\n dead: t.string(),\n completed_24h: t.string(),\n failed_24h: t.string(),\n }),\n );\n\n const row = rows[0];\n return {\n registered: jobs.size,\n running: Number(row.running),\n pending: Number(row.pending),\n scheduled: Number(row.scheduled),\n retrying: Number(row.retrying),\n dead: Number(row.dead),\n completed: Number(row.completed_24h),\n failed: Number(row.failed_24h),\n };\n }\n\n public getRegistry(): JobRegistration[] {\n const jobs = this.jobProvider.getRegisteredJobs();\n const result: JobRegistration[] = [];\n\n for (const [name, reg] of jobs) {\n const opts = reg.options;\n const hasCron = Boolean(opts.cron);\n const hasSchema = Boolean(opts.schema);\n\n let type: \"cron\" | \"push\" | \"both\";\n if (hasCron && hasSchema) {\n type = \"both\";\n } else if (hasCron) {\n type = \"cron\";\n } else {\n type = \"push\";\n }\n\n const registration: JobRegistration = {\n name,\n type,\n priority: (opts.priority ?? \"normal\") as JobRegistration[\"priority\"],\n concurrency: opts.concurrency ?? 1,\n hasSchema,\n cron: opts.cron,\n timeout: opts.timeout ? String(opts.timeout) : undefined,\n retry: opts.retry\n ? {\n retries: opts.retry.retries,\n hasBackoff: Boolean(opts.retry.backoff),\n }\n : undefined,\n batch: opts.batch\n ? {\n size: opts.batch.size,\n window: String(opts.batch.window),\n }\n : undefined,\n };\n\n result.push(registration);\n }\n\n return result;\n }\n\n public async findExecutions(query: JobExecutionQuery = {}) {\n query.sort ??= \"-createdAt\";\n\n const where = this.executions.createQueryWhere();\n\n if (query.job) {\n where.jobName = { eq: query.job };\n }\n\n if (query.status) {\n where.status = { eq: query.status };\n }\n\n if (query.priority) {\n const priorityMap: Record<string, number> = {\n critical: 0,\n high: 1,\n normal: 2,\n low: 3,\n };\n where.priority = { eq: priorityMap[query.priority] };\n }\n\n if (query.from) {\n where.createdAt = { gte: query.from };\n }\n\n if (query.to) {\n where.createdAt = {\n ...(where.createdAt as object),\n lte: query.to,\n };\n }\n\n const page = await this.executions.paginate(\n query,\n { where },\n { count: true },\n );\n return {\n ...page,\n content: page.content.map((exec: JobExecutionEntity) => ({\n ...exec,\n can: this.computeCan(exec.status),\n })),\n };\n }\n\n public async getExecution(id: string) {\n const execution = await this.executions.findById(id);\n if (!execution) {\n throw new NotFoundError(`Execution not found: ${id}`);\n }\n\n const logRecord = await this.executionLogs.findById(id);\n\n return {\n ...execution,\n can: this.computeCan(execution.status),\n logs: logRecord?.logs,\n };\n }\n\n public async triggerJob(\n name: string,\n context?: JobTriggerContext,\n ): Promise<{ ok: boolean }> {\n const jobPrimitives = this.alepha.primitives($job);\n const job = jobPrimitives.find((j) => j.name === name);\n\n if (!job) {\n throw new NotFoundError(`Job not found: ${name}`);\n }\n\n this.log.info(`Triggering job '${name}'`, {\n triggeredBy: context?.triggeredByName ?? context?.triggeredBy,\n });\n\n await job.trigger(context);\n return { ok: true };\n }\n\n public async retryExecution(\n id: string,\n context?: { triggeredBy?: string; triggeredByName?: string },\n ): Promise<{ ok: boolean }> {\n const execution = await this.executions.findById(id);\n if (!execution) {\n throw new NotFoundError(`Execution not found: ${id}`);\n }\n\n if (execution.status !== \"dead\" && execution.status !== \"cancelled\") {\n throw new AlephaError(\n `Cannot retry execution in '${execution.status}' status`,\n );\n }\n\n this.log.info(`Retrying execution ${id}`, {\n jobName: execution.jobName,\n previousStatus: execution.status,\n triggeredBy: context?.triggeredByName ?? context?.triggeredBy,\n });\n\n const jobPrimitives = this.alepha.primitives($job);\n const job = jobPrimitives.find((j) => j.name === execution.jobName);\n\n if (!job) {\n throw new NotFoundError(`Job not found: ${execution.jobName}`);\n }\n\n if (execution.payload) {\n await job.push(execution.payload, {});\n } else {\n await job.trigger({\n triggeredBy: context?.triggeredBy,\n triggeredByName: context?.triggeredByName,\n });\n }\n\n return { ok: true };\n }\n\n public async cancelExecution(\n id: string,\n context?: { cancelledBy?: string; cancelledByName?: string },\n ): Promise<{ ok: boolean }> {\n this.log.info(`Cancelling execution ${id}`, {\n cancelledBy: context?.cancelledByName ?? context?.cancelledBy,\n });\n\n await this.jobProvider.cancel(id, {\n cancelledBy: context?.cancelledBy,\n cancelledByName: context?.cancelledByName,\n });\n return { ok: true };\n }\n\n public async getCronJobs(): Promise<JobCronInfo[]> {\n const jobs = this.jobProvider.getRegisteredJobs();\n const cronJobNames: string[] = [];\n\n for (const [name, reg] of jobs) {\n if (reg.options.cron) cronJobNames.push(name);\n }\n\n const lastByJob = await this.getLastExecutionPerJob(cronJobNames);\n\n const result: JobCronInfo[] = [];\n for (const name of cronJobNames) {\n const reg = jobs.get(name)!;\n const opts = reg.options;\n const last = lastByJob.get(name);\n\n result.push({\n name,\n cron: opts.cron!,\n lock: opts.lock !== false,\n priority: (opts.priority ?? \"normal\") as JobCronInfo[\"priority\"],\n concurrency: opts.concurrency ?? 1,\n hasSchema: Boolean(opts.schema),\n lastExecution: last\n ? {\n id: last.id,\n status: last.status,\n startedAt: last.started_at ?? undefined,\n completedAt: last.completed_at ?? undefined,\n error: last.error ?? undefined,\n }\n : undefined,\n });\n }\n\n return result;\n }\n\n public async getQueueDepth(): Promise<JobQueueDepth[]> {\n const jobs = this.jobProvider.getRegisteredJobs();\n\n const rows = await this.executions.query(\n (e) => sql`\n SELECT\n ${e.jobName} AS job_name,\n COUNT(*) FILTER (WHERE ${e.status} = 'pending') AS pending,\n COUNT(*) FILTER (WHERE ${e.status} = 'running') AS running,\n COUNT(*) FILTER (WHERE ${e.status} = 'scheduled') AS scheduled,\n COUNT(*) FILTER (WHERE ${e.status} = 'retrying') AS retrying,\n COUNT(*) FILTER (WHERE ${e.status} = 'dead') AS dead\n FROM ${e}\n WHERE ${e.status} IN ('pending', 'running', 'scheduled', 'retrying', 'dead')\n GROUP BY ${e.jobName}\n `,\n t.object({\n job_name: t.string(),\n pending: t.string(),\n running: t.string(),\n scheduled: t.string(),\n retrying: t.string(),\n dead: t.string(),\n }),\n );\n\n const counts = new Map(rows.map((r) => [r.job_name, r]));\n\n const result: JobQueueDepth[] = [];\n for (const [name, reg] of jobs) {\n const row = counts.get(name);\n result.push({\n jobName: name,\n pending: Number(row?.pending ?? 0),\n running: Number(row?.running ?? 0),\n scheduled: Number(row?.scheduled ?? 0),\n retrying: Number(row?.retrying ?? 0),\n dead: Number(row?.dead ?? 0),\n concurrency: reg.options.concurrency ?? 1,\n });\n }\n\n return result;\n }\n\n public async getActivity(days = 14): Promise<JobActivityPoint[]> {\n if (this.database.dialect === \"sqlite\") {\n return this.getActivitySqlite(days);\n }\n\n const rows = await this.executions.query(\n (e) => sql`\n WITH date_series AS (\n SELECT generate_series(\n CURRENT_DATE - ${days - 1}::int,\n CURRENT_DATE,\n '1 day'::interval\n )::date AS date\n )\n SELECT\n ds.date::text AS date,\n COALESCE(COUNT(*) FILTER (WHERE ${e.status} = 'completed'), 0) AS completed,\n COALESCE(COUNT(*) FILTER (WHERE ${e.status} IN ('dead', 'failed')), 0) AS failed\n FROM date_series ds\n LEFT JOIN ${e} ON DATE(${e.completedAt}) = ds.date\n AND ${e.status} IN ('completed', 'dead', 'failed')\n GROUP BY ds.date\n ORDER BY ds.date ASC\n `,\n t.object({\n date: t.string(),\n completed: t.string(),\n failed: t.string(),\n }),\n );\n\n return rows.map((row) => ({\n date: row.date,\n completed: Number(row.completed),\n failed: Number(row.failed),\n }));\n }\n\n protected async getActivitySqlite(days = 14): Promise<JobActivityPoint[]> {\n const now = this.dt.now();\n const startDate = now.subtract(days - 1, \"day\");\n\n const where = this.executions.createQueryWhere();\n where.status = { inArray: [\"completed\", \"dead\", \"failed\"] };\n where.completedAt = { gte: startDate.startOf(\"day\").toISOString() };\n\n const executions = await this.executions.findMany({ where });\n\n // Build date → counts map\n const byDate = new Map<string, { completed: number; failed: number }>();\n for (let i = 0; i < days; i++) {\n const date = startDate.add(i, \"day\").format(\"YYYY-MM-DD\");\n byDate.set(date, { completed: 0, failed: 0 });\n }\n\n for (const exec of executions) {\n if (!exec.completedAt) continue;\n const date = this.dt.of(exec.completedAt).format(\"YYYY-MM-DD\");\n const entry = byDate.get(date);\n if (!entry) continue;\n if (exec.status === \"completed\") entry.completed++;\n else entry.failed++;\n }\n\n return [...byDate.entries()].map(([date, counts]) => ({\n date,\n ...counts,\n }));\n }\n\n public async getTopFailures(days?: number): Promise<JobFailure[]> {\n const periodAgoIso = this.dt\n .now()\n .subtract(days ?? 7, \"day\")\n .toISOString();\n\n if (this.database.dialect === \"sqlite\") {\n return this.getTopFailuresSqlite(periodAgoIso);\n }\n\n const rows = await this.executions.query(\n (e) => sql`\n SELECT\n ${e.jobName} AS job_name,\n COUNT(*) AS failures,\n (ARRAY_AGG(${e.error} ORDER BY ${e.completedAt} DESC))[1] AS last_error\n FROM ${e}\n WHERE ${e.status} IN ('dead', 'failed')\n AND ${e.completedAt} >= ${periodAgoIso}\n GROUP BY ${e.jobName}\n ORDER BY failures DESC\n `,\n t.object({\n job_name: t.string(),\n failures: t.string(),\n last_error: t.optional(t.nullable(t.string())),\n }),\n );\n\n return rows.map((row) => ({\n jobName: row.job_name,\n failures: Number(row.failures),\n lastError: row.last_error ?? undefined,\n }));\n }\n\n protected async getTopFailuresSqlite(\n periodAgoIso: string,\n ): Promise<JobFailure[]> {\n const where = this.executions.createQueryWhere();\n where.status = { inArray: [\"dead\", \"failed\"] };\n where.completedAt = { gte: periodAgoIso };\n\n const failures = await this.executions.findMany({\n where,\n orderBy: { column: \"completedAt\", direction: \"desc\" },\n });\n\n const byJob = new Map<string, { failures: number; lastError?: string }>();\n for (const exec of failures) {\n const entry = byJob.get(exec.jobName) ?? { failures: 0 };\n entry.failures++;\n if (!entry.lastError) entry.lastError = exec.error ?? undefined;\n byJob.set(exec.jobName, entry);\n }\n\n return [...byJob.entries()]\n .map(([jobName, data]) => ({\n jobName,\n failures: data.failures,\n lastError: data.lastError,\n }))\n .sort((a, b) => b.failures - a.failures);\n }\n\n /**\n * Fetch the most recent execution per job name.\n *\n * - PostgreSQL: uses `DISTINCT ON` for a single-pass query\n * - SQLite: uses ORM queries (one per job name) since `DISTINCT ON` is not supported\n */\n protected async getLastExecutionPerJob(jobNames: string[]): Promise<\n Map<\n string,\n {\n id: string;\n job_name: string;\n status: string;\n started_at?: string | null;\n completed_at?: string | null;\n error?: string | null;\n }\n >\n > {\n if (jobNames.length === 0) {\n return new Map();\n }\n\n if (this.database.dialect === \"sqlite\") {\n const result = new Map<string, any>();\n for (const name of jobNames) {\n const rows = await this.executions.findMany({\n where: { jobName: { eq: name } },\n orderBy: { column: \"createdAt\", direction: \"desc\" },\n limit: 1,\n });\n if (rows[0]) {\n result.set(name, {\n id: rows[0].id,\n job_name: rows[0].jobName,\n status: rows[0].status,\n started_at: rows[0].startedAt,\n completed_at: rows[0].completedAt,\n error: rows[0].error,\n });\n }\n }\n return result;\n }\n\n const schema = t.object({\n id: t.string(),\n job_name: t.string(),\n status: t.string(),\n started_at: t.optional(t.nullable(t.string())),\n completed_at: t.optional(t.nullable(t.string())),\n error: t.optional(t.nullable(t.string())),\n });\n\n const rows = await this.executions.query(\n (e) => sql`\n SELECT DISTINCT ON (${e.jobName})\n ${e.id}, ${e.jobName} AS job_name, ${e.status},\n ${e.startedAt} AS started_at, ${e.completedAt} AS completed_at, ${e.error}\n FROM ${e}\n WHERE ${e.jobName} IN (${sql.join(\n jobNames.map((n) => sql`${n}`),\n sql`, `,\n )})\n ORDER BY ${e.jobName}, ${e.createdAt} DESC\n `,\n schema,\n );\n\n return new Map(rows.map((r) => [r.job_name, r]));\n }\n}\n","import { $inject, t } from \"alepha\";\nimport { $secure } from \"alepha/security\";\nimport { $action, okSchema } from \"alepha/server\";\nimport {\n jobActivityPointSchema,\n jobActivityQuerySchema,\n} from \"../schemas/jobActivitySchema.ts\";\nimport { jobCronInfoSchema } from \"../schemas/jobCronInfoSchema.ts\";\nimport { jobExecutionDetailResourceSchema } from \"../schemas/jobExecutionDetailResourceSchema.ts\";\nimport { jobExecutionQuerySchema } from \"../schemas/jobExecutionQuerySchema.ts\";\nimport { jobExecutionResourceSchema } from \"../schemas/jobExecutionResourceSchema.ts\";\nimport { jobFailureSchema } from \"../schemas/jobFailureSchema.ts\";\nimport { jobQueueDepthSchema } from \"../schemas/jobQueueDepthSchema.ts\";\nimport { jobRegistrationSchema } from \"../schemas/jobRegistrationSchema.ts\";\nimport { jobStatsSchema } from \"../schemas/jobStatsSchema.ts\";\nimport { triggerJobSchema } from \"../schemas/triggerJobSchema.ts\";\nimport { JobService } from \"../services/JobService.ts\";\n\nexport class AdminJobController {\n protected readonly url: string = \"/jobs\";\n protected readonly group: string = \"admin:jobs\";\n protected readonly jobService = $inject(JobService);\n\n public readonly getJobStats = $action({\n path: `${this.url}/stats`,\n group: this.group,\n use: [$secure({ permissions: [\"admin:job:read\"] })],\n schema: {\n query: jobActivityQuerySchema,\n response: jobStatsSchema,\n },\n handler: ({ query }) => this.jobService.getStats(query.days),\n });\n\n public readonly getJobRegistry = $action({\n path: this.url,\n group: this.group,\n use: [$secure({ permissions: [\"admin:job:read\"] })],\n schema: {\n response: t.array(jobRegistrationSchema),\n },\n handler: () => this.jobService.getRegistry(),\n });\n\n public readonly findJobExecutions = $action({\n path: `${this.url}/executions`,\n group: this.group,\n use: [$secure({ permissions: [\"admin:job:read\"] })],\n schema: {\n query: jobExecutionQuerySchema,\n response: t.page(jobExecutionResourceSchema),\n },\n handler: ({ query }) => this.jobService.findExecutions(query),\n });\n\n public readonly getJobExecution = $action({\n path: `${this.url}/executions/:id`,\n group: this.group,\n use: [$secure({ permissions: [\"admin:job:read\"] })],\n schema: {\n params: t.object({\n id: t.uuid(),\n }),\n response: jobExecutionDetailResourceSchema,\n },\n handler: ({ params }) => this.jobService.getExecution(params.id),\n });\n\n public readonly triggerJob = $action({\n method: \"POST\",\n path: `${this.url}/trigger`,\n group: this.group,\n use: [$secure({ permissions: [\"admin:job:trigger\"] })],\n schema: {\n body: triggerJobSchema,\n response: okSchema,\n },\n handler: async ({ body, user }) => {\n return this.jobService.triggerJob(body.name, {\n payload: body.payload,\n triggeredBy: user?.id,\n triggeredByName: user?.name,\n });\n },\n });\n\n public readonly retryJobExecution = $action({\n method: \"POST\",\n path: `${this.url}/executions/:id/retry`,\n group: this.group,\n use: [$secure({ permissions: [\"admin:job:trigger\"] })],\n schema: {\n params: t.object({\n id: t.uuid(),\n }),\n response: okSchema,\n },\n handler: async ({ params, user }) => {\n return this.jobService.retryExecution(params.id, {\n triggeredBy: user?.id,\n triggeredByName: user?.name,\n });\n },\n });\n\n public readonly cancelJobExecution = $action({\n method: \"POST\",\n path: `${this.url}/executions/:id/cancel`,\n group: this.group,\n use: [$secure({ permissions: [\"admin:job:cancel\"] })],\n schema: {\n params: t.object({\n id: t.uuid(),\n }),\n response: okSchema,\n },\n handler: async ({ params, user }) => {\n return this.jobService.cancelExecution(params.id, {\n cancelledBy: user?.id,\n cancelledByName: user?.name,\n });\n },\n });\n\n public readonly getJobActivity = $action({\n path: `${this.url}/activity`,\n group: this.group,\n use: [$secure({ permissions: [\"admin:job:read\"] })],\n schema: {\n query: jobActivityQuerySchema,\n response: t.array(jobActivityPointSchema),\n },\n handler: ({ query }) => this.jobService.getActivity(query.days),\n });\n\n public readonly getCronJobs = $action({\n path: `${this.url}/cron`,\n group: this.group,\n use: [$secure({ permissions: [\"admin:job:read\"] })],\n schema: {\n response: t.array(jobCronInfoSchema),\n },\n handler: () => this.jobService.getCronJobs(),\n });\n\n public readonly getJobQueueDepth = $action({\n path: `${this.url}/queue`,\n group: this.group,\n use: [$secure({ permissions: [\"admin:job:read\"] })],\n schema: {\n response: t.array(jobQueueDepthSchema),\n },\n handler: () => this.jobService.getQueueDepth(),\n });\n\n public readonly getJobTopFailures = $action({\n path: `${this.url}/failures`,\n group: this.group,\n use: [$secure({ permissions: [\"admin:job:read\"] })],\n schema: {\n query: jobActivityQuerySchema,\n response: t.array(jobFailureSchema),\n },\n handler: ({ query }) => this.jobService.getTopFailures(query.days),\n });\n}\n","import { $hook, $inject, t } from \"alepha\";\nimport { $queue } from \"alepha/queue\";\nimport { JobProvider } from \"./JobProvider.ts\";\n\n// -----------------------------------------------------------------------------------------------------------------\n\n/**\n * Optional queue-backed dispatch for the job system.\n *\n * When registered, `JobProvider` will push work through this queue instead of\n * executing inline. This is the default for long-running (non-serverless) environments.\n * In serverless environments (Cloudflare Workers, Vercel), this provider is typically\n * omitted so jobs execute inline without requiring an external queue resource.\n */\nexport class JobQueueProvider {\n protected readonly jobProvider = $inject(JobProvider);\n\n protected readonly queue = $queue({\n name: \"_alepha:jobs:dispatch\",\n schema: t.object({ jobName: t.text(), executionId: t.text() }),\n handler: async (msg) => {\n await this.jobProvider.processExecution(\n msg.payload.jobName,\n msg.payload.executionId,\n );\n },\n });\n\n protected readonly onStart = $hook({\n on: \"start\",\n handler: async () => {\n this.jobProvider.queueDispatch = (jobName, executionId) =>\n this.push(jobName, executionId);\n },\n });\n\n /**\n * Push a job execution onto the queue for async processing.\n */\n public async push(jobName: string, executionId: string): Promise<void> {\n await this.queue.push({ jobName, executionId });\n }\n}\n","import { $module, type Alepha, type Static, t } from \"alepha\";\nimport { AlephaBatch } from \"alepha/batch\";\nimport type { DateTime } from \"alepha/datetime\";\nimport { AlephaLock } from \"alepha/lock\";\nimport { AlephaQueue } from \"alepha/queue\";\nimport { AlephaScheduler } from \"alepha/scheduler\";\nimport { AdminJobController } from \"./controllers/AdminJobController.ts\";\nimport { JobProvider } from \"./providers/JobProvider.ts\";\nimport { JobQueueProvider } from \"./providers/JobQueueProvider.ts\";\nimport { JobService } from \"./services/JobService.ts\";\n\n// -----------------------------------------------------------------------------------------------------------------\n\nexport * from \"./controllers/AdminJobController.ts\";\nexport * from \"./entities/jobExecutionEntity.ts\";\nexport * from \"./entities/jobExecutionLogEntity.ts\";\nexport * from \"./primitives/$job.ts\";\nexport * from \"./providers/JobProvider.ts\";\nexport * from \"./providers/JobQueueProvider.ts\";\nexport * from \"./schemas/jobActivitySchema.ts\";\nexport * from \"./schemas/jobConfigAtom.ts\";\nexport * from \"./schemas/jobCronInfoSchema.ts\";\nexport * from \"./schemas/jobExecutionDetailResourceSchema.ts\";\nexport * from \"./schemas/jobExecutionQuerySchema.ts\";\nexport * from \"./schemas/jobExecutionResourceSchema.ts\";\nexport * from \"./schemas/jobFailureSchema.ts\";\nexport * from \"./schemas/jobQueueDepthSchema.ts\";\nexport * from \"./schemas/jobRegistrationSchema.ts\";\nexport * from \"./schemas/jobStatsSchema.ts\";\nexport * from \"./schemas/triggerJobSchema.ts\";\nexport * from \"./services/JobService.ts\";\n\n// -----------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha\" {\n interface Env extends Partial<Static<typeof jobEnvSchema>> {}\n\n interface Hooks {\n \"job:begin\": { name: string; now: DateTime; executionId: string };\n \"job:success\": { name: string; executionId: string };\n \"job:error\": { name: string; error: Error; executionId: string };\n \"job:cancel\": { name: string; executionId: string };\n \"job:end\": { name: string; executionId: string };\n }\n}\n\n// -----------------------------------------------------------------------------------------------------------------\n\nconst jobEnvSchema = t.object({\n /**\n * Controls whether the job system dispatches work through a queue or executes inline.\n *\n * - `1` — always use queue (force queue even in serverless)\n * - `0` — never use queue (force inline, useful for testing)\n * - not set — auto: use queue when NOT serverless (default)\n */\n ALEPHA_JOBS_QUEUE: t.optional(\n t.integer({\n description:\n \"Set to 1 to always use queue, 0 to disable queue (default: auto-detect based on environment)\",\n }),\n ),\n});\n\n// -----------------------------------------------------------------------------------------------------------------\n\n/**\n * Job execution framework — unified primitive for deferred, scheduled, and queued work.\n *\n * **Features:**\n * - Push-based jobs with typed payloads\n * - Cron scheduling with execution tracking\n * - Retry with exponential backoff\n * - Priority, delay, cancellation\n * - Deduplication via unique keys\n * - Per-execution log capture\n *\n * @module alepha.api.jobs\n */\nexport const AlephaApiJobs = $module({\n name: \"alepha.api.jobs\",\n services: [\n AlephaQueue,\n AlephaScheduler,\n AlephaLock,\n AlephaBatch,\n JobProvider,\n JobQueueProvider,\n JobService,\n AdminJobController,\n ],\n register: (alepha: Alepha) => {\n const env = alepha.parseEnv(jobEnvSchema);\n const useQueue =\n env.ALEPHA_JOBS_QUEUE === 1\n ? true\n : env.ALEPHA_JOBS_QUEUE === 0\n ? false\n : !alepha.isServerless();\n\n alepha.with(AlephaScheduler);\n alepha.with(AlephaLock);\n alepha.with(AlephaBatch);\n alepha.with(JobProvider);\n alepha.with(JobService);\n alepha.with(AdminJobController);\n\n if (useQueue) {\n alepha.with(AlephaQueue);\n alepha.with(JobQueueProvider);\n }\n },\n});\n"],"mappings":"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"}