@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.
Files changed (285) hide show
  1. package/README.md +157 -66
  2. package/dist/{agent.js → builderpattern/agent.js} +2 -2
  3. package/dist/{followupquestionbuilder.d.ts → builderpattern/followupquestionbuilder.d.ts} +1 -1
  4. package/dist/{followupquestionbuilder.js → builderpattern/followupquestionbuilder.js} +1 -1
  5. package/dist/{index.d.ts → builderpattern/index.d.ts} +3 -3
  6. package/dist/{llmoutputhandler.d.ts → builderpattern/llmoutputhandler.d.ts} +1 -1
  7. package/dist/{llmoutputhandler.js → builderpattern/llmoutputhandler.js} +7 -7
  8. package/dist/{promptbuilder.d.ts → builderpattern/promptbuilder.d.ts} +3 -3
  9. package/dist/{taskInstruction.d.ts → builderpattern/taskInstruction.d.ts} +2 -2
  10. package/dist/{usermessage.d.ts → builderpattern/usermessage.d.ts} +9 -4
  11. package/dist/composablepattern/agent.d.ts +169 -0
  12. package/dist/composablepattern/agent.js +598 -0
  13. package/dist/composablepattern/codebolt-storage.d.ts +67 -0
  14. package/dist/composablepattern/codebolt-storage.js +320 -0
  15. package/dist/composablepattern/document.d.ts +149 -0
  16. package/dist/composablepattern/document.js +372 -0
  17. package/dist/composablepattern/examples/codebolt-integration-example.d.ts +12 -0
  18. package/dist/composablepattern/examples/codebolt-integration-example.js +218 -0
  19. package/dist/composablepattern/examples/codebolt-storage-example.d.ts +40 -0
  20. package/dist/composablepattern/examples/codebolt-storage-example.js +223 -0
  21. package/dist/composablepattern/examples/custom-steps-example.d.ts +20 -0
  22. package/dist/composablepattern/examples/custom-steps-example.js +455 -0
  23. package/dist/composablepattern/examples/document-agent.d.ts +17 -0
  24. package/dist/composablepattern/examples/document-agent.js +107 -0
  25. package/dist/composablepattern/examples/simple-codebolt-integration.d.ts +8 -0
  26. package/dist/composablepattern/examples/simple-codebolt-integration.js +164 -0
  27. package/dist/composablepattern/examples/weather-agent.d.ts +18 -0
  28. package/dist/composablepattern/examples/weather-agent.js +86 -0
  29. package/dist/composablepattern/examples/workflow-example.d.ts +12 -0
  30. package/dist/composablepattern/examples/workflow-example.js +463 -0
  31. package/dist/composablepattern/index.d.ts +63 -0
  32. package/dist/composablepattern/index.js +115 -0
  33. package/dist/composablepattern/memory.d.ts +89 -0
  34. package/dist/composablepattern/memory.js +141 -0
  35. package/dist/composablepattern/tool.d.ts +84 -0
  36. package/dist/composablepattern/tool.js +260 -0
  37. package/dist/composablepattern/types.d.ts +194 -0
  38. package/dist/composablepattern/types.js +6 -0
  39. package/dist/composablepattern/user-context.d.ts +214 -0
  40. package/dist/composablepattern/user-context.js +275 -0
  41. package/dist/composablepattern/workflow.d.ts +388 -0
  42. package/dist/composablepattern/workflow.js +562 -0
  43. package/dist/local-tools/fileTools.d.ts +26 -0
  44. package/dist/local-tools/fileTools.js +162 -0
  45. package/dist/processor/agent/agentStep.d.ts +49 -0
  46. package/dist/processor/agent/agentStep.js +241 -0
  47. package/dist/processor/agent/toolExecutor.d.ts +19 -0
  48. package/dist/processor/agent/toolExecutor.js +90 -0
  49. package/dist/processor/index.d.ts +7 -0
  50. package/dist/processor/index.js +36 -0
  51. package/dist/processor/messageModifiers/baseMessageModifier.d.ts +20 -0
  52. package/dist/processor/messageModifiers/baseMessageModifier.js +55 -0
  53. package/dist/processor/processors/baseProcessor.d.ts +14 -0
  54. package/dist/processor/processors/baseProcessor.js +29 -0
  55. package/dist/processor/tools/baseTool.d.ts +10 -0
  56. package/dist/processor/tools/baseTool.js +20 -0
  57. package/dist/processor/tools/toolList.d.ts +9 -0
  58. package/dist/processor/tools/toolList.js +22 -0
  59. package/dist/processor/types/interfaces.d.ts +117 -0
  60. package/dist/processor/types/interfaces.js +2 -0
  61. package/dist/processor-pieces/additionalModifiers/argumentProcessorModifier.d.ts +13 -0
  62. package/dist/processor-pieces/additionalModifiers/argumentProcessorModifier.js +68 -0
  63. package/dist/processor-pieces/additionalModifiers/atFileProcessorModifier.d.ts +15 -0
  64. package/dist/processor-pieces/additionalModifiers/atFileProcessorModifier.js +212 -0
  65. package/dist/processor-pieces/additionalModifiers/chatCompressionModifier.d.ts +19 -0
  66. package/dist/processor-pieces/additionalModifiers/chatCompressionModifier.js +110 -0
  67. package/dist/processor-pieces/additionalModifiers/chatRecordingModifier.d.ts +23 -0
  68. package/dist/processor-pieces/additionalModifiers/chatRecordingModifier.js +173 -0
  69. package/dist/processor-pieces/additionalModifiers/coreSystemPromptModifier.d.ts +14 -0
  70. package/dist/processor-pieces/additionalModifiers/coreSystemPromptModifier.js +93 -0
  71. package/dist/processor-pieces/additionalModifiers/directoryContextModifier.d.ts +30 -0
  72. package/dist/processor-pieces/additionalModifiers/directoryContextModifier.js +330 -0
  73. package/dist/processor-pieces/additionalModifiers/environmentContextModifier.d.ts +26 -0
  74. package/dist/processor-pieces/additionalModifiers/environmentContextModifier.js +269 -0
  75. package/dist/processor-pieces/additionalModifiers/fallbackHandlerModifier.d.ts +38 -0
  76. package/dist/processor-pieces/additionalModifiers/fallbackHandlerModifier.js +217 -0
  77. package/dist/processor-pieces/additionalModifiers/ideContextModifier.d.ts +34 -0
  78. package/dist/processor-pieces/additionalModifiers/ideContextModifier.js +147 -0
  79. package/dist/processor-pieces/additionalModifiers/index.d.ts +12 -0
  80. package/dist/processor-pieces/additionalModifiers/index.js +28 -0
  81. package/dist/processor-pieces/additionalModifiers/loopDetectionModifier.d.ts +29 -0
  82. package/dist/processor-pieces/additionalModifiers/loopDetectionModifier.js +155 -0
  83. package/dist/processor-pieces/additionalModifiers/memoryImportModifier.d.ts +15 -0
  84. package/dist/processor-pieces/additionalModifiers/memoryImportModifier.js +129 -0
  85. package/dist/processor-pieces/additionalModifiers/shellProcessorModifier.d.ts +25 -0
  86. package/dist/processor-pieces/additionalModifiers/shellProcessorModifier.js +169 -0
  87. package/dist/processor-pieces/additionalModifiers/toolInjectionModifier.d.ts +20 -0
  88. package/dist/processor-pieces/additionalModifiers/toolInjectionModifier.js +152 -0
  89. package/dist/processor-pieces/base/baseMessageModifier.d.ts +12 -0
  90. package/dist/processor-pieces/base/baseMessageModifier.js +15 -0
  91. package/dist/processor-pieces/base/basePostInferenceProcessor.d.ts +13 -0
  92. package/dist/processor-pieces/base/basePostInferenceProcessor.js +18 -0
  93. package/dist/processor-pieces/base/basePostToolCallProcessor.d.ts +15 -0
  94. package/dist/processor-pieces/base/basePostToolCallProcessor.js +25 -0
  95. package/dist/processor-pieces/base/basePreInferenceProcessor.d.ts +12 -0
  96. package/dist/processor-pieces/base/basePreInferenceProcessor.js +17 -0
  97. package/dist/processor-pieces/base/basePreToolCallProcessor.d.ts +18 -0
  98. package/dist/processor-pieces/base/basePreToolCallProcessor.js +66 -0
  99. package/dist/processor-pieces/base/index.d.ts +9 -0
  100. package/dist/processor-pieces/base/index.js +18 -0
  101. package/dist/processor-pieces/index.d.ts +1 -0
  102. package/dist/processor-pieces/index.js +59 -0
  103. package/dist/processor-pieces/messageModifiers/addCurrentDirectoryRootFilesModifier.d.ts +7 -0
  104. package/dist/processor-pieces/messageModifiers/addCurrentDirectoryRootFilesModifier.js +93 -0
  105. package/dist/processor-pieces/messageModifiers/addToolsListMessageModifier.d.ts +31 -0
  106. package/dist/processor-pieces/messageModifiers/addToolsListMessageModifier.js +145 -0
  107. package/dist/processor-pieces/messageModifiers/advancedSystemInstructionMessageModifier.d.ts +9 -0
  108. package/dist/processor-pieces/messageModifiers/advancedSystemInstructionMessageModifier.js +77 -0
  109. package/dist/processor-pieces/messageModifiers/argumentProcessorModifier.d.ts +13 -0
  110. package/dist/processor-pieces/messageModifiers/argumentProcessorModifier.js +68 -0
  111. package/dist/processor-pieces/messageModifiers/atFileProcessorModifier.d.ts +25 -0
  112. package/dist/processor-pieces/messageModifiers/atFileProcessorModifier.js +453 -0
  113. package/dist/processor-pieces/messageModifiers/baseContextMessageModifier.d.ts +7 -0
  114. package/dist/processor-pieces/messageModifiers/baseContextMessageModifier.js +67 -0
  115. package/dist/processor-pieces/messageModifiers/baseSystemInstructionMessageModifier.d.ts +9 -0
  116. package/dist/processor-pieces/messageModifiers/baseSystemInstructionMessageModifier.js +90 -0
  117. package/dist/processor-pieces/messageModifiers/chatCompressionModifier.d.ts +19 -0
  118. package/dist/processor-pieces/messageModifiers/chatCompressionModifier.js +110 -0
  119. package/dist/processor-pieces/messageModifiers/chatHistoryMessageModifier.d.ts +18 -0
  120. package/dist/processor-pieces/messageModifiers/chatHistoryMessageModifier.example.d.ts +20 -0
  121. package/dist/processor-pieces/messageModifiers/chatHistoryMessageModifier.example.js +124 -0
  122. package/dist/processor-pieces/messageModifiers/chatHistoryMessageModifier.js +104 -0
  123. package/dist/processor-pieces/messageModifiers/chatRecordingModifier.d.ts +23 -0
  124. package/dist/processor-pieces/messageModifiers/chatRecordingModifier.js +173 -0
  125. package/dist/processor-pieces/messageModifiers/coreSystemPromptModifier.d.ts +14 -0
  126. package/dist/processor-pieces/messageModifiers/coreSystemPromptModifier.js +130 -0
  127. package/dist/processor-pieces/messageModifiers/directoryContextModifier.d.ts +36 -0
  128. package/dist/processor-pieces/messageModifiers/directoryContextModifier.js +418 -0
  129. package/dist/processor-pieces/messageModifiers/environmentContext.d.ts +41 -0
  130. package/dist/processor-pieces/messageModifiers/environmentContext.js +355 -0
  131. package/dist/processor-pieces/messageModifiers/environmentContextModifier.d.ts +26 -0
  132. package/dist/processor-pieces/messageModifiers/environmentContextModifier.js +260 -0
  133. package/dist/processor-pieces/messageModifiers/handleUrlMessageModifier.d.ts +13 -0
  134. package/dist/processor-pieces/messageModifiers/handleUrlMessageModifier.js +59 -0
  135. package/dist/processor-pieces/messageModifiers/ideContextModifier.d.ts +34 -0
  136. package/dist/processor-pieces/messageModifiers/ideContextModifier.js +157 -0
  137. package/dist/processor-pieces/messageModifiers/imageAttachmentMessageModifier.d.ts +19 -0
  138. package/dist/processor-pieces/messageModifiers/imageAttachmentMessageModifier.js +221 -0
  139. package/dist/processor-pieces/messageModifiers/index.d.ts +11 -0
  140. package/dist/processor-pieces/messageModifiers/index.js +26 -0
  141. package/dist/processor-pieces/messageModifiers/memoryImportModifier.d.ts +15 -0
  142. package/dist/processor-pieces/messageModifiers/memoryImportModifier.js +129 -0
  143. package/dist/processor-pieces/messageModifiers/mentionedFilesModifier.d.ts +23 -0
  144. package/dist/processor-pieces/messageModifiers/mentionedFilesModifier.js +207 -0
  145. package/dist/processor-pieces/messageModifiers/simpleMessageModifier.d.ts +7 -0
  146. package/dist/processor-pieces/messageModifiers/simpleMessageModifier.js +26 -0
  147. package/dist/processor-pieces/messageModifiers/toolInjectionModifier.d.ts +20 -0
  148. package/dist/processor-pieces/messageModifiers/toolInjectionModifier.js +152 -0
  149. package/dist/processor-pieces/messageModifiers/workingDirectoryMessageModifier.d.ts +38 -0
  150. package/dist/processor-pieces/messageModifiers/workingDirectoryMessageModifier.js +392 -0
  151. package/dist/processor-pieces/postInference/llmOutputValidityProcessor.d.ts +1 -0
  152. package/dist/processor-pieces/postInference/llmOutputValidityProcessor.js +2 -0
  153. package/dist/processor-pieces/postInferenceProcessors/checkForNoToolCall.d.ts +7 -0
  154. package/dist/processor-pieces/postInferenceProcessors/checkForNoToolCall.js +24 -0
  155. package/dist/processor-pieces/postInferenceProcessors/loopDetectionModifier.d.ts +29 -0
  156. package/dist/processor-pieces/postInferenceProcessors/loopDetectionModifier.js +174 -0
  157. package/dist/processor-pieces/postToolCall/advancedLoopDetectionProcessor.d.ts +41 -0
  158. package/dist/processor-pieces/postToolCall/advancedLoopDetectionProcessor.js +197 -0
  159. package/dist/processor-pieces/postToolCall/chatCompressionProcessor.d.ts +26 -0
  160. package/dist/processor-pieces/postToolCall/chatCompressionProcessor.js +90 -0
  161. package/dist/processor-pieces/postToolCall/chatRecordingProcessor.d.ts +81 -0
  162. package/dist/processor-pieces/postToolCall/chatRecordingProcessor.js +329 -0
  163. package/dist/processor-pieces/postToolCall/contextManagementProcessor.d.ts +40 -0
  164. package/dist/processor-pieces/postToolCall/contextManagementProcessor.js +272 -0
  165. package/dist/processor-pieces/postToolCall/conversationCompactorProcessor.d.ts +49 -0
  166. package/dist/processor-pieces/postToolCall/conversationCompactorProcessor.js +291 -0
  167. package/dist/processor-pieces/postToolCall/conversationContinuityProcessor.d.ts +49 -0
  168. package/dist/processor-pieces/postToolCall/conversationContinuityProcessor.js +293 -0
  169. package/dist/processor-pieces/postToolCall/followUpConversationProcessor.d.ts +47 -0
  170. package/dist/processor-pieces/postToolCall/followUpConversationProcessor.js +249 -0
  171. package/dist/processor-pieces/postToolCall/loopDetectionProcessor.d.ts +30 -0
  172. package/dist/processor-pieces/postToolCall/loopDetectionProcessor.js +137 -0
  173. package/dist/processor-pieces/postToolCall/responseValidationProcessor.d.ts +30 -0
  174. package/dist/processor-pieces/postToolCall/responseValidationProcessor.js +228 -0
  175. package/dist/processor-pieces/postToolCall/telemetryProcessor.d.ts +99 -0
  176. package/dist/processor-pieces/postToolCall/telemetryProcessor.js +278 -0
  177. package/dist/processor-pieces/postToolCall/tokenManagementProcessor.d.ts +37 -0
  178. package/dist/processor-pieces/postToolCall/tokenManagementProcessor.js +178 -0
  179. package/dist/processor-pieces/postToolCall/toolExecutionProcessor.d.ts +43 -0
  180. package/dist/processor-pieces/postToolCall/toolExecutionProcessor.js +207 -0
  181. package/dist/processor-pieces/postToolCallProcessors/index.d.ts +1 -0
  182. package/dist/processor-pieces/postToolCallProcessors/index.js +2 -0
  183. package/dist/processor-pieces/postToolCallProcessors/shellProcessorModifier.d.ts +25 -0
  184. package/dist/processor-pieces/postToolCallProcessors/shellProcessorModifier.js +225 -0
  185. package/dist/processor-pieces/preInference/conversationCompactorProcessor.d.ts +52 -0
  186. package/dist/processor-pieces/preInference/conversationCompactorProcessor.js +264 -0
  187. package/dist/processor-pieces/preInference/conversationContinuityProcessor.d.ts +49 -0
  188. package/dist/processor-pieces/preInference/conversationContinuityProcessor.js +293 -0
  189. package/dist/processor-pieces/preInferenceProcessors/chatCompressionModifier.d.ts +35 -0
  190. package/dist/processor-pieces/preInferenceProcessors/chatCompressionModifier.js +255 -0
  191. package/dist/processor-pieces/preInferenceProcessors/conversationCompaction.d.ts +7 -0
  192. package/dist/processor-pieces/preInferenceProcessors/conversationCompaction.js +31 -0
  193. package/dist/processor-pieces/preInferenceProcessors/index.d.ts +1 -0
  194. package/dist/processor-pieces/preInferenceProcessors/index.js +2 -0
  195. package/dist/processor-pieces/preToolCall/index.d.ts +9 -0
  196. package/dist/processor-pieces/preToolCall/index.js +18 -0
  197. package/dist/processor-pieces/preToolCall/localToolInterceptorProcessor.d.ts +58 -0
  198. package/dist/processor-pieces/preToolCall/localToolInterceptorProcessor.js +444 -0
  199. package/dist/processor-pieces/preToolCall/toolParameterModifierProcessor.d.ts +44 -0
  200. package/dist/processor-pieces/preToolCall/toolParameterModifierProcessor.js +367 -0
  201. package/dist/processor-pieces/preToolCall/toolValidationProcessor.d.ts +58 -0
  202. package/dist/processor-pieces/preToolCall/toolValidationProcessor.js +391 -0
  203. package/dist/processor-pieces/pretoolCallProcessors/index.d.ts +1 -0
  204. package/dist/processor-pieces/pretoolCallProcessors/index.js +2 -0
  205. package/dist/processor-pieces/processors/advancedLoopDetectionProcessor.d.ts +41 -0
  206. package/dist/processor-pieces/processors/advancedLoopDetectionProcessor.js +197 -0
  207. package/dist/processor-pieces/processors/chatCompressionProcessor.d.ts +26 -0
  208. package/dist/processor-pieces/processors/chatCompressionProcessor.js +90 -0
  209. package/dist/processor-pieces/processors/chatRecordingProcessor.d.ts +81 -0
  210. package/dist/processor-pieces/processors/chatRecordingProcessor.js +329 -0
  211. package/dist/processor-pieces/processors/contextManagementProcessor.d.ts +40 -0
  212. package/dist/processor-pieces/processors/contextManagementProcessor.js +305 -0
  213. package/dist/processor-pieces/processors/loopDetectionProcessor.d.ts +30 -0
  214. package/dist/processor-pieces/processors/loopDetectionProcessor.js +137 -0
  215. package/dist/processor-pieces/processors/responseValidationProcessor.d.ts +30 -0
  216. package/dist/processor-pieces/processors/responseValidationProcessor.js +228 -0
  217. package/dist/processor-pieces/processors/telemetryProcessor.d.ts +99 -0
  218. package/dist/processor-pieces/processors/telemetryProcessor.js +311 -0
  219. package/dist/processor-pieces/processors/tokenManagementProcessor.d.ts +37 -0
  220. package/dist/processor-pieces/processors/tokenManagementProcessor.js +178 -0
  221. package/dist/processor-pieces/processors/toolExecutionProcessor.d.ts +43 -0
  222. package/dist/processor-pieces/processors/toolExecutionProcessor.js +207 -0
  223. package/dist/processor-pieces/tools/fileTools.d.ts +26 -0
  224. package/dist/processor-pieces/tools/fileTools.js +162 -0
  225. package/dist/processor-pieces/utils/messageModifierHelper.d.ts +4 -0
  226. package/dist/processor-pieces/utils/messageModifierHelper.js +58 -0
  227. package/dist/types/commonTypes.d.ts +4 -0
  228. package/dist/types/processorTypes.d.ts +67 -0
  229. package/dist/types/processorTypes.js +58 -0
  230. package/dist/unified/agent/agent.d.ts +17 -0
  231. package/dist/unified/agent/agent.js +79 -0
  232. package/dist/unified/agent/team.d.ts +2 -0
  233. package/dist/unified/agent/team.js +6 -0
  234. package/dist/unified/agent/tool.d.ts +99 -0
  235. package/dist/unified/agent/tool.js +440 -0
  236. package/dist/unified/agent/tools.d.ts +44 -0
  237. package/dist/unified/agent/tools.js +487 -0
  238. package/dist/unified/agent/workflow.d.ts +24 -0
  239. package/dist/unified/agent/workflow.js +275 -0
  240. package/dist/unified/agent/workflowControls.d.ts +11 -0
  241. package/dist/unified/agent/workflowControls.js +20 -0
  242. package/dist/unified/agent/workflowSteps.d.ts +63 -0
  243. package/dist/unified/agent/workflowSteps.js +284 -0
  244. package/dist/unified/base/agentStep.d.ts +32 -0
  245. package/dist/unified/base/agentStep.js +96 -0
  246. package/dist/unified/base/create/createInitialPromptGenerators.d.ts +5 -0
  247. package/dist/unified/base/create/createInitialPromptGenerators.js +17 -0
  248. package/dist/unified/base/index.d.ts +5 -0
  249. package/dist/unified/base/index.js +13 -0
  250. package/dist/unified/base/initialPromptGenerator.d.ts +48 -0
  251. package/dist/unified/base/initialPromptGenerator.js +118 -0
  252. package/dist/unified/base/responseExecutor.d.ts +36 -0
  253. package/dist/unified/base/responseExecutor.js +283 -0
  254. package/dist/unified/examples/agentExample.d.ts +46 -0
  255. package/dist/unified/examples/agentExample.js +464 -0
  256. package/dist/unified/examples/documentationPatternExample.d.ts +10 -0
  257. package/dist/unified/examples/documentationPatternExample.js +385 -0
  258. package/dist/unified/examples/followUpProcessorsExample.d.ts +45 -0
  259. package/dist/unified/examples/followUpProcessorsExample.js +311 -0
  260. package/dist/unified/examples/orchestratorExample.d.ts +16 -0
  261. package/dist/unified/examples/orchestratorExample.js +415 -0
  262. package/dist/unified/examples/preToolCallProcessorsExample.d.ts +36 -0
  263. package/dist/unified/examples/preToolCallProcessorsExample.js +458 -0
  264. package/dist/unified/examples/workflowExample.d.ts +12 -0
  265. package/dist/unified/examples/workflowExample.js +497 -0
  266. package/dist/unified/index.d.ts +18 -0
  267. package/dist/unified/index.js +42 -0
  268. package/dist/unified/orchestrator/orchestrator.d.ts +260 -0
  269. package/dist/unified/orchestrator/orchestrator.js +519 -0
  270. package/dist/unified/team/team.d.ts +1 -0
  271. package/dist/unified/team/team.js +2 -0
  272. package/dist/unified/types/libTypes.d.ts +378 -0
  273. package/dist/unified/types/libTypes.js +6 -0
  274. package/dist/unified/types/types.d.ts +212 -0
  275. package/dist/unified/types/types.js +43 -0
  276. package/dist/unified/utils/utils.d.ts +40 -0
  277. package/dist/unified/utils/utils.js +219 -0
  278. package/package.json +35 -13
  279. /package/dist/{agent.d.ts → builderpattern/agent.d.ts} +0 -0
  280. /package/dist/{index.js → builderpattern/index.js} +0 -0
  281. /package/dist/{promptbuilder.js → builderpattern/promptbuilder.js} +0 -0
  282. /package/dist/{systemprompt.d.ts → builderpattern/systemprompt.d.ts} +0 -0
  283. /package/dist/{systemprompt.js → builderpattern/systemprompt.js} +0 -0
  284. /package/dist/{taskInstruction.js → builderpattern/taskInstruction.js} +0 -0
  285. /package/dist/{usermessage.js → builderpattern/usermessage.js} +0 -0
