@lenne.tech/nest-server 12.0.0 → 12.1.0

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 (693) hide show
  1. package/.claude/rules/architecture.md +6 -1
  2. package/.claude/rules/better-auth.md +46 -0
  3. package/.claude/rules/configurable-features.md +3 -2
  4. package/.claude/rules/package-management.md +24 -2
  5. package/.claude/rules/persistence.md +100 -0
  6. package/.claude/rules/role-system.md +9 -0
  7. package/.claude/rules/testing.md +116 -18
  8. package/CLAUDE.md +21 -2
  9. package/FRAMEWORK-API.md +6 -4
  10. package/README.md +106 -34
  11. package/dist/core/common/decorators/unified-field.decorator.d.ts +2 -1
  12. package/dist/core/common/decorators/unified-field.decorator.js +4 -1
  13. package/dist/core/common/decorators/unified-field.decorator.js.map +1 -1
  14. package/dist/core/common/filters/mongoose-cast-error.filter.d.ts +7 -5
  15. package/dist/core/common/filters/mongoose-cast-error.filter.js +3 -2
  16. package/dist/core/common/filters/mongoose-cast-error.filter.js.map +1 -1
  17. package/dist/core/common/helpers/db.helper.d.ts +2 -1
  18. package/dist/core/common/helpers/db.helper.js +32 -26
  19. package/dist/core/common/helpers/db.helper.js.map +1 -1
  20. package/dist/core/common/helpers/decorator.helper.d.ts +1 -1
  21. package/dist/core/common/helpers/filter.helper.d.ts +2 -1
  22. package/dist/core/common/helpers/filter.helper.js.map +1 -1
  23. package/dist/core/common/helpers/gridfs.helper.d.ts +4 -4
  24. package/dist/core/common/helpers/gridfs.helper.js +14 -6
  25. package/dist/core/common/helpers/gridfs.helper.js.map +1 -1
  26. package/dist/core/common/helpers/id.helper.d.ts +4 -1
  27. package/dist/core/common/helpers/id.helper.js +10 -4
  28. package/dist/core/common/helpers/id.helper.js.map +1 -1
  29. package/dist/core/common/helpers/model.helper.js +5 -5
  30. package/dist/core/common/helpers/model.helper.js.map +1 -1
  31. package/dist/core/common/helpers/service.helper.js +3 -3
  32. package/dist/core/common/helpers/service.helper.js.map +1 -1
  33. package/dist/core/common/interfaces/server-options.interface.d.ts +18 -2
  34. package/dist/core/common/interfaces/service-options.interface.d.ts +2 -2
  35. package/dist/core/common/models/core-persistence.model.d.ts +1 -2
  36. package/dist/core/common/models/core-persistence.model.js +3 -3
  37. package/dist/core/common/models/core-persistence.model.js.map +1 -1
  38. package/dist/core/common/persistence/core-persistence.lifecycle.d.ts +9 -0
  39. package/dist/core/common/persistence/core-persistence.lifecycle.js +38 -0
  40. package/dist/core/common/persistence/core-persistence.lifecycle.js.map +1 -0
  41. package/dist/core/common/persistence/core-persistence.module.d.ts +9 -0
  42. package/dist/core/common/persistence/core-persistence.module.js +76 -0
  43. package/dist/core/common/persistence/core-persistence.module.js.map +1 -0
  44. package/dist/core/common/persistence/data-source.config.d.ts +33 -0
  45. package/dist/core/common/persistence/data-source.config.js +151 -0
  46. package/dist/core/common/persistence/data-source.config.js.map +1 -0
  47. package/dist/core/common/persistence/data-source.runtime.d.ts +45 -0
  48. package/dist/core/common/persistence/data-source.runtime.js +278 -0
  49. package/dist/core/common/persistence/data-source.runtime.js.map +1 -0
  50. package/dist/core/common/persistence/data-store.interface.d.ts +73 -0
  51. package/dist/core/common/persistence/data-store.interface.js +2 -0
  52. package/dist/core/common/persistence/data-store.interface.js.map +1 -0
  53. package/dist/core/common/persistence/expiry-sweep.d.ts +12 -0
  54. package/dist/core/common/persistence/expiry-sweep.js +55 -0
  55. package/dist/core/common/persistence/expiry-sweep.js.map +1 -0
  56. package/dist/core/common/persistence/id-format.d.ts +3 -0
  57. package/dist/core/common/persistence/id-format.js +21 -0
  58. package/dist/core/common/persistence/id-format.js.map +1 -0
  59. package/dist/core/common/persistence/infrastructure-locks.d.ts +13 -0
  60. package/dist/core/common/persistence/infrastructure-locks.js +35 -0
  61. package/dist/core/common/persistence/infrastructure-locks.js.map +1 -0
  62. package/dist/core/common/persistence/inject-store.decorator.d.ts +1 -0
  63. package/dist/core/common/persistence/inject-store.decorator.js +6 -0
  64. package/dist/core/common/persistence/inject-store.decorator.js.map +1 -0
  65. package/dist/core/common/persistence/lock-store.interface.d.ts +5 -0
  66. package/dist/core/common/persistence/lock-store.interface.js +2 -0
  67. package/dist/core/common/persistence/lock-store.interface.js.map +1 -0
  68. package/dist/core/common/persistence/model-descriptor.interface.d.ts +36 -0
  69. package/dist/core/common/persistence/model-descriptor.interface.js +2 -0
  70. package/dist/core/common/persistence/model-descriptor.interface.js.map +1 -0
  71. package/dist/core/common/persistence/model-metadata.registry.d.ts +14 -0
  72. package/dist/core/common/persistence/model-metadata.registry.js +194 -0
  73. package/dist/core/common/persistence/model-metadata.registry.js.map +1 -0
  74. package/dist/core/common/persistence/mongo/collection-name.d.ts +2 -0
  75. package/dist/core/common/persistence/mongo/collection-name.js +73 -0
  76. package/dist/core/common/persistence/mongo/collection-name.js.map +1 -0
  77. package/dist/core/common/persistence/mongo/declared-schema.view.d.ts +11 -0
  78. package/dist/core/common/persistence/mongo/declared-schema.view.js +292 -0
  79. package/dist/core/common/persistence/mongo/declared-schema.view.js.map +1 -0
  80. package/dist/core/common/persistence/mongo/hex-object-id.d.ts +13 -0
  81. package/dist/core/common/persistence/mongo/hex-object-id.js +54 -0
  82. package/dist/core/common/persistence/mongo/hex-object-id.js.map +1 -0
  83. package/dist/core/common/persistence/mongo/model-declarations.d.ts +35 -0
  84. package/dist/core/common/persistence/mongo/model-declarations.js +80 -0
  85. package/dist/core/common/persistence/mongo/model-declarations.js.map +1 -0
  86. package/dist/core/common/persistence/mongo/mongo-packages.d.ts +15 -0
  87. package/dist/core/common/persistence/mongo/mongo-packages.js +66 -0
  88. package/dist/core/common/persistence/mongo/mongo-packages.js.map +1 -0
  89. package/dist/core/common/persistence/mongo/mongoose-compat.d.ts +22 -0
  90. package/dist/core/common/persistence/mongo/mongoose-compat.js +65 -0
  91. package/dist/core/common/persistence/mongo/mongoose-compat.js.map +1 -0
  92. package/dist/core/common/persistence/mongo/no-mongo-connection.module.d.ts +2 -0
  93. package/dist/core/common/persistence/mongo/no-mongo-connection.module.js +19 -0
  94. package/dist/core/common/persistence/mongo/no-mongo-connection.module.js.map +1 -0
  95. package/dist/core/common/persistence/mongo-lock-store.d.ts +21 -0
  96. package/dist/core/common/persistence/mongo-lock-store.js +72 -0
  97. package/dist/core/common/persistence/mongo-lock-store.js.map +1 -0
  98. package/dist/core/common/persistence/mongoose-data-store.d.ts +33 -0
  99. package/dist/core/common/persistence/mongoose-data-store.js +187 -0
  100. package/dist/core/common/persistence/mongoose-data-store.js.map +1 -0
  101. package/dist/core/common/persistence/neutral-populate.d.ts +6 -0
  102. package/dist/core/common/persistence/neutral-populate.js +72 -0
  103. package/dist/core/common/persistence/neutral-populate.js.map +1 -0
  104. package/dist/core/common/persistence/persisted-model.decorator.d.ts +6 -0
  105. package/dist/core/common/persistence/persisted-model.decorator.js +24 -0
  106. package/dist/core/common/persistence/persisted-model.decorator.js.map +1 -0
  107. package/dist/core/common/persistence/persistence-runtime.registry.d.ts +61 -0
  108. package/dist/core/common/persistence/persistence-runtime.registry.js +47 -0
  109. package/dist/core/common/persistence/persistence-runtime.registry.js.map +1 -0
  110. package/dist/core/common/persistence/persistence.tokens.d.ts +1 -0
  111. package/dist/core/common/persistence/persistence.tokens.js +4 -0
  112. package/dist/core/common/persistence/persistence.tokens.js.map +1 -0
  113. package/dist/core/common/persistence/policies/audit.policy.d.ts +8 -0
  114. package/dist/core/common/persistence/policies/audit.policy.js +37 -0
  115. package/dist/core/common/persistence/policies/audit.policy.js.map +1 -0
  116. package/dist/core/common/persistence/policies/password.policy.d.ts +3 -0
  117. package/dist/core/common/persistence/policies/password.policy.js +46 -0
  118. package/dist/core/common/persistence/policies/password.policy.js.map +1 -0
  119. package/dist/core/common/persistence/policies/role-guard.policy.d.ts +3 -0
  120. package/dist/core/common/persistence/policies/role-guard.policy.js +46 -0
  121. package/dist/core/common/persistence/policies/role-guard.policy.js.map +1 -0
  122. package/dist/core/common/persistence/policies/system-role.policy.d.ts +5 -0
  123. package/dist/core/common/persistence/policies/system-role.policy.js +46 -0
  124. package/dist/core/common/persistence/policies/system-role.policy.js.map +1 -0
  125. package/dist/core/common/persistence/policies/tenant.policy.d.ts +19 -0
  126. package/dist/core/common/persistence/policies/tenant.policy.js +120 -0
  127. package/dist/core/common/persistence/policies/tenant.policy.js.map +1 -0
  128. package/dist/core/common/persistence/routed-model.guard.d.ts +4 -0
  129. package/dist/core/common/persistence/routed-model.guard.js +73 -0
  130. package/dist/core/common/persistence/routed-model.guard.js.map +1 -0
  131. package/dist/core/common/persistence/sql/mysql/mysql-data-store.d.ts +46 -0
  132. package/dist/core/common/persistence/sql/mysql/mysql-data-store.js +350 -0
  133. package/dist/core/common/persistence/sql/mysql/mysql-data-store.js.map +1 -0
  134. package/dist/core/common/persistence/sql/mysql/mysql-executor.d.ts +13 -0
  135. package/dist/core/common/persistence/sql/mysql/mysql-executor.js +194 -0
  136. package/dist/core/common/persistence/sql/mysql/mysql-executor.js.map +1 -0
  137. package/dist/core/common/persistence/sql/mysql/mysql-lock-store.d.ts +11 -0
  138. package/dist/core/common/persistence/sql/mysql/mysql-lock-store.js +55 -0
  139. package/dist/core/common/persistence/sql/mysql/mysql-lock-store.js.map +1 -0
  140. package/dist/core/common/persistence/sql/mysql/mysql-schema.compiler.d.ts +36 -0
  141. package/dist/core/common/persistence/sql/mysql/mysql-schema.compiler.js +288 -0
  142. package/dist/core/common/persistence/sql/mysql/mysql-schema.compiler.js.map +1 -0
  143. package/dist/core/common/persistence/sql/mysql/mysql-schema.migrator.d.ts +19 -0
  144. package/dist/core/common/persistence/sql/mysql/mysql-schema.migrator.js +328 -0
  145. package/dist/core/common/persistence/sql/mysql/mysql-schema.migrator.js.map +1 -0
  146. package/dist/core/common/persistence/sql/mysql/mysql-session.d.ts +13 -0
  147. package/dist/core/common/persistence/sql/mysql/mysql-session.js +85 -0
  148. package/dist/core/common/persistence/sql/mysql/mysql-session.js.map +1 -0
  149. package/dist/core/common/persistence/sql/mysql/mysql-update.compiler.d.ts +9 -0
  150. package/dist/core/common/persistence/sql/mysql/mysql-update.compiler.js +264 -0
  151. package/dist/core/common/persistence/sql/mysql/mysql-update.compiler.js.map +1 -0
  152. package/dist/core/common/persistence/sql/mysql/mysql-where.compiler.d.ts +20 -0
  153. package/dist/core/common/persistence/sql/mysql/mysql-where.compiler.js +519 -0
  154. package/dist/core/common/persistence/sql/mysql/mysql-where.compiler.js.map +1 -0
  155. package/dist/core/common/persistence/sql/postgres/postgres-lock-store.d.ts +11 -0
  156. package/dist/core/common/persistence/sql/postgres/postgres-lock-store.js +44 -0
  157. package/dist/core/common/persistence/sql/postgres/postgres-lock-store.js.map +1 -0
  158. package/dist/core/common/persistence/sql/postgres/postgres-schema.compiler.d.ts +42 -0
  159. package/dist/core/common/persistence/sql/postgres/postgres-schema.compiler.js +220 -0
  160. package/dist/core/common/persistence/sql/postgres/postgres-schema.compiler.js.map +1 -0
  161. package/dist/core/common/persistence/sql/postgres/postgres-schema.migrator.d.ts +12 -0
  162. package/dist/core/common/persistence/sql/postgres/postgres-schema.migrator.js +315 -0
  163. package/dist/core/common/persistence/sql/postgres/postgres-schema.migrator.js.map +1 -0
  164. package/dist/core/common/persistence/sql/postgres/postgres-update.compiler.d.ts +5 -0
  165. package/dist/core/common/persistence/sql/postgres/postgres-update.compiler.js +225 -0
  166. package/dist/core/common/persistence/sql/postgres/postgres-update.compiler.js.map +1 -0
  167. package/dist/core/common/persistence/sql/postgres/postgres-where.compiler.d.ts +13 -0
  168. package/dist/core/common/persistence/sql/postgres/postgres-where.compiler.js +484 -0
  169. package/dist/core/common/persistence/sql/postgres/postgres-where.compiler.js.map +1 -0
  170. package/dist/core/common/persistence/sql/sql-cast.d.ts +2 -0
  171. package/dist/core/common/persistence/sql/sql-cast.js +194 -0
  172. package/dist/core/common/persistence/sql/sql-cast.js.map +1 -0
  173. package/dist/core/common/persistence/sql/sql-data-store.d.ts +79 -0
  174. package/dist/core/common/persistence/sql/sql-data-store.js +592 -0
  175. package/dist/core/common/persistence/sql/sql-data-store.js.map +1 -0
  176. package/dist/core/common/persistence/sql/sql-dialect.d.ts +20 -0
  177. package/dist/core/common/persistence/sql/sql-dialect.js +38 -0
  178. package/dist/core/common/persistence/sql/sql-dialect.js.map +1 -0
  179. package/dist/core/common/persistence/sql/sql-errors.d.ts +17 -0
  180. package/dist/core/common/persistence/sql/sql-errors.js +25 -0
  181. package/dist/core/common/persistence/sql/sql-errors.js.map +1 -0
  182. package/dist/core/common/persistence/sql/sql-executor.factory.d.ts +11 -0
  183. package/dist/core/common/persistence/sql/sql-executor.factory.js +199 -0
  184. package/dist/core/common/persistence/sql/sql-executor.factory.js.map +1 -0
  185. package/dist/core/common/persistence/sql/sql-executor.interface.d.ts +32 -0
  186. package/dist/core/common/persistence/sql/sql-executor.interface.js +2 -0
  187. package/dist/core/common/persistence/sql/sql-executor.interface.js.map +1 -0
  188. package/dist/core/common/persistence/sql/sql-naming.d.ts +15 -0
  189. package/dist/core/common/persistence/sql/sql-naming.js +90 -0
  190. package/dist/core/common/persistence/sql/sql-naming.js.map +1 -0
  191. package/dist/core/common/persistence/sql/sql-schema.shared.d.ts +25 -0
  192. package/dist/core/common/persistence/sql/sql-schema.shared.js +69 -0
  193. package/dist/core/common/persistence/sql/sql-schema.shared.js.map +1 -0
  194. package/dist/core/common/persistence/sql/sql-session.d.ts +6 -0
  195. package/dist/core/common/persistence/sql/sql-session.js +78 -0
  196. package/dist/core/common/persistence/sql/sql-session.js.map +1 -0
  197. package/dist/core/common/persistence/sql/where-shared.d.ts +18 -0
  198. package/dist/core/common/persistence/sql/where-shared.js +93 -0
  199. package/dist/core/common/persistence/sql/where-shared.js.map +1 -0
  200. package/dist/core/common/persistence/store-guards.d.ts +10 -0
  201. package/dist/core/common/persistence/store-guards.js +49 -0
  202. package/dist/core/common/persistence/store-guards.js.map +1 -0
  203. package/dist/core/common/persistence/store-upsert.d.ts +2 -0
  204. package/dist/core/common/persistence/store-upsert.js +20 -0
  205. package/dist/core/common/persistence/store-upsert.js.map +1 -0
  206. package/dist/core/common/persistence/unavailable-store.d.ts +2 -0
  207. package/dist/core/common/persistence/unavailable-store.js +53 -0
  208. package/dist/core/common/persistence/unavailable-store.js.map +1 -0
  209. package/dist/core/common/persistence/unsupported-capability.error.d.ts +3 -0
  210. package/dist/core/common/persistence/unsupported-capability.error.js +4 -0
  211. package/dist/core/common/persistence/unsupported-capability.error.js.map +1 -0
  212. package/dist/core/common/plugins/mongoose-audit-fields.plugin.js +24 -68
  213. package/dist/core/common/plugins/mongoose-audit-fields.plugin.js.map +1 -1
  214. package/dist/core/common/plugins/mongoose-id.plugin.js +3 -0
  215. package/dist/core/common/plugins/mongoose-id.plugin.js.map +1 -1
  216. package/dist/core/common/plugins/mongoose-password.plugin.d.ts +1 -3
  217. package/dist/core/common/plugins/mongoose-password.plugin.js +2 -45
  218. package/dist/core/common/plugins/mongoose-password.plugin.js.map +1 -1
  219. package/dist/core/common/plugins/mongoose-role-guard.plugin.js +5 -46
  220. package/dist/core/common/plugins/mongoose-role-guard.plugin.js.map +1 -1
  221. package/dist/core/common/plugins/mongoose-system-role.plugin.js +2 -43
  222. package/dist/core/common/plugins/mongoose-system-role.plugin.js.map +1 -1
  223. package/dist/core/common/plugins/mongoose-tenant.plugin.js +10 -70
  224. package/dist/core/common/plugins/mongoose-tenant.plugin.js.map +1 -1
  225. package/dist/core/common/scalars/upload.scalar.js +1 -1
  226. package/dist/core/common/scalars/upload.scalar.js.map +1 -1
  227. package/dist/core/common/services/core-cron-jobs.initializer.js +1 -1
  228. package/dist/core/common/services/core-cron-jobs.initializer.js.map +1 -1
  229. package/dist/core/common/services/core-cron-jobs.service.d.ts +1 -0
  230. package/dist/core/common/services/core-cron-jobs.service.js +23 -14
  231. package/dist/core/common/services/core-cron-jobs.service.js.map +1 -1
  232. package/dist/core/common/services/crud.service.d.ts +4 -1
  233. package/dist/core/common/services/crud.service.js +132 -23
  234. package/dist/core/common/services/crud.service.js.map +1 -1
  235. package/dist/core/common/services/model-doc.service.js +1 -1
  236. package/dist/core/common/services/model-doc.service.js.map +1 -1
  237. package/dist/core/common/services/module.service.d.ts +9 -2
  238. package/dist/core/common/services/module.service.js +51 -6
  239. package/dist/core/common/services/module.service.js.map +1 -1
  240. package/dist/core/common/types/field-selection.type.d.ts +1 -1
  241. package/dist/core/common/types/id.type.d.ts +4 -4
  242. package/dist/core/common/types/object-id-like.type.d.ts +3 -0
  243. package/dist/core/common/types/object-id-like.type.js +2 -0
  244. package/dist/core/common/types/object-id-like.type.js.map +1 -0
  245. package/dist/core/common/types/populate-config.type.d.ts +1 -1
  246. package/dist/core/common/types/string-or-object-id.type.d.ts +2 -2
  247. package/dist/core/modules/ai/core-ai.constants.d.ts +4 -0
  248. package/dist/core/modules/ai/core-ai.constants.js +4 -0
  249. package/dist/core/modules/ai/core-ai.constants.js.map +1 -1
  250. package/dist/core/modules/ai/core-ai.module.js +21 -17
  251. package/dist/core/modules/ai/core-ai.module.js.map +1 -1
  252. package/dist/core/modules/ai/models/core-ai-budget-limit.model.d.ts +2 -92
  253. package/dist/core/modules/ai/models/core-ai-budget-limit.model.js +1 -1
  254. package/dist/core/modules/ai/models/core-ai-budget-limit.model.js.map +1 -1
  255. package/dist/core/modules/ai/models/core-ai-connection-preference.model.d.ts +2 -87
  256. package/dist/core/modules/ai/models/core-ai-connection-preference.model.js +1 -1
  257. package/dist/core/modules/ai/models/core-ai-connection-preference.model.js.map +1 -1
  258. package/dist/core/modules/ai/models/core-ai-connection.model.d.ts +2 -177
  259. package/dist/core/modules/ai/models/core-ai-connection.model.js +1 -1
  260. package/dist/core/modules/ai/models/core-ai-connection.model.js.map +1 -1
  261. package/dist/core/modules/ai/models/core-ai-conversation.model.d.ts +2 -92
  262. package/dist/core/modules/ai/models/core-ai-conversation.model.js +3 -4
  263. package/dist/core/modules/ai/models/core-ai-conversation.model.js.map +1 -1
  264. package/dist/core/modules/ai/models/core-ai-interaction.model.d.ts +2 -120
  265. package/dist/core/modules/ai/models/core-ai-interaction.model.js +2 -3
  266. package/dist/core/modules/ai/models/core-ai-interaction.model.js.map +1 -1
  267. package/dist/core/modules/ai/models/core-ai-mcp-oauth.models.d.ts +3 -0
  268. package/dist/core/modules/ai/models/core-ai-mcp-oauth.models.js +21 -0
  269. package/dist/core/modules/ai/models/core-ai-mcp-oauth.models.js.map +1 -0
  270. package/dist/core/modules/ai/models/core-ai-mode.model.d.ts +2 -102
  271. package/dist/core/modules/ai/models/core-ai-mode.model.js +1 -1
  272. package/dist/core/modules/ai/models/core-ai-mode.model.js.map +1 -1
  273. package/dist/core/modules/ai/models/core-ai-prompt-hint.model.d.ts +2 -97
  274. package/dist/core/modules/ai/models/core-ai-prompt-hint.model.js +1 -1
  275. package/dist/core/modules/ai/models/core-ai-prompt-hint.model.js.map +1 -1
  276. package/dist/core/modules/ai/models/core-ai-prompt.model.d.ts +2 -112
  277. package/dist/core/modules/ai/models/core-ai-prompt.model.js +1 -1
  278. package/dist/core/modules/ai/models/core-ai-prompt.model.js.map +1 -1
  279. package/dist/core/modules/ai/models/core-ai-slot.model.d.ts +2 -112
  280. package/dist/core/modules/ai/models/core-ai-slot.model.js +1 -1
  281. package/dist/core/modules/ai/models/core-ai-slot.model.js.map +1 -1
  282. package/dist/core/modules/ai/models/core-ai-tool-grant.model.d.ts +2 -97
  283. package/dist/core/modules/ai/models/core-ai-tool-grant.model.js +1 -1
  284. package/dist/core/modules/ai/models/core-ai-tool-grant.model.js.map +1 -1
  285. package/dist/core/modules/ai/models/core-ai-tool-policy.model.d.ts +2 -103
  286. package/dist/core/modules/ai/models/core-ai-tool-policy.model.js +1 -1
  287. package/dist/core/modules/ai/models/core-ai-tool-policy.model.js.map +1 -1
  288. package/dist/core/modules/ai/services/core-ai-budget.service.d.ts +3 -1
  289. package/dist/core/modules/ai/services/core-ai-budget.service.js +15 -5
  290. package/dist/core/modules/ai/services/core-ai-budget.service.js.map +1 -1
  291. package/dist/core/modules/ai/services/core-ai-connection-preference.service.d.ts +1 -1
  292. package/dist/core/modules/ai/services/core-ai-connection-preference.service.js +6 -10
  293. package/dist/core/modules/ai/services/core-ai-connection-preference.service.js.map +1 -1
  294. package/dist/core/modules/ai/services/core-ai-connection.service.d.ts +1 -1
  295. package/dist/core/modules/ai/services/core-ai-connection.service.js +20 -42
  296. package/dist/core/modules/ai/services/core-ai-connection.service.js.map +1 -1
  297. package/dist/core/modules/ai/services/core-ai-conversation.service.d.ts +1 -1
  298. package/dist/core/modules/ai/services/core-ai-conversation.service.js +28 -29
  299. package/dist/core/modules/ai/services/core-ai-conversation.service.js.map +1 -1
  300. package/dist/core/modules/ai/services/core-ai-interaction.service.d.ts +1 -1
  301. package/dist/core/modules/ai/services/core-ai-interaction.service.js +3 -4
  302. package/dist/core/modules/ai/services/core-ai-interaction.service.js.map +1 -1
  303. package/dist/core/modules/ai/services/core-ai-mcp-oauth.service.d.ts +8 -0
  304. package/dist/core/modules/ai/services/core-ai-mcp-oauth.service.js +70 -18
  305. package/dist/core/modules/ai/services/core-ai-mcp-oauth.service.js.map +1 -1
  306. package/dist/core/modules/ai/services/core-ai-mode.service.d.ts +1 -1
  307. package/dist/core/modules/ai/services/core-ai-mode.service.js +3 -7
  308. package/dist/core/modules/ai/services/core-ai-mode.service.js.map +1 -1
  309. package/dist/core/modules/ai/services/core-ai-prompt-hint.service.d.ts +8 -1
  310. package/dist/core/modules/ai/services/core-ai-prompt-hint.service.js +32 -26
  311. package/dist/core/modules/ai/services/core-ai-prompt-hint.service.js.map +1 -1
  312. package/dist/core/modules/ai/services/core-ai-prompt.service.d.ts +1 -1
  313. package/dist/core/modules/ai/services/core-ai-prompt.service.js +10 -13
  314. package/dist/core/modules/ai/services/core-ai-prompt.service.js.map +1 -1
  315. package/dist/core/modules/ai/services/core-ai-slot.service.d.ts +1 -1
  316. package/dist/core/modules/ai/services/core-ai-slot.service.js +14 -25
  317. package/dist/core/modules/ai/services/core-ai-slot.service.js.map +1 -1
  318. package/dist/core/modules/ai/services/core-ai-tool-grant.service.d.ts +1 -1
  319. package/dist/core/modules/ai/services/core-ai-tool-grant.service.js +6 -18
  320. package/dist/core/modules/ai/services/core-ai-tool-grant.service.js.map +1 -1
  321. package/dist/core/modules/ai/services/core-ai-tool-policy.service.d.ts +1 -1
  322. package/dist/core/modules/ai/services/core-ai-tool-policy.service.js +4 -8
  323. package/dist/core/modules/ai/services/core-ai-tool-policy.service.js.map +1 -1
  324. package/dist/core/modules/api-token/core-api-token.model.js +1 -1
  325. package/dist/core/modules/api-token/core-api-token.model.js.map +1 -1
  326. package/dist/core/modules/api-token/core-api-token.module.js +3 -2
  327. package/dist/core/modules/api-token/core-api-token.module.js.map +1 -1
  328. package/dist/core/modules/api-token/core-api-token.service.d.ts +8 -2
  329. package/dist/core/modules/api-token/core-api-token.service.js +106 -39
  330. package/dist/core/modules/api-token/core-api-token.service.js.map +1 -1
  331. package/dist/core/modules/auth/core-auth.module.js +2 -0
  332. package/dist/core/modules/auth/core-auth.module.js.map +1 -1
  333. package/dist/core/modules/auth/guards/legacy-auth-rate-limit.guard.js +1 -2
  334. package/dist/core/modules/auth/guards/legacy-auth-rate-limit.guard.js.map +1 -1
  335. package/dist/core/modules/auth/guards/role-guard.token.d.ts +1 -0
  336. package/dist/core/modules/auth/guards/role-guard.token.js +2 -0
  337. package/dist/core/modules/auth/guards/role-guard.token.js.map +1 -0
  338. package/dist/core/modules/auth/services/core-auth.service.js +4 -2
  339. package/dist/core/modules/auth/services/core-auth.service.js.map +1 -1
  340. package/dist/core/modules/better-auth/better-auth-sql.helper.d.ts +6 -0
  341. package/dist/core/modules/better-auth/better-auth-sql.helper.js +113 -0
  342. package/dist/core/modules/better-auth/better-auth-sql.helper.js.map +1 -0
  343. package/dist/core/modules/better-auth/better-auth-token.service.d.ts +3 -1
  344. package/dist/core/modules/better-auth/better-auth-token.service.js +15 -24
  345. package/dist/core/modules/better-auth/better-auth-token.service.js.map +1 -1
  346. package/dist/core/modules/better-auth/better-auth.config.d.ts +7 -0
  347. package/dist/core/modules/better-auth/better-auth.config.js +16 -5
  348. package/dist/core/modules/better-auth/better-auth.config.js.map +1 -1
  349. package/dist/core/modules/better-auth/better-auth.types.d.ts +1 -1
  350. package/dist/core/modules/better-auth/core-better-auth-api.middleware.d.ts +1 -0
  351. package/dist/core/modules/better-auth/core-better-auth-api.middleware.js +6 -1
  352. package/dist/core/modules/better-auth/core-better-auth-api.middleware.js.map +1 -1
  353. package/dist/core/modules/better-auth/core-better-auth-challenge.service.js +30 -15
  354. package/dist/core/modules/better-auth/core-better-auth-challenge.service.js.map +1 -1
  355. package/dist/core/modules/better-auth/core-better-auth-mongo.users.d.ts +10 -0
  356. package/dist/core/modules/better-auth/core-better-auth-mongo.users.js +24 -0
  357. package/dist/core/modules/better-auth/core-better-auth-mongo.users.js.map +1 -0
  358. package/dist/core/modules/better-auth/core-better-auth-sql.registry.d.ts +3 -0
  359. package/dist/core/modules/better-auth/core-better-auth-sql.registry.js +8 -0
  360. package/dist/core/modules/better-auth/core-better-auth-sql.registry.js.map +1 -0
  361. package/dist/core/modules/better-auth/core-better-auth-sql.store.d.ts +71 -0
  362. package/dist/core/modules/better-auth/core-better-auth-sql.store.js +190 -0
  363. package/dist/core/modules/better-auth/core-better-auth-sql.store.js.map +1 -0
  364. package/dist/core/modules/better-auth/core-better-auth-user.mapper.d.ts +24 -1
  365. package/dist/core/modules/better-auth/core-better-auth-user.mapper.js +308 -32
  366. package/dist/core/modules/better-auth/core-better-auth-user.mapper.js.map +1 -1
  367. package/dist/core/modules/better-auth/core-better-auth.module.d.ts +2 -0
  368. package/dist/core/modules/better-auth/core-better-auth.module.js +54 -32
  369. package/dist/core/modules/better-auth/core-better-auth.module.js.map +1 -1
  370. package/dist/core/modules/better-auth/core-better-auth.service.d.ts +7 -2
  371. package/dist/core/modules/better-auth/core-better-auth.service.js +61 -9
  372. package/dist/core/modules/better-auth/core-better-auth.service.js.map +1 -1
  373. package/dist/core/modules/file/core-file-info.model.d.ts +1 -2
  374. package/dist/core/modules/file/core-file-info.model.js +2 -2
  375. package/dist/core/modules/file/core-file-info.model.js.map +1 -1
  376. package/dist/core/modules/file/core-file.service.d.ts +5 -3
  377. package/dist/core/modules/file/core-file.service.js +16 -9
  378. package/dist/core/modules/file/core-file.service.js.map +1 -1
  379. package/dist/core/modules/file/file-metadata.helper.d.ts +1 -1
  380. package/dist/core/modules/file/file-metadata.helper.js +2 -2
  381. package/dist/core/modules/file/file-metadata.helper.js.map +1 -1
  382. package/dist/core/modules/file/file-metadata.models.d.ts +35 -0
  383. package/dist/core/modules/file/file-metadata.models.js +20 -0
  384. package/dist/core/modules/file/file-metadata.models.js.map +1 -0
  385. package/dist/core/modules/file/file-metadata.store.d.ts +6 -0
  386. package/dist/core/modules/file/file-metadata.store.js +77 -0
  387. package/dist/core/modules/file/file-metadata.store.js.map +1 -0
  388. package/dist/core/modules/file/file-storage.helper.d.ts +1 -0
  389. package/dist/core/modules/file/file-storage.helper.js +34 -0
  390. package/dist/core/modules/file/file-storage.helper.js.map +1 -1
  391. package/dist/core/modules/file/filesystem-file.helper.d.ts +1 -1
  392. package/dist/core/modules/file/filesystem-file.helper.js +4 -4
  393. package/dist/core/modules/file/filesystem-file.helper.js.map +1 -1
  394. package/dist/core/modules/file/s3-file.helper.d.ts +1 -1
  395. package/dist/core/modules/file/s3-file.helper.js +5 -5
  396. package/dist/core/modules/file/s3-file.helper.js.map +1 -1
  397. package/dist/core/modules/health-check/core-health-check.module.js +12 -2
  398. package/dist/core/modules/health-check/core-health-check.module.js.map +1 -1
  399. package/dist/core/modules/health-check/core-health-check.service.d.ts +4 -3
  400. package/dist/core/modules/health-check/core-health-check.service.js +26 -5
  401. package/dist/core/modules/health-check/core-health-check.service.js.map +1 -1
  402. package/dist/core/modules/hub/core-hub.controller.d.ts +1 -0
  403. package/dist/core/modules/hub/core-hub.controller.js +10 -0
  404. package/dist/core/modules/hub/core-hub.controller.js.map +1 -1
  405. package/dist/core/modules/hub/core-hub.service.js +1 -1
  406. package/dist/core/modules/hub/core-hub.service.js.map +1 -1
  407. package/dist/core/modules/hub/helpers/hub-client-js.helper.js +23 -0
  408. package/dist/core/modules/hub/helpers/hub-client-js.helper.js.map +1 -1
  409. package/dist/core/modules/hub/hub-action-messages.d.ts +2 -0
  410. package/dist/core/modules/hub/hub-action-messages.js +2 -0
  411. package/dist/core/modules/hub/hub-action-messages.js.map +1 -1
  412. package/dist/core/modules/hub/hub-nav.js +1 -0
  413. package/dist/core/modules/hub/hub-nav.js.map +1 -1
  414. package/dist/core/modules/hub/interfaces/hub-panels.interface.d.ts +17 -1
  415. package/dist/core/modules/hub/services/core-hub-db.service.d.ts +6 -1
  416. package/dist/core/modules/hub/services/core-hub-db.service.js +16 -14
  417. package/dist/core/modules/hub/services/core-hub-db.service.js.map +1 -1
  418. package/dist/core/modules/hub/services/core-hub-migrations.service.d.ts +5 -0
  419. package/dist/core/modules/hub/services/core-hub-migrations.service.js +74 -1
  420. package/dist/core/modules/hub/services/core-hub-migrations.service.js.map +1 -1
  421. package/dist/core/modules/hub/services/core-hub-sources.service.d.ts +2 -1
  422. package/dist/core/modules/hub/services/core-hub-sources.service.js +32 -0
  423. package/dist/core/modules/hub/services/core-hub-sources.service.js.map +1 -1
  424. package/dist/core/modules/hub/services/hub-query-profiler.service.js +1 -1
  425. package/dist/core/modules/hub/services/hub-query-profiler.service.js.map +1 -1
  426. package/dist/core/modules/migrate/cli/migrate-cli.d.ts +2 -0
  427. package/dist/core/modules/migrate/cli/migrate-cli.js +35 -1
  428. package/dist/core/modules/migrate/cli/migrate-cli.js.map +1 -1
  429. package/dist/core/modules/migrate/index.d.ts +3 -0
  430. package/dist/core/modules/migrate/index.js +3 -0
  431. package/dist/core/modules/migrate/index.js.map +1 -1
  432. package/dist/core/modules/migrate/migration-runner.d.ts +2 -2
  433. package/dist/core/modules/migrate/migration-runner.js.map +1 -1
  434. package/dist/core/modules/migrate/migration-state-store.interface.d.ts +16 -0
  435. package/dist/core/modules/migrate/migration-state-store.interface.js +2 -0
  436. package/dist/core/modules/migrate/migration-state-store.interface.js.map +1 -0
  437. package/dist/core/modules/migrate/migration.helper.d.ts +3 -2
  438. package/dist/core/modules/migrate/migration.helper.js +21 -6
  439. package/dist/core/modules/migrate/migration.helper.js.map +1 -1
  440. package/dist/core/modules/migrate/mongo-state-store.d.ts +5 -12
  441. package/dist/core/modules/migrate/mongo-state-store.js +30 -24
  442. package/dist/core/modules/migrate/mongo-state-store.js.map +1 -1
  443. package/dist/core/modules/migrate/sql-migration.helper.d.ts +4 -0
  444. package/dist/core/modules/migrate/sql-migration.helper.js +34 -0
  445. package/dist/core/modules/migrate/sql-migration.helper.js.map +1 -0
  446. package/dist/core/modules/migrate/sql-state-store.d.ts +24 -0
  447. package/dist/core/modules/migrate/sql-state-store.js +129 -0
  448. package/dist/core/modules/migrate/sql-state-store.js.map +1 -0
  449. package/dist/core/modules/system-setup/core-system-setup.service.d.ts +8 -0
  450. package/dist/core/modules/system-setup/core-system-setup.service.js +41 -25
  451. package/dist/core/modules/system-setup/core-system-setup.service.js.map +1 -1
  452. package/dist/core/modules/tenant/core-tenant-member.model.js +1 -1
  453. package/dist/core/modules/tenant/core-tenant-member.model.js.map +1 -1
  454. package/dist/core/modules/tenant/core-tenant-member.store.d.ts +2 -0
  455. package/dist/core/modules/tenant/core-tenant-member.store.js +6 -0
  456. package/dist/core/modules/tenant/core-tenant-member.store.js.map +1 -0
  457. package/dist/core/modules/tenant/core-tenant.guard.d.ts +8 -3
  458. package/dist/core/modules/tenant/core-tenant.guard.js +57 -28
  459. package/dist/core/modules/tenant/core-tenant.guard.js.map +1 -1
  460. package/dist/core/modules/tenant/core-tenant.module.js +3 -2
  461. package/dist/core/modules/tenant/core-tenant.module.js.map +1 -1
  462. package/dist/core/modules/tenant/core-tenant.service.d.ts +3 -1
  463. package/dist/core/modules/tenant/core-tenant.service.js +48 -28
  464. package/dist/core/modules/tenant/core-tenant.service.js.map +1 -1
  465. package/dist/core/modules/tus/core-tus.service.d.ts +1 -1
  466. package/dist/core/modules/tus/core-tus.service.js +8 -7
  467. package/dist/core/modules/tus/core-tus.service.js.map +1 -1
  468. package/dist/core/modules/tus/tus.module.js +1 -1
  469. package/dist/core/modules/tus/tus.module.js.map +1 -1
  470. package/dist/core/modules/user/core-user.model.d.ts +1 -1
  471. package/dist/core/modules/user/core-user.model.js +1 -1
  472. package/dist/core/modules/user/core-user.model.js.map +1 -1
  473. package/dist/core/modules/user/core-user.service.d.ts +3 -1
  474. package/dist/core/modules/user/core-user.service.js +71 -16
  475. package/dist/core/modules/user/core-user.service.js.map +1 -1
  476. package/dist/core.module.js +39 -5
  477. package/dist/core.module.js.map +1 -1
  478. package/dist/index.d.ts +26 -0
  479. package/dist/index.js +26 -0
  480. package/dist/index.js.map +1 -1
  481. package/dist/server/common/models/persistence.model.d.ts +1 -1
  482. package/dist/server/common/models/persistence.model.js +3 -3
  483. package/dist/server/common/models/persistence.model.js.map +1 -1
  484. package/dist/server/modules/file/file-info.model.d.ts +1 -77
  485. package/dist/server/modules/file/file-info.model.js +1 -1
  486. package/dist/server/modules/file/file-info.model.js.map +1 -1
  487. package/dist/server/modules/file/file.service.js +1 -1
  488. package/dist/server/modules/file/file.service.js.map +1 -1
  489. package/dist/server/modules/user/user.model.d.ts +2 -186
  490. package/dist/server/modules/user/user.model.js +4 -5
  491. package/dist/server/modules/user/user.model.js.map +1 -1
  492. package/dist/server/modules/user/user.module.js +4 -3
  493. package/dist/server/modules/user/user.module.js.map +1 -1
  494. package/dist/server/modules/user/user.service.d.ts +1 -1
  495. package/dist/server/modules/user/user.service.js +5 -8
  496. package/dist/server/modules/user/user.service.js.map +1 -1
  497. package/dist/test/test.helper.js +2 -2
  498. package/dist/test/test.helper.js.map +1 -1
  499. package/dist/types/graphql-upload.d.ts +10 -7
  500. package/docs/REQUEST-LIFECYCLE.md +6 -3
  501. package/docs/choosing-a-database.md +107 -0
  502. package/docs/native-driver-security.md +29 -0
  503. package/docs/security-overrides.md +15 -6
  504. package/migration-guides/12.0.x-to-12.1.x.md +255 -0
  505. package/package.json +75 -29
  506. package/src/core/common/decorators/unified-field.decorator.ts +11 -1
  507. package/src/core/common/filters/mongoose-cast-error.filter.ts +12 -6
  508. package/src/core/common/helpers/db.helper.ts +40 -25
  509. package/src/core/common/helpers/decorator.helper.ts +1 -1
  510. package/src/core/common/helpers/filter.helper.ts +2 -1
  511. package/src/core/common/helpers/gridfs.helper.ts +28 -9
  512. package/src/core/common/helpers/id.helper.ts +21 -4
  513. package/src/core/common/helpers/model.helper.ts +5 -6
  514. package/src/core/common/helpers/service.helper.ts +3 -3
  515. package/src/core/common/interfaces/server-options.interface.ts +118 -10
  516. package/src/core/common/interfaces/service-options.interface.ts +2 -2
  517. package/src/core/common/models/core-persistence.model.ts +3 -3
  518. package/src/core/common/persistence/core-persistence.lifecycle.ts +47 -0
  519. package/src/core/common/persistence/core-persistence.module.ts +109 -0
  520. package/src/core/common/persistence/data-source.config.ts +271 -0
  521. package/src/core/common/persistence/data-source.runtime.ts +351 -0
  522. package/src/core/common/persistence/data-store.interface.ts +155 -0
  523. package/src/core/common/persistence/expiry-sweep.ts +105 -0
  524. package/src/core/common/persistence/id-format.ts +43 -0
  525. package/src/core/common/persistence/infrastructure-locks.ts +66 -0
  526. package/src/core/common/persistence/inject-store.decorator.ts +16 -0
  527. package/src/core/common/persistence/lock-store.interface.ts +17 -0
  528. package/src/core/common/persistence/model-descriptor.interface.ts +90 -0
  529. package/src/core/common/persistence/model-metadata.registry.ts +285 -0
  530. package/src/core/common/persistence/mongo/collection-name.ts +87 -0
  531. package/src/core/common/persistence/mongo/declared-schema.view.ts +378 -0
  532. package/src/core/common/persistence/mongo/hex-object-id.ts +75 -0
  533. package/src/core/common/persistence/mongo/model-declarations.ts +135 -0
  534. package/src/core/common/persistence/mongo/mongo-packages.ts +130 -0
  535. package/src/core/common/persistence/mongo/mongoose-compat.ts +129 -0
  536. package/src/core/common/persistence/mongo/no-mongo-connection.module.ts +18 -0
  537. package/src/core/common/persistence/mongo-lock-store.ts +121 -0
  538. package/src/core/common/persistence/mongoose-data-store.ts +232 -0
  539. package/src/core/common/persistence/neutral-populate.ts +98 -0
  540. package/src/core/common/persistence/persisted-model.decorator.ts +61 -0
  541. package/src/core/common/persistence/persistence-runtime.registry.ts +152 -0
  542. package/src/core/common/persistence/persistence.tokens.ts +9 -0
  543. package/src/core/common/persistence/policies/audit.policy.ts +80 -0
  544. package/src/core/common/persistence/policies/password.policy.ts +69 -0
  545. package/src/core/common/persistence/policies/role-guard.policy.ts +74 -0
  546. package/src/core/common/persistence/policies/system-role.policy.ts +90 -0
  547. package/src/core/common/persistence/policies/tenant.policy.ts +245 -0
  548. package/src/core/common/persistence/routed-model.guard.ts +107 -0
  549. package/src/core/common/persistence/sql/mysql/mysql-data-store.ts +503 -0
  550. package/src/core/common/persistence/sql/mysql/mysql-executor.ts +281 -0
  551. package/src/core/common/persistence/sql/mysql/mysql-lock-store.ts +87 -0
  552. package/src/core/common/persistence/sql/mysql/mysql-schema.compiler.ts +424 -0
  553. package/src/core/common/persistence/sql/mysql/mysql-schema.migrator.ts +453 -0
  554. package/src/core/common/persistence/sql/mysql/mysql-session.ts +131 -0
  555. package/src/core/common/persistence/sql/mysql/mysql-update.compiler.ts +379 -0
  556. package/src/core/common/persistence/sql/mysql/mysql-where.compiler.ts +686 -0
  557. package/src/core/common/persistence/sql/postgres/postgres-lock-store.ts +76 -0
  558. package/src/core/common/persistence/sql/postgres/postgres-schema.compiler.ts +328 -0
  559. package/src/core/common/persistence/sql/postgres/postgres-schema.migrator.ts +448 -0
  560. package/src/core/common/persistence/sql/postgres/postgres-update.compiler.ts +310 -0
  561. package/src/core/common/persistence/sql/postgres/postgres-where.compiler.ts +638 -0
  562. package/src/core/common/persistence/sql/sql-cast.ts +227 -0
  563. package/src/core/common/persistence/sql/sql-data-store.ts +762 -0
  564. package/src/core/common/persistence/sql/sql-dialect.ts +85 -0
  565. package/src/core/common/persistence/sql/sql-errors.ts +49 -0
  566. package/src/core/common/persistence/sql/sql-executor.factory.ts +282 -0
  567. package/src/core/common/persistence/sql/sql-executor.interface.ts +57 -0
  568. package/src/core/common/persistence/sql/sql-naming.ts +133 -0
  569. package/src/core/common/persistence/sql/sql-schema.shared.ts +105 -0
  570. package/src/core/common/persistence/sql/sql-session.ts +158 -0
  571. package/src/core/common/persistence/sql/where-shared.ts +118 -0
  572. package/src/core/common/persistence/store-guards.ts +73 -0
  573. package/src/core/common/persistence/store-upsert.ts +36 -0
  574. package/src/core/common/persistence/unavailable-store.ts +63 -0
  575. package/src/core/common/persistence/unsupported-capability.error.ts +7 -0
  576. package/src/core/common/plugins/mongoose-audit-fields.plugin.ts +33 -74
  577. package/src/core/common/plugins/mongoose-id.plugin.ts +9 -0
  578. package/src/core/common/plugins/mongoose-password.plugin.ts +6 -62
  579. package/src/core/common/plugins/mongoose-role-guard.plugin.ts +11 -63
  580. package/src/core/common/plugins/mongoose-system-role.plugin.ts +7 -78
  581. package/src/core/common/plugins/mongoose-tenant.plugin.ts +23 -144
  582. package/src/core/common/scalars/upload.scalar.ts +8 -3
  583. package/src/core/common/services/core-cron-jobs.initializer.ts +1 -1
  584. package/src/core/common/services/core-cron-jobs.service.ts +33 -22
  585. package/src/core/common/services/crud.service.ts +166 -35
  586. package/src/core/common/services/model-doc.service.ts +1 -1
  587. package/src/core/common/services/module.service.ts +78 -6
  588. package/src/core/common/types/field-selection.type.ts +1 -1
  589. package/src/core/common/types/id.type.ts +2 -2
  590. package/src/core/common/types/object-id-like.type.ts +11 -0
  591. package/src/core/common/types/populate-config.type.ts +1 -1
  592. package/src/core/common/types/string-or-object-id.type.ts +2 -2
  593. package/src/core/modules/ai/README.md +15 -2
  594. package/src/core/modules/ai/core-ai.constants.ts +10 -0
  595. package/src/core/modules/ai/core-ai.module.ts +32 -17
  596. package/src/core/modules/ai/models/core-ai-budget-limit.model.ts +2 -2
  597. package/src/core/modules/ai/models/core-ai-connection-preference.model.ts +2 -2
  598. package/src/core/modules/ai/models/core-ai-connection.model.ts +2 -2
  599. package/src/core/modules/ai/models/core-ai-conversation.model.ts +8 -4
  600. package/src/core/modules/ai/models/core-ai-interaction.model.ts +3 -3
  601. package/src/core/modules/ai/models/core-ai-mcp-oauth.models.ts +46 -0
  602. package/src/core/modules/ai/models/core-ai-mode.model.ts +2 -2
  603. package/src/core/modules/ai/models/core-ai-prompt-hint.model.ts +2 -2
  604. package/src/core/modules/ai/models/core-ai-prompt.model.ts +2 -2
  605. package/src/core/modules/ai/models/core-ai-slot.model.ts +2 -2
  606. package/src/core/modules/ai/models/core-ai-tool-grant.model.ts +2 -2
  607. package/src/core/modules/ai/models/core-ai-tool-policy.model.ts +2 -2
  608. package/src/core/modules/ai/services/core-ai-budget.service.ts +22 -4
  609. package/src/core/modules/ai/services/core-ai-connection-preference.service.ts +6 -13
  610. package/src/core/modules/ai/services/core-ai-connection.service.ts +34 -44
  611. package/src/core/modules/ai/services/core-ai-conversation.service.ts +31 -29
  612. package/src/core/modules/ai/services/core-ai-interaction.service.ts +3 -3
  613. package/src/core/modules/ai/services/core-ai-mcp-oauth.service.ts +93 -20
  614. package/src/core/modules/ai/services/core-ai-mode.service.ts +3 -6
  615. package/src/core/modules/ai/services/core-ai-prompt-hint.service.ts +43 -26
  616. package/src/core/modules/ai/services/core-ai-prompt.service.ts +15 -12
  617. package/src/core/modules/ai/services/core-ai-slot.service.ts +20 -24
  618. package/src/core/modules/ai/services/core-ai-tool-grant.service.ts +17 -27
  619. package/src/core/modules/ai/services/core-ai-tool-policy.service.ts +7 -10
  620. package/src/core/modules/api-token/core-api-token.model.ts +1 -1
  621. package/src/core/modules/api-token/core-api-token.module.ts +4 -2
  622. package/src/core/modules/api-token/core-api-token.service.ts +118 -43
  623. package/src/core/modules/auth/core-auth.module.ts +2 -0
  624. package/src/core/modules/auth/guards/legacy-auth-rate-limit.guard.ts +4 -3
  625. package/src/core/modules/auth/guards/role-guard.token.ts +7 -0
  626. package/src/core/modules/auth/services/core-auth.service.ts +16 -2
  627. package/src/core/modules/better-auth/INTEGRATION-CHECKLIST.md +1 -1
  628. package/src/core/modules/better-auth/README.md +10 -1
  629. package/src/core/modules/better-auth/better-auth-sql.helper.ts +191 -0
  630. package/src/core/modules/better-auth/better-auth-token.service.ts +26 -35
  631. package/src/core/modules/better-auth/better-auth.config.ts +43 -7
  632. package/src/core/modules/better-auth/better-auth.types.ts +1 -1
  633. package/src/core/modules/better-auth/core-better-auth-api.middleware.ts +13 -1
  634. package/src/core/modules/better-auth/core-better-auth-challenge.service.ts +36 -18
  635. package/src/core/modules/better-auth/core-better-auth-mongo.users.ts +35 -0
  636. package/src/core/modules/better-auth/core-better-auth-sql.registry.ts +20 -0
  637. package/src/core/modules/better-auth/core-better-auth-sql.store.ts +309 -0
  638. package/src/core/modules/better-auth/core-better-auth-user.mapper.ts +418 -40
  639. package/src/core/modules/better-auth/core-better-auth.module.ts +71 -35
  640. package/src/core/modules/better-auth/core-better-auth.service.ts +81 -12
  641. package/src/core/modules/file/README.md +16 -3
  642. package/src/core/modules/file/core-file-info.model.ts +2 -2
  643. package/src/core/modules/file/core-file.service.ts +27 -18
  644. package/src/core/modules/file/file-metadata.helper.ts +7 -3
  645. package/src/core/modules/file/file-metadata.models.ts +44 -0
  646. package/src/core/modules/file/file-metadata.store.ts +109 -0
  647. package/src/core/modules/file/file-storage.helper.ts +47 -2
  648. package/src/core/modules/file/filesystem-file.helper.ts +11 -8
  649. package/src/core/modules/file/s3-file.helper.ts +11 -7
  650. package/src/core/modules/health-check/core-health-check.module.ts +16 -2
  651. package/src/core/modules/health-check/core-health-check.service.ts +25 -3
  652. package/src/core/modules/hub/README.md +20 -11
  653. package/src/core/modules/hub/core-hub.controller.ts +5 -0
  654. package/src/core/modules/hub/core-hub.service.ts +1 -1
  655. package/src/core/modules/hub/helpers/hub-client-js.helper.ts +23 -0
  656. package/src/core/modules/hub/hub-action-messages.ts +6 -0
  657. package/src/core/modules/hub/hub-nav.ts +1 -0
  658. package/src/core/modules/hub/interfaces/hub-panels.interface.ts +8 -1
  659. package/src/core/modules/hub/services/core-hub-db.service.ts +35 -17
  660. package/src/core/modules/hub/services/core-hub-migrations.service.ts +96 -2
  661. package/src/core/modules/hub/services/core-hub-sources.service.ts +47 -1
  662. package/src/core/modules/hub/services/hub-query-profiler.service.ts +1 -1
  663. package/src/core/modules/migrate/README.md +54 -0
  664. package/src/core/modules/migrate/cli/migrate-cli.ts +44 -3
  665. package/src/core/modules/migrate/index.ts +3 -0
  666. package/src/core/modules/migrate/migration-runner.ts +3 -2
  667. package/src/core/modules/migrate/migration-state-store.interface.ts +24 -0
  668. package/src/core/modules/migrate/migration.helper.ts +35 -10
  669. package/src/core/modules/migrate/mongo-state-store.ts +64 -65
  670. package/src/core/modules/migrate/sql-migration.helper.ts +48 -0
  671. package/src/core/modules/migrate/sql-state-store.ts +198 -0
  672. package/src/core/modules/system-setup/README.md +14 -2
  673. package/src/core/modules/system-setup/core-system-setup.service.ts +77 -45
  674. package/src/core/modules/tenant/README.md +9 -2
  675. package/src/core/modules/tenant/core-tenant-member.model.ts +1 -1
  676. package/src/core/modules/tenant/core-tenant-member.store.ts +13 -0
  677. package/src/core/modules/tenant/core-tenant.guard.ts +77 -24
  678. package/src/core/modules/tenant/core-tenant.module.ts +6 -3
  679. package/src/core/modules/tenant/core-tenant.service.ts +59 -42
  680. package/src/core/modules/tus/core-tus.service.ts +11 -12
  681. package/src/core/modules/tus/tus.module.ts +1 -1
  682. package/src/core/modules/user/core-user.model.ts +2 -2
  683. package/src/core/modules/user/core-user.service.ts +98 -20
  684. package/src/core.module.ts +60 -5
  685. package/src/index.ts +26 -0
  686. package/src/server/common/models/persistence.model.ts +4 -4
  687. package/src/server/modules/file/file-info.model.ts +1 -1
  688. package/src/server/modules/file/file.service.ts +1 -1
  689. package/src/server/modules/user/user.model.ts +10 -5
  690. package/src/server/modules/user/user.module.ts +9 -3
  691. package/src/server/modules/user/user.service.ts +9 -11
  692. package/src/test/test.helper.ts +2 -2
  693. package/src/types/graphql-upload.d.ts +10 -7
