@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
@@ -90,3 +90,13 @@ export const AI_TOOL_GRANT_MODEL = 'AiToolGrant';
90
90
  export const AI_TOOL_POLICY_CLASS = 'AI_TOOL_POLICY_CLASS';
91
91
  /** Mongoose injection token. */
92
92
  export const AI_TOOL_POLICY_MODEL = 'AiToolPolicy';
93
+
94
+ // ---- MCP OAuth (stored natively on MongoDB; these models give them their tables on a SQL source) ----
95
+ /** Mongoose model name of the registered OAuth clients (`aiMcpOAuthClients`). */
96
+ export const AI_MCP_OAUTH_CLIENT_MODEL = 'AiMcpOAuthClient';
97
+ /** Mongoose model name of the authorization codes (`aiMcpOAuthCodes`). */
98
+ export const AI_MCP_OAUTH_CODE_MODEL = 'AiMcpOAuthCode';
99
+ /** Mongoose model name of the refresh tokens (`aiMcpOAuthRefreshTokens`). */
100
+ export const AI_MCP_OAUTH_REFRESH_TOKEN_MODEL = 'AiMcpOAuthRefreshToken';
101
+ /** How long an authorization code may be exchanged — checked on every read, not left to a TTL index. */
102
+ export const AI_MCP_OAUTH_CODE_TTL_SECONDS = 600;
@@ -1,5 +1,4 @@
1
1
  import { DynamicModule, Global, Module, Type } from '@nestjs/common';
2
- import { MongooseModule } from '@nestjs/mongoose';
3
2
 
4
3
  import { CoreAiMcpOAuthInitializer } from './core-ai-mcp-oauth.initializer.js';
5
4
  import { CoreAiMcpController } from './core-ai-mcp.controller.js';
@@ -7,7 +6,18 @@ import { CoreAiController } from './core-ai.controller.js';
7
6
  import { CoreAiResolver } from './core-ai.resolver.js';
8
7
  import { CoreAiMcpOAuthService } from './services/core-ai-mcp-oauth.service.js';
9
8
  import { CoreAiMcpService } from './services/core-ai-mcp.service.js';
9
+ import { CorePersistenceModule } from '../../common/persistence/core-persistence.module.js';
10
+ import {
11
+ AI_MCP_OAUTH_CLIENT_MODEL,
12
+ AI_MCP_OAUTH_CODE_MODEL,
13
+ AI_MCP_OAUTH_REFRESH_TOKEN_MODEL,
14
+ } from './core-ai.constants.js';
10
15
  import { AiBudgetLimitSchema, CoreAiBudgetLimit } from './models/core-ai-budget-limit.model.js';
