@tyvm/knowhow 0.0.16 → 0.0.17

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 (126) hide show
  1. package/package.json +2 -1
  2. package/src/agents/base/base.ts +25 -6
  3. package/src/agents/index.ts +2 -2
  4. package/src/agents/tools/agentCall.ts +0 -1
  5. package/src/agents/tools/execCommand.ts +95 -4
  6. package/src/agents/tools/list.ts +23 -19
  7. package/src/agents/tools/writeFile.ts +1 -1
  8. package/src/chat.ts +11 -0
  9. package/src/config.ts +3 -1
  10. package/src/processors/Base64ImageDetector.ts +190 -0
  11. package/src/processors/TokenCompressor.ts +357 -0
  12. package/src/processors/ToolResponseCache.ts +235 -0
  13. package/src/services/MessageProcessor.ts +107 -0
  14. package/src/services/Tools.ts +100 -1
  15. package/src/services/types.ts +57 -0
  16. package/ts_build/src/agents/base/base.d.ts +3 -1
  17. package/ts_build/src/agents/base/base.js +20 -5
  18. package/ts_build/src/agents/base/base.js.map +1 -1
  19. package/ts_build/src/agents/index.d.ts +2 -2
  20. package/ts_build/src/agents/index.js +5 -3
  21. package/ts_build/src/agents/index.js.map +1 -1
  22. package/ts_build/src/agents/tools/agentCall.js.map +1 -1
  23. package/ts_build/src/agents/tools/execCommand.d.ts +6 -1
  24. package/ts_build/src/agents/tools/execCommand.js +70 -4
  25. package/ts_build/src/agents/tools/execCommand.js.map +1 -1
  26. package/ts_build/src/agents/tools/expandTokens.d.ts +3 -0
  27. package/ts_build/src/agents/tools/expandTokens.js +33 -0
  28. package/ts_build/src/agents/tools/expandTokens.js.map +1 -0
  29. package/ts_build/src/agents/tools/getBigString.d.ts +3 -0
  30. package/ts_build/src/agents/tools/getBigString.js +33 -0
  31. package/ts_build/src/agents/tools/getBigString.js.map +1 -0
  32. package/ts_build/src/agents/tools/list.js +19 -17
  33. package/ts_build/src/agents/tools/list.js.map +1 -1
  34. package/ts_build/src/agents/tools/writeFile.js +1 -1
  35. package/ts_build/src/agents/tools/writeFile.js.map +1 -1
  36. package/ts_build/src/chat.js +6 -0
  37. package/ts_build/src/chat.js.map +1 -1
  38. package/ts_build/src/config.js +1 -1
  39. package/ts_build/src/config.js.map +1 -1
  40. package/ts_build/src/processors/Base64ImageDetector.d.ts +14 -0
  41. package/ts_build/src/processors/Base64ImageDetector.js +153 -0
  42. package/ts_build/src/processors/Base64ImageDetector.js.map +1 -0
  43. package/ts_build/src/processors/TokenCompressor.d.ts +28 -0
  44. package/ts_build/src/processors/TokenCompressor.js +226 -0
  45. package/ts_build/src/processors/TokenCompressor.js.map +1 -0
  46. package/ts_build/src/processors/ToolResponseCache.d.ts +22 -0
  47. package/ts_build/src/processors/ToolResponseCache.js +164 -0
  48. package/ts_build/src/processors/ToolResponseCache.js.map +1 -0
  49. package/ts_build/src/processors/ToolResponseManipulator.d.ts +22 -0
  50. package/ts_build/src/processors/ToolResponseManipulator.js +162 -0
  51. package/ts_build/src/processors/ToolResponseManipulator.js.map +1 -0
  52. package/ts_build/src/services/MessageProcessor.d.ts +17 -0
  53. package/ts_build/src/services/MessageProcessor.js +63 -0
  54. package/ts_build/src/services/MessageProcessor.js.map +1 -0
  55. package/ts_build/src/services/Tools.d.ts +12 -0
  56. package/ts_build/src/services/Tools.js +71 -0
  57. package/ts_build/src/services/Tools.js.map +1 -1
  58. package/ts_build/src/services/types.d.ts +32 -0
  59. package/ts_build/src/services/types.js +38 -0
  60. package/ts_build/src/services/types.js.map +1 -0
  61. package/ts_build/src/agents/configurable/OpenAIAgent.d.ts +0 -0
  62. package/ts_build/src/agents/configurable/OpenAIAgent.js +0 -1
  63. package/ts_build/src/agents/configurable/OpenAIAgent.js.map +0 -1
  64. package/ts_build/src/agents/tools/client.d.ts +0 -5
  65. package/ts_build/src/agents/tools/client.js +0 -21
  66. package/ts_build/src/agents/tools/client.js.map +0 -1
  67. package/ts_build/src/agents/tools/googleSearchTypes.d.ts +0 -74
  68. package/ts_build/src/agents/tools/googleSearchTypes.js +0 -3
  69. package/ts_build/src/agents/tools/googleSearchTypes.js.map +0 -1
  70. package/ts_build/src/commands/chat-ui.d.ts +0 -1
  71. package/ts_build/src/commands/chat-ui.js +0 -14
  72. package/ts_build/src/commands/chat-ui.js.map +0 -1
  73. package/ts_build/src/demo/chat-ui-demo.d.ts +0 -3
  74. package/ts_build/src/demo/chat-ui-demo.js +0 -20
  75. package/ts_build/src/demo/chat-ui-demo.js.map +0 -1
  76. package/ts_build/src/plugins/EmbeddingPluginV2.d.ts +0 -7
  77. package/ts_build/src/plugins/EmbeddingPluginV2.js +0 -41
  78. package/ts_build/src/plugins/EmbeddingPluginV2.js.map +0 -1
  79. package/ts_build/src/plugins/GitHubPluginV2.d.ts +0 -10
  80. package/ts_build/src/plugins/GitHubPluginV2.js +0 -57
  81. package/ts_build/src/plugins/GitHubPluginV2.js.map +0 -1
  82. package/ts_build/src/plugins/downloader/index.d.ts +0 -3
  83. package/ts_build/src/plugins/downloader/index.js +0 -41
  84. package/ts_build/src/plugins/downloader/index.js.map +0 -1
  85. package/ts_build/src/services/MessagePreprocessor.d.ts +0 -26
  86. package/ts_build/src/services/MessagePreprocessor.js +0 -190
  87. package/ts_build/src/services/MessagePreprocessor.js.map +0 -1
  88. package/ts_build/src/services/__tests__/MessagePreprocessor.test.d.ts +0 -1
  89. package/ts_build/src/services/__tests__/MessagePreprocessor.test.js +0 -117
  90. package/ts_build/src/services/__tests__/MessagePreprocessor.test.js.map +0 -1
  91. package/ts_build/src/terminal.d.ts +0 -1
  92. package/ts_build/src/terminal.js +0 -35
  93. package/ts_build/src/terminal.js.map +0 -1
  94. package/ts_build/src/ui/InkChatUI.d.ts +0 -1
  95. package/ts_build/src/ui/InkChatUI.js +0 -792
  96. package/ts_build/src/ui/InkChatUI.js.map +0 -1
  97. package/ts_build/src/ui/components/ChatInterface.d.ts +0 -15
  98. package/ts_build/src/ui/components/ChatInterface.js +0 -39
  99. package/ts_build/src/ui/components/ChatInterface.js.map +0 -1
  100. package/ts_build/src/ui/components/ChatMessage.d.ts +0 -8
  101. package/ts_build/src/ui/components/ChatMessage.js +0 -7
  102. package/ts_build/src/ui/components/ChatMessage.js.map +0 -1
  103. package/ts_build/src/ui/components/CommandPalette.d.ts +0 -8
  104. package/ts_build/src/ui/components/CommandPalette.js +0 -23
  105. package/ts_build/src/ui/components/CommandPalette.js.map +0 -1
  106. package/ts_build/src/ui/components/InputBar.d.ts +0 -8
  107. package/ts_build/src/ui/components/InputBar.js +0 -8
  108. package/ts_build/src/ui/components/InputBar.js.map +0 -1
  109. package/ts_build/src/ui/components/Sidebar.d.ts +0 -9
  110. package/ts_build/src/ui/components/Sidebar.js +0 -7
  111. package/ts_build/src/ui/components/Sidebar.js.map +0 -1
  112. package/ts_build/src/ui/components/StatusBar.d.ts +0 -10
  113. package/ts_build/src/ui/components/StatusBar.js +0 -8
  114. package/ts_build/src/ui/components/StatusBar.js.map +0 -1
  115. package/ts_build/src/ui/demo.d.ts +0 -3
  116. package/ts_build/src/ui/demo.js +0 -26
  117. package/ts_build/src/ui/demo.js.map +0 -1
  118. package/ts_build/src/ui/index.d.ts +0 -13
  119. package/ts_build/src/ui/index.js +0 -16
  120. package/ts_build/src/ui/index.js.map +0 -1
  121. package/ts_build/tests/integration/OpenAI-MessagePreprocessor.test.d.ts +0 -1
  122. package/ts_build/tests/integration/OpenAI-MessagePreprocessor.test.js +0 -148
  123. package/ts_build/tests/integration/OpenAI-MessagePreprocessor.test.js.map +0 -1
  124. package/ts_build/tests/services/MessagePreprocessor.test.d.ts +0 -1
  125. package/ts_build/tests/services/MessagePreprocessor.test.js +0 -117
  126. package/ts_build/tests/services/MessagePreprocessor.test.js.map +0 -1
