alepha 0.20.5 → 0.20.7

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 (367) hide show
  1. package/AGENTS.md +0 -1
  2. package/CLAUDE.md +0 -1
  3. package/assets/agents-template.md +0 -1
  4. package/dist/api/audits/index.browser.js +1 -0
  5. package/dist/api/audits/index.browser.js.map +1 -1
  6. package/dist/api/audits/index.d.ts +701 -654
  7. package/dist/api/audits/index.d.ts.map +1 -1
  8. package/dist/api/audits/index.js +24 -1
  9. package/dist/api/audits/index.js.map +1 -1
  10. package/dist/api/files/index.browser.js +1 -0
  11. package/dist/api/files/index.browser.js.map +1 -1
  12. package/dist/api/files/index.d.ts +193 -166
  13. package/dist/api/files/index.d.ts.map +1 -1
  14. package/dist/api/files/index.js +52 -0
  15. package/dist/api/files/index.js.map +1 -1
  16. package/dist/api/jobs/index.browser.js +40 -14
  17. package/dist/api/jobs/index.browser.js.map +1 -1
  18. package/dist/api/jobs/index.d.ts +639 -333
  19. package/dist/api/jobs/index.d.ts.map +1 -1
  20. package/dist/api/jobs/index.js +495 -162
  21. package/dist/api/jobs/index.js.map +1 -1
  22. package/dist/api/keys/index.d.ts +222 -188
  23. package/dist/api/keys/index.d.ts.map +1 -1
  24. package/dist/api/keys/index.js +54 -0
  25. package/dist/api/keys/index.js.map +1 -1
  26. package/dist/api/notifications/index.d.ts +265 -236
  27. package/dist/api/notifications/index.d.ts.map +1 -1
  28. package/dist/api/notifications/index.js +55 -13
  29. package/dist/api/notifications/index.js.map +1 -1
  30. package/dist/api/organizations/index.d.ts +100 -97
  31. package/dist/api/organizations/index.d.ts.map +1 -1
  32. package/dist/api/organizations/index.js.map +1 -1
  33. package/dist/api/parameters/index.d.ts +332 -314
  34. package/dist/api/parameters/index.d.ts.map +1 -1
  35. package/dist/api/parameters/index.js +37 -0
  36. package/dist/api/parameters/index.js.map +1 -1
  37. package/dist/api/payments/index.d.ts +431 -376
  38. package/dist/api/payments/index.d.ts.map +1 -1
  39. package/dist/api/payments/index.js +202 -87
  40. package/dist/api/payments/index.js.map +1 -1
  41. package/dist/api/subscriptions/index.d.ts +1695 -0
  42. package/dist/api/subscriptions/index.d.ts.map +1 -0
  43. package/dist/api/subscriptions/index.js +1919 -0
  44. package/dist/api/subscriptions/index.js.map +1 -0
  45. package/dist/api/users/index.d.ts +1001 -844
  46. package/dist/api/users/index.d.ts.map +1 -1
  47. package/dist/api/users/index.js +237 -28
  48. package/dist/api/users/index.js.map +1 -1
  49. package/dist/api/verifications/index.d.ts +123 -122
  50. package/dist/api/verifications/index.d.ts.map +1 -1
  51. package/dist/api/verifications/index.js.map +1 -1
  52. package/dist/batch/index.js.map +1 -1
  53. package/dist/bucket/index.d.ts +21 -2
  54. package/dist/bucket/index.d.ts.map +1 -1
  55. package/dist/bucket/index.js +47 -0
  56. package/dist/bucket/index.js.map +1 -1
  57. package/dist/bucket/index.workerd.js +24 -0
  58. package/dist/bucket/index.workerd.js.map +1 -1
  59. package/dist/cache/core/index.d.ts +134 -7
  60. package/dist/cache/core/index.d.ts.map +1 -1
  61. package/dist/cache/core/index.js +181 -15
  62. package/dist/cache/core/index.js.map +1 -1
  63. package/dist/cache/core/index.workerd.js +181 -15
  64. package/dist/cache/core/index.workerd.js.map +1 -1
  65. package/dist/cache/database/index.d.ts +156 -0
  66. package/dist/cache/database/index.d.ts.map +1 -0
  67. package/dist/cache/database/index.js +266 -0
  68. package/dist/cache/database/index.js.map +1 -0
  69. package/dist/cache/redis/index.d.ts +3 -2
  70. package/dist/cache/redis/index.d.ts.map +1 -1
  71. package/dist/cache/redis/index.js.map +1 -1
  72. package/dist/captcha/index.js.map +1 -1
  73. package/dist/cli/config/index.js.map +1 -1
  74. package/dist/cli/core/index.d.ts +142 -128
  75. package/dist/cli/core/index.d.ts.map +1 -1
  76. package/dist/cli/core/index.js +160 -13
  77. package/dist/cli/core/index.js.map +1 -1
  78. package/dist/cli/devtools/index.d.ts +3 -2
  79. package/dist/cli/devtools/index.d.ts.map +1 -1
  80. package/dist/cli/devtools/index.js.map +1 -1
  81. package/dist/cli/platform/index.d.ts +346 -290
  82. package/dist/cli/platform/index.d.ts.map +1 -1
  83. package/dist/cli/platform/index.js +106 -7
  84. package/dist/cli/platform/index.js.map +1 -1
  85. package/dist/cli/vendor/index.d.ts +12 -11
  86. package/dist/cli/vendor/index.d.ts.map +1 -1
  87. package/dist/cli/vendor/index.js.map +1 -1
  88. package/dist/command/index.d.ts +6 -5
  89. package/dist/command/index.d.ts.map +1 -1
  90. package/dist/command/index.js.map +1 -1
  91. package/dist/core/index.browser.js +1 -1
  92. package/dist/core/index.browser.js.map +1 -1
  93. package/dist/core/index.d.ts +119 -118
  94. package/dist/core/index.d.ts.map +1 -1
  95. package/dist/core/index.js +1 -1
  96. package/dist/core/index.js.map +1 -1
  97. package/dist/core/index.native.js +1 -1
  98. package/dist/core/index.native.js.map +1 -1
  99. package/dist/core/index.workerd.js +1 -1
  100. package/dist/core/index.workerd.js.map +1 -1
  101. package/dist/crypto/index.browser.js.map +1 -1
  102. package/dist/crypto/index.d.ts +3 -2
  103. package/dist/crypto/index.d.ts.map +1 -1
  104. package/dist/crypto/index.js.map +1 -1
  105. package/dist/datetime/index.js.map +1 -1
  106. package/dist/email/brevo/index.js.map +1 -1
  107. package/dist/email/core/index.d.ts +3 -2
  108. package/dist/email/core/index.d.ts.map +1 -1
  109. package/dist/email/core/index.js.map +1 -1
  110. package/dist/email/core/index.workerd.js.map +1 -1
  111. package/dist/email/smtp/index.d.ts +7 -6
  112. package/dist/email/smtp/index.d.ts.map +1 -1
  113. package/dist/email/smtp/index.js.map +1 -1
  114. package/dist/fake/index.js.map +1 -1
  115. package/dist/lock/core/index.d.ts +5 -4
  116. package/dist/lock/core/index.d.ts.map +1 -1
  117. package/dist/lock/core/index.js.map +1 -1
  118. package/dist/lock/redis/index.js.map +1 -1
  119. package/dist/logger/index.d.ts +10 -9
  120. package/dist/logger/index.d.ts.map +1 -1
  121. package/dist/logger/index.js.map +1 -1
  122. package/dist/mcp/index.d.ts +9 -8
  123. package/dist/mcp/index.d.ts.map +1 -1
  124. package/dist/mcp/index.js +1 -1
  125. package/dist/mcp/index.js.map +1 -1
  126. package/dist/orm/core/index.browser.js +9 -3
  127. package/dist/orm/core/index.browser.js.map +1 -1
  128. package/dist/orm/core/index.bun.js +31 -10
  129. package/dist/orm/core/index.bun.js.map +1 -1
  130. package/dist/orm/core/index.d.ts +33 -14
  131. package/dist/orm/core/index.d.ts.map +1 -1
  132. package/dist/orm/core/index.js +31 -10
  133. package/dist/orm/core/index.js.map +1 -1
  134. package/dist/orm/postgres/index.bun.js.map +1 -1
  135. package/dist/orm/postgres/index.d.ts +6 -5
  136. package/dist/orm/postgres/index.d.ts.map +1 -1
  137. package/dist/orm/postgres/index.js.map +1 -1
  138. package/dist/queue/core/index.d.ts +5 -4
  139. package/dist/queue/core/index.d.ts.map +1 -1
  140. package/dist/queue/core/index.js.map +1 -1
  141. package/dist/queue/core/index.workerd.js.map +1 -1
  142. package/dist/queue/redis/index.d.ts +3 -2
  143. package/dist/queue/redis/index.d.ts.map +1 -1
  144. package/dist/queue/redis/index.js.map +1 -1
  145. package/dist/react/auth/index.browser.js.map +1 -1
  146. package/dist/react/auth/index.js.map +1 -1
  147. package/dist/react/core/index.js.map +1 -1
  148. package/dist/react/form/index.d.ts +5 -0
  149. package/dist/react/form/index.d.ts.map +1 -1
  150. package/dist/react/form/index.js +8 -4
  151. package/dist/react/form/index.js.map +1 -1
  152. package/dist/react/head/index.browser.js.map +1 -1
  153. package/dist/react/head/index.js.map +1 -1
  154. package/dist/react/i18n/index.d.ts +2 -1
  155. package/dist/react/i18n/index.d.ts.map +1 -1
  156. package/dist/react/i18n/index.js.map +1 -1
  157. package/dist/react/intro/index.js.map +1 -1
  158. package/dist/react/router/index.browser.js.map +1 -1
  159. package/dist/react/router/index.d.ts +206 -205
  160. package/dist/react/router/index.d.ts.map +1 -1
  161. package/dist/react/router/index.js.map +1 -1
  162. package/dist/react/testing/index.js.map +1 -1
  163. package/dist/react/ui/index.d.ts +11 -11
  164. package/dist/react/ui/index.d.ts.map +1 -1
  165. package/dist/react/ui/index.js.map +1 -1
  166. package/dist/redis/index.bun.js.map +1 -1
  167. package/dist/redis/index.js.map +1 -1
  168. package/dist/retry/index.js.map +1 -1
  169. package/dist/router/index.js.map +1 -1
  170. package/dist/scheduler/index.d.ts +25 -2
  171. package/dist/scheduler/index.d.ts.map +1 -1
  172. package/dist/scheduler/index.js +12 -0
  173. package/dist/scheduler/index.js.map +1 -1
  174. package/dist/scheduler/index.workerd.js +12 -0
  175. package/dist/scheduler/index.workerd.js.map +1 -1
  176. package/dist/security/index.browser.js +29 -1
  177. package/dist/security/index.browser.js.map +1 -1
  178. package/dist/security/index.d.ts +82 -35
  179. package/dist/security/index.d.ts.map +1 -1
  180. package/dist/security/index.js +56 -3
  181. package/dist/security/index.js.map +1 -1
  182. package/dist/server/auth/index.d.ts +163 -158
  183. package/dist/server/auth/index.d.ts.map +1 -1
  184. package/dist/server/auth/index.js +16 -4
  185. package/dist/server/auth/index.js.map +1 -1
  186. package/dist/server/cookies/index.browser.js.map +1 -1
  187. package/dist/server/cookies/index.js.map +1 -1
  188. package/dist/server/core/index.browser.js.map +1 -1
  189. package/dist/server/core/index.d.ts +35 -34
  190. package/dist/server/core/index.d.ts.map +1 -1
  191. package/dist/server/core/index.js.map +1 -1
  192. package/dist/server/cors/index.d.ts +7 -6
  193. package/dist/server/cors/index.d.ts.map +1 -1
  194. package/dist/server/cors/index.js.map +1 -1
  195. package/dist/server/etag/index.js.map +1 -1
  196. package/dist/server/health/index.d.ts +16 -15
  197. package/dist/server/health/index.d.ts.map +1 -1
  198. package/dist/server/health/index.js.map +1 -1
  199. package/dist/server/links/index.browser.js.map +1 -1
  200. package/dist/server/links/index.d.ts +51 -50
  201. package/dist/server/links/index.d.ts.map +1 -1
  202. package/dist/server/links/index.js.map +1 -1
  203. package/dist/server/metrics/index.js.map +1 -1
  204. package/dist/server/proxy/index.js.map +1 -1
  205. package/dist/server/rate-limit/index.d.ts +6 -5
  206. package/dist/server/rate-limit/index.d.ts.map +1 -1
  207. package/dist/server/rate-limit/index.js.map +1 -1
  208. package/dist/server/static/index.js.map +1 -1
  209. package/dist/server/swagger/index.d.ts +2 -1
  210. package/dist/server/swagger/index.d.ts.map +1 -1
  211. package/dist/server/swagger/index.js.map +1 -1
  212. package/dist/sms/index.js.map +1 -1
  213. package/dist/system/index.browser.js.map +1 -1
  214. package/dist/system/index.js.map +1 -1
  215. package/dist/system/index.workerd.js.map +1 -1
  216. package/dist/topic/core/index.js.map +1 -1
  217. package/dist/topic/redis/index.d.ts +3 -2
  218. package/dist/topic/redis/index.d.ts.map +1 -1
  219. package/dist/topic/redis/index.js.map +1 -1
  220. package/package.json +33 -39
  221. package/src/api/audits/controllers/AdminAuditController.ts +29 -0
  222. package/src/api/audits/entities/audits.ts +1 -0
  223. package/src/api/files/controllers/FileController.ts +24 -0
  224. package/src/api/files/entities/files.ts +1 -0
  225. package/src/api/files/services/FileService.ts +41 -0
  226. package/src/api/jobs/__tests__/$job.spec.ts +501 -24
  227. package/src/api/jobs/entities/jobExecutionEntity.ts +4 -3
  228. package/src/api/jobs/index.ts +47 -10
  229. package/src/api/jobs/primitives/$job.ts +22 -9
  230. package/src/api/jobs/providers/DirectJobDispatcher.ts +71 -0
  231. package/src/api/jobs/providers/JobDispatcher.ts +49 -0
  232. package/src/api/jobs/providers/JobProvider.ts +385 -147
  233. package/src/api/jobs/providers/JobQueueProvider.ts +43 -18
  234. package/src/api/jobs/schemas/jobConfigAtom.ts +9 -3
  235. package/src/api/jobs/schemas/jobExecutionResourceSchema.ts +11 -0
  236. package/src/api/jobs/schemas/jobRegistrationSchema.ts +4 -2
  237. package/src/api/jobs/services/JobService.ts +21 -11
  238. package/src/api/keys/controllers/AdminApiKeyController.ts +23 -0
  239. package/src/api/keys/entities/apiKeyEntity.ts +1 -0
  240. package/src/api/keys/services/ApiKeyService.ts +42 -0
  241. package/src/api/notifications/__tests__/AlephaApiNotifications.spec.ts +63 -0
  242. package/src/api/notifications/controllers/AdminNotificationController.ts +48 -1
  243. package/src/api/notifications/index.ts +13 -3
  244. package/src/api/notifications/jobs/NotificationJobs.ts +0 -6
  245. package/src/api/parameters/controllers/AdminParameterController.ts +26 -0
  246. package/src/api/parameters/services/ParameterProvider.ts +18 -0
  247. package/src/api/payments/controllers/MockCheckoutController.ts +146 -0
  248. package/src/api/payments/index.ts +3 -0
  249. package/src/api/payments/providers/MemoryPaymentProvider.ts +9 -4
  250. package/src/api/payments/providers/PaymentProvider.ts +25 -9
  251. package/src/api/payments/services/PaymentService.ts +3 -0
  252. package/src/api/subscriptions/__tests__/BillingService.spec.ts +218 -0
  253. package/src/api/subscriptions/__tests__/SubscriptionService.spec.ts +278 -0
  254. package/src/api/subscriptions/controllers/AdminSubscriptionController.ts +212 -0
  255. package/src/api/subscriptions/controllers/SubscriptionController.ts +189 -0
  256. package/src/api/subscriptions/entities/subscriptionEvents.ts +54 -0
  257. package/src/api/subscriptions/entities/subscriptions.ts +68 -0
  258. package/src/api/subscriptions/index.ts +133 -0
  259. package/src/api/subscriptions/jobs/SubscriptionJobs.ts +382 -0
  260. package/src/api/subscriptions/middleware/$requireLimit.ts +50 -0
  261. package/src/api/subscriptions/middleware/$requirePlan.ts +49 -0
  262. package/src/api/subscriptions/notifications/SubscriptionNotifications.ts +110 -0
  263. package/src/api/subscriptions/schemas/cancelSubscriptionSchema.ts +8 -0
  264. package/src/api/subscriptions/schemas/changePlanSchema.ts +9 -0
  265. package/src/api/subscriptions/schemas/createSubscriptionSchema.ts +11 -0
  266. package/src/api/subscriptions/schemas/entitlementsSchema.ts +21 -0
  267. package/src/api/subscriptions/schemas/mrrSchema.ts +13 -0
  268. package/src/api/subscriptions/schemas/planDefinitionSchema.ts +71 -0
  269. package/src/api/subscriptions/schemas/planResourceSchema.ts +25 -0
  270. package/src/api/subscriptions/schemas/subscriptionEventResourceSchema.ts +8 -0
  271. package/src/api/subscriptions/schemas/subscriptionQuerySchema.ts +19 -0
  272. package/src/api/subscriptions/schemas/subscriptionResourceSchema.ts +6 -0
  273. package/src/api/subscriptions/schemas/subscriptionSettingsSchema.ts +32 -0
  274. package/src/api/subscriptions/schemas/subscriptionStatsSchema.ts +23 -0
  275. package/src/api/subscriptions/services/BillingService.ts +437 -0
  276. package/src/api/subscriptions/services/SubscriptionConfig.ts +56 -0
  277. package/src/api/subscriptions/services/SubscriptionService.ts +867 -0
  278. package/src/api/subscriptions/services/UsageService.ts +118 -0
  279. package/src/api/users/__tests__/Registration-emailMode.spec.ts +203 -0
  280. package/src/api/users/__tests__/UsernameSlugger.spec.ts +138 -0
  281. package/src/api/users/atoms/realmAuthSettingsAtom.ts +41 -3
  282. package/src/api/users/controllers/AdminSessionController.ts +29 -0
  283. package/src/api/users/controllers/AdminUserController.ts +32 -0
  284. package/src/api/users/index.ts +3 -0
  285. package/src/api/users/services/CredentialService.ts +5 -0
  286. package/src/api/users/services/RegistrationService.ts +49 -1
  287. package/src/api/users/services/SessionCrudService.ts +16 -0
  288. package/src/api/users/services/SessionService.ts +17 -59
  289. package/src/api/users/services/UsernameSlugger.ts +195 -0
  290. package/src/bucket/primitives/$bucket.ts +21 -0
  291. package/src/bucket/providers/CloudflareR2Provider.ts +15 -0
  292. package/src/bucket/providers/FileStorageProvider.ts +9 -0
  293. package/src/bucket/providers/LocalFileStorageProvider.ts +14 -0
  294. package/src/bucket/providers/MemoryFileStorageProvider.ts +9 -0
  295. package/src/bucket/providers/NodeS3BucketProvider.ts +35 -0
  296. package/src/cache/core/__tests__/$cache.memory.spec.ts +450 -0
  297. package/src/cache/core/__tests__/$cache.swr.spec.ts +394 -0
  298. package/src/cache/core/index.ts +16 -0
  299. package/src/cache/core/primitives/$cache.ts +367 -24
  300. package/src/cache/database/__tests__/DatabaseCacheProvider.behavior.spec.ts +203 -0
  301. package/src/cache/database/__tests__/DatabaseCacheProvider.spec.ts +110 -0
  302. package/src/cache/database/entities/cacheEntries.ts +55 -0
  303. package/src/cache/database/index.ts +36 -0
  304. package/src/cache/database/providers/DatabaseCacheProvider.ts +348 -0
  305. package/src/cli/core/services/ProjectScaffolder.ts +0 -2
  306. package/src/cli/core/tasks/BuildCloudflareTask.ts +33 -3
  307. package/src/cli/core/tasks/BuildSitemapTask.ts +7 -0
  308. package/src/cli/core/tasks/BuildVercelTask.ts +82 -3
  309. package/src/cli/core/templates/agentMd.ts +39 -4
  310. package/src/cli/core/templates/biomeJson.ts +25 -1
  311. package/src/cli/core/templates/saasAdminLayoutTsx.ts +2 -2
  312. package/src/cli/platform/__tests__/CloudflareAdapter.spec.ts +117 -0
  313. package/src/cli/platform/__tests__/detectResources.spec.ts +96 -0
  314. package/src/cli/platform/adapters/CloudflareAdapter.ts +104 -7
  315. package/src/cli/platform/atoms/platformOptions.ts +13 -0
  316. package/src/cli/platform/commands/platform.ts +7 -1
  317. package/src/cli/platform/schemas/platform.ts +1 -0
  318. package/src/cli/platform/services/CloudflareApi.ts +61 -0
  319. package/src/cli/platform/services/PlatformOrchestrator.ts +9 -4
  320. package/src/core/__tests__/$module.spec.ts +2 -2
  321. package/src/core/primitives/$module.ts +4 -4
  322. package/src/mcp/providers/McpServerProvider.ts +1 -1
  323. package/src/orm/core/providers/DatabaseTypeProvider.ts +9 -3
  324. package/src/orm/core/providers/drivers/DatabaseProvider.ts +1 -1
  325. package/src/orm/core/schemas/insertSchema.ts +10 -2
  326. package/src/orm/core/services/Repository.ts +27 -7
  327. package/src/react/form/hooks/useFormState.ts +8 -1
  328. package/src/react/form/index.ts +10 -1
  329. package/src/react/form/services/FormModel.ts +9 -3
  330. package/src/scheduler/index.ts +14 -0
  331. package/src/scheduler/providers/CronProvider.ts +13 -0
  332. package/src/security/atoms/currentTenantAtom.ts +34 -0
  333. package/src/security/index.browser.ts +1 -0
  334. package/src/security/index.ts +12 -1
  335. package/src/security/primitives/$issuer.ts +17 -1
  336. package/src/security/providers/SecurityProvider.ts +37 -0
  337. package/src/server/auth/__tests__/validateRedirectUri.spec.ts +78 -0
  338. package/src/server/auth/providers/ServerAuthProvider.ts +21 -5
  339. package/tsconfig.base.json +2 -1
  340. package/dist/react/websocket/index.d.ts +0 -117
  341. package/dist/react/websocket/index.d.ts.map +0 -1
  342. package/dist/react/websocket/index.js +0 -108
  343. package/dist/react/websocket/index.js.map +0 -1
  344. package/dist/websocket/index.browser.js +0 -844
  345. package/dist/websocket/index.browser.js.map +0 -1
  346. package/dist/websocket/index.d.ts +0 -876
  347. package/dist/websocket/index.d.ts.map +0 -1
  348. package/dist/websocket/index.js +0 -1175
  349. package/dist/websocket/index.js.map +0 -1
  350. package/src/react/websocket/hooks/useRoom.tsx +0 -251
  351. package/src/react/websocket/index.ts +0 -7
  352. package/src/websocket/__tests__/$channel.spec.ts +0 -30
  353. package/src/websocket/__tests__/$websocket-new.spec.ts +0 -195
  354. package/src/websocket/__tests__/RoomManager.spec.ts +0 -146
  355. package/src/websocket/__tests__/websocket-integration.spec.ts +0 -951
  356. package/src/websocket/errors/WebSocketError.ts +0 -34
  357. package/src/websocket/index.browser.ts +0 -25
  358. package/src/websocket/index.shared.ts +0 -8
  359. package/src/websocket/index.ts +0 -85
  360. package/src/websocket/interfaces/WebSocketInterfaces.ts +0 -252
  361. package/src/websocket/primitives/$channel.ts +0 -131
  362. package/src/websocket/primitives/$websocket.ts +0 -107
  363. package/src/websocket/providers/NodeWebSocketServerProvider.ts +0 -617
  364. package/src/websocket/providers/WebSocketServerProvider.ts +0 -56
  365. package/src/websocket/services/RoomManager.ts +0 -160
  366. package/src/websocket/services/WebSocketClient.ts +0 -642
  367. package/src/websocket/services/WebSocketTopicService.ts +0 -108
