@lenne.tech/nest-server 12.2.0 → 12.3.1

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 (160) hide show
  1. package/.claude/rules/better-auth.md +31 -4
  2. package/.claude/rules/configurable-features.md +8 -7
  3. package/.claude/rules/package-management.md +18 -2
  4. package/.claude/rules/persistence.md +2 -2
  5. package/.claude/rules/testing.md +5 -5
  6. package/.claude/rules/versioning.md +13 -2
  7. package/CLAUDE.md +5 -0
  8. package/FRAMEWORK-API.md +4 -3
  9. package/README.md +2 -2
  10. package/dist/config.env.js +2 -2
  11. package/dist/config.env.js.map +1 -1
  12. package/dist/core/common/helpers/graphql-ws-connection.helper.d.ts +4 -0
  13. package/dist/core/common/helpers/graphql-ws-connection.helper.js +17 -3
  14. package/dist/core/common/helpers/graphql-ws-connection.helper.js.map +1 -1
  15. package/dist/core/common/interceptors/check-security.interceptor.js +19 -2
  16. package/dist/core/common/interceptors/check-security.interceptor.js.map +1 -1
  17. package/dist/core/common/interfaces/server-options.interface.d.ts +8 -0
  18. package/dist/core/modules/ai/core-ai-mcp.controller.d.ts +3 -0
  19. package/dist/core/modules/ai/core-ai-mcp.controller.js +29 -0
  20. package/dist/core/modules/ai/core-ai-mcp.controller.js.map +1 -1
  21. package/dist/core/modules/ai/core-ai.constants.d.ts +3 -0
  22. package/dist/core/modules/ai/core-ai.constants.js +3 -0
  23. package/dist/core/modules/ai/core-ai.constants.js.map +1 -1
  24. package/dist/core/modules/ai/core-ai.controller.d.ts +9 -0
  25. package/dist/core/modules/ai/core-ai.controller.js +48 -1
  26. package/dist/core/modules/ai/core-ai.controller.js.map +1 -1
  27. package/dist/core/modules/ai/core-ai.module.d.ts +2 -0
  28. package/dist/core/modules/ai/core-ai.module.js +9 -1
  29. package/dist/core/modules/ai/core-ai.module.js.map +1 -1
  30. package/dist/core/modules/ai/core-ai.resolver.d.ts +6 -0
  31. package/dist/core/modules/ai/core-ai.resolver.js +32 -0
  32. package/dist/core/modules/ai/core-ai.resolver.js.map +1 -1
  33. package/dist/core/modules/ai/helpers/ai-mcp-oauth-consent.helper.d.ts +65 -1
  34. package/dist/core/modules/ai/helpers/ai-mcp-oauth-consent.helper.js +6 -3
  35. package/dist/core/modules/ai/helpers/ai-mcp-oauth-consent.helper.js.map +1 -1
  36. package/dist/core/modules/ai/helpers/ai-mcp-oauth.helper.js +48 -1
  37. package/dist/core/modules/ai/helpers/ai-mcp-oauth.helper.js.map +1 -1
  38. package/dist/core/modules/ai/helpers/ai-tool-authorization.helper.d.ts +9 -0
  39. package/dist/core/modules/ai/helpers/ai-tool-authorization.helper.js +54 -0
  40. package/dist/core/modules/ai/helpers/ai-tool-authorization.helper.js.map +1 -0
  41. package/dist/core/modules/ai/index.d.ts +8 -0
  42. package/dist/core/modules/ai/index.js +7 -0
  43. package/dist/core/modules/ai/index.js.map +1 -1
  44. package/dist/core/modules/ai/inputs/core-ai-settings.input.d.ts +3 -0
  45. package/dist/core/modules/ai/inputs/core-ai-settings.input.js +31 -0
  46. package/dist/core/modules/ai/inputs/core-ai-settings.input.js.map +1 -0
  47. package/dist/core/modules/ai/interfaces/ai-tool.interface.d.ts +2 -0
  48. package/dist/core/modules/ai/models/core-ai-settings.model.d.ts +4 -0
  49. package/dist/core/modules/ai/models/core-ai-settings.model.js +30 -0
  50. package/dist/core/modules/ai/models/core-ai-settings.model.js.map +1 -0
  51. package/dist/core/modules/ai/models/core-ai-status.model.d.ts +3 -0
  52. package/dist/core/modules/ai/models/core-ai-status.model.js +25 -0
  53. package/dist/core/modules/ai/models/core-ai-status.model.js.map +1 -0
  54. package/dist/core/modules/ai/models/core-ai-user-setting.model.d.ts +8 -0
  55. package/dist/core/modules/ai/models/core-ai-user-setting.model.js +45 -0
  56. package/dist/core/modules/ai/models/core-ai-user-setting.model.js.map +1 -0
  57. package/dist/core/modules/ai/services/core-ai-conversation.service.d.ts +4 -1
  58. package/dist/core/modules/ai/services/core-ai-conversation.service.js +16 -4
  59. package/dist/core/modules/ai/services/core-ai-conversation.service.js.map +1 -1
  60. package/dist/core/modules/ai/services/core-ai-mcp-oauth.service.js +6 -6
  61. package/dist/core/modules/ai/services/core-ai-mcp-oauth.service.js.map +1 -1
  62. package/dist/core/modules/ai/services/core-ai-mcp.service.d.ts +27 -2
  63. package/dist/core/modules/ai/services/core-ai-mcp.service.js +118 -11
  64. package/dist/core/modules/ai/services/core-ai-mcp.service.js.map +1 -1
  65. package/dist/core/modules/ai/services/core-ai-prompt-builder.service.js +9 -6
  66. package/dist/core/modules/ai/services/core-ai-prompt-builder.service.js.map +1 -1
  67. package/dist/core/modules/ai/services/core-ai-user-setting.service.d.ts +17 -0
  68. package/dist/core/modules/ai/services/core-ai-user-setting.service.js +72 -0
  69. package/dist/core/modules/ai/services/core-ai-user-setting.service.js.map +1 -0
  70. package/dist/core/modules/ai/services/core-ai.service.d.ts +8 -3
  71. package/dist/core/modules/ai/services/core-ai.service.js +68 -29
  72. package/dist/core/modules/ai/services/core-ai.service.js.map +1 -1
  73. package/dist/core/modules/better-auth/better-auth.config.js +10 -4
  74. package/dist/core/modules/better-auth/better-auth.config.js.map +1 -1
  75. package/dist/core/modules/better-auth/core-better-auth-email-verification.service.js +2 -2
  76. package/dist/core/modules/better-auth/core-better-auth-email-verification.service.js.map +1 -1
  77. package/dist/core/modules/better-auth/core-better-auth-path-guard.middleware.d.ts +8 -0
  78. package/dist/core/modules/better-auth/core-better-auth-path-guard.middleware.js +64 -0
  79. package/dist/core/modules/better-auth/core-better-auth-path-guard.middleware.js.map +1 -0
  80. package/dist/core/modules/better-auth/core-better-auth-rate-limit.middleware.js +2 -1
  81. package/dist/core/modules/better-auth/core-better-auth-rate-limit.middleware.js.map +1 -1
  82. package/dist/core/modules/better-auth/core-better-auth-rate-limiter.service.d.ts +1 -1
  83. package/dist/core/modules/better-auth/core-better-auth-rate-limiter.service.js +5 -3
  84. package/dist/core/modules/better-auth/core-better-auth-rate-limiter.service.js.map +1 -1
  85. package/dist/core/modules/better-auth/core-better-auth.module.js +2 -0
  86. package/dist/core/modules/better-auth/core-better-auth.module.js.map +1 -1
  87. package/dist/core/modules/better-auth/index.d.ts +1 -0
  88. package/dist/core/modules/better-auth/index.js +1 -0
  89. package/dist/core/modules/better-auth/index.js.map +1 -1
  90. package/dist/core/modules/error-code/error-codes.d.ts +18 -0
  91. package/dist/core/modules/error-code/error-codes.js +16 -0
  92. package/dist/core/modules/error-code/error-codes.js.map +1 -1
  93. package/dist/core/modules/sync/core-sync.service.d.ts +1 -0
  94. package/dist/core/modules/sync/core-sync.service.js +31 -2
  95. package/dist/core/modules/sync/core-sync.service.js.map +1 -1
  96. package/dist/core/modules/tenant/core-tenant.guard.js +10 -0
  97. package/dist/core/modules/tenant/core-tenant.guard.js.map +1 -1
  98. package/dist/core/modules/tenant/core-tenant.service.d.ts +21 -1
  99. package/dist/core/modules/tenant/core-tenant.service.js +153 -1
  100. package/dist/core/modules/tenant/core-tenant.service.js.map +1 -1
  101. package/dist/server/modules/error-code/error-codes.d.ts +2 -0
  102. package/dist/test/test.helper.d.ts +1 -0
  103. package/dist/test/test.helper.js +9 -2
  104. package/dist/test/test.helper.js.map +1 -1
  105. package/docs/REQUEST-LIFECYCLE.md +5 -4
  106. package/docs/error-codes.md +14 -0
  107. package/docs/offline-sync-protocol.md +17 -8
  108. package/migration-guides/12.0.x-to-12.1.x.md +0 -1
  109. package/migration-guides/12.2.x-to-12.3.x.md +440 -0
  110. package/migration-guides/12.3.0-to-12.3.1.md +136 -0
  111. package/package.json +26 -26
  112. package/src/config.env.ts +6 -2
  113. package/src/core/common/helpers/graphql-ws-connection.helper.ts +32 -4
  114. package/src/core/common/interceptors/check-security.interceptor.ts +26 -2
  115. package/src/core/common/interfaces/server-options.interface.ts +84 -8
  116. package/src/core/common/persistence/sync-model.ts +1 -1
  117. package/src/core/modules/ai/INTEGRATION-CHECKLIST.md +36 -15
  118. package/src/core/modules/ai/README.md +178 -25
  119. package/src/core/modules/ai/core-ai-mcp.controller.ts +48 -1
  120. package/src/core/modules/ai/core-ai.constants.ts +10 -0
  121. package/src/core/modules/ai/core-ai.controller.ts +55 -1
  122. package/src/core/modules/ai/core-ai.module.ts +14 -0
  123. package/src/core/modules/ai/core-ai.resolver.ts +36 -0
  124. package/src/core/modules/ai/helpers/ai-mcp-oauth-consent.helper.ts +35 -4
  125. package/src/core/modules/ai/helpers/ai-mcp-oauth.helper.ts +68 -1
  126. package/src/core/modules/ai/helpers/ai-tool-authorization.helper.ts +99 -0
  127. package/src/core/modules/ai/index.ts +19 -0
  128. package/src/core/modules/ai/inputs/core-ai-settings.input.ts +24 -0
  129. package/src/core/modules/ai/interfaces/ai-hook.interface.ts +1 -1
  130. package/src/core/modules/ai/interfaces/ai-tool.interface.ts +38 -26
  131. package/src/core/modules/ai/models/core-ai-mode.model.ts +1 -1
  132. package/src/core/modules/ai/models/core-ai-settings.model.ts +23 -0
  133. package/src/core/modules/ai/models/core-ai-status.model.ts +16 -0
  134. package/src/core/modules/ai/models/core-ai-tool-policy.model.ts +1 -1
  135. package/src/core/modules/ai/models/core-ai-user-setting.model.ts +46 -0
  136. package/src/core/modules/ai/services/core-ai-conversation.service.ts +31 -6
  137. package/src/core/modules/ai/services/core-ai-mcp-oauth.service.ts +12 -9
  138. package/src/core/modules/ai/services/core-ai-mcp.service.ts +206 -13
  139. package/src/core/modules/ai/services/core-ai-prompt-builder.service.ts +13 -6
  140. package/src/core/modules/ai/services/core-ai-user-setting.service.ts +85 -0
  141. package/src/core/modules/ai/services/core-ai.service.ts +134 -35
  142. package/src/core/modules/api-token/README.md +4 -2
  143. package/src/core/modules/better-auth/CUSTOMIZATION.md +1 -1
  144. package/src/core/modules/better-auth/INTEGRATION-CHECKLIST.md +12 -2
  145. package/src/core/modules/better-auth/README.md +32 -1
  146. package/src/core/modules/better-auth/better-auth.config.ts +21 -5
  147. package/src/core/modules/better-auth/core-better-auth-email-verification.service.ts +5 -2
  148. package/src/core/modules/better-auth/core-better-auth-path-guard.middleware.ts +85 -0
  149. package/src/core/modules/better-auth/core-better-auth-rate-limit.middleware.ts +5 -2
  150. package/src/core/modules/better-auth/core-better-auth-rate-limiter.service.ts +14 -7
  151. package/src/core/modules/better-auth/core-better-auth.module.ts +12 -2
  152. package/src/core/modules/better-auth/index.ts +1 -0
  153. package/src/core/modules/error-code/error-codes.ts +18 -0
  154. package/src/core/modules/sync/README.md +11 -1
  155. package/src/core/modules/sync/core-sync.service.ts +48 -3
  156. package/src/core/modules/tenant/INTEGRATION-CHECKLIST.md +12 -1
  157. package/src/core/modules/tenant/README.md +49 -3
  158. package/src/core/modules/tenant/core-tenant.guard.ts +18 -2
  159. package/src/core/modules/tenant/core-tenant.service.ts +287 -2
  160. package/src/test/test.helper.ts +17 -3
