@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.
- package/.claude/rules/configurable-features.md +2 -0
- package/CLAUDE.md +18 -0
- package/FRAMEWORK-API.md +48 -1
- package/dist/config.env.js +35 -1
- package/dist/config.env.js.map +1 -1
- package/dist/core/common/helpers/config.helper.js +2 -2
- package/dist/core/common/helpers/config.helper.js.map +1 -1
- package/dist/core/common/interceptors/check-security.interceptor.js +9 -2
- package/dist/core/common/interceptors/check-security.interceptor.js.map +1 -1
- package/dist/core/common/interfaces/server-options.interface.d.ts +89 -0
- package/dist/core/modules/ai/core-ai-mcp.controller.d.ts +21 -0
- package/dist/core/modules/ai/core-ai-mcp.controller.js +191 -0
- package/dist/core/modules/ai/core-ai-mcp.controller.js.map +1 -0
- package/dist/core/modules/ai/core-ai.controller.d.ts +90 -0
- package/dist/core/modules/ai/core-ai.controller.js +576 -0
- package/dist/core/modules/ai/core-ai.controller.js.map +1 -0
- package/dist/core/modules/ai/core-ai.module.d.ts +43 -0
- package/dist/core/modules/ai/core-ai.module.js +164 -0
- package/dist/core/modules/ai/core-ai.module.js.map +1 -0
- package/dist/core/modules/ai/core-ai.resolver.d.ts +84 -0
- package/dist/core/modules/ai/core-ai.resolver.js +530 -0
- package/dist/core/modules/ai/core-ai.resolver.js.map +1 -0
- package/dist/core/modules/ai/helpers/ai-mcp-oauth.helper.d.ts +7 -0
- package/dist/core/modules/ai/helpers/ai-mcp-oauth.helper.js +16 -0
- package/dist/core/modules/ai/helpers/ai-mcp-oauth.helper.js.map +1 -0
- package/dist/core/modules/ai/hooks/ai-hook.base.d.ts +10 -0
- package/dist/core/modules/ai/hooks/ai-hook.base.js +30 -0
- package/dist/core/modules/ai/hooks/ai-hook.base.js.map +1 -0
- package/dist/core/modules/ai/hooks/ai-hook.registry.d.ts +22 -0
- package/dist/core/modules/ai/hooks/ai-hook.registry.js +98 -0
- package/dist/core/modules/ai/hooks/ai-hook.registry.js.map +1 -0
- package/dist/core/modules/ai/index.d.ts +69 -0
- package/dist/core/modules/ai/index.js +86 -0
- package/dist/core/modules/ai/index.js.map +1 -0
- package/dist/core/modules/ai/inputs/core-ai-budget-limit-create.input.d.ts +5 -0
- package/dist/core/modules/ai/inputs/core-ai-budget-limit-create.input.js +43 -0
- package/dist/core/modules/ai/inputs/core-ai-budget-limit-create.input.js.map +1 -0
- package/dist/core/modules/ai/inputs/core-ai-budget-limit.input.d.ts +7 -0
- package/dist/core/modules/ai/inputs/core-ai-budget-limit.input.js +74 -0
- package/dist/core/modules/ai/inputs/core-ai-budget-limit.input.js.map +1 -0
- package/dist/core/modules/ai/inputs/core-ai-connection-create.input.d.ts +6 -0
- package/dist/core/modules/ai/inputs/core-ai-connection-create.input.js +49 -0
- package/dist/core/modules/ai/inputs/core-ai-connection-create.input.js.map +1 -0
- package/dist/core/modules/ai/inputs/core-ai-connection-preference.input.d.ts +6 -0
- package/dist/core/modules/ai/inputs/core-ai-connection-preference.input.js +60 -0
- package/dist/core/modules/ai/inputs/core-ai-connection-preference.input.js.map +1 -0
- package/dist/core/modules/ai/inputs/core-ai-connection.input.d.ts +23 -0
- package/dist/core/modules/ai/inputs/core-ai-connection.input.js +229 -0
- package/dist/core/modules/ai/inputs/core-ai-connection.input.js.map +1 -0
- package/dist/core/modules/ai/inputs/core-ai-conversation-create.input.d.ts +3 -0
- package/dist/core/modules/ai/inputs/core-ai-conversation-create.input.js +21 -0
- package/dist/core/modules/ai/inputs/core-ai-conversation-create.input.js.map +1 -0
- package/dist/core/modules/ai/inputs/core-ai-conversation.input.d.ts +4 -0
- package/dist/core/modules/ai/inputs/core-ai-conversation.input.js +42 -0
- package/dist/core/modules/ai/inputs/core-ai-conversation.input.js.map +1 -0
- package/dist/core/modules/ai/inputs/core-ai-prompt-create.input.d.ts +10 -0
- package/dist/core/modules/ai/inputs/core-ai-prompt-create.input.js +74 -0
- package/dist/core/modules/ai/inputs/core-ai-prompt-create.input.js.map +1 -0
- package/dist/core/modules/ai/inputs/core-ai-prompt-hint-create.input.d.ts +5 -0
- package/dist/core/modules/ai/inputs/core-ai-prompt-hint-create.input.js +41 -0
- package/dist/core/modules/ai/inputs/core-ai-prompt-hint-create.input.js.map +1 -0
- package/dist/core/modules/ai/inputs/core-ai-prompt-hint.input.d.ts +6 -0
- package/dist/core/modules/ai/inputs/core-ai-prompt-hint.input.js +63 -0
- package/dist/core/modules/ai/inputs/core-ai-prompt-hint.input.js.map +1 -0
- package/dist/core/modules/ai/inputs/core-ai-prompt-update.input.d.ts +10 -0
- package/dist/core/modules/ai/inputs/core-ai-prompt-update.input.js +70 -0
- package/dist/core/modules/ai/inputs/core-ai-prompt-update.input.js.map +1 -0
- package/dist/core/modules/ai/inputs/core-ai-prompt.input.d.ts +18 -0
- package/dist/core/modules/ai/inputs/core-ai-prompt.input.js +131 -0
- package/dist/core/modules/ai/inputs/core-ai-prompt.input.js.map +1 -0
- package/dist/core/modules/ai/inputs/core-ai-slot-create.input.d.ts +5 -0
- package/dist/core/modules/ai/inputs/core-ai-slot-create.input.js +41 -0
- package/dist/core/modules/ai/inputs/core-ai-slot-create.input.js.map +1 -0
- package/dist/core/modules/ai/inputs/core-ai-slot-update.input.d.ts +9 -0
- package/dist/core/modules/ai/inputs/core-ai-slot-update.input.js +91 -0
- package/dist/core/modules/ai/inputs/core-ai-slot-update.input.js.map +1 -0
- package/dist/core/modules/ai/interfaces/ai-hook.interface.d.ts +28 -0
- package/dist/core/modules/ai/interfaces/ai-hook.interface.js +3 -0
- package/dist/core/modules/ai/interfaces/ai-hook.interface.js.map +1 -0
- package/dist/core/modules/ai/interfaces/ai-placeholder.interface.d.ts +21 -0
- package/dist/core/modules/ai/interfaces/ai-placeholder.interface.js +3 -0
- package/dist/core/modules/ai/interfaces/ai-placeholder.interface.js.map +1 -0
- package/dist/core/modules/ai/interfaces/ai-tool.interface.d.ts +30 -0
- package/dist/core/modules/ai/interfaces/ai-tool.interface.js +3 -0
- package/dist/core/modules/ai/interfaces/ai-tool.interface.js.map +1 -0
- package/dist/core/modules/ai/interfaces/llm-provider.interface.d.ts +55 -0
- package/dist/core/modules/ai/interfaces/llm-provider.interface.js +3 -0
- package/dist/core/modules/ai/interfaces/llm-provider.interface.js.map +1 -0
- package/dist/core/modules/ai/interfaces/resolved-ai-connection.interface.d.ts +16 -0
- package/dist/core/modules/ai/interfaces/resolved-ai-connection.interface.js +3 -0
- package/dist/core/modules/ai/interfaces/resolved-ai-connection.interface.js.map +1 -0
- package/dist/core/modules/ai/models/core-ai-action.model.d.ts +6 -0
- package/dist/core/modules/ai/models/core-ai-action.model.js +44 -0
- package/dist/core/modules/ai/models/core-ai-action.model.js.map +1 -0
- package/dist/core/modules/ai/models/core-ai-available-connection.model.d.ts +8 -0
- package/dist/core/modules/ai/models/core-ai-available-connection.model.js +53 -0
- package/dist/core/modules/ai/models/core-ai-available-connection.model.js.map +1 -0
- package/dist/core/modules/ai/models/core-ai-budget-limit.model.d.ts +97 -0
- package/dist/core/modules/ai/models/core-ai-budget-limit.model.js +79 -0
- package/dist/core/modules/ai/models/core-ai-budget-limit.model.js.map +1 -0
- package/dist/core/modules/ai/models/core-ai-connection-preference.model.d.ts +91 -0
- package/dist/core/modules/ai/models/core-ai-connection-preference.model.js +67 -0
- package/dist/core/modules/ai/models/core-ai-connection-preference.model.js.map +1 -0
- package/dist/core/modules/ai/models/core-ai-connection.model.d.ts +200 -0
- package/dist/core/modules/ai/models/core-ai-connection.model.js +263 -0
- package/dist/core/modules/ai/models/core-ai-connection.model.js.map +1 -0
- package/dist/core/modules/ai/models/core-ai-conversation.model.d.ts +93 -0
- package/dist/core/modules/ai/models/core-ai-conversation.model.js +82 -0
- package/dist/core/modules/ai/models/core-ai-conversation.model.js.map +1 -0
- package/dist/core/modules/ai/models/core-ai-interaction.model.d.ts +133 -0
- package/dist/core/modules/ai/models/core-ai-interaction.model.js +137 -0
- package/dist/core/modules/ai/models/core-ai-interaction.model.js.map +1 -0
- package/dist/core/modules/ai/models/core-ai-message.model.d.ts +5 -0
- package/dist/core/modules/ai/models/core-ai-message.model.js +38 -0
- package/dist/core/modules/ai/models/core-ai-message.model.js.map +1 -0
- package/dist/core/modules/ai/models/core-ai-mode.model.d.ts +109 -0
- package/dist/core/modules/ai/models/core-ai-mode.model.js +100 -0
- package/dist/core/modules/ai/models/core-ai-mode.model.js.map +1 -0
- package/dist/core/modules/ai/models/core-ai-prompt-hint.model.d.ts +103 -0
- package/dist/core/modules/ai/models/core-ai-prompt-hint.model.js +89 -0
- package/dist/core/modules/ai/models/core-ai-prompt-hint.model.js.map +1 -0
- package/dist/core/modules/ai/models/core-ai-prompt.model.d.ts +122 -0
- package/dist/core/modules/ai/models/core-ai-prompt.model.js +117 -0
- package/dist/core/modules/ai/models/core-ai-prompt.model.js.map +1 -0
- package/dist/core/modules/ai/models/core-ai-response.model.d.ts +29 -0
- package/dist/core/modules/ai/models/core-ai-response.model.js +105 -0
- package/dist/core/modules/ai/models/core-ai-response.model.js.map +1 -0
- package/dist/core/modules/ai/models/core-ai-slot.model.d.ts +121 -0
- package/dist/core/modules/ai/models/core-ai-slot.model.js +119 -0
- package/dist/core/modules/ai/models/core-ai-slot.model.js.map +1 -0
- package/dist/core/modules/ai/models/core-ai-tool-grant.model.d.ts +103 -0
- package/dist/core/modules/ai/models/core-ai-tool-grant.model.js +88 -0
- package/dist/core/modules/ai/models/core-ai-tool-grant.model.js.map +1 -0
- package/dist/core/modules/ai/models/core-ai-tool-policy.model.d.ts +122 -0
- package/dist/core/modules/ai/models/core-ai-tool-policy.model.js +121 -0
- package/dist/core/modules/ai/models/core-ai-tool-policy.model.js.map +1 -0
- package/dist/core/modules/ai/models/core-ai-usage-info.model.d.ts +24 -0
- package/dist/core/modules/ai/models/core-ai-usage-info.model.js +127 -0
- package/dist/core/modules/ai/models/core-ai-usage-info.model.js.map +1 -0
- package/dist/core/modules/ai/models/core-ai-usage.model.d.ts +5 -0
- package/dist/core/modules/ai/models/core-ai-usage.model.js +38 -0
- package/dist/core/modules/ai/models/core-ai-usage.model.js.map +1 -0
- package/dist/core/modules/ai/providers/claude-cli.provider.d.ts +16 -0
- package/dist/core/modules/ai/providers/claude-cli.provider.js +151 -0
- package/dist/core/modules/ai/providers/claude-cli.provider.js.map +1 -0
- package/dist/core/modules/ai/providers/llm-provider.factory.d.ts +10 -0
- package/dist/core/modules/ai/providers/llm-provider.factory.js +45 -0
- package/dist/core/modules/ai/providers/llm-provider.factory.js.map +1 -0
- package/dist/core/modules/ai/providers/openai-compatible.provider.d.ts +32 -0
- package/dist/core/modules/ai/providers/openai-compatible.provider.js +236 -0
- package/dist/core/modules/ai/providers/openai-compatible.provider.js.map +1 -0
- package/dist/core/modules/ai/services/ai-crypto.service.d.ts +11 -0
- package/dist/core/modules/ai/services/ai-crypto.service.js +84 -0
- package/dist/core/modules/ai/services/ai-crypto.service.js.map +1 -0
- package/dist/core/modules/ai/services/core-ai-budget.service.d.ts +42 -0
- package/dist/core/modules/ai/services/core-ai-budget.service.js +211 -0
- package/dist/core/modules/ai/services/core-ai-budget.service.js.map +1 -0
- package/dist/core/modules/ai/services/core-ai-connection-preference.service.d.ts +18 -0
- package/dist/core/modules/ai/services/core-ai-connection-preference.service.js +53 -0
- package/dist/core/modules/ai/services/core-ai-connection-preference.service.js.map +1 -0
- package/dist/core/modules/ai/services/core-ai-connection-resolver.service.d.ts +55 -0
- package/dist/core/modules/ai/services/core-ai-connection-resolver.service.js +177 -0
- package/dist/core/modules/ai/services/core-ai-connection-resolver.service.js.map +1 -0
- package/dist/core/modules/ai/services/core-ai-connection.service.d.ts +43 -0
- package/dist/core/modules/ai/services/core-ai-connection.service.js +272 -0
- package/dist/core/modules/ai/services/core-ai-connection.service.js.map +1 -0
- package/dist/core/modules/ai/services/core-ai-conversation.service.d.ts +26 -0
- package/dist/core/modules/ai/services/core-ai-conversation.service.js +72 -0
- package/dist/core/modules/ai/services/core-ai-conversation.service.js.map +1 -0
- package/dist/core/modules/ai/services/core-ai-interaction.service.d.ts +13 -0
- package/dist/core/modules/ai/services/core-ai-interaction.service.js +52 -0
- package/dist/core/modules/ai/services/core-ai-interaction.service.js.map +1 -0
- package/dist/core/modules/ai/services/core-ai-mcp-client.service.d.ts +51 -0
- package/dist/core/modules/ai/services/core-ai-mcp-client.service.js +123 -0
- package/dist/core/modules/ai/services/core-ai-mcp-client.service.js.map +1 -0
- package/dist/core/modules/ai/services/core-ai-mcp-oauth.service.d.ts +68 -0
- package/dist/core/modules/ai/services/core-ai-mcp-oauth.service.js +279 -0
- package/dist/core/modules/ai/services/core-ai-mcp-oauth.service.js.map +1 -0
- package/dist/core/modules/ai/services/core-ai-mcp.service.d.ts +22 -0
- package/dist/core/modules/ai/services/core-ai-mcp.service.js +59 -0
- package/dist/core/modules/ai/services/core-ai-mcp.service.js.map +1 -0
- package/dist/core/modules/ai/services/core-ai-mode.service.d.ts +14 -0
- package/dist/core/modules/ai/services/core-ai-mode.service.js +56 -0
- package/dist/core/modules/ai/services/core-ai-mode.service.js.map +1 -0
- package/dist/core/modules/ai/services/core-ai-placeholder.registry.d.ts +15 -0
- package/dist/core/modules/ai/services/core-ai-placeholder.registry.js +102 -0
- package/dist/core/modules/ai/services/core-ai-placeholder.registry.js.map +1 -0
- package/dist/core/modules/ai/services/core-ai-prompt-builder.service.d.ts +42 -0
- package/dist/core/modules/ai/services/core-ai-prompt-builder.service.js +136 -0
- package/dist/core/modules/ai/services/core-ai-prompt-builder.service.js.map +1 -0
- package/dist/core/modules/ai/services/core-ai-prompt-hint.service.d.ts +29 -0
- package/dist/core/modules/ai/services/core-ai-prompt-hint.service.js +98 -0
- package/dist/core/modules/ai/services/core-ai-prompt-hint.service.js.map +1 -0
- package/dist/core/modules/ai/services/core-ai-prompt.service.d.ts +21 -0
- package/dist/core/modules/ai/services/core-ai-prompt.service.js +143 -0
- package/dist/core/modules/ai/services/core-ai-prompt.service.js.map +1 -0
- package/dist/core/modules/ai/services/core-ai-slot.service.d.ts +51 -0
- package/dist/core/modules/ai/services/core-ai-slot.service.js +372 -0
- package/dist/core/modules/ai/services/core-ai-slot.service.js.map +1 -0
- package/dist/core/modules/ai/services/core-ai-tool-grant.service.d.ts +22 -0
- package/dist/core/modules/ai/services/core-ai-tool-grant.service.js +97 -0
- package/dist/core/modules/ai/services/core-ai-tool-grant.service.js.map +1 -0
- package/dist/core/modules/ai/services/core-ai-tool-policy.service.d.ts +23 -0
- package/dist/core/modules/ai/services/core-ai-tool-policy.service.js +102 -0
- package/dist/core/modules/ai/services/core-ai-tool-policy.service.js.map +1 -0
- package/dist/core/modules/ai/services/core-ai.service.d.ts +144 -0
- package/dist/core/modules/ai/services/core-ai.service.js +991 -0
- package/dist/core/modules/ai/services/core-ai.service.js.map +1 -0
- package/dist/core/modules/ai/tools/ai-tool.base.d.ts +15 -0
- package/dist/core/modules/ai/tools/ai-tool.base.js +30 -0
- package/dist/core/modules/ai/tools/ai-tool.base.js.map +1 -0
- package/dist/core/modules/ai/tools/ai-tool.registry.d.ts +19 -0
- package/dist/core/modules/ai/tools/ai-tool.registry.js +71 -0
- package/dist/core/modules/ai/tools/ai-tool.registry.js.map +1 -0
- package/dist/core/modules/ai/tools/ask-user-question.tool.d.ts +38 -0
- package/dist/core/modules/ai/tools/ask-user-question.tool.js +65 -0
- package/dist/core/modules/ai/tools/ask-user-question.tool.js.map +1 -0
- package/dist/core/modules/ai/tools/search-tools.tool.d.ts +24 -0
- package/dist/core/modules/ai/tools/search-tools.tool.js +68 -0
- package/dist/core/modules/ai/tools/search-tools.tool.js.map +1 -0
- package/dist/core/modules/error-code/error-codes.d.ts +81 -0
- package/dist/core/modules/error-code/error-codes.js +72 -0
- package/dist/core/modules/error-code/error-codes.js.map +1 -1
- package/dist/core.module.js +8 -0
- package/dist/core.module.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/server/modules/ai/ai-tools.module.d.ts +5 -0
- package/dist/server/modules/ai/ai-tools.module.js +36 -0
- package/dist/server/modules/ai/ai-tools.module.js.map +1 -0
- package/dist/server/modules/ai/tools/delete-user.tool.d.ts +30 -0
- package/dist/server/modules/ai/tools/delete-user.tool.js +49 -0
- package/dist/server/modules/ai/tools/delete-user.tool.js.map +1 -0
- package/dist/server/modules/ai/tools/find-users.tool.d.ts +30 -0
- package/dist/server/modules/ai/tools/find-users.tool.js +52 -0
- package/dist/server/modules/ai/tools/find-users.tool.js.map +1 -0
- package/dist/server/modules/ai/tools/get-user.tool.d.ts +26 -0
- package/dist/server/modules/ai/tools/get-user.tool.js +48 -0
- package/dist/server/modules/ai/tools/get-user.tool.js.map +1 -0
- package/dist/server/modules/ai/tools/update-user-job-title.tool.d.ts +32 -0
- package/dist/server/modules/ai/tools/update-user-job-title.tool.js +54 -0
- package/dist/server/modules/ai/tools/update-user-job-title.tool.js.map +1 -0
- package/dist/server/modules/error-code/error-codes.d.ts +9 -0
- package/dist/server/server.module.js +2 -0
- package/dist/server/server.module.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/docs/REQUEST-LIFECYCLE.md +10 -0
- package/migration-guides/11.25.x-to-11.26.0.md +278 -0
- package/package.json +2 -1
- package/src/config.env.ts +48 -1
- package/src/core/common/helpers/config.helper.ts +5 -2
- package/src/core/common/interceptors/check-security.interceptor.ts +13 -3
- package/src/core/common/interfaces/server-options.interface.ts +312 -0
- package/src/core/modules/ai/INTEGRATION-CHECKLIST.md +220 -0
- package/src/core/modules/ai/README.md +526 -0
- package/src/core/modules/ai/core-ai-mcp.controller.ts +223 -0
- package/src/core/modules/ai/core-ai.controller.ts +547 -0
- package/src/core/modules/ai/core-ai.module.ts +269 -0
- package/src/core/modules/ai/core-ai.resolver.ts +526 -0
- package/src/core/modules/ai/helpers/ai-mcp-oauth.helper.ts +35 -0
- package/src/core/modules/ai/hooks/ai-hook.base.ts +23 -0
- package/src/core/modules/ai/hooks/ai-hook.registry.ts +119 -0
- package/src/core/modules/ai/index.ts +70 -0
- package/src/core/modules/ai/inputs/core-ai-budget-limit-create.input.ts +27 -0
- package/src/core/modules/ai/inputs/core-ai-budget-limit.input.ts +52 -0
- package/src/core/modules/ai/inputs/core-ai-connection-create.input.ts +32 -0
- package/src/core/modules/ai/inputs/core-ai-connection-preference.input.ts +42 -0
- package/src/core/modules/ai/inputs/core-ai-connection.input.ts +235 -0
- package/src/core/modules/ai/inputs/core-ai-conversation-create.input.ts +13 -0
- package/src/core/modules/ai/inputs/core-ai-conversation.input.ts +33 -0
- package/src/core/modules/ai/inputs/core-ai-prompt-create.input.ts +50 -0
- package/src/core/modules/ai/inputs/core-ai-prompt-hint-create.input.ts +26 -0
- package/src/core/modules/ai/inputs/core-ai-prompt-hint.input.ts +43 -0
- package/src/core/modules/ai/inputs/core-ai-prompt-update.input.ts +42 -0
- package/src/core/modules/ai/inputs/core-ai-prompt.input.ts +144 -0
- package/src/core/modules/ai/inputs/core-ai-slot-create.input.ts +26 -0
- package/src/core/modules/ai/inputs/core-ai-slot-update.input.ts +65 -0
- package/src/core/modules/ai/interfaces/ai-hook.interface.ts +74 -0
- package/src/core/modules/ai/interfaces/ai-placeholder.interface.ts +49 -0
- package/src/core/modules/ai/interfaces/ai-tool.interface.ts +112 -0
- package/src/core/modules/ai/interfaces/llm-provider.interface.ts +187 -0
- package/src/core/modules/ai/interfaces/resolved-ai-connection.interface.ts +55 -0
- package/src/core/modules/ai/models/core-ai-action.model.ts +37 -0
- package/src/core/modules/ai/models/core-ai-available-connection.model.ts +42 -0
- package/src/core/modules/ai/models/core-ai-budget-limit.model.ts +82 -0
- package/src/core/modules/ai/models/core-ai-connection-preference.model.ts +72 -0
- package/src/core/modules/ai/models/core-ai-connection.model.ts +330 -0
- package/src/core/modules/ai/models/core-ai-conversation.model.ts +87 -0
- package/src/core/modules/ai/models/core-ai-interaction.model.ts +145 -0
- package/src/core/modules/ai/models/core-ai-message.model.ts +29 -0
- package/src/core/modules/ai/models/core-ai-mode.model.ts +93 -0
- package/src/core/modules/ai/models/core-ai-prompt-hint.model.ts +98 -0
- package/src/core/modules/ai/models/core-ai-prompt.model.ts +120 -0
- package/src/core/modules/ai/models/core-ai-response.model.ts +119 -0
- package/src/core/modules/ai/models/core-ai-slot.model.ts +146 -0
- package/src/core/modules/ai/models/core-ai-tool-grant.model.ts +87 -0
- package/src/core/modules/ai/models/core-ai-tool-policy.model.ts +115 -0
- package/src/core/modules/ai/models/core-ai-usage-info.model.ts +107 -0
- package/src/core/modules/ai/models/core-ai-usage.model.ts +29 -0
- package/src/core/modules/ai/providers/claude-cli.provider.ts +240 -0
- package/src/core/modules/ai/providers/llm-provider.factory.ts +63 -0
- package/src/core/modules/ai/providers/openai-compatible.provider.ts +329 -0
- package/src/core/modules/ai/services/ai-crypto.service.ts +120 -0
- package/src/core/modules/ai/services/core-ai-budget.service.ts +297 -0
- package/src/core/modules/ai/services/core-ai-connection-preference.service.ts +74 -0
- package/src/core/modules/ai/services/core-ai-connection-resolver.service.ts +308 -0
- package/src/core/modules/ai/services/core-ai-connection.service.ts +387 -0
- package/src/core/modules/ai/services/core-ai-conversation.service.ts +105 -0
- package/src/core/modules/ai/services/core-ai-interaction.service.ts +56 -0
- package/src/core/modules/ai/services/core-ai-mcp-client.service.ts +169 -0
- package/src/core/modules/ai/services/core-ai-mcp-oauth.service.ts +445 -0
- package/src/core/modules/ai/services/core-ai-mcp.service.ts +94 -0
- package/src/core/modules/ai/services/core-ai-mode.service.ts +43 -0
- package/src/core/modules/ai/services/core-ai-placeholder.registry.ts +123 -0
- package/src/core/modules/ai/services/core-ai-prompt-builder.service.ts +228 -0
- package/src/core/modules/ai/services/core-ai-prompt-hint.service.ts +133 -0
- package/src/core/modules/ai/services/core-ai-prompt.service.ts +164 -0
- package/src/core/modules/ai/services/core-ai-slot.service.ts +526 -0
- package/src/core/modules/ai/services/core-ai-tool-grant.service.ts +107 -0
- package/src/core/modules/ai/services/core-ai-tool-policy.service.ts +124 -0
- package/src/core/modules/ai/services/core-ai.service.ts +1396 -0
- package/src/core/modules/ai/tools/ai-tool.base.ts +46 -0
- package/src/core/modules/ai/tools/ai-tool.registry.ts +124 -0
- package/src/core/modules/ai/tools/ask-user-question.tool.ts +76 -0
- package/src/core/modules/ai/tools/search-tools.tool.ts +70 -0
- package/src/core/modules/error-code/error-codes.ts +86 -0
- package/src/core.module.ts +12 -0
- package/src/index.ts +6 -0
- package/src/server/modules/ai/ai-tools.module.ts +33 -0
- package/src/server/modules/ai/tools/delete-user.tool.ts +44 -0
- package/src/server/modules/ai/tools/find-users.tool.ts +49 -0
- package/src/server/modules/ai/tools/get-user.tool.ts +43 -0
- package/src/server/modules/ai/tools/update-user-job-title.tool.ts +62 -0
- package/src/server/server.module.ts +5 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { Injectable, Logger } from '@nestjs/common';
|
|
2
|
+
|
|
3
|
+
import { AiHookEvent, AiHookPreDecision, IAiHook } from '../interfaces/ai-hook.interface';
|
|
4
|
+
import { IAiTool } from '../interfaces/ai-tool.interface';
|
|
5
|
+
import { CoreAiResponse } from '../models/core-ai-response.model';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Global registry of AI lifecycle hooks (PreToolUse / PostToolUse / SessionStart /
|
|
9
|
+
* Stop). Hooks are dispatched in registration order — the first PreToolUse hook
|
|
10
|
+
* returning `{ block: true }` aborts the tool call.
|
|
11
|
+
*
|
|
12
|
+
* Hooks register themselves on module init (via the {@link AiHookBase} base
|
|
13
|
+
* class). Override or override the dispatch order by extending this registry and
|
|
14
|
+
* supplying it through `CoreModule.forRoot(env, { ai: { hookRegistry } })`.
|
|
15
|
+
*/
|
|
16
|
+
@Injectable()
|
|
17
|
+
export class AiHookRegistry {
|
|
18
|
+
private readonly hooks: IAiHook[] = [];
|
|
19
|
+
private readonly logger = new Logger(AiHookRegistry.name);
|
|
20
|
+
|
|
21
|
+
/** Register a hook. Idempotent on `name`. */
|
|
22
|
+
register(hook: IAiHook): void {
|
|
23
|
+
if (!hook?.name) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (this.hooks.some((h) => h.name === hook.name)) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
this.hooks.push(hook);
|
|
30
|
+
this.logger.debug(`Registered AI hook: ${hook.name}`);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** All registered hooks, in registration order. */
|
|
34
|
+
list(): IAiHook[] {
|
|
35
|
+
return [...this.hooks];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Run every `preToolUse` hook against a tool call. Returns the first blocking
|
|
40
|
+
* decision (or one with an `args` override). Errors are swallowed and logged.
|
|
41
|
+
*/
|
|
42
|
+
async runPreToolUse(
|
|
43
|
+
call: { arguments: Record<string, any>; name: string },
|
|
44
|
+
tool: IAiTool,
|
|
45
|
+
event: AiHookEvent,
|
|
46
|
+
): Promise<AiHookPreDecision> {
|
|
47
|
+
let merged: AiHookPreDecision = {};
|
|
48
|
+
for (const hook of this.hooks) {
|
|
49
|
+
if (!hook.preToolUse) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
const decision = await hook.preToolUse(call, tool, event);
|
|
54
|
+
if (!decision) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (decision.args) {
|
|
58
|
+
// Each subsequent hook sees the rewritten args (chained sanitization).
|
|
59
|
+
call.arguments = decision.args;
|
|
60
|
+
merged.args = decision.args;
|
|
61
|
+
}
|
|
62
|
+
if (decision.block) {
|
|
63
|
+
merged = { ...merged, block: true, reason: decision.reason || merged.reason };
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
} catch (err) {
|
|
67
|
+
this.logger.warn(`AI hook "${hook.name}" preToolUse error (ignored): ${(err as Error).message}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return merged;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** Notify all `postToolUse` hooks. Errors are swallowed. */
|
|
74
|
+
async runPostToolUse(
|
|
75
|
+
call: { arguments: Record<string, any>; name: string },
|
|
76
|
+
tool: IAiTool,
|
|
77
|
+
result: { result: unknown; success: boolean },
|
|
78
|
+
event: AiHookEvent,
|
|
79
|
+
): Promise<void> {
|
|
80
|
+
for (const hook of this.hooks) {
|
|
81
|
+
if (!hook.postToolUse) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
await hook.postToolUse(call, tool, result, event);
|
|
86
|
+
} catch (err) {
|
|
87
|
+
this.logger.warn(`AI hook "${hook.name}" postToolUse error (ignored): ${(err as Error).message}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** Notify all `sessionStart` hooks. */
|
|
93
|
+
async runSessionStart(event: AiHookEvent): Promise<void> {
|
|
94
|
+
for (const hook of this.hooks) {
|
|
95
|
+
if (!hook.sessionStart) {
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
await hook.sessionStart(event);
|
|
100
|
+
} catch (err) {
|
|
101
|
+
this.logger.warn(`AI hook "${hook.name}" sessionStart error (ignored): ${(err as Error).message}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** Notify all `stop` hooks. */
|
|
107
|
+
async runStop(response: CoreAiResponse, event: AiHookEvent): Promise<void> {
|
|
108
|
+
for (const hook of this.hooks) {
|
|
109
|
+
if (!hook.stop) {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
await hook.stop(response, event);
|
|
114
|
+
} catch (err) {
|
|
115
|
+
this.logger.warn(`AI hook "${hook.name}" stop error (ignored): ${(err as Error).message}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// AI module public API
|
|
2
|
+
export * from './core-ai-mcp.controller';
|
|
3
|
+
export * from './helpers/ai-mcp-oauth.helper';
|
|
4
|
+
export * from './core-ai.controller';
|
|
5
|
+
export * from './core-ai.module';
|
|
6
|
+
export * from './core-ai.resolver';
|
|
7
|
+
export * from './inputs/core-ai-budget-limit-create.input';
|
|
8
|
+
export * from './inputs/core-ai-budget-limit.input';
|
|
9
|
+
export * from './inputs/core-ai-connection-create.input';
|
|
10
|
+
export * from './inputs/core-ai-connection-preference.input';
|
|
11
|
+
export * from './inputs/core-ai-connection.input';
|
|
12
|
+
export * from './inputs/core-ai-conversation-create.input';
|
|
13
|
+
export * from './inputs/core-ai-conversation.input';
|
|
14
|
+
export * from './inputs/core-ai-prompt-hint-create.input';
|
|
15
|
+
export * from './inputs/core-ai-prompt-hint.input';
|
|
16
|
+
export * from './inputs/core-ai-prompt-create.input';
|
|
17
|
+
export * from './inputs/core-ai-prompt-update.input';
|
|
18
|
+
export * from './inputs/core-ai-slot-create.input';
|
|
19
|
+
export * from './inputs/core-ai-slot-update.input';
|
|
20
|
+
export * from './inputs/core-ai-prompt.input';
|
|
21
|
+
export * from './hooks/ai-hook.base';
|
|
22
|
+
export * from './hooks/ai-hook.registry';
|
|
23
|
+
export * from './interfaces/ai-hook.interface';
|
|
24
|
+
export * from './interfaces/ai-placeholder.interface';
|
|
25
|
+
export * from './interfaces/ai-tool.interface';
|
|
26
|
+
export * from './interfaces/llm-provider.interface';
|
|
27
|
+
export * from './interfaces/resolved-ai-connection.interface';
|
|
28
|
+
export * from './models/core-ai-action.model';
|
|
29
|
+
export * from './models/core-ai-available-connection.model';
|
|
30
|
+
export * from './models/core-ai-budget-limit.model';
|
|
31
|
+
export * from './models/core-ai-connection-preference.model';
|
|
32
|
+
export * from './models/core-ai-connection.model';
|
|
33
|
+
export * from './models/core-ai-conversation.model';
|
|
34
|
+
export * from './models/core-ai-interaction.model';
|
|
35
|
+
export * from './models/core-ai-message.model';
|
|
36
|
+
export * from './models/core-ai-prompt-hint.model';
|
|
37
|
+
export * from './models/core-ai-prompt.model';
|
|
38
|
+
export * from './models/core-ai-slot.model';
|
|
39
|
+
export * from './models/core-ai-tool-grant.model';
|
|
40
|
+
export * from './models/core-ai-mode.model';
|
|
41
|
+
export * from './models/core-ai-tool-policy.model';
|
|
42
|
+
export * from './models/core-ai-response.model';
|
|
43
|
+
export * from './models/core-ai-usage-info.model';
|
|
44
|
+
export * from './models/core-ai-usage.model';
|
|
45
|
+
export * from './providers/claude-cli.provider';
|
|
46
|
+
export * from './providers/llm-provider.factory';
|
|
47
|
+
export * from './providers/openai-compatible.provider';
|
|
48
|
+
export * from './services/ai-crypto.service';
|
|
49
|
+
export * from './services/core-ai-budget.service';
|
|
50
|
+
export * from './services/core-ai-connection-preference.service';
|
|
51
|
+
export * from './services/core-ai-connection-resolver.service';
|
|
52
|
+
export * from './services/core-ai-connection.service';
|
|
53
|
+
export * from './services/core-ai-conversation.service';
|
|
54
|
+
export * from './services/core-ai-interaction.service';
|
|
55
|
+
export * from './services/core-ai-mcp-oauth.service';
|
|
56
|
+
export * from './services/core-ai-mcp.service';
|
|
57
|
+
export * from './services/core-ai-placeholder.registry';
|
|
58
|
+
export * from './services/core-ai-prompt-builder.service';
|
|
59
|
+
export * from './services/core-ai-prompt-hint.service';
|
|
60
|
+
export * from './services/core-ai-prompt.service';
|
|
61
|
+
export * from './services/core-ai-slot.service';
|
|
62
|
+
export * from './services/core-ai-tool-grant.service';
|
|
63
|
+
export * from './services/core-ai-mcp-client.service';
|
|
64
|
+
export * from './services/core-ai-mode.service';
|
|
65
|
+
export * from './services/core-ai-tool-policy.service';
|
|
66
|
+
export * from './services/core-ai.service';
|
|
67
|
+
export * from './tools/ai-tool.base';
|
|
68
|
+
export * from './tools/ai-tool.registry';
|
|
69
|
+
export * from './tools/ask-user-question.tool';
|
|
70
|
+
export * from './tools/search-tools.tool';
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { InputType } from '@nestjs/graphql';
|
|
2
|
+
import { IsIn } from 'class-validator';
|
|
3
|
+
|
|
4
|
+
import { Restricted } from '../../../common/decorators/restricted.decorator';
|
|
5
|
+
import { UnifiedField } from '../../../common/decorators/unified-field.decorator';
|
|
6
|
+
import { RoleEnum } from '../../../common/enums/role.enum';
|
|
7
|
+
import { CoreAiBudgetLimitInput } from './core-ai-budget-limit.input';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Input to create an AI budget limit. `scope` and `refId` are required.
|
|
11
|
+
*/
|
|
12
|
+
@InputType({ description: 'Input to create an AI budget limit', isAbstract: true })
|
|
13
|
+
@Restricted(RoleEnum.ADMIN)
|
|
14
|
+
export class CoreAiBudgetLimitCreateInput extends CoreAiBudgetLimitInput {
|
|
15
|
+
@UnifiedField({
|
|
16
|
+
description: 'Id of the user or tenant this limit applies to',
|
|
17
|
+
roles: RoleEnum.ADMIN,
|
|
18
|
+
})
|
|
19
|
+
override refId: string = undefined;
|
|
20
|
+
|
|
21
|
+
@UnifiedField({
|
|
22
|
+
description: "Scope of the limit: 'user' or 'tenant'",
|
|
23
|
+
roles: RoleEnum.ADMIN,
|
|
24
|
+
validator: () => [IsIn(['tenant', 'user'])],
|
|
25
|
+
})
|
|
26
|
+
override scope: string = undefined;
|
|
27
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { InputType } from '@nestjs/graphql';
|
|
2
|
+
import { IsIn } from 'class-validator';
|
|
3
|
+
|
|
4
|
+
import { Restricted } from '../../../common/decorators/restricted.decorator';
|
|
5
|
+
import { UnifiedField } from '../../../common/decorators/unified-field.decorator';
|
|
6
|
+
import { RoleEnum } from '../../../common/enums/role.enum';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Input to update an AI budget limit (all fields optional).
|
|
10
|
+
*/
|
|
11
|
+
@InputType({ description: 'Input to update an AI budget limit', isAbstract: true })
|
|
12
|
+
@Restricted(RoleEnum.ADMIN)
|
|
13
|
+
export class CoreAiBudgetLimitInput {
|
|
14
|
+
@UnifiedField({
|
|
15
|
+
description: 'Maximum number of prompts per reset period (0/undefined = unlimited)',
|
|
16
|
+
isOptional: true,
|
|
17
|
+
roles: RoleEnum.ADMIN,
|
|
18
|
+
type: () => Number,
|
|
19
|
+
})
|
|
20
|
+
maxPrompts?: number = undefined;
|
|
21
|
+
|
|
22
|
+
@UnifiedField({
|
|
23
|
+
description: 'Maximum number of tokens per reset period (0/undefined = unlimited)',
|
|
24
|
+
isOptional: true,
|
|
25
|
+
roles: RoleEnum.ADMIN,
|
|
26
|
+
type: () => Number,
|
|
27
|
+
})
|
|
28
|
+
maxTokens?: number = undefined;
|
|
29
|
+
|
|
30
|
+
@UnifiedField({
|
|
31
|
+
description: "Reset period: 'day', 'month' or 'none'",
|
|
32
|
+
isOptional: true,
|
|
33
|
+
roles: RoleEnum.ADMIN,
|
|
34
|
+
validator: () => [IsIn(['day', 'month', 'none'])],
|
|
35
|
+
})
|
|
36
|
+
period?: string = undefined;
|
|
37
|
+
|
|
38
|
+
@UnifiedField({
|
|
39
|
+
description: 'Id of the user or tenant this limit applies to',
|
|
40
|
+
isOptional: true,
|
|
41
|
+
roles: RoleEnum.ADMIN,
|
|
42
|
+
})
|
|
43
|
+
refId?: string = undefined;
|
|
44
|
+
|
|
45
|
+
@UnifiedField({
|
|
46
|
+
description: "Scope of the limit: 'user' or 'tenant'",
|
|
47
|
+
isOptional: true,
|
|
48
|
+
roles: RoleEnum.ADMIN,
|
|
49
|
+
validator: () => [IsIn(['tenant', 'user'])],
|
|
50
|
+
})
|
|
51
|
+
scope?: string = undefined;
|
|
52
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { InputType } from '@nestjs/graphql';
|
|
2
|
+
|
|
3
|
+
import { Restricted } from '../../../common/decorators/restricted.decorator';
|
|
4
|
+
import { UnifiedField } from '../../../common/decorators/unified-field.decorator';
|
|
5
|
+
import { RoleEnum } from '../../../common/enums/role.enum';
|
|
6
|
+
import { CoreAiConnectionInput } from './core-ai-connection.input';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Input to create a new AI connection. Makes `baseUrl`, `model` and `name`
|
|
10
|
+
* required while inheriting the optional fields from {@link CoreAiConnectionInput}.
|
|
11
|
+
*/
|
|
12
|
+
@InputType({ description: 'Input to create a new AI connection', isAbstract: true })
|
|
13
|
+
@Restricted(RoleEnum.ADMIN)
|
|
14
|
+
export class CoreAiConnectionCreateInput extends CoreAiConnectionInput {
|
|
15
|
+
@UnifiedField({
|
|
16
|
+
description: 'Base URL of the OpenAI-compatible endpoint',
|
|
17
|
+
roles: RoleEnum.ADMIN,
|
|
18
|
+
})
|
|
19
|
+
override baseUrl: string = undefined;
|
|
20
|
+
|
|
21
|
+
@UnifiedField({
|
|
22
|
+
description: 'Model id sent to the backend (e.g. gpt-oss-120b)',
|
|
23
|
+
roles: RoleEnum.ADMIN,
|
|
24
|
+
})
|
|
25
|
+
override model: string = undefined;
|
|
26
|
+
|
|
27
|
+
@UnifiedField({
|
|
28
|
+
description: 'Human-readable connection name',
|
|
29
|
+
roles: RoleEnum.ADMIN,
|
|
30
|
+
})
|
|
31
|
+
override name: string = undefined;
|
|
32
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { InputType } from '@nestjs/graphql';
|
|
2
|
+
import { IsIn } from 'class-validator';
|
|
3
|
+
|
|
4
|
+
import { Restricted } from '../../../common/decorators/restricted.decorator';
|
|
5
|
+
import { UnifiedField } from '../../../common/decorators/unified-field.decorator';
|
|
6
|
+
import { RoleEnum } from '../../../common/enums/role.enum';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Input to create/update an AI connection preference (tenant/user default or
|
|
10
|
+
* tenant-enforced). Admin-managed; user self-service goes through a dedicated
|
|
11
|
+
* mutation that only sets the caller's own user preference.
|
|
12
|
+
*/
|
|
13
|
+
@InputType({ description: 'Input for an AI connection preference', isAbstract: true })
|
|
14
|
+
@Restricted(RoleEnum.ADMIN)
|
|
15
|
+
export class CoreAiConnectionPreferenceInput {
|
|
16
|
+
@UnifiedField({
|
|
17
|
+
description: 'The selected connection id',
|
|
18
|
+
roles: RoleEnum.ADMIN,
|
|
19
|
+
})
|
|
20
|
+
connectionId: string = undefined;
|
|
21
|
+
|
|
22
|
+
@UnifiedField({
|
|
23
|
+
description: 'Whether the tenant connection is enforced (tenant scope only)',
|
|
24
|
+
isOptional: true,
|
|
25
|
+
roles: RoleEnum.ADMIN,
|
|
26
|
+
type: () => Boolean,
|
|
27
|
+
})
|
|
28
|
+
enforced?: boolean = undefined;
|
|
29
|
+
|
|
30
|
+
@UnifiedField({
|
|
31
|
+
description: 'The tenant id or user id this preference belongs to',
|
|
32
|
+
roles: RoleEnum.ADMIN,
|
|
33
|
+
})
|
|
34
|
+
refId: string = undefined;
|
|
35
|
+
|
|
36
|
+
@UnifiedField({
|
|
37
|
+
description: "Scope of the preference: 'tenant' or 'user'",
|
|
38
|
+
roles: RoleEnum.ADMIN,
|
|
39
|
+
validator: () => [IsIn(['tenant', 'user'])],
|
|
40
|
+
})
|
|
41
|
+
scope: string = undefined;
|
|
42
|
+
}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { InputType } from '@nestjs/graphql';
|
|
2
|
+
|
|
3
|
+
import { Restricted } from '../../../common/decorators/restricted.decorator';
|
|
4
|
+
import { UnifiedField } from '../../../common/decorators/unified-field.decorator';
|
|
5
|
+
import { RoleEnum } from '../../../common/enums/role.enum';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Input to update an AI connection. All fields are optional (patch semantics).
|
|
9
|
+
*
|
|
10
|
+
* HINT: All properties must be initialized with `undefined` so they are picked up
|
|
11
|
+
* via `Object.keys` for mapping and never overwrite existing DB values.
|
|
12
|
+
*/
|
|
13
|
+
@InputType({ description: 'Input to update an AI connection', isAbstract: true })
|
|
14
|
+
@Restricted(RoleEnum.ADMIN)
|
|
15
|
+
export class CoreAiConnectionInput {
|
|
16
|
+
/**
|
|
17
|
+
* Plaintext API key. Encrypted at rest, never returned. Pass an empty string
|
|
18
|
+
* to clear the stored key; omit the field to leave it untouched.
|
|
19
|
+
*/
|
|
20
|
+
@UnifiedField({
|
|
21
|
+
description: 'Plaintext API key (encrypted at rest, never returned; empty string clears it)',
|
|
22
|
+
isOptional: true,
|
|
23
|
+
roles: RoleEnum.ADMIN,
|
|
24
|
+
})
|
|
25
|
+
apiKey?: string = undefined;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Name of an environment variable used as API-key fallback.
|
|
29
|
+
*/
|
|
30
|
+
@UnifiedField({
|
|
31
|
+
description: 'Name of the environment variable used as API-key fallback',
|
|
32
|
+
isOptional: true,
|
|
33
|
+
roles: RoleEnum.ADMIN,
|
|
34
|
+
})
|
|
35
|
+
apiKeyEnv?: string = undefined;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Base URL of the OpenAI-compatible endpoint.
|
|
39
|
+
*/
|
|
40
|
+
@UnifiedField({
|
|
41
|
+
description: 'Base URL of the OpenAI-compatible endpoint',
|
|
42
|
+
isOptional: true,
|
|
43
|
+
roles: RoleEnum.ADMIN,
|
|
44
|
+
})
|
|
45
|
+
baseUrl?: string = undefined;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Capability tags of the model.
|
|
49
|
+
*/
|
|
50
|
+
@UnifiedField({
|
|
51
|
+
description: 'Capability tags of the model',
|
|
52
|
+
isArray: true,
|
|
53
|
+
isOptional: true,
|
|
54
|
+
roles: RoleEnum.ADMIN,
|
|
55
|
+
type: () => String,
|
|
56
|
+
})
|
|
57
|
+
capabilities?: string[] = undefined;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Default maximum number of tokens for completions.
|
|
61
|
+
*/
|
|
62
|
+
@UnifiedField({
|
|
63
|
+
description: 'Default maximum number of tokens for completions',
|
|
64
|
+
isOptional: true,
|
|
65
|
+
roles: RoleEnum.ADMIN,
|
|
66
|
+
type: () => Number,
|
|
67
|
+
})
|
|
68
|
+
defaultMaxTokens?: number = undefined;
|
|
69
|
+
|
|
70
|
+
@UnifiedField({
|
|
71
|
+
description: 'Total context window (tokens) the model supports; enables context-overflow handling',
|
|
72
|
+
isOptional: true,
|
|
73
|
+
roles: RoleEnum.ADMIN,
|
|
74
|
+
type: () => Number,
|
|
75
|
+
})
|
|
76
|
+
contextWindow?: number = undefined;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Default sampling temperature for completions.
|
|
80
|
+
*/
|
|
81
|
+
@UnifiedField({
|
|
82
|
+
description: 'Default sampling temperature for completions',
|
|
83
|
+
isOptional: true,
|
|
84
|
+
roles: RoleEnum.ADMIN,
|
|
85
|
+
type: () => Number,
|
|
86
|
+
})
|
|
87
|
+
defaultTemperature?: number = undefined;
|
|
88
|
+
|
|
89
|
+
/** Provider-side soft user quota (tokens) used when no hard budget is set. */
|
|
90
|
+
@UnifiedField({
|
|
91
|
+
description: 'Provider-side soft user quota (tokens) used when no hard budget is set',
|
|
92
|
+
isOptional: true,
|
|
93
|
+
roles: RoleEnum.ADMIN,
|
|
94
|
+
type: () => Number,
|
|
95
|
+
})
|
|
96
|
+
defaultUserMaxTokens?: number = undefined;
|
|
97
|
+
|
|
98
|
+
/** Period for the provider-side soft user quota (`day` | `month` | `none`). */
|
|
99
|
+
@UnifiedField({
|
|
100
|
+
description: 'Period for the provider-side soft user quota (day | month | none)',
|
|
101
|
+
isOptional: true,
|
|
102
|
+
roles: RoleEnum.ADMIN,
|
|
103
|
+
})
|
|
104
|
+
defaultUserMaxPeriod?: string = undefined;
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Human-readable description.
|
|
108
|
+
*/
|
|
109
|
+
@UnifiedField({
|
|
110
|
+
description: 'Human-readable description of the connection',
|
|
111
|
+
isOptional: true,
|
|
112
|
+
roles: RoleEnum.ADMIN,
|
|
113
|
+
})
|
|
114
|
+
description?: string = undefined;
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Whether the connection is enabled.
|
|
118
|
+
*/
|
|
119
|
+
@UnifiedField({
|
|
120
|
+
description: 'Whether the connection is enabled',
|
|
121
|
+
isOptional: true,
|
|
122
|
+
roles: RoleEnum.ADMIN,
|
|
123
|
+
type: () => Boolean,
|
|
124
|
+
})
|
|
125
|
+
enabled?: boolean = undefined;
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Admin-enforced for all tenants (overrides user/client/tenant selection).
|
|
129
|
+
*/
|
|
130
|
+
@UnifiedField({
|
|
131
|
+
description: 'Admin-enforced for all tenants',
|
|
132
|
+
isOptional: true,
|
|
133
|
+
roles: RoleEnum.ADMIN,
|
|
134
|
+
type: () => Boolean,
|
|
135
|
+
})
|
|
136
|
+
enforced?: boolean = undefined;
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Tenant ids for which this connection is admin-enforced.
|
|
140
|
+
*/
|
|
141
|
+
@UnifiedField({
|
|
142
|
+
description: 'Tenant ids for which this connection is admin-enforced',
|
|
143
|
+
isArray: true,
|
|
144
|
+
isOptional: true,
|
|
145
|
+
roles: RoleEnum.ADMIN,
|
|
146
|
+
type: () => String,
|
|
147
|
+
})
|
|
148
|
+
enforcedTenantIds?: string[] = undefined;
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Whether this is the default connection.
|
|
152
|
+
*/
|
|
153
|
+
@UnifiedField({
|
|
154
|
+
description: 'Whether this is the default connection',
|
|
155
|
+
isOptional: true,
|
|
156
|
+
roles: RoleEnum.ADMIN,
|
|
157
|
+
type: () => Boolean,
|
|
158
|
+
})
|
|
159
|
+
isDefault?: boolean = undefined;
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Model id sent to the backend.
|
|
163
|
+
*/
|
|
164
|
+
@UnifiedField({
|
|
165
|
+
description: 'Model id sent to the backend (e.g. gpt-oss-120b)',
|
|
166
|
+
isOptional: true,
|
|
167
|
+
roles: RoleEnum.ADMIN,
|
|
168
|
+
})
|
|
169
|
+
model?: string = undefined;
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Human-readable connection name.
|
|
173
|
+
*/
|
|
174
|
+
@UnifiedField({
|
|
175
|
+
description: 'Human-readable connection name',
|
|
176
|
+
isOptional: true,
|
|
177
|
+
roles: RoleEnum.ADMIN,
|
|
178
|
+
})
|
|
179
|
+
name?: string = undefined;
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Provider type.
|
|
183
|
+
*/
|
|
184
|
+
@UnifiedField({
|
|
185
|
+
description: 'Provider type (e.g. openai-compatible)',
|
|
186
|
+
isOptional: true,
|
|
187
|
+
roles: RoleEnum.ADMIN,
|
|
188
|
+
})
|
|
189
|
+
providerType?: string = undefined;
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Whether the backend supports native JSON/structured-output mode.
|
|
193
|
+
*/
|
|
194
|
+
@UnifiedField({
|
|
195
|
+
description: 'Whether the backend supports native JSON/structured-output mode',
|
|
196
|
+
isOptional: true,
|
|
197
|
+
roles: RoleEnum.ADMIN,
|
|
198
|
+
type: () => Boolean,
|
|
199
|
+
})
|
|
200
|
+
supportsJsonResponse?: boolean = undefined;
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Whether the backend supports native function/tool calling.
|
|
204
|
+
*/
|
|
205
|
+
@UnifiedField({
|
|
206
|
+
description: 'Whether the backend supports native function/tool calling',
|
|
207
|
+
isOptional: true,
|
|
208
|
+
roles: RoleEnum.ADMIN,
|
|
209
|
+
type: () => Boolean,
|
|
210
|
+
})
|
|
211
|
+
supportsNativeTools?: boolean = undefined;
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Whether the model supports vision (image input).
|
|
215
|
+
*/
|
|
216
|
+
@UnifiedField({
|
|
217
|
+
description: 'Whether the model supports vision (image input)',
|
|
218
|
+
isOptional: true,
|
|
219
|
+
roles: RoleEnum.ADMIN,
|
|
220
|
+
type: () => Boolean,
|
|
221
|
+
})
|
|
222
|
+
supportsVision?: boolean = undefined;
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Tenant ids this connection is available to (empty = all tenants).
|
|
226
|
+
*/
|
|
227
|
+
@UnifiedField({
|
|
228
|
+
description: 'Tenant ids this connection is available to (empty = all tenants)',
|
|
229
|
+
isArray: true,
|
|
230
|
+
isOptional: true,
|
|
231
|
+
roles: RoleEnum.ADMIN,
|
|
232
|
+
type: () => String,
|
|
233
|
+
})
|
|
234
|
+
tenantIds?: string[] = undefined;
|
|
235
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { InputType } from '@nestjs/graphql';
|
|
2
|
+
|
|
3
|
+
import { Restricted } from '../../../common/decorators/restricted.decorator';
|
|
4
|
+
import { RoleEnum } from '../../../common/enums/role.enum';
|
|
5
|
+
import { CoreAiConversationInput } from './core-ai-conversation.input';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Input to create a new AI conversation (same shape as the update input; both
|
|
9
|
+
* fields are optional). Separate class to allow project-specific extension.
|
|
10
|
+
*/
|
|
11
|
+
@InputType({ description: 'Input to create a new AI conversation', isAbstract: true })
|
|
12
|
+
@Restricted(RoleEnum.S_USER)
|
|
13
|
+
export class CoreAiConversationCreateInput extends CoreAiConversationInput {}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { InputType } from '@nestjs/graphql';
|
|
2
|
+
|
|
3
|
+
import { Restricted } from '../../../common/decorators/restricted.decorator';
|
|
4
|
+
import { UnifiedField } from '../../../common/decorators/unified-field.decorator';
|
|
5
|
+
import { RoleEnum } from '../../../common/enums/role.enum';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Input to create or update an AI conversation. Messages are not set here — they
|
|
9
|
+
* are appended by the orchestrator during prompt runs.
|
|
10
|
+
*/
|
|
11
|
+
@InputType({ description: 'Input to create or update an AI conversation', isAbstract: true })
|
|
12
|
+
@Restricted(RoleEnum.S_USER)
|
|
13
|
+
export class CoreAiConversationInput {
|
|
14
|
+
/**
|
|
15
|
+
* Optional default connection for the conversation.
|
|
16
|
+
*/
|
|
17
|
+
@UnifiedField({
|
|
18
|
+
description: 'Optional default AI connection id for the conversation',
|
|
19
|
+
isOptional: true,
|
|
20
|
+
roles: RoleEnum.S_USER,
|
|
21
|
+
})
|
|
22
|
+
connectionId?: string = undefined;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Human-readable title.
|
|
26
|
+
*/
|
|
27
|
+
@UnifiedField({
|
|
28
|
+
description: 'Human-readable title',
|
|
29
|
+
isOptional: true,
|
|
30
|
+
roles: RoleEnum.S_USER,
|
|
31
|
+
})
|
|
32
|
+
title?: string = undefined;
|
|
33
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { InputType } from '@nestjs/graphql';
|
|
2
|
+
|
|
3
|
+
import { Restricted } from '../../../common/decorators/restricted.decorator';
|
|
4
|
+
import { UnifiedField } from '../../../common/decorators/unified-field.decorator';
|
|
5
|
+
import { CoreInput } from '../../../common/inputs/core-input.input';
|
|
6
|
+
import { RoleEnum } from '../../../common/enums/role.enum';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Input for creating a {@link CoreAiPrompt}. `ownerId`/`tenantId` are set
|
|
10
|
+
* automatically by the service from the current user — never from the client.
|
|
11
|
+
*/
|
|
12
|
+
@InputType({ description: 'Input to create a user prompt' })
|
|
13
|
+
@Restricted(RoleEnum.S_USER)
|
|
14
|
+
export class CoreAiPromptCreateInput extends CoreInput {
|
|
15
|
+
@UnifiedField({ description: 'The prompt text', roles: RoleEnum.S_USER })
|
|
16
|
+
content: string = undefined;
|
|
17
|
+
|
|
18
|
+
@UnifiedField({ description: 'Description', isOptional: true, roles: RoleEnum.S_USER })
|
|
19
|
+
description?: string = undefined;
|
|
20
|
+
|
|
21
|
+
@UnifiedField({
|
|
22
|
+
description: 'Whether the prompt is active',
|
|
23
|
+
isOptional: true,
|
|
24
|
+
roles: RoleEnum.S_USER,
|
|
25
|
+
type: () => Boolean,
|
|
26
|
+
})
|
|
27
|
+
enabled?: boolean = undefined;
|
|
28
|
+
|
|
29
|
+
@UnifiedField({ description: 'Icon hint', isOptional: true, roles: RoleEnum.S_USER })
|
|
30
|
+
icon?: string = undefined;
|
|
31
|
+
|
|
32
|
+
@UnifiedField({ description: 'Display label', roles: RoleEnum.S_USER })
|
|
33
|
+
name: string = undefined;
|
|
34
|
+
|
|
35
|
+
@UnifiedField({
|
|
36
|
+
description: 'Sort order',
|
|
37
|
+
isOptional: true,
|
|
38
|
+
roles: RoleEnum.S_USER,
|
|
39
|
+
type: () => Number,
|
|
40
|
+
})
|
|
41
|
+
order?: number = undefined;
|
|
42
|
+
|
|
43
|
+
/** `'user'` (default, "private") | `'tenant'` ("public" within the tenant). */
|
|
44
|
+
@UnifiedField({
|
|
45
|
+
description: "Visibility scope ('user' = private, 'tenant' = public)",
|
|
46
|
+
isOptional: true,
|
|
47
|
+
roles: RoleEnum.S_USER,
|
|
48
|
+
})
|
|
49
|
+
scope?: string = undefined;
|
|
50
|
+
}
|