@lenne.tech/nest-server 11.25.6 → 11.26.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 (335) hide show
  1. package/.claude/rules/configurable-features.md +2 -0
  2. package/CLAUDE.md +18 -0
  3. package/FRAMEWORK-API.md +48 -1
  4. package/dist/config.env.js +35 -1
  5. package/dist/config.env.js.map +1 -1
  6. package/dist/core/common/helpers/config.helper.js +2 -2
  7. package/dist/core/common/helpers/config.helper.js.map +1 -1
  8. package/dist/core/common/interceptors/check-security.interceptor.js +9 -2
  9. package/dist/core/common/interceptors/check-security.interceptor.js.map +1 -1
  10. package/dist/core/common/interfaces/server-options.interface.d.ts +89 -0
  11. package/dist/core/modules/ai/core-ai-mcp.controller.d.ts +21 -0
  12. package/dist/core/modules/ai/core-ai-mcp.controller.js +191 -0
  13. package/dist/core/modules/ai/core-ai-mcp.controller.js.map +1 -0
  14. package/dist/core/modules/ai/core-ai.controller.d.ts +90 -0
  15. package/dist/core/modules/ai/core-ai.controller.js +576 -0
  16. package/dist/core/modules/ai/core-ai.controller.js.map +1 -0
  17. package/dist/core/modules/ai/core-ai.module.d.ts +43 -0
  18. package/dist/core/modules/ai/core-ai.module.js +164 -0
  19. package/dist/core/modules/ai/core-ai.module.js.map +1 -0
  20. package/dist/core/modules/ai/core-ai.resolver.d.ts +84 -0
  21. package/dist/core/modules/ai/core-ai.resolver.js +530 -0
  22. package/dist/core/modules/ai/core-ai.resolver.js.map +1 -0
  23. package/dist/core/modules/ai/helpers/ai-mcp-oauth.helper.d.ts +7 -0
  24. package/dist/core/modules/ai/helpers/ai-mcp-oauth.helper.js +16 -0
  25. package/dist/core/modules/ai/helpers/ai-mcp-oauth.helper.js.map +1 -0
  26. package/dist/core/modules/ai/hooks/ai-hook.base.d.ts +10 -0
  27. package/dist/core/modules/ai/hooks/ai-hook.base.js +30 -0
  28. package/dist/core/modules/ai/hooks/ai-hook.base.js.map +1 -0
  29. package/dist/core/modules/ai/hooks/ai-hook.registry.d.ts +22 -0
  30. package/dist/core/modules/ai/hooks/ai-hook.registry.js +98 -0
  31. package/dist/core/modules/ai/hooks/ai-hook.registry.js.map +1 -0
  32. package/dist/core/modules/ai/index.d.ts +69 -0
  33. package/dist/core/modules/ai/index.js +86 -0
  34. package/dist/core/modules/ai/index.js.map +1 -0
  35. package/dist/core/modules/ai/inputs/core-ai-budget-limit-create.input.d.ts +5 -0
  36. package/dist/core/modules/ai/inputs/core-ai-budget-limit-create.input.js +43 -0
  37. package/dist/core/modules/ai/inputs/core-ai-budget-limit-create.input.js.map +1 -0
  38. package/dist/core/modules/ai/inputs/core-ai-budget-limit.input.d.ts +7 -0
  39. package/dist/core/modules/ai/inputs/core-ai-budget-limit.input.js +74 -0
  40. package/dist/core/modules/ai/inputs/core-ai-budget-limit.input.js.map +1 -0
  41. package/dist/core/modules/ai/inputs/core-ai-connection-create.input.d.ts +6 -0
  42. package/dist/core/modules/ai/inputs/core-ai-connection-create.input.js +49 -0
  43. package/dist/core/modules/ai/inputs/core-ai-connection-create.input.js.map +1 -0
  44. package/dist/core/modules/ai/inputs/core-ai-connection-preference.input.d.ts +6 -0
  45. package/dist/core/modules/ai/inputs/core-ai-connection-preference.input.js +60 -0
  46. package/dist/core/modules/ai/inputs/core-ai-connection-preference.input.js.map +1 -0
  47. package/dist/core/modules/ai/inputs/core-ai-connection.input.d.ts +23 -0
  48. package/dist/core/modules/ai/inputs/core-ai-connection.input.js +229 -0
  49. package/dist/core/modules/ai/inputs/core-ai-connection.input.js.map +1 -0
  50. package/dist/core/modules/ai/inputs/core-ai-conversation-create.input.d.ts +3 -0
  51. package/dist/core/modules/ai/inputs/core-ai-conversation-create.input.js +21 -0
  52. package/dist/core/modules/ai/inputs/core-ai-conversation-create.input.js.map +1 -0
  53. package/dist/core/modules/ai/inputs/core-ai-conversation.input.d.ts +4 -0
  54. package/dist/core/modules/ai/inputs/core-ai-conversation.input.js +42 -0
  55. package/dist/core/modules/ai/inputs/core-ai-conversation.input.js.map +1 -0
  56. package/dist/core/modules/ai/inputs/core-ai-prompt-create.input.d.ts +10 -0
  57. package/dist/core/modules/ai/inputs/core-ai-prompt-create.input.js +74 -0
  58. package/dist/core/modules/ai/inputs/core-ai-prompt-create.input.js.map +1 -0
  59. package/dist/core/modules/ai/inputs/core-ai-prompt-hint-create.input.d.ts +5 -0
  60. package/dist/core/modules/ai/inputs/core-ai-prompt-hint-create.input.js +41 -0
  61. package/dist/core/modules/ai/inputs/core-ai-prompt-hint-create.input.js.map +1 -0
  62. package/dist/core/modules/ai/inputs/core-ai-prompt-hint.input.d.ts +6 -0
  63. package/dist/core/modules/ai/inputs/core-ai-prompt-hint.input.js +63 -0
  64. package/dist/core/modules/ai/inputs/core-ai-prompt-hint.input.js.map +1 -0
  65. package/dist/core/modules/ai/inputs/core-ai-prompt-update.input.d.ts +10 -0
  66. package/dist/core/modules/ai/inputs/core-ai-prompt-update.input.js +70 -0
  67. package/dist/core/modules/ai/inputs/core-ai-prompt-update.input.js.map +1 -0
  68. package/dist/core/modules/ai/inputs/core-ai-prompt.input.d.ts +18 -0
  69. package/dist/core/modules/ai/inputs/core-ai-prompt.input.js +131 -0
  70. package/dist/core/modules/ai/inputs/core-ai-prompt.input.js.map +1 -0
  71. package/dist/core/modules/ai/inputs/core-ai-slot-create.input.d.ts +5 -0
  72. package/dist/core/modules/ai/inputs/core-ai-slot-create.input.js +41 -0
  73. package/dist/core/modules/ai/inputs/core-ai-slot-create.input.js.map +1 -0
  74. package/dist/core/modules/ai/inputs/core-ai-slot-update.input.d.ts +9 -0
  75. package/dist/core/modules/ai/inputs/core-ai-slot-update.input.js +91 -0
  76. package/dist/core/modules/ai/inputs/core-ai-slot-update.input.js.map +1 -0
  77. package/dist/core/modules/ai/interfaces/ai-hook.interface.d.ts +28 -0
  78. package/dist/core/modules/ai/interfaces/ai-hook.interface.js +3 -0
  79. package/dist/core/modules/ai/interfaces/ai-hook.interface.js.map +1 -0
  80. package/dist/core/modules/ai/interfaces/ai-placeholder.interface.d.ts +21 -0
  81. package/dist/core/modules/ai/interfaces/ai-placeholder.interface.js +3 -0
  82. package/dist/core/modules/ai/interfaces/ai-placeholder.interface.js.map +1 -0
  83. package/dist/core/modules/ai/interfaces/ai-tool.interface.d.ts +30 -0
  84. package/dist/core/modules/ai/interfaces/ai-tool.interface.js +3 -0
  85. package/dist/core/modules/ai/interfaces/ai-tool.interface.js.map +1 -0
  86. package/dist/core/modules/ai/interfaces/llm-provider.interface.d.ts +55 -0
  87. package/dist/core/modules/ai/interfaces/llm-provider.interface.js +3 -0
  88. package/dist/core/modules/ai/interfaces/llm-provider.interface.js.map +1 -0
  89. package/dist/core/modules/ai/interfaces/resolved-ai-connection.interface.d.ts +16 -0
  90. package/dist/core/modules/ai/interfaces/resolved-ai-connection.interface.js +3 -0
  91. package/dist/core/modules/ai/interfaces/resolved-ai-connection.interface.js.map +1 -0
  92. package/dist/core/modules/ai/models/core-ai-action.model.d.ts +6 -0
  93. package/dist/core/modules/ai/models/core-ai-action.model.js +44 -0
  94. package/dist/core/modules/ai/models/core-ai-action.model.js.map +1 -0
  95. package/dist/core/modules/ai/models/core-ai-available-connection.model.d.ts +8 -0
  96. package/dist/core/modules/ai/models/core-ai-available-connection.model.js +53 -0
  97. package/dist/core/modules/ai/models/core-ai-available-connection.model.js.map +1 -0
  98. package/dist/core/modules/ai/models/core-ai-budget-limit.model.d.ts +97 -0
  99. package/dist/core/modules/ai/models/core-ai-budget-limit.model.js +79 -0
  100. package/dist/core/modules/ai/models/core-ai-budget-limit.model.js.map +1 -0
  101. package/dist/core/modules/ai/models/core-ai-connection-preference.model.d.ts +91 -0
  102. package/dist/core/modules/ai/models/core-ai-connection-preference.model.js +67 -0
  103. package/dist/core/modules/ai/models/core-ai-connection-preference.model.js.map +1 -0
  104. package/dist/core/modules/ai/models/core-ai-connection.model.d.ts +200 -0
  105. package/dist/core/modules/ai/models/core-ai-connection.model.js +263 -0
  106. package/dist/core/modules/ai/models/core-ai-connection.model.js.map +1 -0
  107. package/dist/core/modules/ai/models/core-ai-conversation.model.d.ts +93 -0
  108. package/dist/core/modules/ai/models/core-ai-conversation.model.js +82 -0
  109. package/dist/core/modules/ai/models/core-ai-conversation.model.js.map +1 -0
  110. package/dist/core/modules/ai/models/core-ai-interaction.model.d.ts +133 -0
  111. package/dist/core/modules/ai/models/core-ai-interaction.model.js +137 -0
  112. package/dist/core/modules/ai/models/core-ai-interaction.model.js.map +1 -0
  113. package/dist/core/modules/ai/models/core-ai-message.model.d.ts +5 -0
  114. package/dist/core/modules/ai/models/core-ai-message.model.js +38 -0
  115. package/dist/core/modules/ai/models/core-ai-message.model.js.map +1 -0
  116. package/dist/core/modules/ai/models/core-ai-mode.model.d.ts +109 -0
  117. package/dist/core/modules/ai/models/core-ai-mode.model.js +100 -0
  118. package/dist/core/modules/ai/models/core-ai-mode.model.js.map +1 -0
  119. package/dist/core/modules/ai/models/core-ai-prompt-hint.model.d.ts +103 -0
  120. package/dist/core/modules/ai/models/core-ai-prompt-hint.model.js +89 -0
  121. package/dist/core/modules/ai/models/core-ai-prompt-hint.model.js.map +1 -0
  122. package/dist/core/modules/ai/models/core-ai-prompt.model.d.ts +122 -0
  123. package/dist/core/modules/ai/models/core-ai-prompt.model.js +117 -0
  124. package/dist/core/modules/ai/models/core-ai-prompt.model.js.map +1 -0
  125. package/dist/core/modules/ai/models/core-ai-response.model.d.ts +29 -0
  126. package/dist/core/modules/ai/models/core-ai-response.model.js +105 -0
  127. package/dist/core/modules/ai/models/core-ai-response.model.js.map +1 -0
  128. package/dist/core/modules/ai/models/core-ai-slot.model.d.ts +121 -0
  129. package/dist/core/modules/ai/models/core-ai-slot.model.js +119 -0
  130. package/dist/core/modules/ai/models/core-ai-slot.model.js.map +1 -0
  131. package/dist/core/modules/ai/models/core-ai-tool-grant.model.d.ts +103 -0
  132. package/dist/core/modules/ai/models/core-ai-tool-grant.model.js +88 -0
  133. package/dist/core/modules/ai/models/core-ai-tool-grant.model.js.map +1 -0
  134. package/dist/core/modules/ai/models/core-ai-tool-policy.model.d.ts +122 -0
  135. package/dist/core/modules/ai/models/core-ai-tool-policy.model.js +121 -0
  136. package/dist/core/modules/ai/models/core-ai-tool-policy.model.js.map +1 -0
  137. package/dist/core/modules/ai/models/core-ai-usage-info.model.d.ts +24 -0
  138. package/dist/core/modules/ai/models/core-ai-usage-info.model.js +127 -0
  139. package/dist/core/modules/ai/models/core-ai-usage-info.model.js.map +1 -0
  140. package/dist/core/modules/ai/models/core-ai-usage.model.d.ts +5 -0
  141. package/dist/core/modules/ai/models/core-ai-usage.model.js +38 -0
  142. package/dist/core/modules/ai/models/core-ai-usage.model.js.map +1 -0
  143. package/dist/core/modules/ai/providers/claude-cli.provider.d.ts +16 -0
  144. package/dist/core/modules/ai/providers/claude-cli.provider.js +151 -0
  145. package/dist/core/modules/ai/providers/claude-cli.provider.js.map +1 -0
  146. package/dist/core/modules/ai/providers/llm-provider.factory.d.ts +10 -0
  147. package/dist/core/modules/ai/providers/llm-provider.factory.js +45 -0
  148. package/dist/core/modules/ai/providers/llm-provider.factory.js.map +1 -0
  149. package/dist/core/modules/ai/providers/openai-compatible.provider.d.ts +32 -0
  150. package/dist/core/modules/ai/providers/openai-compatible.provider.js +236 -0
  151. package/dist/core/modules/ai/providers/openai-compatible.provider.js.map +1 -0
  152. package/dist/core/modules/ai/services/ai-crypto.service.d.ts +11 -0
  153. package/dist/core/modules/ai/services/ai-crypto.service.js +84 -0
  154. package/dist/core/modules/ai/services/ai-crypto.service.js.map +1 -0
  155. package/dist/core/modules/ai/services/core-ai-budget.service.d.ts +42 -0
  156. package/dist/core/modules/ai/services/core-ai-budget.service.js +211 -0
  157. package/dist/core/modules/ai/services/core-ai-budget.service.js.map +1 -0
  158. package/dist/core/modules/ai/services/core-ai-connection-preference.service.d.ts +18 -0
  159. package/dist/core/modules/ai/services/core-ai-connection-preference.service.js +53 -0
  160. package/dist/core/modules/ai/services/core-ai-connection-preference.service.js.map +1 -0
  161. package/dist/core/modules/ai/services/core-ai-connection-resolver.service.d.ts +55 -0
  162. package/dist/core/modules/ai/services/core-ai-connection-resolver.service.js +177 -0
  163. package/dist/core/modules/ai/services/core-ai-connection-resolver.service.js.map +1 -0
  164. package/dist/core/modules/ai/services/core-ai-connection.service.d.ts +43 -0
  165. package/dist/core/modules/ai/services/core-ai-connection.service.js +272 -0
  166. package/dist/core/modules/ai/services/core-ai-connection.service.js.map +1 -0
  167. package/dist/core/modules/ai/services/core-ai-conversation.service.d.ts +26 -0
  168. package/dist/core/modules/ai/services/core-ai-conversation.service.js +72 -0
  169. package/dist/core/modules/ai/services/core-ai-conversation.service.js.map +1 -0
  170. package/dist/core/modules/ai/services/core-ai-interaction.service.d.ts +13 -0
  171. package/dist/core/modules/ai/services/core-ai-interaction.service.js +52 -0
  172. package/dist/core/modules/ai/services/core-ai-interaction.service.js.map +1 -0
  173. package/dist/core/modules/ai/services/core-ai-mcp-client.service.d.ts +51 -0
  174. package/dist/core/modules/ai/services/core-ai-mcp-client.service.js +123 -0
  175. package/dist/core/modules/ai/services/core-ai-mcp-client.service.js.map +1 -0
  176. package/dist/core/modules/ai/services/core-ai-mcp-oauth.service.d.ts +68 -0
  177. package/dist/core/modules/ai/services/core-ai-mcp-oauth.service.js +279 -0
  178. package/dist/core/modules/ai/services/core-ai-mcp-oauth.service.js.map +1 -0
  179. package/dist/core/modules/ai/services/core-ai-mcp.service.d.ts +22 -0
  180. package/dist/core/modules/ai/services/core-ai-mcp.service.js +59 -0
  181. package/dist/core/modules/ai/services/core-ai-mcp.service.js.map +1 -0
  182. package/dist/core/modules/ai/services/core-ai-mode.service.d.ts +14 -0
  183. package/dist/core/modules/ai/services/core-ai-mode.service.js +56 -0
  184. package/dist/core/modules/ai/services/core-ai-mode.service.js.map +1 -0
  185. package/dist/core/modules/ai/services/core-ai-placeholder.registry.d.ts +15 -0
  186. package/dist/core/modules/ai/services/core-ai-placeholder.registry.js +102 -0
  187. package/dist/core/modules/ai/services/core-ai-placeholder.registry.js.map +1 -0
  188. package/dist/core/modules/ai/services/core-ai-prompt-builder.service.d.ts +42 -0
  189. package/dist/core/modules/ai/services/core-ai-prompt-builder.service.js +136 -0
  190. package/dist/core/modules/ai/services/core-ai-prompt-builder.service.js.map +1 -0
  191. package/dist/core/modules/ai/services/core-ai-prompt-hint.service.d.ts +29 -0
  192. package/dist/core/modules/ai/services/core-ai-prompt-hint.service.js +98 -0
  193. package/dist/core/modules/ai/services/core-ai-prompt-hint.service.js.map +1 -0
  194. package/dist/core/modules/ai/services/core-ai-prompt.service.d.ts +21 -0
  195. package/dist/core/modules/ai/services/core-ai-prompt.service.js +143 -0
  196. package/dist/core/modules/ai/services/core-ai-prompt.service.js.map +1 -0
  197. package/dist/core/modules/ai/services/core-ai-slot.service.d.ts +51 -0
  198. package/dist/core/modules/ai/services/core-ai-slot.service.js +372 -0
  199. package/dist/core/modules/ai/services/core-ai-slot.service.js.map +1 -0
  200. package/dist/core/modules/ai/services/core-ai-tool-grant.service.d.ts +22 -0
  201. package/dist/core/modules/ai/services/core-ai-tool-grant.service.js +97 -0
  202. package/dist/core/modules/ai/services/core-ai-tool-grant.service.js.map +1 -0
  203. package/dist/core/modules/ai/services/core-ai-tool-policy.service.d.ts +23 -0
  204. package/dist/core/modules/ai/services/core-ai-tool-policy.service.js +102 -0
  205. package/dist/core/modules/ai/services/core-ai-tool-policy.service.js.map +1 -0
  206. package/dist/core/modules/ai/services/core-ai.service.d.ts +144 -0
  207. package/dist/core/modules/ai/services/core-ai.service.js +991 -0
  208. package/dist/core/modules/ai/services/core-ai.service.js.map +1 -0
  209. package/dist/core/modules/ai/tools/ai-tool.base.d.ts +15 -0
  210. package/dist/core/modules/ai/tools/ai-tool.base.js +30 -0
  211. package/dist/core/modules/ai/tools/ai-tool.base.js.map +1 -0
  212. package/dist/core/modules/ai/tools/ai-tool.registry.d.ts +19 -0
  213. package/dist/core/modules/ai/tools/ai-tool.registry.js +71 -0
  214. package/dist/core/modules/ai/tools/ai-tool.registry.js.map +1 -0
  215. package/dist/core/modules/ai/tools/ask-user-question.tool.d.ts +38 -0
  216. package/dist/core/modules/ai/tools/ask-user-question.tool.js +65 -0
  217. package/dist/core/modules/ai/tools/ask-user-question.tool.js.map +1 -0
  218. package/dist/core/modules/ai/tools/search-tools.tool.d.ts +24 -0
  219. package/dist/core/modules/ai/tools/search-tools.tool.js +68 -0
  220. package/dist/core/modules/ai/tools/search-tools.tool.js.map +1 -0
  221. package/dist/core/modules/error-code/error-codes.d.ts +81 -0
  222. package/dist/core/modules/error-code/error-codes.js +72 -0
  223. package/dist/core/modules/error-code/error-codes.js.map +1 -1
  224. package/dist/core.module.js +8 -0
  225. package/dist/core.module.js.map +1 -1
  226. package/dist/index.d.ts +1 -0
  227. package/dist/index.js +1 -0
  228. package/dist/index.js.map +1 -1
  229. package/dist/server/modules/ai/ai-tools.module.d.ts +5 -0
  230. package/dist/server/modules/ai/ai-tools.module.js +36 -0
  231. package/dist/server/modules/ai/ai-tools.module.js.map +1 -0
  232. package/dist/server/modules/ai/tools/delete-user.tool.d.ts +30 -0
  233. package/dist/server/modules/ai/tools/delete-user.tool.js +49 -0
  234. package/dist/server/modules/ai/tools/delete-user.tool.js.map +1 -0
  235. package/dist/server/modules/ai/tools/find-users.tool.d.ts +30 -0
  236. package/dist/server/modules/ai/tools/find-users.tool.js +52 -0
  237. package/dist/server/modules/ai/tools/find-users.tool.js.map +1 -0
  238. package/dist/server/modules/ai/tools/get-user.tool.d.ts +26 -0
  239. package/dist/server/modules/ai/tools/get-user.tool.js +48 -0
  240. package/dist/server/modules/ai/tools/get-user.tool.js.map +1 -0
  241. package/dist/server/modules/ai/tools/update-user-job-title.tool.d.ts +32 -0
  242. package/dist/server/modules/ai/tools/update-user-job-title.tool.js +54 -0
  243. package/dist/server/modules/ai/tools/update-user-job-title.tool.js.map +1 -0
  244. package/dist/server/modules/error-code/error-codes.d.ts +9 -0
  245. package/dist/server/server.module.js +2 -0
  246. package/dist/server/server.module.js.map +1 -1
  247. package/dist/tsconfig.build.tsbuildinfo +1 -1
  248. package/docs/REQUEST-LIFECYCLE.md +10 -0
  249. package/migration-guides/11.25.x-to-11.26.0.md +278 -0
  250. package/package.json +2 -1
  251. package/src/config.env.ts +48 -1
  252. package/src/core/common/helpers/config.helper.ts +5 -2
  253. package/src/core/common/interceptors/check-security.interceptor.ts +13 -3
  254. package/src/core/common/interfaces/server-options.interface.ts +312 -0
  255. package/src/core/modules/ai/INTEGRATION-CHECKLIST.md +220 -0
  256. package/src/core/modules/ai/README.md +526 -0
  257. package/src/core/modules/ai/core-ai-mcp.controller.ts +223 -0
  258. package/src/core/modules/ai/core-ai.controller.ts +547 -0
  259. package/src/core/modules/ai/core-ai.module.ts +269 -0
  260. package/src/core/modules/ai/core-ai.resolver.ts +526 -0
  261. package/src/core/modules/ai/helpers/ai-mcp-oauth.helper.ts +35 -0
  262. package/src/core/modules/ai/hooks/ai-hook.base.ts +23 -0
  263. package/src/core/modules/ai/hooks/ai-hook.registry.ts +119 -0
  264. package/src/core/modules/ai/index.ts +70 -0
  265. package/src/core/modules/ai/inputs/core-ai-budget-limit-create.input.ts +27 -0
  266. package/src/core/modules/ai/inputs/core-ai-budget-limit.input.ts +52 -0
  267. package/src/core/modules/ai/inputs/core-ai-connection-create.input.ts +32 -0
  268. package/src/core/modules/ai/inputs/core-ai-connection-preference.input.ts +42 -0
  269. package/src/core/modules/ai/inputs/core-ai-connection.input.ts +235 -0
  270. package/src/core/modules/ai/inputs/core-ai-conversation-create.input.ts +13 -0
  271. package/src/core/modules/ai/inputs/core-ai-conversation.input.ts +33 -0
  272. package/src/core/modules/ai/inputs/core-ai-prompt-create.input.ts +50 -0
  273. package/src/core/modules/ai/inputs/core-ai-prompt-hint-create.input.ts +26 -0
  274. package/src/core/modules/ai/inputs/core-ai-prompt-hint.input.ts +43 -0
  275. package/src/core/modules/ai/inputs/core-ai-prompt-update.input.ts +42 -0
  276. package/src/core/modules/ai/inputs/core-ai-prompt.input.ts +144 -0
  277. package/src/core/modules/ai/inputs/core-ai-slot-create.input.ts +26 -0
  278. package/src/core/modules/ai/inputs/core-ai-slot-update.input.ts +65 -0
  279. package/src/core/modules/ai/interfaces/ai-hook.interface.ts +74 -0
  280. package/src/core/modules/ai/interfaces/ai-placeholder.interface.ts +49 -0
  281. package/src/core/modules/ai/interfaces/ai-tool.interface.ts +112 -0
  282. package/src/core/modules/ai/interfaces/llm-provider.interface.ts +187 -0
  283. package/src/core/modules/ai/interfaces/resolved-ai-connection.interface.ts +55 -0
  284. package/src/core/modules/ai/models/core-ai-action.model.ts +37 -0
  285. package/src/core/modules/ai/models/core-ai-available-connection.model.ts +42 -0
  286. package/src/core/modules/ai/models/core-ai-budget-limit.model.ts +82 -0
  287. package/src/core/modules/ai/models/core-ai-connection-preference.model.ts +72 -0
  288. package/src/core/modules/ai/models/core-ai-connection.model.ts +330 -0
  289. package/src/core/modules/ai/models/core-ai-conversation.model.ts +87 -0
  290. package/src/core/modules/ai/models/core-ai-interaction.model.ts +145 -0
  291. package/src/core/modules/ai/models/core-ai-message.model.ts +29 -0
  292. package/src/core/modules/ai/models/core-ai-mode.model.ts +93 -0
  293. package/src/core/modules/ai/models/core-ai-prompt-hint.model.ts +98 -0
  294. package/src/core/modules/ai/models/core-ai-prompt.model.ts +120 -0
  295. package/src/core/modules/ai/models/core-ai-response.model.ts +119 -0
  296. package/src/core/modules/ai/models/core-ai-slot.model.ts +146 -0
  297. package/src/core/modules/ai/models/core-ai-tool-grant.model.ts +87 -0
  298. package/src/core/modules/ai/models/core-ai-tool-policy.model.ts +115 -0
  299. package/src/core/modules/ai/models/core-ai-usage-info.model.ts +107 -0
  300. package/src/core/modules/ai/models/core-ai-usage.model.ts +29 -0
  301. package/src/core/modules/ai/providers/claude-cli.provider.ts +240 -0
  302. package/src/core/modules/ai/providers/llm-provider.factory.ts +63 -0
  303. package/src/core/modules/ai/providers/openai-compatible.provider.ts +329 -0
  304. package/src/core/modules/ai/services/ai-crypto.service.ts +120 -0
  305. package/src/core/modules/ai/services/core-ai-budget.service.ts +297 -0
  306. package/src/core/modules/ai/services/core-ai-connection-preference.service.ts +74 -0
  307. package/src/core/modules/ai/services/core-ai-connection-resolver.service.ts +308 -0
  308. package/src/core/modules/ai/services/core-ai-connection.service.ts +387 -0
  309. package/src/core/modules/ai/services/core-ai-conversation.service.ts +105 -0
  310. package/src/core/modules/ai/services/core-ai-interaction.service.ts +56 -0
  311. package/src/core/modules/ai/services/core-ai-mcp-client.service.ts +169 -0
  312. package/src/core/modules/ai/services/core-ai-mcp-oauth.service.ts +445 -0
  313. package/src/core/modules/ai/services/core-ai-mcp.service.ts +94 -0
  314. package/src/core/modules/ai/services/core-ai-mode.service.ts +43 -0
  315. package/src/core/modules/ai/services/core-ai-placeholder.registry.ts +123 -0
  316. package/src/core/modules/ai/services/core-ai-prompt-builder.service.ts +228 -0
  317. package/src/core/modules/ai/services/core-ai-prompt-hint.service.ts +133 -0
  318. package/src/core/modules/ai/services/core-ai-prompt.service.ts +164 -0
  319. package/src/core/modules/ai/services/core-ai-slot.service.ts +526 -0
  320. package/src/core/modules/ai/services/core-ai-tool-grant.service.ts +107 -0
  321. package/src/core/modules/ai/services/core-ai-tool-policy.service.ts +124 -0
  322. package/src/core/modules/ai/services/core-ai.service.ts +1396 -0
  323. package/src/core/modules/ai/tools/ai-tool.base.ts +46 -0
  324. package/src/core/modules/ai/tools/ai-tool.registry.ts +124 -0
  325. package/src/core/modules/ai/tools/ask-user-question.tool.ts +76 -0
  326. package/src/core/modules/ai/tools/search-tools.tool.ts +70 -0
  327. package/src/core/modules/error-code/error-codes.ts +86 -0
  328. package/src/core.module.ts +12 -0
  329. package/src/index.ts +6 -0
  330. package/src/server/modules/ai/ai-tools.module.ts +33 -0
  331. package/src/server/modules/ai/tools/delete-user.tool.ts +44 -0
  332. package/src/server/modules/ai/tools/find-users.tool.ts +49 -0
  333. package/src/server/modules/ai/tools/get-user.tool.ts +43 -0
  334. package/src/server/modules/ai/tools/update-user-job-title.tool.ts +62 -0
  335. package/src/server/server.module.ts +5 -0
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Abstraction layer for Large Language Model (LLM) providers.
3
+ *
4
+ * A provider encapsulates the transport to an LLM backend — local runtimes or
5
+ * hosted endpoints, with or without native tool/JSON support. The orchestrator
6
+ * ({@link CoreAiService}) talks only to this interface, so backends can be
7
+ * swapped or extended without touching the agent loop. Nothing here is tied to a
8
+ * specific vendor.
9
+ *
10
+ * ## Capability gradations
11
+ *
12
+ * Backends differ in what they support. Providers therefore declare their
13
+ * {@link LlmCapabilities}, and the orchestrator compensates across the whole
14
+ * spectrum:
15
+ * - `nativeTools: true` → tool schemas are passed natively and `toolCalls` are
16
+ * read from the response.
17
+ * - `nativeTools: false` → tool calling is emulated: the tool catalog is injected
18
+ * into the system prompt and a structured JSON block is parsed from the text.
19
+ * - `jsonResponse: true` → a JSON/structured-output mode is requested; otherwise
20
+ * JSON is requested via the prompt and parsed defensively.
21
+ */
22
+ export type LlmMessageRole = 'assistant' | 'system' | 'tool' | 'user';
23
+
24
+ /**
25
+ * Capabilities a provider/backend supports. Used by the orchestrator to decide
26
+ * between native and emulated handling, so every gradation is supported.
27
+ */
28
+ export interface LlmCapabilities {
29
+ /** Native JSON / structured-output mode (e.g. `response_format`). */
30
+ jsonResponse: boolean;
31
+
32
+ /** Native function/tool calling (the `tools` parameter). */
33
+ nativeTools: boolean;
34
+
35
+ /** Support for a `system` role message (true for virtually all backends). */
36
+ systemPrompt: boolean;
37
+ }
38
+
39
+ /**
40
+ * A multi-modal attachment (image / file) on a message. Providers that support
41
+ * vision/file inputs translate this into their native format (e.g. OpenAI's
42
+ * content-parts array with `image_url`); others ignore it.
43
+ */
44
+ export interface LlmAttachment {
45
+ /** Inline base64 data — `data:<mime>;base64,<...>`. */
46
+ dataUrl?: string;
47
+ /** MIME type (e.g. `image/png`, `application/pdf`). */
48
+ mimeType: string;
49
+ /** Optional human-readable name. */
50
+ name?: string;
51
+ /** Public URL (alternative to `dataUrl`). */
52
+ url?: string;
53
+ }
54
+
55
+ /**
56
+ * A single chat message exchanged with the LLM.
57
+ */
58
+ export interface LlmMessage {
59
+ /** Optional multi-modal attachments (images, files). */
60
+ attachments?: LlmAttachment[];
61
+
62
+ /** Plain-text content of the message. */
63
+ content: string;
64
+
65
+ /** Author role of the message. */
66
+ role: LlmMessageRole;
67
+ }
68
+
69
+ /**
70
+ * JSON-schema description of a tool the LLM may call.
71
+ */
72
+ export interface LlmToolSchema {
73
+ /** Human-readable description used by the model to decide when to call the tool. */
74
+ description: string;
75
+
76
+ /** Unique tool name (snake_case recommended). */
77
+ name: string;
78
+
79
+ /** JSON schema of the tool's input arguments. */
80
+ parameters: Record<string, any>;
81
+ }
82
+
83
+ /**
84
+ * A tool invocation requested by the LLM.
85
+ */
86
+ export interface LlmToolCall {
87
+ /** Parsed arguments for the tool. */
88
+ arguments: Record<string, any>;
89
+
90
+ /** Optional provider-specific call id (used by native tool calling). */
91
+ id?: string;
92
+
93
+ /** Name of the tool to call. */
94
+ name: string;
95
+ }
96
+
97
+ /**
98
+ * Token usage reported by the provider (best effort).
99
+ */
100
+ export interface LlmUsage {
101
+ completionTokens?: number;
102
+ promptTokens?: number;
103
+ totalTokens?: number;
104
+ }
105
+
106
+ /**
107
+ * Per-request completion options. Values fall back to the connection defaults
108
+ * when omitted.
109
+ */
110
+ export interface LlmCompletionOptions {
111
+ /** Maximum number of tokens to generate. */
112
+ maxTokens?: number;
113
+
114
+ /** Overrides the model id of the resolved connection. */
115
+ model?: string;
116
+
117
+ /** Sampling temperature. */
118
+ temperature?: number;
119
+
120
+ /** Per-request timeout in milliseconds. */
121
+ timeoutMs?: number;
122
+ }
123
+
124
+ /**
125
+ * Normalized response of a single LLM completion.
126
+ */
127
+ export interface LlmResponse {
128
+ /** Raw provider payload (for debugging/audit, never sent to clients). */
129
+ raw?: unknown;
130
+
131
+ /** Natural-language text content of the response. */
132
+ text: string;
133
+
134
+ /** Tool calls (only populated when {@link ILlmProvider.supportsNativeTools} is true). */
135
+ toolCalls?: LlmToolCall[];
136
+
137
+ /** Token usage (best effort). */
138
+ usage?: LlmUsage;
139
+ }
140
+
141
+ /**
142
+ * Result of capability auto-detection. Only the probed (previously undefined)
143
+ * flags are present; explicit flags are authoritative and never probed.
144
+ */
145
+ export interface LlmDetectedCapabilities {
146
+ /** Detected `response_format` / JSON-mode support, or undefined if not probed. */
147
+ jsonResponse?: boolean;
148
+
149
+ /** Detected native tool-calling support, or undefined if not probed. */
150
+ nativeTools?: boolean;
151
+ }
152
+
153
+ /**
154
+ * Provider abstraction. Implementations are created per request by the
155
+ * {@link LlmProviderFactory} from a persisted {@link CoreAiConnection}.
156
+ */
157
+ export interface ILlmProvider {
158
+ /** Declared capabilities of the backend (drives native vs. emulated handling). */
159
+ readonly capabilities: LlmCapabilities;
160
+
161
+ /** Identifier of the provider implementation (e.g. 'openai-compatible'). */
162
+ readonly name: string;
163
+
164
+ /**
165
+ * Run a chat completion.
166
+ *
167
+ * @param messages Conversation so far (system + user + assistant + tool).
168
+ * @param tools Tool schemas the model may use (ignored when not supported).
169
+ * @param options Per-request completion options.
170
+ */
171
+ chat(messages: LlmMessage[], tools: LlmToolSchema[], options?: LlmCompletionOptions): Promise<LlmResponse>;
172
+
173
+ /**
174
+ * Optionally probe the backend to auto-detect capabilities for connection flags
175
+ * that were left undefined (provider-agnostic best effort). Implementations that
176
+ * cannot probe simply omit this method. Should resolve only the undefined flags
177
+ * and throw on a transport error so callers can treat the connection as undetected.
178
+ */
179
+ detectCapabilities?(): Promise<LlmDetectedCapabilities>;
180
+
181
+ /**
182
+ * Optionally determine the model's total context window (tokens) automatically —
183
+ * e.g. from a known-model table or backend metadata. Returns `undefined` when it
184
+ * cannot be determined. Implementations that cannot detect it omit this method.
185
+ */
186
+ detectContextWindow?(): Promise<number | undefined>;
187
+ }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * A fully resolved AI connection ready to instantiate a provider.
3
+ *
4
+ * This is the runtime shape produced by {@link CoreAiConnectionService.resolve}
5
+ * after reading the persisted {@link CoreAiConnection} and decrypting its API
6
+ * key. It is system-internal and MUST NOT be returned to clients (it carries the
7
+ * plaintext API key).
8
+ */
9
+ export interface ResolvedAiConnection {
10
+ /** Plaintext API key (decrypted or read from the env fallback). May be empty for keyless local backends. */
11
+ apiKey: string;
12
+
13
+ /** Base URL of the OpenAI-compatible endpoint (e.g. 'https://llm.example.com/v1'). */
14
+ baseUrl: string;
15
+
16
+ /** Total context window (input + output tokens) the model supports, if known. */
17
+ contextWindow?: number;
18
+
19
+ /** Default maximum number of tokens for completions. */
20
+ defaultMaxTokens?: number;
21
+
22
+ /** Default sampling temperature. */
23
+ defaultTemperature?: number;
24
+
25
+ /**
26
+ * Provider-side soft user quota (tokens) over {@link defaultUserMaxPeriod}.
27
+ * Used as a fallback in the budget summary when no user / tenant hard limit
28
+ * is configured.
29
+ */
30
+ defaultUserMaxTokens?: number;
31
+
32
+ /** Period for {@link defaultUserMaxTokens} (`day` | `month` | `none`). */
33
+ defaultUserMaxPeriod?: string;
34
+
35
+ /** Connection id (for audit/logging). */
36
+ id: string;
37
+
38
+ /** Model id sent to the backend (e.g. 'gpt-oss-120b'). */
39
+ model: string;
40
+
41
+ /** Human-readable connection name. */
42
+ name: string;
43
+
44
+ /** Provider implementation key (e.g. 'openai-compatible'). */
45
+ providerType: string;
46
+
47
+ /** Whether the backend natively supports JSON/structured-output mode. */
48
+ supportsJsonResponse?: boolean;
49
+
50
+ /** Whether the backend natively supports function/tool calling. */
51
+ supportsNativeTools?: boolean;
52
+
53
+ /** Per-request timeout in milliseconds. */
54
+ timeoutMs?: number;
55
+ }
@@ -0,0 +1,37 @@
1
+ import { Field, ObjectType } from '@nestjs/graphql';
2
+
3
+ import { Restricted } from '../../../common/decorators/restricted.decorator';
4
+ import { RoleEnum } from '../../../common/enums/role.enum';
5
+ import { JSON } from '../../../common/scalars/json.scalar';
6
+
7
+ /**
8
+ * A single tool execution performed during an AI prompt — surfaced to the
9
+ * frontend for transparency (what the assistant actually did).
10
+ */
11
+ @ObjectType({ description: 'A tool action executed during an AI prompt' })
12
+ @Restricted(RoleEnum.S_EVERYONE)
13
+ export class CoreAiAction {
14
+ /**
15
+ * Arguments the tool was called with.
16
+ */
17
+ @Field(() => JSON, { description: 'Arguments the tool was called with', nullable: true })
18
+ arguments?: Record<string, any>;
19
+
20
+ /**
21
+ * Name of the executed tool.
22
+ */
23
+ @Field(() => String, { description: 'Name of the executed tool' })
24
+ name: string;
25
+
26
+ /**
27
+ * Result payload returned by the tool (already permission-filtered).
28
+ */
29
+ @Field(() => JSON, { description: 'Result returned by the tool', nullable: true })
30
+ result?: unknown;
31
+
32
+ /**
33
+ * Whether the tool executed successfully.
34
+ */
35
+ @Field(() => Boolean, { description: 'Whether the tool executed successfully' })
36
+ success: boolean;
37
+ }
@@ -0,0 +1,42 @@
1
+ import { Field, ObjectType } from '@nestjs/graphql';
2
+
3
+ import { Restricted } from '../../../common/decorators/restricted.decorator';
4
+ import { RoleEnum } from '../../../common/enums/role.enum';
5
+
6
+ /**
7
+ * A connection the current user/tenant may use, in a non-sensitive shape safe to
8
+ * return to any authenticated user (no API key, no base URL).
9
+ *
10
+ * Returned by the `aiAvailableConnections` query / `GET /ai/connections/available`
11
+ * so a client can offer a connection picker. `selected` marks the connection that
12
+ * the resolution chain currently resolves to for the caller; `locked` signals that
13
+ * the selection is dictated by a mandatory layer (admin- or tenant-enforced) and
14
+ * cannot be overridden by the user.
15
+ */
16
+ @ObjectType({ description: 'An AI connection available to the current user/tenant' })
17
+ @Restricted(RoleEnum.S_USER)
18
+ export class CoreAiAvailableConnection {
19
+ /** The connection id. */
20
+ @Field(() => String, { description: 'The connection id' })
21
+ id: string;
22
+
23
+ /** Whether this is the global default connection. */
24
+ @Field(() => Boolean, { description: 'Whether this is the global default connection' })
25
+ isDefault: boolean;
26
+
27
+ /** Whether the selection is dictated by a mandatory layer (cannot be changed by the user). */
28
+ @Field(() => Boolean, { description: 'Whether the selection is enforced and cannot be changed by the user' })
29
+ locked: boolean;
30
+
31
+ /** The model id used by the connection (for display). */
32
+ @Field(() => String, { description: 'The model id used by the connection', nullable: true })
33
+ model?: string;
34
+
35
+ /** The display name of the connection. */
36
+ @Field(() => String, { description: 'The display name of the connection', nullable: true })
37
+ name?: string;
38
+
39
+ /** Whether this connection is the one currently resolved for the caller. */
40
+ @Field(() => Boolean, { description: 'Whether this connection is currently resolved for the caller' })
41
+ selected: boolean;
42
+ }
@@ -0,0 +1,82 @@
1
+ import { ObjectType } from '@nestjs/graphql';
2
+ import { Schema as MongooseSchema, SchemaFactory } from '@nestjs/mongoose';
3
+ import { Document } from 'mongoose';
4
+
5
+ import { Restricted } from '../../../common/decorators/restricted.decorator';
6
+ import { UnifiedField } from '../../../common/decorators/unified-field.decorator';
7
+ import { RoleEnum } from '../../../common/enums/role.enum';
8
+ import { CorePersistenceModel } from '../../../common/models/core-persistence.model';
9
+
10
+ export type AiBudgetLimitDocument = CoreAiBudgetLimit & Document;
11
+
12
+ /**
13
+ * Admin-configured token/prompt limit override for a specific user or tenant.
14
+ *
15
+ * Overrides the config defaults (`ai.budget.user` / `ai.budget.tenant`). A missing
16
+ * or `0`/undefined `maxTokens`/`maxPrompts` means unlimited for that dimension.
17
+ * Deliberately has NO `tenantId` path so it is NOT tenant-scoped — admins manage
18
+ * all limits globally.
19
+ */
20
+ @MongooseSchema({ collection: 'aiBudgetLimits', timestamps: true })
21
+ @ObjectType({ description: 'Admin-configured AI token/prompt limit for a user or tenant' })
22
+ @Restricted(RoleEnum.ADMIN)
23
+ export class CoreAiBudgetLimit extends CorePersistenceModel {
24
+ /**
25
+ * Maximum number of prompts per reset period (undefined/0 = unlimited).
26
+ */
27
+ @UnifiedField({
28
+ description: 'Maximum number of prompts per reset period (0/undefined = unlimited)',
29
+ isOptional: true,
30
+ mongoose: true,
31
+ roles: RoleEnum.ADMIN,
32
+ type: () => Number,
33
+ })
34
+ maxPrompts?: number = undefined;
35
+
36
+ /**
37
+ * Maximum number of tokens per reset period (undefined/0 = unlimited).
38
+ */
39
+ @UnifiedField({
40
+ description: 'Maximum number of tokens per reset period (0/undefined = unlimited)',
41
+ isOptional: true,
42
+ mongoose: true,
43
+ roles: RoleEnum.ADMIN,
44
+ type: () => Number,
45
+ })
46
+ maxTokens?: number = undefined;
47
+
48
+ /**
49
+ * Reset period: 'day', 'month' or 'none' (no reset). Defaults to the config period.
50
+ */
51
+ @UnifiedField({
52
+ description: "Reset period: 'day', 'month' or 'none'",
53
+ isOptional: true,
54
+ mongoose: true,
55
+ roles: RoleEnum.ADMIN,
56
+ })
57
+ period?: string = undefined;
58
+
59
+ /**
60
+ * Id of the user or tenant this limit applies to.
61
+ */
62
+ @UnifiedField({
63
+ description: 'Id of the user or tenant this limit applies to',
64
+ mongoose: true,
65
+ roles: RoleEnum.ADMIN,
66
+ })
67
+ refId: string = undefined;
68
+
69
+ /**
70
+ * Scope of the limit: 'user' or 'tenant'.
71
+ */
72
+ @UnifiedField({
73
+ description: "Scope of the limit: 'user' or 'tenant'",
74
+ mongoose: true,
75
+ roles: RoleEnum.ADMIN,
76
+ })
77
+ scope: string = undefined;
78
+ }
79
+
80
+ export const AiBudgetLimitSchema = SchemaFactory.createForClass(CoreAiBudgetLimit);
81
+ // Compound index: one limit per (scope, refId).
82
+ AiBudgetLimitSchema.index({ scope: 1, refId: 1 }, { unique: true });
@@ -0,0 +1,72 @@
1
+ import { ObjectType } from '@nestjs/graphql';
2
+ import { Schema as MongooseSchema, SchemaFactory } from '@nestjs/mongoose';
3
+ import { Document } from 'mongoose';
4
+
5
+ import { Restricted } from '../../../common/decorators/restricted.decorator';
6
+ import { UnifiedField } from '../../../common/decorators/unified-field.decorator';
7
+ import { RoleEnum } from '../../../common/enums/role.enum';
8
+ import { CorePersistenceModel } from '../../../common/models/core-persistence.model';
9
+
10
+ export type AiConnectionPreferenceDocument = CoreAiConnectionPreference & Document;
11
+
12
+ /**
13
+ * A connection preference for a tenant or a user — the configurable layers of the
14
+ * connection-resolution chain that are NOT platform-admin connection flags:
15
+ *
16
+ * - `scope: 'tenant'`, `enforced: false` → the tenant's default connection (layer 2)
17
+ * - `scope: 'user'` → the user's default connection (layer 3)
18
+ * - `scope: 'tenant'`, `enforced: true` → tenant-enforced connection (layer 5)
19
+ *
20
+ * `refId` is the tenant id or user id. Unique per `(scope, refId)`.
21
+ */
22
+ @MongooseSchema({ collection: 'aiConnectionPreferences', timestamps: true })
23
+ @ObjectType({ description: 'AI connection preference for a tenant or user' })
24
+ @Restricted(RoleEnum.ADMIN)
25
+ export class CoreAiConnectionPreference extends CorePersistenceModel {
26
+ /**
27
+ * The selected connection id.
28
+ */
29
+ @UnifiedField({
30
+ description: 'The selected connection id',
31
+ mongoose: true,
32
+ roles: RoleEnum.ADMIN,
33
+ })
34
+ connectionId: string = undefined;
35
+
36
+ /**
37
+ * For tenant scope: whether the connection is enforced (mandatory for the tenant's
38
+ * users, overriding user/client selection). Ignored for user scope.
39
+ */
40
+ @UnifiedField({
41
+ description: 'Whether the tenant connection is enforced (tenant scope only)',
42
+ isOptional: true,
43
+ mongoose: { default: false },
44
+ roles: RoleEnum.ADMIN,
45
+ type: () => Boolean,
46
+ })
47
+ enforced?: boolean = undefined;
48
+
49
+ /**
50
+ * The tenant id or user id this preference belongs to.
51
+ */
52
+ @UnifiedField({
53
+ description: 'The tenant id or user id this preference belongs to',
54
+ mongoose: true,
55
+ roles: RoleEnum.ADMIN,
56
+ })
57
+ refId: string = undefined;
58
+
59
+ /**
60
+ * Scope of the preference: 'tenant' or 'user'.
61
+ */
62
+ @UnifiedField({
63
+ description: "Scope of the preference: 'tenant' or 'user'",
64
+ mongoose: true,
65
+ roles: RoleEnum.ADMIN,
66
+ })
67
+ scope: string = undefined;
68
+ }
69
+
70
+ export const AiConnectionPreferenceSchema = SchemaFactory.createForClass(CoreAiConnectionPreference);
71
+ // One preference per (scope, refId).
72
+ AiConnectionPreferenceSchema.index({ scope: 1, refId: 1 }, { unique: true });