@codebolt/agent 6.1.20 → 6.1.21

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 (41) hide show
  1. package/dist/processor-pieces/messageModifiers/argumentProcessorModifier.js +11 -15
  2. package/dist/processor-pieces/messageModifiers/atFileProcessorModifier.d.ts +0 -1
  3. package/dist/processor-pieces/messageModifiers/atFileProcessorModifier.js +16 -33
  4. package/dist/processor-pieces/messageModifiers/capabilityContextModifier.js +3 -2
  5. package/dist/processor-pieces/messageModifiers/chatHistoryMessageModifier.d.ts +7 -0
  6. package/dist/processor-pieces/messageModifiers/chatHistoryMessageModifier.js +135 -27
  7. package/dist/processor-pieces/messageModifiers/chatRecordingModifier.js +3 -3
  8. package/dist/processor-pieces/messageModifiers/contextAssemblyModifier.js +18 -12
  9. package/dist/processor-pieces/messageModifiers/directoryContextModifier.d.ts +1 -0
  10. package/dist/processor-pieces/messageModifiers/directoryContextModifier.js +15 -15
  11. package/dist/processor-pieces/messageModifiers/environmentContextModifier.d.ts +1 -0
  12. package/dist/processor-pieces/messageModifiers/environmentContextModifier.js +48 -2
  13. package/dist/processor-pieces/messageModifiers/ideContextModifier.js +3 -2
  14. package/dist/processor-pieces/messageModifiers/memoryImportModifier.js +9 -15
  15. package/dist/processor-pieces/messageModifiers/toolInjectionModifier.js +17 -20
  16. package/dist/processor-pieces/postInferenceProcessors/loopDetectionModifier.js +8 -19
  17. package/dist/processor-pieces/postToolCallProcessors/conversationCompactorModifier.d.ts +1 -1
  18. package/dist/processor-pieces/postToolCallProcessors/conversationCompactorModifier.js +15 -15
  19. package/dist/processor-pieces/postToolCallProcessors/shellProcessorModifier.js +3 -3
  20. package/dist/processor-pieces/preInferenceProcessors/chatCompressionModifier.js +2 -2
  21. package/dist/processor-pieces/utils/messageModifierHelper.js +3 -3
  22. package/dist/types/libFunctionTypes.d.ts +5 -0
  23. package/dist/unified/agent/agent.d.ts +10 -0
  24. package/dist/unified/agent/agent.js +166 -15
  25. package/dist/unified/agent/tools.d.ts +14 -0
  26. package/dist/unified/agent/tools.js +82 -51
  27. package/dist/unified/base/agentStep.d.ts +1 -0
  28. package/dist/unified/base/agentStep.js +39 -11
  29. package/dist/unified/base/initialPromptGenerator.d.ts +2 -0
  30. package/dist/unified/base/initialPromptGenerator.js +42 -19
  31. package/dist/unified/base/promptContext.d.ts +3 -0
  32. package/dist/unified/base/promptContext.js +193 -15
  33. package/dist/unified/base/responseExecutor.d.ts +6 -0
  34. package/dist/unified/base/responseExecutor.js +222 -58
  35. package/dist/unified/services/CompressionCoordinator.js +9 -9
  36. package/dist/unified/services/compaction/autoCompact.js +5 -5
  37. package/dist/unified/services/compaction/contextCollapse.js +2 -2
  38. package/dist/unified/services/compaction/reactiveCompact.js +5 -5
  39. package/dist/unified/types/libTypes.d.ts +6 -0
  40. package/dist/unified/utils/agentToolLoader.js +29 -24
  41. package/package.json +5 -1
@@ -37,6 +37,7 @@ exports.MemoryImportModifier = void 0;
37
37
  const base_1 = require("../base");
38
38
  const fs = __importStar(require("fs"));
39
39
  const path = __importStar(require("path"));