@@ -1,7 +1,8 @@
1
1
  import { Inject, Injectable, Logger } from '@nestjs/common';
2
- import { InjectModel } from '@nestjs/mongoose';
3
- import { Model } from 'mongoose';
2
+ import { InjectModel } from '../../../common/persistence/mongo/mongoose-compat.js';
3
+ import type { Model } from 'mongoose';
4
4
 
5
+ import { upsertRecord } from '../../../common/persistence/store-upsert.js';
5
6
  import { CrudService } from '../../../common/services/crud.service.js';
6
7
  import type { CoreModelConstructor } from '../../../common/types/core-model-constructor.type.js';
7
8
  import { AiToolGrantDocument, CoreAiToolGrant } from '../models/core-ai-tool-grant.model.js';
@@ -60,17 +61,14 @@ export class CoreAiToolGrantService extends CrudService<CoreAiToolGrant, CoreAiT
60
61
  const now = new Date();
61
62
  for (const c of candidates) {
62
63
  try {
63
- const grant = await this.mainDbModel
64
- .findOne({
65
- $or: [{ expiresAt: { $exists: false } }, { expiresAt: null }, { expiresAt: { $gt: now } }],
66
- decision: { $ne: 'deny' },
67
- enabled: { $ne: false },
68
- refId: c.refId,
69
- scope: c.scope,
70
- tool,
71
- })
72
- .lean<CoreAiToolGrant>()
73
- .exec();
64
+ const grant = await this.dataStore.findOne({
65
+ $or: [{ expiresAt: { $exists: false } }, { expiresAt: null }, { expiresAt: { $gt: now } }],
66
+ decision: { $ne: 'deny' },
67
+ enabled: { $ne: false },
68
+ refId: c.refId,
69
+ scope: c.scope,
70
+ tool,
71
+ });
74
72
  if (grant) {
75
73
  return c.scope;
76
74
  }
@@ -90,20 +88,12 @@ export class CoreAiToolGrantService extends CrudService<CoreAiToolGrant, CoreAiT
90
88
  return;
91
89
  }
92
90
  try {
93
- await this.mainDbModel
94
- .updateOne(
95
- { refId, scope, tool },
96
- {
97
- $set: {
98
- decision: 'allow',
99
- enabled: true,
100
- expiresAt: options?.expiresAt ?? null,
101
- },
102
- $setOnInsert: { refId, scope, tool },
103
- },
104
- { upsert: true },
105
- )
106
- .exec();
91
+ // Upserts on the unique (scope, refId, tool) index
92
+ await upsertRecord(
93
+ this.dataStore,
94
+ { refId, scope, tool },
95
+ { decision: 'allow', enabled: true, expiresAt: options?.expiresAt ?? null },
96
+ );
107
97
  } catch (err) {
108
98
  this.logger.warn(`Could not persist tool grant (${scope}:${refId}:${tool}): ${(err as Error).message}`);
109
99
  }
@@ -1,6 +1,6 @@
1
1
  import { Inject, Injectable, Logger } from '@nestjs/common';
2
- import { InjectModel } from '@nestjs/mongoose';
3
- import { Model } from 'mongoose';
2
+ import { InjectModel } from '../../../common/persistence/mongo/mongoose-compat.js';
3
+ import type { Model } from 'mongoose';
4
4
 
5
5
  import { CrudService } from '../../../common/services/crud.service.js';
6
6
  import type { CoreModelConstructor } from '../../../common/types/core-model-constructor.type.js';
@@ -77,14 +77,11 @@ export class CoreAiToolPolicyService extends CrudService<CoreAiToolPolicy, CoreA
77
77
 
78
78
  let policies: CoreAiToolPolicy[] = [];
79
79
  try {
80
- policies = await this.mainDbModel
81
- .find({
82
- $or: refCandidates.map((c) => ({ refId: c.refId ?? null, scope: c.scope })),
83
- enabled: { $ne: false },
84
- tool,
85
- })
86
- .lean<CoreAiToolPolicy[]>()
87
- .exec();
80
+ policies = (await this.dataStore.find({
81
+ $or: refCandidates.map((c) => ({ refId: c.refId ?? null, scope: c.scope })),
82
+ enabled: { $ne: false },
83
+ tool,
84
+ })) as CoreAiToolPolicy[];
88
85
  } catch {
89
86
  return undefined;
90
87
  }
@@ -1,5 +1,5 @@
1
1
  import { ObjectType } from '@nestjs/graphql';
2
- import { Schema } from '@nestjs/mongoose';
2
+ import { Schema } from '../../common/persistence/mongo/mongoose-compat.js';
3
3
 
4
4
  import { Restricted } from '../../common/decorators/restricted.decorator.js';
5
5
  import { UnifiedField } from '../../common/decorators/unified-field.decorator.js';
@@ -1,6 +1,7 @@
1
1
  import { DynamicModule, Global, MiddlewareConsumer, Module, NestModule, Type } from '@nestjs/common';
2
- import { MongooseModule, SchemaFactory } from '@nestjs/mongoose';
2
+ import { SchemaFactory } from '../../common/persistence/mongo/mongoose-compat.js';
3
3
 
4
+ import { CorePersistenceModule } from '../../common/persistence/core-persistence.module.js';
4
5
  import { API_TOKEN_MODEL_TOKEN } from './core-api-token.constants.js';
5
6
  import { CoreApiTokenMiddleware } from './core-api-token.middleware.js';
6
7
  import { CoreApiTokenModel } from './core-api-token.model.js';
@@ -36,7 +37,8 @@ export class CoreApiTokenModule implements NestModule {
36
37
  return {
37
38
  exports: [CoreApiTokenService],
38
39
  global: true,
39
- imports: [MongooseModule.forFeature([{ name: API_TOKEN_MODEL_TOKEN, schema }])],
40
+ // Database-neutral registration: the token model follows `database` like every other model
41
+ imports: [CorePersistenceModule.forFeature([{ name: API_TOKEN_MODEL_TOKEN, schema }])],
40
42
  module: CoreApiTokenModule,
41
43
  providers: [{ provide: CoreApiTokenService, useClass: options.service || CoreApiTokenService }],
42
44
  };
@@ -11,10 +11,17 @@ import {
11
11
  Optional,
12
12
  UnauthorizedException,
13
13
  } from '@nestjs/common';
14
- import { InjectConnection, InjectModel } from '@nestjs/mongoose';
15
- import { type Connection, Model, Types } from 'mongoose';
14
+ import { ModuleRef } from '@nestjs/core';
15
+ import { InjectConnection, InjectModel } from '../../common/persistence/mongo/mongoose-compat.js';
16
+ import type { Connection, Model } from 'mongoose';
17
+ import type { Types } from 'mongoose';
16
18
 
17
19
  import { RoleEnum } from '../../common/enums/role.enum.js';
20
+ import type { DataStore } from '../../common/persistence/data-store.interface.js';
21
+ import { isWellFormedId } from '../../common/persistence/id-format.js';
22
+ import { getModelDescriptor } from '../../common/persistence/model-metadata.registry.js';
23
+ import { getStoreForModel } from '../../common/persistence/persistence-runtime.registry.js';
24
+ import { getStoreToken } from '../../common/persistence/persistence.tokens.js';
18
25
  import { ConfigService } from '../../common/services/config.service.js';
19
26
  import { CoreRedisService } from '../../common/services/core-redis.service.js';
20
27
  import { InMemoryRateLimitStore, RateLimitStore, RedisRateLimitStore } from '../../common/services/rate-limit-store.js';
@@ -44,6 +51,7 @@ import {
44
51
  } from './core-api-token.helpers.js';
45
52
  import { CoreApiTokenModel } from './core-api-token.model.js';
46
53
  import { ApiTokenOwnerIdentity, setApiTokenRevoker } from './core-api-token.registry.js';
54
+ import { newObjectId } from '../../common/persistence/mongo/mongoose-compat.js';
47
55
 
48
56
  /** Fields a caller can never set through a create/update input. */
49
57
  const PROTECTED_FIELDS = new Set([
@@ -65,6 +73,24 @@ const PROTECTED_FIELDS = new Set([
65
73
  ]);
66
74
 
67
75
  /** User fields never loaded onto a token-authenticated request user. */
76
+ /** Name of the user model whose store a token owner is loaded from on a SQL database */
77
+ const API_TOKEN_USER_MODEL = 'User';
78
+
79
+ /** A filter built for MongoDB (`_id`) as the neutral filter of a data store (`id`) */
80
+ function toNeutralFilter(filter: Record<string, unknown>): Record<string, unknown> {
81
+ const { _id, ...rest } = filter;
82
+ return _id === undefined ? rest : { ...rest, id: String(_id) };
83
+ }
84
+
85
+ /** A user record without the fields `USER_SECRET_PROJECTION` keeps out of a request user */
86
+ function withoutSecrets(record: Record<string, any>): Record<string, any> {
87
+ const copy = { ...record };
88
+ for (const field of Object.keys(USER_SECRET_PROJECTION)) {
89
+ delete copy[field];
90
+ }
91
+ return copy;
92
+ }
93
+
68
94
  const USER_SECRET_PROJECTION = {
69
95
  password: 0,
70
96
  passwordResetToken: 0,
@@ -161,8 +187,30 @@ export class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
161
187
  @Optional() @InjectConnection() protected readonly connection?: Connection,
162
188
  @Optional() protected readonly tenantService?: CoreTenantService,
163
189
  @Optional() protected readonly redisService?: CoreRedisService,
190
+ @Optional() protected readonly moduleRef?: ModuleRef,
164
191
  ) {}
165
192
 
193
+ /** The token store when the token model is routed to SQL; `undefined` keeps the Mongoose path (MongoDB) */
194
+ protected get tokenStore(): DataStore<any> | undefined {
195
+ const store = getStoreForModel(this.apiTokenModel);
196
+ return store && !store.capabilities.mongoosePopulate ? store : undefined;
197
+ }
198
+
199
+ /**
200
+ * The users' store when the user model (`User`) is routed to SQL: a token's owner is loaded from where the users
201
+ * live. `undefined` keeps the `users` collection, the document Better-Auth and the legacy strategy resolve on MongoDB.
202
+ * `protected` so a project whose user model has another name can return its store.
203
+ */
204
+ protected userStore(): DataStore<any> | undefined {
205
+ let store: DataStore<any> | undefined;
206
+ try {
207
+ store = this.moduleRef?.get(getStoreToken(API_TOKEN_USER_MODEL), { strict: false });
208
+ } catch {
209
+ return undefined;
210
+ }
211
+ return store && !store.capabilities.mongoosePopulate ? store : undefined;
212
+ }
213
+
166
214
  onModuleInit(): void {
167
215
  assertApiTokenConfigIsUsable();
168
216
  // Let the password-reset paths (Better-Auth hook, legacy resetPassword) revoke user tokens
@@ -262,10 +310,13 @@ export class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
262
310
  this.lastUsedWrites.clear();
263
311
  }
264
312
  this.lastUsedWrites.set(tokenId, now);
265
- this.apiTokenModel
266
- .updateOne({ _id: tokenId }, { $set: { lastUsedAt: new Date(now) } }, { timestamps: false })
267
- .exec()
268
- .catch((error: Error) => this.logger.debug(`lastUsedAt update failed: ${error.message}`));
313
+ const tokens = this.tokenStore;
314
+ const write = tokens
315
+ ? tokens.updateById(tokenId, { $set: { lastUsedAt: new Date(now) } }, { timestamps: false })
316
+ : this.apiTokenModel
317
+ .updateOne({ _id: tokenId }, { $set: { lastUsedAt: new Date(now) } }, { timestamps: false })
318
+ .exec();
319
+ write.catch((error: Error) => this.logger.debug(`lastUsedAt update failed: ${error.message}`));
269
320
  }
270
321
 
271
322
  /** A token that may authenticate right now: known, not revoked, not expired, kind enabled. */
@@ -273,11 +324,14 @@ export class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
273
324
  publicId: string,
274
325
  config: IResolvedApiTokenConfig,
275
326
  ): Promise<CoreApiTokenModel | null> {
276
- const token = (await this.apiTokenModel
277
- .findOne({ publicId })
278
- .select('+secretHash +signingKeyEncrypted')
279
- .lean()
280
- .exec()) as (CoreApiTokenModel & { _id: Types.ObjectId }) | null;
327
+ const tokens = this.tokenStore;
328
+ const token = (
329
+ tokens
330
+ ? await tokens
331
+ .findOne({ publicId }, { select: Object.keys(getModelDescriptor(tokens.modelName)?.fields ?? {}) })
332
+ .then((record) => record && { ...record, _id: record.id })
333
+ : await this.apiTokenModel.findOne({ publicId }).select('+secretHash +signingKeyEncrypted').lean().exec()
334
+ ) as (CoreApiTokenModel & { _id: Types.ObjectId | string }) | null;
281
335
  if (!token || token.revokedAt || (token.expiresAt && new Date(token.expiresAt).getTime() <= Date.now())) {
282
336
  return null;
283
337
  }
@@ -323,12 +377,15 @@ export class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
323
377
  * `protected` so a project with a different user store can override it.
324
378
  */
325
379
  protected async loadTokenUser(userId: string): Promise<null | Record<string, any>> {
326
- if (!this.connection || !userId || !Types.ObjectId.isValid(userId)) {
380
+ const users = this.userStore();
381
+ if ((!users && !this.connection) || !userId || !isWellFormedId(userId)) {
327
382
  return null;
328
383
  }
329
- const doc = await this.connection
330
- .collection('users')
331
- .findOne({ _id: new Types.ObjectId(userId) }, { projection: USER_SECRET_PROJECTION });
384
+ const doc = users
385
+ ? await users.findById(userId).then((record) => record && withoutSecrets({ ...record, _id: record.id }))
386
+ : await this.connection
387
+ .collection('users')
388
+ .findOne({ _id: newObjectId(userId) }, { projection: USER_SECRET_PROJECTION });
332
389
  if (!doc) {
333
390
  return null;
334
391
  }
@@ -425,12 +482,11 @@ export class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
425
482
  * or when the user is blocked. Returns the number of tokens revoked.
426
483
  */
427
484
  async revokeAllForUser(userId: string): Promise<number> {
428
- const result = await this.apiTokenModel
429
- .updateMany(
430
- { kind: ApiTokenKind.USER, revokedAt: null, user: String(userId) },
431
- { $set: { revokedAt: new Date() } },
432
- )
433
- .exec();
485
+ const active = { kind: ApiTokenKind.USER, revokedAt: null, user: String(userId) };
486
+ if (this.tokenStore) {
487
+ return this.tokenStore.updateMany(active, { $set: { revokedAt: new Date() } });
488
+ }
489
+ const result = await this.apiTokenModel.updateMany(active, { $set: { revokedAt: new Date() } }).exec();
434
490
  return result.modifiedCount ?? 0;
435
491
  }
436
492
 
@@ -441,19 +497,25 @@ export class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
441
497
  */
442
498
  async revokeAllForOwner(identity: ApiTokenOwnerIdentity): Promise<number> {
443
499
  let userId = identity?.userId;
444
- if (!userId && this.connection && (identity?.email || identity?.iamId)) {
500
+ const users = this.userStore();
501
+ if (!userId && (users || this.connection) && (identity?.email || identity?.iamId)) {
445
502
  const or: Record<string, string>[] = [];
446
503
  if (identity.email) or.push({ email: identity.email });
447
504
  if (identity.iamId) or.push({ iamId: identity.iamId });
448
- const doc = await this.connection.collection('users').findOne({ $or: or }, { projection: { _id: 1 } });
449
- userId = doc?._id?.toString();
505
+ userId = users
506
+ ? (await users.findOne({ $or: or }, { select: ['id'] }))?.id
507
+ : (await this.connection.collection('users').findOne({ $or: or }, { projection: { _id: 1 } }))?._id?.toString();
450
508
  }
451
509
  return userId ? this.revokeAllForUser(userId) : 0;
452
510
  }
453
511
 
454
512
  /** Delete every token of a user (system operation, no rights check) — call it when deleting the user. */
455
513
  async deleteAllForUser(userId: string): Promise<number> {
456
- const result = await this.apiTokenModel.deleteMany({ kind: ApiTokenKind.USER, user: String(userId) }).exec();
514
+ const owned = { kind: ApiTokenKind.USER, user: String(userId) };
515
+ if (this.tokenStore) {
516
+ return this.tokenStore.deleteMany(owned);
517
+ }
518
+ const result = await this.apiTokenModel.deleteMany(owned).exec();
457
519
  return result.deletedCount ?? 0;
458
520
  }
459
521
 
@@ -536,6 +598,9 @@ export class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
536
598
  if (!tenantId?.trim()) {
537
599
  throw new BadRequestException('tenantId must not be empty');
538
600
  }
601
+ if (this.tokenStore) {
602
+ return this.tokenStore.deleteMany({ tenant: tenantId });
603
+ }
539
604
  const result = await this.apiTokenModel.deleteMany({ tenant: tenantId }).exec();
540
605
  return result.deletedCount ?? 0;
541
606
  }
@@ -632,7 +697,7 @@ export class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
632
697
  const config = getApiTokenConfig();
633
698
  const { publicId, secret, token } = generateApiToken(config.prefix);
634
699
  const signingKey = generateApiTokenSigningKey();
635
- const created = await this.apiTokenModel.create({
700
+ const record = {
636
701
  ...document,
637
702
  createdBy: String(currentUser.id),
638
703
  publicId,
@@ -640,12 +705,18 @@ export class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
640
705
  secretHash: hashApiTokenSecret(secret),
641
706
  signingKeyEncrypted: this.encryptSigningKey(signingKey),
642
707
  updatedBy: String(currentUser.id),
643
- });
708
+ };
709
+ if (this.tokenStore) {
710
+ return { apiToken: this.toInfo(await this.tokenStore.insert(record)), signingKey, token };
711
+ }
712
+ const created = await this.apiTokenModel.create(record);
644
713
  return { apiToken: this.toInfo(created.toObject()), signingKey, token };
645
714
  }
646
715
 
647
716
  protected async list(filter: Record<string, unknown>): Promise<ApiTokenInfo[]> {
648
- const tokens = await this.apiTokenModel.find(filter).sort({ createdAt: -1 }).lean().exec();
717
+ const tokens = this.tokenStore
718
+ ? await this.tokenStore.find(toNeutralFilter(filter), { sort: { createdAt: -1 } })
719
+ : await this.apiTokenModel.find(filter).sort({ createdAt: -1 }).lean().exec();
649
720
  return tokens.map((token) => this.toInfo(token));
650
721
  }
651
722
 
@@ -654,10 +725,10 @@ export class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
654
725
  $set: Record<string, unknown>,
655
726
  currentUser: any,
656
727
  ): Promise<ApiTokenInfo> {
657
- const updated = await this.apiTokenModel
658
- .findOneAndUpdate(filter, { $set: { ...$set, updatedBy: String(currentUser.id) } }, { returnDocument: 'after' })
659
- .lean()
660
- .exec();
728
+ const update = { $set: { ...$set, updatedBy: String(currentUser.id) } };
729
+ const updated = this.tokenStore
730
+ ? await this.tokenStore.updateOne(toNeutralFilter(filter), update)
731
+ : await this.apiTokenModel.findOneAndUpdate(filter, update, { returnDocument: 'after' }).lean().exec();
661
732
  if (!updated) {
662
733
  throw new NotFoundException('API token not found');
663
734
  }
@@ -665,19 +736,21 @@ export class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
665
736
  }
666
737
 
667
738
  protected async applyRevoke(filter: Record<string, unknown>, currentUser: any): Promise<ApiTokenInfo> {
668
- const revoked = await this.apiTokenModel
669
- .findOneAndUpdate(
670
- { ...filter, revokedAt: null },
671
- { $set: { revokedAt: new Date(), updatedBy: String(currentUser.id) } },
672
- { returnDocument: 'after' },
673
- )
674
- .lean()
675
- .exec();
739
+ const revocation = { $set: { revokedAt: new Date(), updatedBy: String(currentUser.id) } };
740
+ const tokens = this.tokenStore;
741
+ const revoked = tokens
742
+ ? await tokens.updateOne(toNeutralFilter({ ...filter, revokedAt: null }), revocation)
743
+ : await this.apiTokenModel
744
+ .findOneAndUpdate({ ...filter, revokedAt: null }, revocation, { returnDocument: 'after' })
745
+ .lean()
746
+ .exec();
676
747
  if (revoked) {
677
748
  return this.toInfo(revoked);
678
749
  }
679
750
  // Already revoked: answer with the current state rather than an error.
680
- const existing = await this.apiTokenModel.findOne(filter).lean().exec();
751
+ const existing = tokens
752
+ ? await tokens.findOne(toNeutralFilter(filter))
753
+ : await this.apiTokenModel.findOne(filter).lean().exec();
681
754
  if (!existing) {
682
755
  throw new NotFoundException('API token not found');
683
756
  }
@@ -685,7 +758,9 @@ export class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
685
758
  }
686
759
 
687
760
  protected async applyDelete(filter: Record<string, unknown>): Promise<ApiTokenInfo> {
688
- const deleted = await this.apiTokenModel.findOneAndDelete(filter).lean().exec();
761
+ const deleted = this.tokenStore
762
+ ? await this.tokenStore.deleteOne(toNeutralFilter(filter))
763
+ : await this.apiTokenModel.findOneAndDelete(filter).lean().exec();
689
764
  if (!deleted) {
690
765
  throw new NotFoundException('API token not found');
691
766
  }
@@ -705,7 +780,7 @@ export class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
705
780
  if (typeof tokenId !== 'string' || !/^[0-9a-f]{24}$/i.test(tokenId)) {
706
781
  throw new NotFoundException('API token not found');
707
782
  }
708
- return new Types.ObjectId(tokenId);
783
+ return newObjectId(tokenId);
709
784
  }
710
785
 
711
786
  protected commonUpdate(input: IUpdateApiTokenInput, config: IResolvedApiTokenConfig): Record<string, unknown> {
@@ -9,6 +9,7 @@ import { CoreRedisService } from '../../common/services/core-redis.service.js';
9
9
  import { AuthGuardStrategy } from './auth-guard-strategy.enum.js';
10
10
  import { LegacyAuthRateLimitGuard } from './guards/legacy-auth-rate-limit.guard.js';
11
11
  import { RolesGuardRegistry } from './guards/roles-guard-registry.js';
12
+ import { ROLE_GUARD } from './guards/role-guard.token.js';
12
13
  import { RolesGuard } from './guards/roles.guard.js';
13
14
  import { CoreAuthUserService } from './services/core-auth-user.service.js';
14
15
  import { CoreAuthService } from './services/core-auth.service.js';
@@ -59,6 +60,7 @@ export class CoreAuthModule {
59
60
  return [
60
61
  RolesGuard, // Register as regular provider first
61
62
  { provide: APP_GUARD, useExisting: RolesGuard }, // Reference the registered provider
63
+ { provide: ROLE_GUARD, useExisting: RolesGuard }, // How CoreTenantGuard reaches it
62
64
  ];
63
65
  })();
64
66
 
@@ -76,9 +76,10 @@ export class LegacyAuthRateLimitGuard implements CanActivate {
76
76
  const request = context.switchToHttp().getRequest();
77
77
  const ip = this.getClientIp(request);
78
78
 
79
- // Get endpoint from URL path
80
- const url = request.url || request.path || '';
81
- const endpoint = url.split('/').pop() || 'unknown';
79
+ // The handler, never the URL: the URL carries the query string and the client's spelling of the path
80
+ // (Express routes case-insensitively and ignores a trailing slash), so every variant was a fresh bucket and
81
+ // `/auth/signin?n=1`, `?n=2`, … guessed passwords without ever reaching the limit.
82
+ const endpoint = context.getHandler()?.name || 'unknown';
82
83
 
83
84
  return { endpoint, ip };
84
85
  }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * DI token under which the module that registers the global role guard (`RolesGuard` in `CoreAuthModule`,
3
+ * `BetterAuthRolesGuard` in `CoreBetterAuthModule`) also provides it — so `CoreTenantGuard` reaches the role guard of
4
+ * its own application without importing it. Import-free leaf (see `.claude/rules/architecture.md` → "DI Token
5
+ * Placement (SWC-Safe)").
6
+ */
7
+ export const ROLE_GUARD = 'LtRoleGuard';
@@ -130,16 +130,30 @@ export class CoreAuthService {
130
130
  throw new UnauthorizedException(ErrorCode.INVALID_TOKEN);
131
131
  }
132
132
 
133
+ // A device is ended by writing `null` for it, not by deleting its key: update() MERGES the input into the stored
134
+ // record, so a key that is merely missing from the input survives — and with it the refresh token this logout
135
+ // must end. `validateUser()` reads a `null` device as "not signed in".
136
+ const ended = (deviceIds: string[]) => Object.fromEntries(deviceIds.map((id) => [id, null]));
137
+
133
138
  // Logout from all devices
134
139
  if (serviceOptions.allDevices) {
140
+ const deviceIds = Object.keys(user.refreshTokens);
135
141
  user.refreshTokens = {};
136
- await this.userService.update(user.id, { refreshTokens: {} }, serviceOptions);
142
+ await this.userService.update(
143
+ user.id,
144
+ { refreshTokens: ended(deviceIds), tempTokens: ended(Object.keys(user.tempTokens ?? {})) },
145
+ serviceOptions,
146
+ );
137
147
  return true;
138
148
  }
139
149
 
140
150
  // Logout from specific devices
141
151
  delete user.refreshTokens[deviceId];
142
- await this.userService.update(user.id, { refreshTokens: user.refreshTokens }, serviceOptions);
152
+ await this.userService.update(
153
+ user.id,
154
+ { refreshTokens: ended([deviceId]), tempTokens: ended([deviceId]) },
155
+ serviceOptions,
156
+ );
143
157
  return true;
144
158
  }
145
159
 
@@ -673,7 +673,7 @@ In JWT mode (`cookies: false`), the server stores WebAuthn challenges in the dat
673
673
 
674
674
  | Mode | Challenge Storage | Client Approach |
675
675
  | ----------------------------------- | -------------------------------------------------- | ----------------------- |
676
- | Cookie (`cookies: true` or not set) | Cookie (`better-auth.better-auth-passkey`) | Either approach works |
676
+ | Cookie (`cookies: true` or not set) | Cookie (`iam.better-auth-passkey`) | Either approach works |
677
677
  | JWT (`cookies: false`) | Database with `challengeId` mapping (auto-enabled) | **Must use composable** |
678
678
 
679
679
  **Note:** Database challenge storage is automatically enabled when `options.cookies: false` is set. No additional configuration is required.
@@ -1083,6 +1083,15 @@ social sign-in after the upgrade — see
1083
1083
  > `providerId` alone on purpose, so they keep working on rows the backfill has not reached yet —
1084
1084
  > which matters most when the backfill has failed.
1085
1085
 
1086
+ ### Storage on a SQL source
1087
+
1088
+ When the user model (table `users`) is routed to a SQL source through `database`, Better-Auth follows it: it runs its
1089
+ built-in Kysely adapter on that source's application pool and shares ONE `users` row per user with the user model.
1090
+ Its tables are snake_case (`session`, `account`, `verification`, `jwks`, `two_factor`, `passkey`), ids keep the
1091
+ ObjectId format, and its migrations run at boot as the owner (`database.ownerUrl`) — without an owner connection the
1092
+ boot stops while any are pending. The two MongoDB steps above are skipped there. Nothing is copied from MongoDB.
1093
+ Details: `.claude/rules/better-auth.md` §11.
1094
+
1086
1095
  ---
1087
1096
 
1088
1097
  ## Module Setup
@@ -1757,7 +1766,7 @@ const legacyToken = await authService.signIn({ email, password });
1757
1766
 
1758
1767
  ### Key Points
1759
1768
 
1760
- 1. **Shared Users Collection**: Both systems use the same `users` MongoDB collection
1769
+ 1. **Shared Users Collection**: Both systems use the same `users` collection — on MongoDB, or one `users` table when the user model is routed to a SQL source (see [Storage on a SQL source](#storage-on-a-sql-source))
1761
1770
  2. **bcrypt Compatibility**: Both systems use bcrypt - passwords work with either system
1762
1771
  3. **User Linking**: When a user logs in via Better-Auth, `iamId` is set to link them
1763
1772
  4. **Role Preservation**: User roles work with both systems