@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.
- package/.claude/rules/better-auth.md +31 -4
- package/.claude/rules/configurable-features.md +8 -7
- package/.claude/rules/package-management.md +18 -2
- package/.claude/rules/persistence.md +2 -2
- package/.claude/rules/testing.md +5 -5
- package/.claude/rules/versioning.md +13 -2
- package/CLAUDE.md +5 -0
- package/FRAMEWORK-API.md +4 -3
- package/README.md +2 -2
- package/dist/config.env.js +2 -2
- package/dist/config.env.js.map +1 -1
- package/dist/core/common/helpers/graphql-ws-connection.helper.d.ts +4 -0
- package/dist/core/common/helpers/graphql-ws-connection.helper.js +17 -3
- package/dist/core/common/helpers/graphql-ws-connection.helper.js.map +1 -1
- package/dist/core/common/interceptors/check-security.interceptor.js +19 -2
- package/dist/core/common/interceptors/check-security.interceptor.js.map +1 -1
- package/dist/core/common/interfaces/server-options.interface.d.ts +8 -0
- package/dist/core/modules/ai/core-ai-mcp.controller.d.ts +3 -0
- package/dist/core/modules/ai/core-ai-mcp.controller.js +29 -0
- package/dist/core/modules/ai/core-ai-mcp.controller.js.map +1 -1
- package/dist/core/modules/ai/core-ai.constants.d.ts +3 -0
- package/dist/core/modules/ai/core-ai.constants.js +3 -0
- package/dist/core/modules/ai/core-ai.constants.js.map +1 -1
- package/dist/core/modules/ai/core-ai.controller.d.ts +9 -0
- package/dist/core/modules/ai/core-ai.controller.js +48 -1
- package/dist/core/modules/ai/core-ai.controller.js.map +1 -1
- package/dist/core/modules/ai/core-ai.module.d.ts +2 -0
- package/dist/core/modules/ai/core-ai.module.js +9 -1
- package/dist/core/modules/ai/core-ai.module.js.map +1 -1
- package/dist/core/modules/ai/core-ai.resolver.d.ts +6 -0
- package/dist/core/modules/ai/core-ai.resolver.js +32 -0
- package/dist/core/modules/ai/core-ai.resolver.js.map +1 -1
- package/dist/core/modules/ai/helpers/ai-mcp-oauth-consent.helper.d.ts +65 -1
- package/dist/core/modules/ai/helpers/ai-mcp-oauth-consent.helper.js +6 -3
- package/dist/core/modules/ai/helpers/ai-mcp-oauth-consent.helper.js.map +1 -1
- package/dist/core/modules/ai/helpers/ai-mcp-oauth.helper.js +48 -1
- package/dist/core/modules/ai/helpers/ai-mcp-oauth.helper.js.map +1 -1
- package/dist/core/modules/ai/helpers/ai-tool-authorization.helper.d.ts +9 -0
- package/dist/core/modules/ai/helpers/ai-tool-authorization.helper.js +54 -0
- package/dist/core/modules/ai/helpers/ai-tool-authorization.helper.js.map +1 -0
- package/dist/core/modules/ai/index.d.ts +8 -0
- package/dist/core/modules/ai/index.js +7 -0
- package/dist/core/modules/ai/index.js.map +1 -1
- package/dist/core/modules/ai/inputs/core-ai-settings.input.d.ts +3 -0
- package/dist/core/modules/ai/inputs/core-ai-settings.input.js +31 -0
- package/dist/core/modules/ai/inputs/core-ai-settings.input.js.map +1 -0
- package/dist/core/modules/ai/interfaces/ai-tool.interface.d.ts +2 -0
- package/dist/core/modules/ai/models/core-ai-settings.model.d.ts +4 -0
- package/dist/core/modules/ai/models/core-ai-settings.model.js +30 -0
- package/dist/core/modules/ai/models/core-ai-settings.model.js.map +1 -0
- package/dist/core/modules/ai/models/core-ai-status.model.d.ts +3 -0
- package/dist/core/modules/ai/models/core-ai-status.model.js +25 -0
- package/dist/core/modules/ai/models/core-ai-status.model.js.map +1 -0
- package/dist/core/modules/ai/models/core-ai-user-setting.model.d.ts +8 -0
- package/dist/core/modules/ai/models/core-ai-user-setting.model.js +45 -0
- package/dist/core/modules/ai/models/core-ai-user-setting.model.js.map +1 -0
- package/dist/core/modules/ai/services/core-ai-conversation.service.d.ts +4 -1
- package/dist/core/modules/ai/services/core-ai-conversation.service.js +16 -4
- package/dist/core/modules/ai/services/core-ai-conversation.service.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-mcp-oauth.service.js +6 -6
- package/dist/core/modules/ai/services/core-ai-mcp-oauth.service.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-mcp.service.d.ts +27 -2
- package/dist/core/modules/ai/services/core-ai-mcp.service.js +118 -11
- package/dist/core/modules/ai/services/core-ai-mcp.service.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-prompt-builder.service.js +9 -6
- package/dist/core/modules/ai/services/core-ai-prompt-builder.service.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-user-setting.service.d.ts +17 -0
- package/dist/core/modules/ai/services/core-ai-user-setting.service.js +72 -0
- package/dist/core/modules/ai/services/core-ai-user-setting.service.js.map +1 -0
- package/dist/core/modules/ai/services/core-ai.service.d.ts +8 -3
- package/dist/core/modules/ai/services/core-ai.service.js +68 -29
- package/dist/core/modules/ai/services/core-ai.service.js.map +1 -1
- package/dist/core/modules/better-auth/better-auth.config.js +10 -4
- package/dist/core/modules/better-auth/better-auth.config.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-email-verification.service.js +2 -2
- package/dist/core/modules/better-auth/core-better-auth-email-verification.service.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-path-guard.middleware.d.ts +8 -0
- package/dist/core/modules/better-auth/core-better-auth-path-guard.middleware.js +64 -0
- package/dist/core/modules/better-auth/core-better-auth-path-guard.middleware.js.map +1 -0
- package/dist/core/modules/better-auth/core-better-auth-rate-limit.middleware.js +2 -1
- package/dist/core/modules/better-auth/core-better-auth-rate-limit.middleware.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-rate-limiter.service.d.ts +1 -1
- package/dist/core/modules/better-auth/core-better-auth-rate-limiter.service.js +5 -3
- package/dist/core/modules/better-auth/core-better-auth-rate-limiter.service.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth.module.js +2 -0
- package/dist/core/modules/better-auth/core-better-auth.module.js.map +1 -1
- package/dist/core/modules/better-auth/index.d.ts +1 -0
- package/dist/core/modules/better-auth/index.js +1 -0
- package/dist/core/modules/better-auth/index.js.map +1 -1
- package/dist/core/modules/error-code/error-codes.d.ts +18 -0
- package/dist/core/modules/error-code/error-codes.js +16 -0
- package/dist/core/modules/error-code/error-codes.js.map +1 -1
- package/dist/core/modules/sync/core-sync.service.d.ts +1 -0
- package/dist/core/modules/sync/core-sync.service.js +31 -2
- package/dist/core/modules/sync/core-sync.service.js.map +1 -1
- package/dist/core/modules/tenant/core-tenant.guard.js +10 -0
- package/dist/core/modules/tenant/core-tenant.guard.js.map +1 -1
- package/dist/core/modules/tenant/core-tenant.service.d.ts +21 -1
- package/dist/core/modules/tenant/core-tenant.service.js +153 -1
- package/dist/core/modules/tenant/core-tenant.service.js.map +1 -1
- package/dist/server/modules/error-code/error-codes.d.ts +2 -0
- package/dist/test/test.helper.d.ts +1 -0
- package/dist/test/test.helper.js +9 -2
- package/dist/test/test.helper.js.map +1 -1
- package/docs/REQUEST-LIFECYCLE.md +5 -4
- package/docs/error-codes.md +14 -0
- package/docs/offline-sync-protocol.md +17 -8
- package/migration-guides/12.0.x-to-12.1.x.md +0 -1
- package/migration-guides/12.2.x-to-12.3.x.md +440 -0
- package/migration-guides/12.3.0-to-12.3.1.md +136 -0
- package/package.json +26 -26
- package/src/config.env.ts +6 -2
- package/src/core/common/helpers/graphql-ws-connection.helper.ts +32 -4
- package/src/core/common/interceptors/check-security.interceptor.ts +26 -2
- package/src/core/common/interfaces/server-options.interface.ts +84 -8
- package/src/core/common/persistence/sync-model.ts +1 -1
- package/src/core/modules/ai/INTEGRATION-CHECKLIST.md +36 -15
- package/src/core/modules/ai/README.md +178 -25
- package/src/core/modules/ai/core-ai-mcp.controller.ts +48 -1
- package/src/core/modules/ai/core-ai.constants.ts +10 -0
- package/src/core/modules/ai/core-ai.controller.ts +55 -1
- package/src/core/modules/ai/core-ai.module.ts +14 -0
- package/src/core/modules/ai/core-ai.resolver.ts +36 -0
- package/src/core/modules/ai/helpers/ai-mcp-oauth-consent.helper.ts +35 -4
- package/src/core/modules/ai/helpers/ai-mcp-oauth.helper.ts +68 -1
- package/src/core/modules/ai/helpers/ai-tool-authorization.helper.ts +99 -0
- package/src/core/modules/ai/index.ts +19 -0
- package/src/core/modules/ai/inputs/core-ai-settings.input.ts +24 -0
- package/src/core/modules/ai/interfaces/ai-hook.interface.ts +1 -1
- package/src/core/modules/ai/interfaces/ai-tool.interface.ts +38 -26
- package/src/core/modules/ai/models/core-ai-mode.model.ts +1 -1
- package/src/core/modules/ai/models/core-ai-settings.model.ts +23 -0
- package/src/core/modules/ai/models/core-ai-status.model.ts +16 -0
- package/src/core/modules/ai/models/core-ai-tool-policy.model.ts +1 -1
- package/src/core/modules/ai/models/core-ai-user-setting.model.ts +46 -0
- package/src/core/modules/ai/services/core-ai-conversation.service.ts +31 -6
- package/src/core/modules/ai/services/core-ai-mcp-oauth.service.ts +12 -9
- package/src/core/modules/ai/services/core-ai-mcp.service.ts +206 -13
- package/src/core/modules/ai/services/core-ai-prompt-builder.service.ts +13 -6
- package/src/core/modules/ai/services/core-ai-user-setting.service.ts +85 -0
- package/src/core/modules/ai/services/core-ai.service.ts +134 -35
- package/src/core/modules/api-token/README.md +4 -2
- package/src/core/modules/better-auth/CUSTOMIZATION.md +1 -1
- package/src/core/modules/better-auth/INTEGRATION-CHECKLIST.md +12 -2
- package/src/core/modules/better-auth/README.md +32 -1
- package/src/core/modules/better-auth/better-auth.config.ts +21 -5
- package/src/core/modules/better-auth/core-better-auth-email-verification.service.ts +5 -2
- package/src/core/modules/better-auth/core-better-auth-path-guard.middleware.ts +85 -0
- package/src/core/modules/better-auth/core-better-auth-rate-limit.middleware.ts +5 -2
- package/src/core/modules/better-auth/core-better-auth-rate-limiter.service.ts +14 -7
- package/src/core/modules/better-auth/core-better-auth.module.ts +12 -2
- package/src/core/modules/better-auth/index.ts +1 -0
- package/src/core/modules/error-code/error-codes.ts +18 -0
- package/src/core/modules/sync/README.md +11 -1
- package/src/core/modules/sync/core-sync.service.ts +48 -3
- package/src/core/modules/tenant/INTEGRATION-CHECKLIST.md +12 -1
- package/src/core/modules/tenant/README.md +49 -3
- package/src/core/modules/tenant/core-tenant.guard.ts +18 -2
- package/src/core/modules/tenant/core-tenant.service.ts +287 -2
- 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
|
-
|
|
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
|
-
.
|
|
22
|
-
|
|
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
|
|
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(
|
|
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
|
|
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
|
-
|
|
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":"
|
|
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
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
:
|
|
110
|
-
.map((t) => `- ${t.name}: ${t.description}\n
|
|
111
|
-
|
|
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":"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"}
|
|
@@ -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
|
|
126
|
-
protected
|
|
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
|
-
|
|
381
|
-
await this.conversationService.appendMessage(input.conversationId, { content:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
639
|
-
await this.conversationService.appendMessage(input.conversationId, { content:
|
|
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 ?? {},
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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) {
|