package/AGENTS.md CHANGED
@@ -96,7 +96,6 @@ src/
96
96
  | Primitive | Import | Purpose |
97
97
  |-----------|--------|---------|
98
98
  | `$command` | `alepha/command` | CLI commands |
99
- | `$channel` | `alepha/websocket` | WebSocket channels |
100
99
  | `$swagger` | `alepha/server` | OpenAPI docs |
101
100
  | `$proxy` | `alepha/server` | HTTP proxy |
102
101
  | `$tool` | `alepha/mcp` | MCP tool definition |
package/CLAUDE.md CHANGED
@@ -96,7 +96,6 @@ src/
96
96
  | Primitive | Import | Purpose |
97
97
  |-----------|--------|---------|
98
98
  | `$command` | `alepha/command` | CLI commands |
99
- | `$channel` | `alepha/websocket` | WebSocket channels |
100
99
  | `$swagger` | `alepha/server` | OpenAPI docs |
101
100
  | `$proxy` | `alepha/server` | HTTP proxy |
102
101
  | `$tool` | `alepha/mcp` | MCP tool definition |
@@ -96,7 +96,6 @@ src/
96
96
  | Primitive | Import | Purpose |
97
97
  |-----------|--------|---------|
98
98
  | `$command` | `alepha/command` | CLI commands |