@@ -7,36 +7,70 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
10
13
  var CoreAiMcpService_1;
11
- import { Injectable, Logger } from '@nestjs/common';
14
+ import { Injectable, Logger, Optional } from '@nestjs/common';
15
+ import { RequestContext } from '../../../common/services/request-context.service.js';
16
+ import { authorizeToolCall, effectiveMcpConfirmation, mcpConfirmationPolicy, toolRequiresConfirmation, } from '../helpers/ai-tool-authorization.helper.js';
12
17
  import { AiToolRegistry } from '../tools/ai-tool.registry.js';
18
+ import { CoreAiToolPolicyService } from './core-ai-tool-policy.service.js';
19
+ import { CoreAiUserSettingService } from './core-ai-user-setting.service.js';
13
20
  let CoreAiMcpService = CoreAiMcpService_1 = class CoreAiMcpService {
14
21
  toolRegistry;
22
+ userSettingService;
23
+ toolPolicyService;
15
24
  logger = new Logger(CoreAiMcpService_1.name);
16
- constructor(toolRegistry) {
25
+ confirmationTimeoutMs = 5 * 60_000;
26
+ constructor(toolRegistry, userSettingService, toolPolicyService) {
17
27
  this.toolRegistry = toolRegistry;
28
+ this.userSettingService = userSettingService;
29
+ this.toolPolicyService = toolPolicyService;
18
30
  }
19
31
  mcpListTools(user) {
20
- return this.toolRegistry
21
- .forUser(user)
22
- .map((tool) => ({ description: tool.description, inputSchema: tool.parameters, name: tool.name }));
32
+ return this.toolRegistry.forUser(user).map((tool) => ({
33
+ ...(tool.destructive || tool.mutating
34
+ ? { annotations: { destructiveHint: tool.destructive === true, readOnlyHint: false } }
35
+ : {}),
36
+ description: tool.description,
37
+ inputSchema: tool.parameters,
38
+ name: tool.name,
39
+ }));
23
40
  }
24
- async mcpCallTool(user, name, args) {
41
+ async mcpCallTool(user, name, args, options = {}) {
25
42
  const tool = this.toolRegistry.forUser(user).find((t) => t.name === name);
26
43
  if (!tool) {
27
- return { content: [{ text: `Unknown or not permitted tool: ${name}`, type: 'text' }], isError: true };
44
+ return this.errorResult(`Unknown or not permitted tool: ${name}`);
28
45
  }
46
+ const callArgs = args ?? {};
29
47
  const context = {
30
48
  currentUser: (user ?? undefined),
31
49
  serviceOptions: { currentUser: (user ?? undefined) },
32
50
  };
51
+ const policy = await this.evaluateToolPolicy(tool, callArgs, user);
52
+ if (policy?.decision === 'deny') {
53
+ return this.errorResult(policy.reason || `"${name}" is not permitted by policy.`);
54
+ }
55
+ const authorization = await authorizeToolCall(tool, callArgs, context);
56
+ if (!authorization.allowed) {
57
+ return this.errorResult(authorization.reason || `Not permitted: ${name}`);
58
+ }
59
+ if (policy?.decision === 'ask' || (await this.confirmationRequired(tool, user))) {
60
+ if (!options.confirm) {
61
+ return this.errorResult(`"${name}" needs the user's confirmation, and this MCP client cannot ask for it (elicitation). Nothing was run.`);
62
+ }
63
+ if (!(await this.askForConfirmation(tool, callArgs, options.confirm))) {
64
+ return this.errorResult(`"${name}" was not run: the user did not confirm it.`);
65
+ }
66
+ }
33
67
  try {
34
- const result = await tool.execute(args ?? {}, context);
68
+ const result = await tool.execute(callArgs, tool.authorize ? { ...context, authorization } : context);
35
69
  return { content: [{ text: JSON.stringify(result), type: 'text' }] };
36
70
  }
37
71
  catch (err) {
38
72
  this.logger.warn(`MCP tool "${name}" failed: ${err.message}`);
39
- return { content: [{ text: err.message, type: 'text' }], isError: true };
73
+ return this.errorResult(err.message);
40
74
  }
41
75
  }
42
76
  async createServer(user) {
@@ -45,13 +79,86 @@ let CoreAiMcpService = CoreAiMcpService_1 = class CoreAiMcpService {
45
79
  const { CallToolRequestSchema, ListToolsRequestSchema } = await import('@modelcontextprotocol/sdk/types.js');
46
80
  const server = new Server({ name: 'lt-nest-server-ai', version: '1.0.0' }, { capabilities: { tools: {} } });
47
81
  server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: this.mcpListTools(currentUser()) }));
48
- server.setRequestHandler(CallToolRequestSchema, async (request) => this.mcpCallTool(currentUser(), request.params.name, request.params.arguments ?? {}));
82
+ server.setRequestHandler(CallToolRequestSchema, async (request, extra) => this.mcpCallTool(currentUser(), request.params.name, request.params.arguments ?? {}, {
83
+ confirm: server.getClientCapabilities()?.elicitation?.form
84
+ ? (prompt) => this.elicitConfirmation(server, prompt, extra?.requestId)
85
+ : undefined,
86
+ }));
49
87
  return server;
50
88
  }
89
+ async confirmationRequired(tool, user) {
90
+ if (!toolRequiresConfirmation(tool)) {
91
+ return false;
92
+ }
93
+ if (this.userSettingService) {
94
+ return this.userSettingService.mcpConfirmationFor(user?.id);
95
+ }
96
+ return effectiveMcpConfirmation(mcpConfirmationPolicy());
97
+ }
98
+ async evaluateToolPolicy(tool, args, user) {
99
+ if (!this.toolPolicyService) {
100
+ return undefined;
101
+ }
102
+ try {
103
+ return await this.toolPolicyService.evaluate(tool.name, args, {
104
+ roles: user?.roles ?? [],
105
+ tenantId: RequestContext.getTenantId(),
106
+ userId: user?.id,
107
+ });
108
+ }
109
+ catch (err) {
110
+ this.logger.warn(`AI tool-policy evaluation for "${tool.name}" failed: ${err.message}`);
111
+ return undefined;
112
+ }
113
+ }
114
+ confirmationPrompt(tool, args) {
115
+ const maxValueLength = 200;
116
+ const lines = Object.entries(args).map(([key, value]) => {
117
+ const text = typeof value === 'string' ? value : (JSON.stringify(value) ?? String(value));
118
+ const shown = text.length > maxValueLength ? `${text.slice(0, maxValueLength)}… (${text.length} characters)` : text;
119
+ return `- ${key}: ${shown}`;
120
+ });
121
+ const consequence = tool.destructive ? 'This cannot be undone.' : 'This changes data.';
122
+ const argumentsText = lines.length ? `\nArguments:\n${lines.join('\n')}` : '';
123
+ return {
124
+ arguments: args,
125
+ message: `Allow the AI assistant to run "${tool.name}"? ${consequence}${argumentsText}`,
126
+ tool: tool.name,
127
+ };
128
+ }
129
+ async askForConfirmation(tool, args, confirm) {
130
+ try {
131
+ return (await confirm(this.confirmationPrompt(tool, args))) === true;
132
+ }
133
+ catch (err) {
134
+ this.logger.warn(`Confirmation of MCP tool "${tool.name}" failed, not run: ${err.message}`);
135
+ return false;
136
+ }
137
+ }
138
+ async elicitConfirmation(server, prompt, requestId) {
139
+ const result = await server.elicitInput({
140
+ message: prompt.message,
141
+ requestedSchema: {
142
+ properties: {
143
+ confirm: { description: `Run "${prompt.tool}" now`, title: 'Confirm', type: 'boolean' },
144
+ },
145
+ required: ['confirm'],
146
+ type: 'object',
147
+ },
148
+ }, { relatedRequestId: requestId, timeout: this.confirmationTimeoutMs });
149
+ return result?.action === 'accept' && result.content?.confirm === true;
150
+ }
151
+ errorResult(text) {
152
+ return { content: [{ text, type: 'text' }], isError: true };
153
+ }
51
154
  };