40
+ const promptContext_1 = require("../../unified/base/promptContext");
40
41
  class MemoryImportModifier extends base_1.BaseMessageModifier {
41
42
  constructor(options = {}) {
42
43
  super();
@@ -54,8 +55,7 @@ class MemoryImportModifier extends base_1.BaseMessageModifier {
54
55
  if (!this.options.enableMemoryImport) {
55
56
  return createdMessage;
56
57
  }
57
- // Get the user message content to process
58
- const userMessage = createdMessage.message.messages.find(msg => msg.role === 'user');
58
+ const userMessage = (0, promptContext_1.getCurrentUserMessage)(createdMessage);
59
59
  if (!userMessage || typeof userMessage.content !== 'string') {
60
60
  return createdMessage;
61
61
  }
@@ -105,23 +105,17 @@ class MemoryImportModifier extends base_1.BaseMessageModifier {
105
105
  if (processedImports.length === 0) {
106
106
  return createdMessage;
107
107
  }
108
- // Update the user message with processed content
109
- const messages = createdMessage.message.messages.map(msg => {
110
- if (msg.role === 'user' && msg === userMessage) {
111
- return {
112
- ...msg,
113
- content
114
- };
115
- }
116
- return msg;
117
- });
108
+ const updatedMessage = (0, promptContext_1.updateCurrentUserMessage)(createdMessage, (message) => ({
109
+ ...message,
110
+ content,
111
+ }));
118
112
  return Promise.resolve({
113
+ ...updatedMessage,
119
114
  message: {
120
- ...createdMessage.message,
121
- messages
115
+ ...updatedMessage.message,
122
116
  },
123
117
  metadata: {
124
- ...createdMessage.metadata,
118
+ ...updatedMessage.metadata,
125
119
  memoryImportsProcessed: true,
126
120
  importedFiles: processedImports,
127
121
  totalImports: processedImports.length
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ToolInjectionModifier = void 0;
4
4
  const base_1 = require("../base");
5
5
  const agentToolLoader_1 = require("../../unified/utils/agentToolLoader");
6
+ const promptContext_1 = require("../../unified/base/promptContext");
6
7
  class ToolInjectionModifier extends base_1.BaseMessageModifier {
7
8
  constructor(options = {}) {
8
9
  super();
@@ -19,7 +20,7 @@ class ToolInjectionModifier extends base_1.BaseMessageModifier {
19
20
  }
20
21
  async modify(originalRequest, createdMessage) {
21
22
  try {
22
- let mentionedMCPs = originalRequest.mentionedMCPs || [];
23
+ const mentionedMCPs = originalRequest.mentionedMCPs || [];
23
24
  let tools = await (0, agentToolLoader_1.listAgentAvailableTools)(Array.isArray(mentionedMCPs) ? mentionedMCPs : []);
24
25
  // Filter tools if allowedTools is specified
25
26
  if (this.options.allowedTools && this.options.allowedTools.length > 0) {
@@ -30,17 +31,12 @@ class ToolInjectionModifier extends base_1.BaseMessageModifier {
30
31
  }
31
32
  switch (this.options.toolsLocation) {
32
33
  case 'InsidePrompt':
33
- //@ts-ignore
34
34
  return this.addToolsInsidePrompt(createdMessage, tools);
35
- //@ts-ignore
36
35
  case 'SystemMessage':
37
- //@ts-ignore
38
36
  return this.addToolsAsSystemMessage(createdMessage, tools);
39
37
  case 'Tool':
40
- //@ts-ignore
41
38
  return this.addToolsAsToolCalls(createdMessage, tools);
42
39
  default:
43
- //@ts-ignore
44
40
  return this.addToolsAsToolCalls(createdMessage, tools);
45
41
  }
46
42
  }
@@ -51,23 +47,24 @@ class ToolInjectionModifier extends base_1.BaseMessageModifier {
51
47
  }
52
48
  addToolsInsidePrompt(createdMessage, tools) {
53
49
  const toolsInfo = this.generateToolsInfo(tools);
54
- // Modify the last user message to include tools information
55
- const modifiedMessages = createdMessage.message.messages.map((message, index) => {
56
- if (message.role === 'user' && index === createdMessage.message.messages.length - 1) {
57
- return {
58
- ...message,
59
- content: `${message.content}\n\n--- Available Tools ---\n${toolsInfo}`
60
- };
61
- }
62
- return message;
63
- });
50
+ const updatedMessage = (0, promptContext_1.updateCurrentUserMessage)(createdMessage, (message) => ({
51
+ ...message,
52
+ content: typeof message.content === 'string'
53
+ ? `${message.content}\n\n--- Available Tools ---\n${toolsInfo}`
54
+ : [
55
+ ...(Array.isArray(message.content)
56
+ ? message.content
57
+ : [{ type: 'text', text: String(message.content) }]),
58
+ { type: 'text', text: `--- Available Tools ---\n${toolsInfo}` },
59
+ ],
60
+ }));
64
61
  return {
62
+ ...updatedMessage,
65
63
  message: {
66
- ...createdMessage.message,
67
- messages: modifiedMessages
64
+ ...updatedMessage.message,
68
65
  },
69
66
  metadata: {
70
- ...createdMessage.metadata,
67
+ ...updatedMessage.metadata,
71
68
  toolsInjected: true,
72
69
  toolsLocation: 'InsidePrompt',
73
70
  toolsCount: tools.length
@@ -83,7 +80,7 @@ class ToolInjectionModifier extends base_1.BaseMessageModifier {
83
80
  return {
84
81
  message: {
85
82
  ...createdMessage.message,
86
- messages: [toolsMessage, ...createdMessage.message.messages]
83
+ input: [toolsMessage, ...createdMessage.message.input]
87
84
  },
88
85
  metadata: {
89
86
  ...createdMessage.metadata,
@@ -21,32 +21,21 @@ class LoopDetectionModifier extends base_1.BasePostInferenceProcessor {
21
21
  }
22
22
  const currentTime = Date.now();
23
23
  // Add LLM response to history
24
- if (llmResponseMessage.content) {
24
+ const responseContent = llmResponseMessage.output_text || llmResponseMessage.content;
25
+ if (responseContent) {
25
26
  this.messageHistory.push({
26
- content: llmResponseMessage.content,
27
+ content: typeof responseContent === 'string' ? responseContent : JSON.stringify(responseContent),
27
28
  timestamp: currentTime,
28
- role: llmResponseMessage.role
29
+ role: llmResponseMessage.role || 'assistant'
29
30
  });
30
31
  }
31
- // Add any choice messages from LLM response to history
32
- if (llmResponseMessage.choices) {
33
- for (const choice of llmResponseMessage.choices) {
34
- if (choice.message && choice.message.content) {
35
- this.messageHistory.push({
36
- content: choice.message.content,
37
- timestamp: currentTime,
38
- role: choice.message.role
39
- });
40
- }
41
- }
42
- }
43
32
  // Add the original sent message to history if it exists
44
- for (const message of llmMessageSent.message.messages) {
33
+ for (const message of llmMessageSent.message.input) {
45
34
  if (typeof message.content === 'string') {
46
35
  this.messageHistory.push({
47
36
  content: message.content,
48
37
  timestamp: currentTime,
49
- role: message.role
38
+ role: message.role || 'user'
50
39
  });
51
40
  }
52
41
  }
@@ -61,11 +50,11 @@ class LoopDetectionModifier extends base_1.BasePostInferenceProcessor {
61
50
  role: 'system',
62
51
  content: `[Loop Detection Warning] Similar messages detected in recent conversation. This may indicate a conversational loop. Consider rephrasing your request or providing more specific information.`
63
52
  };
64
- const updatedMessages = [...nextPrompt.message.messages, warningMessage];
53
+ const updatedMessages = [...nextPrompt.message.input, warningMessage];
65
54
  return Promise.resolve({
66
55
  message: {
67
56
  ...nextPrompt.message,
68
- messages: updatedMessages
57
+ input: updatedMessages
69
58
  },
70
59
  metadata: {
71
60
  ...nextPrompt.metadata,
@@ -238,7 +238,7 @@ export declare class ConversationCompactorModifier extends BasePostToolCallProce
238
238
  * Forces compression regardless of threshold (for testing or manual trigger)
239
239
  */
240
240
  forceCompress(messages: MessageObject[]): Promise<{
241
- messages: MessageObject[];
241
+ input: MessageObject[];
242
242
  metadata: Partial<CompressionMetadata>;
243
243
  }>;
244
244
  }
@@ -304,7 +304,7 @@ class ConversationCompactorModifier extends basePostToolCallProcessor_1.BasePost
304
304
  }
305
305
  // If under budget, no truncation needed
306
306
  if (toolResponseTokens <= this.options.toolResponseTokenBudget) {
307
- return { messages: result, truncated: false, tokensSaved: 0 };
307
+ return { input: result, truncated: false, tokensSaved: 0 };
308
308
  }
309
309
  // Iterate from oldest to newest tool messages for truncation
310
310
  // (We truncate older tool outputs first to preserve recent context)
@@ -344,7 +344,7 @@ class ConversationCompactorModifier extends basePostToolCallProcessor_1.BasePost
344
344
  }
345
345
  }
346
346
  }
347
- return { messages: result, truncated, tokensSaved };
347
+ return { input: result, truncated, tokensSaved };
348
348
  }
349
349
  // ========================================================================
350
350
  // History Split Point Calculation (Phase 2)
@@ -518,7 +518,7 @@ CRITICAL RULES:
518
518
  try {
519
519
  const prompt = this.getCompressionPrompt(historyToCompress);
520
520
  const response = await codeboltjs_1.default.llm.inference({
521
- messages: [
521
+ input: [
522
522
  { role: 'system', content: 'You are a precise conversation compression assistant.' },
523
523
  { role: 'user', content: prompt }
524
524
  ],
@@ -554,7 +554,7 @@ If the snapshot is accurate and complete, respond with just the original snapsho
554
554
  If there are inaccuracies or missing critical information, provide a corrected version.
555
555
  Keep the same XML format.`;
556
556
  const response = await codeboltjs_1.default.llm.inference({
557
- messages: [
557
+ input: [
558
558
  { role: 'system', content: 'You are verifying a conversation compression for accuracy.' },
559
559
  { role: 'user', content: verificationPrompt }
560
560
  ]
@@ -680,7 +680,7 @@ Keep the same XML format.`;
680
680
  if (this.options.enableLogging && deduplicatedCount > 0) {
681
681
  console.log(`[ConversationCompactor] Deduplicated ${deduplicatedCount} file reads`);
682
682
  }
683
- return { messages: result, deduplicatedCount };
683
+ return { input: result, deduplicatedCount };
684
684
  }
685
685
  // ========================================================================
686
686
  // Compression Strategies
@@ -732,7 +732,7 @@ Keep the same XML format.`;
732
732
  */
733
733
  async compressSmart(messages) {
734
734
  // Phase 1: Truncate large tool outputs
735
- const { messages: truncatedMessages, truncated } = this.truncateLargeToolOutputs(messages);
735
+ const { input: truncatedMessages, truncated } = this.truncateLargeToolOutputs(messages);
736
736
  // Check if truncation alone was sufficient
737
737
  const tokensAfterTruncation = this.countMessageTokens(truncatedMessages);
738
738
  const threshold = this.options.modelTokenLimit * this.options.compressionTokenThreshold;
@@ -789,7 +789,7 @@ Keep the same XML format.`;
789
789
  */
790
790
  async compressSummarize(messages) {
791
791
  // Phase 1: Truncate large tool outputs
792
- const { messages: truncatedMessages, truncated } = this.truncateLargeToolOutputs(messages);
792
+ const { input: truncatedMessages, truncated } = this.truncateLargeToolOutputs(messages);
793
793
  // Phase 2: Find split point
794
794
  const splitIndex = this.findCompressionSplitIndex(truncatedMessages);
795
795
  if (splitIndex === 0) {
@@ -869,7 +869,7 @@ Please continue from where the previous conversation left off. Do not ask the us
869
869
  const { nextPrompt, rawLLMResponseMessage, tokenLimit } = input;
870
870
  try {
871
871
  // Safety check: ensure messages array exists
872
- if (!((_a = nextPrompt === null || nextPrompt === void 0 ? void 0 : nextPrompt.message) === null || _a === void 0 ? void 0 : _a.messages) || !Array.isArray(nextPrompt.message.messages)) {
872
+ if (!((_a = nextPrompt === null || nextPrompt === void 0 ? void 0 : nextPrompt.message) === null || _a === void 0 ? void 0 : _a.input) || !Array.isArray(nextPrompt.message.input)) {
873
873
  if (this.options.enableLogging) {
874
874
  console.warn('[ConversationCompactor] No messages array found, skipping compression');
875
875
  }
@@ -878,7 +878,7 @@ Please continue from where the previous conversation left off. Do not ask the us
878
878
  shouldExit: false
879
879
  };
880
880
  }
881
- const messages = nextPrompt.message.messages;
881
+ const messages = nextPrompt.message.input;
882
882
  // Get model token limit: prefer tokenLimit from LLM response, then lookup by model name, then fallback to config
883
883
  const modelName = rawLLMResponseMessage === null || rawLLMResponseMessage === void 0 ? void 0 : rawLLMResponseMessage.model;
884
884
  const modelTokenLimit = tokenLimit !== null && tokenLimit !== void 0 ? tokenLimit : (modelName ? getModelTokenLimit(modelName) : this.options.modelTokenLimit);
@@ -981,7 +981,7 @@ Please continue from where the previous conversation left off. Do not ask the us
981
981
  };
982
982
  }
983
983
  // Pre-compression: deduplicate file reads to reduce token waste
984
- const { messages: dedupedMessages } = this.deduplicateFileReads(messages);
984
+ const { input: dedupedMessages } = this.deduplicateFileReads(messages);
985
985
  // Apply compression based on strategy
986
986
  let result;
987
987
  switch (this.options.compactStrategy) {
@@ -1056,7 +1056,7 @@ Please continue from where the previous conversation left off. Do not ask the us
1056
1056
  nextPrompt: {
1057
1057
  message: {
1058
1058
  ...nextPrompt.message,
1059
- messages: result.compressedMessages
1059
+ input: result.compressedMessages
1060
1060
  },
1061
1061
  metadata: {
1062
1062
  ...nextPrompt.metadata,
@@ -1079,10 +1079,10 @@ Please continue from where the previous conversation left off. Do not ask the us
1079
1079
  ...nextPrompt.metadata,
1080
1080
  compression: {
1081
1081
  status: CompressionStatus.FAILED_SUMMARIZATION_ERROR,
1082
- originalTokenCount: this.countMessageTokens(nextPrompt.message.messages),
1083
- newTokenCount: this.countMessageTokens(nextPrompt.message.messages),
1082
+ originalTokenCount: this.countMessageTokens(nextPrompt.message.input),
1083
+ newTokenCount: this.countMessageTokens(nextPrompt.message.input),
1084
1084
  messagesCompressed: 0,
1085
- messagesPreserved: nextPrompt.message.messages.length,
1085
+ messagesPreserved: nextPrompt.message.input.length,
1086
1086
  toolOutputsTruncated: false,
1087
1087
  failedAttempts: this.failedCompressionAttempts,
1088
1088
  timestamp: new Date().toISOString(),
@@ -1125,7 +1125,7 @@ Please continue from where the previous conversation left off. Do not ask the us
1125
1125
  ? this.compressSummarize(messages)
1126
1126
  : this.compressSmart(messages));
1127
1127
  return {
1128
- messages: result.compressedMessages,
1128
+ input: result.compressedMessages,
1129
1129
  metadata: result.metadata
1130
1130
  };
1131
1131
  }
@@ -42,7 +42,7 @@ class ShellProcessorModifier extends base_1.BasePostToolCallProcessor {
42
42
  // Also process any shell injections in the next prompt messages
43
43
  const updatedMessages = [];
44
44
  let contentModified = false;
45
- for (const message of processedNextPrompt.message.messages) {
45
+ for (const message of processedNextPrompt.message.input) {
46
46
  if (typeof message.content === 'string') {
47
47
  let processedContent = message.content;
48
48
  // Replace {{args}} placeholders if metadata has args
@@ -69,7 +69,7 @@ class ShellProcessorModifier extends base_1.BasePostToolCallProcessor {
69
69
  processedNextPrompt = {
70
70
  message: {
71
71
  ...processedNextPrompt.message,
72
- messages: updatedMessages
72
+ input: updatedMessages
73
73
  },
74
74
  metadata: {
75
75
  ...processedNextPrompt.metadata,
@@ -109,7 +109,7 @@ class ShellProcessorModifier extends base_1.BasePostToolCallProcessor {
109
109
  processedPrompt = {
110
110
  message: {
111
111
  ...processedPrompt.message,
112
- messages: [...processedPrompt.message.messages, systemMessage]
112
+ input: [...processedPrompt.message.input, systemMessage]
113
113
  },
114
114
  metadata: {
115
115
  ...processedPrompt.metadata,
@@ -104,12 +104,12 @@ class ChatCompressionModifier extends base_1.BasePreInferenceProcessor {
104
104
  };
105
105
  }
106
106
  }
107
- const compressionResult = await this.tryCompressChat(createdMessage.message.messages, this.options.force || false);
107
+ const compressionResult = await this.tryCompressChat(createdMessage.message.input, this.options.force || false);
108
108
  if (compressionResult.compressionStatus === CompressionStatus.COMPRESSED) {
109
109
  return {
110
110
  message: {
111
111
  ...createdMessage.message,
112
- messages: compressionResult.compressedMessages || createdMessage.message.messages
112
+ input: compressionResult.compressedMessages || createdMessage.message.input
113
113
  },
114
114
  metadata: {
115
115
  ...createdMessage.metadata,
@@ -7,7 +7,7 @@ const mergeMessages = (existing, additional) => {
7
7
  message: {
8
8
  ...existing.message,
9
9
  ...additional.message,
10
- messages: [...existing.message.messages, ...additional.message.messages],
10
+ input: [...existing.message.input, ...additional.message.input],
11
11
  },
12
12
  metadata: {
13
13
  ...existing.metadata,
@@ -31,7 +31,7 @@ const addSystemMessage = (message, systemContent) => {
31
31
  return {
32
32
  message: {
33
33
  ...message.message,
34
- messages: [systemMessage, ...message.message.messages]
34
+ input: [systemMessage, ...message.message.input]
35
35
  },
36
36
  metadata: {
37
37
  ...message.metadata,
@@ -50,7 +50,7 @@ const addUserContext = (message, contextKey, contextValue) => {
50
50
  return {
51
51
  message: {
52
52
  ...message.message,
53
- messages: [...message.message.messages, contextMessage]
53
+ input: [...message.message.input, contextMessage]
54
54
  },
55
55
  metadata: {
56
56
  ...message.metadata,
@@ -232,6 +232,11 @@ export interface CodeboltAPI {
232
232
  listMcpFromServers: (servers: string[]) => Promise<{
233
233
  data: OpenAITool[];
234
234
  }>;
235
+ getRegisteredTools: () => Promise<{
236
+ data?: {
237
+ tools: OpenAITool[];
238
+ };
239
+ }>;
235
240
  getTools: (mcps: any[]) => Promise<{
236
241
  data: OpenAITool[];
237
242
  }>;
@@ -57,8 +57,11 @@ export declare class Agent implements AgentInterface {
57
57
  private readonly maxTurns;
58
58
  private readonly localToolSchemas;
59
59
  private readonly localToolsByExecutionName;
60
+ private readonly runtimeToolSetId;
60
61
  constructor(config: AgentOptions);
61
62
  run(message: string | FlatUserMessage, options?: ProcessedMessage | AgentRunOptions): Promise<AgentRunResult>;
63
+ private registerRuntimeToolsForSearch;
64
+ private unregisterRuntimeToolsForSearch;
62
65
  processMessage(message: string | FlatUserMessage, options?: ProcessedMessage | AgentRunOptions): Promise<AgentRunResult>;
63
66
  execute(reqMessage: FlatUserMessage): Promise<{
64
67
  success: boolean;
@@ -72,8 +75,15 @@ export declare class Agent implements AgentInterface {
72
75
  getPreToolCallProcessors(): PreToolCallProcessor[];
73
76
  getPostToolCallProcessors(): PostToolCallProcessor[];
74
77
  private resolveRunContext;
78
+ private getResumeMessageModifiers;
75
79
  private isProcessedMessage;
76
80
  private applyCompaction;
81
+ private hydratePromptFromServerCompaction;
82
+ private isServerCompactionCurrent;
83
+ private extractCurrentRunMessages;
84
+ private isCurrentRunUserMessage;
85
+ private extractServerCompactedMessages;
86
+ private isServerCompactedMessage;
77
87
  private tryRecoverPrompt;
78
88
  private refreshAvailableTools;
79
89
  private getAllowedToolNames;