@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
@@ -10,24 +10,31 @@ import {
10
10
  Type,
11
11
  } from '@nestjs/common';
12
12
  import { APP_GUARD } from '@nestjs/core';
13
- import { getConnectionToken } from '@nestjs/mongoose';
14
- import mongoose, { Connection } from 'mongoose';
13
+ import { getConnectionToken } from '../../common/persistence/mongo/mongoose-compat.js';
14
+ import type { Connection } from 'mongoose';
15
15
 
16
16
  import { maskEmail } from '../../common/helpers/logging.helper.js';
17
+ import { getPersistenceRuntime } from '../../common/persistence/persistence-runtime.registry.js';
17
18
  import { IBetterAuth, ICorsConfig } from '../../common/interfaces/server-options.interface.js';
18
19
  import { BrevoService } from '../../common/services/brevo.service.js';
19
20
  import { ConfigService } from '../../common/services/config.service.js';
20
21
  import { RolesGuardRegistry } from '../auth/guards/roles-guard-registry.js';
22
+ import { ROLE_GUARD } from '../auth/guards/role-guard.token.js';
21
23
  import { isLegacyEndpointEnabled } from '../auth/helpers/legacy-endpoints.helper.js';
22
24
  import { BetterAuthRolesGuard } from './better-auth-roles.guard.js';
23
25
  import { BetterAuthTokenService } from './better-auth-token.service.js';
24
26
  import {
25
27
  AuthEmailCallbackOptions,
26
28
  BetterAuthInstance,
29
+ buildBetterAuthOptions,
30
+ type CreateBetterAuthOptions,
27
31
  CreateBetterAuthResult,
28
- createBetterAuthInstance,
32
+ instantiateBetterAuth,
29
33
  OnPasswordResetCallback,
30
34
  } from './better-auth.config.js';
35
+ import { applyBetterAuthSchema } from './better-auth-sql.helper.js';
36
+ import { getBetterAuthSqlStore, setBetterAuthSqlStore } from './core-better-auth-sql.registry.js';
37
+ import { BetterAuthSqlStore, type IamSqlQueryable } from './core-better-auth-sql.store.js';
31
38
  import { DefaultBetterAuthResolver } from './better-auth.resolver.js';
32
39
  import { CoreBetterAuthApiMiddleware } from './core-better-auth-api.middleware.js';
33
40
  import { CoreBetterAuthChallengeService } from './core-better-auth-challenge.service.js';
@@ -48,6 +55,8 @@ import {
48
55
  } from './core-better-auth.registry.js';
49
56
  import { CoreBetterAuthResolver } from './core-better-auth.resolver.js';
50
57
  import { CoreBetterAuthService } from './core-better-auth.service.js';
58
+ import { newObjectId } from '../../common/persistence/mongo/mongoose-compat.js';
59
+ import { requireMongoPackages } from '../../common/persistence/mongo/mongo-packages.js';
51
60
 