52
155
  CoreAiMcpService = CoreAiMcpService_1 = __decorate([
53
156
  Injectable(),
54
- __metadata("design:paramtypes", [AiToolRegistry])
157
+ __param(1, Optional()),
158
+ __param(2, Optional()),
159
+ __metadata("design:paramtypes", [AiToolRegistry,
160
+ CoreAiUserSettingService,
161
+ CoreAiToolPolicyService])
55
162
  ], CoreAiMcpService);
56
163
  export { CoreAiMcpService };
57
164
  //# sourceMappingURL=core-ai-mcp.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"core-ai-mcp.service.js","sourceRoot":"","sources":["../../../../../src/core/modules/ai/services/core-ai-mcp.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"core-ai-mcp.service.js","sourceRoot":"","sources":["../../../../../src/core/modules/ai/services/core-ai-mcp.service.ts"],"names":[],"mappings":"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"}
@@ -103,12 +103,15 @@ let CoreAiPromptBuilderService = CoreAiPromptBuilderService_1 = class CoreAiProm
103
103
  : '\n\n[Schemas deferred. Call `search_tools` with the tool name to fetch its parameter schema BEFORE you call it.]';
104
104
  }
105
105
  }
106
- const toolCatalog = defer
107
- ? (tools.map((t) => `- ${t.name}: ${this.summarizeToolDescription(t.description, summaryChars)}`).join('\n') ||
108
- '(none)') + deferNote
109
- : tools
110
- .map((t) => `- ${t.name}: ${t.description}\n parameters (JSON schema): ${JSON.stringify(t.parameters)}`)
111
- .join('\n') || '(none)';
106
+ const namesOnly = supportsNativeTools && !planMode && ConfigService.get('ai.nativeToolCatalog') !== 'full';
107
+ const toolCatalog = namesOnly
108
+ ? tools.map((t) => `- ${t.name}`).join('\n') || '(none)'
109
+ : defer
110
+ ? (tools.map((t) => `- ${t.name}: ${this.summarizeToolDescription(t.description, summaryChars)}`).join('\n') ||
111
+ '(none)') + deferNote
112
+ : tools
113
+ .map((t) => `- ${t.name}: ${t.description}\n parameters (JSON schema): ${JSON.stringify(t.parameters)}`)
114
+ .join('\n') || '(none)';
112
115
  if (this.placeholderRegistry) {
113
116
  return this.placeholderRegistry.resolveAll({ toolCatalog, tools, user });
114
117
  }
