@codebolt/agent 1.2.1 → 2.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +157 -66
- package/dist/builderpattern/agent.d.ts +86 -0
- package/dist/builderpattern/agent.js +324 -0
- package/dist/builderpattern/followupquestionbuilder.d.ts +75 -0
- package/dist/builderpattern/followupquestionbuilder.js +197 -0
- package/dist/builderpattern/index.d.ts +14 -0
- package/dist/builderpattern/index.js +23 -0
- package/dist/builderpattern/llmoutputhandler.d.ts +102 -0
- package/dist/builderpattern/llmoutputhandler.js +452 -0
- package/dist/builderpattern/promptbuilder.d.ts +382 -0
- package/dist/builderpattern/promptbuilder.js +805 -0
- package/dist/builderpattern/systemprompt.d.ts +20 -0
- package/dist/builderpattern/systemprompt.js +48 -0
- package/dist/builderpattern/taskInstruction.d.ts +37 -0
- package/dist/builderpattern/taskInstruction.js +57 -0
- package/dist/builderpattern/usermessage.d.ts +70 -0
- package/dist/builderpattern/usermessage.js +123 -0
- 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 +405 -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/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 +94 -0
- package/dist/processor/types/interfaces.js +2 -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/addToolsListMessageModifier.d.ts +22 -0
- package/dist/processor-pieces/messageModifiers/addToolsListMessageModifier.js +144 -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 +15 -0
- package/dist/processor-pieces/messageModifiers/baseContextMessageModifier.js +75 -0
- package/dist/processor-pieces/messageModifiers/baseSystemInstructionMessageModifier.d.ts +11 -0
- package/dist/processor-pieces/messageModifiers/baseSystemInstructionMessageModifier.js +46 -0
- package/dist/processor-pieces/messageModifiers/chatHistoryMessageModifier.d.ts +18 -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/environmentContextModifier.d.ts +26 -0
- package/dist/processor-pieces/messageModifiers/environmentContextModifier.js +260 -0
- package/dist/processor-pieces/messageModifiers/handleUrlMessageModifier.d.ts +12 -0
- package/dist/processor-pieces/messageModifiers/handleUrlMessageModifier.js +60 -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 +18 -0
- package/dist/processor-pieces/messageModifiers/imageAttachmentMessageModifier.js +222 -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/toolInjectionModifier.d.ts +20 -0
- package/dist/processor-pieces/messageModifiers/toolInjectionModifier.js +152 -0
- package/dist/processor-pieces/messageModifiers/workingDirectoryMessageModifier.d.ts +22 -0
- package/dist/processor-pieces/messageModifiers/workingDirectoryMessageModifier.js +194 -0
- package/dist/processor-pieces/postInferenceProcessors/loopDetectionModifier.d.ts +29 -0
- package/dist/processor-pieces/postInferenceProcessors/loopDetectionModifier.js +174 -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/preInferenceProcessors/chatCompressionModifier.d.ts +35 -0
- package/dist/processor-pieces/preInferenceProcessors/chatCompressionModifier.js +255 -0
- package/dist/processor-pieces/preInferenceProcessors/index.d.ts +1 -0
- package/dist/processor-pieces/preInferenceProcessors/index.js +2 -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/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/index.d.ts +18 -0
- package/dist/unified/index.js +42 -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 +29 -7
|
@@ -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,12 @@
|
|
|
1
|
+
import { BaseMessageModifier, MessageModifierInput, ProcessedMessage } from '../../processor';
|
|
2
|
+
export interface HandleUrlMessageModifierOptions {
|
|
3
|
+
googleSearchEnabled?: boolean;
|
|
4
|
+
fetchUrlContent?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare class HandleUrlMessageModifier extends BaseMessageModifier {
|
|
7
|
+
private readonly googleSearchEnabled;
|
|
8
|
+
private readonly fetchUrlContent;
|
|
9
|
+
constructor(options?: HandleUrlMessageModifierOptions);
|
|
10
|
+
modify(input: MessageModifierInput): Promise<ProcessedMessage>;
|
|
11
|
+
private extractUrls;
|
|
12
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HandleUrlMessageModifier = void 0;
|
|
4
|
+
const processor_1 = require("../../processor");
|
|
5
|
+
class HandleUrlMessageModifier extends processor_1.BaseMessageModifier {
|
|
6
|
+
constructor(options = {}) {
|
|
7
|
+
super({ context: options });
|
|
8
|
+
this.googleSearchEnabled = options.googleSearchEnabled || false;
|
|
9
|
+
this.fetchUrlContent = options.fetchUrlContent || false;
|
|
10
|
+
}
|
|
11
|
+
async modify(input) {
|
|
12
|
+
try {
|
|
13
|
+
const { originalRequest, createdMessage, context } = input;
|
|
14
|
+
// Check if the request contains URLs
|
|
15
|
+
const urls = this.extractUrls(originalRequest);
|
|
16
|
+
if (urls.length > 0) {
|
|
17
|
+
let contextContent = `URLs detected: ${urls.join(', ')}. ${this.googleSearchEnabled ? 'Google search is enabled.' : 'Google search is disabled.'}`;
|
|
18
|
+
// Fetch URL content if enabled
|
|
19
|
+
if (this.fetchUrlContent) {
|
|
20
|
+
contextContent += '\n\nURL Content Fetching: Enabled (content would be fetched in a real implementation)';
|
|
21
|
+
// In a real implementation, you would fetch the content here
|
|
22
|
+
// const urlContents = await Promise.all(urls.map(url => this.fetchContent(url)));
|
|
23
|
+
}
|
|
24
|
+
// Add URL context to the message
|
|
25
|
+
const urlContextMessage = {
|
|
26
|
+
role: 'system',
|
|
27
|
+
content: contextContent,
|
|
28
|
+
name: 'url-detector'
|
|
29
|
+
};
|
|
30
|
+
return {
|
|
31
|
+
messages: [...createdMessage.messages, urlContextMessage],
|
|
32
|
+
metadata: {
|
|
33
|
+
...createdMessage.metadata,
|
|
34
|
+
urlsDetected: urls,
|
|
35
|
+
googleSearchEnabled: this.googleSearchEnabled,
|
|
36
|
+
fetchUrlContent: this.fetchUrlContent
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return createdMessage;
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
console.error('Error in HandleUrlMessageModifier:', error);
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
extractUrls(request) {
|
|
48
|
+
if (typeof request === 'string') {
|
|
49
|
+
const urlRegex = /https?:\/\/[^\s]+/g;
|
|
50
|
+
return request.match(urlRegex) || [];
|
|
51
|
+
}
|
|
52
|
+
if (typeof request === 'object' && request !== null) {
|
|
53
|
+
const requestString = JSON.stringify(request);
|
|
54
|
+
const urlRegex = /https?:\/\/[^\s]+/g;
|
|
55
|
+
return requestString.match(urlRegex) || [];
|
|
56
|
+
}
|
|
57
|
+
return [];
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.HandleUrlMessageModifier = HandleUrlMessageModifier;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ProcessedMessage } from "@codebolt/types/agent";
|
|
2
|
+
import { BaseMessageModifier } from "../base";
|
|
3
|
+
import { FlatUserMessage } from "@codebolt/types/sdk";
|
|
4
|
+
export interface IdeContextOptions {
|
|
5
|
+
includeOpenFiles?: boolean;
|
|
6
|
+
includeActiveFile?: boolean;
|
|
7
|
+
includeCursorPosition?: boolean;
|
|
8
|
+
includeSelectedText?: boolean;
|
|
9
|
+
maxOpenFiles?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface FileInfo {
|
|
12
|
+
path: string;
|
|
13
|
+
isActive?: boolean;
|
|
14
|
+
cursor?: {
|
|
15
|
+
line: number;
|
|
16
|
+
character: number;
|
|
17
|
+
};
|
|
18
|
+
selectedText?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface IdeContext {
|
|
21
|
+
workspaceState?: {
|
|
22
|
+
openFiles: FileInfo[];
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export declare class IdeContextModifier extends BaseMessageModifier {
|
|
26
|
+
private readonly options;
|
|
27
|
+
private lastSentIdeContext?;
|
|
28
|
+
private forceFullContext;
|
|
29
|
+
constructor(options?: IdeContextOptions);
|
|
30
|
+
modify(originalRequest: FlatUserMessage, createdMessage: ProcessedMessage): Promise<ProcessedMessage>;
|
|
31
|
+
private getIdeContext;
|
|
32
|
+
private getIdeContextParts;
|
|
33
|
+
setForceFullContext(force: boolean): void;
|
|
34
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IdeContextModifier = void 0;
|
|
4
|
+
const base_1 = require("../base");
|
|
5
|
+
class IdeContextModifier extends base_1.BaseMessageModifier {
|
|
6
|
+
constructor(options = {}) {
|
|
7
|
+
super();
|
|
8
|
+
this.forceFullContext = true;
|
|
9
|
+
this.options = {
|
|
10
|
+
includeOpenFiles: options.includeOpenFiles !== false,
|
|
11
|
+
includeActiveFile: options.includeActiveFile !== false,
|
|
12
|
+
includeCursorPosition: options.includeCursorPosition !== false,
|
|
13
|
+
includeSelectedText: options.includeSelectedText !== false,
|
|
14
|
+
maxOpenFiles: options.maxOpenFiles || 10
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
modify(originalRequest, createdMessage) {
|
|
18
|
+
try {
|
|
19
|
+
// Get IDE context from the original request (activeFile, openedFiles)
|
|
20
|
+
const ideContext = this.getIdeContext(originalRequest, createdMessage.metadata);
|
|
21
|
+
if (!ideContext) {
|
|
22
|
+
return Promise.resolve(createdMessage);
|
|
23
|
+
}
|
|
24
|
+
const { contextParts, newIdeContext } = this.getIdeContextParts(this.forceFullContext, ideContext);
|
|
25
|
+
if (contextParts.length === 0) {
|
|
26
|
+
return Promise.resolve(createdMessage);
|
|
27
|
+
}
|
|
28
|
+
const ideContextMessage = {
|
|
29
|
+
role: 'system',
|
|
30
|
+
content: contextParts.join('\n')
|
|
31
|
+
};
|
|
32
|
+
// Find existing system message or add new one
|
|
33
|
+
const messages = [...createdMessage.message.messages];
|
|
34
|
+
const systemMessageIndex = messages.findIndex(msg => msg.role === 'system');
|
|
35
|
+
if (systemMessageIndex !== -1) {
|
|
36
|
+
// Append to existing system message
|
|
37
|
+
messages[systemMessageIndex] = {
|
|
38
|
+
...messages[systemMessageIndex],
|
|
39
|
+
content: `${messages[systemMessageIndex].content}\n\n${ideContextMessage.content}`
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
// Add new system message
|
|
44
|
+
messages.unshift(ideContextMessage);
|
|
45
|
+
}
|
|
46
|
+
this.lastSentIdeContext = newIdeContext;
|
|
47
|
+
this.forceFullContext = false;
|
|
48
|
+
return Promise.resolve({
|
|
49
|
+
message: {
|
|
50
|
+
...createdMessage.message,
|
|
51
|
+
messages
|
|
52
|
+
},
|
|
53
|
+
metadata: {
|
|
54
|
+
...createdMessage.metadata,
|
|
55
|
+
ideContextAdded: true,
|
|
56
|
+
ideContextType: this.forceFullContext ? 'full' : 'incremental'
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
console.error('Error in IdeContextModifier:', error);
|
|
62
|
+
return Promise.resolve(createdMessage);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
getIdeContext(originalRequest, metadata) {
|
|
66
|
+
// Try to get IDE context from the metadata parameter first
|
|
67
|
+
if (metadata === null || metadata === void 0 ? void 0 : metadata.ideContext) {
|
|
68
|
+
return metadata.ideContext;
|
|
69
|
+
}
|
|
70
|
+
// Extract IDE context from the original message
|
|
71
|
+
const activeFile = originalRequest.activeFile;
|
|
72
|
+
const openedFiles = originalRequest.openedFiles;
|
|
73
|
+
if (!activeFile && (!openedFiles || openedFiles.length === 0)) {
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
const openFiles = [];
|
|
77
|
+
// Add active file if present (activeFile is just a path string)
|
|
78
|
+
if (activeFile) {
|
|
79
|
+
const activeFileInfo = {
|
|
80
|
+
path: activeFile,
|
|
81
|
+
isActive: true
|
|
82
|
+
};
|
|
83
|
+
openFiles.push(activeFileInfo);
|
|
84
|
+
}
|
|
85
|
+
// Add other opened files (openedFiles is array of path strings)
|
|
86
|
+
if (openedFiles && Array.isArray(openedFiles)) {
|
|
87
|
+
const otherFiles = openedFiles
|
|
88
|
+
.filter(filePath => filePath !== activeFile) // Exclude active file from others
|
|
89
|
+
.map(filePath => ({
|
|
90
|
+
path: filePath,
|
|
91
|
+
isActive: false
|
|
92
|
+
}));
|
|
93
|
+
openFiles.push(...otherFiles);
|
|
94
|
+
}
|
|
95
|
+
if (openFiles.length === 0) {
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
workspaceState: {
|
|
100
|
+
openFiles
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
getIdeContextParts(forceFullContext, currentIdeContext) {
|
|
105
|
+
var _a;
|
|
106
|
+
if (!((_a = currentIdeContext === null || currentIdeContext === void 0 ? void 0 : currentIdeContext.workspaceState) === null || _a === void 0 ? void 0 : _a.openFiles)) {
|
|
107
|
+
return { contextParts: [], newIdeContext: undefined };
|
|
108
|
+
}
|
|
109
|
+
if (forceFullContext || !this.lastSentIdeContext) {
|
|
110
|
+
// Send full context as JSON
|
|
111
|
+
const openFiles = currentIdeContext.workspaceState.openFiles;
|
|
112
|
+
const activeFile = openFiles.find((f) => f.isActive);
|
|
113
|
+
const otherOpenFiles = openFiles
|
|
114
|
+
.filter((f) => !f.isActive)
|
|
115
|
+
.map((f) => f.path)
|
|
116
|
+
.slice(0, this.options.maxOpenFiles - 1); // Reserve space for active file
|
|
117
|
+
const contextData = {};
|
|
118
|
+
if (activeFile && this.options.includeActiveFile) {
|
|
119
|
+
const activeFileData = {
|
|
120
|
+
path: activeFile.path
|
|
121
|
+
};
|
|
122
|
+
if (this.options.includeCursorPosition && activeFile.cursor) {
|
|
123
|
+
activeFileData.cursor = {
|
|
124
|
+
line: activeFile.cursor.line,
|
|
125
|
+
character: activeFile.cursor.character,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
if (this.options.includeSelectedText && activeFile.selectedText) {
|
|
129
|
+
activeFileData.selectedText = activeFile.selectedText;
|
|
130
|
+
}
|
|
131
|
+
contextData['activeFile'] = activeFileData;
|
|
132
|
+
}
|
|
133
|
+
if (this.options.includeOpenFiles && otherOpenFiles.length > 0) {
|
|
134
|
+
contextData['otherOpenFiles'] = otherOpenFiles;
|
|
135
|
+
}
|
|
136
|
+
if (Object.keys(contextData).length === 0) {
|
|
137
|
+
return { contextParts: [], newIdeContext: currentIdeContext };
|
|
138
|
+
}
|
|
139
|
+
const jsonString = JSON.stringify(contextData, null, 2);
|
|
140
|
+
const contextParts = [
|
|
141
|
+
"Here is the user's editor context as a JSON object. This is for your information only.",
|
|
142
|
+
'```json',
|
|
143
|
+
jsonString,
|
|
144
|
+
'```',
|
|
145
|
+
"Don't acknowledge this context in your response unless specifically asked about it."
|
|
146
|
+
];
|
|
147
|
+
return { contextParts, newIdeContext: currentIdeContext };
|
|
148
|
+
}
|
|
149
|
+
// For incremental updates, we would compare with lastSentIdeContext
|
|
150
|
+
// and only send changes. For now, we'll skip incremental updates.
|
|
151
|
+
return { contextParts: [], newIdeContext: currentIdeContext };
|
|
152
|
+
}
|
|
153
|
+
setForceFullContext(force) {
|
|
154
|
+
this.forceFullContext = force;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
exports.IdeContextModifier = IdeContextModifier;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { BaseMessageModifier, MessageModifierInput, ProcessedMessage } from '../../processor';
|
|
2
|
+
export interface ImageAttachmentMessageModifierOptions {
|
|
3
|
+
passImageAs?: 'URL' | 'Base64' | 'Path';
|
|
4
|
+
supportedFormats?: string[];
|
|
5
|
+
maxImageSize?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare class ImageAttachmentMessageModifier extends BaseMessageModifier {
|
|
8
|
+
private readonly passImageAs;
|
|
9
|
+
private readonly supportedFormats;
|
|
10
|
+
private readonly maxImageSize;
|
|
11
|
+
constructor(options?: ImageAttachmentMessageModifierOptions);
|
|
12
|
+
modify(input: MessageModifierInput): Promise<ProcessedMessage>;
|
|
13
|
+
private extractImageReferences;
|
|
14
|
+
private isImagePath;
|
|
15
|
+
private processImage;
|
|
16
|
+
private processUrlImage;
|
|
17
|
+
private processLocalImage;
|
|
18
|
+
}
|