99
- | `$channel` | `alepha/websocket` | WebSocket channels |
100
99
  | `$swagger` | `alepha/server` | OpenAPI docs |
101
100
  | `$proxy` | `alepha/server` | HTTP proxy |
102
101
  | `$tool` | `alepha/mcp` | MCP tool definition |
@@ -26,6 +26,7 @@ const audits = $entity({
26
26
  schema: t.object({
27
27
  id: db.primaryKey(t.bigint()),
28
28
  createdAt: db.createdAt(),
29
+ organizationId: db.organization(),
29
30
  /**
30
31
  * Audit event type (e.g., "auth", "user", "payment", "system").
31
32
  * Used for categorizing and filtering audit events.
@@ -1 +1 @@
1
- {"version":3,"file":"index.browser.js","names":[],"sources":["../../../src/api/audits/entities/audits.ts","../../../src/api/audits/schemas/auditQuerySchema.ts","../../../src/api/audits/schemas/auditResourceSchema.ts","../../../src/api/audits/schemas/createAuditSchema.ts"],"sourcesContent":["import type { Static } from \"alepha\";\nimport { t } from \"alepha\";\nimport { $entity, db } from \"alepha/orm\";\n\n/**\n * Audit severity levels for categorizing events.\n */\nexport const auditSeveritySchema = t.enum([\"info\", \"warning\", \"critical\"], {\n default: \"info\",\n description: \"Severity level of the audit event\",\n});\n\nexport type AuditSeverity = Static<typeof auditSeveritySchema>;\n\n/**\n * Audit log entity for tracking important system events.\n *\n * Stores comprehensive audit information including:\n * - Who performed the action (userId, userRealm)\n * - What happened (type, action, resource)\n * - When it happened (createdAt)\n * - Context and details (metadata, ipAddress, userAgent)\n */\nexport const audits = $entity({\n name: \"audits\",\n schema: t.object({\n id: db.primaryKey(t.bigint()),\n createdAt: db.createdAt(),\n\n /**\n * Audit event type (e.g., \"auth\", \"user\", \"payment\", \"system\").\n * Used for categorizing and filtering audit events.\n */\n type: t.text({\n description: \"Audit event type (e.g., auth, user, payment, system)\",\n }),\n\n /**\n * Specific action performed (e.g., \"login\", \"logout\", \"create\", \"update\", \"delete\").\n */\n action: t.text({\n description: \"Specific action performed (e.g., login, create, update)\",\n }),\n\n /**\n * Severity level of the event.\n */\n severity: db.default(auditSeveritySchema, \"info\"),\n\n /**\n * User ID who performed the action (null for system events).\n */\n userId: t.optional(t.uuid()),\n\n /**\n * User realm for multi-tenant support.\n */\n userRealm: t.optional(t.text()),\n\n /**\n * User email at the time of the event (denormalized for history).\n */\n userEmail: t.optional(t.email()),\n\n /**\n * Resource type affected (e.g., \"user\", \"order\", \"file\").\n */\n resourceType: t.optional(t.text()),\n\n /**\n * Resource ID affected.\n */\n resourceId: t.optional(t.text()),\n\n /**\n * Human-readable description of the event.\n */\n description: t.optional(t.text()),\n\n /**\n * Additional metadata/context as JSON.\n */\n metadata: t.optional(t.json()),\n\n /**\n * Client IP address.\n */\n ipAddress: t.optional(t.text()),\n\n /**\n * Client user agent.\n */\n userAgent: t.optional(t.text()),\n\n /**\n * Session ID if applicable.\n */\n sessionId: t.optional(t.uuid()),\n\n /**\n * Request ID for correlation.\n */\n requestId: t.optional(t.text()),\n\n /**\n * Whether the action was successful.\n */\n success: db.default(t.boolean(), true),\n\n /**\n * Error message if the action failed.\n */\n errorMessage: t.optional(t.text()),\n }),\n indexes: [\n \"createdAt\",\n \"type\",\n \"action\",\n \"userId\",\n \"userRealm\",\n \"resourceType\",\n \"resourceId\",\n \"severity\",\n { columns: [\"type\", \"action\"] },\n { columns: [\"userId\", \"createdAt\"] },\n { columns: [\"userRealm\", \"createdAt\"] },\n ],\n});\n\nexport const auditEntitySchema = audits.schema;\nexport const auditEntityInsertSchema = audits.insertSchema;\nexport type AuditEntity = Static<typeof audits.schema>;\n","import type { Static } from \"alepha\";\nimport { t } from \"alepha\";\nimport { pageQuerySchema } from \"alepha/orm\";\nimport { auditSeveritySchema } from \"../entities/audits.ts\";\n\n/**\n * Query schema for searching and filtering audit logs.\n */\nexport const auditQuerySchema = t.extend(pageQuerySchema, {\n type: t.optional(t.text({ description: \"Filter by audit type\" })),\n action: t.optional(t.text({ description: \"Filter by action\" })),\n severity: t.optional(auditSeveritySchema),\n userId: t.optional(t.uuid({ description: \"Filter by user ID\" })),\n userRealm: t.optional(t.text({ description: \"Filter by user realm\" })),\n resourceType: t.optional(t.text({ description: \"Filter by resource type\" })),\n resourceId: t.optional(t.text({ description: \"Filter by resource ID\" })),\n success: t.optional(t.boolean({ description: \"Filter by success status\" })),\n from: t.optional(t.datetime({ description: \"Start date filter\" })),\n to: t.optional(t.datetime({ description: \"End date filter\" })),\n search: t.optional(t.text({ description: \"Search in description\" })),\n});\n\nexport type AuditQuery = Static<typeof auditQuerySchema>;\n","import type { Static } from \"alepha\";\nimport { audits } from \"../entities/audits.ts\";\n\n/**\n * Resource schema for audit log responses.\n */\nexport const auditResourceSchema = audits.schema;\n\nexport type AuditResource = Static<typeof auditResourceSchema>;\n","import type { Static } from \"alepha\";\nimport { t } from \"alepha\";\nimport { auditSeveritySchema } from \"../entities/audits.ts\";\n\n/**\n * Schema for creating a new audit log entry.\n */\nexport const createAuditSchema = t.object({\n type: t.text({ description: \"Audit event type\" }),\n action: t.text({ description: \"Specific action performed\" }),\n severity: t.optional(auditSeveritySchema),\n userId: t.optional(t.uuid()),\n userRealm: t.optional(t.text()),\n userEmail: t.optional(t.email()),\n resourceType: t.optional(t.text()),\n resourceId: t.optional(t.text()),\n description: t.optional(t.text()),\n metadata: t.optional(t.json()),\n ipAddress: t.optional(t.text()),\n userAgent: t.optional(t.text()),\n sessionId: t.optional(t.uuid()),\n requestId: t.optional(t.text()),\n success: t.optional(t.boolean()),\n errorMessage: t.optional(t.text()),\n});\n\nexport type CreateAudit = Static<typeof createAuditSchema>;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.browser.js","names":[],"sources":["../../../src/api/audits/entities/audits.ts","../../../src/api/audits/schemas/auditQuerySchema.ts","../../../src/api/audits/schemas/auditResourceSchema.ts","../../../src/api/audits/schemas/createAuditSchema.ts"],"sourcesContent":["import type { Static } from \"alepha\";\nimport { t } from \"alepha\";\nimport { $entity, db } from \"alepha/orm\";\n\n/**\n * Audit severity levels for categorizing events.\n */\nexport const auditSeveritySchema = t.enum([\"info\", \"warning\", \"critical\"], {\n default: \"info\",\n description: \"Severity level of the audit event\",\n});\n\nexport type AuditSeverity = Static<typeof auditSeveritySchema>;\n\n/**\n * Audit log entity for tracking important system events.\n *\n * Stores comprehensive audit information including:\n * - Who performed the action (userId, userRealm)\n * - What happened (type, action, resource)\n * - When it happened (createdAt)\n * - Context and details (metadata, ipAddress, userAgent)\n */\nexport const audits = $entity({\n name: \"audits\",\n schema: t.object({\n id: db.primaryKey(t.bigint()),\n createdAt: db.createdAt(),\n organizationId: db.organization(),\n\n /**\n * Audit event type (e.g., \"auth\", \"user\", \"payment\", \"system\").\n * Used for categorizing and filtering audit events.\n */\n type: t.text({\n description: \"Audit event type (e.g., auth, user, payment, system)\",\n }),\n\n /**\n * Specific action performed (e.g., \"login\", \"logout\", \"create\", \"update\", \"delete\").\n */\n action: t.text({\n description: \"Specific action performed (e.g., login, create, update)\",\n }),\n\n /**\n * Severity level of the event.\n */\n severity: db.default(auditSeveritySchema, \"info\"),\n\n /**\n * User ID who performed the action (null for system events).\n */\n userId: t.optional(t.uuid()),\n\n /**\n * User realm for multi-tenant support.\n */\n userRealm: t.optional(t.text()),\n\n /**\n * User email at the time of the event (denormalized for history).\n */\n userEmail: t.optional(t.email()),\n\n /**\n * Resource type affected (e.g., \"user\", \"order\", \"file\").\n */\n resourceType: t.optional(t.text()),\n\n /**\n * Resource ID affected.\n */\n resourceId: t.optional(t.text()),\n\n /**\n * Human-readable description of the event.\n */\n description: t.optional(t.text()),\n\n /**\n * Additional metadata/context as JSON.\n */\n metadata: t.optional(t.json()),\n\n /**\n * Client IP address.\n */\n ipAddress: t.optional(t.text()),\n\n /**\n * Client user agent.\n */\n userAgent: t.optional(t.text()),\n\n /**\n * Session ID if applicable.\n */\n sessionId: t.optional(t.uuid()),\n\n /**\n * Request ID for correlation.\n */\n requestId: t.optional(t.text()),\n\n /**\n * Whether the action was successful.\n */\n success: db.default(t.boolean(), true),\n\n /**\n * Error message if the action failed.\n */\n errorMessage: t.optional(t.text()),\n }),\n indexes: [\n \"createdAt\",\n \"type\",\n \"action\",\n \"userId\",\n \"userRealm\",\n \"resourceType\",\n \"resourceId\",\n \"severity\",\n { columns: [\"type\", \"action\"] },\n { columns: [\"userId\", \"createdAt\"] },\n { columns: [\"userRealm\", \"createdAt\"] },\n ],\n});\n\nexport const auditEntitySchema = audits.schema;\nexport const auditEntityInsertSchema = audits.insertSchema;\nexport type AuditEntity = Static<typeof audits.schema>;\n","import type { Static } from \"alepha\";\nimport { t } from \"alepha\";\nimport { pageQuerySchema } from \"alepha/orm\";\nimport { auditSeveritySchema } from \"../entities/audits.ts\";\n\n/**\n * Query schema for searching and filtering audit logs.\n */\nexport const auditQuerySchema = t.extend(pageQuerySchema, {\n type: t.optional(t.text({ description: \"Filter by audit type\" })),\n action: t.optional(t.text({ description: \"Filter by action\" })),\n severity: t.optional(auditSeveritySchema),\n userId: t.optional(t.uuid({ description: \"Filter by user ID\" })),\n userRealm: t.optional(t.text({ description: \"Filter by user realm\" })),\n resourceType: t.optional(t.text({ description: \"Filter by resource type\" })),\n resourceId: t.optional(t.text({ description: \"Filter by resource ID\" })),\n success: t.optional(t.boolean({ description: \"Filter by success status\" })),\n from: t.optional(t.datetime({ description: \"Start date filter\" })),\n to: t.optional(t.datetime({ description: \"End date filter\" })),\n search: t.optional(t.text({ description: \"Search in description\" })),\n});\n\nexport type AuditQuery = Static<typeof auditQuerySchema>;\n","import type { Static } from \"alepha\";\nimport { audits } from \"../entities/audits.ts\";\n\n/**\n * Resource schema for audit log responses.\n */\nexport const auditResourceSchema = audits.schema;\n\nexport type AuditResource = Static<typeof auditResourceSchema>;\n","import type { Static } from \"alepha\";\nimport { t } from \"alepha\";\nimport { auditSeveritySchema } from \"../entities/audits.ts\";\n\n/**\n * Schema for creating a new audit log entry.\n */\nexport const createAuditSchema = t.object({\n type: t.text({ description: \"Audit event type\" }),\n action: t.text({ description: \"Specific action performed\" }),\n severity: t.optional(auditSeveritySchema),\n userId: t.optional(t.uuid()),\n userRealm: t.optional(t.text()),\n userEmail: t.optional(t.email()),\n resourceType: t.optional(t.text()),\n resourceId: t.optional(t.text()),\n description: t.optional(t.text()),\n metadata: t.optional(t.json()),\n ipAddress: t.optional(t.text()),\n userAgent: t.optional(t.text()),\n sessionId: t.optional(t.uuid()),\n requestId: t.optional(t.text()),\n success: t.optional(t.boolean()),\n errorMessage: t.optional(t.text()),\n});\n\nexport type CreateAudit = Static<typeof createAuditSchema>;\n"],"mappings":"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"}