@@ -1 +1 @@
1
- {"version":3,"file":"core-ai-prompt-builder.service.js","sourceRoot":"","sources":["../../../../../src/core/modules/ai/services/core-ai-prompt-builder.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"core-ai-prompt-builder.service.js","sourceRoot":"","sources":["../../../../../src/core/modules/ai/services/core-ai-prompt-builder.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE9D,OAAO,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAG3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAA0B,MAAM,2BAA2B,CAAC;AAuBtG,IAAM,0BAA0B,kCAAhC,MAAM,0BAA0B;IAmBJ;IACA;IACA;IApBd,MAAM,GAAG,IAAI,MAAM,CAAC,4BAA0B,CAAC,IAAI,CAAC,CAAC;IAGrD,YAAY,GAAG,CAAC,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,wBAAwB,CAAC,CAAC;IAG9F,mBAAmB,GACpC,sEAAsE;QACtE,uFAAuF;QACvF,uFAAuF,CAAC;IAGvE,QAAQ,GAAG,CAAC,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,wBAAwB,CAAC,CAAC;IAGrG,yBAAyB,GAAG,KAAK,CAAC;IAE1C,YACiC,eAAmC,EACnC,WAAqC,EACrC,mBAA+C;QAF/C,oBAAe,GAAf,eAAe,CAAoB;QACnC,gBAAW,GAAX,WAAW,CAA0B;QACrC,wBAAmB,GAAnB,mBAAmB,CAA4B;IAC7E,CAAC;IAOJ,KAAK,CAAC,iBAAiB,CACrB,KAAgB,EAChB,mBAA4B,EAC5B,IAAwC,EACxC,OAA4B;QAE5B,MAAM,UAAU,GAAG,mBAAmB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;QAC/D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAC3C,UAAU,EACV,OAAO,EAAE,QAAQ,EACjB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CACzC,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,mBAAmB,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC,QAAQ,CAClB,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,eAAe,CAAC,EAClD,OAAO,EACP,KAAK,CAAC,MAAM,CACb,CAAC;IACJ,CAAC;IAQD,KAAK,CAAC,qBAAqB,CACzB,KAAgB,EAChB,IAAwC,EACxC,OAA4B;QAE5B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAC3C,UAAU,EACV,OAAO,EAAE,QAAQ,EACjB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CACzC,CAAC;QAIF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QACnE,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,eAAe,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/G,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7D,CAAC;IAKD,gBAAgB,CAAC,KAAgB;QAC/B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACpG,CAAC;IAOS,gBAAgB;QACxB,OAAO,qBAAqB,CAAC,aAAa,CAAC,GAAG,CAAS,iBAAiB,CAAC,IAAI,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACzG,CAAC;IAMS,gBAAgB;QACxB,OAAO,aAAa,CAAC,GAAG,CAAS,kBAAkB,CAAC,IAAI,SAAS,CAAC;IACpE,CAAC;IAMS,KAAK,CAAC,gBAAgB,CAC9B,UAAkB,EAClB,MAAe,EACf,MAAiB;QAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACzC,MAAM,YAAY,GAAG,MAAM,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,OAAO,QAAQ;iBACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,KAAK,KAAK,IAAI,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC;iBACrF,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;iBACzD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IACvG,CAAC;IAOS,aAAa,CACrB,KAAgB,EAChB,IAAwC,EACxC,OAAgD;QAEhD,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;YAC/B,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,OAAO,EAAE,IAAI,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAOS,KAAK,CAAC,aAAa,CAC3B,KAAgB,EAChB,IAAwC,EACxC,mBAAmB,GAAG,KAAK,EAC3B,QAAQ,GAAG,KAAK;QAOhB,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAU,qBAAqB,CAAC,KAAK,IAAI,CAAC;QACzE,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAQrC,MAAM,YAAY,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAS,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC;QAG5G,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,KAAK,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAClC,IAAI,QAAQ,EAAE,CAAC;gBAKb,SAAS;oBACP,YAAY,GAAG,CAAC;wBACd,CAAC,CAAC,4GAA4G;4BAC5G,0GAA0G;4BAC1G,2EAA2E;wBAC7E,CAAC,CAAC,4GAA4G;4BAC5G,iBAAiB,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACN,SAAS;oBACP,YAAY,GAAG,CAAC;wBACd,CAAC,CAAC,4GAA4G;4BAC5G,4GAA4G;4BAC5G,2CAA2C;wBAC7C,CAAC,CAAC,kHAAkH,CAAC;YAC3H,CAAC;QACH,CAAC;QAKD,MAAM,SAAS,GAAG,mBAAmB,IAAI,CAAC,QAAQ,IAAI,aAAa,CAAC,GAAG,CAAS,sBAAsB,CAAC,KAAK,MAAM,CAAC;QACnH,MAAM,WAAW,GAAG,SAAS;YAC3B,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ;YACxD,CAAC,CAAC,KAAK;gBACL,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;oBACxG,QAAQ,CAAC,GAAG,SAAS;gBACzB,CAAC,CAAC,KAAK;qBACF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,WAAW,iCAAiC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC;qBACxG,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC;QAEhC,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3E,CAAC;QAGD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvG,OAAO;YACL,aAAa,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE;YAC5C,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;YAC3E,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM;YAC3D,WAAW;YACX,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM;YACpD,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE;SACvB,CAAC;IACJ,CAAC;IAQS,wBAAwB,CAAC,KAAc;QAC/C,IAAI,KAAK,IAAI,IAAI,CAAC,yBAAyB,EAAE,CAAC;YAC5C,OAAO;QACT,CAAC;QAID,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC;QACtC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,0BAA0B,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YACrE,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,iGAAiG;gBAC/F,6EAA6E,CAChF,CAAC;QACJ,CAAC;IACH,CAAC;IAwBS,wBAAwB,CAAC,WAAmB,EAAE,QAAgB;QACtE,MAAM,IAAI,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,QAAQ,IAAI,QAAQ,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC1D,OAAO,IAAI,CAAC;QACd,CAAC;QAmBD,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAClD,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;gBAC3D,MAAM;YACR,CAAC;YACD,GAAG,GAAG,IAAI,CAAC;YACX,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;gBACpD,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QAC3C,IAAI,OAAO,CAAC,MAAM,GAAG,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;YAE1C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YACpC,MAAM,SAAS,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACvC,OAAO,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QACtE,CAAC;QACD,OAAO,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;IAChE,CAAC;IAGS,QAAQ,CAAC,SAAmC,EAAE,OAA+B,EAAE,SAAiB;QACxG,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YAEjC,IAAI,QAAQ,CAAC,GAAG,KAAK,eAAe,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;gBAC/D,SAAS;YACX,CAAC;YACD,IAAI,QAAQ,CAAC,GAAG,KAAK,eAAe,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;gBAC9D,SAAS;YACX,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;gBAC5D,SAAS;YACX,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAC/D,IAAI,QAAQ,EAAE,CAAC;gBACb,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAGS,MAAM,CAAC,QAAgB,EAAE,OAA+B;QAChE,OAAO,QAAQ,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC,MAAM,EAAE,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/F,CAAC;CACF,CAAA;AAjVY,0BAA0B;IADtC,UAAU,EAAE;IAoBR,WAAA,QAAQ,EAAE,CAAA;IACV,WAAA,QAAQ,EAAE,CAAA;IACV,WAAA,QAAQ,EAAE,CAAA;qCAFsC,iBAAiB;QACrB,uBAAuB;QACf,yBAAyB;GArBrE,0BAA0B,CAiVtC"}
@@ -0,0 +1,17 @@
1
+ import { Logger } from '@nestjs/common';
2
+ import type { Model } from 'mongoose';
3
+ import { CrudService } from '../../../common/services/crud.service.js';
4
+ import type { CoreModelConstructor } from '../../../common/types/core-model-constructor.type.js';
5
+ import type { CoreAiSettingsInput } from '../inputs/core-ai-settings.input.js';
6
+ import { CoreAiSettings } from '../models/core-ai-settings.model.js';
7
+ import { AiUserSettingDocument, CoreAiUserSetting } from '../models/core-ai-user-setting.model.js';
8
+ export declare class CoreAiUserSettingService extends CrudService<CoreAiUserSetting, CoreAiUserSetting, CoreAiUserSetting> {
9
+ protected readonly mainDbModel: Model<AiUserSettingDocument>;
10
+ protected readonly mainModelConstructor: CoreModelConstructor<CoreAiUserSetting>;
11
+ protected readonly logger: Logger;
12
+ constructor(mainDbModel: Model<AiUserSettingDocument>, mainModelConstructor: CoreModelConstructor<CoreAiUserSetting>);
13
+ getSettings(userId: string | undefined): Promise<CoreAiSettings>;
14
+ updateSettings(userId: string, input: CoreAiSettingsInput): Promise<CoreAiSettings>;
15
+ mcpConfirmationFor(userId: string | undefined): Promise<boolean>;
16
+ protected findForUser(userId: string): Promise<CoreAiUserSetting | undefined>;
17
+ }
@@ -0,0 +1,72 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ var CoreAiUserSettingService_1;
14
+ import { ForbiddenException, Inject, Injectable, Logger } from '@nestjs/common';
15
+ import { InjectModel } from '../../../common/persistence/mongo/mongoose-compat.js';
16
+ import { upsertRecord } from '../../../common/persistence/store-upsert.js';
17
+ import { CrudService } from '../../../common/services/crud.service.js';
18
+ import { ErrorCode } from '../../error-code/index.js';
19
+ import { effectiveMcpConfirmation, mcpConfirmationPolicy } from '../helpers/ai-tool-authorization.helper.js';
20
+ import { CoreAiSettings } from '../models/core-ai-settings.model.js';
21
+ import { AI_USER_SETTING_CLASS, AI_USER_SETTING_MODEL } from '../core-ai.constants.js';
22
+ let CoreAiUserSettingService = CoreAiUserSettingService_1 = class CoreAiUserSettingService extends CrudService {
23
+ mainDbModel;
24
+ mainModelConstructor;
25
+ logger = new Logger(CoreAiUserSettingService_1.name);
26
+ constructor(mainDbModel, mainModelConstructor) {
27
+ super();
28
+ this.mainDbModel = mainDbModel;
29
+ this.mainModelConstructor = mainModelConstructor;
30
+ }
31
+ async getSettings(userId) {
32
+ const policy = mcpConfirmationPolicy();
33
+ const stored = userId ? await this.findForUser(userId) : undefined;
34
+ const settings = new CoreAiSettings();
35
+ settings.mcpConfirmation = effectiveMcpConfirmation(policy, stored?.mcpConfirmation);
36
+ settings.mcpConfirmationEnforced = policy.enforced;
37
+ return settings;
38
+ }
39
+ async updateSettings(userId, input) {
40
+ if (typeof input?.mcpConfirmation === 'boolean') {
41
+ if (mcpConfirmationPolicy().enforced) {
42
+ throw new ForbiddenException(ErrorCode.AI_SETTING_ENFORCED);
43
+ }
44
+ await upsertRecord(this.dataStore, { userId }, { mcpConfirmation: input.mcpConfirmation });
45
+ }
46
+ return this.getSettings(userId);
47
+ }
48
+ async mcpConfirmationFor(userId) {
49
+ const policy = mcpConfirmationPolicy();
50
+ if (policy.enforced || !userId) {
51
+ return policy.default;
52
+ }
53
+ try {
54
+ return effectiveMcpConfirmation(policy, (await this.findForUser(userId))?.mcpConfirmation);
55
+ }
56
+ catch (err) {
57
+ this.logger.warn(`AI settings of user ${userId} could not be read, MCP asks: ${err.message}`);
58
+ return true;
59
+ }
60
+ }
61
+ async findForUser(userId) {
62
+ return (await this.dataStore.findOne({ userId })) ?? undefined;
63
+ }
64
+ };
65
+ CoreAiUserSettingService = CoreAiUserSettingService_1 = __decorate([
66
+ Injectable(),
67
+ __param(0, InjectModel(AI_USER_SETTING_MODEL)),
68
+ __param(1, Inject(AI_USER_SETTING_CLASS)),
69
+ __metadata("design:paramtypes", [Function, Object])
70
+ ], CoreAiUserSettingService);
71
+ export { CoreAiUserSettingService };
72
+ //# sourceMappingURL=core-ai-user-setting.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-ai-user-setting.service.js","sourceRoot":"","sources":["../../../../../src/core/modules/ai/services/core-ai-user-setting.service.ts"],"names":[],"mappings":"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"}
@@ -68,11 +68,13 @@ export declare class CoreAiService {
68
68
  protected readonly placeholderRegistry?: CoreAiPlaceholderRegistry;
69
69
  protected readonly coreRedisService?: CoreRedisService;
70
70
  protected readonly logger: Logger;
71
+ protected crowdedContextWarned?: Set<string>;
71
72
  protected rateLimitStore?: RateLimitStore;
72
73
  constructor(connectionService: CoreAiConnectionService, providerFactory: LlmProviderFactory, toolRegistry: AiToolRegistry, promptBuilder: CoreAiPromptBuilderService, interactionService?: CoreAiInteractionService, conversationService?: CoreAiConversationService, budgetService?: CoreAiBudgetService, connectionResolver?: CoreAiConnectionResolverService, hintService?: CoreAiPromptHintService, toolGrantService?: CoreAiToolGrantService, hookRegistry?: AiHookRegistry, toolPolicyService?: CoreAiToolPolicyService, modeService?: CoreAiModeService, placeholderRegistry?: CoreAiPlaceholderRegistry, coreRedisService?: CoreRedisService);
73
74
  prompt(input: CoreAiPromptInput, serviceOptions: ServiceOptions, hooks?: {
74
75
  onAction?: (action: CoreAiAction) => void;
75
76
  }): Promise<CoreAiResponse>;
77
+ protected scopeConversation(input: CoreAiPromptInput, serviceOptions: ServiceOptions): Promise<CoreAiPromptInput>;
76
78
  protected resolvePromptPlaceholders(input: CoreAiPromptInput, serviceOptions: ServiceOptions): Promise<CoreAiPromptInput>;
77
79
  protected unavailableResponse(input: CoreAiPromptInput, language?: string): CoreAiResponse;
78
80
  protected readonly detectionBackoff: Map<string, number>;
@@ -102,7 +104,7 @@ export declare class CoreAiService {
102
104
  }, completion: LlmResponse): void;
103
105
  protected toAction(call: LlmToolCall): CoreAiAction;
104
106
  protected baseResponse(connectionId: string, input: CoreAiPromptInput): CoreAiResponse;
105
- protected persistTurn(input: CoreAiPromptInput, response: CoreAiResponse): Promise<void>;
107
+ protected persistTurn(input: CoreAiPromptInput, response: CoreAiResponse, run: AiRunContext): Promise<void>;
106
108
  protected auditRecord(input: CoreAiPromptInput, run: AiRunContext, response: CoreAiResponse, usage: {
107
109
  completionTokens: number;
108
110
  promptTokens: number;
@@ -122,8 +124,11 @@ export declare class CoreAiService {
122
124
  protected firstBalancedJson(text: string, from: number): null | string;
123
125
  protected estimateTokens(text: string): number;
124
126
  protected contextBudget(connection: ResolvedAiConnection): number;
125
- protected compactMessages(messages: LlmMessage[], connection: ResolvedAiConnection): Promise<number>;
126
- protected fitMessagesToContext(messages: LlmMessage[], connection: ResolvedAiConnection): void;
127
+ protected messageBudget(connection: ResolvedAiConnection, reservedTokens?: number): number;
128
+ protected crowdedContextShare(): number;
129
+ protected warnOnCrowdedContext(connection: ResolvedAiConnection, fixedTokens: number): void;
130
+ protected compactMessages(messages: LlmMessage[], connection: ResolvedAiConnection, reservedTokens?: number): Promise<number>;
131
+ protected fitMessagesToContext(messages: LlmMessage[], connection: ResolvedAiConnection, reservedTokens?: number): void;
127
132
  protected capToolResults(serialized: string): string;
128
133
  protected evaluateToolPolicies(toolCalls: LlmToolCall[], tools: IAiTool[], run: AiRunContext): Promise<{
129
134
  asked: LlmToolCall[];
@@ -17,6 +17,7 @@ import { CoreRedisService } from '../../../common/services/core-redis.service.js
17
17
  import { InMemoryRateLimitStore, RedisRateLimitStore, } from '../../../common/services/rate-limit-store.js';
18
18
  import { RequestContext } from '../../../common/services/request-context.service.js';
19
19
  import { ErrorCode } from '../../error-code/index.js';
20
+ import { authorizeToolCall, toolRequiresConfirmation } from '../helpers/ai-tool-authorization.helper.js';
20
21
  import { CoreAiAction } from '../models/core-ai-action.model.js';
21
22
  import { CoreAiResponse } from '../models/core-ai-response.model.js';
22
23
  import { CoreAiUsage } from '../models/core-ai-usage.model.js';
@@ -52,6 +53,7 @@ let CoreAiService = CoreAiService_1 = class CoreAiService {
52
53
  placeholderRegistry;
53
54
  coreRedisService;
54
55
  logger = new Logger(CoreAiService_1.name);
56
+ crowdedContextWarned;
55
57
  rateLimitStore;
56
58
  constructor(connectionService, providerFactory, toolRegistry, promptBuilder, interactionService, conversationService, budgetService, connectionResolver, hintService, toolGrantService, hookRegistry, toolPolicyService, modeService, placeholderRegistry, coreRedisService) {
57
59
  this.connectionService = connectionService;
@@ -72,7 +74,7 @@ let CoreAiService = CoreAiService_1 = class CoreAiService {
72
74
  }
73
75
  async prompt(input, serviceOptions, hooks) {
74
76
  const mode = input.mode || ConfigService.get('ai.defaultMode') || 'auto';
75
- const resolvedInput = await this.resolvePromptPlaceholders(input, serviceOptions);
77
+ const resolvedInput = await this.scopeConversation(await this.resolvePromptPlaceholders(input, serviceOptions), serviceOptions);
76
78
  const run = await this.prepareRun(resolvedInput, serviceOptions);
77
79
  if (!run) {
78
80
  return this.unavailableResponse(resolvedInput, serviceOptions?.language);
@@ -84,6 +86,13 @@ let CoreAiService = CoreAiService_1 = class CoreAiService {
84
86
  await this.attachBudgetSummary(response, run);
85
87
  return response;
86
88
  }
89
+ async scopeConversation(input, serviceOptions) {
90
+ if (!input?.conversationId) {
91
+ return input;
92
+ }
93
+ const owned = await this.conversationService?.isOwnedBy(input.conversationId, serviceOptions?.currentUser?.id);
94
+ return owned ? input : { ...input, conversationId: undefined };
95
+ }
87
96
  async resolvePromptPlaceholders(input, serviceOptions) {
88
97
  if (!this.placeholderRegistry || !input?.prompt || !input.prompt.includes('{{')) {
89
98
  return input;
@@ -219,6 +228,8 @@ let CoreAiService = CoreAiService_1 = class CoreAiService {
219
228
  language,
220
229
  });
221
230
  const toolSchemas = this.promptBuilder.buildToolSchemas(tools);
231
+ const toolTokens = provider.capabilities.nativeTools ? this.estimateTokens(JSON.stringify(toolSchemas)) : 0;
232
+ this.warnOnCrowdedContext(connection, this.estimateTokens(systemPrompt) + toolTokens);
222
233
  const jsonMode = provider.capabilities.nativeTools ? { jsonResponse: false } : {};
223
234
  const messages = [{ content: systemPrompt, role: 'system' }];
224
235
  for (const turn of history) {
@@ -251,8 +262,8 @@ let CoreAiService = CoreAiService_1 = class CoreAiService {
251
262
  break;
252
263
  }
253
264
  iterations++;
254
- await this.compactMessages(messages, connection);
255
- this.fitMessagesToContext(messages, connection);
265
+ await this.compactMessages(messages, connection, toolTokens);
266
+ this.fitMessagesToContext(messages, connection, toolTokens);
256
267
  const completion = await provider.chat(messages, toolSchemas, {
257
268
  ...jsonMode,
258
269
  maxTokens: connection.defaultMaxTokens,
@@ -377,8 +388,9 @@ let CoreAiService = CoreAiService_1 = class CoreAiService {
377
388
  response.pendingQuestion = pendingQuestion;
378
389
  }
379
390
  if (input.conversationId && this.conversationService && !requiresConfirmation && !pendingQuestion) {
380
- await this.conversationService.appendMessage(input.conversationId, { content: input.prompt, role: 'user' });
381
- await this.conversationService.appendMessage(input.conversationId, { content: finalText, role: 'assistant' });
391
+ const owner = currentUser?.id;
392
+ await this.conversationService.appendMessage(input.conversationId, { content: input.prompt, role: 'user' }, owner);
393
+ await this.conversationService.appendMessage(input.conversationId, { content: finalText, role: 'assistant' }, owner);
382
394
  }
383
395
  await this.audit({
384
396
  actions: actions.map((a) => ({ name: a.name, success: a.success })),
@@ -400,6 +412,7 @@ let CoreAiService = CoreAiService_1 = class CoreAiService {
400
412
  const usage = { completionTokens: 0, promptTokens: 0, totalTokens: 0 };
401
413
  const chatOptions = { maxTokens: connection.defaultMaxTokens, temperature: connection.defaultTemperature };
402
414
  const planSystemPrompt = await this.promptBuilder.buildPlanSystemPrompt(tools, currentUser, { language });
415
+ this.warnOnCrowdedContext(connection, this.estimateTokens(planSystemPrompt));
403
416
  const messages = [{ content: planSystemPrompt, role: 'system' }];
404
417
  for (const turn of history) {
405
418
  messages.push({ content: turn.content, role: turn.role === 'assistant' ? 'assistant' : 'user' });
@@ -482,7 +495,7 @@ let CoreAiService = CoreAiService_1 = class CoreAiService {
482
495
  response.plan = planActions;
483
496
  response.text = finalText;
484
497
  response.usage = Object.assign(new CoreAiUsage(), usage);
485
- await this.persistTurn(input, response);
498
+ await this.persistTurn(input, response, run);
486
499
  await this.audit(this.auditRecord(input, run, response, usage));
487
500
  return response;
488
501
  }
@@ -547,23 +560,10 @@ let CoreAiService = CoreAiService_1 = class CoreAiService {
547
560
  if (!tool) {
548
561
  return { allowed: false, reason: `Unknown or not permitted tool: ${call.name}` };
549
562
  }
550
- if (!tool.authorize) {
551
- return { allowed: true };
552
- }
553
- const result = await tool.authorize(call.arguments ?? {}, context);
554
- return typeof result === 'boolean' ? { allowed: result } : result;
563
+ return authorizeToolCall(tool, call.arguments ?? {}, context);
555
564
  }
556
565
  confirmationRequiredFor(tool, input) {
557
- if (tool.destructive) {
558
- return true;
559
- }
560
- if (!tool.mutating) {
561
- return false;
562
- }
563
- const cfg = ConfigService.get('ai.confirmation.mutating');
564
- const enforced = cfg?.enforced === true;
565
- const adminDefault = cfg?.default === true;
566
- return enforced ? true : (input.requireConfirmation ?? adminDefault);
566
+ return toolRequiresConfirmation(tool, input.requireConfirmation);
567
567
  }
568
568
  translate(key, language, params = {}) {
569
569
  const lang = (language || 'en').slice(0, 2).toLowerCase();
@@ -633,10 +633,11 @@ let CoreAiService = CoreAiService_1 = class CoreAiService {
633
633
  response.conversationId = input.conversationId;
634
634
  return response;
635
635
  }
636
- async persistTurn(input, response) {
636
+ async persistTurn(input, response, run) {
637
637
  if (input.conversationId && this.conversationService && !response.requiresConfirmation && !response.denied) {
638
- await this.conversationService.appendMessage(input.conversationId, { content: input.prompt, role: 'user' });
639
- await this.conversationService.appendMessage(input.conversationId, { content: response.text, role: 'assistant' });
638
+ const owner = run?.currentUser?.id;
639
+ await this.conversationService.appendMessage(input.conversationId, { content: input.prompt, role: 'user' }, owner);
640
+ await this.conversationService.appendMessage(input.conversationId, { content: response.text, role: 'assistant' }, owner);
640
641
  }
641
642
  }
642
643
  auditRecord(input, run, response, usage) {
@@ -726,8 +727,21 @@ let CoreAiService = CoreAiService_1 = class CoreAiService {
726
727
  action.arguments = decision.args;
727
728
  }
728
729
  }
730
+ const authorization = await this.authorizeCall(call, availableTools, context);
731
+ if (!authorization.allowed) {
732
+ action.success = false;
733
+ action.result = {
734
+ error: {
735
+ code: 'TOOL_NOT_AVAILABLE',
736
+ hint: 'The user may not run this tool with these arguments. Do not retry it; explain this to the user.',
737
+ message: authorization.reason || `Not permitted: ${call.name}`,
738
+ },
739
+ };
740
+ return action;
741
+ }
742
+ const toolContext = tool.authorize ? { ...context, authorization } : context;
729
743
  try {
730
- const raw = await tool.execute(call.arguments ?? {}, context);
744
+ const raw = await tool.execute(call.arguments ?? {}, toolContext);
731
745
  let success = true;
732
746
  let payload = raw;
733
747
  let message;
@@ -898,14 +912,39 @@ let CoreAiService = CoreAiService_1 = class CoreAiService {
898
912
  const margin = 256;
899
913
  return Math.max(512, window - reserve - margin);
900
914
  }
901
- async compactMessages(messages, connection) {
915
+ messageBudget(connection, reservedTokens = 0) {
916
+ return Math.max(512, this.contextBudget(connection) - Math.max(0, reservedTokens));
917
+ }
918
+ crowdedContextShare() {
919
+ return 0.5;
920
+ }
921
+ warnOnCrowdedContext(connection, fixedTokens) {
922
+ const budget = this.contextBudget(connection);
923
+ const key = connection.id ?? connection.name ?? '';
924
+ const warned = (this.crowdedContextWarned ??= new Set());
925
+ if (fixedTokens <= budget * this.crowdedContextShare() || warned.has(key)) {
926
+ return;
927
+ }
928
+ if (warned.size >= 1000) {
929
+ warned.clear();
930
+ }
931
+ warned.add(key);
932
+ const window = connection.contextWindow
933
+ ? `its context window of ${connection.contextWindow}`
934
+ : `the ai.contextWindow fallback of ${ConfigService.get('ai.contextWindow') ?? 8192} (the connection has no context window of its own)`;
935
+ this.logger.warn(`AI connection "${connection.name ?? key}": the system prompt and tool definitions take ~${fixedTokens} of ` +
936
+ `${budget} input tokens (${window}). Little room is left for the conversation: older turns are dropped ` +
937
+ `early and a long message is cut. Set the connection's contextWindow, or shrink the tool catalog ` +
938
+ `(ai.deferToolSchemas, fewer tools per role).`);
939
+ }
940
+ async compactMessages(messages, connection, reservedTokens = 0) {
902
941
  if (ConfigService.get('ai.compaction') === false) {
903
942
  return 0;
904
943
  }
905
944
  if (messages.length <= 3) {
906
945
  return 0;
907
946
  }
908
- const budget = this.contextBudget(connection);
947
+ const budget = this.messageBudget(connection, reservedTokens);
909
948
  const total = () => messages.reduce((sum, m) => sum + this.estimateTokens(m.content) + 4, 0);
910
949
  if (total() <= budget) {
911
950
  return 0;
@@ -943,11 +982,11 @@ let CoreAiService = CoreAiService_1 = class CoreAiService {
943
982
  return 0;
944
983
  }
945
984
  }
946
- fitMessagesToContext(messages, connection) {
985
+ fitMessagesToContext(messages, connection, reservedTokens = 0) {
947
986
  if (messages.length === 0) {
948
987
  return;
949
988
  }
950
- const budget = this.contextBudget(connection);
989
+ const budget = this.messageBudget(connection, reservedTokens);
951
990
  const total = () => messages.reduce((sum, m) => sum + this.estimateTokens(m.content) + 4, 0);
952
991
  let dropped = 0;
953
992
  while (total() > budget && messages.length > 2) {