alepha 0.15.3 → 0.15.5

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 (318) hide show
  1. package/README.md +26 -11
  2. package/dist/api/audits/index.d.ts +335 -335
  3. package/dist/api/audits/index.d.ts.map +1 -1
  4. package/dist/api/audits/index.js +11 -3
  5. package/dist/api/audits/index.js.map +1 -1
  6. package/dist/api/files/index.d.ts +3 -3
  7. package/dist/api/files/index.js +4 -3
  8. package/dist/api/files/index.js.map +1 -1
  9. package/dist/api/jobs/index.d.ts +198 -155
  10. package/dist/api/jobs/index.d.ts.map +1 -1
  11. package/dist/api/jobs/index.js +103 -5
  12. package/dist/api/jobs/index.js.map +1 -1
  13. package/dist/api/keys/index.d.ts +198 -198
  14. package/dist/api/keys/index.d.ts.map +1 -1
  15. package/dist/api/keys/index.js +3 -3
  16. package/dist/api/keys/index.js.map +1 -1
  17. package/dist/api/notifications/index.browser.js +1 -0
  18. package/dist/api/notifications/index.browser.js.map +1 -1
  19. package/dist/api/notifications/index.d.ts +3 -3
  20. package/dist/api/notifications/index.js +4 -3
  21. package/dist/api/notifications/index.js.map +1 -1
  22. package/dist/api/parameters/index.d.ts +263 -263
  23. package/dist/api/parameters/index.d.ts.map +1 -1
  24. package/dist/api/parameters/index.js +41 -30
  25. package/dist/api/parameters/index.js.map +1 -1
  26. package/dist/api/users/index.d.ts +383 -77
  27. package/dist/api/users/index.d.ts.map +1 -1
  28. package/dist/api/users/index.js +284 -72
  29. package/dist/api/users/index.js.map +1 -1
  30. package/dist/api/verifications/index.d.ts +131 -131
  31. package/dist/api/verifications/index.d.ts.map +1 -1
  32. package/dist/api/verifications/index.js +3 -3
  33. package/dist/api/verifications/index.js.map +1 -1
  34. package/dist/batch/index.d.ts +3 -3
  35. package/dist/batch/index.js +3 -3
  36. package/dist/batch/index.js.map +1 -1
  37. package/dist/bucket/index.d.ts +3 -3
  38. package/dist/bucket/index.js +6 -6
  39. package/dist/bucket/index.js.map +1 -1
  40. package/dist/cache/core/index.d.ts +3 -3
  41. package/dist/cache/core/index.js +3 -3
  42. package/dist/cache/core/index.js.map +1 -1
  43. package/dist/cli/index.d.ts +5612 -20
  44. package/dist/cli/index.d.ts.map +1 -1
  45. package/dist/cli/index.js +122 -91
  46. package/dist/cli/index.js.map +1 -1
  47. package/dist/command/index.d.ts +11 -4
  48. package/dist/command/index.d.ts.map +1 -1
  49. package/dist/command/index.js +8 -6
  50. package/dist/command/index.js.map +1 -1
  51. package/dist/core/index.browser.js.map +1 -1
  52. package/dist/core/index.d.ts +4 -8
  53. package/dist/core/index.d.ts.map +1 -1
  54. package/dist/core/index.js +3 -3
  55. package/dist/core/index.js.map +1 -1
  56. package/dist/core/index.native.js.map +1 -1
  57. package/dist/datetime/index.d.ts +3 -3
  58. package/dist/datetime/index.js +3 -3
  59. package/dist/datetime/index.js.map +1 -1
  60. package/dist/email/index.d.ts +16 -16
  61. package/dist/email/index.d.ts.map +1 -1
  62. package/dist/email/index.js +10562 -10
  63. package/dist/email/index.js.map +1 -1
  64. package/dist/fake/index.d.ts +3 -3
  65. package/dist/fake/index.js +3 -3
  66. package/dist/fake/index.js.map +1 -1
  67. package/dist/lock/core/index.d.ts +9 -4
  68. package/dist/lock/core/index.d.ts.map +1 -1
  69. package/dist/lock/core/index.js +12 -4
  70. package/dist/lock/core/index.js.map +1 -1
  71. package/dist/logger/index.d.ts +3 -3
  72. package/dist/logger/index.js +6 -3
  73. package/dist/logger/index.js.map +1 -1
  74. package/dist/mcp/index.d.ts +3 -3
  75. package/dist/mcp/index.js +3 -3
  76. package/dist/mcp/index.js.map +1 -1
  77. package/dist/orm/index.d.ts +12 -12
  78. package/dist/orm/index.js +4 -4
  79. package/dist/orm/index.js.map +1 -1
  80. package/dist/queue/core/index.d.ts +3 -3
  81. package/dist/queue/core/index.js +3 -3
  82. package/dist/queue/core/index.js.map +1 -1
  83. package/dist/react/auth/index.browser.js +2 -1
  84. package/dist/react/auth/index.browser.js.map +1 -1
  85. package/dist/react/auth/index.d.ts +3 -3
  86. package/dist/react/auth/index.js +5 -4
  87. package/dist/react/auth/index.js.map +1 -1
  88. package/dist/react/core/index.d.ts +6 -6
  89. package/dist/react/core/index.js +3 -3
  90. package/dist/react/core/index.js.map +1 -1
  91. package/dist/react/form/index.d.ts +3 -3
  92. package/dist/react/form/index.js +3 -3
  93. package/dist/react/form/index.js.map +1 -1
  94. package/dist/react/head/index.d.ts +3 -3
  95. package/dist/react/head/index.js +3 -3
  96. package/dist/react/head/index.js.map +1 -1
  97. package/dist/react/i18n/index.d.ts +3 -3
  98. package/dist/react/i18n/index.js +3 -3
  99. package/dist/react/i18n/index.js.map +1 -1
  100. package/dist/react/intro/index.css +337 -0
  101. package/dist/react/intro/index.css.map +1 -0
  102. package/dist/react/intro/index.d.ts +10 -0
  103. package/dist/react/intro/index.d.ts.map +1 -0
  104. package/dist/react/intro/index.js +222 -0
  105. package/dist/react/intro/index.js.map +1 -0
  106. package/dist/react/router/index.browser.js +2 -2
  107. package/dist/react/router/index.browser.js.map +1 -1
  108. package/dist/react/router/index.d.ts +11 -1
  109. package/dist/react/router/index.d.ts.map +1 -1
  110. package/dist/react/router/index.js +21 -11
  111. package/dist/react/router/index.js.map +1 -1
  112. package/dist/redis/index.d.ts +22 -22
  113. package/dist/redis/index.js +3 -3
  114. package/dist/redis/index.js.map +1 -1
  115. package/dist/retry/index.d.ts +3 -3
  116. package/dist/retry/index.js +3 -3
  117. package/dist/retry/index.js.map +1 -1
  118. package/dist/scheduler/index.d.ts +16 -4
  119. package/dist/scheduler/index.d.ts.map +1 -1
  120. package/dist/scheduler/index.js +45 -7
  121. package/dist/scheduler/index.js.map +1 -1
  122. package/dist/security/index.d.ts +3 -3
  123. package/dist/security/index.js +5 -5
  124. package/dist/security/index.js.map +1 -1
  125. package/dist/server/auth/index.d.ts +3 -3
  126. package/dist/server/auth/index.js +3 -3
  127. package/dist/server/auth/index.js.map +1 -1
  128. package/dist/server/cache/index.d.ts +3 -3
  129. package/dist/server/cache/index.js +3 -3
  130. package/dist/server/cache/index.js.map +1 -1
  131. package/dist/server/compress/index.d.ts +3 -3
  132. package/dist/server/compress/index.d.ts.map +1 -1
  133. package/dist/server/compress/index.js +4 -3
  134. package/dist/server/compress/index.js.map +1 -1
  135. package/dist/server/cookies/index.d.ts +3 -3
  136. package/dist/server/cookies/index.js +3 -3
  137. package/dist/server/cookies/index.js.map +1 -1
  138. package/dist/server/core/index.d.ts +14 -25
  139. package/dist/server/core/index.d.ts.map +1 -1
  140. package/dist/server/core/index.js +13 -29
  141. package/dist/server/core/index.js.map +1 -1
  142. package/dist/server/cors/index.d.ts +3 -3
  143. package/dist/server/cors/index.js +3 -3
  144. package/dist/server/cors/index.js.map +1 -1
  145. package/dist/server/health/index.d.ts +20 -20
  146. package/dist/server/health/index.js +3 -3
  147. package/dist/server/health/index.js.map +1 -1
  148. package/dist/server/helmet/index.d.ts +3 -3
  149. package/dist/server/helmet/index.js +3 -3
  150. package/dist/server/helmet/index.js.map +1 -1
  151. package/dist/server/links/index.d.ts +42 -42
  152. package/dist/server/links/index.d.ts.map +1 -1
  153. package/dist/server/links/index.js +4 -4
  154. package/dist/server/links/index.js.map +1 -1
  155. package/dist/server/metrics/index.d.ts +3 -3
  156. package/dist/server/metrics/index.js +3 -3
  157. package/dist/server/metrics/index.js.map +1 -1
  158. package/dist/server/multipart/index.d.ts +3 -3
  159. package/dist/server/multipart/index.js +3 -3
  160. package/dist/server/multipart/index.js.map +1 -1
  161. package/dist/server/proxy/index.d.ts +3 -3
  162. package/dist/server/proxy/index.js +3 -3
  163. package/dist/server/proxy/index.js.map +1 -1
  164. package/dist/server/rate-limit/index.d.ts +3 -3
  165. package/dist/server/rate-limit/index.js +3 -3
  166. package/dist/server/rate-limit/index.js.map +1 -1
  167. package/dist/server/static/index.d.ts +3 -3
  168. package/dist/server/static/index.js +6 -6
  169. package/dist/server/static/index.js.map +1 -1
  170. package/dist/server/swagger/index.d.ts +3 -3
  171. package/dist/server/swagger/index.js +6 -6
  172. package/dist/server/swagger/index.js.map +1 -1
  173. package/dist/sms/index.d.ts +3 -3
  174. package/dist/sms/index.js +6 -6
  175. package/dist/sms/index.js.map +1 -1
  176. package/dist/system/index.d.ts +3 -3
  177. package/dist/system/index.js +3 -3
  178. package/dist/system/index.js.map +1 -1
  179. package/dist/thread/index.d.ts +3 -3
  180. package/dist/thread/index.js +3 -3
  181. package/dist/thread/index.js.map +1 -1
  182. package/dist/topic/core/index.d.ts +3 -3
  183. package/dist/topic/core/index.js +3 -3
  184. package/dist/topic/core/index.js.map +1 -1
  185. package/dist/vite/index.d.ts +6286 -4
  186. package/dist/vite/index.d.ts.map +1 -1
  187. package/dist/vite/index.js +28 -2
  188. package/dist/vite/index.js.map +1 -1
  189. package/dist/websocket/index.d.ts +37 -37
  190. package/dist/websocket/index.d.ts.map +1 -1
  191. package/dist/websocket/index.js +3 -3
  192. package/dist/websocket/index.js.map +1 -1
  193. package/package.json +12 -4
  194. package/src/api/audits/controllers/AdminAuditController.ts +8 -0
  195. package/src/api/audits/index.ts +3 -3
  196. package/src/api/files/controllers/AdminFileStatsController.ts +1 -0
  197. package/src/api/files/index.ts +3 -3
  198. package/src/api/jobs/controllers/AdminJobController.ts +18 -2
  199. package/src/api/jobs/index.ts +4 -3
  200. package/src/api/jobs/services/JobAudits.spec.ts +89 -0
  201. package/src/api/jobs/services/JobAudits.ts +101 -0
  202. package/src/api/keys/index.ts +3 -3
  203. package/src/api/notifications/controllers/AdminNotificationController.ts +1 -0
  204. package/src/api/notifications/index.ts +3 -3
  205. package/src/api/parameters/controllers/AdminConfigController.ts +10 -0
  206. package/src/api/parameters/index.ts +5 -3
  207. package/src/api/users/__tests__/ApiKeys-integration.spec.ts +1 -1
  208. package/src/api/users/__tests__/ApiKeys.spec.ts +1 -1
  209. package/src/api/users/__tests__/EmailVerification.spec.ts +16 -1
  210. package/src/api/users/__tests__/PasswordReset.spec.ts +11 -0
  211. package/src/api/users/atoms/realmAuthSettingsAtom.ts +10 -0
  212. package/src/api/users/controllers/AdminIdentityController.ts +3 -0
  213. package/src/api/users/controllers/AdminSessionController.ts +3 -0
  214. package/src/api/users/controllers/AdminUserController.ts +5 -0
  215. package/src/api/users/index.ts +8 -9
  216. package/src/api/users/primitives/$realm.ts +117 -19
  217. package/src/api/users/providers/RealmProvider.ts +15 -7
  218. package/src/api/users/services/CredentialService.spec.ts +11 -0
  219. package/src/api/users/services/CredentialService.ts +47 -24
  220. package/src/api/users/services/IdentityService.ts +12 -4
  221. package/src/api/users/services/RegistrationService.spec.ts +11 -0
  222. package/src/api/users/services/RegistrationService.ts +33 -12
  223. package/src/api/users/services/SessionService.ts +83 -12
  224. package/src/api/users/services/UserAudits.ts +47 -0
  225. package/src/api/users/services/UserFiles.ts +19 -0
  226. package/src/api/users/services/UserJobs.spec.ts +107 -0
  227. package/src/api/users/services/UserJobs.ts +62 -0
  228. package/src/api/users/services/UserParameters.ts +23 -0
  229. package/src/api/users/services/UserService.ts +34 -17
  230. package/src/api/verifications/index.ts +3 -3
  231. package/src/batch/index.ts +3 -3
  232. package/src/bucket/index.ts +3 -3
  233. package/src/cache/core/index.ts +3 -3
  234. package/src/cli/commands/build.ts +1 -0
  235. package/src/cli/commands/db.ts +9 -0
  236. package/src/cli/commands/init.spec.ts +2 -17
  237. package/src/cli/commands/init.ts +37 -1
  238. package/src/cli/providers/ViteDevServerProvider.ts +36 -2
  239. package/src/cli/services/AlephaCliUtils.ts +17 -0
  240. package/src/cli/services/PackageManagerUtils.ts +15 -1
  241. package/src/cli/services/ProjectScaffolder.ts +8 -13
  242. package/src/cli/templates/agentMd.ts +2 -25
  243. package/src/cli/templates/apiAppSecurityTs.ts +37 -2
  244. package/src/cli/templates/mainCss.ts +2 -32
  245. package/src/cli/templates/webAppRouterTs.ts +5 -5
  246. package/src/cli/templates/webHomeComponentTsx.ts +10 -0
  247. package/src/command/helpers/Runner.ts +14 -1
  248. package/src/command/index.ts +3 -3
  249. package/src/core/helpers/primitive.ts +0 -5
  250. package/src/core/index.ts +3 -3
  251. package/src/datetime/index.ts +3 -3
  252. package/src/email/index.ts +3 -3
  253. package/src/email/index.workerd.ts +36 -0
  254. package/src/email/providers/LocalEmailProvider.ts +2 -2
  255. package/src/email/providers/WorkermailerEmailProvider.ts +221 -0
  256. package/src/fake/index.ts +3 -3
  257. package/src/lock/core/index.ts +3 -3
  258. package/src/lock/core/primitives/$lock.ts +13 -1
  259. package/src/logger/index.ts +3 -3
  260. package/src/logger/providers/PrettyFormatterProvider.ts +7 -0
  261. package/src/mcp/index.ts +3 -3
  262. package/src/orm/index.ts +3 -3
  263. package/src/orm/providers/drivers/NodeSqliteProvider.ts +1 -1
  264. package/src/queue/core/index.ts +3 -3
  265. package/src/react/auth/index.ts +3 -3
  266. package/src/react/auth/services/ReactAuth.ts +3 -1
  267. package/src/react/core/index.ts +3 -3
  268. package/src/react/form/index.ts +3 -3
  269. package/src/react/head/index.ts +3 -3
  270. package/src/react/i18n/index.ts +3 -3
  271. package/src/react/intro/components/GettingStarted.css +334 -0
  272. package/src/react/intro/components/GettingStarted.tsx +276 -0
  273. package/src/react/intro/index.ts +1 -0
  274. package/src/react/router/atoms/ssrManifestAtom.ts +7 -0
  275. package/src/react/router/index.browser.ts +2 -0
  276. package/src/react/router/index.ts +2 -0
  277. package/src/react/router/providers/ReactServerProvider.ts +14 -4
  278. package/src/react/router/providers/SSRManifestProvider.ts +7 -0
  279. package/src/redis/index.ts +3 -3
  280. package/src/retry/index.ts +3 -3
  281. package/src/router/index.ts +3 -3
  282. package/src/scheduler/index.ts +3 -3
  283. package/src/scheduler/index.workerd.ts +43 -0
  284. package/src/scheduler/providers/CronProvider.ts +53 -6
  285. package/src/scheduler/providers/WorkerdCronProvider.ts +102 -0
  286. package/src/security/index.ts +3 -3
  287. package/src/security/providers/JwtProvider.ts +2 -2
  288. package/src/server/auth/index.ts +3 -3
  289. package/src/server/cache/index.ts +3 -3
  290. package/src/server/compress/index.ts +3 -3
  291. package/src/server/compress/providers/ServerCompressProvider.ts +6 -0
  292. package/src/server/cookies/index.ts +3 -3
  293. package/src/server/core/index.ts +3 -3
  294. package/src/server/core/primitives/$action.spec.ts +3 -2
  295. package/src/server/core/primitives/$action.ts +6 -2
  296. package/src/server/core/providers/NodeHttpServerProvider.ts +2 -15
  297. package/src/server/core/providers/ServerProvider.ts +4 -2
  298. package/src/server/core/providers/ServerRouterProvider.ts +5 -27
  299. package/src/server/cors/index.ts +3 -3
  300. package/src/server/health/index.ts +3 -3
  301. package/src/server/helmet/index.ts +3 -3
  302. package/src/server/links/index.ts +3 -3
  303. package/src/server/links/providers/ServerLinksProvider.spec.ts +332 -0
  304. package/src/server/links/providers/ServerLinksProvider.ts +1 -1
  305. package/src/server/metrics/index.ts +3 -3
  306. package/src/server/multipart/index.ts +3 -3
  307. package/src/server/proxy/index.ts +3 -3
  308. package/src/server/rate-limit/index.ts +3 -3
  309. package/src/server/static/index.ts +3 -3
  310. package/src/server/swagger/index.ts +3 -3
  311. package/src/sms/index.ts +3 -3
  312. package/src/system/index.ts +3 -3
  313. package/src/thread/index.ts +3 -3
  314. package/src/topic/core/index.ts +3 -3
  315. package/src/vite/tasks/generateCloudflare.ts +38 -2
  316. package/src/websocket/index.ts +3 -3
  317. package/src/cli/templates/webHelloComponentTsx.ts +0 -30
  318. /package/src/api/users/{notifications → services}/UserNotifications.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/api/jobs/schemas/jobExecutionQuerySchema.ts","../../../src/api/jobs/entities/jobExecutions.ts","../../../src/api/jobs/schemas/jobExecutionResourceSchema.ts","../../../src/api/jobs/schemas/triggerJobSchema.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/index.ts"],"sourcesContent":["import type { Static } from \"alepha\";\nimport { t } from \"alepha\";\nimport { pageQuerySchema } from \"alepha/orm\";\n\nexport const jobExecutionQuerySchema = t.extend(pageQuerySchema, {\n status: t.optional(t.enum([\"STARTED\", \"FAILED\", \"COMPLETED\"])),\n job: t.optional(\n t.text({\n description: \"Filter by job name\",\n }),\n ),\n});\n\nexport type JobExecutionQuery = Static<typeof jobExecutionQuerySchema>;\n","import { type Static, t } from \"alepha\";\nimport { logEntrySchema } from \"alepha/logger\";\nimport { $entity, db } from \"alepha/orm\";\n\nexport const jobExecutions = $entity({\n name: \"job_executions\",\n schema: t.object({\n id: db.primaryKey(t.uuid()),\n version: db.version(),\n createdAt: db.createdAt(),\n updatedAt: db.updatedAt(),\n finishedAt: t.optional(t.datetime()),\n job: t.string(),\n status: t.enum([\"STARTED\", \"FAILED\", \"COMPLETED\"]),\n error: t.optional(t.string()),\n logs: t.optional(t.array(logEntrySchema)),\n }),\n});\n\nexport type JobExecutionEntity = Static<typeof jobExecutions.schema>;\n","import { type Static, t } from \"alepha\";\nimport { jobExecutions } from \"../entities/jobExecutions.ts\";\n\nexport const jobExecutionResourceSchema = t.extend(\n jobExecutions.schema,\n {},\n {\n title: \"JobExecutionResource\",\n description:\n \"A job execution resource representing the execution details of a job.\",\n },\n);\n\nexport type JobExecutionResource = Static<typeof jobExecutionResourceSchema>;\n","import type { Static } from \"alepha\";\nimport { t } from \"alepha\";\n\nexport const triggerJobSchema = t.object({\n name: t.string(),\n});\n\nexport type TriggerJob = Static<typeof triggerJobSchema>;\n","import { $env, $inject, Alepha, type Async, type Static, t } from \"alepha\";\nimport { type DateTime, DateTimeProvider } from \"alepha/datetime\";\nimport { $lock, type LockPrimitive } from \"alepha/lock\";\nimport type { LogEntry } from \"alepha/logger\";\nimport { $repository } from \"alepha/orm\";\nimport { CronProvider } from \"alepha/scheduler\";\nimport { jobExecutions } from \"../entities/jobExecutions.ts\";\n\nconst envSchema = t.object({\n JOB_PREFIX: t.optional(\n t.text({\n description: \"Prefix for job lock keys\",\n }),\n ),\n});\n\ndeclare module \"alepha\" {\n interface Env extends Partial<Static<typeof envSchema>> {}\n}\n\n/**\n * Provider for job management and execution.\n * Handles job lifecycle, execution tracking, log capturing, and event emission.\n */\nexport class JobProvider {\n protected readonly alepha = $inject(Alepha);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n protected readonly cronProvider = $inject(CronProvider);\n protected readonly executionRepository = $repository(jobExecutions);\n protected readonly env = $env(envSchema);\n protected readonly logs = new Map<string, LogEntry[]>();\n protected readonly jobs = new Map<string, JobRegistration>();\n\n /**\n * Register and set up a job for execution (called during primitive initialization).\n */\n public registerJob(options: Job): JobRegistration {\n const jobName = options.name;\n\n // Set up log capturing for this job (only once)\n if (this.jobs.size === 0) {\n this.alepha.events.on(\"log\", ({ entry }) => {\n const context = entry.context;\n if (!context) {\n return;\n }\n\n const entries = this.logs.get(context);\n if (!entries) {\n return;\n }\n\n entries.push(entry);\n this.logs.set(context, entries);\n });\n }\n\n // Create lock primitive if locking is enabled\n const lockPrimitive =\n options.lock !== false\n ? $lock({\n name: () => {\n const prefix = this.env.JOB_PREFIX\n ? `${this.env.JOB_PREFIX}:`\n : \"\";\n return `${prefix}job:${jobName}`;\n },\n handler: async () => {\n await this.executeJob(jobName, options.handler);\n },\n })\n : null;\n\n const registration: JobRegistration = {\n name: jobName,\n options,\n lockPrimitive,\n };\n\n this.jobs.set(jobName, registration);\n\n // Set up cron scheduling if provided\n if (options.cron) {\n this.cronProvider.createCronJob(jobName, options.cron, () =>\n this.triggerJob(jobName),\n );\n }\n\n return registration;\n }\n\n /**\n * Trigger a job by name.\n */\n public async triggerJob(jobName: string): Promise<void> {\n const registration = this.jobs.get(jobName);\n if (!registration) {\n throw new Error(`Job not registered: ${jobName}`);\n }\n\n // Execute handler with or without lock\n if (registration.options.lock !== false && registration.lockPrimitive) {\n await registration.lockPrimitive.run();\n } else {\n await this.executeJob(jobName, registration.options.handler);\n }\n }\n\n /**\n * Execute a job handler (called by the job primitive).\n */\n public async executeJob(\n jobName: string,\n handler: (args: { now: DateTime }) => Async<void>,\n ): Promise<void> {\n if (!this.alepha.isStarted()) {\n return;\n }\n\n const context = this.alepha.context.createContextId();\n\n await this.alepha.context.run(\n async () => {\n try {\n const now = this.dateTimeProvider.now();\n\n // Initialize log collection for this context\n this.logs.set(context, []);\n\n // Create execution record\n await this.executionRepository.create({\n job: jobName,\n status: \"STARTED\",\n });\n\n await this.alepha.events.emit(\"scheduler:begin\", {\n name: jobName,\n now,\n context,\n });\n\n // Execute the handler\n await handler({ now });\n\n // Update execution as completed\n const logs = this.logs.get(context) || [];\n const exec = await this.executionRepository.findOne({\n where: {\n job: jobName,\n status: \"STARTED\",\n },\n });\n\n exec.status = \"COMPLETED\";\n exec.logs = logs;\n exec.finishedAt = this.dateTimeProvider.nowISOString();\n\n await this.executionRepository.save(exec);\n\n await this.alepha.events.emit(\n \"scheduler:success\",\n {\n name: jobName,\n context,\n },\n {\n catch: true,\n },\n );\n } catch (error) {\n // Update execution as failed\n const logs = this.logs.get(context) || [];\n const exec = await this.executionRepository.findOne({\n where: {\n job: jobName,\n status: \"STARTED\",\n },\n });\n\n exec.status = \"FAILED\";\n exec.error = (error as Error).message;\n exec.logs = logs;\n exec.finishedAt = this.dateTimeProvider.nowISOString();\n\n await this.executionRepository.save(exec);\n\n await this.alepha.events.emit(\n \"scheduler:error\",\n {\n name: jobName,\n error: error as Error,\n context,\n },\n {\n catch: true,\n },\n );\n\n // Don't re-throw, jobs should handle errors gracefully\n }\n\n // Clean up logs\n this.logs.delete(context);\n\n await this.alepha.events.emit(\n \"scheduler:end\",\n {\n name: jobName,\n context,\n },\n {\n catch: true,\n },\n );\n },\n {\n context,\n },\n );\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface Job {\n /**\n * Name of the job.\n */\n name: string;\n\n /**\n * Optional description of the job.\n */\n description?: string;\n\n /**\n * Function to run on schedule.\n */\n handler: (args: { now: DateTime }) => Async<void>;\n\n /**\n * Cron expression to run the job.\n */\n cron?: string;\n\n /**\n * If true, the job will be locked and only one instance will run at a time.\n * You probably need to import {@link AlephaLockRedis} for distributed locking.\n *\n * @default true\n */\n lock?: boolean;\n\n /**\n * Optional prefix for job lock keys.\n */\n lockPrefix?: string;\n}\n\nexport interface JobRegistration {\n name: string;\n options: Job;\n lockPrimitive: LockPrimitive<() => Promise<void>> | null;\n}\n","import { $inject, createPrimitive, KIND, Primitive } from \"alepha\";\nimport type { DateTime } from \"alepha/datetime\";\nimport { type Job, JobProvider } from \"../providers/JobProvider.ts\";\n\n/**\n * Job primitive - a drop-in replacement for $scheduler with built-in execution tracking.\n */\nexport const $job = (options: JobPrimitiveOptions): JobPrimitive => {\n return createPrimitive(JobPrimitive, options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport type JobPrimitiveOptions = Omit<Job, \"name\"> & {\n /**\n * Name of the job. Defaults to the primitive property name.\n */\n name?: string;\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class JobPrimitive extends Primitive<JobPrimitiveOptions> {\n protected readonly jobProvider = $inject(JobProvider);\n\n public get name(): string {\n return (\n this.options.name ??\n `${this.config.service.name}.${this.config.propertyKey}`\n );\n }\n\n protected onInit() {\n // Register job with JobProvider\n this.jobProvider.registerJob({\n ...this.options,\n name: this.name,\n });\n }\n\n public async trigger(): Promise<void> {\n await this.jobProvider.triggerJob(this.name);\n }\n}\n\n$job[KIND] = JobPrimitive;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface JobHandlerArguments {\n now: DateTime;\n}\n","import { $inject, Alepha } from \"alepha\";\nimport { $repository } from \"alepha/orm\";\nimport { jobExecutions } from \"../entities/jobExecutions.ts\";\nimport { $job } from \"../primitives/$job.ts\";\nimport type { JobExecutionQuery } from \"../schemas/jobExecutionQuerySchema.ts\";\n\nexport class JobService {\n protected readonly alepha = $inject(Alepha);\n protected readonly executionRepository = $repository(jobExecutions);\n\n public async getJobs(): Promise<string[]> {\n const jobPrimitives = this.alepha.primitives($job);\n return jobPrimitives.map((job) => job.name);\n }\n\n public async getJobExecutions(query: JobExecutionQuery = {}) {\n query.sort ??= \"-createdAt\";\n\n const where = this.executionRepository.createQueryWhere();\n\n if (query.job) {\n where.job = { eq: query.job };\n }\n\n if (query.status) {\n where.status = { eq: query.status };\n }\n\n return await this.executionRepository.paginate(\n query,\n { where },\n { count: true },\n );\n }\n\n public async triggerJob(name: string): 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 Error(`Job not found: ${name}`);\n }\n\n await job.trigger();\n return { ok: true };\n }\n}\n","import { $inject, t } from \"alepha\";\nimport { $action, okSchema } from \"alepha/server\";\nimport { jobExecutionQuerySchema } from \"../schemas/jobExecutionQuerySchema.ts\";\nimport { jobExecutionResourceSchema } from \"../schemas/jobExecutionResourceSchema.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 getJobs = $action({\n path: this.url,\n group: this.group,\n schema: {\n response: t.array(t.string()),\n },\n handler: () => this.jobService.getJobs(),\n });\n\n public readonly getJobExecutions = $action({\n path: `${this.url}/executions`,\n group: this.group,\n schema: {\n query: jobExecutionQuerySchema,\n response: t.page(jobExecutionResourceSchema),\n },\n handler: ({ query }) => this.jobService.getJobExecutions(query),\n });\n\n public readonly triggerJob = $action({\n method: \"POST\",\n path: `${this.url}/trigger`,\n group: this.group,\n schema: {\n body: triggerJobSchema,\n response: okSchema,\n },\n handler: ({ body }) => this.jobService.triggerJob(body.name),\n });\n}\n","import { $module } from \"alepha\";\nimport { AdminJobController } from \"./controllers/AdminJobController.ts\";\nimport { JobProvider } from \"./providers/JobProvider.ts\";\nimport { JobService } from \"./services/JobService.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./controllers/AdminJobController.ts\";\nexport * from \"./entities/jobExecutions.ts\";\nexport * from \"./primitives/$job.ts\";\nexport * from \"./providers/JobProvider.ts\";\nexport * from \"./schemas/jobExecutionQuerySchema.ts\";\nexport * from \"./schemas/jobExecutionResourceSchema.ts\";\nexport * from \"./schemas/triggerJobSchema.ts\";\nexport * from \"./services/JobService.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * | type | quality | stability |\n * |------|---------|-----------|\n * | backend | standard | stable |\n *\n * Job execution monitoring.\n *\n * **Features:**\n * - Job definitions for tracking\n * - Job status tracking\n * - Execution history\n * - Retry management\n *\n * @module alepha.api.jobs\n */\nexport const AlephaApiJobs = $module({\n name: \"alepha.api.jobs\",\n services: [AdminJobController, JobProvider, JobService],\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/api/jobs/schemas/jobExecutionQuerySchema.ts","../../../src/api/jobs/entities/jobExecutions.ts","../../../src/api/jobs/schemas/jobExecutionResourceSchema.ts","../../../src/api/jobs/schemas/triggerJobSchema.ts","../../../src/api/jobs/services/JobAudits.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/index.ts"],"sourcesContent":["import type { Static } from \"alepha\";\nimport { t } from \"alepha\";\nimport { pageQuerySchema } from \"alepha/orm\";\n\nexport const jobExecutionQuerySchema = t.extend(pageQuerySchema, {\n status: t.optional(t.enum([\"STARTED\", \"FAILED\", \"COMPLETED\"])),\n job: t.optional(\n t.text({\n description: \"Filter by job name\",\n }),\n ),\n});\n\nexport type JobExecutionQuery = Static<typeof jobExecutionQuerySchema>;\n","import { type Static, t } from \"alepha\";\nimport { logEntrySchema } from \"alepha/logger\";\nimport { $entity, db } from \"alepha/orm\";\n\nexport const jobExecutions = $entity({\n name: \"job_executions\",\n schema: t.object({\n id: db.primaryKey(t.uuid()),\n version: db.version(),\n createdAt: db.createdAt(),\n updatedAt: db.updatedAt(),\n finishedAt: t.optional(t.datetime()),\n job: t.string(),\n status: t.enum([\"STARTED\", \"FAILED\", \"COMPLETED\"]),\n error: t.optional(t.string()),\n logs: t.optional(t.array(logEntrySchema)),\n }),\n});\n\nexport type JobExecutionEntity = Static<typeof jobExecutions.schema>;\n","import { type Static, t } from \"alepha\";\nimport { jobExecutions } from \"../entities/jobExecutions.ts\";\n\nexport const jobExecutionResourceSchema = t.extend(\n jobExecutions.schema,\n {},\n {\n title: \"JobExecutionResource\",\n description:\n \"A job execution resource representing the execution details of a job.\",\n },\n);\n\nexport type JobExecutionResource = Static<typeof jobExecutionResourceSchema>;\n","import type { Static } from \"alepha\";\nimport { t } from \"alepha\";\n\nexport const triggerJobSchema = t.object({\n name: t.string(),\n});\n\nexport type TriggerJob = Static<typeof triggerJobSchema>;\n","import { $audit, type AuditLogOptions } from \"alepha/api/audits\";\n\n/**\n * Job-specific audit service.\n *\n * Provides type-safe audit logging for job-related events.\n * This service is lazy-loaded when the audits feature is enabled.\n *\n * @example\n * ```ts\n * const jobAudits = alepha.inject(JobAudits);\n * await jobAudits.logTrigger(\"my-job\", { description: \"Manually triggered\" });\n * ```\n */\nexport class JobAudits {\n protected readonly audit = $audit({\n type: \"job\",\n description: \"Background job execution events\",\n actions: [\"trigger\", \"pause\", \"resume\", \"cancel\", \"schedule_change\"],\n });\n\n /**\n * Log a manual job trigger event.\n */\n public async logTrigger(\n jobName: string,\n options: Omit<AuditLogOptions, \"resourceType\" | \"resourceId\"> = {},\n ) {\n await this.audit.log(\"trigger\", {\n ...options,\n resourceType: \"job\",\n resourceId: jobName,\n description: options.description ?? `Manually triggered job: ${jobName}`,\n });\n }\n\n /**\n * Log a job pause event.\n */\n public async logPause(\n jobName: string,\n options: Omit<AuditLogOptions, \"resourceType\" | \"resourceId\"> = {},\n ) {\n await this.audit.log(\"pause\", {\n ...options,\n resourceType: \"job\",\n resourceId: jobName,\n description: options.description ?? `Paused job: ${jobName}`,\n });\n }\n\n /**\n * Log a job resume event.\n */\n public async logResume(\n jobName: string,\n options: Omit<AuditLogOptions, \"resourceType\" | \"resourceId\"> = {},\n ) {\n await this.audit.log(\"resume\", {\n ...options,\n resourceType: \"job\",\n resourceId: jobName,\n description: options.description ?? `Resumed job: ${jobName}`,\n });\n }\n\n /**\n * Log a job cancellation event.\n */\n public async logCancel(\n jobName: string,\n options: Omit<AuditLogOptions, \"resourceType\" | \"resourceId\"> = {},\n ) {\n await this.audit.log(\"cancel\", {\n ...options,\n resourceType: \"job\",\n resourceId: jobName,\n description: options.description ?? `Cancelled job: ${jobName}`,\n });\n }\n\n /**\n * Log a job schedule change event.\n */\n public async logScheduleChange(\n jobName: string,\n options: Omit<AuditLogOptions, \"resourceType\" | \"resourceId\"> & {\n oldCron?: string;\n newCron?: string;\n } = {},\n ) {\n const { oldCron, newCron, ...rest } = options;\n await this.audit.log(\"schedule_change\", {\n ...rest,\n resourceType: \"job\",\n resourceId: jobName,\n description: rest.description ?? `Changed schedule for job: ${jobName}`,\n metadata: { oldCron, newCron, ...rest.metadata },\n });\n }\n}\n","import { $env, $inject, Alepha, type Async, type Static, t } from \"alepha\";\nimport { type DateTime, DateTimeProvider } from \"alepha/datetime\";\nimport { $lock, type LockPrimitive } from \"alepha/lock\";\nimport type { LogEntry } from \"alepha/logger\";\nimport { $repository } from \"alepha/orm\";\nimport { CronProvider } from \"alepha/scheduler\";\nimport { jobExecutions } from \"../entities/jobExecutions.ts\";\n\nconst envSchema = t.object({\n JOB_PREFIX: t.optional(\n t.text({\n description: \"Prefix for job lock keys\",\n }),\n ),\n});\n\ndeclare module \"alepha\" {\n interface Env extends Partial<Static<typeof envSchema>> {}\n}\n\n/**\n * Provider for job management and execution.\n * Handles job lifecycle, execution tracking, log capturing, and event emission.\n */\nexport class JobProvider {\n protected readonly alepha = $inject(Alepha);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n protected readonly cronProvider = $inject(CronProvider);\n protected readonly executionRepository = $repository(jobExecutions);\n protected readonly env = $env(envSchema);\n protected readonly logs = new Map<string, LogEntry[]>();\n protected readonly jobs = new Map<string, JobRegistration>();\n\n /**\n * Register and set up a job for execution (called during primitive initialization).\n */\n public registerJob(options: Job): JobRegistration {\n const jobName = options.name;\n\n // Set up log capturing for this job (only once)\n if (this.jobs.size === 0) {\n this.alepha.events.on(\"log\", ({ entry }) => {\n const context = entry.context;\n if (!context) {\n return;\n }\n\n const entries = this.logs.get(context);\n if (!entries) {\n return;\n }\n\n entries.push(entry);\n this.logs.set(context, entries);\n });\n }\n\n // Create lock primitive if locking is enabled\n const lockPrimitive =\n options.lock !== false\n ? $lock({\n name: () => {\n const prefix = this.env.JOB_PREFIX\n ? `${this.env.JOB_PREFIX}:`\n : \"\";\n return `${prefix}job:${jobName}`;\n },\n handler: async () => {\n await this.executeJob(jobName, options.handler);\n },\n })\n : null;\n\n const registration: JobRegistration = {\n name: jobName,\n options,\n lockPrimitive,\n };\n\n this.jobs.set(jobName, registration);\n\n // Set up cron scheduling if provided\n if (options.cron) {\n this.cronProvider.createCronJob(jobName, options.cron, () =>\n this.triggerJob(jobName),\n );\n }\n\n return registration;\n }\n\n /**\n * Trigger a job by name.\n */\n public async triggerJob(jobName: string): Promise<void> {\n const registration = this.jobs.get(jobName);\n if (!registration) {\n throw new Error(`Job not registered: ${jobName}`);\n }\n\n // Execute handler with or without lock\n if (registration.options.lock !== false && registration.lockPrimitive) {\n await registration.lockPrimitive.run();\n } else {\n await this.executeJob(jobName, registration.options.handler);\n }\n }\n\n /**\n * Execute a job handler (called by the job primitive).\n */\n public async executeJob(\n jobName: string,\n handler: (args: { now: DateTime }) => Async<void>,\n ): Promise<void> {\n if (!this.alepha.isStarted()) {\n return;\n }\n\n const context = this.alepha.context.createContextId();\n\n await this.alepha.context.run(\n async () => {\n try {\n const now = this.dateTimeProvider.now();\n\n // Initialize log collection for this context\n this.logs.set(context, []);\n\n // Create execution record\n await this.executionRepository.create({\n job: jobName,\n status: \"STARTED\",\n });\n\n await this.alepha.events.emit(\"scheduler:begin\", {\n name: jobName,\n now,\n context,\n });\n\n // Execute the handler\n await handler({ now });\n\n // Update execution as completed\n const logs = this.logs.get(context) || [];\n const exec = await this.executionRepository.findOne({\n where: {\n job: jobName,\n status: \"STARTED\",\n },\n });\n\n exec.status = \"COMPLETED\";\n exec.logs = logs;\n exec.finishedAt = this.dateTimeProvider.nowISOString();\n\n await this.executionRepository.save(exec);\n\n await this.alepha.events.emit(\n \"scheduler:success\",\n {\n name: jobName,\n context,\n },\n {\n catch: true,\n },\n );\n } catch (error) {\n // Update execution as failed\n const logs = this.logs.get(context) || [];\n const exec = await this.executionRepository.findOne({\n where: {\n job: jobName,\n status: \"STARTED\",\n },\n });\n\n exec.status = \"FAILED\";\n exec.error = (error as Error).message;\n exec.logs = logs;\n exec.finishedAt = this.dateTimeProvider.nowISOString();\n\n await this.executionRepository.save(exec);\n\n await this.alepha.events.emit(\n \"scheduler:error\",\n {\n name: jobName,\n error: error as Error,\n context,\n },\n {\n catch: true,\n },\n );\n\n // Don't re-throw, jobs should handle errors gracefully\n }\n\n // Clean up logs\n this.logs.delete(context);\n\n await this.alepha.events.emit(\n \"scheduler:end\",\n {\n name: jobName,\n context,\n },\n {\n catch: true,\n },\n );\n },\n {\n context,\n },\n );\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface Job {\n /**\n * Name of the job.\n */\n name: string;\n\n /**\n * Optional description of the job.\n */\n description?: string;\n\n /**\n * Function to run on schedule.\n */\n handler: (args: { now: DateTime }) => Async<void>;\n\n /**\n * Cron expression to run the job.\n */\n cron?: string;\n\n /**\n * If true, the job will be locked and only one instance will run at a time.\n * You probably need to import {@link AlephaLockRedis} for distributed locking.\n *\n * @default true\n */\n lock?: boolean;\n\n /**\n * Optional prefix for job lock keys.\n */\n lockPrefix?: string;\n}\n\nexport interface JobRegistration {\n name: string;\n options: Job;\n lockPrimitive: LockPrimitive<() => Promise<void>> | null;\n}\n","import { $inject, createPrimitive, KIND, Primitive } from \"alepha\";\nimport type { DateTime } from \"alepha/datetime\";\nimport { type Job, JobProvider } from \"../providers/JobProvider.ts\";\n\n/**\n * Job primitive - a drop-in replacement for $scheduler with built-in execution tracking.\n */\nexport const $job = (options: JobPrimitiveOptions): JobPrimitive => {\n return createPrimitive(JobPrimitive, options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport type JobPrimitiveOptions = Omit<Job, \"name\"> & {\n /**\n * Name of the job. Defaults to the primitive property name.\n */\n name?: string;\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class JobPrimitive extends Primitive<JobPrimitiveOptions> {\n protected readonly jobProvider = $inject(JobProvider);\n\n public get name(): string {\n return (\n this.options.name ??\n `${this.config.service.name}.${this.config.propertyKey}`\n );\n }\n\n protected onInit() {\n // Register job with JobProvider\n this.jobProvider.registerJob({\n ...this.options,\n name: this.name,\n });\n }\n\n public async trigger(): Promise<void> {\n await this.jobProvider.triggerJob(this.name);\n }\n}\n\n$job[KIND] = JobPrimitive;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface JobHandlerArguments {\n now: DateTime;\n}\n","import { $inject, Alepha } from \"alepha\";\nimport { $repository } from \"alepha/orm\";\nimport { jobExecutions } from \"../entities/jobExecutions.ts\";\nimport { $job } from \"../primitives/$job.ts\";\nimport type { JobExecutionQuery } from \"../schemas/jobExecutionQuerySchema.ts\";\n\nexport class JobService {\n protected readonly alepha = $inject(Alepha);\n protected readonly executionRepository = $repository(jobExecutions);\n\n public async getJobs(): Promise<string[]> {\n const jobPrimitives = this.alepha.primitives($job);\n return jobPrimitives.map((job) => job.name);\n }\n\n public async getJobExecutions(query: JobExecutionQuery = {}) {\n query.sort ??= \"-createdAt\";\n\n const where = this.executionRepository.createQueryWhere();\n\n if (query.job) {\n where.job = { eq: query.job };\n }\n\n if (query.status) {\n where.status = { eq: query.status };\n }\n\n return await this.executionRepository.paginate(\n query,\n { where },\n { count: true },\n );\n }\n\n public async triggerJob(name: string): 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 Error(`Job not found: ${name}`);\n }\n\n await job.trigger();\n return { ok: true };\n }\n}\n","import { $inject, Alepha, t } from \"alepha\";\nimport { AlephaApiAudits } from \"alepha/api/audits\";\nimport { $action, okSchema } from \"alepha/server\";\nimport { jobExecutionQuerySchema } from \"../schemas/jobExecutionQuerySchema.ts\";\nimport { jobExecutionResourceSchema } from \"../schemas/jobExecutionResourceSchema.ts\";\nimport { triggerJobSchema } from \"../schemas/triggerJobSchema.ts\";\nimport { JobAudits } from \"../services/JobAudits.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 alepha = $inject(Alepha);\n protected readonly jobService = $inject(JobService);\n\n public readonly getJobs = $action({\n path: this.url,\n group: this.group,\n secure: true,\n schema: {\n response: t.array(t.string()),\n },\n handler: () => this.jobService.getJobs(),\n });\n\n public readonly getJobExecutions = $action({\n path: `${this.url}/executions`,\n group: this.group,\n secure: true,\n schema: {\n query: jobExecutionQuerySchema,\n response: t.page(jobExecutionResourceSchema),\n },\n handler: ({ query }) => this.jobService.getJobExecutions(query),\n });\n\n public readonly triggerJob = $action({\n method: \"POST\",\n path: `${this.url}/trigger`,\n group: this.group,\n secure: true,\n schema: {\n body: triggerJobSchema,\n response: okSchema,\n },\n handler: async ({ body }) => {\n const result = await this.jobService.triggerJob(body.name);\n\n // Audit the manual trigger if audits are enabled\n if (this.alepha.has(AlephaApiAudits)) {\n const jobAudits = this.alepha.inject(JobAudits);\n await jobAudits.logTrigger(body.name);\n }\n\n return result;\n },\n });\n}\n","import { $module } from \"alepha\";\nimport { AdminJobController } from \"./controllers/AdminJobController.ts\";\nimport { JobProvider } from \"./providers/JobProvider.ts\";\nimport { JobService } from \"./services/JobService.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./controllers/AdminJobController.ts\";\nexport * from \"./entities/jobExecutions.ts\";\nexport * from \"./primitives/$job.ts\";\nexport * from \"./providers/JobProvider.ts\";\nexport * from \"./schemas/jobExecutionQuerySchema.ts\";\nexport * from \"./schemas/jobExecutionResourceSchema.ts\";\nexport * from \"./schemas/triggerJobSchema.ts\";\nexport * from \"./services/JobAudits.ts\";\nexport * from \"./services/JobService.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * | Stability | Since | Runtime |\n * |-----------|-------|---------|\n * | 3 - stable | 0.8.0 | node, bun|\n *\n * Job execution monitoring.\n *\n * **Features:**\n * - Job definitions for tracking\n * - Job status tracking\n * - Execution history\n * - Retry management\n *\n * @module alepha.api.jobs\n */\nexport const AlephaApiJobs = $module({\n name: \"alepha.api.jobs\",\n services: [AdminJobController, JobProvider, JobService],\n});\n"],"mappings":"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"}
