@codebolt/agent 1.2.1 → 2.2.3
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 +157 -66
- package/dist/{agent.js → builderpattern/agent.js} +2 -2
- package/dist/{followupquestionbuilder.d.ts → builderpattern/followupquestionbuilder.d.ts} +1 -1
- package/dist/{followupquestionbuilder.js → builderpattern/followupquestionbuilder.js} +1 -1
- package/dist/{index.d.ts → builderpattern/index.d.ts} +3 -3
- package/dist/{llmoutputhandler.d.ts → builderpattern/llmoutputhandler.d.ts} +1 -1
- package/dist/{llmoutputhandler.js → builderpattern/llmoutputhandler.js} +7 -7
- package/dist/{promptbuilder.d.ts → builderpattern/promptbuilder.d.ts} +3 -3
- package/dist/{taskInstruction.d.ts → builderpattern/taskInstruction.d.ts} +2 -2
- package/dist/{usermessage.d.ts → builderpattern/usermessage.d.ts} +9 -4
- package/dist/composablepattern/agent.d.ts +169 -0
- package/dist/composablepattern/agent.js +598 -0
- package/dist/composablepattern/codebolt-storage.d.ts +67 -0
- package/dist/composablepattern/codebolt-storage.js +320 -0
- package/dist/composablepattern/document.d.ts +149 -0
- package/dist/composablepattern/document.js +372 -0
- package/dist/composablepattern/examples/codebolt-integration-example.d.ts +12 -0
- package/dist/composablepattern/examples/codebolt-integration-example.js +218 -0
- package/dist/composablepattern/examples/codebolt-storage-example.d.ts +40 -0
- package/dist/composablepattern/examples/codebolt-storage-example.js +223 -0
- package/dist/composablepattern/examples/custom-steps-example.d.ts +20 -0
- package/dist/composablepattern/examples/custom-steps-example.js +455 -0
- package/dist/composablepattern/examples/document-agent.d.ts +17 -0
- package/dist/composablepattern/examples/document-agent.js +107 -0
- package/dist/composablepattern/examples/simple-codebolt-integration.d.ts +8 -0
- package/dist/composablepattern/examples/simple-codebolt-integration.js +164 -0
- package/dist/composablepattern/examples/weather-agent.d.ts +18 -0
- package/dist/composablepattern/examples/weather-agent.js +86 -0
- package/dist/composablepattern/examples/workflow-example.d.ts +12 -0
- package/dist/composablepattern/examples/workflow-example.js +463 -0
- package/dist/composablepattern/index.d.ts +63 -0
- package/dist/composablepattern/index.js +115 -0
- package/dist/composablepattern/memory.d.ts +89 -0
- package/dist/composablepattern/memory.js +141 -0
- package/dist/composablepattern/tool.d.ts +84 -0
- package/dist/composablepattern/tool.js +260 -0
- package/dist/composablepattern/types.d.ts +194 -0
- package/dist/composablepattern/types.js +6 -0
- package/dist/composablepattern/user-context.d.ts +214 -0
- package/dist/composablepattern/user-context.js +275 -0
- package/dist/composablepattern/workflow.d.ts +388 -0
- package/dist/composablepattern/workflow.js +562 -0
- package/dist/local-tools/fileTools.d.ts +26 -0
- package/dist/local-tools/fileTools.js +162 -0
- package/dist/processor/agent/agentStep.d.ts +49 -0
- package/dist/processor/agent/agentStep.js +241 -0
- package/dist/processor/agent/toolExecutor.d.ts +19 -0
- package/dist/processor/agent/toolExecutor.js +90 -0
- package/dist/processor/index.d.ts +7 -0
- package/dist/processor/index.js +36 -0
- package/dist/processor/messageModifiers/baseMessageModifier.d.ts +20 -0
- package/dist/processor/messageModifiers/baseMessageModifier.js +55 -0
- package/dist/processor/processors/baseProcessor.d.ts +14 -0
- package/dist/processor/processors/baseProcessor.js +29 -0
- package/dist/processor/tools/baseTool.d.ts +10 -0
- package/dist/processor/tools/baseTool.js +20 -0
- package/dist/processor/tools/toolList.d.ts +9 -0
- package/dist/processor/tools/toolList.js +22 -0
- package/dist/processor/types/interfaces.d.ts +117 -0
- package/dist/processor/types/interfaces.js +2 -0
- 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/base/baseMessageModifier.d.ts +12 -0
- package/dist/processor-pieces/base/baseMessageModifier.js +15 -0
- package/dist/processor-pieces/base/basePostInferenceProcessor.d.ts +13 -0
- package/dist/processor-pieces/base/basePostInferenceProcessor.js +18 -0
- package/dist/processor-pieces/base/basePostToolCallProcessor.d.ts +15 -0
- package/dist/processor-pieces/base/basePostToolCallProcessor.js +25 -0
- package/dist/processor-pieces/base/basePreInferenceProcessor.d.ts +12 -0
- package/dist/processor-pieces/base/basePreInferenceProcessor.js +17 -0
- package/dist/processor-pieces/base/basePreToolCallProcessor.d.ts +18 -0
- package/dist/processor-pieces/base/basePreToolCallProcessor.js +66 -0
- package/dist/processor-pieces/base/index.d.ts +9 -0
- package/dist/processor-pieces/base/index.js +18 -0
- package/dist/processor-pieces/index.d.ts +1 -0
- package/dist/processor-pieces/index.js +59 -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 +31 -0
- package/dist/processor-pieces/messageModifiers/addToolsListMessageModifier.js +145 -0
- package/dist/processor-pieces/messageModifiers/advancedSystemInstructionMessageModifier.d.ts +9 -0
- package/dist/processor-pieces/messageModifiers/advancedSystemInstructionMessageModifier.js +77 -0
- package/dist/processor-pieces/messageModifiers/argumentProcessorModifier.d.ts +13 -0
- package/dist/processor-pieces/messageModifiers/argumentProcessorModifier.js +68 -0
- package/dist/processor-pieces/messageModifiers/atFileProcessorModifier.d.ts +25 -0
- package/dist/processor-pieces/messageModifiers/atFileProcessorModifier.js +453 -0
- package/dist/processor-pieces/messageModifiers/baseContextMessageModifier.d.ts +7 -0
- package/dist/processor-pieces/messageModifiers/baseContextMessageModifier.js +67 -0
- package/dist/processor-pieces/messageModifiers/baseSystemInstructionMessageModifier.d.ts +9 -0
- package/dist/processor-pieces/messageModifiers/baseSystemInstructionMessageModifier.js +90 -0
- 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.d.ts +18 -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/chatHistoryMessageModifier.js +104 -0
- package/dist/processor-pieces/messageModifiers/chatRecordingModifier.d.ts +23 -0
- package/dist/processor-pieces/messageModifiers/chatRecordingModifier.js +173 -0
- package/dist/processor-pieces/messageModifiers/coreSystemPromptModifier.d.ts +14 -0
- package/dist/processor-pieces/messageModifiers/coreSystemPromptModifier.js +130 -0
- package/dist/processor-pieces/messageModifiers/directoryContextModifier.d.ts +36 -0
- package/dist/processor-pieces/messageModifiers/directoryContextModifier.js +418 -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/environmentContextModifier.d.ts +26 -0
- package/dist/processor-pieces/messageModifiers/environmentContextModifier.js +260 -0
- package/dist/processor-pieces/messageModifiers/handleUrlMessageModifier.d.ts +13 -0
- package/dist/processor-pieces/messageModifiers/handleUrlMessageModifier.js +59 -0
- package/dist/processor-pieces/messageModifiers/ideContextModifier.d.ts +34 -0
- package/dist/processor-pieces/messageModifiers/ideContextModifier.js +157 -0
- package/dist/processor-pieces/messageModifiers/imageAttachmentMessageModifier.d.ts +19 -0
- package/dist/processor-pieces/messageModifiers/imageAttachmentMessageModifier.js +221 -0
- package/dist/processor-pieces/messageModifiers/index.d.ts +11 -0
- package/dist/processor-pieces/messageModifiers/index.js +26 -0
- package/dist/processor-pieces/messageModifiers/memoryImportModifier.d.ts +15 -0
- package/dist/processor-pieces/messageModifiers/memoryImportModifier.js +129 -0
- 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/toolInjectionModifier.d.ts +20 -0
- package/dist/processor-pieces/messageModifiers/toolInjectionModifier.js +152 -0
- package/dist/processor-pieces/messageModifiers/workingDirectoryMessageModifier.d.ts +38 -0
- package/dist/processor-pieces/messageModifiers/workingDirectoryMessageModifier.js +392 -0
- 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/postInferenceProcessors/loopDetectionModifier.d.ts +29 -0
- package/dist/processor-pieces/postInferenceProcessors/loopDetectionModifier.js +174 -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/postToolCallProcessors/index.d.ts +1 -0
- package/dist/processor-pieces/postToolCallProcessors/index.js +2 -0
- package/dist/processor-pieces/postToolCallProcessors/shellProcessorModifier.d.ts +25 -0
- package/dist/processor-pieces/postToolCallProcessors/shellProcessorModifier.js +225 -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/chatCompressionModifier.d.ts +35 -0
- package/dist/processor-pieces/preInferenceProcessors/chatCompressionModifier.js +255 -0
- package/dist/processor-pieces/preInferenceProcessors/conversationCompaction.d.ts +7 -0
- package/dist/processor-pieces/preInferenceProcessors/conversationCompaction.js +31 -0
- package/dist/processor-pieces/preInferenceProcessors/index.d.ts +1 -0
- package/dist/processor-pieces/preInferenceProcessors/index.js +2 -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/processor-pieces/pretoolCallProcessors/index.d.ts +1 -0
- package/dist/processor-pieces/pretoolCallProcessors/index.js +2 -0
- package/dist/processor-pieces/processors/advancedLoopDetectionProcessor.d.ts +41 -0
- package/dist/processor-pieces/processors/advancedLoopDetectionProcessor.js +197 -0
- package/dist/processor-pieces/processors/chatCompressionProcessor.d.ts +26 -0
- package/dist/processor-pieces/processors/chatCompressionProcessor.js +90 -0
- package/dist/processor-pieces/processors/chatRecordingProcessor.d.ts +81 -0
- package/dist/processor-pieces/processors/chatRecordingProcessor.js +329 -0
- package/dist/processor-pieces/processors/contextManagementProcessor.d.ts +40 -0
- package/dist/processor-pieces/processors/contextManagementProcessor.js +305 -0
- package/dist/processor-pieces/processors/loopDetectionProcessor.d.ts +30 -0
- package/dist/processor-pieces/processors/loopDetectionProcessor.js +137 -0
- package/dist/processor-pieces/processors/responseValidationProcessor.d.ts +30 -0
- package/dist/processor-pieces/processors/responseValidationProcessor.js +228 -0
- package/dist/processor-pieces/processors/telemetryProcessor.d.ts +99 -0
- package/dist/processor-pieces/processors/telemetryProcessor.js +311 -0
- package/dist/processor-pieces/processors/tokenManagementProcessor.d.ts +37 -0
- package/dist/processor-pieces/processors/tokenManagementProcessor.js +178 -0
- package/dist/processor-pieces/processors/toolExecutionProcessor.d.ts +43 -0
- package/dist/processor-pieces/processors/toolExecutionProcessor.js +207 -0
- package/dist/processor-pieces/tools/fileTools.d.ts +26 -0
- package/dist/processor-pieces/tools/fileTools.js +162 -0
- package/dist/processor-pieces/utils/messageModifierHelper.d.ts +4 -0
- package/dist/processor-pieces/utils/messageModifierHelper.js +58 -0
- package/dist/types/commonTypes.d.ts +4 -0
- package/dist/types/processorTypes.d.ts +67 -0
- package/dist/types/processorTypes.js +58 -0
- package/dist/unified/agent/agent.d.ts +17 -0
- package/dist/unified/agent/agent.js +79 -0
- package/dist/unified/agent/team.d.ts +2 -0
- package/dist/unified/agent/team.js +6 -0
- package/dist/unified/agent/tool.d.ts +99 -0
- package/dist/unified/agent/tool.js +440 -0
- package/dist/unified/agent/tools.d.ts +44 -0
- package/dist/unified/agent/tools.js +487 -0
- package/dist/unified/agent/workflow.d.ts +24 -0
- package/dist/unified/agent/workflow.js +275 -0
- package/dist/unified/agent/workflowControls.d.ts +11 -0
- package/dist/unified/agent/workflowControls.js +20 -0
- package/dist/unified/agent/workflowSteps.d.ts +63 -0
- package/dist/unified/agent/workflowSteps.js +284 -0
- package/dist/unified/base/agentStep.d.ts +32 -0
- package/dist/unified/base/agentStep.js +96 -0
- package/dist/unified/base/create/createInitialPromptGenerators.d.ts +5 -0
- package/dist/unified/base/create/createInitialPromptGenerators.js +17 -0
- package/dist/unified/base/index.d.ts +5 -0
- package/dist/unified/base/index.js +13 -0
- package/dist/unified/base/initialPromptGenerator.d.ts +48 -0
- package/dist/unified/base/initialPromptGenerator.js +118 -0
- package/dist/unified/base/responseExecutor.d.ts +36 -0
- package/dist/unified/base/responseExecutor.js +283 -0
- 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/index.d.ts +18 -0
- package/dist/unified/index.js +42 -0
- package/dist/unified/orchestrator/orchestrator.d.ts +260 -0
- package/dist/unified/orchestrator/orchestrator.js +519 -0
- package/dist/unified/team/team.d.ts +1 -0
- package/dist/unified/team/team.js +2 -0
- package/dist/unified/types/libTypes.d.ts +378 -0
- package/dist/unified/types/libTypes.js +6 -0
- package/dist/unified/types/types.d.ts +212 -0
- package/dist/unified/types/types.js +43 -0
- package/dist/unified/utils/utils.d.ts +40 -0
- package/dist/unified/utils/utils.js +219 -0
- package/package.json +35 -13
- /package/dist/{agent.d.ts → builderpattern/agent.d.ts} +0 -0
- /package/dist/{index.js → builderpattern/index.js} +0 -0
- /package/dist/{promptbuilder.js → builderpattern/promptbuilder.js} +0 -0
- /package/dist/{systemprompt.d.ts → builderpattern/systemprompt.d.ts} +0 -0
- /package/dist/{systemprompt.js → builderpattern/systemprompt.js} +0 -0
- /package/dist/{taskInstruction.js → builderpattern/taskInstruction.js} +0 -0
- /package/dist/{usermessage.js → builderpattern/usermessage.js} +0 -0
|
@@ -0,0 +1,264 @@
|
|
|
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.ConversationCompactorProcessor = void 0;
|
|
7
|
+
const processorTypes_1 = require("../types/processorTypes");
|
|
8
|
+
const codeboltjs_1 = __importDefault(require("@codebolt/codeboltjs"));
|
|
9
|
+
const { chatSummary } = codeboltjs_1.default;
|
|
10
|
+
/**
|
|
11
|
+
* Processor that compacts long conversations to keep them within manageable limits
|
|
12
|
+
* while preserving important context and recent interactions.
|
|
13
|
+
*/
|
|
14
|
+
class ConversationCompactorProcessor extends processorTypes_1.BaseProcessor {
|
|
15
|
+
constructor(options = {}) {
|
|
16
|
+
super(options);
|
|
17
|
+
this.maxConversationLength = options.maxConversationLength || 50;
|
|
18
|
+
this.compactionThreshold = options.compactionThreshold || 0.8; // Compact when 80% of max length
|
|
19
|
+
this.preserveRecentMessages = options.preserveRecentMessages || 10;
|
|
20
|
+
this.preserveSystemMessages = options.preserveSystemMessages !== false;
|
|
21
|
+
this.preserveToolMessages = options.preserveToolMessages !== false;
|
|
22
|
+
this.enableSummarization = options.enableSummarization !== false;
|
|
23
|
+
this.enableSmartRemoval = options.enableSmartRemoval !== false;
|
|
24
|
+
this.compressionRatio = options.compressionRatio || 0.6; // Target 60% of original size
|
|
25
|
+
}
|
|
26
|
+
async processInput(input) {
|
|
27
|
+
try {
|
|
28
|
+
const { message, context } = input;
|
|
29
|
+
const messages = message.messages;
|
|
30
|
+
// Check if compaction is needed
|
|
31
|
+
const needsCompaction = this.shouldCompactConversation(messages);
|
|
32
|
+
if (!needsCompaction) {
|
|
33
|
+
return [this.createEvent('ConversationCompactionSkipped', {
|
|
34
|
+
reason: 'Conversation length within limits',
|
|
35
|
+
messageCount: messages.length,
|
|
36
|
+
maxLength: this.maxConversationLength
|
|
37
|
+
})];
|
|
38
|
+
}
|
|
39
|
+
// Perform compaction
|
|
40
|
+
const compactionResult = await this.compactConversation(messages, context);
|
|
41
|
+
// Update the message with compacted conversation
|
|
42
|
+
const compactedMessage = {
|
|
43
|
+
messages: compactionResult.compactedMessages,
|
|
44
|
+
metadata: {
|
|
45
|
+
...message.metadata,
|
|
46
|
+
compactionInfo: compactionResult.info
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
return [
|
|
50
|
+
this.createEvent('ConversationCompacted', compactionResult.info),
|
|
51
|
+
this.createEvent('MessageModified', {
|
|
52
|
+
originalMessageCount: messages.length,
|
|
53
|
+
newMessageCount: compactionResult.compactedMessages.length,
|
|
54
|
+
compactedMessage
|
|
55
|
+
})
|
|
56
|
+
];
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
console.error('Error in ConversationCompactorProcessor:', error);
|
|
60
|
+
return [this.createEvent('ConversationCompactionError', {
|
|
61
|
+
error: error instanceof Error ? error.message : String(error)
|
|
62
|
+
})];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
shouldCompactConversation(messages) {
|
|
66
|
+
const threshold = Math.floor(this.maxConversationLength * this.compactionThreshold);
|
|
67
|
+
return messages.length >= threshold;
|
|
68
|
+
}
|
|
69
|
+
async compactConversation(messages, context) {
|
|
70
|
+
const originalCount = messages.length;
|
|
71
|
+
let compactedMessages;
|
|
72
|
+
let compactionMethod;
|
|
73
|
+
// Determine the best compaction method
|
|
74
|
+
if (this.enableSummarization && originalCount > this.preserveRecentMessages * 2) {
|
|
75
|
+
compactionMethod = 'summarization';
|
|
76
|
+
compactedMessages = await this.compactWithSummarization(messages);
|
|
77
|
+
}
|
|
78
|
+
else if (this.enableSmartRemoval) {
|
|
79
|
+
compactionMethod = 'smart_removal';
|
|
80
|
+
compactedMessages = this.compactWithSmartRemoval(messages);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
compactionMethod = 'truncation';
|
|
84
|
+
compactedMessages = this.compactWithTruncation(messages);
|
|
85
|
+
}
|
|
86
|
+
const compactedCount = compactedMessages.length;
|
|
87
|
+
const info = {
|
|
88
|
+
originalMessageCount: originalCount,
|
|
89
|
+
compactedMessageCount: compactedCount,
|
|
90
|
+
compressionRatio: compactedCount / originalCount,
|
|
91
|
+
compactionMethod,
|
|
92
|
+
preservedMessages: compactedCount,
|
|
93
|
+
removedMessages: originalCount - compactedCount
|
|
94
|
+
};
|
|
95
|
+
return { compactedMessages, info };
|
|
96
|
+
}
|
|
97
|
+
async compactWithSummarization(messages) {
|
|
98
|
+
// Separate messages into categories
|
|
99
|
+
const systemMessages = messages.filter(m => m.role === 'system');
|
|
100
|
+
const recentMessages = messages.slice(-this.preserveRecentMessages);
|
|
101
|
+
const middleMessages = messages.slice(systemMessages.length, messages.length - this.preserveRecentMessages);
|
|
102
|
+
if (middleMessages.length === 0) {
|
|
103
|
+
return messages;
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
// Create conversation text for summarization
|
|
107
|
+
const conversationText = middleMessages
|
|
108
|
+
.map(m => `${m.role}: ${typeof m.content === 'string' ? m.content : JSON.stringify(m.content)}`)
|
|
109
|
+
.join('\n');
|
|
110
|
+
// Use codeboltjs chat summary
|
|
111
|
+
const summary = await chatSummary.summarizeConversation(conversationText, {
|
|
112
|
+
maxLength: Math.floor(middleMessages.length * this.compressionRatio),
|
|
113
|
+
preserveImportantDetails: true
|
|
114
|
+
});
|
|
115
|
+
// Create summary message
|
|
116
|
+
const summaryMessage = {
|
|
117
|
+
role: 'system',
|
|
118
|
+
content: `[Conversation Summary]: ${summary}`
|
|
119
|
+
};
|
|
120
|
+
// Combine preserved messages with summary
|
|
121
|
+
return [
|
|
122
|
+
...systemMessages,
|
|
123
|
+
summaryMessage,
|
|
124
|
+
...recentMessages
|
|
125
|
+
];
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
console.warn('Summarization failed, falling back to smart removal:', error);
|
|
129
|
+
return this.compactWithSmartRemoval(messages);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
compactWithSmartRemoval(messages) {
|
|
133
|
+
// Always preserve system messages
|
|
134
|
+
const systemMessages = messages.filter(m => m.role === 'system');
|
|
135
|
+
const nonSystemMessages = messages.filter(m => m.role !== 'system');
|
|
136
|
+
// Always preserve recent messages
|
|
137
|
+
const recentMessages = nonSystemMessages.slice(-this.preserveRecentMessages);
|
|
138
|
+
const olderMessages = nonSystemMessages.slice(0, -this.preserveRecentMessages);
|
|
139
|
+
if (olderMessages.length === 0) {
|
|
140
|
+
return messages;
|
|
141
|
+
}
|
|
142
|
+
// Calculate target count for older messages
|
|
143
|
+
const targetTotal = Math.floor(this.maxConversationLength * this.compressionRatio);
|
|
144
|
+
const preservedCount = systemMessages.length + recentMessages.length;
|
|
145
|
+
const targetOlderCount = Math.max(0, targetTotal - preservedCount);
|
|
146
|
+
if (targetOlderCount >= olderMessages.length) {
|
|
147
|
+
return messages;
|
|
148
|
+
}
|
|
149
|
+
// Score messages by importance
|
|
150
|
+
const scoredMessages = olderMessages.map((message, index) => ({
|
|
151
|
+
message,
|
|
152
|
+
score: this.calculateMessageImportance(message, index, olderMessages.length)
|
|
153
|
+
}));
|
|
154
|
+
// Sort by score (descending) and take top messages
|
|
155
|
+
scoredMessages.sort((a, b) => b.score - a.score);
|
|
156
|
+
const selectedOlderMessages = scoredMessages
|
|
157
|
+
.slice(0, targetOlderCount)
|
|
158
|
+
.map(item => item.message);
|
|
159
|
+
// Maintain chronological order
|
|
160
|
+
const selectedIndices = new Set(selectedOlderMessages.map(msg => olderMessages.indexOf(msg)));
|
|
161
|
+
const chronologicalOlderMessages = olderMessages.filter((_, index) => selectedIndices.has(index));
|
|
162
|
+
return [
|
|
163
|
+
...systemMessages,
|
|
164
|
+
...chronologicalOlderMessages,
|
|
165
|
+
...recentMessages
|
|
166
|
+
];
|
|
167
|
+
}
|
|
168
|
+
compactWithTruncation(messages) {
|
|
169
|
+
const targetCount = Math.floor(this.maxConversationLength * this.compressionRatio);
|
|
170
|
+
if (messages.length <= targetCount) {
|
|
171
|
+
return messages;
|
|
172
|
+
}
|
|
173
|
+
// Preserve system messages and recent messages
|
|
174
|
+
const systemMessages = messages.filter(m => m.role === 'system');
|
|
175
|
+
const nonSystemMessages = messages.filter(m => m.role !== 'system');
|
|
176
|
+
const recentCount = Math.min(this.preserveRecentMessages, nonSystemMessages.length);
|
|
177
|
+
const recentMessages = nonSystemMessages.slice(-recentCount);
|
|
178
|
+
const availableForOlder = targetCount - systemMessages.length - recentMessages.length;
|
|
179
|
+
if (availableForOlder <= 0) {
|
|
180
|
+
return [...systemMessages, ...recentMessages];
|
|
181
|
+
}
|
|
182
|
+
const olderMessages = nonSystemMessages.slice(0, -recentCount);
|
|
183
|
+
const selectedOlderMessages = olderMessages.slice(-availableForOlder);
|
|
184
|
+
return [
|
|
185
|
+
...systemMessages,
|
|
186
|
+
...selectedOlderMessages,
|
|
187
|
+
...recentMessages
|
|
188
|
+
];
|
|
189
|
+
}
|
|
190
|
+
calculateMessageImportance(message, index, totalCount) {
|
|
191
|
+
let score = 0;
|
|
192
|
+
// Base score for message type
|
|
193
|
+
switch (message.role) {
|
|
194
|
+
case 'system':
|
|
195
|
+
score += 100; // Highest priority
|
|
196
|
+
break;
|
|
197
|
+
case 'assistant':
|
|
198
|
+
score += 50;
|
|
199
|
+
break;
|
|
200
|
+
case 'user':
|
|
201
|
+
score += 40;
|
|
202
|
+
break;
|
|
203
|
+
case 'tool':
|
|
204
|
+
score += this.preserveToolMessages ? 60 : 20;
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
// Boost score for messages with tool calls
|
|
208
|
+
if (message.tool_calls && message.tool_calls.length > 0) {
|
|
209
|
+
score += 30;
|
|
210
|
+
}
|
|
211
|
+
// Boost score for longer messages (more content)
|
|
212
|
+
const contentLength = typeof message.content === 'string'
|
|
213
|
+
? message.content.length
|
|
214
|
+
: JSON.stringify(message.content).length;
|
|
215
|
+
score += Math.min(contentLength / 100, 20); // Max 20 points for length
|
|
216
|
+
// Recency bonus (more recent = higher score)
|
|
217
|
+
const recencyBonus = (index / totalCount) * 10;
|
|
218
|
+
score += recencyBonus;
|
|
219
|
+
// Boost for messages that contain important keywords
|
|
220
|
+
const importantKeywords = [
|
|
221
|
+
'error', 'exception', 'failed', 'success', 'completed',
|
|
222
|
+
'important', 'critical', 'warning', 'note'
|
|
223
|
+
];
|
|
224
|
+
const contentStr = typeof message.content === 'string'
|
|
225
|
+
? message.content.toLowerCase()
|
|
226
|
+
: JSON.stringify(message.content).toLowerCase();
|
|
227
|
+
const keywordMatches = importantKeywords.filter(keyword => contentStr.includes(keyword)).length;
|
|
228
|
+
score += keywordMatches * 5;
|
|
229
|
+
return score;
|
|
230
|
+
}
|
|
231
|
+
// Public methods for configuration
|
|
232
|
+
getMaxConversationLength() {
|
|
233
|
+
return this.maxConversationLength;
|
|
234
|
+
}
|
|
235
|
+
getCompactionThreshold() {
|
|
236
|
+
return this.compactionThreshold;
|
|
237
|
+
}
|
|
238
|
+
isCompactionNeeded(messageCount) {
|
|
239
|
+
return messageCount >= Math.floor(this.maxConversationLength * this.compactionThreshold);
|
|
240
|
+
}
|
|
241
|
+
getCompressionRatio() {
|
|
242
|
+
return this.compressionRatio;
|
|
243
|
+
}
|
|
244
|
+
// Statistics and monitoring
|
|
245
|
+
getProcessorStats() {
|
|
246
|
+
const enabledFeatures = [];
|
|
247
|
+
if (this.enableSummarization)
|
|
248
|
+
enabledFeatures.push('summarization');
|
|
249
|
+
if (this.enableSmartRemoval)
|
|
250
|
+
enabledFeatures.push('smart_removal');
|
|
251
|
+
if (this.preserveSystemMessages)
|
|
252
|
+
enabledFeatures.push('preserve_system');
|
|
253
|
+
if (this.preserveToolMessages)
|
|
254
|
+
enabledFeatures.push('preserve_tools');
|
|
255
|
+
return {
|
|
256
|
+
maxLength: this.maxConversationLength,
|
|
257
|
+
threshold: this.compactionThreshold,
|
|
258
|
+
preserveRecent: this.preserveRecentMessages,
|
|
259
|
+
compressionRatio: this.compressionRatio,
|
|
260
|
+
enabledFeatures
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
exports.ConversationCompactorProcessor = ConversationCompactorProcessor;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { BaseProcessor, ProcessorInput, ProcessorOutput } from '../types/processorTypes';
|
|
2
|
+
export interface ConversationContinuityInfo {
|
|
3
|
+
contextLinksAdded: number;
|
|
4
|
+
referenceResolutionsAdded: number;
|
|
5
|
+
continuityEnhanced: boolean;
|
|
6
|
+
missingContextDetected: boolean;
|
|
7
|
+
conversationGapsFound: number;
|
|
8
|
+
}
|
|
9
|
+
export interface ConversationContinuityProcessorOptions {
|
|
10
|
+
enableContextLinking?: boolean;
|
|
11
|
+
enableReferenceResolution?: boolean;
|
|
12
|
+
enableGapDetection?: boolean;
|
|
13
|
+
maxContextLinks?: number;
|
|
14
|
+
contextLookbackWindow?: number;
|
|
15
|
+
enableProactiveContext?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Processor that maintains conversation continuity by linking related messages,
|
|
19
|
+
* resolving references, and detecting context gaps in follow-up conversations.
|
|
20
|
+
*/
|
|
21
|
+
export declare class ConversationContinuityProcessor extends BaseProcessor {
|
|
22
|
+
private readonly enableContextLinking;
|
|
23
|
+
private readonly enableReferenceResolution;
|
|
24
|
+
private readonly enableGapDetection;
|
|
25
|
+
private readonly maxContextLinks;
|
|
26
|
+
private readonly contextLookbackWindow;
|
|
27
|
+
private readonly enableProactiveContext;
|
|
28
|
+
constructor(options?: ConversationContinuityProcessorOptions);
|
|
29
|
+
processInput(input: ProcessorInput): Promise<ProcessorOutput[]>;
|
|
30
|
+
private enhanceConversationContinuity;
|
|
31
|
+
private addContextLinks;
|
|
32
|
+
private findReferencingMessages;
|
|
33
|
+
private generateContextLinkMessage;
|
|
34
|
+
private resolveReferences;
|
|
35
|
+
private resolveMessageReferences;
|
|
36
|
+
private detectAndFillGaps;
|
|
37
|
+
private detectConversationGaps;
|
|
38
|
+
private generateGapFillerMessage;
|
|
39
|
+
private addProactiveContext;
|
|
40
|
+
private calculateContinuityInfo;
|
|
41
|
+
setContextLookbackWindow(window: number): void;
|
|
42
|
+
setMaxContextLinks(max: number): void;
|
|
43
|
+
enableContextLinkingForSession(): void;
|
|
44
|
+
disableContextLinkingForSession(): void;
|
|
45
|
+
enableReferenceResolutionForSession(): void;
|
|
46
|
+
disableReferenceResolutionForSession(): void;
|
|
47
|
+
enableGapDetectionForSession(): void;
|
|
48
|
+
disableGapDetectionForSession(): void;
|
|
49
|
+
}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConversationContinuityProcessor = void 0;
|
|
4
|
+
const processorTypes_1 = require("../types/processorTypes");
|
|
5
|
+
/**
|
|
6
|
+
* Processor that maintains conversation continuity by linking related messages,
|
|
7
|
+
* resolving references, and detecting context gaps in follow-up conversations.
|
|
8
|
+
*/
|
|
9
|
+
class ConversationContinuityProcessor extends processorTypes_1.BaseProcessor {
|
|
10
|
+
constructor(options = {}) {
|
|
11
|
+
super(options);
|
|
12
|
+
this.enableContextLinking = options.enableContextLinking !== false;
|
|
13
|
+
this.enableReferenceResolution = options.enableReferenceResolution !== false;
|
|
14
|
+
this.enableGapDetection = options.enableGapDetection !== false;
|
|
15
|
+
this.maxContextLinks = options.maxContextLinks || 5;
|
|
16
|
+
this.contextLookbackWindow = options.contextLookbackWindow || 20;
|
|
17
|
+
this.enableProactiveContext = options.enableProactiveContext !== false;
|
|
18
|
+
}
|
|
19
|
+
async processInput(input) {
|
|
20
|
+
try {
|
|
21
|
+
const { message, context } = input;
|
|
22
|
+
// Only process follow-up conversations
|
|
23
|
+
if (!(context === null || context === void 0 ? void 0 : context.followUpProcessing)) {
|
|
24
|
+
return [this.createEvent('ContinuityProcessingSkipped', {
|
|
25
|
+
reason: 'Not a follow-up conversation processing context'
|
|
26
|
+
})];
|
|
27
|
+
}
|
|
28
|
+
const enhancedMessage = await this.enhanceConversationContinuity(message, context);
|
|
29
|
+
const continuityInfo = this.calculateContinuityInfo(message, enhancedMessage, context);
|
|
30
|
+
return [
|
|
31
|
+
this.createEvent('ConversationContinuityProcessed', continuityInfo),
|
|
32
|
+
this.createEvent('ConversationProcessed', enhancedMessage)
|
|
33
|
+
];
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
console.error('Error in ConversationContinuityProcessor:', error);
|
|
37
|
+
return [this.createEvent('ConversationContinuityError', {
|
|
38
|
+
error: error instanceof Error ? error.message : String(error),
|
|
39
|
+
originalLength: input.message.messages.length
|
|
40
|
+
})];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async enhanceConversationContinuity(message, context) {
|
|
44
|
+
let enhancedMessages = [...message.messages];
|
|
45
|
+
let enhancementsAdded = 0;
|
|
46
|
+
// Add context links if enabled
|
|
47
|
+
if (this.enableContextLinking) {
|
|
48
|
+
const contextLinks = this.addContextLinks(enhancedMessages, context);
|
|
49
|
+
enhancedMessages.push(...contextLinks);
|
|
50
|
+
enhancementsAdded += contextLinks.length;
|
|
51
|
+
}
|
|
52
|
+
// Resolve references if enabled
|
|
53
|
+
if (this.enableReferenceResolution) {
|
|
54
|
+
enhancedMessages = this.resolveReferences(enhancedMessages, context);
|
|
55
|
+
}
|
|
56
|
+
// Detect and fill conversation gaps if enabled
|
|
57
|
+
if (this.enableGapDetection) {
|
|
58
|
+
const gapFillers = this.detectAndFillGaps(enhancedMessages, context);
|
|
59
|
+
enhancedMessages.push(...gapFillers);
|
|
60
|
+
enhancementsAdded += gapFillers.length;
|
|
61
|
+
}
|
|
62
|
+
// Add proactive context if enabled
|
|
63
|
+
if (this.enableProactiveContext) {
|
|
64
|
+
const proactiveContext = this.addProactiveContext(enhancedMessages, context);
|
|
65
|
+
enhancedMessages.push(...proactiveContext);
|
|
66
|
+
enhancementsAdded += proactiveContext.length;
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
...message,
|
|
70
|
+
messages: enhancedMessages,
|
|
71
|
+
metadata: {
|
|
72
|
+
...message.metadata,
|
|
73
|
+
continuityEnhanced: true,
|
|
74
|
+
enhancementsAdded,
|
|
75
|
+
timestamp: new Date().toISOString()
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
addContextLinks(messages, context) {
|
|
80
|
+
const contextLinks = [];
|
|
81
|
+
const recentMessages = messages.slice(-this.contextLookbackWindow);
|
|
82
|
+
// Find messages that reference previous interactions
|
|
83
|
+
const referencingMessages = this.findReferencingMessages(recentMessages);
|
|
84
|
+
if (referencingMessages.length > 0) {
|
|
85
|
+
const linkMessage = {
|
|
86
|
+
role: 'system',
|
|
87
|
+
content: this.generateContextLinkMessage(referencingMessages, context),
|
|
88
|
+
name: 'context-link'
|
|
89
|
+
};
|
|
90
|
+
contextLinks.push(linkMessage);
|
|
91
|
+
}
|
|
92
|
+
return contextLinks.slice(0, this.maxContextLinks);
|
|
93
|
+
}
|
|
94
|
+
findReferencingMessages(messages) {
|
|
95
|
+
const referencePatterns = [
|
|
96
|
+
/\b(this|that|it|they|them)\b/i,
|
|
97
|
+
/\b(the (above|previous|last|earlier))\b/i,
|
|
98
|
+
/\b(as (mentioned|discussed|shown))\b/i,
|
|
99
|
+
/\b(from (before|earlier))\b/i,
|
|
100
|
+
/\b(the (file|code|result|output))\b/i
|
|
101
|
+
];
|
|
102
|
+
return messages.filter(message => {
|
|
103
|
+
const content = typeof message.content === 'string'
|
|
104
|
+
? message.content
|
|
105
|
+
: JSON.stringify(message.content);
|
|
106
|
+
return referencePatterns.some(pattern => pattern.test(content));
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
generateContextLinkMessage(referencingMessages, context) {
|
|
110
|
+
const messageCount = referencingMessages.length;
|
|
111
|
+
const toolResults = context.toolResults || [];
|
|
112
|
+
let linkMessage = `**Context Links:** Found ${messageCount} message${messageCount > 1 ? 's' : ''} with references to previous interactions.`;
|
|
113
|
+
if (toolResults.length > 0) {
|
|
114
|
+
linkMessage += ` Recent tool executions: ${toolResults.length} tool${toolResults.length > 1 ? 's' : ''} executed.`;
|
|
115
|
+
}
|
|
116
|
+
if (context.originalHistory && context.originalHistory.length > 0) {
|
|
117
|
+
linkMessage += ` Conversation history: ${context.originalHistory.length} previous messages available for reference.`;
|
|
118
|
+
}
|
|
119
|
+
return linkMessage;
|
|
120
|
+
}
|
|
121
|
+
resolveReferences(messages, context) {
|
|
122
|
+
return messages.map(message => {
|
|
123
|
+
if (message.role === 'system' || message.name === 'reference-resolution') {
|
|
124
|
+
return message;
|
|
125
|
+
}
|
|
126
|
+
const resolvedContent = this.resolveMessageReferences(message.content, context);
|
|
127
|
+
if (resolvedContent !== message.content) {
|
|
128
|
+
return {
|
|
129
|
+
...message,
|
|
130
|
+
content: resolvedContent,
|
|
131
|
+
name: message.name || 'reference-resolved'
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
return message;
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
resolveMessageReferences(content, context) {
|
|
138
|
+
if (typeof content !== 'string') {
|
|
139
|
+
return content;
|
|
140
|
+
}
|
|
141
|
+
let resolvedContent = content;
|
|
142
|
+
const toolResults = context.toolResults || [];
|
|
143
|
+
// Resolve "the file" references
|
|
144
|
+
if (/\bthe file\b/i.test(resolvedContent) && toolResults.length > 0) {
|
|
145
|
+
const fileOperations = toolResults.filter((result) => result.tool_call_id && result.tool_call_id.includes('file'));
|
|
146
|
+
if (fileOperations.length === 1) {
|
|
147
|
+
resolvedContent = resolvedContent.replace(/\bthe file\b/gi, `the file (from recent tool execution)`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Resolve "the result" references
|
|
151
|
+
if (/\bthe result\b/i.test(resolvedContent) && toolResults.length > 0) {
|
|
152
|
+
resolvedContent = resolvedContent.replace(/\bthe result\b/gi, `the result (from ${toolResults.length} recent tool execution${toolResults.length > 1 ? 's' : ''})`);
|
|
153
|
+
}
|
|
154
|
+
// Resolve "it" references in context of tool operations
|
|
155
|
+
if (/\bit\b/i.test(resolvedContent) && toolResults.length === 1) {
|
|
156
|
+
const toolResult = toolResults[0];
|
|
157
|
+
if (toolResult.tool_call_id) {
|
|
158
|
+
resolvedContent = resolvedContent.replace(/\bit\b/gi, `it (referring to the tool execution result)`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return resolvedContent;
|
|
162
|
+
}
|
|
163
|
+
detectAndFillGaps(messages, context) {
|
|
164
|
+
const gapFillers = [];
|
|
165
|
+
const gaps = this.detectConversationGaps(messages, context);
|
|
166
|
+
gaps.forEach(gap => {
|
|
167
|
+
const fillerMessage = {
|
|
168
|
+
role: 'system',
|
|
169
|
+
content: this.generateGapFillerMessage(gap, context),
|
|
170
|
+
name: 'gap-filler'
|
|
171
|
+
};
|
|
172
|
+
gapFillers.push(fillerMessage);
|
|
173
|
+
});
|
|
174
|
+
return gapFillers;
|
|
175
|
+
}
|
|
176
|
+
detectConversationGaps(messages, context) {
|
|
177
|
+
const gaps = [];
|
|
178
|
+
const toolResults = context.toolResults || [];
|
|
179
|
+
// Gap: Tool results without explanation
|
|
180
|
+
const unexplainedToolResults = toolResults.filter((result) => {
|
|
181
|
+
const hasExplanation = messages.some(msg => msg.role === 'assistant' &&
|
|
182
|
+
typeof msg.content === 'string' &&
|
|
183
|
+
msg.content.includes('result'));
|
|
184
|
+
return !hasExplanation;
|
|
185
|
+
});
|
|
186
|
+
if (unexplainedToolResults.length > 0) {
|
|
187
|
+
gaps.push({
|
|
188
|
+
type: 'unexplained-tool-results',
|
|
189
|
+
description: `${unexplainedToolResults.length} tool result(s) without explanation`,
|
|
190
|
+
severity: 'medium'
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
// Gap: Missing context for references
|
|
194
|
+
const unresolvedReferences = messages.filter(msg => {
|
|
195
|
+
const content = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content);
|
|
196
|
+
return /\b(this|that|it)\b/i.test(content) && msg.role === 'user';
|
|
197
|
+
});
|
|
198
|
+
if (unresolvedReferences.length > 2) {
|
|
199
|
+
gaps.push({
|
|
200
|
+
type: 'unresolved-references',
|
|
201
|
+
description: `${unresolvedReferences.length} messages with unclear references`,
|
|
202
|
+
severity: 'low'
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
// Gap: Long silence after tool execution
|
|
206
|
+
const lastToolIndex = messages.findLastIndex(msg => msg.role === 'tool');
|
|
207
|
+
const lastAssistantIndex = messages.findLastIndex(msg => msg.role === 'assistant');
|
|
208
|
+
if (lastToolIndex > lastAssistantIndex && lastToolIndex < messages.length - 1) {
|
|
209
|
+
gaps.push({
|
|
210
|
+
type: 'missing-tool-response',
|
|
211
|
+
description: 'Tool execution without assistant response',
|
|
212
|
+
severity: 'high'
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
return gaps;
|
|
216
|
+
}
|
|
217
|
+
generateGapFillerMessage(gap, context) {
|
|
218
|
+
switch (gap.type) {
|
|
219
|
+
case 'unexplained-tool-results':
|
|
220
|
+
return `**Context Note:** There are tool execution results that may need explanation or analysis. Consider reviewing the tool outputs and their implications.`;
|
|
221
|
+
case 'unresolved-references':
|
|
222
|
+
return `**Context Note:** Some messages contain references that might be unclear. Consider providing more specific context when referring to previous interactions.`;
|
|
223
|
+
case 'missing-tool-response':
|
|
224
|
+
return `**Context Note:** Recent tool execution completed but may need assistant analysis or response to continue the conversation effectively.`;
|
|
225
|
+
default:
|
|
226
|
+
return `**Context Note:** Potential conversation gap detected: ${gap.description}`;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
addProactiveContext(messages, context) {
|
|
230
|
+
const proactiveMessages = [];
|
|
231
|
+
const toolResults = context.toolResults || [];
|
|
232
|
+
const conversationLength = messages.length;
|
|
233
|
+
// Add proactive context for complex tool interactions
|
|
234
|
+
if (toolResults.length > 3) {
|
|
235
|
+
proactiveMessages.push({
|
|
236
|
+
role: 'system',
|
|
237
|
+
content: `**Proactive Context:** Multiple tools have been executed (${toolResults.length} total). This suggests a complex task that may benefit from step-by-step progress tracking.`,
|
|
238
|
+
name: 'proactive-context'
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
// Add proactive context for long conversations
|
|
242
|
+
if (conversationLength > 25) {
|
|
243
|
+
proactiveMessages.push({
|
|
244
|
+
role: 'system',
|
|
245
|
+
content: `**Proactive Context:** This is an extended conversation (${conversationLength} messages). Consider summarizing progress or breaking down remaining objectives.`,
|
|
246
|
+
name: 'proactive-context'
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
return proactiveMessages.slice(0, 2); // Limit proactive messages
|
|
250
|
+
}
|
|
251
|
+
calculateContinuityInfo(original, enhanced, context) {
|
|
252
|
+
const originalCount = original.messages.length;
|
|
253
|
+
const enhancedCount = enhanced.messages.length;
|
|
254
|
+
const addedMessages = enhancedCount - originalCount;
|
|
255
|
+
// Count different types of enhancements
|
|
256
|
+
const contextLinks = enhanced.messages.filter(m => m.name === 'context-link').length;
|
|
257
|
+
const referenceResolutions = enhanced.messages.filter(m => m.name === 'reference-resolved').length;
|
|
258
|
+
const gapFillers = enhanced.messages.filter(m => m.name === 'gap-filler').length;
|
|
259
|
+
return {
|
|
260
|
+
contextLinksAdded: contextLinks,
|
|
261
|
+
referenceResolutionsAdded: referenceResolutions,
|
|
262
|
+
continuityEnhanced: addedMessages > 0,
|
|
263
|
+
missingContextDetected: gapFillers > 0,
|
|
264
|
+
conversationGapsFound: gapFillers
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
// Public methods for configuration
|
|
268
|
+
setContextLookbackWindow(window) {
|
|
269
|
+
this.contextLookbackWindow = Math.max(5, Math.min(50, window));
|
|
270
|
+
}
|
|
271
|
+
setMaxContextLinks(max) {
|
|
272
|
+
this.maxContextLinks = Math.max(1, Math.min(10, max));
|
|
273
|
+
}
|
|
274
|
+
enableContextLinkingForSession() {
|
|
275
|
+
this.enableContextLinking = true;
|
|
276
|
+
}
|
|
277
|
+
disableContextLinkingForSession() {
|
|
278
|
+
this.enableContextLinking = false;
|
|
279
|
+
}
|
|
280
|
+
enableReferenceResolutionForSession() {
|
|
281
|
+
this.enableReferenceResolution = true;
|
|
282
|
+
}
|
|
283
|
+
disableReferenceResolutionForSession() {
|
|
284
|
+
this.enableReferenceResolution = false;
|
|
285
|
+
}
|
|
286
|
+
enableGapDetectionForSession() {
|
|
287
|
+
this.enableGapDetection = true;
|
|
288
|
+
}
|
|
289
|
+
disableGapDetectionForSession() {
|
|
290
|
+
this.enableGapDetection = false;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
exports.ConversationContinuityProcessor = ConversationContinuityProcessor;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ProcessedMessage } from "@codebolt/types/agent";
|
|
2
|
+
import { BasePreInferenceProcessor } from "../base";
|
|
3
|
+
import { FlatUserMessage, MessageObject } from "@codebolt/types/sdk";
|
|
4
|
+
export declare enum CompressionStatus {
|
|
5
|
+
/** The compression was successful */
|
|
6
|
+
COMPRESSED = 1,
|
|
7
|
+
/** The compression failed due to the compression inflating the token count */
|
|
8
|
+
COMPRESSION_FAILED_INFLATED_TOKEN_COUNT = 2,
|
|
9
|
+
/** The compression failed due to an error counting tokens */
|
|
10
|
+
COMPRESSION_FAILED_TOKEN_COUNT_ERROR = 3,
|
|
11
|
+
/** The compression was not necessary and no action was taken */
|
|
12
|
+
NOOP = 4
|
|
13
|
+
}
|
|
14
|
+
export interface ChatCompressionInfo {
|
|
15
|
+
originalTokenCount: number;
|
|
16
|
+
newTokenCount: number;
|
|
17
|
+
compressionStatus: CompressionStatus;
|
|
18
|
+
}
|
|
19
|
+
export interface ChatCompressionOptions {
|
|
20
|
+
contextPercentageThreshold?: number;
|
|
21
|
+
enableCompression?: boolean;
|
|
22
|
+
force?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export declare class ChatCompressionModifier extends BasePreInferenceProcessor {
|
|
25
|
+
private readonly options;
|
|
26
|
+
private hasFailedCompressionAttempt;
|
|
27
|
+
constructor(options?: ChatCompressionOptions);
|
|
28
|
+
modify(originalRequest: FlatUserMessage, createdMessage: ProcessedMessage): Promise<ProcessedMessage>;
|
|
29
|
+
tryCompressChat(messages: MessageObject[], force?: boolean): Promise<ChatCompressionInfo & {
|
|
30
|
+
compressedMessages?: MessageObject[];
|
|
31
|
+
}>;
|
|
32
|
+
private countTokens;
|
|
33
|
+
private generateCompressionSummary;
|
|
34
|
+
resetCompressionState(): void;
|
|
35
|
+
}
|