52
61
  /**
53
62
  * @deprecated Import from `./core-better-auth.constants` instead. Re-exported only
@@ -464,6 +473,38 @@ export class CoreBetterAuthModule implements NestModule, OnModuleInit {
464
473
  }
465
474
  }
466
475
 
476
+ /**
477
+ * Better-Auth on the database the `users` table lives in (one row per user, shared with the user model): on a SQL
478
+ * source its adapter runs on that source's application pool, and its tables are brought up to date before the
479
+ * instance exists — Better-Auth validates its schema as it starts.
480
+ */
481
+ private static async createInstance(options: CreateBetterAuthOptions): Promise<CreateBetterAuthResult | null> {
482
+ const storage = await getPersistenceRuntime()?.iamStorage();
483
+ setBetterAuthSqlStore(undefined);
484
+ const built = buildBetterAuthOptions({ ...options, sqlPool: storage?.pool });
485
+ if (!built) {
486
+ return null;
487
+ }
488
+ if (storage) {
489
+ await applyBetterAuthSchema(built.options, storage);
490
+ }
491
+ const result = instantiateBetterAuth(built);
492
+ if (storage) {
493
+ setBetterAuthSqlStore(new BetterAuthSqlStore(storage.users, result.instance, storage.pool as IamSqlQueryable));
494
+ }
495
+ return result;
496
+ }
497
+
498
+ /** The MongoDB database Better-Auth's adapter runs on, once the connection is up */
499
+ private static async mongoDatabase(): Promise<unknown> {
500
+ await this.waitForMongoConnection();
501
+ const db = requireMongoPackages('Better-Auth on MongoDB').mongoose.connection.db;
502
+ if (!db) {
503
+ throw new Error('MongoDB database not available');
504
+ }
505
+ return db;
506
+ }
507
+
467
508
  /**
468
509
  * Waits for mongoose connection to be ready using polling
469
510
  * This is more reliable than event-based waiting in test environments
@@ -472,6 +513,7 @@ export class CoreBetterAuthModule implements NestModule, OnModuleInit {
472
513
  private static async waitForMongoConnection(): Promise<void> {
473
514
  const maxAttempts = 60; // 60 attempts * 500ms = 30 seconds max
474
515
  const pollInterval = 500;
516
+ const { mongoose } = requireMongoPackages('Better-Auth on MongoDB (the user model is not routed to a SQL source)');
475
517
 
476
518
  for (let attempt = 0; attempt < maxAttempts; attempt++) {
477
519
  // Check if already connected
@@ -687,12 +729,9 @@ export class CoreBetterAuthModule implements NestModule, OnModuleInit {
687
729
  // Enable middleware registration
688
730
  this.betterAuthEnabled = true;
689
731
 
690
- await this.waitForMongoConnection();
691
-
692
- const db = mongoose.connection.db;
693
- if (!db) {
694
- throw new Error('MongoDB database not available');
695
- }
732
+ // On a SQL source Better-Auth runs on that source's pool (createInstance()); MongoDB is neither awaited
733
+ // nor needed then — a project on PostgreSQL alone has none
734
+ const db = (await getPersistenceRuntime()?.iamStorage()) ? undefined : await this.mongoDatabase();
696
735
 
697
736
  this.configServiceInstance = configService;
698
737
 
@@ -706,7 +745,7 @@ export class CoreBetterAuthModule implements NestModule, OnModuleInit {
706
745
 
707
746
  // Note: Secret validation is now handled in createBetterAuthInstance
708
747
  // with fallback to jwt.secret, jwt.refresh.secret, or auto-generation
709
- const result = createBetterAuthInstance({
748
+ const result = await this.createInstance({
710
749
  config,
711
750
  db,
712
751
  fallbackSecrets,
@@ -802,6 +841,7 @@ export class CoreBetterAuthModule implements NestModule, OnModuleInit {
802
841
  */