@@ -1,29 +1,29 @@
1
- import * as alepha99 from "alepha";
1
+ import * as alepha166 from "alepha";
2
2
  import { Alepha, Static } from "alepha";
3
3
  import * as alepha_server0 from "alepha/server";
4
- import * as alepha_orm0 from "alepha/orm";
4
+ import * as alepha_orm50 from "alepha/orm";
5
5
  import * as alepha_cache0 from "alepha/cache";
6
6
  import { DateTimeProvider } from "alepha/datetime";
7
7
  import * as alepha_logger0 from "alepha/logger";
8
8
  import { IssuerResolver, UserInfo } from "alepha/security";
9
9
 
10
10
  //#region ../../src/api/keys/entities/apiKeyEntity.d.ts
11
- declare const apiKeyEntity: alepha_orm0.EntityPrimitive<alepha99.TObject<{
12
- id: alepha_orm0.PgAttr<alepha_orm0.PgAttr<alepha99.TString, typeof alepha_orm0.PG_PRIMARY_KEY>, typeof alepha_orm0.PG_DEFAULT>;
13
- createdAt: alepha_orm0.PgAttr<alepha_orm0.PgAttr<alepha99.TString, typeof alepha_orm0.PG_CREATED_AT>, typeof alepha_orm0.PG_DEFAULT>;
14
- updatedAt: alepha_orm0.PgAttr<alepha_orm0.PgAttr<alepha99.TString, typeof alepha_orm0.PG_UPDATED_AT>, typeof alepha_orm0.PG_DEFAULT>;
15
- userId: alepha99.TString;
16
- name: alepha99.TString;
17
- description: alepha99.TOptional<alepha99.TString>;
18
- tokenHash: alepha99.TString;
19
- tokenPrefix: alepha99.TString;
20
- tokenSuffix: alepha99.TString;
21
- roles: alepha_orm0.PgAttr<alepha99.TArray<alepha99.TString>, typeof alepha_orm0.PG_DEFAULT>;
22
- lastUsedAt: alepha99.TOptional<alepha99.TString>;
23
- lastUsedIp: alepha99.TOptional<alepha99.TString>;
24
- usageCount: alepha_orm0.PgAttr<alepha99.TInteger, typeof alepha_orm0.PG_DEFAULT>;
25
- expiresAt: alepha99.TOptional<alepha99.TString>;
26
- revokedAt: alepha99.TOptional<alepha99.TString>;
11
+ declare const apiKeyEntity: alepha_orm50.EntityPrimitive<alepha166.TObject<{
12
+ id: alepha_orm50.PgAttr<alepha_orm50.PgAttr<alepha166.TString, typeof alepha_orm50.PG_PRIMARY_KEY>, typeof alepha_orm50.PG_DEFAULT>;
13
+ createdAt: alepha_orm50.PgAttr<alepha_orm50.PgAttr<alepha166.TString, typeof alepha_orm50.PG_CREATED_AT>, typeof alepha_orm50.PG_DEFAULT>;
14
+ updatedAt: alepha_orm50.PgAttr<alepha_orm50.PgAttr<alepha166.TString, typeof alepha_orm50.PG_UPDATED_AT>, typeof alepha_orm50.PG_DEFAULT>;
15
+ userId: alepha166.TString;
16
+ name: alepha166.TString;
17
+ description: alepha166.TOptional<alepha166.TString>;
18
+ tokenHash: alepha166.TString;
19
+ tokenPrefix: alepha166.TString;
20
+ tokenSuffix: alepha166.TString;
21
+ roles: alepha_orm50.PgAttr<alepha166.TArray<alepha166.TString>, typeof alepha_orm50.PG_DEFAULT>;
22
+ lastUsedAt: alepha166.TOptional<alepha166.TString>;
23
+ lastUsedIp: alepha166.TOptional<alepha166.TString>;
24
+ usageCount: alepha_orm50.PgAttr<alepha166.TInteger, typeof alepha_orm50.PG_DEFAULT>;
25
+ expiresAt: alepha166.TOptional<alepha166.TString>;
26
+ revokedAt: alepha166.TOptional<alepha166.TString>;
27
27
  }>>;
28
28
  type ApiKeyEntity = Static<typeof apiKeyEntity.schema>;
29
29
  //#endregion
@@ -32,22 +32,22 @@ declare class ApiKeyService {
32
32
  protected readonly alepha: Alepha;
33
33
  protected readonly dateTimeProvider: DateTimeProvider;
34
34
  protected readonly log: alepha_logger0.Logger;
35
- protected readonly repo: alepha_orm0.Repository<alepha99.TObject<{
36
- id: alepha_orm0.PgAttr<alepha_orm0.PgAttr<alepha99.TString, typeof alepha_orm0.PG_PRIMARY_KEY>, typeof alepha_orm0.PG_DEFAULT>;
37
- createdAt: alepha_orm0.PgAttr<alepha_orm0.PgAttr<alepha99.TString, typeof alepha_orm0.PG_CREATED_AT>, typeof alepha_orm0.PG_DEFAULT>;
38
- updatedAt: alepha_orm0.PgAttr<alepha_orm0.PgAttr<alepha99.TString, typeof alepha_orm0.PG_UPDATED_AT>, typeof alepha_orm0.PG_DEFAULT>;
39
- userId: alepha99.TString;
40
- name: alepha99.TString;
41
- description: alepha99.TOptional<alepha99.TString>;
42
- tokenHash: alepha99.TString;
43
- tokenPrefix: alepha99.TString;
44
- tokenSuffix: alepha99.TString;
45
- roles: alepha_orm0.PgAttr<alepha99.TArray<alepha99.TString>, typeof alepha_orm0.PG_DEFAULT>;
46
- lastUsedAt: alepha99.TOptional<alepha99.TString>;
47
- lastUsedIp: alepha99.TOptional<alepha99.TString>;
48
- usageCount: alepha_orm0.PgAttr<alepha99.TInteger, typeof alepha_orm0.PG_DEFAULT>;
49
- expiresAt: alepha99.TOptional<alepha99.TString>;
50
- revokedAt: alepha99.TOptional<alepha99.TString>;
35
+ protected readonly repo: alepha_orm50.Repository<alepha166.TObject<{
36
+ id: alepha_orm50.PgAttr<alepha_orm50.PgAttr<alepha166.TString, typeof alepha_orm50.PG_PRIMARY_KEY>, typeof alepha_orm50.PG_DEFAULT>;
37
+ createdAt: alepha_orm50.PgAttr<alepha_orm50.PgAttr<alepha166.TString, typeof alepha_orm50.PG_CREATED_AT>, typeof alepha_orm50.PG_DEFAULT>;
38
+ updatedAt: alepha_orm50.PgAttr<alepha_orm50.PgAttr<alepha166.TString, typeof alepha_orm50.PG_UPDATED_AT>, typeof alepha_orm50.PG_DEFAULT>;
39
+ userId: alepha166.TString;
40
+ name: alepha166.TString;
41
+ description: alepha166.TOptional<alepha166.TString>;
42
+ tokenHash: alepha166.TString;
43
+ tokenPrefix: alepha166.TString;
44
+ tokenSuffix: alepha166.TString;
45
+ roles: alepha_orm50.PgAttr<alepha166.TArray<alepha166.TString>, typeof alepha_orm50.PG_DEFAULT>;
46
+ lastUsedAt: alepha166.TOptional<alepha166.TString>;
47
+ lastUsedIp: alepha166.TOptional<alepha166.TString>;
48
+ usageCount: alepha_orm50.PgAttr<alepha166.TInteger, typeof alepha_orm50.PG_DEFAULT>;
49
+ expiresAt: alepha166.TOptional<alepha166.TString>;
50
+ revokedAt: alepha166.TOptional<alepha166.TString>;
51
51
  }>>;
52
52
  /**
53
53
  * Cache validated API keys for 15 minutes.
@@ -58,16 +58,16 @@ declare class ApiKeyService {
58
58
  lastUsedIp?: string | undefined;
59
59
  expiresAt?: string | undefined;
60
60
  revokedAt?: string | undefined;
61
- userId: string;
62
61
  id: string;
62
+ createdAt: string;
63
+ updatedAt: string;
64
+ userId: string;
63
65
  name: string;
66
+ tokenHash: string;
64
67
  tokenPrefix: string;
65
68
  tokenSuffix: string;
66
69
  roles: string[];
67
- createdAt: string;
68
70
  usageCount: number;
69
- updatedAt: string;
70
- tokenHash: string;
71
71
  } | null, [string]>;
72
72
  /**
73
73
  * Create an issuer resolver for API key authentication.
@@ -108,38 +108,38 @@ declare class ApiKeyService {
108
108
  page?: number;
109
109
  size?: number;
110
110
  sort?: string;
111
- }): Promise<alepha99.Page<alepha_orm0.PgStatic<alepha99.TObject<{
112
- id: alepha_orm0.PgAttr<alepha_orm0.PgAttr<alepha99.TString, typeof alepha_orm0.PG_PRIMARY_KEY>, typeof alepha_orm0.PG_DEFAULT>;
113
- createdAt: alepha_orm0.PgAttr<alepha_orm0.PgAttr<alepha99.TString, typeof alepha_orm0.PG_CREATED_AT>, typeof alepha_orm0.PG_DEFAULT>;
114
- updatedAt: alepha_orm0.PgAttr<alepha_orm0.PgAttr<alepha99.TString, typeof alepha_orm0.PG_UPDATED_AT>, typeof alepha_orm0.PG_DEFAULT>;
115
- userId: alepha99.TString;
116
- name: alepha99.TString;
117
- description: alepha99.TOptional<alepha99.TString>;
118
- tokenHash: alepha99.TString;
119
- tokenPrefix: alepha99.TString;
120
- tokenSuffix: alepha99.TString;
121
- roles: alepha_orm0.PgAttr<alepha99.TArray<alepha99.TString>, typeof alepha_orm0.PG_DEFAULT>;
122
- lastUsedAt: alepha99.TOptional<alepha99.TString>;
123
- lastUsedIp: alepha99.TOptional<alepha99.TString>;
124
- usageCount: alepha_orm0.PgAttr<alepha99.TInteger, typeof alepha_orm0.PG_DEFAULT>;
125
- expiresAt: alepha99.TOptional<alepha99.TString>;
126
- revokedAt: alepha99.TOptional<alepha99.TString>;
127
- }>, alepha_orm0.PgRelationMap<alepha99.TObject<{
128
- id: alepha_orm0.PgAttr<alepha_orm0.PgAttr<alepha99.TString, typeof alepha_orm0.PG_PRIMARY_KEY>, typeof alepha_orm0.PG_DEFAULT>;
129
- createdAt: alepha_orm0.PgAttr<alepha_orm0.PgAttr<alepha99.TString, typeof alepha_orm0.PG_CREATED_AT>, typeof alepha_orm0.PG_DEFAULT>;
130
- updatedAt: alepha_orm0.PgAttr<alepha_orm0.PgAttr<alepha99.TString, typeof alepha_orm0.PG_UPDATED_AT>, typeof alepha_orm0.PG_DEFAULT>;
131
- userId: alepha99.TString;
132
- name: alepha99.TString;
133
- description: alepha99.TOptional<alepha99.TString>;
134
- tokenHash: alepha99.TString;
135
- tokenPrefix: alepha99.TString;
136
- tokenSuffix: alepha99.TString;
137
- roles: alepha_orm0.PgAttr<alepha99.TArray<alepha99.TString>, typeof alepha_orm0.PG_DEFAULT>;
138
- lastUsedAt: alepha99.TOptional<alepha99.TString>;
139
- lastUsedIp: alepha99.TOptional<alepha99.TString>;
140
- usageCount: alepha_orm0.PgAttr<alepha99.TInteger, typeof alepha_orm0.PG_DEFAULT>;
141
- expiresAt: alepha99.TOptional<alepha99.TString>;
142
- revokedAt: alepha99.TOptional<alepha99.TString>;
111
+ }): Promise<alepha166.Page<alepha_orm50.PgStatic<alepha166.TObject<{
112
+ id: alepha_orm50.PgAttr<alepha_orm50.PgAttr<alepha166.TString, typeof alepha_orm50.PG_PRIMARY_KEY>, typeof alepha_orm50.PG_DEFAULT>;
113
+ createdAt: alepha_orm50.PgAttr<alepha_orm50.PgAttr<alepha166.TString, typeof alepha_orm50.PG_CREATED_AT>, typeof alepha_orm50.PG_DEFAULT>;
114
+ updatedAt: alepha_orm50.PgAttr<alepha_orm50.PgAttr<alepha166.TString, typeof alepha_orm50.PG_UPDATED_AT>, typeof alepha_orm50.PG_DEFAULT>;
115
+ userId: alepha166.TString;
116
+ name: alepha166.TString;
117
+ description: alepha166.TOptional<alepha166.TString>;
118
+ tokenHash: alepha166.TString;
119
+ tokenPrefix: alepha166.TString;
120
+ tokenSuffix: alepha166.TString;
121
+ roles: alepha_orm50.PgAttr<alepha166.TArray<alepha166.TString>, typeof alepha_orm50.PG_DEFAULT>;
122
+ lastUsedAt: alepha166.TOptional<alepha166.TString>;
123
+ lastUsedIp: alepha166.TOptional<alepha166.TString>;
124
+ usageCount: alepha_orm50.PgAttr<alepha166.TInteger, typeof alepha_orm50.PG_DEFAULT>;
125
+ expiresAt: alepha166.TOptional<alepha166.TString>;
126
+ revokedAt: alepha166.TOptional<alepha166.TString>;
127
+ }>, alepha_orm50.PgRelationMap<alepha166.TObject<{
128
+ id: alepha_orm50.PgAttr<alepha_orm50.PgAttr<alepha166.TString, typeof alepha_orm50.PG_PRIMARY_KEY>, typeof alepha_orm50.PG_DEFAULT>;
129
+ createdAt: alepha_orm50.PgAttr<alepha_orm50.PgAttr<alepha166.TString, typeof alepha_orm50.PG_CREATED_AT>, typeof alepha_orm50.PG_DEFAULT>;
130
+ updatedAt: alepha_orm50.PgAttr<alepha_orm50.PgAttr<alepha166.TString, typeof alepha_orm50.PG_UPDATED_AT>, typeof alepha_orm50.PG_DEFAULT>;
131
+ userId: alepha166.TString;
132
+ name: alepha166.TString;
133
+ description: alepha166.TOptional<alepha166.TString>;
134
+ tokenHash: alepha166.TString;
135
+ tokenPrefix: alepha166.TString;
136
+ tokenSuffix: alepha166.TString;
137
+ roles: alepha_orm50.PgAttr<alepha166.TArray<alepha166.TString>, typeof alepha_orm50.PG_DEFAULT>;
138
+ lastUsedAt: alepha166.TOptional<alepha166.TString>;
139
+ lastUsedIp: alepha166.TOptional<alepha166.TString>;
140
+ usageCount: alepha_orm50.PgAttr<alepha166.TInteger, typeof alepha_orm50.PG_DEFAULT>;
141
+ expiresAt: alepha166.TOptional<alepha166.TString>;
142
+ revokedAt: alepha166.TOptional<alepha166.TString>;
143
143
  }>>>>>;
144
144
  /**
145
145
  * Get an API key by ID (admin only).
@@ -180,63 +180,63 @@ declare class AdminApiKeyController {
180
180
  * Find all API keys with optional filtering.
181
181
  */
182
182
  readonly findApiKeys: alepha_server0.ActionPrimitiveFn<{
183
- query: alepha99.TObject<{
184
- page: alepha99.TOptional<alepha99.TInteger>;
185
- size: alepha99.TOptional<alepha99.TInteger>;
186
- sort: alepha99.TOptional<alepha99.TString>;
187
- userId: alepha99.TOptional<alepha99.TString>;
188
- includeRevoked: alepha99.TOptional<alepha99.TBoolean>;
183
+ query: alepha166.TObject<{
184
+ page: alepha166.TOptional<alepha166.TInteger>;
185
+ size: alepha166.TOptional<alepha166.TInteger>;
186
+ sort: alepha166.TOptional<alepha166.TString>;
187
+ userId: alepha166.TOptional<alepha166.TString>;
188
+ includeRevoked: alepha166.TOptional<alepha166.TBoolean>;
189
189
  }>;
190
- response: alepha99.TPage<alepha99.TObject<{
191
- id: alepha99.TString;
192
- userId: alepha99.TString;
193
- name: alepha99.TString;
194
- description: alepha99.TOptional<alepha99.TString>;
195
- tokenPrefix: alepha99.TString;
196
- tokenSuffix: alepha99.TString;
197
- roles: alepha99.TArray<alepha99.TString>;
198
- createdAt: alepha99.TString;
199
- lastUsedAt: alepha99.TOptional<alepha99.TString>;
200
- lastUsedIp: alepha99.TOptional<alepha99.TString>;
201
- expiresAt: alepha99.TOptional<alepha99.TString>;
202
- revokedAt: alepha99.TOptional<alepha99.TString>;
203
- usageCount: alepha99.TInteger;
190
+ response: alepha166.TPage<alepha166.TObject<{
191
+ id: alepha166.TString;
192
+ userId: alepha166.TString;
193
+ name: alepha166.TString;
194
+ description: alepha166.TOptional<alepha166.TString>;
195
+ tokenPrefix: alepha166.TString;
196
+ tokenSuffix: alepha166.TString;
197
+ roles: alepha166.TArray<alepha166.TString>;
198
+ createdAt: alepha166.TString;
199
+ lastUsedAt: alepha166.TOptional<alepha166.TString>;
200
+ lastUsedIp: alepha166.TOptional<alepha166.TString>;
201
+ expiresAt: alepha166.TOptional<alepha166.TString>;
202
+ revokedAt: alepha166.TOptional<alepha166.TString>;
203
+ usageCount: alepha166.TInteger;
204
204
  }>>;
205
205
  }>;
206
206
  /**
207
207
  * Get an API key by ID.
208
208
  */
209
209
  readonly getApiKey: alepha_server0.ActionPrimitiveFn<{
210
- params: alepha99.TObject<{
211
- id: alepha99.TString;
210
+ params: alepha166.TObject<{
211
+ id: alepha166.TString;
212
212
  }>;
213
- response: alepha99.TObject<{
214
- id: alepha99.TString;
215
- userId: alepha99.TString;
216
- name: alepha99.TString;
217
- description: alepha99.TOptional<alepha99.TString>;
218
- tokenPrefix: alepha99.TString;
219
- tokenSuffix: alepha99.TString;
220
- roles: alepha99.TArray<alepha99.TString>;
221
- createdAt: alepha99.TString;
222
- lastUsedAt: alepha99.TOptional<alepha99.TString>;
223
- lastUsedIp: alepha99.TOptional<alepha99.TString>;
224
- expiresAt: alepha99.TOptional<alepha99.TString>;
225
- revokedAt: alepha99.TOptional<alepha99.TString>;
226
- usageCount: alepha99.TInteger;
213
+ response: alepha166.TObject<{
214
+ id: alepha166.TString;
215
+ userId: alepha166.TString;
216
+ name: alepha166.TString;
217
+ description: alepha166.TOptional<alepha166.TString>;
218
+ tokenPrefix: alepha166.TString;
219
+ tokenSuffix: alepha166.TString;
220
+ roles: alepha166.TArray<alepha166.TString>;
221
+ createdAt: alepha166.TString;
222
+ lastUsedAt: alepha166.TOptional<alepha166.TString>;
223
+ lastUsedIp: alepha166.TOptional<alepha166.TString>;
224
+ expiresAt: alepha166.TOptional<alepha166.TString>;
225
+ revokedAt: alepha166.TOptional<alepha166.TString>;
226
+ usageCount: alepha166.TInteger;
227
227
  }>;
228
228
  }>;
229
229
  /**
230
230
  * Revoke any API key.
231
231
  */
232
232
  readonly revokeApiKey: alepha_server0.ActionPrimitiveFn<{
233
- params: alepha99.TObject<{
234
- id: alepha99.TString;
233
+ params: alepha166.TObject<{
234
+ id: alepha166.TString;
235
235
  }>;
236
- response: alepha99.TObject<{
237
- ok: alepha99.TBoolean;
238
- id: alepha99.TOptional<alepha99.TUnion<[alepha99.TString, alepha99.TInteger]>>;
239
- count: alepha99.TOptional<alepha99.TNumber>;
236
+ response: alepha166.TObject<{
237
+ ok: alepha166.TBoolean;
238
+ id: alepha166.TOptional<alepha166.TUnion<[alepha166.TString, alepha166.TInteger]>>;
239
+ count: alepha166.TOptional<alepha166.TNumber>;
240
240
  }>;
241
241
  }>;
242
242
  }
@@ -255,19 +255,19 @@ declare class ApiKeyController {
255
255
  * The token is only returned once upon creation.
256
256
  */
257
257
  readonly createApiKey: alepha_server0.ActionPrimitiveFn<{
258
- body: alepha99.TObject<{
259
- name: alepha99.TString;
260
- description: alepha99.TOptional<alepha99.TString>;
261
- expiresAt: alepha99.TOptional<alepha99.TString>;
258
+ body: alepha166.TObject<{
259
+ name: alepha166.TString;
260
+ description: alepha166.TOptional<alepha166.TString>;
261
+ expiresAt: alepha166.TOptional<alepha166.TString>;
262
262
  }>;
263
- response: alepha99.TObject<{
264
- id: alepha99.TString;
265
- name: alepha99.TString;
266
- token: alepha99.TString;
267
- tokenSuffix: alepha99.TString;
268
- roles: alepha99.TArray<alepha99.TString>;
269
- createdAt: alepha99.TString;
270
- expiresAt: alepha99.TOptional<alepha99.TString>;
263
+ response: alepha166.TObject<{
264
+ id: alepha166.TString;
265
+ name: alepha166.TString;
266
+ token: alepha166.TString;
267
+ tokenSuffix: alepha166.TString;
268
+ roles: alepha166.TArray<alepha166.TString>;
269
+ createdAt: alepha166.TString;
270
+ expiresAt: alepha166.TOptional<alepha166.TString>;
271
271
  }>;
272
272
  }>;
273
273
  /**
@@ -275,114 +275,114 @@ declare class ApiKeyController {
275
275
  * Does not return the actual tokens.
276
276
  */
277
277
  readonly listApiKeys: alepha_server0.ActionPrimitiveFn<{
278
- response: alepha99.TArray<alepha99.TObject<{
279
- id: alepha99.TString;
280
- name: alepha99.TString;
281
- tokenPrefix: alepha99.TString;
282
- tokenSuffix: alepha99.TString;
283
- roles: alepha99.TArray<alepha99.TString>;
284
- createdAt: alepha99.TString;
285
- lastUsedAt: alepha99.TOptional<alepha99.TString>;
286
- expiresAt: alepha99.TOptional<alepha99.TString>;
287
- usageCount: alepha99.TInteger;
278
+ response: alepha166.TArray<alepha166.TObject<{
279
+ id: alepha166.TString;
280
+ name: alepha166.TString;
281
+ tokenPrefix: alepha166.TString;
282
+ tokenSuffix: alepha166.TString;
283
+ roles: alepha166.TArray<alepha166.TString>;
284
+ createdAt: alepha166.TString;
285
+ lastUsedAt: alepha166.TOptional<alepha166.TString>;
286
+ expiresAt: alepha166.TOptional<alepha166.TString>;
287
+ usageCount: alepha166.TInteger;
288
288
  }>>;
289
289
  }>;
290
290
  /**
291
291
  * Revoke an API key. Only the owner can revoke their own keys.
292
292
  */
293
293
  readonly revokeApiKey: alepha_server0.ActionPrimitiveFn<{
294
- params: alepha99.TObject<{
295
- id: alepha99.TString;
294
+ params: alepha166.TObject<{
295
+ id: alepha166.TString;
296
296
  }>;
297
- response: alepha99.TObject<{
298
- ok: alepha99.TBoolean;
297
+ response: alepha166.TObject<{
298
+ ok: alepha166.TBoolean;
299
299
  }>;
300
300
  }>;
301
301
  }
302
302
  //#endregion
303
303
  //#region ../../src/api/keys/schemas/adminApiKeyQuerySchema.d.ts
304
- declare const adminApiKeyQuerySchema: alepha99.TObject<{
305
- page: alepha99.TOptional<alepha99.TInteger>;
306
- size: alepha99.TOptional<alepha99.TInteger>;
307
- sort: alepha99.TOptional<alepha99.TString>;
308
- userId: alepha99.TOptional<alepha99.TString>;
309
- includeRevoked: alepha99.TOptional<alepha99.TBoolean>;
304
+ declare const adminApiKeyQuerySchema: alepha166.TObject<{
305
+ page: alepha166.TOptional<alepha166.TInteger>;
306
+ size: alepha166.TOptional<alepha166.TInteger>;
307
+ sort: alepha166.TOptional<alepha166.TString>;
308
+ userId: alepha166.TOptional<alepha166.TString>;
309
+ includeRevoked: alepha166.TOptional<alepha166.TBoolean>;
310
310
  }>;
311
311
  //#endregion
312
312
  //#region ../../src/api/keys/schemas/adminApiKeyResourceSchema.d.ts
313
- declare const adminApiKeyResourceSchema: alepha99.TObject<{
314
- id: alepha99.TString;
315
- userId: alepha99.TString;
316
- name: alepha99.TString;
317
- description: alepha99.TOptional<alepha99.TString>;
318
- tokenPrefix: alepha99.TString;
319
- tokenSuffix: alepha99.TString;
320
- roles: alepha99.TArray<alepha99.TString>;
321
- createdAt: alepha99.TString;
322
- lastUsedAt: alepha99.TOptional<alepha99.TString>;
323
- lastUsedIp: alepha99.TOptional<alepha99.TString>;
324
- expiresAt: alepha99.TOptional<alepha99.TString>;
325
- revokedAt: alepha99.TOptional<alepha99.TString>;
326
- usageCount: alepha99.TInteger;
313
+ declare const adminApiKeyResourceSchema: alepha166.TObject<{
314
+ id: alepha166.TString;
315
+ userId: alepha166.TString;
316
+ name: alepha166.TString;
317
+ description: alepha166.TOptional<alepha166.TString>;
318
+ tokenPrefix: alepha166.TString;
319
+ tokenSuffix: alepha166.TString;
320
+ roles: alepha166.TArray<alepha166.TString>;
321
+ createdAt: alepha166.TString;
322
+ lastUsedAt: alepha166.TOptional<alepha166.TString>;
323
+ lastUsedIp: alepha166.TOptional<alepha166.TString>;
324
+ expiresAt: alepha166.TOptional<alepha166.TString>;
325
+ revokedAt: alepha166.TOptional<alepha166.TString>;
326
+ usageCount: alepha166.TInteger;
327
327
  }>;
328
328
  //#endregion
329
329
  //#region ../../src/api/keys/schemas/createApiKeyBodySchema.d.ts
330
- declare const createApiKeyBodySchema: alepha99.TObject<{
331
- name: alepha99.TString;
332
- description: alepha99.TOptional<alepha99.TString>;
333
- expiresAt: alepha99.TOptional<alepha99.TString>;
330
+ declare const createApiKeyBodySchema: alepha166.TObject<{
331
+ name: alepha166.TString;
332
+ description: alepha166.TOptional<alepha166.TString>;
333
+ expiresAt: alepha166.TOptional<alepha166.TString>;
334
334
  }>;
335
335
  //#endregion
336
336
  //#region ../../src/api/keys/schemas/createApiKeyResponseSchema.d.ts
337
- declare const createApiKeyResponseSchema: alepha99.TObject<{
338
- id: alepha99.TString;
339
- name: alepha99.TString;
340
- token: alepha99.TString;
341
- tokenSuffix: alepha99.TString;
342
- roles: alepha99.TArray<alepha99.TString>;
343
- createdAt: alepha99.TString;
344
- expiresAt: alepha99.TOptional<alepha99.TString>;
337
+ declare const createApiKeyResponseSchema: alepha166.TObject<{
338
+ id: alepha166.TString;
339
+ name: alepha166.TString;
340
+ token: alepha166.TString;
341
+ tokenSuffix: alepha166.TString;
342
+ roles: alepha166.TArray<alepha166.TString>;
343
+ createdAt: alepha166.TString;
344
+ expiresAt: alepha166.TOptional<alepha166.TString>;
345
345
  }>;
346
346
  //#endregion
347
347
  //#region ../../src/api/keys/schemas/listApiKeyResponseSchema.d.ts
348
- declare const listApiKeyItemSchema: alepha99.TObject<{
349
- id: alepha99.TString;
350
- name: alepha99.TString;
351
- tokenPrefix: alepha99.TString;
352
- tokenSuffix: alepha99.TString;
353
- roles: alepha99.TArray<alepha99.TString>;
354
- createdAt: alepha99.TString;
355
- lastUsedAt: alepha99.TOptional<alepha99.TString>;
356
- expiresAt: alepha99.TOptional<alepha99.TString>;
357
- usageCount: alepha99.TInteger;
348
+ declare const listApiKeyItemSchema: alepha166.TObject<{
349
+ id: alepha166.TString;
350
+ name: alepha166.TString;
351
+ tokenPrefix: alepha166.TString;
352
+ tokenSuffix: alepha166.TString;
353
+ roles: alepha166.TArray<alepha166.TString>;
354
+ createdAt: alepha166.TString;
355
+ lastUsedAt: alepha166.TOptional<alepha166.TString>;
356
+ expiresAt: alepha166.TOptional<alepha166.TString>;
357
+ usageCount: alepha166.TInteger;
358
358
  }>;
359
- declare const listApiKeyResponseSchema: alepha99.TArray<alepha99.TObject<{
360
- id: alepha99.TString;
361
- name: alepha99.TString;
362
- tokenPrefix: alepha99.TString;
363
- tokenSuffix: alepha99.TString;
364
- roles: alepha99.TArray<alepha99.TString>;
365
- createdAt: alepha99.TString;
366
- lastUsedAt: alepha99.TOptional<alepha99.TString>;
367
- expiresAt: alepha99.TOptional<alepha99.TString>;
368
- usageCount: alepha99.TInteger;
359
+ declare const listApiKeyResponseSchema: alepha166.TArray<alepha166.TObject<{
360
+ id: alepha166.TString;
361
+ name: alepha166.TString;
362
+ tokenPrefix: alepha166.TString;
363
+ tokenSuffix: alepha166.TString;
364
+ roles: alepha166.TArray<alepha166.TString>;
365
+ createdAt: alepha166.TString;
366
+ lastUsedAt: alepha166.TOptional<alepha166.TString>;
367
+ expiresAt: alepha166.TOptional<alepha166.TString>;
368
+ usageCount: alepha166.TInteger;
369
369
  }>>;
370
370
  //#endregion
371
371
  //#region ../../src/api/keys/schemas/revokeApiKeyParamsSchema.d.ts
372
- declare const revokeApiKeyParamsSchema: alepha99.TObject<{
373
- id: alepha99.TString;
372
+ declare const revokeApiKeyParamsSchema: alepha166.TObject<{
373
+ id: alepha166.TString;
374
374
  }>;
375
375
  //#endregion
376
376
  //#region ../../src/api/keys/schemas/revokeApiKeyResponseSchema.d.ts
377
- declare const revokeApiKeyResponseSchema: alepha99.TObject<{
378
- ok: alepha99.TBoolean;
377
+ declare const revokeApiKeyResponseSchema: alepha166.TObject<{
378
+ ok: alepha166.TBoolean;
379
379
  }>;
380
380
  //#endregion
381
381
  //#region ../../src/api/keys/index.d.ts
382
382
  /**
383
- * | type | quality | stability |
384
- * |------|---------|--------------|
385
- * | backend | good | experimental |
383
+ * | Stability | Since | Runtime |
384
+ * |-----------|-------|---------|
385
+ * | 3 - stable | 0.11.0 | node, bun, workerd|
386
386
  *
387
387
  * API key management module for programmatic access.
388
388
  *
@@ -407,7 +407,7 @@ declare const revokeApiKeyResponseSchema: alepha99.TObject<{
407
407
  *
408
408
  * @module alepha.api.keys
409
409
  */
410
- declare const AlephaApiKeys: alepha99.Service<alepha99.Module>;
410
+ declare const AlephaApiKeys: alepha166.Service<alepha166.Module>;
411
411
  //#endregion
412
412
  export { AdminApiKeyController, AlephaApiKeys, ApiKeyController, ApiKeyEntity, ApiKeyService, adminApiKeyQuerySchema, adminApiKeyResourceSchema, apiKeyEntity, createApiKeyBodySchema, createApiKeyResponseSchema, listApiKeyItemSchema, listApiKeyResponseSchema, revokeApiKeyParamsSchema, revokeApiKeyResponseSchema };
413
413
  //# sourceMappingURL=index.d.ts.map