@@ -0,0 +1,226 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.expandTokensDefinition = exports.TokenCompressor = void 0;
4
+ class TokenCompressor {
5
+ storage = {};
6
+ maxTokens = 20000;
7
+ compressionRatio = 0.1;
8
+ keyPrefix = "compressed_";
9
+ jsonPropertyThreshold = 20000;
10
+ toolName = exports.expandTokensDefinition.function.name;
11
+ characterLimit = 16000;
12
+ constructor(toolsService) {
13
+ this.registerTool(toolsService);
14
+ }
15
+ estimateTokens(text) {
16
+ return Math.ceil(text.length / 4);
17
+ }
18
+ tryParseJson(content) {
19
+ try {
20
+ return JSON.parse(content);
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ }
26
+ compressStringInChunks(content, path = "") {
27
+ if (content.length <= this.characterLimit) {
28
+ return content;
29
+ }
30
+ const chunks = [];
31
+ const chunkKeys = [];
32
+ let remaining = content;
33
+ while (remaining.length > this.characterLimit) {
34
+ const chunkStart = remaining.length - this.characterLimit;
35
+ const chunk = remaining.substring(chunkStart);
36
+ chunks.unshift(chunk);
37
+ remaining = remaining.substring(0, chunkStart);
38
+ }
39
+ if (remaining.length > 0) {
40
+ chunks.unshift(remaining);
41
+ }
42
+ for (let i = chunks.length - 1; i >= 0; i--) {
43
+ const key = this.generateKey();
44
+ chunkKeys.unshift(key);
45
+ let chunkContent = chunks[i];
46
+ if (i < chunks.length - 1) {
47
+ const nextKey = chunkKeys[i + 1];
48
+ chunkContent += `\n\n[NEXT_CHUNK_KEY: ${nextKey}]`;
49
+ }
50
+ this.storage[key] = chunkContent;
51
+ }
52
+ const firstKey = chunkKeys[0];
53
+ const totalTokens = this.estimateTokens(content);
54
+ const chunkCount = chunks.length;
55
+ return `[COMPRESSED_STRING - ${totalTokens} tokens in ${chunkCount} chunks]\nKey: ${firstKey}\nPath: ${path}\nPreview: ${content.substring(0, 200)}...\n[Use ${this.toolName} tool with key "${firstKey}" to retrieve content. Follow NEXT_CHUNK_KEY references for complete content]`;
56
+ }
57
+ compressContent(content, path = "") {
58
+ const tokens = this.estimateTokens(content);
59
+ if (tokens <= this.maxTokens) {
60
+ return content;
61
+ }
62
+ const jsonObj = this.tryParseJson(content);
63
+ if (jsonObj) {
64
+ const compressedObj = this.compressJsonProperties(jsonObj, path);
65
+ const compressedContent = JSON.stringify(compressedObj, null, 2);
66
+ const compressedTokens = this.estimateTokens(compressedContent);
67
+ if (compressedTokens < tokens * 0.8) {
68
+ return compressedContent;
69
+ }
70
+ }
71
+ return this.compressStringInChunks(content, path);
72
+ }
73
+ compressJsonProperties(obj, path = "") {
74
+ if (Array.isArray(obj)) {
75
+ const processedItems = obj.map((item, index) => this.compressJsonProperties(item, `${path}[${index}]`));
76
+ const initialTokens = this.estimateTokens(JSON.stringify(processedItems));
77
+ if (initialTokens <= this.jsonPropertyThreshold * 1.3) {
78
+ return processedItems;
79
+ }
80
+ const finalArray = [];
81
+ let currentChunk = [];
82
+ for (let i = processedItems.length - 1; i >= 0; i--) {
83
+ const item = processedItems[i];
84
+ currentChunk.unshift(item);
85
+ const chunkString = JSON.stringify(currentChunk);
86
+ const chunkTokens = this.estimateTokens(chunkString);
87
+ if (chunkTokens > this.jsonPropertyThreshold) {
88
+ const key = this.generateKey();
89
+ this.storage[key] = chunkString;
90
+ const stub = `[COMPRESSED_JSON_ARRAY_CHUNK - ${chunkTokens} tokens, ${currentChunk.length} items]\nKey: ${key}\nPath: ${path}[${i}...${i + currentChunk.length - 1}]\nPreview: ${chunkString.substring(0, 100)}...\n[Use ${this.toolName} tool with key "${key}" to retrieve this chunk]`;
91
+ finalArray.unshift(stub);
92
+ currentChunk = [];
93
+ }
94
+ }
95
+ if (currentChunk.length > 0) {
96
+ finalArray.unshift(...currentChunk);
97
+ }
98
+ return finalArray;
99
+ }
100
+ if (obj && typeof obj === "object") {
101
+ const result = {};
102
+ for (const [key, value] of Object.entries(obj)) {
103
+ const newPath = path ? `${path}.${key}` : key;
104
+ result[key] = this.compressJsonProperties(value, newPath);
105
+ }
106
+ const objectAsString = JSON.stringify(result);
107
+ const tokens = this.estimateTokens(objectAsString);
108
+ if (tokens > this.jsonPropertyThreshold) {
109
+ const key = this.generateKey();
110
+ this.storage[key] = objectAsString;
111
+ return `[COMPRESSED_JSON_OBJECT - ${tokens} tokens]\nKey: ${key}\nPath: ${path}\nKeys: ${Object.keys(result).join(", ")}\nPreview: ${objectAsString.substring(0, 200)}...\n[Use ${this.toolName} tool with key "${key}" to retrieve full content]`;
112
+ }
113
+ return result;
114
+ }
115
+ if (typeof obj === "string") {
116
+ const parsedJson = this.tryParseJson(obj);
117
+ if (parsedJson) {
118
+ const compressedJson = this.compressJsonProperties(parsedJson, path);
119
+ const compressedJsonString = JSON.stringify(compressedJson, null, 2);
120
+ const originalTokens = this.estimateTokens(obj);
121
+ const compressedTokens = this.estimateTokens(compressedJsonString);
122
+ if (compressedTokens < originalTokens * 0.8) {
123
+ return compressedJsonString;
124
+ }
125
+ }
126
+ const tokens = this.estimateTokens(obj);
127
+ if (tokens > this.characterLimit * 4) {
128
+ const key = this.generateKey();
129
+ this.storage[key] = obj;
130
+ return `[COMPRESSED_JSON_PROPERTY - ${tokens} tokens]\nKey: ${key}\nPath: ${path}\nPreview: ${obj.substring(0, 200)}...\n[Use ${this.toolName} tool with key "${key}" to retrieve full content]`;
131
+ }
132
+ return obj;
133
+ }
134
+ return obj;
135
+ }
136
+ generateKey() {
137
+ return `${this.keyPrefix}${Date.now()}_${Math.random()
138
+ .toString(36)
139
+ .substr(2, 9)}`;
140
+ }
141
+ compressToolCall(message) {
142
+ if (message.tool_calls) {
143
+ for (const toolCall of message.tool_calls) {
144
+ if (toolCall.function.arguments) {
145
+ const args = toolCall.function.arguments;
146
+ const tokens = this.estimateTokens(args);
147
+ if (tokens > this.maxTokens) {
148
+ const key = this.generateKey();
149
+ this.storage[key] = args;
150
+ const compressed = `[COMPRESSED TOOL ARGS - ${tokens} tokens]\nKey: ${key}\nPreview: ${args.substring(0, 200)}...\n[Use ${this.toolName} tool with key "${key}" to retrieve full arguments]`;
151
+ toolCall.function.arguments = compressed;
152
+ }
153
+ }
154
+ }
155
+ }
156
+ }
157
+ async compressMessage(message) {
158
+ if (typeof message.content === "string") {
159
+ message.content = this.compressContent(message.content);
160
+ }
161
+ else if (Array.isArray(message.content)) {
162
+ for (const item of message.content) {
163
+ if (item.type === "text" && item.text) {
164
+ item.text = this.compressContent(item.text);
165
+ }
166
+ }
167
+ }
168
+ this.compressToolCall(message);
169
+ }
170
+ createProcessor(filterFn) {
171
+ return async (originalMessages, modifiedMessages) => {
172
+ for (const message of modifiedMessages) {
173
+ if (filterFn && !filterFn(message)) {
174
+ continue;
175
+ }
176
+ await this.compressMessage(message);
177
+ }
178
+ };
179
+ }
180
+ retrieveString(key) {
181
+ return this.storage[key] || null;
182
+ }
183
+ clearStorage() {
184
+ this.storage = {};
185
+ }
186
+ getStorageKeys() {
187
+ return Object.keys(this.storage);
188
+ }
189
+ getStorageSize() {
190
+ return Object.keys(this.storage).length;
191
+ }
192
+ registerTool(toolsService) {
193
+ if (toolsService && !toolsService.getTool(this.toolName)) {
194
+ toolsService.addTool(exports.expandTokensDefinition);
195
+ toolsService.addFunctions({
196
+ [this.toolName]: (key) => {
197
+ const data = this.retrieveString(key);
198
+ if (!data) {
199
+ return `Error: No data found for key "${key}". Available keys: ${this.getStorageKeys().join(", ")}`;
200
+ }
201
+ return data;
202
+ },
203
+ });
204
+ }
205
+ }
206
+ }
207
+ exports.TokenCompressor = TokenCompressor;
208
+ exports.expandTokensDefinition = {
209
+ type: "function",
210
+ function: {
211
+ name: "expandTokens",
212
+ description: "Retrieve a chunk of compressed data that was stored during message processing. The returned content may contain a `NEXT_CHUNK_KEY` to retrieve subsequent chunks.",
213
+ parameters: {
214
+ type: "object",
215
+ positional: true,
216
+ properties: {
217
+ key: {
218
+ type: "string",
219
+ description: "The key of the compressed data to retrieve",
220
+ },
221
+ },
222
+ required: ["key"],
223
+ },
224
+ },
225
+ };
226
+ //# sourceMappingURL=TokenCompressor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokenCompressor.js","sourceRoot":"","sources":["../../../src/processors/TokenCompressor.ts"],"names":[],"mappings":";;;AAQA,MAAa,eAAe;IAClB,OAAO,GAA2B,EAAE,CAAC;IACrC,SAAS,GAAW,KAAK,CAAC;IAC1B,gBAAgB,GAAW,GAAG,CAAC;IAC/B,SAAS,GAAW,aAAa,CAAC;IAClC,qBAAqB,GAAW,KAAK,CAAC;IACtC,QAAQ,GAAW,8BAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC;IACxD,cAAc,GAAW,KAAK,CAAC;IAEvC,YAAY,YAA2B;QACrC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;IAClC,CAAC;IAGO,cAAc,CAAC,IAAY;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACpC,CAAC;IAKO,YAAY,CAAC,OAAe;QAClC,IAAI;YACF,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;SAC5B;QAAC,MAAM;YACN,OAAO,IAAI,CAAC;SACb;IACH,CAAC;IAKM,sBAAsB,CAAC,OAAe,EAAE,OAAe,EAAE;QAC9D,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,cAAc,EAAE;YACzC,OAAO,OAAO,CAAC;SAChB;QAED,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,IAAI,SAAS,GAAG,OAAO,CAAC;QAGxB,OAAO,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE;YAC7C,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC;YAC1D,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YAC9C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACtB,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;SAChD;QAGD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;YACxB,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;SAC3B;QAGD,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/B,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAEvB,IAAI,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAG7B,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBACzB,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACjC,YAAY,IAAI,wBAAwB,OAAO,GAAG,CAAC;aACpD;YAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;SAClC;QAGD,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;QAEjC,OAAO,wBAAwB,WAAW,cAAc,UAAU,kBAAkB,QAAQ,WAAW,IAAI,cAAc,OAAO,CAAC,SAAS,CACxI,CAAC,EACD,GAAG,CACJ,aACC,IAAI,CAAC,QACP,mBAAmB,QAAQ,+EAA+E,CAAC;IAC7G,CAAC;IAKM,eAAe,CAAC,OAAe,EAAE,OAAe,EAAE;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAE5C,IAAI,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE;YAC5B,OAAO,OAAO,CAAC;SAChB;QAGD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,OAAO,EAAE;YAEX,MAAM,aAAa,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACjE,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAGjE,MAAM,gBAAgB,GAAG,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;YAChE,IAAI,gBAAgB,GAAG,MAAM,GAAG,GAAG,EAAE;gBACnC,OAAO,iBAAiB,CAAC;aAC1B;SACF;QAGD,OAAO,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACpD,CAAC;IAMM,sBAAsB,CAAC,GAAQ,EAAE,OAAe,EAAE;QACvD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YAEtB,MAAM,cAAc,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAC7C,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,CACvD,CAAC;YAIF,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC;YAC1E,IAAI,aAAa,IAAI,IAAI,CAAC,qBAAqB,GAAG,GAAG,EAAE;gBACrD,OAAO,cAAc,CAAC;aACvB;YAGD,MAAM,UAAU,GAAU,EAAE,CAAC;YAC7B,IAAI,YAAY,GAAU,EAAE,CAAC;YAE7B,KAAK,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;gBACnD,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;gBAC/B,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAE3B,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;gBACjD,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;gBAErD,IAAI,WAAW,GAAG,IAAI,CAAC,qBAAqB,EAAE;oBAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;oBAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;oBAEhC,MAAM,IAAI,GAAG,kCAAkC,WAAW,YACxD,YAAY,CAAC,MACf,iBAAiB,GAAG,WAAW,IAAI,IAAI,CAAC,MACtC,CAAC,GAAG,YAAY,CAAC,MAAM,GAAG,CAC5B,eAAe,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,aAC1C,IAAI,CAAC,QACP,mBAAmB,GAAG,2BAA2B,CAAC;oBAClD,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBAEzB,YAAY,GAAG,EAAE,CAAC;iBACnB;aACF;YAID,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC3B,UAAU,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,CAAC;aACrC;YACD,OAAO,UAAU,CAAC;SACnB;QAGD,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;YAClC,MAAM,MAAM,GAAQ,EAAE,CAAC;YACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC9C,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;aAC3D;YAGD,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;YACnD,IAAI,MAAM,GAAG,IAAI,CAAC,qBAAqB,EAAE;gBACvC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC;gBAEnC,OAAO,6BAA6B,MAAM,kBAAkB,GAAG,WAAW,IAAI,WAAW,MAAM,CAAC,IAAI,CAClG,MAAM,CACP,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,cAAc,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,aACxD,IAAI,CAAC,QACP,mBAAmB,GAAG,6BAA6B,CAAC;aACrD;YACD,OAAO,MAAM,CAAC;SACf;QAGD,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;YAE3B,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YAC1C,IAAI,UAAU,EAAE;gBACd,MAAM,cAAc,GAAG,IAAI,CAAC,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;gBACrE,MAAM,oBAAoB,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBAErE,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;gBAChD,MAAM,gBAAgB,GAAG,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;gBAEnE,IAAI,gBAAgB,GAAG,cAAc,GAAG,GAAG,EAAE;oBAC3C,OAAO,oBAAoB,CAAC;iBAC7B;aACF;YAGD,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,MAAM,GAAG,IAAI,CAAC,cAAc,GAAG,CAAC,EAAE;gBACpC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;gBAExB,OAAO,+BAA+B,MAAM,kBAAkB,GAAG,WAAW,IAAI,cAAc,GAAG,CAAC,SAAS,CACzG,CAAC,EACD,GAAG,CACJ,aACC,IAAI,CAAC,QACP,mBAAmB,GAAG,6BAA6B,CAAC;aACrD;YACD,OAAO,GAAG,CAAC;SACZ;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,WAAW;QACjB,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE;aACnD,QAAQ,CAAC,EAAE,CAAC;aACZ,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IACpB,CAAC;IAEM,gBAAgB,CAAC,OAAgB;QACtC,IAAI,OAAO,CAAC,UAAU,EAAE;YACtB,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,UAAU,EAAE;gBACzC,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE;oBAC/B,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;oBACzC,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;oBAEzC,IAAI,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE;wBAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;wBAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;wBAEzB,MAAM,UAAU,GAAG,2BAA2B,MAAM,kBAAkB,GAAG,cAAc,IAAI,CAAC,SAAS,CACnG,CAAC,EACD,GAAG,CACJ,aACC,IAAI,CAAC,QACP,mBAAmB,GAAG,+BAA+B,CAAC;wBAEtD,QAAQ,CAAC,QAAQ,CAAC,SAAS,GAAG,UAAU,CAAC;qBAC1C;iBACF;aACF;SACF;IACH,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,OAAgB;QAM3C,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE;YACvC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;SACzD;aAEI,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YACvC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE;gBAClC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE;oBACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBAC7C;aACF;SACF;QAGD,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,eAAe,CACb,QAAoC;QAEpC,OAAO,KAAK,EAAE,gBAA2B,EAAE,gBAA2B,EAAE,EAAE;YACxE,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE;gBACtC,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;oBAClC,SAAS;iBACV;gBACD,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;aACrC;QACH,CAAC,CAAC;IACJ,CAAC;IAOD,cAAc,CAAC,GAAW;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACnC,CAAC;IAED,YAAY;QACV,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;IAED,cAAc;QACZ,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,cAAc;QACZ,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAC1C,CAAC;IAED,YAAY,CAAC,YAA2B;QACtC,IAAI,YAAY,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YACxD,YAAY,CAAC,OAAO,CAAC,8BAAsB,CAAC,CAAC;YAC7C,YAAY,CAAC,YAAY,CAAC;gBACxB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAW,EAAE,EAAE;oBAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;oBAEtC,IAAI,CAAC,IAAI,EAAE;wBACT,OAAO,iCAAiC,GAAG,sBAAsB,IAAI,CAAC,cAAc,EAAE,CAAC,IAAI,CACzF,IAAI,CACL,EAAE,CAAC;qBACL;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC;aACF,CAAC,CAAC;SACJ;IACH,CAAC;CACF;AAxUD,0CAwUC;AAEY,QAAA,sBAAsB,GAAS;IAC1C,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE;QACR,IAAI,EAAE,cAAc;QACpB,WAAW,EACT,mKAAmK;QACrK,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,IAAI;YAChB,UAAU,EAAE;gBACV,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,4CAA4C;iBAC1D;aACF;YACD,QAAQ,EAAE,CAAC,KAAK,CAAC;SAClB;KACF;CACF,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { Message } from "../clients/types";
2
+ import { MessageProcessorFunction } from "../services/MessageProcessor";
3
+ import { ToolsService } from "../services";
4
+ import { Tool } from "../clients";
5
+ export declare class ToolResponseCache {
6
+ private storage;
7
+ private metadataStorage;
8
+ private toolName;
9
+ constructor(toolsService: ToolsService);
10
+ private tryParseJson;
11
+ private parseNestedJsonStrings;
12
+ private storeToolResponse;
13
+ private processMessage;
14
+ createProcessor(filterFn?: (msg: Message) => boolean): MessageProcessorFunction;
15
+ queryToolResponse(toolCallId: string, jqQuery: string): Promise<string>;
16
+ retrieveRawResponse(toolCallId: string): string | null;
17
+ clearStorage(): void;
18
+ getStorageKeys(): string[];
19
+ getStorageSize(): number;
20
+ registerTool(toolsService: ToolsService): void;
21
+ }
22
+ export declare const jqToolResponseDefinition: Tool;
@@ -0,0 +1,164 @@
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 (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.jqToolResponseDefinition = exports.ToolResponseCache = void 0;
27
+ const jq = __importStar(require("node-jq"));
28
+ class ToolResponseCache {
29
+ storage = {};
30
+ metadataStorage = {};
31
+ toolName = exports.jqToolResponseDefinition.function.name;
32
+ constructor(toolsService) {
33
+ this.registerTool(toolsService);
34
+ }
35
+ tryParseJson(content) {
36
+ try {
37
+ return JSON.parse(content);
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ }
43
+ parseNestedJsonStrings(obj) {
44
+ if (typeof obj === "string") {
45
+ const parsed = this.tryParseJson(obj);
46
+ if (parsed) {
47
+ return this.parseNestedJsonStrings(parsed);
48
+ }
49
+ return obj;
50
+ }
51
+ if (Array.isArray(obj)) {
52
+ return obj.map((item) => this.parseNestedJsonStrings(item));
53
+ }
54
+ if (obj && typeof obj === "object") {
55
+ const result = {};
56
+ for (const [key, value] of Object.entries(obj)) {
57
+ result[key] = this.parseNestedJsonStrings(value);
58
+ }
59
+ return result;
60
+ }
61
+ return obj;
62
+ }
63
+ storeToolResponse(content, toolCallId) {
64
+ this.storage[toolCallId] = content;
65
+ this.metadataStorage[toolCallId] = {
66
+ toolCallId,
67
+ originalLength: content.length,
68
+ storedAt: Date.now(),
69
+ };
70
+ }
71
+ async processMessage(message) {
72
+ if (message.role !== "tool" ||
73
+ !message.tool_call_id ||
74
+ typeof message.content !== "string") {
75
+ return;
76
+ }
77
+ this.storeToolResponse(message.content, message.tool_call_id);
78
+ }
79
+ createProcessor(filterFn) {
80
+ return async (originalMessages, modifiedMessages) => {
81
+ for (const message of modifiedMessages) {
82
+ if (filterFn && !filterFn(message)) {
83
+ continue;
84
+ }
85
+ await this.processMessage(message);
86
+ }
87
+ };
88
+ }
89
+ async queryToolResponse(toolCallId, jqQuery) {
90
+ const data = this.storage[toolCallId];
91
+ if (!data) {
92
+ const availableIds = Object.keys(this.storage);
93
+ return `Error: No tool response found for toolCallId "${toolCallId}". Available IDs: ${availableIds.join(", ")}`;
94
+ }
95
+ try {
96
+ const parsedData = this.parseNestedJsonStrings(data);
97
+ const result = await jq.run(jqQuery, parsedData, { input: "json" });
98
+ if (typeof result === "string") {
99
+ return result;
100
+ }
101
+ else {
102
+ return JSON.stringify(result, null, 2);
103
+ }
104
+ }
105
+ catch (error) {
106
+ let errorMessage = `JQ Query Error: ${error.message}`;
107
+ const jsonObj = this.tryParseJson(data);
108
+ if (!jsonObj) {
109
+ errorMessage += `\nNote: The tool response data is not valid JSON. Raw data preview:\n${data.substring(0, 300)}...`;
110
+ }
111
+ else {
112
+ errorMessage += `\nData structure preview:\n${JSON.stringify(jsonObj, null, 2).substring(0, 500)}...`;
113
+ }
114
+ return errorMessage;
115
+ }
116
+ }
117
+ retrieveRawResponse(toolCallId) {
118
+ return this.storage[toolCallId] || null;
119
+ }
120
+ clearStorage() {
121
+ this.storage = {};
122
+ this.metadataStorage = {};
123
+ }
124
+ getStorageKeys() {
125
+ return Object.keys(this.storage);
126
+ }
127
+ getStorageSize() {
128
+ return Object.keys(this.storage).length;
129
+ }
130
+ registerTool(toolsService) {
131
+ if (!toolsService.getTool(this.toolName)) {
132
+ toolsService.addTool(exports.jqToolResponseDefinition);
133
+ toolsService.addFunctions({
134
+ [this.toolName]: async (toolCallId, jqQuery) => {
135
+ return await this.queryToolResponse(toolCallId, jqQuery);
136
+ },
137
+ });
138
+ }
139
+ }
140
+ }
141
+ exports.ToolResponseCache = ToolResponseCache;
142
+ exports.jqToolResponseDefinition = {
143
+ type: "function",
144
+ function: {
145
+ name: "jqToolResponse",
146
+ description: "Execute a JQ query on a stored tool response to extract specific data. Use this when you need to extract specific information from any tool response that has been stored. Many MCP tool responses store data in nested structures like .content[0].text where the actual data array is located.",
147
+ parameters: {
148
+ type: "object",
149
+ positional: true,
150
+ properties: {
151
+ toolCallId: {
152
+ type: "string",
153
+ description: "The toolCallId of the stored tool response",
154
+ },
155
+ jqQuery: {
156
+ type: "string",
157
+ description: "The JQ query to execute on the tool response data. Examples: '.content[0].text | map(.title)' (extract titles from MCP array), '.content[0].text | map(select(.createdAt > \"2025-01-01\"))' (filter MCP items by date) ",
158
+ },
159
+ },
160
+ required: ["toolCallId", "jqQuery"],
161
+ },
162
+ },
163
+ };
164
+ //# sourceMappingURL=ToolResponseCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolResponseCache.js","sourceRoot":"","sources":["../../../src/processors/ToolResponseCache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { Message } from "../clients/types";
2
+ import { MessageProcessorFunction } from "../services/MessageProcessor";
3
+ import { ToolsService } from "../services";
4
+ import { Tool } from "../clients";
5
+ export declare class ToolResponseManipulator {
6
+ private storage;
7
+ private metadataStorage;
8
+ private toolName;
9
+ constructor(toolsService: ToolsService);
10
+ private tryParseJson;
11
+ private parseNestedJsonStrings;
12
+ private storeToolResponse;
13
+ private processMessage;
14
+ createProcessor(filterFn?: (msg: Message) => boolean): MessageProcessorFunction;
15
+ queryToolResponse(tool_call_id: string, jqQuery: string): Promise<string>;
16
+ retrieveRawResponse(tool_call_id: string): string | null;
17
+ clearStorage(): void;
18
+ getStorageKeys(): string[];
19
+ getStorageSize(): number;
20
+ registerTool(toolsService: ToolsService): void;
21
+ }
22
+ export declare const jqToolResponseDefinition: Tool;
@@ -0,0 +1,162 @@
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 (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.jqToolResponseDefinition = exports.ToolResponseManipulator = void 0;
27
+ const jq = __importStar(require("node-jq"));
28
+ class ToolResponseManipulator {
29
+ storage = {};
30
+ metadataStorage = {};
31
+ toolName = exports.jqToolResponseDefinition.function.name;
32
+ constructor(toolsService) {
33
+ this.registerTool(toolsService);
34
+ }
35
+ tryParseJson(content) {
36
+ try {
37
+ return JSON.parse(content);
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ }
43
+ parseNestedJsonStrings(obj) {
44
+ if (typeof obj === "string") {
45
+ const parsed = this.tryParseJson(obj);
46
+ if (parsed) {
47
+ return this.parseNestedJsonStrings(parsed);
48
+ }
49
+ return obj;
50
+ }
51
+ if (Array.isArray(obj)) {
52
+ return obj.map(item => this.parseNestedJsonStrings(item));
53
+ }
54
+ if (obj && typeof obj === "object") {
55
+ const result = {};
56
+ for (const [key, value] of Object.entries(obj)) {
57
+ result[key] = this.parseNestedJsonStrings(value);
58
+ }
59
+ return result;
60
+ }
61
+ return obj;
62
+ }
63
+ storeToolResponse(content, tool_call_id) {
64
+ this.storage[tool_call_id] = content;
65
+ this.metadataStorage[tool_call_id] = {
66
+ tool_call_id,
67
+ originalLength: content.length,
68
+ storedAt: Date.now(),
69
+ };
70
+ }
71
+ async processMessage(message) {
72
+ if (message.role !== "tool" || !message.tool_call_id || typeof message.content !== "string") {
73
+ return;
74
+ }
75
+ this.storeToolResponse(message.content, message.tool_call_id);
76
+ }
77
+ createProcessor(filterFn) {
78
+ return async (originalMessages, modifiedMessages) => {
79
+ for (const message of modifiedMessages) {
80
+ if (filterFn && !filterFn(message)) {
81
+ continue;
82
+ }
83
+ await this.processMessage(message);
84
+ }
85
+ };
86
+ }
87
+ async queryToolResponse(tool_call_id, jqQuery) {
88
+ const data = this.storage[tool_call_id];
89
+ if (!data) {
90
+ const availableIds = Object.keys(this.storage);
91
+ return `Error: No tool response found for tool_call_id "${tool_call_id}". Available IDs: ${availableIds.join(", ")}`;
92
+ }
93
+ try {
94
+ const parsedData = this.parseNestedJsonStrings(data);
95
+ const result = await jq.run(jqQuery, parsedData, { input: "json" });
96
+ if (typeof result === "string") {
97
+ return result;
98
+ }
99
+ else {
100
+ return JSON.stringify(result, null, 2);
101
+ }
102
+ }
103
+ catch (error) {
104
+ let errorMessage = `JQ Query Error: ${error.message}`;
105
+ const jsonObj = this.tryParseJson(data);
106
+ if (!jsonObj) {
107
+ errorMessage += `\nNote: The tool response data is not valid JSON. Raw data preview:\n${data.substring(0, 300)}...`;
108
+ }
109
+ else {
110
+ errorMessage += `\nData structure preview:\n${JSON.stringify(jsonObj, null, 2).substring(0, 500)}...`;
111
+ }
112
+ return errorMessage;
113
+ }
114
+ }
115
+ retrieveRawResponse(tool_call_id) {
116
+ return this.storage[tool_call_id] || null;
117
+ }
118
+ clearStorage() {
119
+ this.storage = {};
120
+ this.metadataStorage = {};
121
+ }
122
+ getStorageKeys() {
123
+ return Object.keys(this.storage);
124
+ }
125
+ getStorageSize() {
126
+ return Object.keys(this.storage).length;
127
+ }
128
+ registerTool(toolsService) {
129
+ if (!toolsService.getTool(this.toolName)) {
130
+ toolsService.addTool(exports.jqToolResponseDefinition);
131
+ toolsService.addFunctions({
132
+ [this.toolName]: async (tool_call_id, jqQuery) => {
133
+ return await this.queryToolResponse(tool_call_id, jqQuery);
134
+ },
135
+ });
136
+ }
137
+ }
138
+ }
139
+ exports.ToolResponseManipulator = ToolResponseManipulator;
140
+ exports.jqToolResponseDefinition = {
141
+ type: "function",
142
+ function: {
143
+ name: "jqToolResponse",
144
+ description: "Execute a JQ query on a stored tool response to extract specific data. Use this when you need to extract specific information from any tool response that has been stored.",
145
+ parameters: {
146
+ type: "object",
147
+ positional: true,
148
+ properties: {
149
+ tool_call_id: {
150
+ type: "string",
151
+ description: "The tool_call_id of the stored tool response",
152
+ },
153
+ jqQuery: {
154
+ type: "string",
155
+ description: "The JQ query to execute on the tool response data (e.g., '.items[0].name', '.data | length', '.[] | select(.status == \"active\")')",
156
+ },
157
+ },
158
+ required: ["tool_call_id", "jqQuery"],
159
+ },
160
+ },
161
+ };
162
+ //# sourceMappingURL=ToolResponseManipulator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolResponseManipulator.js","sourceRoot":"","sources":["../../../src/processors/ToolResponseManipulator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { Message } from "../clients/types";
2
+ export type ProcessorLifecycle = "initial_call" | "per_call" | "post_call";
3
+ export type MessageProcessorFunction = (originalMessages: Message[], modifiedMessages: Message[]) => Promise<void> | void;
4
+ export interface ProcessorRegistration {
5
+ processor: MessageProcessorFunction;
6
+ priority: number;
7
+ }
8
+ export declare class MessageProcessor {
9
+ private processors;
10
+ constructor();
11
+ setProcessors(lifecycle: ProcessorLifecycle, processors: MessageProcessorFunction[]): void;
12
+ registerProcessor(lifecycle: ProcessorLifecycle, processor: MessageProcessorFunction, priority?: number): void;
13
+ removeProcessor(lifecycle: ProcessorLifecycle, processor: MessageProcessorFunction): void;
14
+ processMessages(messages: Message[], lifecycle: ProcessorLifecycle): Promise<Message[]>;
15
+ getProcessorsForLifecycle(lifecycle: ProcessorLifecycle): MessageProcessorFunction[];
16
+ clearProcessors(lifecycle?: ProcessorLifecycle): void;
17
+ }