803
842
  static reset(): void {
804
843
  this.authInstance = null;
844
+ setBetterAuthSqlStore(undefined);
805
845
  this.initialized = false;
806
846
  this.initLogged = false;
807
847
  this.betterAuthEnabled = false;
@@ -894,12 +934,16 @@ export class CoreBetterAuthModule implements NestModule, OnModuleInit {
894
934
  // This callback is called by Better-Auth when email is verified
895
935
  // Sync nest-server's verified/verifiedAt fields with Better-Auth's emailVerified
896
936
  try {
937
+ const sql = getBetterAuthSqlStore();
897
938
  const db = this.mongoConnection?.db;
898
- if (db) {
899
- const { ObjectId } = await import('mongodb');
939
+ if (sql) {
940
+ // One row per user on SQL: Better-Auth's user id is the row's id
941
+ await sql.updateUser({ id: userId }, { verified: true, verifiedAt: new Date() });
942
+ this.logger.debug(`Email verified for user ${userId} - synced verified/verifiedAt`);
943
+ } else if (db) {
900
944
  await db
901
945
  .collection('users')
902
- .updateOne({ _id: new ObjectId(userId) }, { $set: { verified: true, verifiedAt: new Date() } });
946
+ .updateOne({ _id: newObjectId(userId) }, { $set: { verified: true, verifiedAt: new Date() } });
903
947
  this.logger.debug(`Email verified for user ${userId} - synced verified/verifiedAt`);
904
948
  } else {
905
949
  this.logger.warn(`Cannot sync verifiedAt for user ${userId} - no database connection`);
@@ -1040,7 +1084,7 @@ export class CoreBetterAuthModule implements NestModule, OnModuleInit {
1040
1084
  inject: [getConnectionToken(), CoreBetterAuthEmailVerificationService, ConfigService],
1041
1085
  provide: BETTER_AUTH_INSTANCE,
1042
1086
  useFactory: async (
1043
- connection: Connection,
1087
+ connection: Connection | null,
1044
1088
  emailVerificationService: CoreBetterAuthEmailVerificationService,
1045
1089
  configService: ConfigService,
1046
1090
  ) => {
@@ -1067,26 +1111,13 @@ export class CoreBetterAuthModule implements NestModule, OnModuleInit {
1067
1111
  serverEnv: options?.serverEnv,
1068
1112
  };
1069
1113
 
1070
- // Connection is now guaranteed to be established
1071
- let result: CreateBetterAuthResult | null;
1072
- const db = connection.db;
1073
- if (!db) {
1074
- // Fallback to global mongoose if connection.db is not yet available
1075
- await this.waitForMongoConnection();
1076
- const globalDb = mongoose.connection.db;
1077
- if (!globalDb) {
1078
- throw new Error('MongoDB database not available');
1079
- }
1080
- result = createBetterAuthInstance({
1081
- ...sharedInstanceOptions,
1082
- db: globalDb,
1083
- });
1084
- } else {
1085
- result = createBetterAuthInstance({
1086
- ...sharedInstanceOptions,
1087
- db,
1088
- });
1089
- }
1114
+ // On a SQL source Better-Auth runs on that source's pool; on MongoDB on the injected connection, falling
1115
+ // back to the global mongoose connection while its database is not yet available
1116
+ const sqlStorage = await getPersistenceRuntime()?.iamStorage();
1117
+ const result: CreateBetterAuthResult | null = await this.createInstance({
1118
+ ...sharedInstanceOptions,
1119
+ db: sqlStorage ? undefined : (connection?.db ?? (await this.mongoDatabase())),
1120
+ });
1090
1121
  this.authInstance = result?.instance ?? null;
1091
1122
  this.resolvedCookieDomain = result?.cookieDomain;
1092
1123
 
@@ -1163,7 +1194,12 @@ export class CoreBetterAuthModule implements NestModule, OnModuleInit {
1163
1194
  ...(this.shouldRegisterRolesGuardGlobally && !RolesGuardRegistry.isRegistered()
1164
1195
  ? (() => {
1165
1196
  RolesGuardRegistry.markRegistered('CoreBetterAuthModule');
1166
- return [BetterAuthRolesGuard, { provide: APP_GUARD, useExisting: BetterAuthRolesGuard }];
1197
+ return [
1198
+ BetterAuthRolesGuard,
1199
+ { provide: APP_GUARD, useExisting: BetterAuthRolesGuard },
1200
+ // How CoreTenantGuard reaches it
1201
+ { provide: ROLE_GUARD, useExisting: BetterAuthRolesGuard },
1202
+ ];
1167
1203
  })()
1168
1204
  : []),
1169
1205
  ],
@@ -4,10 +4,11 @@ import {
4
4
  Injectable,
5
5
  Logger,
6
6
  OnApplicationBootstrap,
7
+ OnModuleDestroy,
7
8
  OnModuleInit,
8
9
  Optional,
9
10
  } from '@nestjs/common';
10
- import { InjectConnection } from '@nestjs/mongoose';
11
+ import { InjectConnection } from '../../common/persistence/mongo/mongoose-compat.js';
11
12
  import {
12
13
  freshSessionMiddleware,
13
14
  requestOnlySessionMiddleware,
@@ -19,6 +20,7 @@ import { importJWK, jwtVerify } from 'jose';
19
20
  import type { Connection } from 'mongoose';
20
21
 
21
22
  import { shouldConvertSessionTokenToJwt } from '../../common/helpers/cookies.helper.js';
23
+ import { type ExpirySweep, scheduleExpirySweep } from '../../common/persistence/expiry-sweep.js';
22
24
  import { maskEmail, maskToken } from '../../common/helpers/logging.helper.js';
23
25
  import { type IBetterAuth, ICookiesConfig } from '../../common/interfaces/server-options.interface.js';
24
26
  import { ConfigService } from '../../common/services/config.service.js';
@@ -47,6 +49,7 @@ import {
47
49
  DEFAULT_ACCOUNT_ISSUER_FIELD,
48
50
  DEFAULT_ACCOUNT_MODEL_NAME,
49
51
  } from './core-better-auth.constants.js';
52
+ import { getBetterAuthSqlStore } from './core-better-auth-sql.registry.js';
50
53
 
51
54
  /**
52
55
  * Result of a session validation
@@ -103,8 +106,9 @@ export { BETTER_AUTH_CONFIG, BETTER_AUTH_COOKIE_DOMAIN } from './core-better-aut
103
106
  * ```
104
107
  */
105
108
  @Injectable()
106
- export class CoreBetterAuthService implements OnApplicationBootstrap, OnModuleInit {
109
+ export class CoreBetterAuthService implements OnApplicationBootstrap, OnModuleDestroy, OnModuleInit {
107
110
  private readonly logger = new Logger(CoreBetterAuthService.name);
111
+ protected expirySweep?: ExpirySweep;
108
112
  private readonly config: IBetterAuth;
109
113
  private openApiSchema: IBetterAuthOpenApiDocument | undefined;
110
114
  private unavailableOperations: Set<string> | undefined;
@@ -145,7 +149,8 @@ export class CoreBetterAuthService implements OnApplicationBootstrap, OnModuleIn
145
149
  * better-auth pin yet therefore keeps working exactly as before.
146
150
  */
147
151
  async onModuleInit(): Promise<void> {
148
- if (!this.isEnabled() || !this.connection?.db) return;
152
+ // Both steps concern MongoDB's collections: on a SQL source Better-Auth's migrator created the tables and indices
153
+ if (!this.isEnabled() || !this.connection?.db || getBetterAuthSqlStore()) return;
149
154
 
150
155
  await this.ensureIndices();
151
156
  if (usesLegacyAccountIssuer()) {
@@ -164,6 +169,34 @@ export class CoreBetterAuthService implements OnApplicationBootstrap, OnModuleIn
164
169
  */
165
170
  async onApplicationBootstrap(): Promise<void> {
166
171
  await this.prepareOpenApiSchema();
172
+ this.startExpirySweep();
173
+ }
174
+
175
+ async onModuleDestroy(): Promise<void> {
176
+ // Before the data sources close their connections (onApplicationShutdown)
177
+ await this.expirySweep?.stop();
178
+ }
179
+
180
+ /**
181
+ * On a SQL source, removes expired sessions and verification values periodically (`scheduleExpirySweep()`): there is
182
+ * no TTL index, and Better-Auth deletes neither an expired session nor, unless one is looked up, an expired
183
+ * verification value. MongoDB keeps its TTL index and gets no sweep.
184
+ */
185
+ protected startExpirySweep(): void {
186
+ const sql = getBetterAuthSqlStore();
187
+ if (!this.isEnabled() || !sql || this.expirySweep) {
188
+ return;
189
+ }
190
+ this.expirySweep = scheduleExpirySweep(
191
+ 'iam',
192
+ async () => {
193
+ const { sessions, verificationValues } = await sql.deleteExpired();
194
+ if (sessions || verificationValues) {
195
+ this.logger.debug(`Removed ${sessions} expired session(s) and ${verificationValues} verification value(s)`);
196
+ }
197
+ },
198
+ { logger: this.logger },
199
+ );
167
200
  }
168
201
 
169
202
  /**
@@ -1087,7 +1120,14 @@ export class CoreBetterAuthService implements OnApplicationBootstrap, OnModuleIn
1087
1120
  * @returns Session and user data, or null if not found/expired
1088
1121
  */
1089
1122
  async getSessionByToken(token: string): Promise<SessionResult> {
1090
- if (!this.isEnabled() || !this.connection?.db) {
1123
+ if (!this.isEnabled()) {
1124
+ return { session: null, user: null };
1125
+ }
1126
+ const sql = getBetterAuthSqlStore();
1127
+ if (sql) {
1128
+ return this.liveSession(() => sql.findSession(token), 'getSessionByToken');
1129
+ }
1130
+ if (!this.connection?.db) {
1091
1131
  return { session: null, user: null };
1092
1132
  }
1093
1133
 
@@ -1183,7 +1223,14 @@ export class CoreBetterAuthService implements OnApplicationBootstrap, OnModuleIn
1183
1223
  * @returns Session result with token, or null if no active session exists
1184
1224
  */
1185
1225
  async getActiveSessionForUser(userId: string): Promise<SessionResult> {
1186
- if (!this.isEnabled() || !this.connection?.db) {
1226
+ if (!this.isEnabled()) {
1227
+ return { session: null, user: null };
1228
+ }
1229
+ const sql = getBetterAuthSqlStore();
1230
+ if (sql) {
1231
+ return this.liveSession(() => sql.findActiveSession(userId), 'getActiveSessionForUser');
1232
+ }
1233
+ if (!this.connection?.db) {
1187
1234
  return { session: null, user: null };
1188
1235
  }
1189
1236
 
@@ -1259,6 +1306,23 @@ export class CoreBetterAuthService implements OnApplicationBootstrap, OnModuleIn
1259
1306
  }
1260
1307
  }
1261
1308
 
1309
+ /**
1310
+ * A session from the SQL store, refused once expired — the check the MongoDB lookups make on the document
1311
+ */
1312
+ protected async liveSession(lookup: () => Promise<null | SessionResult>, caller: string): Promise<SessionResult> {
1313
+ try {
1314
+ const found = await lookup();
1315
+ if (!found?.session || (found.session.expiresAt && new Date(found.session.expiresAt) < new Date())) {
1316
+ this.logger.debug(`${caller}: no live session`);
1317
+ return { session: null, user: null };
1318
+ }
1319
+ return found;
1320
+ } catch (error) {
1321
+ this.logger.debug(`${caller} error: ${error instanceof Error ? error.message : 'Unknown error'}`);
1322
+ return { session: null, user: null };
1323
+ }
1324
+ }
1325
+
1262
1326
  // ===================================================================================================================
1263
1327
  // User Lookup Methods
1264
1328
  // ===================================================================================================================
@@ -1353,8 +1417,8 @@ export class CoreBetterAuthService implements OnApplicationBootstrap, OnModuleIn
1353
1417
  return this.verifyHs256Token(token);
1354
1418
  }
1355
1419
 
1356
- // For asymmetric algorithms (EdDSA, RS256, ES256), use JWKS
1357
- if (kid && this.connection) {
1420
+ // For asymmetric algorithms (EdDSA, RS256, ES256), use JWKS — from MongoDB or the SQL source, whichever holds them
1421
+ if (kid) {
1358
1422
  return this.verifyJwksToken(token, kid, alg);
1359
1423
  }
1360
1424
 
@@ -1412,17 +1476,22 @@ export class CoreBetterAuthService implements OnApplicationBootstrap, OnModuleIn
1412
1476
  email?: string;
1413
1477
  sub: string;
1414
1478
  }> {
1415
- if (!this.connection) {
1479
+ const sql = getBetterAuthSqlStore();
1480
+ if (!this.connection && !sql) {
1416
1481
  this.logger.debug('JWKS verification failed: no database connection');
1417
1482
  return null;
1418
1483
  }
1419
1484
 
1420
1485
  try {
1421
- // Fetch the JWKS public key from database
1422
- const jwksCollection = this.connection.collection('jwks');
1423
- let keyRecord = await jwksCollection.findOne({ id: kid });
1486
+ // Fetch the JWKS public key from database (on SQL through Better-Auth's adapter, by its logical names)
1487
+ const jwksCollection = this.connection?.collection('jwks');
1488
+ let keyRecord = sql ? await sql.findJwk(kid) : await jwksCollection?.findOne({ id: kid });
1424
1489
 
1425
- if (!keyRecord) {
1490
+ if (!keyRecord && sql) {
1491
+ this.logger.debug(`No JWKS key found for kid: ${kid}`);
1492
+ return null;
1493
+ }
1494
+ if (!keyRecord && jwksCollection) {
1426
1495
  // Try with _id as fallback (MongoDB ObjectId)
1427
1496
  const allKeys = await jwksCollection.find({}).toArray();
1428
1497
  const matchingKey = allKeys.find((k) => k.id === kid || k._id?.toString() === kid);
@@ -57,6 +57,16 @@ and pages over them, `checkRights()` reads them per request. A directory listing
57
57
  that, and sidecar files would reinvent an index the database already is. So `'filesystem'` moves the
58
58
  bytes off the database, not the bookkeeping.
59
59
 
60
+ **Which database holds it follows `database`** (db-agnostic phase 4). The S3 and filesystem metadata
61
+ are two framework models, `CoreS3File` and `CoreFilesystemFile`: on MongoDB the collections `s3-files`
62
+ and `filesystem-files` as before, on a SQL default source (or with `database.models` naming another
63
+ source) the tables `s3_files` and `filesystem_files`. Nothing changes in a project's `FileModule`.
64
+ Code of your own that reads that metadata uses `fileMetadataCollection(connection, 's3' | 'filesystem')`
65
+ — it answers the collection or the table behind the same operations — never `connection.db.collection('s3-files')`,
66
+ which would look at MongoDB while the files are in the table. GridFS keeps bytes and metadata in MongoDB
67
+ (`fs.files`), so without `file.storage` a project whose file metadata is on SQL gets `'filesystem'`
68
+ instead of `'gridfs'`; an explicit `'gridfs'` keeps working while MongoDB is connected.
69
+
60
70
  ### How an upload reaches S3
61
71
 
62
72
  No upload is read into memory on its way to S3. Which request carries it depends on whether its
@@ -98,11 +108,14 @@ operator did not believe they were in. Afterwards nobody can tell which file wen
98
108
  **Leave it unset and it is derived**, most capable first:
99
109
 
100
110
  1. `'s3'` — when `s3.bucket` is configured
101
- 2. `'gridfs'` — when a database is configured
102
- 3. `'filesystem'` — when neither is
111
+ 2. `'filesystem'` — when `database` routes the file metadata to a SQL source (a PostgreSQL default source
112
+ does): GridFS would put bytes and metadata into MongoDB. The directory is pod-local — mount
113
+ `storageDir` as a volume or configure `s3`, or the files are gone after the next restart
114
+ 3. `'gridfs'` — when a database is configured
115
+ 4. `'filesystem'` — when none is
103
116
 
104
117
  A configured-but-**unreachable** database is an error in its own right (Mongoose fails the boot), never
105
- a reason to fall through to the disk. Only a database that is not configured **at all** reaches step 3 —
118
+ a reason to fall through to the disk. Only a database that is not configured **at all** reaches step 4 —
106
119
  which today is theoretical, since `CoreModule` always registers Mongoose.
107
120
 
108
121
  A derived driver is enforced too: `s3.bucket` in the config makes S3 the default, but the bytes still
@@ -1,10 +1,10 @@
1
1
  import { ObjectType } from '@nestjs/graphql';
2
- import { Types } from 'mongoose';
3
2
 
4
3
  import { Restricted } from '../../common/decorators/restricted.decorator.js';
5
4
  import { UnifiedField } from '../../common/decorators/unified-field.decorator.js';
6
5
  import { RoleEnum } from '../../common/enums/role.enum.js';
7
6
  import { CoreModel } from '../../common/models/core-model.model.js';
7
+ import { newObjectId } from '../../common/persistence/mongo/mongoose-compat.js';
8
8
 
9
9
  /**
10
10
  * File info
@@ -18,7 +18,7 @@ export class CoreFileInfo extends CoreModel {
18
18
 
19
19
  @Restricted(RoleEnum.S_EVERYONE)
20
20
  get _id() {
21
- return new Types.ObjectId(this.id);
21
+ return newObjectId(this.id);
22
22
  }
23
23
 
24
24
  // ===========================================================================
@@ -1,5 +1,6 @@
1
1
  import { Logger, NotFoundException } from '@nestjs/common';
2
- import { type Connection, mongo, Types } from 'mongoose';
2
+ import type { Connection } from 'mongoose';
3
+ import type { mongo, Types } from 'mongoose';
3
4
  import { Readable } from 'stream';
4
5
 
5
6
  import { FilterArgs } from '../../common/args/filter.args.js';
@@ -9,6 +10,7 @@ import { convertFilterArgsToQuery } from '../../common/helpers/filter.helper.js'
9
10
  import { GridFSHelper } from '../../common/helpers/gridfs.helper.js';
10
11
  import { check } from '../../common/helpers/input.helper.js';
11
12
  import { prepareOutput } from '../../common/helpers/service.helper.js';
13
+ import { isWellFormedId } from '../../common/persistence/id-format.js';
12
14
  import { ConfigService } from '../../common/services/config.service.js';
13
15
  import { RequestContext } from '../../common/services/request-context.service.js';
14
16
  import { CoreS3Service } from '../../common/services/core-s3.service.js';
@@ -25,13 +27,11 @@ import {
25
27
  logFileStorage,
26
28
  resolveFileStorage,
27
29
  } from './file-storage.helper.js';
28
- import {
29
- DEFAULT_FILESYSTEM_DIR,
30
- FILESYSTEM_FILES_COLLECTION,
31
- FilesystemFileHelper,
32
- FilesystemFileInfo,
33
- } from './filesystem-file.helper.js';
34
- import { S3_FILES_COLLECTION, S3FileHelper, S3FileInfo } from './s3-file.helper.js';
30
+ import type { FileCollection } from './file-metadata.helper.js';
31
+ import { fileMetadataCollection } from './file-metadata.store.js';
32
+ import { DEFAULT_FILESYSTEM_DIR, FilesystemFileHelper, FilesystemFileInfo } from './filesystem-file.helper.js';
33
+ import { S3FileHelper, S3FileInfo } from './s3-file.helper.js';
34
+ import { createGridFsBucket } from '../../common/persistence/mongo/mongoose-compat.js';
35
35
 
36
36
  /**
37
37
  * Type for checking input
@@ -56,11 +56,18 @@ export abstract class CoreFileService {
56
56
  // Use the native MongoDB driver's types (accessed via Mongoose's exports) to avoid BSON version conflicts
57
57
  files: mongo.GridFSBucket;
58
58
 
59
- /** Metadata collection for files stored in S3 (no Mongoose schema) */
60
- protected s3Files: mongo.Collection<any>;
59
+ /**
60
+ * Metadata of the files stored in S3: the `s3-files` collection, or the table of its model when `database` routes it
61
+ * to a SQL source (`fileMetadataCollection()`)
62
+ */
63
+ protected get s3Files(): FileCollection {
64
+ return fileMetadataCollection(this.connection, 's3');
65
+ }
61
66
 
62
- /** Metadata collection for files stored on the local filesystem (no Mongoose schema) */
63
- protected filesystemFiles: mongo.Collection<any>;
67
+ /** Metadata of the files stored on the local filesystem: `filesystem-files`, or its table on a SQL source */
68
+ protected get filesystemFiles(): FileCollection {
69
+ return fileMetadataCollection(this.connection, 'filesystem');
70
+ }
64
71
 
65
72
  protected readonly logger = new Logger(CoreFileService.name);
66
73
 
@@ -75,10 +82,9 @@ export abstract class CoreFileService {
75
82
  bucketName = 'fs',
76
83
  protected readonly options?: CoreFileServiceOptions,
77
84
  ) {
78
- // Use the native MongoDB driver's GridFSBucket via Mongoose's mongo export to avoid BSON version conflicts
79
- this.files = new mongo.GridFSBucket(connection.db, { bucketName });
80
- this.s3Files = connection.db.collection(S3_FILES_COLLECTION);
81
- this.filesystemFiles = connection.db.collection(FILESYSTEM_FILES_COLLECTION);
85
+ // GridFS needs MongoDB: without a connection (a project on PostgreSQL alone) there is no bucket, the GridFS reads
86
+ // find nothing, and `file.storage: 'gridfs'` fails the boot below as unavailable
87
+ this.files = connection?.db ? createGridFsBucket(connection.db, { bucketName }) : undefined;
82
88
 
83
89
  // Resolve from the global config rather than the optional injected
84
90
  // ConfigService: a project on the pre-11.33 constructor (`super(connection)`)
@@ -123,6 +129,9 @@ export abstract class CoreFileService {
123
129
  * library and the service wired through `super()`.
124
130
  */
125
131
  protected isStorageAvailable(driver: FileStorageDriver): boolean {
132
+ if (driver === 'gridfs') {
133
+ return !!this.files;
134
+ }
126
135
  return driver === 's3' ? !!this.options?.s3Service?.enabled : true;
127
136
  }
128
137
 
@@ -144,14 +153,14 @@ export abstract class CoreFileService {
144
153
  *
145
154
  * Every store keys files by an ObjectId, so a string that is not 24 hex characters — a TUS upload
146
155
  * id (which clients took for the file id), a filename, a typo in a URL — names no file. It is
147
- * answered exactly like an unknown id. Handed to `new ObjectId()` it threw a BSONError instead,
156
+ * answered exactly like an unknown id. Handed to `new Types.ObjectId()` it threw a BSONError instead,
148
157
  * and `GET /files/id/<tus-upload-id>` answered 500 where an unknown id gets 404.
149
158
  *
150
159
  * Only strings are judged: anything else keeps its previous path, so an ObjectId from a second
151
160
  * copy of `bson` (where `instanceof` fails) is not suddenly reported as missing.
152
161
  */
153
162
  protected isMalformedFileId(id: unknown): boolean {
154
- return typeof id === 'string' && !(id.length === 24 && Types.ObjectId.isValid(id));
163
+ return typeof id === 'string' && !isWellFormedId(id);
155
164
  }
156
165
 
157
166
  /**
@@ -1,4 +1,5 @@
1
- import { mongo, Types } from 'mongoose';
1
+ import type { mongo, Types } from 'mongoose';
2
+ import { newObjectId } from '../../common/persistence/mongo/mongoose-compat.js';
2
3
 
3
4
  /**
4
5
  * The metadata shape every non-GridFS storage driver writes, and the queries against it.
@@ -25,7 +26,10 @@ import { mongo, Types } from 'mongoose';
25
26
  * `.claude/rules/architecture.md` → "DI Token Placement (SWC-Safe)".
26
27
  */
27
28
 
28
- /** Metadata collection handle (no Mongoose schema — these collections are driver-managed) */
29
+ /**
30
+ * Metadata collection handle — the MongoDB collection, or its table on a SQL source behind the same operations
31
+ * (`fileMetadataCollection()` decides which)
32
+ */
29
33
  export type FileCollection = mongo.Collection<any>;
30
34
 
31
35
  /**
@@ -70,7 +74,7 @@ export async function findMetadataById(
70
74
  collection: FileCollection,
71
75
  id: string | Types.ObjectId,
72
76
  ): Promise<FileMetadataInfo | null> {
73
- return (await collection.findOne({ _id: new Types.ObjectId(id) })) as FileMetadataInfo | null;
77
+ return (await collection.findOne({ _id: newObjectId(id) })) as FileMetadataInfo | null;
74
78
  }
75
79
 
76
80
  /**
@@ -0,0 +1,44 @@
1
+ import type { Schema } from 'mongoose';
2
+
3
+ import { createSchema } from '../../common/persistence/mongo/mongoose-compat.js';
4
+
5
+ import { FILESYSTEM_FILES_COLLECTION } from './filesystem-file.helper.js';
6
+ import { S3_FILES_COLLECTION } from './s3-file.helper.js';
7
+
8
+ /**
9
+ * The metadata of files whose bytes live in S3 or on the filesystem, as models — what routes them with `database`
10
+ * like every other model (db-agnostic phase 4). On a SQL default source the rows live in the tables `s3_files` and
11
+ * `filesystem_files`; on MongoDB the file helpers keep reading and writing the collections natively, as before.
12
+ *
13
+ * `autoCreate` and `autoIndex` are off: these schemas only register the models. A deployment that never writes to a
14
+ * store must not grow an empty collection for it (`ensureFilenameIndex()` creates the index on the first write), and
15
+ * nothing may create an index next to the one the helpers ensure. GridFS has no model here: its `fs.files` belongs to
16
+ * the driver and stays on MongoDB.
17
+ */
18
+
19
+ /** Model of the `s3-files` metadata */
20
+ export const S3_FILE_MODEL = 'CoreS3File';
21
+
22
+ /** Model of the `filesystem-files` metadata */
23
+ export const FILESYSTEM_FILE_MODEL = 'CoreFilesystemFile';
24
+
25
+ /** The shape both stores write — a GridFS `fs.files` document plus the `storage` marker (`FileMetadataInfo`) */
26
+ function fileMetadataSchema(collection: string): Schema {
27
+ return createSchema(
28
+ {
29
+ contentType: { type: String },
30
+ filename: { index: true, type: String },
31
+ length: { type: Number },
32
+ metadata: { type: Object },
33
+ storage: { type: String },
34
+ uploadDate: { type: Date },
35
+ },
36
+ { autoCreate: false, autoIndex: false, collection, versionKey: false },
37
+ );
38
+ }
39
+
40
+ /** Registered by `CoreModule` through `CorePersistenceModule.forFeature()` */
41
+ export const FILE_METADATA_MODELS = [
42
+ { name: S3_FILE_MODEL, schema: fileMetadataSchema(S3_FILES_COLLECTION) },
43
+ { name: FILESYSTEM_FILE_MODEL, schema: fileMetadataSchema(FILESYSTEM_FILES_COLLECTION) },
44
+ ];