@codebolt/agent 2.2.2 → 2.2.5
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/dist/builderpattern/agent.js +2 -2
- package/dist/builderpattern/followupquestionbuilder.js +1 -1
- package/dist/builderpattern/llmoutputhandler.js +7 -7
- package/dist/builderpattern/usermessage.d.ts +6 -1
- package/dist/composablepattern/document.js +2 -35
- package/dist/local-tools/fileTools.d.ts +26 -0
- package/dist/local-tools/fileTools.js +162 -0
- package/dist/processor/types/interfaces.d.ts +44 -21
- package/dist/processor-pieces/additionalModifiers/argumentProcessorModifier.d.ts +13 -0
- package/dist/processor-pieces/additionalModifiers/argumentProcessorModifier.js +68 -0
- package/dist/processor-pieces/additionalModifiers/atFileProcessorModifier.d.ts +15 -0
- package/dist/processor-pieces/additionalModifiers/atFileProcessorModifier.js +212 -0
- package/dist/processor-pieces/additionalModifiers/chatCompressionModifier.d.ts +19 -0
- package/dist/processor-pieces/additionalModifiers/chatCompressionModifier.js +110 -0
- package/dist/processor-pieces/additionalModifiers/chatRecordingModifier.d.ts +23 -0
- package/dist/processor-pieces/additionalModifiers/chatRecordingModifier.js +173 -0
- package/dist/processor-pieces/additionalModifiers/coreSystemPromptModifier.d.ts +14 -0
- package/dist/processor-pieces/additionalModifiers/coreSystemPromptModifier.js +93 -0
- package/dist/processor-pieces/additionalModifiers/directoryContextModifier.d.ts +30 -0
- package/dist/processor-pieces/additionalModifiers/directoryContextModifier.js +330 -0
- package/dist/processor-pieces/additionalModifiers/environmentContextModifier.d.ts +26 -0
- package/dist/processor-pieces/additionalModifiers/environmentContextModifier.js +269 -0
- package/dist/processor-pieces/additionalModifiers/fallbackHandlerModifier.d.ts +38 -0
- package/dist/processor-pieces/additionalModifiers/fallbackHandlerModifier.js +217 -0
- package/dist/processor-pieces/additionalModifiers/ideContextModifier.d.ts +34 -0
- package/dist/processor-pieces/additionalModifiers/ideContextModifier.js +147 -0
- package/dist/processor-pieces/additionalModifiers/index.d.ts +12 -0
- package/dist/processor-pieces/additionalModifiers/index.js +28 -0
- package/dist/processor-pieces/additionalModifiers/loopDetectionModifier.d.ts +29 -0
- package/dist/processor-pieces/additionalModifiers/loopDetectionModifier.js +155 -0
- package/dist/processor-pieces/additionalModifiers/memoryImportModifier.d.ts +15 -0
- package/dist/processor-pieces/additionalModifiers/memoryImportModifier.js +129 -0
- package/dist/processor-pieces/additionalModifiers/shellProcessorModifier.d.ts +25 -0
- package/dist/processor-pieces/additionalModifiers/shellProcessorModifier.js +169 -0
- package/dist/processor-pieces/additionalModifiers/toolInjectionModifier.d.ts +20 -0
- package/dist/processor-pieces/additionalModifiers/toolInjectionModifier.js +152 -0
- package/dist/processor-pieces/messageModifiers/addCurrentDirectoryRootFilesModifier.d.ts +7 -0
- package/dist/processor-pieces/messageModifiers/addCurrentDirectoryRootFilesModifier.js +93 -0
- package/dist/processor-pieces/messageModifiers/addToolsListMessageModifier.d.ts +14 -5
- package/dist/processor-pieces/messageModifiers/addToolsListMessageModifier.js +41 -40
- package/dist/processor-pieces/messageModifiers/advancedSystemInstructionMessageModifier.d.ts +9 -0
- package/dist/processor-pieces/messageModifiers/advancedSystemInstructionMessageModifier.js +77 -0
- package/dist/processor-pieces/messageModifiers/atFileProcessorModifier.js +5 -5
- package/dist/processor-pieces/messageModifiers/baseContextMessageModifier.d.ts +5 -13
- package/dist/processor-pieces/messageModifiers/baseContextMessageModifier.js +50 -58
- package/dist/processor-pieces/messageModifiers/baseSystemInstructionMessageModifier.d.ts +6 -8
- package/dist/processor-pieces/messageModifiers/baseSystemInstructionMessageModifier.js +66 -22
- package/dist/processor-pieces/messageModifiers/chatCompressionModifier.d.ts +19 -0
- package/dist/processor-pieces/messageModifiers/chatCompressionModifier.js +110 -0
- package/dist/processor-pieces/messageModifiers/chatHistoryMessageModifier.example.d.ts +20 -0
- package/dist/processor-pieces/messageModifiers/chatHistoryMessageModifier.example.js +124 -0
- package/dist/processor-pieces/messageModifiers/environmentContext.d.ts +41 -0
- package/dist/processor-pieces/messageModifiers/environmentContext.js +355 -0
- package/dist/processor-pieces/messageModifiers/handleUrlMessageModifier.d.ts +3 -2
- package/dist/processor-pieces/messageModifiers/handleUrlMessageModifier.js +1 -2
- package/dist/processor-pieces/messageModifiers/imageAttachmentMessageModifier.d.ts +3 -2
- package/dist/processor-pieces/messageModifiers/imageAttachmentMessageModifier.js +1 -2
- package/dist/processor-pieces/messageModifiers/mentionedFilesModifier.d.ts +23 -0
- package/dist/processor-pieces/messageModifiers/mentionedFilesModifier.js +207 -0
- package/dist/processor-pieces/messageModifiers/simpleMessageModifier.d.ts +7 -0
- package/dist/processor-pieces/messageModifiers/simpleMessageModifier.js +26 -0
- package/dist/processor-pieces/messageModifiers/workingDirectoryMessageModifier.d.ts +18 -2
- package/dist/processor-pieces/messageModifiers/workingDirectoryMessageModifier.js +291 -93
- package/dist/processor-pieces/postInference/llmOutputValidityProcessor.d.ts +1 -0
- package/dist/processor-pieces/postInference/llmOutputValidityProcessor.js +2 -0
- package/dist/processor-pieces/postInferenceProcessors/checkForNoToolCall.d.ts +7 -0
- package/dist/processor-pieces/postInferenceProcessors/checkForNoToolCall.js +24 -0
- package/dist/processor-pieces/postToolCall/advancedLoopDetectionProcessor.d.ts +41 -0
- package/dist/processor-pieces/postToolCall/advancedLoopDetectionProcessor.js +197 -0
- package/dist/processor-pieces/postToolCall/chatCompressionProcessor.d.ts +26 -0
- package/dist/processor-pieces/postToolCall/chatCompressionProcessor.js +90 -0
- package/dist/processor-pieces/postToolCall/chatRecordingProcessor.d.ts +81 -0
- package/dist/processor-pieces/postToolCall/chatRecordingProcessor.js +329 -0
- package/dist/processor-pieces/postToolCall/contextManagementProcessor.d.ts +40 -0
- package/dist/processor-pieces/postToolCall/contextManagementProcessor.js +272 -0
- package/dist/processor-pieces/postToolCall/conversationCompactorProcessor.d.ts +49 -0
- package/dist/processor-pieces/postToolCall/conversationCompactorProcessor.js +291 -0
- package/dist/processor-pieces/postToolCall/conversationContinuityProcessor.d.ts +49 -0
- package/dist/processor-pieces/postToolCall/conversationContinuityProcessor.js +293 -0
- package/dist/processor-pieces/postToolCall/followUpConversationProcessor.d.ts +47 -0
- package/dist/processor-pieces/postToolCall/followUpConversationProcessor.js +249 -0
- package/dist/processor-pieces/postToolCall/loopDetectionProcessor.d.ts +30 -0
- package/dist/processor-pieces/postToolCall/loopDetectionProcessor.js +137 -0
- package/dist/processor-pieces/postToolCall/responseValidationProcessor.d.ts +30 -0
- package/dist/processor-pieces/postToolCall/responseValidationProcessor.js +228 -0
- package/dist/processor-pieces/postToolCall/telemetryProcessor.d.ts +99 -0
- package/dist/processor-pieces/postToolCall/telemetryProcessor.js +278 -0
- package/dist/processor-pieces/postToolCall/tokenManagementProcessor.d.ts +37 -0
- package/dist/processor-pieces/postToolCall/tokenManagementProcessor.js +178 -0
- package/dist/processor-pieces/postToolCall/toolExecutionProcessor.d.ts +43 -0
- package/dist/processor-pieces/postToolCall/toolExecutionProcessor.js +207 -0
- package/dist/processor-pieces/preInference/conversationCompactorProcessor.d.ts +52 -0
- package/dist/processor-pieces/preInference/conversationCompactorProcessor.js +264 -0
- package/dist/processor-pieces/preInference/conversationContinuityProcessor.d.ts +49 -0
- package/dist/processor-pieces/preInference/conversationContinuityProcessor.js +293 -0
- package/dist/processor-pieces/preInferenceProcessors/conversationCompaction.d.ts +7 -0
- package/dist/processor-pieces/preInferenceProcessors/conversationCompaction.js +31 -0
- package/dist/processor-pieces/preToolCall/index.d.ts +9 -0
- package/dist/processor-pieces/preToolCall/index.js +18 -0
- package/dist/processor-pieces/preToolCall/localToolInterceptorProcessor.d.ts +58 -0
- package/dist/processor-pieces/preToolCall/localToolInterceptorProcessor.js +444 -0
- package/dist/processor-pieces/preToolCall/toolParameterModifierProcessor.d.ts +44 -0
- package/dist/processor-pieces/preToolCall/toolParameterModifierProcessor.js +367 -0
- package/dist/processor-pieces/preToolCall/toolValidationProcessor.d.ts +58 -0
- package/dist/processor-pieces/preToolCall/toolValidationProcessor.js +391 -0
- package/dist/unified/agent/agent.js +2 -2
- package/dist/unified/agent/tool.d.ts +99 -0
- package/dist/unified/agent/tool.js +440 -0
- package/dist/unified/base/initialPromptGenerator.js +5 -5
- package/dist/unified/base/responseExecutor.js +6 -6
- package/dist/unified/examples/agentExample.d.ts +46 -0
- package/dist/unified/examples/agentExample.js +464 -0
- package/dist/unified/examples/documentationPatternExample.d.ts +10 -0
- package/dist/unified/examples/documentationPatternExample.js +385 -0
- package/dist/unified/examples/followUpProcessorsExample.d.ts +45 -0
- package/dist/unified/examples/followUpProcessorsExample.js +311 -0
- package/dist/unified/examples/orchestratorExample.d.ts +16 -0
- package/dist/unified/examples/orchestratorExample.js +415 -0
- package/dist/unified/examples/preToolCallProcessorsExample.d.ts +36 -0
- package/dist/unified/examples/preToolCallProcessorsExample.js +458 -0
- package/dist/unified/examples/workflowExample.d.ts +12 -0
- package/dist/unified/examples/workflowExample.js +497 -0
- package/dist/unified/orchestrator/orchestrator.d.ts +260 -0
- package/dist/unified/orchestrator/orchestrator.js +519 -0
- package/package.json +5 -5
- package/dist/agent.d.ts +0 -86
- package/dist/agent.js +0 -324
- package/dist/followupquestionbuilder.d.ts +0 -75
- package/dist/followupquestionbuilder.js +0 -197
- package/dist/index.d.ts +0 -14
- package/dist/index.js +0 -23
- package/dist/llmoutputhandler.d.ts +0 -102
- package/dist/llmoutputhandler.js +0 -452
- package/dist/promptbuilder.d.ts +0 -382
- package/dist/promptbuilder.js +0 -805
- package/dist/systemprompt.d.ts +0 -20
- package/dist/systemprompt.js +0 -48
- package/dist/taskInstruction.d.ts +0 -37
- package/dist/taskInstruction.js +0 -57
- package/dist/usermessage.d.ts +0 -70
- package/dist/usermessage.js +0 -123
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FallbackHandlerModifier = exports.FallbackStrategy = void 0;
|
|
4
|
+
const base_1 = require("../base");
|
|
5
|
+
var FallbackStrategy;
|
|
6
|
+
(function (FallbackStrategy) {
|
|
7
|
+
FallbackStrategy["RETRY_WITH_SIMPLIFIED_CONTEXT"] = "retry_simplified";
|
|
8
|
+
FallbackStrategy["RETRY_WITHOUT_TOOLS"] = "retry_no_tools";
|
|
9
|
+
FallbackStrategy["RETRY_WITH_SHORTER_HISTORY"] = "retry_short_history";
|
|
10
|
+
FallbackStrategy["USE_FALLBACK_MODEL"] = "fallback_model";
|
|
11
|
+
FallbackStrategy["PROVIDE_ERROR_CONTEXT"] = "error_context";
|
|
12
|
+
})(FallbackStrategy || (exports.FallbackStrategy = FallbackStrategy = {}));
|
|
13
|
+
class FallbackHandlerModifier extends base_1.BaseMessageModifier {
|
|
14
|
+
constructor(options = {}) {
|
|
15
|
+
super();
|
|
16
|
+
this.fallbackContexts = new Map();
|
|
17
|
+
this.options = {
|
|
18
|
+
enableFallback: options.enableFallback !== false,
|
|
19
|
+
maxRetries: options.maxRetries || 3,
|
|
20
|
+
fallbackStrategies: options.fallbackStrategies || [
|
|
21
|
+
FallbackStrategy.RETRY_WITH_SIMPLIFIED_CONTEXT,
|
|
22
|
+
FallbackStrategy.RETRY_WITHOUT_TOOLS,
|
|
23
|
+
FallbackStrategy.RETRY_WITH_SHORTER_HISTORY
|
|
24
|
+
],
|
|
25
|
+
timeoutMs: options.timeoutMs || 30000
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
async modify(originalRequest, createdMessage) {
|
|
29
|
+
try {
|
|
30
|
+
if (!this.options.enableFallback) {
|
|
31
|
+
return createdMessage;
|
|
32
|
+
}
|
|
33
|
+
// Check if this is a retry attempt
|
|
34
|
+
const messageId = this.generateMessageId(originalRequest);
|
|
35
|
+
const fallbackContext = this.fallbackContexts.get(messageId);
|
|
36
|
+
if (fallbackContext && fallbackContext.attemptCount >= this.options.maxRetries) {
|
|
37
|
+
// Max retries reached, add error context and return
|
|
38
|
+
return this.addErrorContextMessage(createdMessage, fallbackContext);
|
|
39
|
+
}
|
|
40
|
+
// Check if we need to apply fallback strategies
|
|
41
|
+
const shouldApplyFallback = this.shouldApplyFallback(createdMessage, fallbackContext);
|
|
42
|
+
if (!shouldApplyFallback) {
|
|
43
|
+
return createdMessage;
|
|
44
|
+
}
|
|
45
|
+
// Apply the next fallback strategy
|
|
46
|
+
const modifiedMessage = await this.applyFallbackStrategy(createdMessage, fallbackContext || this.initializeFallbackContext(originalRequest));
|
|
47
|
+
// Update fallback context
|
|
48
|
+
this.updateFallbackContext(messageId, modifiedMessage);
|
|
49
|
+
return modifiedMessage;
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
console.error('Error in FallbackHandlerModifier:', error);
|
|
53
|
+
return createdMessage;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
generateMessageId(request) {
|
|
57
|
+
// Generate a unique ID for this message request
|
|
58
|
+
const content = request.userMessage || '';
|
|
59
|
+
return Buffer.from(content).toString('base64').substring(0, 16);
|
|
60
|
+
}
|
|
61
|
+
shouldApplyFallback(message, context) {
|
|
62
|
+
var _a, _b, _c;
|
|
63
|
+
// Check metadata for error indicators
|
|
64
|
+
const hasError = !!(((_a = message.metadata) === null || _a === void 0 ? void 0 : _a.hasError) || ((_b = message.metadata) === null || _b === void 0 ? void 0 : _b.lastError));
|
|
65
|
+
const isRetry = !!((_c = message.metadata) === null || _c === void 0 ? void 0 : _c.isRetry) || ((context === null || context === void 0 ? void 0 : context.attemptCount) || 0) > 0;
|
|
66
|
+
return hasError || isRetry;
|
|
67
|
+
}
|
|
68
|
+
initializeFallbackContext(originalRequest) {
|
|
69
|
+
const content = originalRequest.userMessage || '';
|
|
70
|
+
return {
|
|
71
|
+
attemptCount: 0,
|
|
72
|
+
originalMessageLength: content.length,
|
|
73
|
+
fallbacksAttempted: []
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
async applyFallbackStrategy(message, context) {
|
|
77
|
+
const nextStrategy = this.getNextFallbackStrategy(context);
|
|
78
|
+
if (!nextStrategy) {
|
|
79
|
+
return message;
|
|
80
|
+
}
|
|
81
|
+
context.fallbacksAttempted.push(nextStrategy);
|
|
82
|
+
switch (nextStrategy) {
|
|
83
|
+
case FallbackStrategy.RETRY_WITH_SIMPLIFIED_CONTEXT:
|
|
84
|
+
return this.simplifyContext(message);
|
|
85
|
+
case FallbackStrategy.RETRY_WITHOUT_TOOLS:
|
|
86
|
+
return this.removeTools(message);
|
|
87
|
+
case FallbackStrategy.RETRY_WITH_SHORTER_HISTORY:
|
|
88
|
+
return this.shortenHistory(message);
|
|
89
|
+
case FallbackStrategy.USE_FALLBACK_MODEL:
|
|
90
|
+
return this.setFallbackModel(message);
|
|
91
|
+
case FallbackStrategy.PROVIDE_ERROR_CONTEXT:
|
|
92
|
+
return this.addErrorContextMessage(message, context);
|
|
93
|
+
default:
|
|
94
|
+
return message;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
getNextFallbackStrategy(context) {
|
|
98
|
+
const availableStrategies = this.options.fallbackStrategies.filter(strategy => !context.fallbacksAttempted.includes(strategy));
|
|
99
|
+
return availableStrategies.length > 0 ? availableStrategies[0] : null;
|
|
100
|
+
}
|
|
101
|
+
simplifyContext(message) {
|
|
102
|
+
// Remove or simplify complex context messages
|
|
103
|
+
const simplifiedMessages = message.message.messages.map(msg => {
|
|
104
|
+
if (msg.role === 'system' && typeof msg.content === 'string' && msg.content.length > 500) {
|
|
105
|
+
return {
|
|
106
|
+
...msg,
|
|
107
|
+
content: msg.content.substring(0, 500) + '...[context simplified for fallback]'
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
return msg;
|
|
111
|
+
});
|
|
112
|
+
return {
|
|
113
|
+
...message,
|
|
114
|
+
message: {
|
|
115
|
+
...message.message,
|
|
116
|
+
messages: simplifiedMessages
|
|
117
|
+
},
|
|
118
|
+
metadata: {
|
|
119
|
+
...message.metadata,
|
|
120
|
+
fallbackApplied: 'simplified_context',
|
|
121
|
+
isRetry: true
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
removeTools(message) {
|
|
126
|
+
return {
|
|
127
|
+
...message,
|
|
128
|
+
metadata: {
|
|
129
|
+
...message.metadata,
|
|
130
|
+
fallbackApplied: 'no_tools',
|
|
131
|
+
toolsDisabled: true,
|
|
132
|
+
isRetry: true
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
shortenHistory(message) {
|
|
137
|
+
// Keep only the last few messages
|
|
138
|
+
const messages = message.message.messages;
|
|
139
|
+
const systemMessages = messages.filter(msg => msg.role === 'system');
|
|
140
|
+
const otherMessages = messages.filter(msg => msg.role !== 'system');
|
|
141
|
+
const recentMessages = otherMessages.slice(-3); // Keep last 3 non-system messages
|
|
142
|
+
return {
|
|
143
|
+
...message,
|
|
144
|
+
message: {
|
|
145
|
+
...message.message,
|
|
146
|
+
messages: [...systemMessages, ...recentMessages]
|
|
147
|
+
},
|
|
148
|
+
metadata: {
|
|
149
|
+
...message.metadata,
|
|
150
|
+
fallbackApplied: 'shortened_history',
|
|
151
|
+
originalMessageCount: messages.length,
|
|
152
|
+
isRetry: true
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
setFallbackModel(message) {
|
|
157
|
+
return {
|
|
158
|
+
...message,
|
|
159
|
+
metadata: {
|
|
160
|
+
...message.metadata,
|
|
161
|
+
fallbackApplied: 'fallback_model',
|
|
162
|
+
useFallbackModel: true,
|
|
163
|
+
isRetry: true
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
addErrorContextMessage(message, context) {
|
|
168
|
+
const errorMessage = {
|
|
169
|
+
role: 'system',
|
|
170
|
+
content: `Note: This request has been attempted ${context.attemptCount} times with fallback strategies: ${context.fallbacksAttempted.join(', ')}. Please provide a simpler response if the request seems too complex.`
|
|
171
|
+
};
|
|
172
|
+
return {
|
|
173
|
+
...message,
|
|
174
|
+
message: {
|
|
175
|
+
...message.message,
|
|
176
|
+
messages: [errorMessage, ...message.message.messages]
|
|
177
|
+
},
|
|
178
|
+
metadata: {
|
|
179
|
+
...message.metadata,
|
|
180
|
+
fallbackApplied: 'error_context',
|
|
181
|
+
fallbackExhausted: true,
|
|
182
|
+
isRetry: true
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
updateFallbackContext(messageId, message) {
|
|
187
|
+
const existingContext = this.fallbackContexts.get(messageId);
|
|
188
|
+
if (existingContext) {
|
|
189
|
+
existingContext.attemptCount++;
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
this.fallbackContexts.set(messageId, {
|
|
193
|
+
attemptCount: 1,
|
|
194
|
+
originalMessageLength: JSON.stringify(message.message).length,
|
|
195
|
+
fallbacksAttempted: []
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
// Clean up old contexts (prevent memory leaks)
|
|
199
|
+
if (this.fallbackContexts.size > 100) {
|
|
200
|
+
const entries = Array.from(this.fallbackContexts.entries());
|
|
201
|
+
const oldestKey = entries[0][0];
|
|
202
|
+
this.fallbackContexts.delete(oldestKey);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
clearFallbackContext(messageId) {
|
|
206
|
+
this.fallbackContexts.delete(messageId);
|
|
207
|
+
}
|
|
208
|
+
getFallbackStats() {
|
|
209
|
+
const contexts = Array.from(this.fallbackContexts.values());
|
|
210
|
+
const totalAttempts = contexts.reduce((sum, ctx) => sum + ctx.attemptCount, 0);
|
|
211
|
+
return {
|
|
212
|
+
totalContexts: contexts.length,
|
|
213
|
+
averageAttempts: contexts.length > 0 ? totalAttempts / contexts.length : 0
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
exports.FallbackHandlerModifier = FallbackHandlerModifier;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ProcessedMessage } from "@codebolt/types/agent";
|
|
2
|
+
import { BaseMessageModifier } from "../base";
|
|
3
|
+
import { FlatUserMessage } from "@codebolt/types/sdk";
|
|
4
|
+
export interface IdeContextOptions {
|
|
5
|
+
includeOpenFiles?: boolean;
|
|
6
|
+
includeActiveFile?: boolean;
|
|
7
|
+
includeCursorPosition?: boolean;
|
|
8
|
+
includeSelectedText?: boolean;
|
|
9
|
+
maxOpenFiles?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface FileInfo {
|
|
12
|
+
path: string;
|
|
13
|
+
isActive?: boolean;
|
|
14
|
+
cursor?: {
|
|
15
|
+
line: number;
|
|
16
|
+
character: number;
|
|
17
|
+
};
|
|
18
|
+
selectedText?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface IdeContext {
|
|
21
|
+
workspaceState?: {
|
|
22
|
+
openFiles: FileInfo[];
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export declare class IdeContextModifier extends BaseMessageModifier {
|
|
26
|
+
private readonly options;
|
|
27
|
+
private lastSentIdeContext?;
|
|
28
|
+
private forceFullContext;
|
|
29
|
+
constructor(options?: IdeContextOptions);
|
|
30
|
+
modify(originalRequest: FlatUserMessage, createdMessage: ProcessedMessage): Promise<ProcessedMessage>;
|
|
31
|
+
private getIdeContext;
|
|
32
|
+
private getIdeContextParts;
|
|
33
|
+
setForceFullContext(force: boolean): void;
|
|
34
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IdeContextModifier = void 0;
|
|
4
|
+
const base_1 = require("../base");
|
|
5
|
+
class IdeContextModifier extends base_1.BaseMessageModifier {
|
|
6
|
+
constructor(options = {}) {
|
|
7
|
+
super();
|
|
8
|
+
this.forceFullContext = true;
|
|
9
|
+
this.options = {
|
|
10
|
+
includeOpenFiles: options.includeOpenFiles !== false,
|
|
11
|
+
includeActiveFile: options.includeActiveFile !== false,
|
|
12
|
+
includeCursorPosition: options.includeCursorPosition !== false,
|
|
13
|
+
includeSelectedText: options.includeSelectedText !== false,
|
|
14
|
+
maxOpenFiles: options.maxOpenFiles || 10
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
modify(originalRequest, createdMessage) {
|
|
18
|
+
try {
|
|
19
|
+
// In a real implementation, this would get IDE context from a service
|
|
20
|
+
// For now, we'll create a mock context or try to get it from metadata
|
|
21
|
+
const ideContext = this.getIdeContext(createdMessage.metadata);
|
|
22
|
+
if (!ideContext) {
|
|
23
|
+
return Promise.resolve(createdMessage);
|
|
24
|
+
}
|
|
25
|
+
const { contextParts, newIdeContext } = this.getIdeContextParts(this.forceFullContext, ideContext);
|
|
26
|
+
if (contextParts.length === 0) {
|
|
27
|
+
return Promise.resolve(createdMessage);
|
|
28
|
+
}
|
|
29
|
+
const ideContextMessage = {
|
|
30
|
+
role: 'system',
|
|
31
|
+
content: contextParts.join('\n')
|
|
32
|
+
};
|
|
33
|
+
// Find existing system message or add new one
|
|
34
|
+
const messages = [...createdMessage.message.messages];
|
|
35
|
+
const systemMessageIndex = messages.findIndex(msg => msg.role === 'system');
|
|
36
|
+
if (systemMessageIndex !== -1) {
|
|
37
|
+
// Append to existing system message
|
|
38
|
+
messages[systemMessageIndex] = {
|
|
39
|
+
...messages[systemMessageIndex],
|
|
40
|
+
content: `${messages[systemMessageIndex].content}\n\n${ideContextMessage.content}`
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// Add new system message
|
|
45
|
+
messages.unshift(ideContextMessage);
|
|
46
|
+
}
|
|
47
|
+
this.lastSentIdeContext = newIdeContext;
|
|
48
|
+
this.forceFullContext = false;
|
|
49
|
+
return Promise.resolve({
|
|
50
|
+
message: {
|
|
51
|
+
...createdMessage.message,
|
|
52
|
+
messages
|
|
53
|
+
},
|
|
54
|
+
metadata: {
|
|
55
|
+
...createdMessage.metadata,
|
|
56
|
+
ideContextAdded: true,
|
|
57
|
+
ideContextType: this.forceFullContext ? 'full' : 'incremental'
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
console.error('Error in IdeContextModifier:', error);
|
|
63
|
+
return Promise.resolve(createdMessage);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
getIdeContext(metadata) {
|
|
67
|
+
// Try to get IDE context from the metadata parameter
|
|
68
|
+
if (metadata === null || metadata === void 0 ? void 0 : metadata.ideContext) {
|
|
69
|
+
return metadata.ideContext;
|
|
70
|
+
}
|
|
71
|
+
// Mock IDE context for demonstration
|
|
72
|
+
// In a real implementation, this would come from an IDE service
|
|
73
|
+
return {
|
|
74
|
+
workspaceState: {
|
|
75
|
+
openFiles: [
|
|
76
|
+
{
|
|
77
|
+
path: '/current/project/src/main.ts',
|
|
78
|
+
isActive: true,
|
|
79
|
+
cursor: { line: 42, character: 15 },
|
|
80
|
+
selectedText: 'const result = '
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
path: '/current/project/src/utils.ts',
|
|
84
|
+
isActive: false
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
path: '/current/project/README.md',
|
|
88
|
+
isActive: false
|
|
89
|
+
}
|
|
90
|
+
]
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
getIdeContextParts(forceFullContext, currentIdeContext) {
|
|
95
|
+
var _a;
|
|
96
|
+
if (!((_a = currentIdeContext === null || currentIdeContext === void 0 ? void 0 : currentIdeContext.workspaceState) === null || _a === void 0 ? void 0 : _a.openFiles)) {
|
|
97
|
+
return { contextParts: [], newIdeContext: undefined };
|
|
98
|
+
}
|
|
99
|
+
if (forceFullContext || !this.lastSentIdeContext) {
|
|
100
|
+
// Send full context as JSON
|
|
101
|
+
const openFiles = currentIdeContext.workspaceState.openFiles;
|
|
102
|
+
const activeFile = openFiles.find((f) => f.isActive);
|
|
103
|
+
const otherOpenFiles = openFiles
|
|
104
|
+
.filter((f) => !f.isActive)
|
|
105
|
+
.map((f) => f.path)
|
|
106
|
+
.slice(0, this.options.maxOpenFiles - 1); // Reserve space for active file
|
|
107
|
+
const contextData = {};
|
|
108
|
+
if (activeFile && this.options.includeActiveFile) {
|
|
109
|
+
const activeFileData = {
|
|
110
|
+
path: activeFile.path
|
|
111
|
+
};
|
|
112
|
+
if (this.options.includeCursorPosition && activeFile.cursor) {
|
|
113
|
+
activeFileData.cursor = {
|
|
114
|
+
line: activeFile.cursor.line,
|
|
115
|
+
character: activeFile.cursor.character,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
if (this.options.includeSelectedText && activeFile.selectedText) {
|
|
119
|
+
activeFileData.selectedText = activeFile.selectedText;
|
|
120
|
+
}
|
|
121
|
+
contextData['activeFile'] = activeFileData;
|
|
122
|
+
}
|
|
123
|
+
if (this.options.includeOpenFiles && otherOpenFiles.length > 0) {
|
|
124
|
+
contextData['otherOpenFiles'] = otherOpenFiles;
|
|
125
|
+
}
|
|
126
|
+
if (Object.keys(contextData).length === 0) {
|
|
127
|
+
return { contextParts: [], newIdeContext: currentIdeContext };
|
|
128
|
+
}
|
|
129
|
+
const jsonString = JSON.stringify(contextData, null, 2);
|
|
130
|
+
const contextParts = [
|
|
131
|
+
"Here is the user's editor context as a JSON object. This is for your information only.",
|
|
132
|
+
'```json',
|
|
133
|
+
jsonString,
|
|
134
|
+
'```',
|
|
135
|
+
"Don't acknowledge this context in your response unless specifically asked about it."
|
|
136
|
+
];
|
|
137
|
+
return { contextParts, newIdeContext: currentIdeContext };
|
|
138
|
+
}
|
|
139
|
+
// For incremental updates, we would compare with lastSentIdeContext
|
|
140
|
+
// and only send changes. For now, we'll skip incremental updates.
|
|
141
|
+
return { contextParts: [], newIdeContext: currentIdeContext };
|
|
142
|
+
}
|
|
143
|
+
setForceFullContext(force) {
|
|
144
|
+
this.forceFullContext = force;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
exports.IdeContextModifier = IdeContextModifier;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { EnvironmentContextModifier, type EnvironmentContextOptions } from './environmentContextModifier';
|
|
2
|
+
export { CoreSystemPromptModifier, type CoreSystemPromptOptions } from './coreSystemPromptModifier';
|
|
3
|
+
export { DirectoryContextModifier, type DirectoryContextOptions } from './directoryContextModifier';
|
|
4
|
+
export { IdeContextModifier, type IdeContextOptions, type FileInfo, type IdeContext } from './ideContextModifier';
|
|
5
|
+
export { ChatCompressionModifier, type ChatCompressionOptions } from './chatCompressionModifier';
|
|
6
|
+
export { AtFileProcessorModifier, type AtFileProcessorOptions } from './atFileProcessorModifier';
|
|
7
|
+
export { ShellProcessorModifier, type ShellProcessorOptions } from './shellProcessorModifier';
|
|
8
|
+
export { ArgumentProcessorModifier, type ArgumentProcessorOptions } from './argumentProcessorModifier';
|
|
9
|
+
export { MemoryImportModifier, type MemoryImportOptions } from './memoryImportModifier';
|
|
10
|
+
export { LoopDetectionModifier, type LoopDetectionOptions } from './loopDetectionModifier';
|
|
11
|
+
export { ToolInjectionModifier, type ToolInjectionOptions } from './toolInjectionModifier';
|
|
12
|
+
export { ChatRecordingModifier, type ChatRecordingOptions } from './chatRecordingModifier';
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ChatRecordingModifier = exports.ToolInjectionModifier = exports.LoopDetectionModifier = exports.MemoryImportModifier = exports.ArgumentProcessorModifier = exports.ShellProcessorModifier = exports.AtFileProcessorModifier = exports.ChatCompressionModifier = exports.IdeContextModifier = exports.DirectoryContextModifier = exports.CoreSystemPromptModifier = exports.EnvironmentContextModifier = void 0;
|
|
4
|
+
// Gemini-CLI equivalent modifiers
|
|
5
|
+
var environmentContextModifier_1 = require("./environmentContextModifier");
|
|
6
|
+
Object.defineProperty(exports, "EnvironmentContextModifier", { enumerable: true, get: function () { return environmentContextModifier_1.EnvironmentContextModifier; } });
|
|
7
|
+
var coreSystemPromptModifier_1 = require("./coreSystemPromptModifier");
|
|
8
|
+
Object.defineProperty(exports, "CoreSystemPromptModifier", { enumerable: true, get: function () { return coreSystemPromptModifier_1.CoreSystemPromptModifier; } });
|
|
9
|
+
var directoryContextModifier_1 = require("./directoryContextModifier");
|
|
10
|
+
Object.defineProperty(exports, "DirectoryContextModifier", { enumerable: true, get: function () { return directoryContextModifier_1.DirectoryContextModifier; } });
|
|
11
|
+
var ideContextModifier_1 = require("./ideContextModifier");
|
|
12
|
+
Object.defineProperty(exports, "IdeContextModifier", { enumerable: true, get: function () { return ideContextModifier_1.IdeContextModifier; } });
|
|
13
|
+
var chatCompressionModifier_1 = require("./chatCompressionModifier");
|
|
14
|
+
Object.defineProperty(exports, "ChatCompressionModifier", { enumerable: true, get: function () { return chatCompressionModifier_1.ChatCompressionModifier; } });
|
|
15
|
+
var atFileProcessorModifier_1 = require("./atFileProcessorModifier");
|
|
16
|
+
Object.defineProperty(exports, "AtFileProcessorModifier", { enumerable: true, get: function () { return atFileProcessorModifier_1.AtFileProcessorModifier; } });
|
|
17
|
+
var shellProcessorModifier_1 = require("./shellProcessorModifier");
|
|
18
|
+
Object.defineProperty(exports, "ShellProcessorModifier", { enumerable: true, get: function () { return shellProcessorModifier_1.ShellProcessorModifier; } });
|
|
19
|
+
var argumentProcessorModifier_1 = require("./argumentProcessorModifier");
|
|
20
|
+
Object.defineProperty(exports, "ArgumentProcessorModifier", { enumerable: true, get: function () { return argumentProcessorModifier_1.ArgumentProcessorModifier; } });
|
|
21
|
+
var memoryImportModifier_1 = require("./memoryImportModifier");
|
|
22
|
+
Object.defineProperty(exports, "MemoryImportModifier", { enumerable: true, get: function () { return memoryImportModifier_1.MemoryImportModifier; } });
|
|
23
|
+
var loopDetectionModifier_1 = require("./loopDetectionModifier");
|
|
24
|
+
Object.defineProperty(exports, "LoopDetectionModifier", { enumerable: true, get: function () { return loopDetectionModifier_1.LoopDetectionModifier; } });
|
|
25
|
+
var toolInjectionModifier_1 = require("./toolInjectionModifier");
|
|
26
|
+
Object.defineProperty(exports, "ToolInjectionModifier", { enumerable: true, get: function () { return toolInjectionModifier_1.ToolInjectionModifier; } });
|
|
27
|
+
var chatRecordingModifier_1 = require("./chatRecordingModifier");
|
|
28
|
+
Object.defineProperty(exports, "ChatRecordingModifier", { enumerable: true, get: function () { return chatRecordingModifier_1.ChatRecordingModifier; } });
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ProcessedMessage } from "@codebolt/types/agent";
|
|
2
|
+
import { BaseMessageModifier } from "../base";
|
|
3
|
+
import { FlatUserMessage } from "@codebolt/types/sdk";
|
|
4
|
+
export interface LoopDetectionOptions {
|
|
5
|
+
maxSimilarMessages?: number;
|
|
6
|
+
similarityThreshold?: number;
|
|
7
|
+
timeWindowMs?: number;
|
|
8
|
+
enableLoopPrevention?: boolean;
|
|
9
|
+
}
|
|
10
|
+
interface MessageHistory {
|
|
11
|
+
content: string;
|
|
12
|
+
timestamp: number;
|
|
13
|
+
role: string;
|
|
14
|
+
}
|
|
15
|
+
export declare class LoopDetectionModifier extends BaseMessageModifier {
|
|
16
|
+
private readonly options;
|
|
17
|
+
private messageHistory;
|
|
18
|
+
private loopDetected;
|
|
19
|
+
constructor(options?: LoopDetectionOptions);
|
|
20
|
+
modify(originalRequest: FlatUserMessage, createdMessage: ProcessedMessage): Promise<ProcessedMessage>;
|
|
21
|
+
private detectLoop;
|
|
22
|
+
private checkSimilarMessages;
|
|
23
|
+
private calculateSimilarity;
|
|
24
|
+
private levenshteinDistance;
|
|
25
|
+
private cleanOldMessages;
|
|
26
|
+
resetLoopDetection(): void;
|
|
27
|
+
getMessageHistory(): MessageHistory[];
|
|
28
|
+
}
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LoopDetectionModifier = void 0;
|
|
4
|
+
const base_1 = require("../base");
|
|
5
|
+
class LoopDetectionModifier extends base_1.BaseMessageModifier {
|
|
6
|
+
constructor(options = {}) {
|
|
7
|
+
super();
|
|
8
|
+
this.messageHistory = [];
|
|
9
|
+
this.loopDetected = false;
|
|
10
|
+
this.options = {
|
|
11
|
+
maxSimilarMessages: options.maxSimilarMessages || 3,
|
|
12
|
+
similarityThreshold: options.similarityThreshold || 0.8,
|
|
13
|
+
timeWindowMs: options.timeWindowMs || 60000, // 1 minute
|
|
14
|
+
enableLoopPrevention: options.enableLoopPrevention !== false
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
modify(originalRequest, createdMessage) {
|
|
18
|
+
try {
|
|
19
|
+
if (!this.options.enableLoopPrevention) {
|
|
20
|
+
return Promise.resolve(createdMessage);
|
|
21
|
+
}
|
|
22
|
+
const currentTime = Date.now();
|
|
23
|
+
const messages = createdMessage.message.messages;
|
|
24
|
+
// Add current messages to history
|
|
25
|
+
for (const message of messages) {
|
|
26
|
+
if (typeof message.content === 'string') {
|
|
27
|
+
this.messageHistory.push({
|
|
28
|
+
content: message.content,
|
|
29
|
+
timestamp: currentTime,
|
|
30
|
+
role: message.role
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Clean old messages from history
|
|
35
|
+
this.cleanOldMessages(currentTime);
|
|
36
|
+
// Check for loops
|
|
37
|
+
const loopDetected = this.detectLoop();
|
|
38
|
+
if (loopDetected && !this.loopDetected) {
|
|
39
|
+
this.loopDetected = true;
|
|
40
|
+
// Add loop detection warning
|
|
41
|
+
const warningMessage = {
|
|
42
|
+
role: 'system',
|
|
43
|
+
content: `[Loop Detection Warning] Similar messages detected in recent conversation. This may indicate a conversational loop. Consider rephrasing your request or providing more specific information.`
|
|
44
|
+
};
|
|
45
|
+
const updatedMessages = [...messages, warningMessage];
|
|
46
|
+
return Promise.resolve({
|
|
47
|
+
message: {
|
|
48
|
+
...createdMessage.message,
|
|
49
|
+
messages: updatedMessages
|
|
50
|
+
},
|
|
51
|
+
metadata: {
|
|
52
|
+
...createdMessage.metadata,
|
|
53
|
+
loopDetected: true,
|
|
54
|
+
loopDetectionWarningAdded: true
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
// Reset loop detection if we haven't detected a loop recently
|
|
59
|
+
if (!loopDetected && this.loopDetected) {
|
|
60
|
+
this.loopDetected = false;
|
|
61
|
+
}
|
|
62
|
+
return Promise.resolve({
|
|
63
|
+
message: createdMessage.message,
|
|
64
|
+
metadata: {
|
|
65
|
+
...createdMessage.metadata,
|
|
66
|
+
loopDetectionChecked: true,
|
|
67
|
+
loopDetected: false
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
console.error('Error in LoopDetectionModifier:', error);
|
|
73
|
+
return Promise.resolve(createdMessage);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
detectLoop() {
|
|
77
|
+
if (this.messageHistory.length < this.options.maxSimilarMessages) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
// Get recent messages grouped by role
|
|
81
|
+
const recentUserMessages = this.messageHistory
|
|
82
|
+
.filter(msg => msg.role === 'user')
|
|
83
|
+
.slice(-this.options.maxSimilarMessages);
|
|
84
|
+
const recentAssistantMessages = this.messageHistory
|
|
85
|
+
.filter(msg => msg.role === 'assistant')
|
|
86
|
+
.slice(-this.options.maxSimilarMessages);
|
|
87
|
+
// Check for similar user messages
|
|
88
|
+
if (recentUserMessages.length >= this.options.maxSimilarMessages) {
|
|
89
|
+
const userLoop = this.checkSimilarMessages(recentUserMessages);
|
|
90
|
+
if (userLoop)
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
// Check for similar assistant messages
|
|
94
|
+
if (recentAssistantMessages.length >= this.options.maxSimilarMessages) {
|
|
95
|
+
const assistantLoop = this.checkSimilarMessages(recentAssistantMessages);
|
|
96
|
+
if (assistantLoop)
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
checkSimilarMessages(messages) {
|
|
102
|
+
if (messages.length < 2)
|
|
103
|
+
return false;
|
|
104
|
+
// Compare each message with every other message
|
|
105
|
+
for (let i = 0; i < messages.length - 1; i++) {
|
|
106
|
+
for (let j = i + 1; j < messages.length; j++) {
|
|
107
|
+
const similarity = this.calculateSimilarity(messages[i].content, messages[j].content);
|
|
108
|
+
if (similarity >= this.options.similarityThreshold) {
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
calculateSimilarity(text1, text2) {
|
|
116
|
+
// Simple similarity calculation using Levenshtein distance
|
|
117
|
+
const distance = this.levenshteinDistance(text1.toLowerCase(), text2.toLowerCase());
|
|
118
|
+
const maxLength = Math.max(text1.length, text2.length);
|
|
119
|
+
if (maxLength === 0)
|
|
120
|
+
return 1;
|
|
121
|
+
return 1 - (distance / maxLength);
|
|
122
|
+
}
|
|
123
|
+
levenshteinDistance(str1, str2) {
|
|
124
|
+
const matrix = [];
|
|
125
|
+
for (let i = 0; i <= str2.length; i++) {
|
|
126
|
+
matrix[i] = [i];
|
|
127
|
+
}
|
|
128
|
+
for (let j = 0; j <= str1.length; j++) {
|
|
129
|
+
matrix[0][j] = j;
|
|
130
|
+
}
|
|
131
|
+
for (let i = 1; i <= str2.length; i++) {
|
|
132
|
+
for (let j = 1; j <= str1.length; j++) {
|
|
133
|
+
if (str2.charAt(i - 1) === str1.charAt(j - 1)) {
|
|
134
|
+
matrix[i][j] = matrix[i - 1][j - 1];
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j] + 1);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return matrix[str2.length][str1.length];
|
|
142
|
+
}
|
|
143
|
+
cleanOldMessages(currentTime) {
|
|
144
|
+
const cutoffTime = currentTime - this.options.timeWindowMs;
|
|
145
|
+
this.messageHistory = this.messageHistory.filter(msg => msg.timestamp >= cutoffTime);
|
|
146
|
+
}
|
|
147
|
+
resetLoopDetection() {
|
|
148
|
+
this.messageHistory = [];
|
|
149
|
+
this.loopDetected = false;
|
|
150
|
+
}
|
|
151
|
+
getMessageHistory() {
|
|
152
|
+
return [...this.messageHistory];
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
exports.LoopDetectionModifier = LoopDetectionModifier;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ProcessedMessage } from "@codebolt/types/agent";
|
|
2
|
+
import { BaseMessageModifier } from "../base";
|
|
3
|
+
import { FlatUserMessage } from "@codebolt/types/sdk";
|
|
4
|
+
export interface MemoryImportOptions {
|
|
5
|
+
enableMemoryImport?: boolean;
|
|
6
|
+
maxFileSize?: number;
|
|
7
|
+
allowedExtensions?: string[];
|
|
8
|
+
basePath?: string;
|
|
9
|
+
maxImports?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare class MemoryImportModifier extends BaseMessageModifier {
|
|
12
|
+
private readonly options;
|
|
13
|
+
constructor(options?: MemoryImportOptions);
|
|
14
|
+
modify(originalRequest: FlatUserMessage, createdMessage: ProcessedMessage): Promise<ProcessedMessage>;
|
|
15
|
+
}
|