@codebolt/agent 6.0.0 → 6.1.2
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/README.md +118 -153
- package/dist/index.d.ts +2 -0
- package/dist/index.js +41 -0
- package/dist/processor-pieces/messageModifiers/chatHistoryMessageModifier.js +2 -4
- package/dist/processor-pieces/messageModifiers/contextAssemblyModifier.d.ts +81 -0
- package/dist/processor-pieces/messageModifiers/contextAssemblyModifier.js +316 -0
- package/dist/processor-pieces/messageModifiers/coreSystemPromptModifier.js +2 -19
- package/dist/processor-pieces/messageModifiers/directoryContextModifier.js +2 -6
- package/dist/processor-pieces/messageModifiers/environmentContextModifier.js +2 -7
- package/dist/processor-pieces/messageModifiers/ideContextModifier.js +2 -21
- package/dist/processor-pieces/messageModifiers/index.d.ts +3 -0
- package/dist/processor-pieces/messageModifiers/index.js +7 -1
- package/dist/processor-pieces/messageModifiers/toolInjectionModifier.js +2 -1
- package/dist/processor-pieces/postToolCallProcessors/conversationCompactorModifier.d.ts +34 -5
- package/dist/processor-pieces/postToolCallProcessors/conversationCompactorModifier.js +374 -89
- package/dist/processor-pieces/preInferenceProcessors/chatCompressionModifier.d.ts +3 -0
- package/dist/processor-pieces/preInferenceProcessors/chatCompressionModifier.js +50 -27
- package/dist/unified/agent/agent.d.ts +10 -0
- package/dist/unified/agent/agent.js +198 -10
- package/dist/unified/agent/codeboltAgent.d.ts +19 -100
- package/dist/unified/agent/codeboltAgent.js +209 -109
- package/dist/unified/base/agentStep.js +17 -17
- package/dist/unified/base/initialPromptGenerator.js +13 -31
- package/dist/unified/base/promptContext.d.ts +13 -0
- package/dist/unified/base/promptContext.js +213 -0
- package/dist/unified/base/responseExecutor.d.ts +7 -19
- package/dist/unified/base/responseExecutor.js +280 -259
- package/dist/unified/index.d.ts +9 -0
- package/dist/unified/index.js +20 -13
- package/dist/unified/services/CompressionCoordinator.d.ts +67 -0
- package/dist/unified/services/CompressionCoordinator.js +214 -0
- package/dist/unified/services/compaction/autoCompact.d.ts +52 -0
- package/dist/unified/services/compaction/autoCompact.js +294 -0
- package/dist/unified/services/compaction/compactionOrchestrator.d.ts +78 -0
- package/dist/unified/services/compaction/compactionOrchestrator.js +230 -0
- package/dist/unified/services/compaction/contextCollapse.d.ts +63 -0
- package/dist/unified/services/compaction/contextCollapse.js +291 -0
- package/dist/unified/services/compaction/microCompact.d.ts +34 -0
- package/dist/unified/services/compaction/microCompact.js +195 -0
- package/dist/unified/services/compaction/postCompactCleanup.d.ts +15 -0
- package/dist/unified/services/compaction/postCompactCleanup.js +37 -0
- package/dist/unified/services/compaction/reactiveCompact.d.ts +65 -0
- package/dist/unified/services/compaction/reactiveCompact.js +301 -0
- package/dist/unified/services/compaction/snipCompact.d.ts +31 -0
- package/dist/unified/services/compaction/snipCompact.js +124 -0
- package/dist/unified/services/compaction/types.d.ts +66 -0
- package/dist/unified/services/compaction/types.js +39 -0
- package/package.json +25 -29
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.MemoryTypeContextModifier = exports.RuleBasedContextModifier = exports.ContextAssemblyModifier = void 0;
|
|
7
|
+
const base_1 = require("../base");
|
|
8
|
+
const codeboltjs_1 = __importDefault(require("@codebolt/codeboltjs"));
|
|
9
|
+
const promptContext_1 = require("../../unified/base/promptContext");
|
|
10
|
+
class ContextAssemblyModifier extends base_1.BaseMessageModifier {
|
|
11
|
+
constructor(options = {}) {
|
|
12
|
+
super();
|
|
13
|
+
this.options = {
|
|
14
|
+
scopeVariables: options.scopeVariables || {},
|
|
15
|
+
additionalVariables: options.additionalVariables,
|
|
16
|
+
explicitMemory: options.explicitMemory,
|
|
17
|
+
ruleEngineIds: options.ruleEngineIds,
|
|
18
|
+
constraints: options.constraints,
|
|
19
|
+
includeUserInput: options.includeUserInput !== false,
|
|
20
|
+
messageRole: options.messageRole || 'system',
|
|
21
|
+
validateBeforeAssembly: options.validateBeforeAssembly || false,
|
|
22
|
+
formatContribution: options.formatContribution,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
async modify(_originalRequest, createdMessage) {
|
|
26
|
+
var _a, _b, _c, _d;
|
|
27
|
+
try {
|
|
28
|
+
const request = this.buildRequest(createdMessage);
|
|
29
|
+
// Optionally validate first
|
|
30
|
+
if (this.options.validateBeforeAssembly) {
|
|
31
|
+
const validation = await codeboltjs_1.default.contextAssembly.validate(request);
|
|
32
|
+
if (!validation.success || (((_a = validation.data) === null || _a === void 0 ? void 0 : _a.validation) && !validation.data.validation.valid)) {
|
|
33
|
+
console.warn('Context assembly validation failed:', (_c = (_b = validation.data) === null || _b === void 0 ? void 0 : _b.validation) === null || _c === void 0 ? void 0 : _c.errors);
|
|
34
|
+
return createdMessage;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const response = await codeboltjs_1.default.contextAssembly.getContext(request);
|
|
38
|
+
if (!response.success || !((_d = response.data) === null || _d === void 0 ? void 0 : _d.context)) {
|
|
39
|
+
console.warn('Context assembly failed:', response.error || response.message);
|
|
40
|
+
return createdMessage;
|
|
41
|
+
}
|
|
42
|
+
const { context } = response.data;
|
|
43
|
+
const contextContent = this.formatContext(context.contributions);
|
|
44
|
+
if (!contextContent.trim()) {
|
|
45
|
+
return createdMessage;
|
|
46
|
+
}
|
|
47
|
+
const contextMessage = {
|
|
48
|
+
role: this.options.messageRole,
|
|
49
|
+
content: contextContent,
|
|
50
|
+
};
|
|
51
|
+
const updatedMessage = this.options.messageRole === 'user'
|
|
52
|
+
? (0, promptContext_1.appendUserContextMessage)(createdMessage, contextMessage)
|
|
53
|
+
: (0, promptContext_1.appendSystemContextMessage)(createdMessage, contextMessage);
|
|
54
|
+
return {
|
|
55
|
+
...updatedMessage,
|
|
56
|
+
metadata: {
|
|
57
|
+
...createdMessage.metadata,
|
|
58
|
+
contextAssemblyAdded: true,
|
|
59
|
+
contextAssemblyStats: {
|
|
60
|
+
totalTokens: context.total_tokens,
|
|
61
|
+
assemblyTimeMs: context.assembly_time_ms,
|
|
62
|
+
contributionCount: context.contributions.length,
|
|
63
|
+
appliedRules: context.applied_rules,
|
|
64
|
+
warnings: context.warnings,
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
console.error('Error in ContextAssemblyModifier:', error);
|
|
71
|
+
return createdMessage;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
buildRequest(createdMessage) {
|
|
75
|
+
const request = {
|
|
76
|
+
scope_variables: { ...this.options.scopeVariables },
|
|
77
|
+
};
|
|
78
|
+
if (this.options.includeUserInput) {
|
|
79
|
+
const userMessage = createdMessage.message.messages.find(msg => msg.role === 'user');
|
|
80
|
+
if (userMessage && typeof userMessage.content === 'string') {
|
|
81
|
+
request.input = userMessage.content;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (this.options.additionalVariables) {
|
|
85
|
+
request.additional_variables = this.options.additionalVariables;
|
|
86
|
+
}
|
|
87
|
+
if (this.options.explicitMemory) {
|
|
88
|
+
request.explicit_memory = this.options.explicitMemory;
|
|
89
|
+
}
|
|
90
|
+
if (this.options.constraints) {
|
|
91
|
+
request.constraints = this.options.constraints;
|
|
92
|
+
}
|
|
93
|
+
if (this.options.ruleEngineIds) {
|
|
94
|
+
request.rule_engine_ids = this.options.ruleEngineIds;
|
|
95
|
+
}
|
|
96
|
+
return request;
|
|
97
|
+
}
|
|
98
|
+
formatContext(contributions) {
|
|
99
|
+
if (contributions.length === 0)
|
|
100
|
+
return '';
|
|
101
|
+
const formatter = this.options.formatContribution || this.defaultFormatContribution;
|
|
102
|
+
const parts = contributions.map(formatter);
|
|
103
|
+
return `## Assembled Context\n\n${parts.join('\n\n')}`;
|
|
104
|
+
}
|
|
105
|
+
defaultFormatContribution(contribution) {
|
|
106
|
+
return `### ${contribution.memory_label}\n${contribution.content}`;
|
|
107
|
+
}
|
|
108
|
+
/** Update scope variables at runtime */
|
|
109
|
+
setScopeVariables(variables) {
|
|
110
|
+
this.options.scopeVariables = { ...this.options.scopeVariables, ...variables };
|
|
111
|
+
}
|
|
112
|
+
/** Update additional variables at runtime */
|
|
113
|
+
setAdditionalVariables(variables) {
|
|
114
|
+
this.options.additionalVariables = { ...this.options.additionalVariables, ...variables };
|
|
115
|
+
}
|
|
116
|
+
/** Set explicit memory IDs to include */
|
|
117
|
+
setExplicitMemory(memoryIds) {
|
|
118
|
+
this.options.explicitMemory = memoryIds;
|
|
119
|
+
}
|
|
120
|
+
/** Set constraints for context assembly */
|
|
121
|
+
setConstraints(constraints) {
|
|
122
|
+
this.options.constraints = constraints;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
exports.ContextAssemblyModifier = ContextAssemblyModifier;
|
|
126
|
+
class RuleBasedContextModifier extends base_1.BaseMessageModifier {
|
|
127
|
+
constructor(options = {}) {
|
|
128
|
+
super();
|
|
129
|
+
this.options = {
|
|
130
|
+
scopeVariables: options.scopeVariables || {},
|
|
131
|
+
ruleEngineIds: options.ruleEngineIds,
|
|
132
|
+
messageRole: options.messageRole || 'system',
|
|
133
|
+
constraints: options.constraints,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
async modify(_originalRequest, createdMessage) {
|
|
137
|
+
var _a;
|
|
138
|
+
try {
|
|
139
|
+
// First evaluate rules to determine which memories to include
|
|
140
|
+
const userMessage = createdMessage.message.messages.find(msg => msg.role === 'user');
|
|
141
|
+
const input = userMessage && typeof userMessage.content === 'string' ? userMessage.content : undefined;
|
|
142
|
+
const request = {
|
|
143
|
+
scope_variables: { ...this.options.scopeVariables },
|
|
144
|
+
};
|
|
145
|
+
if (input) {
|
|
146
|
+
request.input = input;
|
|
147
|
+
}
|
|
148
|
+
const ruleResult = await codeboltjs_1.default.contextAssembly.evaluateRules(request, this.options.ruleEngineIds);
|
|
149
|
+
if (!ruleResult.success || !ruleResult.data) {
|
|
150
|
+
console.warn('Rule evaluation failed:', ruleResult.error || ruleResult.message);
|
|
151
|
+
return createdMessage;
|
|
152
|
+
}
|
|
153
|
+
const { included_memories, forced_memories } = ruleResult.data;
|
|
154
|
+
const memoriesToFetch = [...new Set([...included_memories, ...forced_memories])];
|
|
155
|
+
if (memoriesToFetch.length === 0) {
|
|
156
|
+
return createdMessage;
|
|
157
|
+
}
|
|
158
|
+
// Now assemble context with only the rule-determined memories
|
|
159
|
+
const assemblyRequest = {
|
|
160
|
+
scope_variables: { ...this.options.scopeVariables },
|
|
161
|
+
explicit_memory: memoriesToFetch,
|
|
162
|
+
};
|
|
163
|
+
if (input) {
|
|
164
|
+
assemblyRequest.input = input;
|
|
165
|
+
}
|
|
166
|
+
if (this.options.constraints) {
|
|
167
|
+
assemblyRequest.constraints = this.options.constraints;
|
|
168
|
+
}
|
|
169
|
+
const response = await codeboltjs_1.default.contextAssembly.getContext(assemblyRequest);
|
|
170
|
+
if (!response.success || !((_a = response.data) === null || _a === void 0 ? void 0 : _a.context)) {
|
|
171
|
+
console.warn('Context assembly failed after rule evaluation:', response.error);
|
|
172
|
+
return createdMessage;
|
|
173
|
+
}
|
|
174
|
+
const { context } = response.data;
|
|
175
|
+
const parts = context.contributions.map((c) => `### ${c.memory_label}\n${c.content}`);
|
|
176
|
+
const contextContent = `## Rule-Based Context\n\n${parts.join('\n\n')}`;
|
|
177
|
+
if (!contextContent.trim()) {
|
|
178
|
+
return createdMessage;
|
|
179
|
+
}
|
|
180
|
+
const contextMessage = {
|
|
181
|
+
role: this.options.messageRole,
|
|
182
|
+
content: contextContent,
|
|
183
|
+
};
|
|
184
|
+
const messages = [...createdMessage.message.messages, contextMessage];
|
|
185
|
+
return {
|
|
186
|
+
message: {
|
|
187
|
+
...createdMessage.message,
|
|
188
|
+
messages,
|
|
189
|
+
},
|
|
190
|
+
metadata: {
|
|
191
|
+
...createdMessage.metadata,
|
|
192
|
+
ruleBasedContextAdded: true,
|
|
193
|
+
ruleEvaluation: {
|
|
194
|
+
matchedRules: ruleResult.data.matched_rules,
|
|
195
|
+
includedMemories: included_memories,
|
|
196
|
+
excludedMemories: ruleResult.data.excluded_memories,
|
|
197
|
+
forcedMemories: forced_memories,
|
|
198
|
+
},
|
|
199
|
+
contextAssemblyStats: {
|
|
200
|
+
totalTokens: context.total_tokens,
|
|
201
|
+
assemblyTimeMs: context.assembly_time_ms,
|
|
202
|
+
contributionCount: context.contributions.length,
|
|
203
|
+
},
|
|
204
|
+
},
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
console.error('Error in RuleBasedContextModifier:', error);
|
|
209
|
+
return createdMessage;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/** Update scope variables at runtime */
|
|
213
|
+
setScopeVariables(variables) {
|
|
214
|
+
this.options.scopeVariables = { ...this.options.scopeVariables, ...variables };
|
|
215
|
+
}
|
|
216
|
+
/** Set specific rule engine IDs to evaluate */
|
|
217
|
+
setRuleEngineIds(ruleEngineIds) {
|
|
218
|
+
this.options.ruleEngineIds = ruleEngineIds;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
exports.RuleBasedContextModifier = RuleBasedContextModifier;
|
|
222
|
+
class MemoryTypeContextModifier extends base_1.BaseMessageModifier {
|
|
223
|
+
constructor(options) {
|
|
224
|
+
super();
|
|
225
|
+
this.options = {
|
|
226
|
+
memoryNames: options.memoryNames,
|
|
227
|
+
scopeVariables: options.scopeVariables || {},
|
|
228
|
+
autoResolveVariables: options.autoResolveVariables || false,
|
|
229
|
+
messageRole: options.messageRole || 'system',
|
|
230
|
+
constraints: options.constraints,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
async modify(_originalRequest, createdMessage) {
|
|
234
|
+
var _a;
|
|
235
|
+
try {
|
|
236
|
+
let additionalVariables;
|
|
237
|
+
// Auto-resolve required variables if enabled
|
|
238
|
+
if (this.options.autoResolveVariables) {
|
|
239
|
+
const requiredVarsResponse = await codeboltjs_1.default.contextAssembly.getRequiredVariables(this.options.memoryNames);
|
|
240
|
+
if (requiredVarsResponse.success && requiredVarsResponse.data) {
|
|
241
|
+
additionalVariables = this.resolveVariables(requiredVarsResponse.data, createdMessage);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
const userMessage = createdMessage.message.messages.find(msg => msg.role === 'user');
|
|
245
|
+
const input = userMessage && typeof userMessage.content === 'string' ? userMessage.content : undefined;
|
|
246
|
+
const request = {
|
|
247
|
+
scope_variables: { ...this.options.scopeVariables },
|
|
248
|
+
explicit_memory: this.options.memoryNames,
|
|
249
|
+
};
|
|
250
|
+
if (input) {
|
|
251
|
+
request.input = input;
|
|
252
|
+
}
|
|
253
|
+
if (additionalVariables) {
|
|
254
|
+
request.additional_variables = additionalVariables;
|
|
255
|
+
}
|
|
256
|
+
if (this.options.constraints) {
|
|
257
|
+
request.constraints = this.options.constraints;
|
|
258
|
+
}
|
|
259
|
+
const response = await codeboltjs_1.default.contextAssembly.getContext(request);
|
|
260
|
+
if (!response.success || !((_a = response.data) === null || _a === void 0 ? void 0 : _a.context)) {
|
|
261
|
+
console.warn('Memory type context assembly failed:', response.error || response.message);
|
|
262
|
+
return createdMessage;
|
|
263
|
+
}
|
|
264
|
+
const { context } = response.data;
|
|
265
|
+
const parts = context.contributions.map((c) => `### ${c.memory_label}\n${c.content}`);
|
|
266
|
+
const contextContent = parts.join('\n\n');
|
|
267
|
+
if (!contextContent.trim()) {
|
|
268
|
+
return createdMessage;
|
|
269
|
+
}
|
|
270
|
+
const contextMessage = {
|
|
271
|
+
role: this.options.messageRole,
|
|
272
|
+
content: contextContent,
|
|
273
|
+
};
|
|
274
|
+
const messages = [...createdMessage.message.messages, contextMessage];
|
|
275
|
+
return {
|
|
276
|
+
message: {
|
|
277
|
+
...createdMessage.message,
|
|
278
|
+
messages,
|
|
279
|
+
},
|
|
280
|
+
metadata: {
|
|
281
|
+
...createdMessage.metadata,
|
|
282
|
+
memoryTypeContextAdded: true,
|
|
283
|
+
memoryNames: this.options.memoryNames,
|
|
284
|
+
contextAssemblyStats: {
|
|
285
|
+
totalTokens: context.total_tokens,
|
|
286
|
+
assemblyTimeMs: context.assembly_time_ms,
|
|
287
|
+
contributionCount: context.contributions.length,
|
|
288
|
+
},
|
|
289
|
+
},
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
catch (error) {
|
|
293
|
+
console.error('Error in MemoryTypeContextModifier:', error);
|
|
294
|
+
return createdMessage;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
resolveVariables(requiredVars, createdMessage) {
|
|
298
|
+
const resolved = {};
|
|
299
|
+
for (const [key, _spec] of Object.entries(requiredVars.additional_variables)) {
|
|
300
|
+
// Try to resolve from existing metadata
|
|
301
|
+
if (createdMessage.metadata && key in createdMessage.metadata) {
|
|
302
|
+
resolved[key] = createdMessage.metadata[key];
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
return resolved;
|
|
306
|
+
}
|
|
307
|
+
/** Update memory names to fetch */
|
|
308
|
+
setMemoryNames(memoryNames) {
|
|
309
|
+
this.options.memoryNames = memoryNames;
|
|
310
|
+
}
|
|
311
|
+
/** Update scope variables at runtime */
|
|
312
|
+
setScopeVariables(variables) {
|
|
313
|
+
this.options.scopeVariables = { ...this.options.scopeVariables, ...variables };
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
exports.MemoryTypeContextModifier = MemoryTypeContextModifier;
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CoreSystemPromptModifier = void 0;
|
|
4
4
|
const base_1 = require("../base");
|
|
5
|
+
const promptContext_1 = require("../../unified/base/promptContext");
|
|
5
6
|
class CoreSystemPromptModifier extends base_1.BaseMessageModifier {
|
|
6
7
|
constructor(options = {}) {
|
|
7
8
|
super();
|
|
@@ -12,26 +13,8 @@ class CoreSystemPromptModifier extends base_1.BaseMessageModifier {
|
|
|
12
13
|
// Get user memory from metadata or options
|
|
13
14
|
const userMemory = ((_a = createdMessage.metadata) === null || _a === void 0 ? void 0 : _a['userMemory']) || this.options.userMemory;
|
|
14
15
|
const systemPrompt = this.options.customSystemPrompt || this.getCoreSystemPrompt(userMemory);
|
|
15
|
-
const systemMessage = {
|
|
16
|
-
role: 'system',
|
|
17
|
-
content: systemPrompt
|
|
18
|
-
};
|
|
19
|
-
// Find existing system message or add new one
|
|
20
|
-
const messages = [...createdMessage.message.messages];
|
|
21
|
-
const systemMessageIndex = messages.findIndex(msg => msg.role === 'system');
|
|
22
|
-
if (systemMessageIndex !== -1) {
|
|
23
|
-
// Replace existing system message
|
|
24
|
-
messages[systemMessageIndex] = systemMessage;
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
// Add new system message at the beginning
|
|
28
|
-
messages.unshift(systemMessage);
|
|
29
|
-
}
|
|
30
16
|
return Promise.resolve({
|
|
31
|
-
|
|
32
|
-
...createdMessage.message,
|
|
33
|
-
messages
|
|
34
|
-
},
|
|
17
|
+
...(0, promptContext_1.setSystemPrompt)(createdMessage, systemPrompt),
|
|
35
18
|
metadata: {
|
|
36
19
|
...createdMessage.metadata,
|
|
37
20
|
coreSystemPromptAdded: true,
|
|
@@ -41,6 +41,7 @@ const base_1 = require("../base");
|
|
|
41
41
|
const fs = __importStar(require("node:fs/promises"));
|
|
42
42
|
const path = __importStar(require("node:path"));
|
|
43
43
|
const codeboltjs_1 = __importDefault(require("@codebolt/codeboltjs"));
|
|
44
|
+
const promptContext_1 = require("../../unified/base/promptContext");
|
|
44
45
|
const MAX_ITEMS = 200;
|
|
45
46
|
const TRUNCATION_INDICATOR = '...';
|
|
46
47
|
const DEFAULT_IGNORED_FOLDERS = new Set(['node_modules', '.git', 'dist', 'build', '.next', '.cache', '.tmp', 'tmp']);
|
|
@@ -100,13 +101,8 @@ ${folderStructure}`;
|
|
|
100
101
|
role: 'user', // Note: gemini-cli adds this as user message, not system
|
|
101
102
|
content: directoryContext
|
|
102
103
|
};
|
|
103
|
-
// Add as user message (like gemini-cli does)
|
|
104
|
-
const messages = [...createdMessage.message.messages, contextMessage];
|
|
105
104
|
return Promise.resolve({
|
|
106
|
-
|
|
107
|
-
...createdMessage.message,
|
|
108
|
-
messages
|
|
109
|
-
},
|
|
105
|
+
...(0, promptContext_1.appendUserContextMessage)(createdMessage, contextMessage),
|
|
110
106
|
metadata: {
|
|
111
107
|
...createdMessage.metadata,
|
|
112
108
|
directoryContextAdded: true,
|
|
@@ -41,6 +41,7 @@ const base_1 = require("../base");
|
|
|
41
41
|
const path = __importStar(require("path"));
|
|
42
42
|
const fs = __importStar(require("fs"));
|
|
43
43
|
const codeboltjs_1 = __importDefault(require("@codebolt/codeboltjs"));
|
|
44
|
+
const promptContext_1 = require("../../unified/base/promptContext");
|
|
44
45
|
class EnvironmentContextModifier extends base_1.BaseMessageModifier {
|
|
45
46
|
constructor(options = {}) {
|
|
46
47
|
super();
|
|
@@ -119,14 +120,8 @@ ${directoryListing}
|
|
|
119
120
|
role: 'user',
|
|
120
121
|
content: finalContent
|
|
121
122
|
};
|
|
122
|
-
// Push the context message to the messages array
|
|
123
|
-
const messages = [...createdMessage.message.messages];
|
|
124
|
-
messages.push(contextMessage);
|
|
125
123
|
return Promise.resolve({
|
|
126
|
-
|
|
127
|
-
...createdMessage.message,
|
|
128
|
-
messages
|
|
129
|
-
},
|
|
124
|
+
...(0, promptContext_1.appendUserContextMessage)(createdMessage, contextMessage),
|
|
130
125
|
metadata: {
|
|
131
126
|
...createdMessage.metadata,
|
|
132
127
|
environmentContextAdded: true,
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.IdeContextModifier = void 0;
|
|
4
4
|
const base_1 = require("../base");
|
|
5
|
+
const promptContext_1 = require("../../unified/base/promptContext");
|
|
5
6
|
class IdeContextModifier extends base_1.BaseMessageModifier {
|
|
6
7
|
constructor(options = {}) {
|
|
7
8
|
super();
|
|
@@ -29,32 +30,12 @@ class IdeContextModifier extends base_1.BaseMessageModifier {
|
|
|
29
30
|
role: 'system',
|
|
30
31
|
content: contextParts.join('\n')
|
|
31
32
|
};
|
|
32
|
-
// Find existing system message or add new one
|
|
33
|
-
const messages = [...createdMessage.message.messages];
|
|
34
|
-
const systemMessageIndex = messages.findIndex(msg => msg.role === 'system');
|
|
35
|
-
if (systemMessageIndex !== -1) {
|
|
36
|
-
// Append to existing system message
|
|
37
|
-
const existingMessage = messages[systemMessageIndex];
|
|
38
|
-
if (existingMessage) {
|
|
39
|
-
messages[systemMessageIndex] = {
|
|
40
|
-
role: existingMessage.role,
|
|
41
|
-
content: `${existingMessage.content}\n\n${ideContextMessage.content}`
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
// Add new system message
|
|
47
|
-
messages.unshift(ideContextMessage);
|
|
48
|
-
}
|
|
49
33
|
if (newIdeContext) {
|
|
50
34
|
this.lastSentIdeContext = newIdeContext;
|
|
51
35
|
}
|
|
52
36
|
this.forceFullContext = false;
|
|
53
37
|
return Promise.resolve({
|
|
54
|
-
|
|
55
|
-
...createdMessage.message,
|
|
56
|
-
messages
|
|
57
|
-
},
|
|
38
|
+
...(0, promptContext_1.appendSystemContextMessage)(createdMessage, ideContextMessage),
|
|
58
39
|
metadata: {
|
|
59
40
|
...createdMessage.metadata,
|
|
60
41
|
ideContextAdded: true,
|
|
@@ -9,3 +9,6 @@ export { LoopDetectionModifier, type LoopDetectionOptions } from '../postInferen
|
|
|
9
9
|
export { ToolInjectionModifier, type ToolInjectionOptions } from './toolInjectionModifier';
|
|
10
10
|
export { ChatRecordingModifier, type ChatRecordingOptions } from './chatRecordingModifier';
|
|
11
11
|
export { ChatHistoryMessageModifier, type ChatHistoryMessageModifierOptions } from './chatHistoryMessageModifier';
|
|
12
|
+
export { ContextAssemblyModifier, type ContextAssemblyModifierOptions } from './contextAssemblyModifier';
|
|
13
|
+
export { RuleBasedContextModifier, type RuleBasedContextModifierOptions } from './contextAssemblyModifier';
|
|
14
|
+
export { MemoryTypeContextModifier, type MemoryTypeContextModifierOptions } from './contextAssemblyModifier';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ChatHistoryMessageModifier = exports.ChatRecordingModifier = exports.ToolInjectionModifier = exports.LoopDetectionModifier = exports.MemoryImportModifier = exports.ArgumentProcessorModifier = exports.AtFileProcessorModifier = exports.IdeContextModifier = exports.DirectoryContextModifier = exports.CoreSystemPromptModifier = exports.EnvironmentContextModifier = void 0;
|
|
3
|
+
exports.MemoryTypeContextModifier = exports.RuleBasedContextModifier = exports.ContextAssemblyModifier = exports.ChatHistoryMessageModifier = exports.ChatRecordingModifier = exports.ToolInjectionModifier = exports.LoopDetectionModifier = exports.MemoryImportModifier = exports.ArgumentProcessorModifier = exports.AtFileProcessorModifier = exports.IdeContextModifier = exports.DirectoryContextModifier = exports.CoreSystemPromptModifier = exports.EnvironmentContextModifier = void 0;
|
|
4
4
|
// Gemini-CLI equivalent modifiers
|
|
5
5
|
var environmentContextModifier_1 = require("./environmentContextModifier");
|
|
6
6
|
Object.defineProperty(exports, "EnvironmentContextModifier", { enumerable: true, get: function () { return environmentContextModifier_1.EnvironmentContextModifier; } });
|
|
@@ -24,3 +24,9 @@ var chatRecordingModifier_1 = require("./chatRecordingModifier");
|
|
|
24
24
|
Object.defineProperty(exports, "ChatRecordingModifier", { enumerable: true, get: function () { return chatRecordingModifier_1.ChatRecordingModifier; } });
|
|
25
25
|
var chatHistoryMessageModifier_1 = require("./chatHistoryMessageModifier");
|
|
26
26
|
Object.defineProperty(exports, "ChatHistoryMessageModifier", { enumerable: true, get: function () { return chatHistoryMessageModifier_1.ChatHistoryMessageModifier; } });
|
|
27
|
+
var contextAssemblyModifier_1 = require("./contextAssemblyModifier");
|
|
28
|
+
Object.defineProperty(exports, "ContextAssemblyModifier", { enumerable: true, get: function () { return contextAssemblyModifier_1.ContextAssemblyModifier; } });
|
|
29
|
+
var contextAssemblyModifier_2 = require("./contextAssemblyModifier");
|
|
30
|
+
Object.defineProperty(exports, "RuleBasedContextModifier", { enumerable: true, get: function () { return contextAssemblyModifier_2.RuleBasedContextModifier; } });
|
|
31
|
+
var contextAssemblyModifier_3 = require("./contextAssemblyModifier");
|
|
32
|
+
Object.defineProperty(exports, "MemoryTypeContextModifier", { enumerable: true, get: function () { return contextAssemblyModifier_3.MemoryTypeContextModifier; } });
|
|
@@ -107,7 +107,8 @@ class ToolInjectionModifier extends base_1.BaseMessageModifier {
|
|
|
107
107
|
...createdMessage.metadata,
|
|
108
108
|
toolsInjected: true,
|
|
109
109
|
toolsLocation: 'Tool',
|
|
110
|
-
toolsCount: tools.length
|
|
110
|
+
toolsCount: tools.length,
|
|
111
|
+
allowedTools: this.options.allowedTools
|
|
111
112
|
}
|
|
112
113
|
};
|
|
113
114
|
}
|
|
@@ -121,20 +121,28 @@ export declare class ConversationCompactorModifier extends BasePostToolCallProce
|
|
|
121
121
|
private readonly options;
|
|
122
122
|
private failedCompressionAttempts;
|
|
123
123
|
private hasFailedCompression;
|
|
124
|
+
private lastCompressionTokenCount;
|
|
125
|
+
private stepsSinceLastCompression;
|
|
124
126
|
constructor(options?: ConversationCompactorOptions);
|
|
127
|
+
/**
|
|
128
|
+
* Calibrated characters-per-token ratio.
|
|
129
|
+
* Starts at 4 (rough default) but gets refined when actual API usage data is available.
|
|
130
|
+
*/
|
|
131
|
+
private charsPerToken;
|
|
125
132
|
/**
|
|
126
133
|
* Estimates token count for a string
|
|
127
|
-
* Uses
|
|
134
|
+
* Uses calibrated chars-per-token ratio (refined by actual API usage when available)
|
|
128
135
|
*/
|
|
129
136
|
private estimateTokens;
|
|
130
137
|
/**
|
|
131
|
-
*
|
|
138
|
+
* Calibrates the chars-per-token ratio using actual API usage data.
|
|
139
|
+
* Called when rawLLMResponseMessage.usage is available to improve estimation accuracy.
|
|
132
140
|
*/
|
|
133
|
-
private
|
|
141
|
+
private calibrateTokenEstimation;
|
|
134
142
|
/**
|
|
135
|
-
*
|
|
143
|
+
* Counts tokens for an array of messages
|
|
136
144
|
*/
|
|
137
|
-
private
|
|
145
|
+
private countMessageTokens;
|
|
138
146
|
/**
|
|
139
147
|
* Extracts text content from a message
|
|
140
148
|
*/
|
|
@@ -143,6 +151,15 @@ export declare class ConversationCompactorModifier extends BasePostToolCallProce
|
|
|
143
151
|
* Checks if a message is a function/tool response
|
|
144
152
|
*/
|
|
145
153
|
private isToolResponseMessage;
|
|
154
|
+
/**
|
|
155
|
+
* Finds the original user request (first non-system, non-tool user message)
|
|
156
|
+
*/
|
|
157
|
+
private getOriginalUserMessage;
|
|
158
|
+
/**
|
|
159
|
+
* Inserts the original user message right after system messages if it's
|
|
160
|
+
* not already present in the preserved messages.
|
|
161
|
+
*/
|
|
162
|
+
private ensureOriginalUserMessage;
|
|
146
163
|
/**
|
|
147
164
|
* Truncates content to a specified number of lines
|
|
148
165
|
* Keeps first half and last half of allowed lines for context
|
|
@@ -180,6 +197,18 @@ export declare class ConversationCompactorModifier extends BasePostToolCallProce
|
|
|
180
197
|
* Optional verification pass - asks LLM to verify and correct the summary
|
|
181
198
|
*/
|
|
182
199
|
private verifySummary;
|
|
200
|
+
/**
|
|
201
|
+
* Extracts file paths from the "Required Files" section of a summary.
|
|
202
|
+
* Looks for section 9 (REQUIRED FILES) and extracts paths listed there.
|
|
203
|
+
*/
|
|
204
|
+
private extractRequiredFiles;
|
|
205
|
+
/**
|
|
206
|
+
* Deduplicates repeated file reads in conversation history.
|
|
207
|
+
* When the same file is read multiple times, older reads are replaced with
|
|
208
|
+
* a short note, keeping only the latest read for each file path.
|
|
209
|
+
* This reduces token count before full compression kicks in.
|
|
210
|
+
*/
|
|
211
|
+
private deduplicateFileReads;
|
|
183
212
|
/**
|
|
184
213
|
* Simple compression strategy - just removes old messages
|
|
185
214
|
*/
|