16
+ import {
17
+ AiMcpOAuthClientSchema,
18
+ AiMcpOAuthCodeSchema,
19
+ AiMcpOAuthRefreshTokenSchema,
20
+ } from './models/core-ai-mcp-oauth.models.js';
11
21
  import {
12
22
  AiConnectionPreferenceSchema,
13
23
  CoreAiConnectionPreference,
@@ -184,6 +194,25 @@ export class CoreAiModule {
184
194
  const SlotServiceClass = options.slotService || CoreAiSlotService;
185
195
  const ResolverClass = options.resolver || CoreAiResolver;
186
196
  const ServiceClass = options.service || CoreAiService;
197
+ // Registered through the persistence layer, so `database` routes them like every other model (db-agnostic phase 4);
198
+ // `@InjectModel()` keeps working, and each service reaches its routed store through `dataStore`
199
+ const aiModels = CorePersistenceModule.forFeature([
200
+ { model: CoreAiBudgetLimit, name: AI_BUDGET_LIMIT_MODEL, schema: AiBudgetLimitSchema },
201
+ { model: CoreAiConnection, name: AI_CONNECTION_MODEL, schema: AiConnectionSchema },
202
+ { model: CoreAiConnectionPreference, name: AI_CONNECTION_PREFERENCE_MODEL, schema: AiConnectionPreferenceSchema },
203
+ { model: CoreAiConversation, name: AI_CONVERSATION_MODEL, schema: AiConversationSchema },
204
+ { model: CoreAiInteraction, name: AI_INTERACTION_MODEL, schema: AiInteractionSchema },
205
+ { model: CoreAiPromptHint, name: AI_PROMPT_HINT_MODEL, schema: AiPromptHintSchema },
206
+ { model: CoreAiPrompt, name: AI_PROMPT_MODEL, schema: AiPromptSchema },
207
+ { model: CoreAiSlot, name: AI_SLOT_MODEL, schema: AiSlotSchema },
208
+ { model: CoreAiToolGrant, name: AI_TOOL_GRANT_MODEL, schema: AiToolGrantSchema },
209
+ { model: CoreAiToolPolicy, name: AI_TOOL_POLICY_MODEL, schema: AiToolPolicySchema },
210
+ { model: CoreAiMode, name: AI_MODE_MODEL, schema: AiModeSchema },
211
+ // Stored natively on MongoDB; the models give them their tables on a SQL source
212
+ { name: AI_MCP_OAUTH_CLIENT_MODEL, schema: AiMcpOAuthClientSchema },
213
+ { name: AI_MCP_OAUTH_CODE_MODEL, schema: AiMcpOAuthCodeSchema },
214
+ { name: AI_MCP_OAUTH_REFRESH_TOKEN_MODEL, schema: AiMcpOAuthRefreshTokenSchema },
215
+ ]);
187
216
  const ToolGrantServiceClass = options.toolGrantService || CoreAiToolGrantService;
188
217
  const ToolPolicyServiceClass = options.toolPolicyService || CoreAiToolPolicyService;
189
218
  const ModeServiceClass = options.modeService || CoreAiModeService;
@@ -224,23 +253,9 @@ export class CoreAiModule {
224
253
  CoreAiModeService,
225
254
  CoreAiMcpClientService,
226
255
  LlmProviderFactory,
227
- MongooseModule,
228
- ],
229
- imports: [
230
- MongooseModule.forFeature([
231
- { name: AI_BUDGET_LIMIT_MODEL, schema: AiBudgetLimitSchema },
232
- { name: AI_CONNECTION_MODEL, schema: AiConnectionSchema },
233
- { name: AI_CONNECTION_PREFERENCE_MODEL, schema: AiConnectionPreferenceSchema },
234
- { name: AI_CONVERSATION_MODEL, schema: AiConversationSchema },
235
- { name: AI_INTERACTION_MODEL, schema: AiInteractionSchema },
236
- { name: AI_PROMPT_HINT_MODEL, schema: AiPromptHintSchema },
237
- { name: AI_PROMPT_MODEL, schema: AiPromptSchema },
238
- { name: AI_SLOT_MODEL, schema: AiSlotSchema },
239
- { name: AI_TOOL_GRANT_MODEL, schema: AiToolGrantSchema },
240
- { name: AI_TOOL_POLICY_MODEL, schema: AiToolPolicySchema },
241
- { name: AI_MODE_MODEL, schema: AiModeSchema },
242
- ]),
256
+ aiModels,
243
257
  ],
258
+ imports: [aiModels],
244
259
  module: CoreAiModule,
245
260
  providers: [
246
261
  AiCryptoService,
@@ -1,6 +1,6 @@
1
1
  import { ObjectType } from '@nestjs/graphql';
2
- import { Schema as MongooseSchema, SchemaFactory } from '@nestjs/mongoose';
3
- import { Document } from 'mongoose';
2
+ import { Schema as MongooseSchema, SchemaFactory } from '../../../common/persistence/mongo/mongoose-compat.js';
3
+ import type { Document } from 'mongoose';
4
4
 
5
5
  import { Restricted } from '../../../common/decorators/restricted.decorator.js';
6
6
  import { UnifiedField } from '../../../common/decorators/unified-field.decorator.js';
@@ -1,6 +1,6 @@
1
1
  import { ObjectType } from '@nestjs/graphql';
2
- import { Schema as MongooseSchema, SchemaFactory } from '@nestjs/mongoose';
3
- import { Document } from 'mongoose';
2
+ import { Schema as MongooseSchema, SchemaFactory } from '../../../common/persistence/mongo/mongoose-compat.js';
3
+ import type { Document } from 'mongoose';
4
4
 
5
5
  import { Restricted } from '../../../common/decorators/restricted.decorator.js';
6
6
  import { UnifiedField } from '../../../common/decorators/unified-field.decorator.js';
@@ -1,6 +1,6 @@
1
1
  import { ObjectType } from '@nestjs/graphql';
2
- import { Prop, Schema as MongooseSchema, SchemaFactory } from '@nestjs/mongoose';
3
- import { Document } from 'mongoose';
2
+ import { Prop, Schema as MongooseSchema, SchemaFactory } from '../../../common/persistence/mongo/mongoose-compat.js';
3
+ import type { Document } from 'mongoose';
4
4
 
5
5
  import { Restricted } from '../../../common/decorators/restricted.decorator.js';
6
6
  import { UnifiedField } from '../../../common/decorators/unified-field.decorator.js';
@@ -1,6 +1,10 @@
1
1
  import { ObjectType } from '@nestjs/graphql';
2
- import { Schema as MongooseSchema, SchemaFactory } from '@nestjs/mongoose';
3
- import { Document, Schema } from 'mongoose';
2
+ import {
3
+ objectIdType,
4
+ Schema as MongooseSchema,
5
+ SchemaFactory,
6
+ } from '../../../common/persistence/mongo/mongoose-compat.js';
7
+ import type { Document } from 'mongoose';
4
8
 
5
9
  import { Restricted } from '../../../common/decorators/restricted.decorator.js';
6
10
  import { UnifiedField } from '../../../common/decorators/unified-field.decorator.js';
@@ -40,7 +44,7 @@ export class CoreAiConversation extends CorePersistenceModel {
40
44
  @UnifiedField({
41
45
  description: 'Id of the user who created the conversation',
42
46
  isOptional: true,
43
- mongoose: { index: true, ref: 'User', type: Schema.Types.ObjectId },
47
+ mongoose: { index: true, ref: 'User', type: objectIdType() },
44
48
  roles: RoleEnum.S_USER,
45
49
  type: () => String,
46
50
  })
@@ -69,7 +73,7 @@ export class CoreAiConversation extends CorePersistenceModel {
69
73
  description: 'Conversation messages',
70
74
  isArray: true,
71
75
  isOptional: true,
72
- mongoose: { default: [], type: [Schema.Types.Mixed] },
76
+ mongoose: { default: [], type: [Object] },
73
77
  roles: RoleEnum.S_USER,
74
78
  type: () => CoreAiMessage,
75
79
  })
@@ -1,6 +1,6 @@
1
1
  import { ObjectType } from '@nestjs/graphql';
2
- import { Schema as MongooseSchema, SchemaFactory } from '@nestjs/mongoose';
3
- import { Document, Schema } from 'mongoose';
2
+ import { Schema as MongooseSchema, SchemaFactory } from '../../../common/persistence/mongo/mongoose-compat.js';
3
+ import type { Document } from 'mongoose';
4
4
 
5
5
  import { Restricted } from '../../../common/decorators/restricted.decorator.js';
6
6
  import { UnifiedField } from '../../../common/decorators/unified-field.decorator.js';
@@ -26,7 +26,7 @@ export class CoreAiInteraction extends CorePersistenceModel {
26
26
  @UnifiedField({
27
27
  description: 'Tool actions executed during the run',
28
28
  isOptional: true,
29
- mongoose: { type: Schema.Types.Mixed },
29
+ mongoose: { type: Object },
30
30
  roles: RoleEnum.ADMIN,
31
31
  type: () => JSON,
32
32
  })
@@ -0,0 +1,46 @@
1
+ import { createSchema } from '../../../common/persistence/mongo/mongoose-compat.js';
2
+
3
+ import { AI_MCP_OAUTH_CODE_TTL_SECONDS } from '../core-ai.constants.js';
4
+
5
+ /**
6
+ * The MCP OAuth artifacts as models — what gives them their tables on a SQL source (db-agnostic phase 4).
7
+ *
8
+ * On MongoDB `CoreAiMcpOAuthService` keeps reading and writing the three collections natively, as before: these
9
+ * schemas only register the names, with `autoIndex: false` so Mongoose never creates an index next to the TTL and
10
+ * unique indexes the service ensures itself. On a SQL source the framework creates the tables from them, the service
11
+ * goes through their stores, and the declared TTL makes the expiry sweep remove old codes.
12
+ */
13
+
14
+ /** A registered client: the client object the MCP SDK hands over, kept whole, plus its id for the lookup */
15
+ export const AiMcpOAuthClientSchema = createSchema(
16
+ {
17
+ client: { type: Object },
18
+ client_id: { index: { unique: true }, type: String },
19
+ createdAt: { type: Date },
20
+ },
21
+ { autoIndex: false, collection: 'aiMcpOAuthClients', versionKey: false },
22
+ );
23
+
24
+ /** An authorization code with its PKCE challenge; valid for `AI_MCP_OAUTH_CODE_TTL_SECONDS` after `createdAt` */
25
+ export const AiMcpOAuthCodeSchema = createSchema(
26
+ {
27
+ clientId: { type: String },
28
+ code: { index: { unique: true }, type: String },
29
+ codeChallenge: { type: String },
30
+ // The TTL: MongoDB gets its index from the service, a SQL table its sweep (`CorePersistenceLifecycle`)
31
+ createdAt: { expires: AI_MCP_OAUTH_CODE_TTL_SECONDS, type: Date },
32
+ userId: { type: String },
33
+ },
34
+ { autoIndex: false, collection: 'aiMcpOAuthCodes', versionKey: false },
35
+ );
36
+
37
+ /** A refresh token, bound to the client it was issued to */
38
+ export const AiMcpOAuthRefreshTokenSchema = createSchema(
39
+ {
40
+ clientId: { type: String },
41
+ createdAt: { type: Date },
42
+ token: { index: { unique: true }, type: String },
43
+ userId: { type: String },
44
+ },
45
+ { autoIndex: false, collection: 'aiMcpOAuthRefreshTokens', versionKey: false },
46
+ );
@@ -1,6 +1,6 @@
1
1
  import { ObjectType } from '@nestjs/graphql';
2
- import { Schema as MongooseSchema, SchemaFactory } from '@nestjs/mongoose';
3
- import { Document } from 'mongoose';
2
+ import { Schema as MongooseSchema, SchemaFactory } from '../../../common/persistence/mongo/mongoose-compat.js';
3
+ import type { Document } from 'mongoose';
4
4
 
5
5
  import { Restricted } from '../../../common/decorators/restricted.decorator.js';
6
6
  import { UnifiedField } from '../../../common/decorators/unified-field.decorator.js';
@@ -1,6 +1,6 @@
1
1
  import { ObjectType } from '@nestjs/graphql';
2
- import { Schema as MongooseSchema, SchemaFactory } from '@nestjs/mongoose';
3
- import { Document } from 'mongoose';
2
+ import { Schema as MongooseSchema, SchemaFactory } from '../../../common/persistence/mongo/mongoose-compat.js';
3
+ import type { Document } from 'mongoose';
4
4
 
5
5
  import { Restricted } from '../../../common/decorators/restricted.decorator.js';
6
6
  import { UnifiedField } from '../../../common/decorators/unified-field.decorator.js';
@@ -1,6 +1,6 @@
1
1
  import { ObjectType } from '@nestjs/graphql';
2
- import { Schema as MongooseSchema, SchemaFactory } from '@nestjs/mongoose';
3
- import { Document } from 'mongoose';
2
+ import { Schema as MongooseSchema, SchemaFactory } from '../../../common/persistence/mongo/mongoose-compat.js';
3
+ import type { Document } from 'mongoose';
4
4
 
5
5
  import { Restricted } from '../../../common/decorators/restricted.decorator.js';
6
6
  import { UnifiedField } from '../../../common/decorators/unified-field.decorator.js';
@@ -1,6 +1,6 @@
1
1
  import { ObjectType } from '@nestjs/graphql';
2
- import { Schema as MongooseSchema, SchemaFactory } from '@nestjs/mongoose';
3
- import { Document } from 'mongoose';
2
+ import { Schema as MongooseSchema, SchemaFactory } from '../../../common/persistence/mongo/mongoose-compat.js';
3
+ import type { Document } from 'mongoose';
4
4
 
5
5
  import { Restricted } from '../../../common/decorators/restricted.decorator.js';
6
6
  import { UnifiedField } from '../../../common/decorators/unified-field.decorator.js';
@@ -1,6 +1,6 @@
1
1
  import { ObjectType } from '@nestjs/graphql';
2
- import { Schema as MongooseSchema, SchemaFactory } from '@nestjs/mongoose';
3
- import { Document } from 'mongoose';
2
+ import { Schema as MongooseSchema, SchemaFactory } from '../../../common/persistence/mongo/mongoose-compat.js';
3
+ import type { Document } from 'mongoose';
4
4
 
5
5
  import { Restricted } from '../../../common/decorators/restricted.decorator.js';
6
6
  import { UnifiedField } from '../../../common/decorators/unified-field.decorator.js';
@@ -1,6 +1,6 @@
1
1
  import { Field, ObjectType } from '@nestjs/graphql';
2
- import { Schema as MongooseSchema, SchemaFactory } from '@nestjs/mongoose';
3
- import { Document } from 'mongoose';
2
+ import { Schema as MongooseSchema, SchemaFactory } from '../../../common/persistence/mongo/mongoose-compat.js';
3
+ import type { Document } from 'mongoose';
4
4
 
5
5
  import { Restricted } from '../../../common/decorators/restricted.decorator.js';
6
6
  import { UnifiedField } from '../../../common/decorators/unified-field.decorator.js';
@@ -1,9 +1,12 @@
1
1
  import { HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common';
2
- import { InjectConnection, InjectModel } from '@nestjs/mongoose';
3
- import { type Connection, Model } from 'mongoose';
2
+ import { InjectConnection, InjectModel } from '../../../common/persistence/mongo/mongoose-compat.js';
3
+ import type { Connection, Model } from 'mongoose';
4
4
 
5
+ import type { DataStore } from '../../../common/persistence/data-store.interface.js';
6
+ import { getModelStore } from '../../../common/persistence/persistence-runtime.registry.js';
5
7
  import { ConfigService } from '../../../common/services/config.service.js';
6
8
  import { CrudService } from '../../../common/services/crud.service.js';
9
+ import { RequestContext } from '../../../common/services/request-context.service.js';
7
10
  import type { CoreModelConstructor } from '../../../common/types/core-model-constructor.type.js';
8
11
  import { ErrorCode } from '../../error-code/index.js';
9
12
  import { CoreAiBudgetLimitCreateInput } from '../inputs/core-ai-budget-limit-create.input.js';
@@ -11,7 +14,7 @@ import { CoreAiBudgetLimitInput } from '../inputs/core-ai-budget-limit.input.js'
11
14
  import { AiBudgetLimitDocument, CoreAiBudgetLimit } from '../models/core-ai-budget-limit.model.js';
12
15
  import { CoreAiBudgetSummary, CoreAiUsageInfo, CoreAiUsageScope } from '../models/core-ai-usage-info.model.js';
13
16
 
14
- import { AI_BUDGET_LIMIT_CLASS, AI_BUDGET_LIMIT_MODEL } from '../core-ai.constants.js';
17
+ import { AI_BUDGET_LIMIT_CLASS, AI_BUDGET_LIMIT_MODEL, AI_INTERACTION_MODEL } from '../core-ai.constants.js';
15
18
 
16
19
  /**
17
20
  * @deprecated Import from `../core-ai.constants` instead. Re-exported only so existing deep imports
@@ -68,7 +71,7 @@ export class CoreAiBudgetService extends CrudService<
68
71
  * Resolve the effective limit for a scope: persisted override, else config default.
69
72
  */
70
73
  async resolveLimit(scope: 'tenant' | 'user', refId: string): Promise<ResolvedAiBudgetLimit> {
71
- const override = await this.mainDbModel.findOne({ refId, scope }).lean().exec();
74
+ const override = (await this.dataStore.findOne({ refId, scope })) as Partial<CoreAiBudgetLimit> | null;
72
75
  const cfg = ConfigService.get<{
73
76
  period?: string;
74
77
  tenant?: { maxPrompts?: number; maxTokens?: number };
@@ -96,6 +99,15 @@ export class CoreAiBudgetService extends CrudService<
96
99
  if (filter.tenantId) {
97
100
  match.tenantId = filter.tenantId;
98
101
  }
102
+ // On a SQL source the interactions live in their table, summed by the database across tenants (the explicit
103
+ // user/tenant filter decides), as the MongoDB aggregation below does
104
+ const interactions = this.interactionsSqlStore();
105
+ if (interactions) {
106
+ const { count, sum } = await RequestContext.runWithBypassTenantGuard(() =>
107
+ interactions.sum('totalTokens', match),
108
+ );
109
+ return { resetAt: this.nextReset(period), usedPrompts: count, usedTokens: sum };
110
+ }
99
111
  const db = this.connection.db;
100
112
  if (!db) {
101
113
  return { resetAt: this.nextReset(period), usedPrompts: 0, usedTokens: 0 };
@@ -113,6 +125,12 @@ export class CoreAiBudgetService extends CrudService<
113
125
  return { resetAt: this.nextReset(period), usedPrompts: agg?.usedPrompts ?? 0, usedTokens: agg?.usedTokens ?? 0 };
114
126
  }
115
127
 
128
+ /** The store of the interactions when they are routed to a SQL source; `undefined` keeps the native aggregation */
129
+ protected interactionsSqlStore(): DataStore<any> | undefined {
130
+ const store = getModelStore(this.connection, AI_INTERACTION_MODEL);
131
+ return store && !store.capabilities.mongoosePopulate ? store : undefined;
132
+ }
133
+
116
134
  /**
117
135
  * Block the run with HTTP 429 if the user OR tenant has hit a finite limit.
118
136
  *
@@ -1,7 +1,8 @@
1
1
  import { Inject, Injectable } 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 { CoreAiConnectionPreferenceInput } from '../inputs/core-ai-connection-preference.input.js';
@@ -45,7 +46,7 @@ export class CoreAiConnectionPreferenceService extends CrudService<
45
46
  scope: 'tenant' | 'user',
46
47
  refId: string,
47
48
  ): Promise<{ connectionId: string; enforced?: boolean } | null> {
48
- const doc = await this.mainDbModel.findOne({ refId, scope }).lean().exec();
49
+ const doc = (await this.dataStore.findOne({ refId, scope })) as Partial<CoreAiConnectionPreference> | null;
49
50
  return doc ? { connectionId: doc.connectionId, enforced: doc.enforced } : null;
50
51
  }
51
52
 
@@ -54,8 +55,7 @@ export class CoreAiConnectionPreferenceService extends CrudService<
54
55
  * removed, to avoid dangling tenant/user preferences). Returns the deleted count.
55
56
  */
56
57
  async deleteByConnectionId(connectionId: string): Promise<number> {
57
- const result = await this.mainDbModel.deleteMany({ connectionId }).exec();
58
- return result.deletedCount ?? 0;
58
+ return this.dataStore.deleteMany({ connectionId });
59
59
  }
60
60
 
61
61
  /**
@@ -69,14 +69,7 @@ export class CoreAiConnectionPreferenceService extends CrudService<
69
69
  connectionId: string,
70
70
  enforced = false,
71
71
  ): Promise<CoreAiConnectionPreference> {
72
- const doc = await this.mainDbModel
73
- .findOneAndUpdate(
74
- { refId, scope },
75
- { $set: { connectionId, enforced } },
76
- { returnDocument: 'after', upsert: true },
77
- )
78
- .lean()
79
- .exec();
72
+ const doc = await upsertRecord(this.dataStore, { refId, scope }, { connectionId, enforced });
80
73
  return this.mainModelConstructor.map(doc);
81
74
  }
82
75
  }
@@ -7,8 +7,8 @@ import {
7
7
  Optional,
8
8
  ServiceUnavailableException,
9
9
  } from '@nestjs/common';
10
- import { InjectModel } from '@nestjs/mongoose';
11
- import { Model } from 'mongoose';
10
+ import { InjectModel } from '../../../common/persistence/mongo/mongoose-compat.js';
11
+ import type { Model } from 'mongoose';
12
12
 
13
13
  import { ServiceOptions } from '../../../common/interfaces/service-options.interface.js';
14
14
  import { CrudService } from '../../../common/services/crud.service.js';
@@ -39,7 +39,7 @@ export { AI_CONNECTION_CLASS, AI_CONNECTION_MODEL } from '../core-ai.constants.j
39
39
  * use the bulk `find()` result directly (no per-connection re-read / N+1).
40
40
  */
41
41
  type ResolvableConnectionDoc = {
42
- _id: unknown;
42
+ id: string;
43
43
  apiKeyEncrypted?: string;
44
44
  apiKeyEnv?: string;
45
45
  baseUrl: string;
@@ -121,14 +121,14 @@ export class CoreAiConnectionService
121
121
  );
122
122
  return;
123
123
  }
124
- const count = await this.mainDbModel.countDocuments().exec();
124
+ const count = await this.dataStore.count();
125
125
  if (count > 0) {
126
126
  return;
127
127
  }
128
128
  const { apiKey, ...rest } = seed;
129
- // Direct model access: system-internal seeding without a user context, and we
129
+ // Direct store access: system-internal seeding without a user context, and we
130
130
  // must set the internal `apiKeyEncrypted` field which CrudService does not expose.
131
- await this.mainDbModel.create({
131
+ await this.dataStore.insert({
132
132
  ...rest,
133
133
  apiKeyEncrypted: apiKey ? this.aiCryptoService.encrypt(apiKey) : undefined,
134
134
  isDefault: true,
@@ -145,16 +145,16 @@ export class CoreAiConnectionService
145
145
  */
146
146
  protected async assertStoredKeysDecryptable(): Promise<void> {
147
147
  try {
148
- const docs = await this.mainDbModel
149
- .find({ apiKeyEncrypted: { $exists: true, $ne: '' } }, { apiKeyEncrypted: 1, name: 1 })
150
- .lean()
151
- .exec();
148
+ const docs = await this.dataStore.find(
149
+ { apiKeyEncrypted: { $exists: true, $ne: '' } },
150
+ { select: ['apiKeyEncrypted', 'name'] },
151
+ );
152
152
  const broken: string[] = [];
153
- for (const doc of docs as { _id: unknown; apiKeyEncrypted?: string; name?: string }[]) {
153
+ for (const doc of docs as { apiKeyEncrypted?: string; id: string; name?: string }[]) {
154
154
  try {
155
155
  this.aiCryptoService.decrypt(doc.apiKeyEncrypted ?? '');
156
156
  } catch {
157
- broken.push(doc.name || String(doc._id));
157
+ broken.push(doc.name || doc.id);
158
158
  }
159
159
  }
160
160
  if (broken.length) {
@@ -205,10 +205,7 @@ export class CoreAiConnectionService
205
205
  try {
206
206
  // Single read (no per-connection re-resolve): the full docs carry everything the
207
207
  // provider factory needs, so there is no N+1 findById per connection.
208
- const docs = (await this.mainDbModel
209
- .find({ enabled: { $ne: false } })
210
- .lean()
211
- .exec()) as unknown as ResolvableConnectionDoc[];
208
+ const docs = (await this.dataStore.find({ enabled: { $ne: false } })) as unknown as ResolvableConnectionDoc[];
212
209
  for (const doc of docs) {
213
210
  // Only a connection that DECLARES a capability can drift; undefined flags are
214
211
  // auto-detected on first use, so there is nothing to reconcile here.
@@ -227,7 +224,7 @@ export class CoreAiConnectionService
227
224
  defaultTemperature: doc.defaultTemperature,
228
225
  defaultUserMaxPeriod: doc.defaultUserMaxPeriod,
229
226
  defaultUserMaxTokens: doc.defaultUserMaxTokens,
230
- id: String(doc._id),
227
+ id: String(doc.id),
231
228
  model: doc.model,
232
229
  name: doc.name,
233
230
  providerType: doc.providerType || 'openai-compatible',
@@ -266,7 +263,7 @@ export class CoreAiConnectionService
266
263
  }
267
264
  if (drift.length) {
268
265
  this.logger.warn(
269
- `AI connection "${doc.name || String(doc._id)}" capability drift: ${drift.join('; ')}. ` +
266
+ `AI connection "${doc.name || String(doc.id)}" capability drift: ${drift.join('; ')}. ` +
270
267
  `The declared value is authoritative and was NOT changed — correct it in the admin UI, or clear it to ` +
271
268
  `re-enable auto-detection, so the assistant uses the endpoint's real capabilities.`,
272
269
  );
@@ -399,7 +396,7 @@ export class CoreAiConnectionService
399
396
  }
400
397
  }
401
398
  if (Object.keys(update).length) {
402
- await this.mainDbModel.findByIdAndUpdate(connectionId, { $set: update }).exec();
399
+ await this.dataStore.updateById(connectionId, { $set: update });
403
400
  this.logger.log(`Auto-detected AI connection metadata for "${resolved.name}": ${JSON.stringify(update)}`);
404
401
  }
405
402
  return resolved;
@@ -420,16 +417,14 @@ export class CoreAiConnectionService
420
417
  tenantIds?: string[];
421
418
  }[]
422
419
  > {
423
- const docs = await this.mainDbModel
424
- .find({ enabled: { $ne: false } })
425
- .select('enforced enforcedTenantIds isDefault model name tenantIds')
426
- .sort({ createdAt: 1 })
427
- .lean()
428
- .exec();
420
+ const docs = (await this.dataStore.find(
421
+ { enabled: { $ne: false } },
422
+ { select: ['enforced', 'enforcedTenantIds', 'isDefault', 'model', 'name', 'tenantIds'], sort: { createdAt: 1 } },
423
+ )) as (Partial<CoreAiConnection> & { id: string })[];
429
424
  return docs.map((doc) => ({
430
425
  enforced: doc.enforced,
431
426
  enforcedTenantIds: doc.enforcedTenantIds,
432
- id: String(doc._id),
427
+ id: String(doc.id),
433
428
  isDefault: doc.isDefault,
434
429
  model: doc.model,
435
430
  name: doc.name,
@@ -444,21 +439,18 @@ export class CoreAiConnectionService
444
439
  * @param connectionId Specific connection, or undefined for the default / first enabled one.
445
440
  */
446
441
  async resolve(connectionId?: string): Promise<ResolvedAiConnection> {
447
- // Direct lean reads: system-internal resolution that must access the
442
+ // Direct store reads: system-internal resolution that must access the
448
443
  // encrypted key field, which CrudService strips from outputs.
449
- let doc = connectionId
450
- ? await this.mainDbModel.findById(connectionId).lean().exec()
451
- : await this.mainDbModel
452
- .findOne({ enabled: { $ne: false }, isDefault: true })
453
- .lean()
454
- .exec();
444
+ let doc = (
445
+ connectionId
446
+ ? await this.dataStore.findById(connectionId)
447
+ : await this.dataStore.findOne({ enabled: { $ne: false }, isDefault: true })
448
+ ) as (CoreAiConnection & { id: string }) | null;
455
449
 
456
450
  if (!doc && !connectionId) {
457
- doc = await this.mainDbModel
458
- .findOne({ enabled: { $ne: false } })
459
- .sort({ createdAt: 1 })
460
- .lean()
461
- .exec();
451
+ doc = (await this.dataStore.findOne({ enabled: { $ne: false } }, { sort: { createdAt: 1 } })) as
452
+ | (CoreAiConnection & { id: string })
453
+ | null;
462
454
  }
463
455
 
464
456
  if (!doc) {
@@ -476,7 +468,7 @@ export class CoreAiConnectionService
476
468
  defaultTemperature: doc.defaultTemperature,
477
469
  defaultUserMaxPeriod: doc.defaultUserMaxPeriod,
478
470
  defaultUserMaxTokens: doc.defaultUserMaxTokens,
479
- id: String(doc._id),
471
+ id: String(doc.id),
480
472
  model: doc.model,
481
473
  name: doc.name,
482
474
  providerType: doc.providerType || 'openai-compatible',
@@ -490,11 +482,9 @@ export class CoreAiConnectionService
490
482
  */
491
483
  protected async applyApiKey(id: string, apiKey: string): Promise<void> {
492
484
  if (apiKey === '') {
493
- await this.mainDbModel.findByIdAndUpdate(id, { $unset: { apiKeyEncrypted: 1 } }).exec();
485
+ await this.dataStore.updateById(id, { $unset: { apiKeyEncrypted: 1 } });
494
486
  } else {
495
- await this.mainDbModel
496
- .findByIdAndUpdate(id, { $set: { apiKeyEncrypted: this.aiCryptoService.encrypt(apiKey) } })
497
- .exec();
487
+ await this.dataStore.updateById(id, { $set: { apiKeyEncrypted: this.aiCryptoService.encrypt(apiKey) } });
498
488
  }
499
489
  }
500
490
 
@@ -516,6 +506,6 @@ export class CoreAiConnectionService
516
506
  * Ensure only one connection is marked as default.
517
507
  */
518
508
  protected async unsetOtherDefaults(id: string): Promise<void> {
519
- await this.mainDbModel.updateMany({ _id: { $ne: id } }, { $set: { isDefault: false } }).exec();
509
+ await this.dataStore.updateMany({ id: { $ne: id } }, { $set: { isDefault: false } });
520
510
  }
521
511
  }