@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,355 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright 2025 Google LLC
|
|
5
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.getFolderStructure = getFolderStructure;
|
|
42
|
+
exports.getDirectoryContextString = getDirectoryContextString;
|
|
43
|
+
exports.getEnvironmentContext = getEnvironmentContext;
|
|
44
|
+
exports.readMultipleFiles = readMultipleFiles;
|
|
45
|
+
const fs = __importStar(require("fs/promises"));
|
|
46
|
+
const path = __importStar(require("path"));
|
|
47
|
+
const MAX_ITEMS = 200;
|
|
48
|
+
const DEFAULT_IGNORED_FOLDERS = new Set(['node_modules', '.git', 'dist']);
|
|
49
|
+
/**
|
|
50
|
+
* Simple gitignore pattern matcher (basic implementation)
|
|
51
|
+
* For production use, consider using a dedicated gitignore library
|
|
52
|
+
*/
|
|
53
|
+
function shouldIgnoreFile(filePath, options) {
|
|
54
|
+
if (!options.respectGitIgnore && !options.respectGeminiIgnore) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
// Basic ignore patterns - in production, you'd want to read actual .gitignore/.geminiignore files
|
|
58
|
+
const commonIgnorePatterns = [
|
|
59
|
+
/node_modules/,
|
|
60
|
+
/\.git/,
|
|
61
|
+
/dist/,
|
|
62
|
+
/build/,
|
|
63
|
+
/\.DS_Store/,
|
|
64
|
+
/\.env/,
|
|
65
|
+
/\.log$/,
|
|
66
|
+
/\.tmp$/,
|
|
67
|
+
/\.cache/
|
|
68
|
+
];
|
|
69
|
+
return commonIgnorePatterns.some(pattern => pattern.test(filePath));
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Reads the full folder structure recursively
|
|
73
|
+
*/
|
|
74
|
+
async function readFullStructure(rootPath, options) {
|
|
75
|
+
const rootName = path.basename(rootPath);
|
|
76
|
+
const rootNode = {
|
|
77
|
+
name: rootName,
|
|
78
|
+
path: rootPath,
|
|
79
|
+
files: [],
|
|
80
|
+
subFolders: [],
|
|
81
|
+
totalChildren: 0,
|
|
82
|
+
totalFiles: 0,
|
|
83
|
+
};
|
|
84
|
+
const queue = [
|
|
85
|
+
{ folderInfo: rootNode, currentPath: rootPath },
|
|
86
|
+
];
|
|
87
|
+
let currentItemCount = 0;
|
|
88
|
+
const processedPaths = new Set();
|
|
89
|
+
while (queue.length > 0) {
|
|
90
|
+
const { folderInfo, currentPath } = queue.shift();
|
|
91
|
+
if (processedPaths.has(currentPath)) {
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
processedPaths.add(currentPath);
|
|
95
|
+
if (currentItemCount >= options.maxItems) {
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
let entries;
|
|
99
|
+
try {
|
|
100
|
+
const rawEntries = await fs.readdir(currentPath, { withFileTypes: true });
|
|
101
|
+
entries = rawEntries.sort((a, b) => a.name.localeCompare(b.name));
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
if (error.code === 'EACCES' || error.code === 'ENOENT') {
|
|
105
|
+
console.warn(`Warning: Could not read directory ${currentPath}: ${error.message}`);
|
|
106
|
+
if (currentPath === rootPath && error.code === 'ENOENT') {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
throw error;
|
|
112
|
+
}
|
|
113
|
+
const filesInCurrentDir = [];
|
|
114
|
+
const subFoldersInCurrentDir = [];
|
|
115
|
+
// Process files first
|
|
116
|
+
for (const entry of entries) {
|
|
117
|
+
if (entry.isFile()) {
|
|
118
|
+
if (currentItemCount >= options.maxItems) {
|
|
119
|
+
folderInfo.hasMoreFiles = true;
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
const fileName = entry.name;
|
|
123
|
+
const filePath = path.join(currentPath, fileName);
|
|
124
|
+
if (shouldIgnoreFile(filePath, options)) {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (!options.fileIncludePattern || options.fileIncludePattern.test(fileName)) {
|
|
128
|
+
filesInCurrentDir.push(fileName);
|
|
129
|
+
currentItemCount++;
|
|
130
|
+
folderInfo.totalFiles++;
|
|
131
|
+
folderInfo.totalChildren++;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
folderInfo.files = filesInCurrentDir;
|
|
136
|
+
// Process directories
|
|
137
|
+
for (const entry of entries) {
|
|
138
|
+
if (entry.isDirectory()) {
|
|
139
|
+
if (currentItemCount >= options.maxItems) {
|
|
140
|
+
folderInfo.hasMoreSubfolders = true;
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
const subFolderName = entry.name;
|
|
144
|
+
const subFolderPath = path.join(currentPath, subFolderName);
|
|
145
|
+
if (options.ignoredFolders.has(subFolderName) || shouldIgnoreFile(subFolderPath, options)) {
|
|
146
|
+
const ignoredSubFolder = {
|
|
147
|
+
name: subFolderName,
|
|
148
|
+
path: subFolderPath,
|
|
149
|
+
files: [],
|
|
150
|
+
subFolders: [],
|
|
151
|
+
totalChildren: 0,
|
|
152
|
+
totalFiles: 0,
|
|
153
|
+
isIgnored: true,
|
|
154
|
+
};
|
|
155
|
+
subFoldersInCurrentDir.push(ignoredSubFolder);
|
|
156
|
+
currentItemCount++;
|
|
157
|
+
folderInfo.totalChildren++;
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
const subFolderNode = {
|
|
161
|
+
name: subFolderName,
|
|
162
|
+
path: subFolderPath,
|
|
163
|
+
files: [],
|
|
164
|
+
subFolders: [],
|
|
165
|
+
totalChildren: 0,
|
|
166
|
+
totalFiles: 0,
|
|
167
|
+
};
|
|
168
|
+
subFoldersInCurrentDir.push(subFolderNode);
|
|
169
|
+
currentItemCount++;
|
|
170
|
+
folderInfo.totalChildren++;
|
|
171
|
+
queue.push({ folderInfo: subFolderNode, currentPath: subFolderPath });
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
folderInfo.subFolders = subFoldersInCurrentDir;
|
|
175
|
+
}
|
|
176
|
+
return rootNode;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Formats a folder structure into a readable string representation
|
|
180
|
+
*/
|
|
181
|
+
function formatFolderStructure(folderInfo, prefix = '', isLast = true) {
|
|
182
|
+
const connector = isLast ? '└── ' : '├── ';
|
|
183
|
+
const extension = isLast ? ' ' : '│ ';
|
|
184
|
+
let result = `${prefix}${connector}${folderInfo.name}`;
|
|
185
|
+
if (folderInfo.isIgnored) {
|
|
186
|
+
result += ' (ignored)';
|
|
187
|
+
}
|
|
188
|
+
result += '\n';
|
|
189
|
+
// Add files
|
|
190
|
+
const allFiles = [...folderInfo.files];
|
|
191
|
+
if (folderInfo.hasMoreFiles) {
|
|
192
|
+
allFiles.push('...');
|
|
193
|
+
}
|
|
194
|
+
allFiles.forEach((file, index) => {
|
|
195
|
+
const isLastFile = index === allFiles.length - 1 && folderInfo.subFolders.length === 0;
|
|
196
|
+
const fileConnector = isLastFile ? '└── ' : '├── ';
|
|
197
|
+
result += `${prefix}${extension}${fileConnector}${file}\n`;
|
|
198
|
+
});
|
|
199
|
+
// Add subfolders
|
|
200
|
+
folderInfo.subFolders.forEach((subFolder, index) => {
|
|
201
|
+
const isLastSubFolder = index === folderInfo.subFolders.length - 1;
|
|
202
|
+
result += formatFolderStructure(subFolder, prefix + extension, isLastSubFolder);
|
|
203
|
+
});
|
|
204
|
+
if (folderInfo.hasMoreSubfolders) {
|
|
205
|
+
const moreConnector = '└── ';
|
|
206
|
+
result += `${prefix}${extension}${moreConnector}...\n`;
|
|
207
|
+
}
|
|
208
|
+
return result;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Standalone version of getFolderStructure
|
|
212
|
+
*/
|
|
213
|
+
async function getFolderStructure(targetPath, options = {}) {
|
|
214
|
+
var _a, _b, _c, _d, _e;
|
|
215
|
+
const mergedOptions = {
|
|
216
|
+
maxItems: (_a = options.maxItems) !== null && _a !== void 0 ? _a : MAX_ITEMS,
|
|
217
|
+
ignoredFolders: (_b = options.ignoredFolders) !== null && _b !== void 0 ? _b : DEFAULT_IGNORED_FOLDERS,
|
|
218
|
+
fileIncludePattern: (_c = options.fileIncludePattern) !== null && _c !== void 0 ? _c : /.*/,
|
|
219
|
+
respectGitIgnore: (_d = options.respectGitIgnore) !== null && _d !== void 0 ? _d : true,
|
|
220
|
+
respectGeminiIgnore: (_e = options.respectGeminiIgnore) !== null && _e !== void 0 ? _e : true,
|
|
221
|
+
};
|
|
222
|
+
try {
|
|
223
|
+
const folderInfo = await readFullStructure(targetPath, mergedOptions);
|
|
224
|
+
if (!folderInfo) {
|
|
225
|
+
return `Error: Directory not found or inaccessible: ${targetPath}`;
|
|
226
|
+
}
|
|
227
|
+
return formatFolderStructure(folderInfo).trim();
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
return `Error reading folder structure: ${error.message}`;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Standalone version of getDirectoryContextString
|
|
235
|
+
*/
|
|
236
|
+
async function getDirectoryContextString(workspaceDirectories, options = {}) {
|
|
237
|
+
const folderStructures = await Promise.all(workspaceDirectories.map((dir) => getFolderStructure(dir, options)));
|
|
238
|
+
const folderStructure = folderStructures.join('\n');
|
|
239
|
+
let workingDirPreamble;
|
|
240
|
+
if (workspaceDirectories.length === 1) {
|
|
241
|
+
workingDirPreamble = `I'm currently working in the directory: ${workspaceDirectories[0]}`;
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
const dirList = workspaceDirectories.map((dir) => ` - ${dir}`).join('\n');
|
|
245
|
+
workingDirPreamble = `I'm currently working in the following directories:\n${dirList}`;
|
|
246
|
+
}
|
|
247
|
+
return `${workingDirPreamble}
|
|
248
|
+
Here is the folder structure of the current working directories:
|
|
249
|
+
|
|
250
|
+
${folderStructure}`;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Standalone version of getEnvironmentContext
|
|
254
|
+
*/
|
|
255
|
+
async function getEnvironmentContext(options) {
|
|
256
|
+
const today = new Date().toLocaleDateString(undefined, {
|
|
257
|
+
weekday: 'long',
|
|
258
|
+
year: 'numeric',
|
|
259
|
+
month: 'long',
|
|
260
|
+
day: 'numeric',
|
|
261
|
+
});
|
|
262
|
+
const platform = process.platform;
|
|
263
|
+
const directoryContext = await getDirectoryContextString(options.workspaceDirectories, {
|
|
264
|
+
maxItems: options.maxItems,
|
|
265
|
+
ignoredFolders: options.ignoredFolders,
|
|
266
|
+
fileIncludePattern: options.fileIncludePattern,
|
|
267
|
+
respectGitIgnore: options.respectGitIgnore,
|
|
268
|
+
respectGeminiIgnore: options.respectGeminiIgnore,
|
|
269
|
+
});
|
|
270
|
+
const context = `
|
|
271
|
+
This is the Gemini CLI. We are setting up the context for our chat.
|
|
272
|
+
Today's date is ${today}.
|
|
273
|
+
My operating system is: ${platform}
|
|
274
|
+
${directoryContext}
|
|
275
|
+
`.trim();
|
|
276
|
+
const initialParts = [{ text: context }];
|
|
277
|
+
// Add full file context if requested
|
|
278
|
+
if (options.includeFullContext) {
|
|
279
|
+
try {
|
|
280
|
+
// This is a simplified version - in the original, this would use read_many_files tool
|
|
281
|
+
// For standalone use, you might want to implement your own file reading logic
|
|
282
|
+
const fullContextNote = `
|
|
283
|
+
--- Full File Context (Standalone Version) ---
|
|
284
|
+
Note: Full file context reading would require implementing file reading logic
|
|
285
|
+
based on your specific needs. The original implementation uses the read_many_files tool
|
|
286
|
+
from the Gemini CLI tool registry.
|
|
287
|
+
`;
|
|
288
|
+
initialParts.push({ text: fullContextNote });
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
console.error('Error reading full file context:', error);
|
|
292
|
+
initialParts.push({
|
|
293
|
+
text: '\n--- Error reading full file context ---',
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return initialParts;
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Utility function to read multiple files (basic implementation for full context)
|
|
301
|
+
* This is a simplified version - extend as needed for your use case
|
|
302
|
+
*/
|
|
303
|
+
async function readMultipleFiles(basePath, patterns = ['**/*'], options = {}) {
|
|
304
|
+
// This is a basic implementation - for production use, consider using a glob library
|
|
305
|
+
// like 'glob' or 'fast-glob' for pattern matching
|
|
306
|
+
try {
|
|
307
|
+
const files = [];
|
|
308
|
+
async function collectFiles(dirPath, currentDepth = 0) {
|
|
309
|
+
var _a;
|
|
310
|
+
if (currentDepth > 10)
|
|
311
|
+
return; // Prevent infinite recursion
|
|
312
|
+
try {
|
|
313
|
+
const entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
314
|
+
for (const entry of entries) {
|
|
315
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
316
|
+
if (shouldIgnoreFile(fullPath, options)) {
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
if (entry.isFile()) {
|
|
320
|
+
files.push(fullPath);
|
|
321
|
+
}
|
|
322
|
+
else if (entry.isDirectory() && !((_a = options.ignoredFolders) === null || _a === void 0 ? void 0 : _a.has(entry.name))) {
|
|
323
|
+
await collectFiles(fullPath, currentDepth + 1);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
catch (error) {
|
|
328
|
+
// Skip directories we can't read
|
|
329
|
+
console.warn(`Warning: Could not read directory ${dirPath}: ${error.message}`);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
await collectFiles(basePath);
|
|
333
|
+
// Read file contents (limit to reasonable size)
|
|
334
|
+
const fileContents = [];
|
|
335
|
+
for (const filePath of files.slice(0, 100)) { // Limit to first 100 files
|
|
336
|
+
try {
|
|
337
|
+
const stats = await fs.stat(filePath);
|
|
338
|
+
if (stats.size > 100 * 1024) { // Skip files larger than 100KB
|
|
339
|
+
fileContents.push(`${filePath}: [File too large, skipped]`);
|
|
340
|
+
continue;
|
|
341
|
+
}
|
|
342
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
343
|
+
const relativePath = path.relative(basePath, filePath);
|
|
344
|
+
fileContents.push(`--- ${relativePath} ---\n${content}\n`);
|
|
345
|
+
}
|
|
346
|
+
catch (error) {
|
|
347
|
+
fileContents.push(`${filePath}: [Error reading file: ${error.message}]`);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
return fileContents.join('\n');
|
|
351
|
+
}
|
|
352
|
+
catch (error) {
|
|
353
|
+
return `Error reading multiple files: ${error.message}`;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ProcessedMessage } from "@codebolt/types/agent";
|
|
2
|
+
import { BaseMessageModifier } from "../base";
|
|
3
|
+
import { FlatUserMessage } from "@codebolt/types/sdk";
|
|
4
|
+
export interface EnvironmentContextOptions {
|
|
5
|
+
enableFullContext?: boolean;
|
|
6
|
+
maxFiles?: number;
|
|
7
|
+
maxFileSize?: number;
|
|
8
|
+
includePatterns?: string[];
|
|
9
|
+
excludePatterns?: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare class EnvironmentContextModifier extends BaseMessageModifier {
|
|
12
|
+
private readonly options;
|
|
13
|
+
private readonly defaultExcludePatterns;
|
|
14
|
+
constructor(options?: EnvironmentContextOptions);
|
|
15
|
+
modify(originalRequest: FlatUserMessage, createdMessage: ProcessedMessage): Promise<ProcessedMessage>;
|
|
16
|
+
private generateFullContext;
|
|
17
|
+
private findRelevantFiles;
|
|
18
|
+
private walkDirectory;
|
|
19
|
+
private isExcluded;
|
|
20
|
+
private isIncluded;
|
|
21
|
+
private matchesPattern;
|
|
22
|
+
private countContextFiles;
|
|
23
|
+
enableFullContext(): void;
|
|
24
|
+
disableFullContext(): void;
|
|
25
|
+
isFullContextEnabled(): boolean;
|
|
26
|
+
}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.EnvironmentContextModifier = void 0;
|
|
40
|
+
const base_1 = require("../base");
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const codeboltjs_1 = __importDefault(require("@codebolt/codeboltjs"));
|
|
44
|
+
class EnvironmentContextModifier extends base_1.BaseMessageModifier {
|
|
45
|
+
constructor(options = {}) {
|
|
46
|
+
super();
|
|
47
|
+
this.defaultExcludePatterns = [
|
|
48
|
+
'node_modules/**',
|
|
49
|
+
'.git/**',
|
|
50
|
+
'dist/**',
|
|
51
|
+
'build/**',
|
|
52
|
+
'*.log',
|
|
53
|
+
'*.tmp',
|
|
54
|
+
'.DS_Store',
|
|
55
|
+
'coverage/**',
|
|
56
|
+
'.next/**',
|
|
57
|
+
'.nuxt/**',
|
|
58
|
+
'.codebolt',
|
|
59
|
+
'.codebolt/**',
|
|
60
|
+
];
|
|
61
|
+
this.options = {
|
|
62
|
+
enableFullContext: options.enableFullContext || false,
|
|
63
|
+
maxFiles: options.maxFiles || 100,
|
|
64
|
+
maxFileSize: options.maxFileSize || 100 * 1024, // 100KB per file
|
|
65
|
+
includePatterns: options.includePatterns || ['**/*.ts', '**/*.js', '**/*.json', '**/*.md', '**/*.txt', '**/*.yml', '**/*.yaml'],
|
|
66
|
+
excludePatterns: [...this.defaultExcludePatterns, ...(options.excludePatterns || [])]
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
async modify(originalRequest, createdMessage) {
|
|
70
|
+
try {
|
|
71
|
+
// Get current date formatted to user's locale
|
|
72
|
+
const today = new Date().toLocaleDateString(undefined, {
|
|
73
|
+
weekday: 'long',
|
|
74
|
+
year: 'numeric',
|
|
75
|
+
month: 'long',
|
|
76
|
+
day: 'numeric',
|
|
77
|
+
});
|
|
78
|
+
const platform = process.platform;
|
|
79
|
+
const { projectPath } = await codeboltjs_1.default.project.getProjectPath();
|
|
80
|
+
if (!projectPath) {
|
|
81
|
+
return createdMessage;
|
|
82
|
+
}
|
|
83
|
+
const currentDir = projectPath;
|
|
84
|
+
// Get basic directory listing
|
|
85
|
+
let directoryListing = '';
|
|
86
|
+
try {
|
|
87
|
+
const files = await fs.promises.readdir(currentDir);
|
|
88
|
+
const fileList = files.slice(0, 20).join(', '); // Limit to first 20 files
|
|
89
|
+
const moreFiles = files.length > 20 ? ` ... and ${files.length - 20} more files` : '';
|
|
90
|
+
directoryListing = `Files in current directory: ${fileList}${moreFiles}`;
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
directoryListing = 'Unable to read current directory';
|
|
94
|
+
}
|
|
95
|
+
const environmentContext = `
|
|
96
|
+
This is the CodeBolt AI Agent. Setting up context for our chat.
|
|
97
|
+
Today's date is ${today} (formatted according to the user's locale).
|
|
98
|
+
Operating system: ${platform}
|
|
99
|
+
Current working directory: ${currentDir}
|
|
100
|
+
${directoryListing}
|
|
101
|
+
`.trim();
|
|
102
|
+
// Prepare context parts (same as gemini-cli)
|
|
103
|
+
const contextParts = [environmentContext];
|
|
104
|
+
// Add full file context if enabled (just like gemini-cli does)
|
|
105
|
+
if (this.options.enableFullContext) {
|
|
106
|
+
try {
|
|
107
|
+
const fullContextContent = await this.generateFullContext(currentDir);
|
|
108
|
+
if (fullContextContent) {
|
|
109
|
+
contextParts.push(`\n--- Full File Context ---\n${fullContextContent}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
console.error('Error reading full file context:', error);
|
|
114
|
+
contextParts.push('\n--- Error reading full file context ---');
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const finalContent = contextParts.join('\n\n');
|
|
118
|
+
const contextMessage = {
|
|
119
|
+
role: 'user',
|
|
120
|
+
content: finalContent
|
|
121
|
+
};
|
|
122
|
+
// Push the context message to the messages array
|
|
123
|
+
const messages = [...createdMessage.message.messages];
|
|
124
|
+
messages.push(contextMessage);
|
|
125
|
+
return Promise.resolve({
|
|
126
|
+
message: {
|
|
127
|
+
...createdMessage.message,
|
|
128
|
+
messages
|
|
129
|
+
},
|
|
130
|
+
metadata: {
|
|
131
|
+
...createdMessage.metadata,
|
|
132
|
+
environmentContextAdded: true,
|
|
133
|
+
fullContextAdded: this.options.enableFullContext,
|
|
134
|
+
contextFilesCount: this.options.enableFullContext ? await this.countContextFiles(currentDir) : 0,
|
|
135
|
+
environmentInfo: {
|
|
136
|
+
date: today,
|
|
137
|
+
platform,
|
|
138
|
+
currentDir
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
console.error('Error in EnvironmentContextModifier:', error);
|
|
145
|
+
return createdMessage;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Full context methods (integrated like gemini-cli)
|
|
149
|
+
async generateFullContext(basePath) {
|
|
150
|
+
try {
|
|
151
|
+
const files = await this.findRelevantFiles(basePath);
|
|
152
|
+
const contextParts = [];
|
|
153
|
+
let processedFiles = 0;
|
|
154
|
+
for (const filePath of files) {
|
|
155
|
+
if (processedFiles >= this.options.maxFiles) {
|
|
156
|
+
contextParts.push(`\n... (${files.length - processedFiles} more files not shown due to limit)\n`);
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
try {
|
|
160
|
+
const relativePath = path.relative(basePath, filePath);
|
|
161
|
+
const stats = await fs.promises.stat(filePath);
|
|
162
|
+
// Skip files that are too large
|
|
163
|
+
if (stats.size > this.options.maxFileSize) {
|
|
164
|
+
contextParts.push(`--- ${relativePath} ---\n[File too large: ${stats.size} bytes]\n`);
|
|
165
|
+
processedFiles++;
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
const content = await fs.promises.readFile(filePath, 'utf-8');
|
|
169
|
+
contextParts.push(`--- ${relativePath} ---\n${content}\n`);
|
|
170
|
+
processedFiles++;
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
const relativePath = path.relative(basePath, filePath);
|
|
174
|
+
contextParts.push(`--- ${relativePath} ---\n[Error reading file: ${error instanceof Error ? error.message : 'Unknown error'}]\n`);
|
|
175
|
+
processedFiles++;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return contextParts.join('\n');
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
console.error('Error generating full context:', error);
|
|
182
|
+
return '';
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
async findRelevantFiles(basePath) {
|
|
186
|
+
const files = [];
|
|
187
|
+
try {
|
|
188
|
+
await this.walkDirectory(basePath, files, basePath);
|
|
189
|
+
return files.sort();
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
console.error('Error finding relevant files:', error);
|
|
193
|
+
return [];
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
async walkDirectory(dir, files, basePath) {
|
|
197
|
+
try {
|
|
198
|
+
const entries = await fs.promises.readdir(dir, { withFileTypes: true });
|
|
199
|
+
for (const entry of entries) {
|
|
200
|
+
const fullPath = path.join(dir, entry.name);
|
|
201
|
+
const relativePath = path.relative(basePath, fullPath);
|
|
202
|
+
// Check exclusion patterns
|
|
203
|
+
if (this.isExcluded(relativePath)) {
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
if (entry.isDirectory()) {
|
|
207
|
+
await this.walkDirectory(fullPath, files, basePath);
|
|
208
|
+
}
|
|
209
|
+
else if (entry.isFile()) {
|
|
210
|
+
// Check inclusion patterns
|
|
211
|
+
if (this.isIncluded(relativePath)) {
|
|
212
|
+
files.push(fullPath);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
// Skip directories we can't read
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
isExcluded(relativePath) {
|
|
222
|
+
return this.options.excludePatterns.some(pattern => {
|
|
223
|
+
return this.matchesPattern(relativePath, pattern);
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
isIncluded(relativePath) {
|
|
227
|
+
return this.options.includePatterns.some(pattern => {
|
|
228
|
+
return this.matchesPattern(relativePath, pattern);
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
matchesPattern(filePath, pattern) {
|
|
232
|
+
// Simple glob pattern matching - in production, use a proper glob library
|
|
233
|
+
const regexPattern = pattern
|
|
234
|
+
.replace(/\*\*/g, '.*')
|
|
235
|
+
.replace(/\*/g, '[^/]*')
|
|
236
|
+
.replace(/\?/g, '.');
|
|
237
|
+
const regex = new RegExp(`^${regexPattern}$`);
|
|
238
|
+
return regex.test(filePath);
|
|
239
|
+
}
|
|
240
|
+
async countContextFiles(basePath) {
|
|
241
|
+
try {
|
|
242
|
+
const files = await this.findRelevantFiles(basePath);
|
|
243
|
+
return Math.min(files.length, this.options.maxFiles);
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
return 0;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
// Public methods to control full context
|
|
250
|
+
enableFullContext() {
|
|
251
|
+
this.options.enableFullContext = true;
|
|
252
|
+
}
|
|
253
|
+
disableFullContext() {
|
|
254
|
+
this.options.enableFullContext = false;
|
|
255
|
+
}
|
|
256
|
+
isFullContextEnabled() {
|
|
257
|
+
return this.options.enableFullContext || false;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
exports.EnvironmentContextModifier = EnvironmentContextModifier;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { FlatUserMessage } from '@codebolt/types/sdk';
|
|
2
|
+
import { BaseMessageModifier, ProcessedMessage } from '../../processor';
|
|
3
|
+
export interface HandleUrlMessageModifierOptions {
|
|
4
|
+
googleSearchEnabled?: boolean;
|
|
5
|
+
fetchUrlContent?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare class HandleUrlMessageModifier extends BaseMessageModifier {
|
|
8
|
+
private readonly googleSearchEnabled;
|
|
9
|
+
private readonly fetchUrlContent;
|
|
10
|
+
constructor(options?: HandleUrlMessageModifierOptions);
|
|
11
|
+
modify(originalRequest: FlatUserMessage, createdMessage: ProcessedMessage): Promise<ProcessedMessage>;
|
|
12
|
+
private extractUrls;
|
|
13
|
+
}
|