@codebolt/agent 1.1.0 → 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.
Files changed (183) hide show
  1. package/README.md +157 -66
  2. package/dist/builderpattern/agent.d.ts +86 -0
  3. package/dist/builderpattern/agent.js +324 -0
  4. package/dist/builderpattern/followupquestionbuilder.d.ts +75 -0
  5. package/dist/builderpattern/followupquestionbuilder.js +197 -0
  6. package/dist/builderpattern/index.d.ts +14 -0
  7. package/dist/builderpattern/index.js +23 -0
  8. package/dist/builderpattern/llmoutputhandler.d.ts +102 -0
  9. package/dist/builderpattern/llmoutputhandler.js +452 -0
  10. package/dist/builderpattern/promptbuilder.d.ts +382 -0
  11. package/dist/builderpattern/promptbuilder.js +805 -0
  12. package/dist/builderpattern/systemprompt.d.ts +20 -0
  13. package/dist/builderpattern/systemprompt.js +48 -0
  14. package/dist/builderpattern/taskInstruction.d.ts +37 -0
  15. package/dist/builderpattern/taskInstruction.js +57 -0
  16. package/dist/builderpattern/usermessage.d.ts +70 -0
  17. package/dist/builderpattern/usermessage.js +123 -0
  18. package/dist/composablepattern/agent.d.ts +169 -0
  19. package/dist/composablepattern/agent.js +598 -0
  20. package/dist/composablepattern/codebolt-storage.d.ts +67 -0
  21. package/dist/composablepattern/codebolt-storage.js +320 -0
  22. package/dist/composablepattern/document.d.ts +149 -0
  23. package/dist/composablepattern/document.js +405 -0
  24. package/dist/composablepattern/examples/codebolt-integration-example.d.ts +12 -0
  25. package/dist/composablepattern/examples/codebolt-integration-example.js +218 -0
  26. package/dist/composablepattern/examples/codebolt-storage-example.d.ts +40 -0
  27. package/dist/composablepattern/examples/codebolt-storage-example.js +223 -0
  28. package/dist/composablepattern/examples/custom-steps-example.d.ts +20 -0
  29. package/dist/composablepattern/examples/custom-steps-example.js +455 -0
  30. package/dist/composablepattern/examples/document-agent.d.ts +17 -0
  31. package/dist/composablepattern/examples/document-agent.js +107 -0
  32. package/dist/composablepattern/examples/simple-codebolt-integration.d.ts +8 -0
  33. package/dist/composablepattern/examples/simple-codebolt-integration.js +164 -0
  34. package/dist/composablepattern/examples/weather-agent.d.ts +18 -0
  35. package/dist/composablepattern/examples/weather-agent.js +86 -0
  36. package/dist/composablepattern/examples/workflow-example.d.ts +12 -0
  37. package/dist/composablepattern/examples/workflow-example.js +463 -0
  38. package/dist/composablepattern/index.d.ts +63 -0
  39. package/dist/composablepattern/index.js +115 -0
  40. package/dist/composablepattern/memory.d.ts +89 -0
  41. package/dist/composablepattern/memory.js +141 -0
  42. package/dist/composablepattern/tool.d.ts +84 -0
  43. package/dist/composablepattern/tool.js +260 -0
  44. package/dist/composablepattern/types.d.ts +194 -0
  45. package/dist/composablepattern/types.js +6 -0
  46. package/dist/composablepattern/user-context.d.ts +214 -0
  47. package/dist/composablepattern/user-context.js +275 -0
  48. package/dist/composablepattern/workflow.d.ts +388 -0
  49. package/dist/composablepattern/workflow.js +562 -0
  50. package/dist/processor/agent/agentStep.d.ts +49 -0
  51. package/dist/processor/agent/agentStep.js +241 -0
  52. package/dist/processor/agent/toolExecutor.d.ts +19 -0
  53. package/dist/processor/agent/toolExecutor.js +90 -0
  54. package/dist/processor/index.d.ts +7 -0
  55. package/dist/processor/index.js +36 -0
  56. package/dist/processor/messageModifiers/baseMessageModifier.d.ts +20 -0
  57. package/dist/processor/messageModifiers/baseMessageModifier.js +55 -0
  58. package/dist/processor/processors/baseProcessor.d.ts +14 -0
  59. package/dist/processor/processors/baseProcessor.js +29 -0
  60. package/dist/processor/tools/baseTool.d.ts +10 -0
  61. package/dist/processor/tools/baseTool.js +20 -0
  62. package/dist/processor/tools/toolList.d.ts +9 -0
  63. package/dist/processor/tools/toolList.js +22 -0
  64. package/dist/processor/types/interfaces.d.ts +94 -0
  65. package/dist/processor/types/interfaces.js +2 -0
  66. package/dist/processor-pieces/base/baseMessageModifier.d.ts +12 -0
  67. package/dist/processor-pieces/base/baseMessageModifier.js +15 -0
  68. package/dist/processor-pieces/base/basePostInferenceProcessor.d.ts +13 -0
  69. package/dist/processor-pieces/base/basePostInferenceProcessor.js +18 -0
  70. package/dist/processor-pieces/base/basePostToolCallProcessor.d.ts +15 -0
  71. package/dist/processor-pieces/base/basePostToolCallProcessor.js +25 -0
  72. package/dist/processor-pieces/base/basePreInferenceProcessor.d.ts +12 -0
  73. package/dist/processor-pieces/base/basePreInferenceProcessor.js +17 -0
  74. package/dist/processor-pieces/base/basePreToolCallProcessor.d.ts +18 -0
  75. package/dist/processor-pieces/base/basePreToolCallProcessor.js +66 -0
  76. package/dist/processor-pieces/base/index.d.ts +9 -0
  77. package/dist/processor-pieces/base/index.js +18 -0
  78. package/dist/processor-pieces/index.d.ts +1 -0
  79. package/dist/processor-pieces/index.js +59 -0
  80. package/dist/processor-pieces/messageModifiers/addToolsListMessageModifier.d.ts +22 -0
  81. package/dist/processor-pieces/messageModifiers/addToolsListMessageModifier.js +144 -0
  82. package/dist/processor-pieces/messageModifiers/argumentProcessorModifier.d.ts +13 -0
  83. package/dist/processor-pieces/messageModifiers/argumentProcessorModifier.js +68 -0
  84. package/dist/processor-pieces/messageModifiers/atFileProcessorModifier.d.ts +25 -0
  85. package/dist/processor-pieces/messageModifiers/atFileProcessorModifier.js +453 -0
  86. package/dist/processor-pieces/messageModifiers/baseContextMessageModifier.d.ts +15 -0
  87. package/dist/processor-pieces/messageModifiers/baseContextMessageModifier.js +75 -0
  88. package/dist/processor-pieces/messageModifiers/baseSystemInstructionMessageModifier.d.ts +11 -0
  89. package/dist/processor-pieces/messageModifiers/baseSystemInstructionMessageModifier.js +46 -0
  90. package/dist/processor-pieces/messageModifiers/chatHistoryMessageModifier.d.ts +18 -0
  91. package/dist/processor-pieces/messageModifiers/chatHistoryMessageModifier.js +104 -0
  92. package/dist/processor-pieces/messageModifiers/chatRecordingModifier.d.ts +23 -0
  93. package/dist/processor-pieces/messageModifiers/chatRecordingModifier.js +173 -0
  94. package/dist/processor-pieces/messageModifiers/coreSystemPromptModifier.d.ts +14 -0
  95. package/dist/processor-pieces/messageModifiers/coreSystemPromptModifier.js +130 -0
  96. package/dist/processor-pieces/messageModifiers/directoryContextModifier.d.ts +36 -0
  97. package/dist/processor-pieces/messageModifiers/directoryContextModifier.js +418 -0
  98. package/dist/processor-pieces/messageModifiers/environmentContextModifier.d.ts +26 -0
  99. package/dist/processor-pieces/messageModifiers/environmentContextModifier.js +260 -0
  100. package/dist/processor-pieces/messageModifiers/handleUrlMessageModifier.d.ts +12 -0
  101. package/dist/processor-pieces/messageModifiers/handleUrlMessageModifier.js +60 -0
  102. package/dist/processor-pieces/messageModifiers/ideContextModifier.d.ts +34 -0
  103. package/dist/processor-pieces/messageModifiers/ideContextModifier.js +157 -0
  104. package/dist/processor-pieces/messageModifiers/imageAttachmentMessageModifier.d.ts +18 -0
  105. package/dist/processor-pieces/messageModifiers/imageAttachmentMessageModifier.js +222 -0
  106. package/dist/processor-pieces/messageModifiers/index.d.ts +11 -0
  107. package/dist/processor-pieces/messageModifiers/index.js +26 -0
  108. package/dist/processor-pieces/messageModifiers/memoryImportModifier.d.ts +15 -0
  109. package/dist/processor-pieces/messageModifiers/memoryImportModifier.js +129 -0
  110. package/dist/processor-pieces/messageModifiers/toolInjectionModifier.d.ts +20 -0
  111. package/dist/processor-pieces/messageModifiers/toolInjectionModifier.js +152 -0
  112. package/dist/processor-pieces/messageModifiers/workingDirectoryMessageModifier.d.ts +22 -0
  113. package/dist/processor-pieces/messageModifiers/workingDirectoryMessageModifier.js +194 -0
  114. package/dist/processor-pieces/postInferenceProcessors/loopDetectionModifier.d.ts +29 -0
  115. package/dist/processor-pieces/postInferenceProcessors/loopDetectionModifier.js +174 -0
  116. package/dist/processor-pieces/postToolCallProcessors/index.d.ts +1 -0
  117. package/dist/processor-pieces/postToolCallProcessors/index.js +2 -0
  118. package/dist/processor-pieces/postToolCallProcessors/shellProcessorModifier.d.ts +25 -0
  119. package/dist/processor-pieces/postToolCallProcessors/shellProcessorModifier.js +225 -0
  120. package/dist/processor-pieces/preInferenceProcessors/chatCompressionModifier.d.ts +35 -0
  121. package/dist/processor-pieces/preInferenceProcessors/chatCompressionModifier.js +255 -0
  122. package/dist/processor-pieces/preInferenceProcessors/index.d.ts +1 -0
  123. package/dist/processor-pieces/preInferenceProcessors/index.js +2 -0
  124. package/dist/processor-pieces/pretoolCallProcessors/index.d.ts +1 -0
  125. package/dist/processor-pieces/pretoolCallProcessors/index.js +2 -0
  126. package/dist/processor-pieces/processors/advancedLoopDetectionProcessor.d.ts +41 -0
  127. package/dist/processor-pieces/processors/advancedLoopDetectionProcessor.js +197 -0
  128. package/dist/processor-pieces/processors/chatCompressionProcessor.d.ts +26 -0
  129. package/dist/processor-pieces/processors/chatCompressionProcessor.js +90 -0
  130. package/dist/processor-pieces/processors/chatRecordingProcessor.d.ts +81 -0
  131. package/dist/processor-pieces/processors/chatRecordingProcessor.js +329 -0
  132. package/dist/processor-pieces/processors/contextManagementProcessor.d.ts +40 -0
  133. package/dist/processor-pieces/processors/contextManagementProcessor.js +305 -0
  134. package/dist/processor-pieces/processors/loopDetectionProcessor.d.ts +30 -0
  135. package/dist/processor-pieces/processors/loopDetectionProcessor.js +137 -0
  136. package/dist/processor-pieces/processors/responseValidationProcessor.d.ts +30 -0
  137. package/dist/processor-pieces/processors/responseValidationProcessor.js +228 -0
  138. package/dist/processor-pieces/processors/telemetryProcessor.d.ts +99 -0
  139. package/dist/processor-pieces/processors/telemetryProcessor.js +311 -0
  140. package/dist/processor-pieces/processors/tokenManagementProcessor.d.ts +37 -0
  141. package/dist/processor-pieces/processors/tokenManagementProcessor.js +178 -0
  142. package/dist/processor-pieces/processors/toolExecutionProcessor.d.ts +43 -0
  143. package/dist/processor-pieces/processors/toolExecutionProcessor.js +207 -0
  144. package/dist/processor-pieces/tools/fileTools.d.ts +26 -0
  145. package/dist/processor-pieces/tools/fileTools.js +162 -0
  146. package/dist/processor-pieces/utils/messageModifierHelper.d.ts +4 -0
  147. package/dist/processor-pieces/utils/messageModifierHelper.js +58 -0
  148. package/dist/types/commonTypes.d.ts +4 -0
  149. package/dist/types/processorTypes.d.ts +67 -0
  150. package/dist/types/processorTypes.js +58 -0
  151. package/dist/unified/agent/agent.d.ts +17 -0
  152. package/dist/unified/agent/agent.js +79 -0
  153. package/dist/unified/agent/team.d.ts +2 -0
  154. package/dist/unified/agent/team.js +6 -0
  155. package/dist/unified/agent/tools.d.ts +44 -0
  156. package/dist/unified/agent/tools.js +487 -0
  157. package/dist/unified/agent/workflow.d.ts +24 -0
  158. package/dist/unified/agent/workflow.js +275 -0
  159. package/dist/unified/agent/workflowControls.d.ts +11 -0
  160. package/dist/unified/agent/workflowControls.js +20 -0
  161. package/dist/unified/agent/workflowSteps.d.ts +63 -0
  162. package/dist/unified/agent/workflowSteps.js +284 -0
  163. package/dist/unified/base/agentStep.d.ts +32 -0
  164. package/dist/unified/base/agentStep.js +96 -0
  165. package/dist/unified/base/create/createInitialPromptGenerators.d.ts +5 -0
  166. package/dist/unified/base/create/createInitialPromptGenerators.js +17 -0
  167. package/dist/unified/base/index.d.ts +5 -0
  168. package/dist/unified/base/index.js +13 -0
  169. package/dist/unified/base/initialPromptGenerator.d.ts +48 -0
  170. package/dist/unified/base/initialPromptGenerator.js +118 -0
  171. package/dist/unified/base/responseExecutor.d.ts +36 -0
  172. package/dist/unified/base/responseExecutor.js +283 -0
  173. package/dist/unified/index.d.ts +18 -0
  174. package/dist/unified/index.js +42 -0
  175. package/dist/unified/team/team.d.ts +1 -0
  176. package/dist/unified/team/team.js +2 -0
  177. package/dist/unified/types/libTypes.d.ts +378 -0
  178. package/dist/unified/types/libTypes.js +6 -0
  179. package/dist/unified/types/types.d.ts +212 -0
  180. package/dist/unified/types/types.js +43 -0
  181. package/dist/unified/utils/utils.d.ts +40 -0
  182. package/dist/unified/utils/utils.js +219 -0
  183. 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
+ }