@@ -0,0 +1,392 @@
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.WorkingDirectoryMessageModifier = void 0;
40
+ const base_1 = require("../base");
41
+ const codeboltjs_1 = __importDefault(require("@codebolt/codeboltjs"));
42
+ const path = __importStar(require("path"));
43
+ const fs = __importStar(require("fs/promises"));
44
+ class WorkingDirectoryMessageModifier extends base_1.BaseMessageModifier {
45
+ constructor(options = {}) {
46
+ super({ context: options });
47
+ this.defaultIgnoredFolders = new Set(['node_modules', '.git', 'dist', '.codebolt', '.codeboltAgents']);
48
+ this.truncationIndicator = '...';
49
+ this.showFolderStructureSummary = options.showFolderStructureSummary || false;
50
+ this.listFiles = options.listFiles || false;
51
+ this.listFilesDepth = options.listFilesDepth || 2;
52
+ this.listFilesLimit = options.listFilesLimit || 100;
53
+ this.listFilesIgnoreFromGitignore = options.listFilesIgnoreFromGitignore || true;
54
+ this.listFilesIgnore = options.listFilesIgnore || ['node_modules', '.git', 'dist', '.codebolt', '.codeboltAgents'];
55
+ this.maxItems = options.maxItems || 200;
56
+ this.showFullDirectoryContext = options.showFullDirectoryContext || true;
57
+ }
58
+ async modify(originalRequest, createdMessage) {
59
+ try {
60
+ const contextParts = [];
61
+ // Get project information
62
+ try {
63
+ const { projectPath } = await codeboltjs_1.default.project.getProjectPath();
64
+ if (!projectPath) {
65
+ throw new Error('Project path not available');
66
+ }
67
+ // Generate comprehensive directory context similar to gemini-cli
68
+ if (this.showFullDirectoryContext) {
69
+ const directoryContext = await this.getDirectoryContextString(projectPath);
70
+ contextParts.push(directoryContext);
71
+ }
72
+ else {
73
+ // Fallback to original behavior
74
+ contextParts.push(`Project Directory: ${projectPath}`);
75
+ if (this.showFolderStructureSummary) {
76
+ const summary = await this.generateFolderStructureSummary(projectPath);
77
+ contextParts.push(`Folder Structure Summary:\n${summary}`);
78
+ }
79
+ if (this.listFiles) {
80
+ const filesList = await this.generateFilesList(projectPath);
81
+ contextParts.push(`Files List:\n${filesList}`);
82
+ }
83
+ }
84
+ }
85
+ catch (error) {
86
+ console.error('Error getting project information:', error);
87
+ contextParts.push('Working Directory: Unable to access project information');
88
+ }
89
+ // Create context message if we have any context parts
90
+ if (contextParts.length > 0) {
91
+ const contextContent = contextParts.join('\n\n');
92
+ const messages = [...createdMessage.message.messages];
93
+ // Find existing system message
94
+ const systemMessageIndex = messages.findIndex(msg => msg.role === 'system');
95
+ if (systemMessageIndex !== -1) {
96
+ // Update existing system message
97
+ messages[systemMessageIndex] = {
98
+ ...messages[systemMessageIndex],
99
+ content: `${messages[systemMessageIndex].content}\n\n${contextContent}`
100
+ };
101
+ }
102
+ else {
103
+ // Add new system message at the top
104
+ messages.unshift({
105
+ role: 'system',
106
+ content: contextContent
107
+ });
108
+ }
109
+ return {
110
+ ...createdMessage,
111
+ message: {
112
+ ...createdMessage.message,
113
+ messages
114
+ },
115
+ metadata: {
116
+ ...createdMessage.metadata,
117
+ workingDirectoryContextAdded: true,
118
+ contextParts: contextParts.length
119
+ }
120
+ };
121
+ }
122
+ return createdMessage;
123
+ }
124
+ catch (error) {
125
+ console.error('Error in WorkingDirectoryMessageModifier:', error);
126
+ throw error;
127
+ }
128
+ }
129
+ async generateFolderStructureSummary(projectPath) {
130
+ try {
131
+ const directories = new Set();
132
+ await this.collectDirectories(projectPath, directories, 0, 3); // Max depth of 3
133
+ const sortedDirs = Array.from(directories)
134
+ .filter(dir => dir !== projectPath && !this.shouldIgnore(dir))
135
+ .sort()
136
+ .slice(0, 20);
137
+ return sortedDirs.length > 0
138
+ ? sortedDirs.join('\n')
139
+ : 'No accessible directories found';
140
+ }
141
+ catch (error) {
142
+ return 'Unable to generate folder structure summary';
143
+ }
144
+ }
145
+ async generateFilesList(projectPath) {
146
+ try {
147
+ const files = [];
148
+ await this.collectFiles(projectPath, files, 0, 2); // Max depth of 2
149
+ const filteredFiles = files
150
+ .filter(filePath => !this.shouldIgnore(filePath))
151
+ .slice(0, this.listFilesLimit)
152
+ .map(filePath => path.basename(filePath));
153
+ return filteredFiles.length > 0
154
+ ? filteredFiles.join('\n')
155
+ : 'No accessible files found';
156
+ }
157
+ catch (error) {
158
+ return 'Unable to generate files list';
159
+ }
160
+ }
161
+ async collectDirectories(dirPath, directories, currentDepth, maxDepth) {
162
+ if (currentDepth >= maxDepth)
163
+ return;
164
+ try {
165
+ const entries = await fs.readdir(dirPath, { withFileTypes: true });
166
+ for (const entry of entries) {
167
+ if (entry.isDirectory()) {
168
+ const fullPath = path.join(dirPath, entry.name);
169
+ if (!this.shouldIgnore(fullPath)) {
170
+ directories.add(fullPath);
171
+ await this.collectDirectories(fullPath, directories, currentDepth + 1, maxDepth);
172
+ }
173
+ }
174
+ }
175
+ }
176
+ catch (error) {
177
+ // Skip directories we can't read
178
+ }
179
+ }
180
+ async collectFiles(dirPath, files, currentDepth, maxDepth) {
181
+ if (currentDepth >= maxDepth || files.length >= this.listFilesLimit)
182
+ return;
183
+ try {
184
+ const entries = await fs.readdir(dirPath, { withFileTypes: true });
185
+ for (const entry of entries) {
186
+ if (entry.isFile()) {
187
+ const fullPath = path.join(dirPath, entry.name);
188
+ if (!this.shouldIgnore(fullPath)) {
189
+ files.push(fullPath);
190
+ if (files.length >= this.listFilesLimit)
191
+ break;
192
+ }
193
+ }
194
+ else if (entry.isDirectory() && currentDepth < maxDepth - 1) {
195
+ const fullPath = path.join(dirPath, entry.name);
196
+ if (!this.shouldIgnore(fullPath)) {
197
+ await this.collectFiles(fullPath, files, currentDepth + 1, maxDepth);
198
+ }
199
+ }
200
+ }
201
+ }
202
+ catch (error) {
203
+ // Skip directories we can't read
204
+ }
205
+ }
206
+ shouldIgnore(filePath) {
207
+ const basename = path.basename(filePath);
208
+ // Ignore any folder/file that starts with a dot
209
+ if (basename.startsWith('.')) {
210
+ return true;
211
+ }
212
+ return this.listFilesIgnore.some(ignore => filePath.includes(ignore) || basename === ignore);
213
+ }
214
+ // Comprehensive directory context methods exactly like gemini-cli
215
+ async getDirectoryContextString(projectPath) {
216
+ const folderStructure = await this.getFolderStructure(projectPath);
217
+ const workingDirPreamble = `I'm currently working in the directory: ${projectPath}`;
218
+ return `${workingDirPreamble}
219
+ Here is the folder structure of the current working directories:
220
+
221
+ ${folderStructure}`;
222
+ }
223
+ async getFolderStructure(directory) {
224
+ const resolvedPath = path.resolve(directory);
225
+ try {
226
+ const structureRoot = await this.readFullStructure(resolvedPath);
227
+ if (!structureRoot) {
228
+ return `Error: Could not read directory "${resolvedPath}". Check path and permissions.`;
229
+ }
230
+ const structureLines = [];
231
+ this.formatStructure(structureRoot, '', true, true, structureLines);
232
+ const isTruncated = this.isTruncated(structureRoot);
233
+ let summary = `Showing up to ${this.maxItems} items (files + folders).`;
234
+ if (isTruncated) {
235
+ summary += ` Folders or files indicated with ${this.truncationIndicator} contain more items not shown, were ignored, or the display limit (${this.maxItems} items) was reached.`;
236
+ }
237
+ return `${summary}\n\n${resolvedPath}${path.sep}\n${structureLines.join('\n')}`;
238
+ }
239
+ catch (error) {
240
+ console.error(`Error getting folder structure for ${resolvedPath}:`, error);
241
+ return `Error processing directory "${resolvedPath}": ${error instanceof Error ? error.message : String(error)}`;
242
+ }
243
+ }
244
+ async readFullStructure(rootPath) {
245
+ const rootName = path.basename(rootPath);
246
+ const rootNode = {
247
+ name: rootName,
248
+ path: rootPath,
249
+ files: [],
250
+ subFolders: [],
251
+ totalChildren: 0,
252
+ totalFiles: 0,
253
+ };
254
+ const queue = [
255
+ { folderInfo: rootNode, currentPath: rootPath },
256
+ ];
257
+ let currentItemCount = 0;
258
+ const processedPaths = new Set();
259
+ while (queue.length > 0) {
260
+ const { folderInfo, currentPath } = queue.shift();
261
+ if (processedPaths.has(currentPath)) {
262
+ continue;
263
+ }
264
+ processedPaths.add(currentPath);
265
+ if (currentItemCount >= this.maxItems) {
266
+ continue;
267
+ }
268
+ let entries;
269
+ try {
270
+ const rawEntries = await fs.readdir(currentPath, { withFileTypes: true });
271
+ entries = rawEntries.sort((a, b) => a.name.localeCompare(b.name));
272
+ }
273
+ catch (error) {
274
+ if (error.code === 'EACCES' || error.code === 'ENOENT') {
275
+ console.warn(`Warning: Could not read directory ${currentPath}: ${error.message}`);
276
+ if (currentPath === rootPath && error.code === 'ENOENT') {
277
+ return null;
278
+ }
279
+ continue;
280
+ }
281
+ throw error;
282
+ }
283
+ const filesInCurrentDir = [];
284
+ const subFoldersInCurrentDir = [];
285
+ // Process files first
286
+ for (const entry of entries) {
287
+ if (entry.isFile()) {
288
+ if (currentItemCount >= this.maxItems) {
289
+ folderInfo.hasMoreFiles = true;
290
+ break;
291
+ }
292
+ const fileName = entry.name;
293
+ const filePath = path.join(currentPath, fileName);
294
+ if (!this.shouldIgnore(filePath)) {
295
+ filesInCurrentDir.push(fileName);
296
+ currentItemCount++;
297
+ folderInfo.totalFiles++;
298
+ folderInfo.totalChildren++;
299
+ }
300
+ }
301
+ }
302
+ folderInfo.files = filesInCurrentDir;
303
+ // Process directories
304
+ for (const entry of entries) {
305
+ if (entry.isDirectory()) {
306
+ if (currentItemCount >= this.maxItems) {
307
+ folderInfo.hasMoreSubfolders = true;
308
+ break;
309
+ }
310
+ const subFolderName = entry.name;
311
+ const subFolderPath = path.join(currentPath, subFolderName);
312
+ const isIgnored = this.defaultIgnoredFolders.has(subFolderName) ||
313
+ subFolderName.startsWith('.') ||
314
+ this.shouldIgnore(subFolderPath);
315
+ if (isIgnored) {
316
+ const ignoredSubFolder = {
317
+ name: subFolderName,
318
+ path: subFolderPath,
319
+ files: [],
320
+ subFolders: [],
321
+ totalChildren: 0,
322
+ totalFiles: 0,
323
+ isIgnored: true,
324
+ };
325
+ subFoldersInCurrentDir.push(ignoredSubFolder);
326
+ currentItemCount++;
327
+ folderInfo.totalChildren++;
328
+ continue;
329
+ }
330
+ const subFolderNode = {
331
+ name: subFolderName,
332
+ path: subFolderPath,
333
+ files: [],
334
+ subFolders: [],
335
+ totalChildren: 0,
336
+ totalFiles: 0,
337
+ };
338
+ subFoldersInCurrentDir.push(subFolderNode);
339
+ currentItemCount++;
340
+ folderInfo.totalChildren++;
341
+ queue.push({ folderInfo: subFolderNode, currentPath: subFolderPath });
342
+ }
343
+ }
344
+ folderInfo.subFolders = subFoldersInCurrentDir;
345
+ }
346
+ return rootNode;
347
+ }
348
+ formatStructure(node, currentIndent, isLastChildOfParent, isProcessingRootNode, builder) {
349
+ const connector = isLastChildOfParent ? '└───' : '├───';
350
+ if (!isProcessingRootNode || node.isIgnored) {
351
+ builder.push(`${currentIndent}${connector}${node.name}${path.sep}${node.isIgnored ? this.truncationIndicator : ''}`);
352
+ }
353
+ const indentForChildren = isProcessingRootNode
354
+ ? ''
355
+ : currentIndent + (isLastChildOfParent ? ' ' : '│ ');
356
+ // Render files
357
+ const fileCount = node.files.length;
358
+ for (let i = 0; i < fileCount; i++) {
359
+ const isLastFileAmongSiblings = i === fileCount - 1 &&
360
+ node.subFolders.length === 0 &&
361
+ !node.hasMoreSubfolders;
362
+ const fileConnector = isLastFileAmongSiblings ? '└───' : '├───';
363
+ builder.push(`${indentForChildren}${fileConnector}${node.files[i]}`);
364
+ }
365
+ if (node.hasMoreFiles) {
366
+ const isLastIndicatorAmongSiblings = node.subFolders.length === 0 && !node.hasMoreSubfolders;
367
+ const fileConnector = isLastIndicatorAmongSiblings ? '└───' : '├───';
368
+ builder.push(`${indentForChildren}${fileConnector}${this.truncationIndicator}`);
369
+ }
370
+ // Render subfolders
371
+ const subFolderCount = node.subFolders.length;
372
+ for (let i = 0; i < subFolderCount; i++) {
373
+ const isLastSubfolderAmongSiblings = i === subFolderCount - 1 && !node.hasMoreSubfolders;
374
+ this.formatStructure(node.subFolders[i], indentForChildren, isLastSubfolderAmongSiblings, false, builder);
375
+ }
376
+ if (node.hasMoreSubfolders) {
377
+ builder.push(`${indentForChildren}└───${this.truncationIndicator}`);
378
+ }
379
+ }
380
+ isTruncated(node) {
381
+ if (node.hasMoreFiles || node.hasMoreSubfolders || node.isIgnored) {
382
+ return true;
383
+ }
384
+ for (const sub of node.subFolders) {
385
+ if (this.isTruncated(sub)) {
386
+ return true;
387
+ }
388
+ }
389
+ return false;
390
+ }
391
+ }
392
+ exports.WorkingDirectoryMessageModifier = WorkingDirectoryMessageModifier;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,7 @@
1
+ import { ProcessedMessage } from "@codebolt/types/agent";
2
+ import { BasePostInferenceProcessor } from "../base";
3
+ import { LLMResponse } from "@codebolt/types/sdk";
4
+ export declare class CheckForNoToolCall extends BasePostInferenceProcessor {
5
+ constructor();
6
+ modify(llmMessageSent: ProcessedMessage, llmResponseMessage: LLMResponse, nextPrompt: ProcessedMessage): Promise<ProcessedMessage>;
7
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CheckForNoToolCall = void 0;
4
+ const base_1 = require("../base");
5
+ class CheckForNoToolCall extends base_1.BasePostInferenceProcessor {
6
+ constructor() {
7
+ super();
8
+ }
9
+ modify(llmMessageSent, llmResponseMessage, nextPrompt) {
10
+ // Check if tool_calls exist in the LLM response
11
+ const hasToolCalls = llmResponseMessage.tool_calls && llmResponseMessage.tool_calls.length > 0;
12
+ if (!hasToolCalls) {
13
+ // Create a new message indicating no tool call was found
14
+ const noToolCallMessage = {
15
+ role: 'user',
16
+ content: 'no tool call found in request'
17
+ };
18
+ nextPrompt.message.messages.push(noToolCallMessage);
19
+ }
20
+ // If tool calls exist, return the nextPrompt unchanged
21
+ return Promise.resolve(nextPrompt);
22
+ }
23
+ }
24
+ exports.CheckForNoToolCall = CheckForNoToolCall;
@@ -0,0 +1,29 @@
1
+ import { ProcessedMessage } from "@codebolt/types/agent";
2
+ import { BasePostInferenceProcessor } from "../base";
3
+ import { LLMResponse } from "@codebolt/types/sdk";
4
+ export interface LoopDetectionOptions {
5
+ maxSimilarMessages?: number;
6
+ similarityThreshold?: number;
7
+ timeWindowMs?: number;
8
+ enableLoopPrevention?: boolean;
9
+ }
10
+ interface MessageHistory {
11
+ content: string;
12
+ timestamp: number;
13
+ role: string;
14
+ }
15
+ export declare class LoopDetectionModifier extends BasePostInferenceProcessor {
16
+ private readonly options;
17
+ private messageHistory;
18
+ private loopDetected;
19
+ constructor(options?: LoopDetectionOptions);
20
+ modify(llmMessageSent: ProcessedMessage, llmResponseMessage: LLMResponse, nextPrompt: ProcessedMessage): Promise<ProcessedMessage>;
21
+ private detectLoop;
22
+ private checkSimilarMessages;
23
+ private calculateSimilarity;
24
+ private levenshteinDistance;
25
+ private cleanOldMessages;
26
+ resetLoopDetection(): void;
27
+ getMessageHistory(): MessageHistory[];
28
+ }
29
+ export {};
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LoopDetectionModifier = void 0;
4
+ const base_1 = require("../base");
5
+ class LoopDetectionModifier extends base_1.BasePostInferenceProcessor {
6
+ constructor(options = {}) {
7
+ super();
8
+ this.messageHistory = [];
9
+ this.loopDetected = false;
10
+ this.options = {
11
+ maxSimilarMessages: options.maxSimilarMessages || 3,
12
+ similarityThreshold: options.similarityThreshold || 0.8,
13
+ timeWindowMs: options.timeWindowMs || 60000, // 1 minute
14
+ enableLoopPrevention: options.enableLoopPrevention !== false
15
+ };
16
+ }
17
+ modify(llmMessageSent, llmResponseMessage, nextPrompt) {
18
+ try {
19
+ if (!this.options.enableLoopPrevention) {
20
+ return Promise.resolve(nextPrompt);
21
+ }
22
+ const currentTime = Date.now();
23
+ // Add LLM response to history
24
+ if (llmResponseMessage.content) {
25
+ this.messageHistory.push({
26
+ content: llmResponseMessage.content,
27
+ timestamp: currentTime,
28
+ role: llmResponseMessage.role
29
+ });
30
+ }
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
+ // Add the original sent message to history if it exists
44
+ for (const message of llmMessageSent.message.messages) {
45
+ if (typeof message.content === 'string') {
46
+ this.messageHistory.push({
47
+ content: message.content,
48
+ timestamp: currentTime,
49
+ role: message.role
50
+ });
51
+ }
52
+ }
53
+ // Clean old messages from history
54
+ this.cleanOldMessages(currentTime);
55
+ // Check for loops
56
+ const loopDetected = this.detectLoop();
57
+ if (loopDetected && !this.loopDetected) {
58
+ this.loopDetected = true;
59
+ // Add loop detection warning to the next prompt
60
+ const warningMessage = {
61
+ role: 'system',
62
+ 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
+ };
64
+ const updatedMessages = [...nextPrompt.message.messages, warningMessage];
65
+ return Promise.resolve({
66
+ message: {
67
+ ...nextPrompt.message,
68
+ messages: updatedMessages
69
+ },
70
+ metadata: {
71
+ ...nextPrompt.metadata,
72
+ loopDetected: true,
73
+ loopDetectionWarningAdded: true
74
+ }
75
+ });
76
+ }
77
+ // Reset loop detection if we haven't detected a loop recently
78
+ if (!loopDetected && this.loopDetected) {
79
+ this.loopDetected = false;
80
+ }
81
+ return Promise.resolve({
82
+ message: nextPrompt.message,
83
+ metadata: {
84
+ ...nextPrompt.metadata,
85
+ loopDetectionChecked: true,
86
+ loopDetected: false
87
+ }
88
+ });
89
+ }
90
+ catch (error) {
91
+ console.error('Error in LoopDetectionModifier:', error);
92
+ return Promise.resolve(nextPrompt);
93
+ }
94
+ }
95
+ detectLoop() {
96
+ if (this.messageHistory.length < this.options.maxSimilarMessages) {
97
+ return false;
98
+ }
99
+ // Get recent messages grouped by role
100
+ const recentUserMessages = this.messageHistory
101
+ .filter(msg => msg.role === 'user')
102
+ .slice(-this.options.maxSimilarMessages);
103
+ const recentAssistantMessages = this.messageHistory
104
+ .filter(msg => msg.role === 'assistant')
105
+ .slice(-this.options.maxSimilarMessages);
106
+ // Check for similar user messages
107
+ if (recentUserMessages.length >= this.options.maxSimilarMessages) {
108
+ const userLoop = this.checkSimilarMessages(recentUserMessages);
109
+ if (userLoop)
110
+ return true;
111
+ }
112
+ // Check for similar assistant messages
113
+ if (recentAssistantMessages.length >= this.options.maxSimilarMessages) {
114
+ const assistantLoop = this.checkSimilarMessages(recentAssistantMessages);
115
+ if (assistantLoop)
116
+ return true;
117
+ }
118
+ return false;
119
+ }
120
+ checkSimilarMessages(messages) {
121
+ if (messages.length < 2)
122
+ return false;
123
+ // Compare each message with every other message
124
+ for (let i = 0; i < messages.length - 1; i++) {
125
+ for (let j = i + 1; j < messages.length; j++) {
126
+ const similarity = this.calculateSimilarity(messages[i].content, messages[j].content);
127
+ if (similarity >= this.options.similarityThreshold) {
128
+ return true;
129
+ }
130
+ }
131
+ }
132
+ return false;
133
+ }
134
+ calculateSimilarity(text1, text2) {
135
+ // Simple similarity calculation using Levenshtein distance
136
+ const distance = this.levenshteinDistance(text1.toLowerCase(), text2.toLowerCase());
137
+ const maxLength = Math.max(text1.length, text2.length);
138
+ if (maxLength === 0)
139
+ return 1;
140
+ return 1 - (distance / maxLength);
141
+ }
142
+ levenshteinDistance(str1, str2) {
143
+ const matrix = [];
144
+ for (let i = 0; i <= str2.length; i++) {
145
+ matrix[i] = [i];
146
+ }
147
+ for (let j = 0; j <= str1.length; j++) {
148
+ matrix[0][j] = j;
149
+ }
150
+ for (let i = 1; i <= str2.length; i++) {
151
+ for (let j = 1; j <= str1.length; j++) {
152
+ if (str2.charAt(i - 1) === str1.charAt(j - 1)) {
153
+ matrix[i][j] = matrix[i - 1][j - 1];
154
+ }
155
+ else {
156
+ matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j] + 1);
157
+ }
158
+ }
159
+ }
160
+ return matrix[str2.length][str1.length];
161
+ }
162
+ cleanOldMessages(currentTime) {
163
+ const cutoffTime = currentTime - this.options.timeWindowMs;
164
+ this.messageHistory = this.messageHistory.filter(msg => msg.timestamp >= cutoffTime);
165
+ }
166
+ resetLoopDetection() {
167
+ this.messageHistory = [];
168
+ this.loopDetected = false;
169
+ }
170
+ getMessageHistory() {
171
+ return [...this.messageHistory];
172
+ }
173
+ }
174
+ exports.LoopDetectionModifier = LoopDetectionModifier;
@@ -0,0 +1,41 @@
1
+ import { BaseProcessor, ProcessorInput, ProcessorOutput } from '../../processor';
2
+ export interface AdvancedLoopDetectionProcessorOptions {
3
+ toolCallThreshold?: number;
4
+ contentLoopThreshold?: number;
5
+ contentChunkSize?: number;
6
+ maxHistoryLength?: number;
7
+ enableLLMDetection?: boolean;
8
+ llmCheckAfterTurns?: number;
9
+ defaultLLMCheckInterval?: number;
10
+ }
11
+ export declare class AdvancedLoopDetectionProcessor extends BaseProcessor {
12
+ private readonly toolCallThreshold;
13
+ private readonly contentLoopThreshold;
14
+ private readonly contentChunkSize;
15
+ private readonly maxHistoryLength;
16
+ private readonly enableLLMDetection;
17
+ private readonly llmCheckAfterTurns;
18
+ private readonly defaultLLMCheckInterval;
19
+ private lastToolCallKey;
20
+ private toolCallRepetitionCount;
21
+ private streamContentHistory;
22
+ private contentStats;
23
+ private lastContentIndex;
24
+ private loopDetected;
25
+ private inCodeBlock;
26
+ private turnsInCurrentPrompt;
27
+ private llmCheckInterval;
28
+ private lastCheckTurn;
29
+ constructor(options?: AdvancedLoopDetectionProcessorOptions);
30
+ processInput(input: ProcessorInput): Promise<ProcessorOutput[]>;
31
+ private getToolCallKey;
32
+ private checkToolCallLoop;
33
+ private checkContentLoop;
34
+ private truncateAndUpdate;
35
+ private analyzeContentChunksForLoop;
36
+ private hasMoreChunksToProcess;
37
+ private isLoopDetectedForChunk;
38
+ private isActualContentMatch;
39
+ private resetContentTracking;
40
+ reset(): void;
41
+ }