@tarquinen/opencode-dcp 0.3.31 → 0.4.1

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 (85) hide show
  1. package/README.md +2 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +10 -3
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/api-formats/prunable-list.d.ts +49 -0
  6. package/dist/lib/api-formats/prunable-list.d.ts.map +1 -0
  7. package/dist/lib/api-formats/prunable-list.js +112 -0
  8. package/dist/lib/api-formats/prunable-list.js.map +1 -0
  9. package/dist/lib/api-formats/synth-instruction.d.ts +17 -4
  10. package/dist/lib/api-formats/synth-instruction.d.ts.map +1 -1
  11. package/dist/lib/api-formats/synth-instruction.js +72 -110
  12. package/dist/lib/api-formats/synth-instruction.js.map +1 -1
  13. package/dist/lib/config.d.ts +1 -0
  14. package/dist/lib/config.d.ts.map +1 -1
  15. package/dist/lib/config.js +6 -0
  16. package/dist/lib/config.js.map +1 -1
  17. package/dist/lib/core/janitor.d.ts +14 -1
  18. package/dist/lib/core/janitor.d.ts.map +1 -1
  19. package/dist/lib/core/janitor.js +35 -35
  20. package/dist/lib/core/janitor.js.map +1 -1
  21. package/dist/lib/fetch-wrapper/formats/bedrock.d.ts +14 -0
  22. package/dist/lib/fetch-wrapper/formats/bedrock.d.ts.map +1 -0
  23. package/dist/lib/fetch-wrapper/formats/bedrock.js +128 -0
  24. package/dist/lib/fetch-wrapper/formats/bedrock.js.map +1 -0
  25. package/dist/lib/fetch-wrapper/formats/gemini.d.ts +14 -0
  26. package/dist/lib/fetch-wrapper/formats/gemini.d.ts.map +1 -0
  27. package/dist/lib/fetch-wrapper/formats/gemini.js +138 -0
  28. package/dist/lib/fetch-wrapper/formats/gemini.js.map +1 -0
  29. package/dist/lib/fetch-wrapper/formats/index.d.ts +5 -0
  30. package/dist/lib/fetch-wrapper/formats/index.d.ts.map +1 -0
  31. package/dist/lib/fetch-wrapper/formats/index.js +5 -0
  32. package/dist/lib/fetch-wrapper/formats/index.js.map +1 -0
  33. package/dist/lib/fetch-wrapper/formats/openai-chat.d.ts +14 -0
  34. package/dist/lib/fetch-wrapper/formats/openai-chat.d.ts.map +1 -0
  35. package/dist/lib/fetch-wrapper/formats/openai-chat.js +106 -0
  36. package/dist/lib/fetch-wrapper/formats/openai-chat.js.map +1 -0
  37. package/dist/lib/fetch-wrapper/formats/openai-responses.d.ts +11 -0
  38. package/dist/lib/fetch-wrapper/formats/openai-responses.d.ts.map +1 -0
  39. package/dist/lib/fetch-wrapper/formats/openai-responses.js +69 -0
  40. package/dist/lib/fetch-wrapper/formats/openai-responses.js.map +1 -0
  41. package/dist/lib/fetch-wrapper/handler.d.ts +13 -0
  42. package/dist/lib/fetch-wrapper/handler.d.ts.map +1 -0
  43. package/dist/lib/fetch-wrapper/handler.js +85 -0
  44. package/dist/lib/fetch-wrapper/handler.js.map +1 -0
  45. package/dist/lib/fetch-wrapper/index.d.ts +2 -1
  46. package/dist/lib/fetch-wrapper/index.d.ts.map +1 -1
  47. package/dist/lib/fetch-wrapper/index.js +19 -15
  48. package/dist/lib/fetch-wrapper/index.js.map +1 -1
  49. package/dist/lib/fetch-wrapper/types.d.ts +35 -0
  50. package/dist/lib/fetch-wrapper/types.d.ts.map +1 -1
  51. package/dist/lib/fetch-wrapper/types.js +7 -1
  52. package/dist/lib/fetch-wrapper/types.js.map +1 -1
  53. package/dist/lib/hooks.d.ts.map +1 -1
  54. package/dist/lib/hooks.js +21 -12
  55. package/dist/lib/hooks.js.map +1 -1
  56. package/dist/lib/prompts/tool.txt +18 -5
  57. package/dist/lib/pruning-tool.d.ts +13 -5
  58. package/dist/lib/pruning-tool.d.ts.map +1 -1
  59. package/dist/lib/pruning-tool.js +120 -20
  60. package/dist/lib/pruning-tool.js.map +1 -1
  61. package/dist/lib/state/id-mapping.d.ts +26 -0
  62. package/dist/lib/state/id-mapping.d.ts.map +1 -0
  63. package/dist/lib/state/id-mapping.js +54 -0
  64. package/dist/lib/state/id-mapping.js.map +1 -0
  65. package/dist/lib/state/tool-cache.d.ts +9 -4
  66. package/dist/lib/state/tool-cache.d.ts.map +1 -1
  67. package/dist/lib/state/tool-cache.js +54 -20
  68. package/dist/lib/state/tool-cache.js.map +1 -1
  69. package/dist/lib/version-checker.d.ts +1 -1
  70. package/dist/lib/version-checker.d.ts.map +1 -1
  71. package/dist/lib/version-checker.js +4 -1
  72. package/dist/lib/version-checker.js.map +1 -1
  73. package/package.json +1 -1
  74. package/dist/lib/fetch-wrapper/gemini.d.ts +0 -7
  75. package/dist/lib/fetch-wrapper/gemini.d.ts.map +0 -1
  76. package/dist/lib/fetch-wrapper/gemini.js +0 -120
  77. package/dist/lib/fetch-wrapper/gemini.js.map +0 -1
  78. package/dist/lib/fetch-wrapper/openai-chat.d.ts +0 -7
  79. package/dist/lib/fetch-wrapper/openai-chat.d.ts.map +0 -1
  80. package/dist/lib/fetch-wrapper/openai-chat.js +0 -101
  81. package/dist/lib/fetch-wrapper/openai-chat.js.map +0 -1
  82. package/dist/lib/fetch-wrapper/openai-responses.d.ts +0 -7
  83. package/dist/lib/fetch-wrapper/openai-responses.d.ts.map +0 -1
  84. package/dist/lib/fetch-wrapper/openai-responses.js +0 -74
  85. package/dist/lib/fetch-wrapper/openai-responses.js.map +0 -1
@@ -0,0 +1,106 @@
1
+ import { cacheToolParametersFromMessages } from "../../state/tool-cache";
2
+ import { injectSynth, trackNewToolResults } from "../../api-formats/synth-instruction";
3
+ import { injectPrunableList } from "../../api-formats/prunable-list";
4
+ /**
5
+ * Format descriptor for OpenAI Chat Completions and Anthropic APIs.
6
+ *
7
+ * OpenAI Chat format:
8
+ * - Messages with role='tool' and tool_call_id
9
+ * - Assistant messages with tool_calls[] array
10
+ *
11
+ * Anthropic format:
12
+ * - Messages with role='user' containing content[].type='tool_result' and tool_use_id
13
+ * - Assistant messages with content[].type='tool_use'
14
+ */
15
+ export const openaiChatFormat = {
16
+ name: 'openai-chat',
17
+ detect(body) {
18
+ return body.messages && Array.isArray(body.messages);
19
+ },
20
+ getDataArray(body) {
21
+ return body.messages;
22
+ },
23
+ cacheToolParameters(data, state, logger) {
24
+ cacheToolParametersFromMessages(data, state, logger);
25
+ },
26
+ injectSynth(data, instruction, nudgeText) {
27
+ return injectSynth(data, instruction, nudgeText);
28
+ },
29
+ trackNewToolResults(data, tracker, protectedTools) {
30
+ return trackNewToolResults(data, tracker, protectedTools);
31
+ },
32
+ injectPrunableList(data, injection) {
33
+ return injectPrunableList(data, injection);
34
+ },
35
+ extractToolOutputs(data, state) {
36
+ const outputs = [];
37
+ for (const m of data) {
38
+ if (m.role === 'tool' && m.tool_call_id) {
39
+ const metadata = state.toolParameters.get(m.tool_call_id.toLowerCase());
40
+ outputs.push({
41
+ id: m.tool_call_id.toLowerCase(),
42
+ toolName: metadata?.tool
43
+ });
44
+ }
45
+ if (m.role === 'user' && Array.isArray(m.content)) {
46
+ for (const part of m.content) {
47
+ if (part.type === 'tool_result' && part.tool_use_id) {
48
+ const metadata = state.toolParameters.get(part.tool_use_id.toLowerCase());
49
+ outputs.push({
50
+ id: part.tool_use_id.toLowerCase(),
51
+ toolName: metadata?.tool
52
+ });
53
+ }
54
+ }
55
+ }
56
+ }
57
+ return outputs;
58
+ },
59
+ replaceToolOutput(data, toolId, prunedMessage, _state) {
60
+ const toolIdLower = toolId.toLowerCase();
61
+ let replaced = false;
62
+ for (let i = 0; i < data.length; i++) {
63
+ const m = data[i];
64
+ if (m.role === 'tool' && m.tool_call_id?.toLowerCase() === toolIdLower) {
65
+ data[i] = { ...m, content: prunedMessage };
66
+ replaced = true;
67
+ }
68
+ if (m.role === 'user' && Array.isArray(m.content)) {
69
+ let messageModified = false;
70
+ const newContent = m.content.map((part) => {
71
+ if (part.type === 'tool_result' && part.tool_use_id?.toLowerCase() === toolIdLower) {
72
+ messageModified = true;
73
+ return { ...part, content: prunedMessage };
74
+ }
75
+ return part;
76
+ });
77
+ if (messageModified) {
78
+ data[i] = { ...m, content: newContent };
79
+ replaced = true;
80
+ }
81
+ }
82
+ }
83
+ return replaced;
84
+ },
85
+ hasToolOutputs(data) {
86
+ for (const m of data) {
87
+ if (m.role === 'tool')
88
+ return true;
89
+ if (m.role === 'user' && Array.isArray(m.content)) {
90
+ for (const part of m.content) {
91
+ if (part.type === 'tool_result')
92
+ return true;
93
+ }
94
+ }
95
+ }
96
+ return false;
97
+ },
98
+ getLogMetadata(data, replacedCount, inputUrl) {
99
+ return {
100
+ url: inputUrl,
101
+ replacedCount,
102
+ totalMessages: data.length
103
+ };
104
+ }
105
+ };
106
+ //# sourceMappingURL=openai-chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-chat.js","sourceRoot":"","sources":["../../../../lib/fetch-wrapper/formats/openai-chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { FormatDescriptor } from "../types";
2
+ /**
3
+ * Format descriptor for OpenAI Responses API (GPT-5 models via sdk.responses()).
4
+ *
5
+ * Uses body.input array with:
6
+ * - type='function_call' items for tool calls
7
+ * - type='function_call_output' items for tool results
8
+ * - type='message' items for user/assistant messages
9
+ */
10
+ export declare const openaiResponsesFormat: FormatDescriptor;
11
+ //# sourceMappingURL=openai-responses.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-responses.d.ts","sourceRoot":"","sources":["../../../../lib/fetch-wrapper/formats/openai-responses.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAc,MAAM,UAAU,CAAA;AAS5D;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,EAAE,gBAsEnC,CAAA"}
@@ -0,0 +1,69 @@
1
+ import { cacheToolParametersFromInput } from "../../state/tool-cache";
2
+ import { injectSynthResponses, trackNewToolResultsResponses } from "../../api-formats/synth-instruction";
3
+ import { injectPrunableListResponses } from "../../api-formats/prunable-list";
4
+ /**
5
+ * Format descriptor for OpenAI Responses API (GPT-5 models via sdk.responses()).
6
+ *
7
+ * Uses body.input array with:
8
+ * - type='function_call' items for tool calls
9
+ * - type='function_call_output' items for tool results
10
+ * - type='message' items for user/assistant messages
11
+ */
12
+ export const openaiResponsesFormat = {
13
+ name: 'openai-responses',
14
+ detect(body) {
15
+ return body.input && Array.isArray(body.input);
16
+ },
17
+ getDataArray(body) {
18
+ return body.input;
19
+ },
20
+ cacheToolParameters(data, state, logger) {
21
+ cacheToolParametersFromInput(data, state, logger);
22
+ },
23
+ injectSynth(data, instruction, nudgeText) {
24
+ return injectSynthResponses(data, instruction, nudgeText);
25
+ },
26
+ trackNewToolResults(data, tracker, protectedTools) {
27
+ return trackNewToolResultsResponses(data, tracker, protectedTools);
28
+ },
29
+ injectPrunableList(data, injection) {
30
+ return injectPrunableListResponses(data, injection);
31
+ },
32
+ extractToolOutputs(data, state) {
33
+ const outputs = [];
34
+ for (const item of data) {
35
+ if (item.type === 'function_call_output' && item.call_id) {
36
+ const metadata = state.toolParameters.get(item.call_id.toLowerCase());
37
+ outputs.push({
38
+ id: item.call_id.toLowerCase(),
39
+ toolName: metadata?.tool ?? item.name
40
+ });
41
+ }
42
+ }
43
+ return outputs;
44
+ },
45
+ replaceToolOutput(data, toolId, prunedMessage, _state) {
46
+ const toolIdLower = toolId.toLowerCase();
47
+ let replaced = false;
48
+ for (let i = 0; i < data.length; i++) {
49
+ const item = data[i];
50
+ if (item.type === 'function_call_output' && item.call_id?.toLowerCase() === toolIdLower) {
51
+ data[i] = { ...item, output: prunedMessage };
52
+ replaced = true;
53
+ }
54
+ }
55
+ return replaced;
56
+ },
57
+ hasToolOutputs(data) {
58
+ return data.some((item) => item.type === 'function_call_output');
59
+ },
60
+ getLogMetadata(data, replacedCount, inputUrl) {
61
+ return {
62
+ url: inputUrl,
63
+ replacedCount,
64
+ totalItems: data.length,
65
+ format: 'openai-responses-api'
66
+ };
67
+ }
68
+ };
69
+ //# sourceMappingURL=openai-responses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-responses.js","sourceRoot":"","sources":["../../../../lib/fetch-wrapper/formats/openai-responses.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { FetchHandlerContext, FetchHandlerResult, FormatDescriptor } from "./types";
2
+ /**
3
+ * Generic format handler that processes any API format using a FormatDescriptor.
4
+ *
5
+ * This consolidates the common logic from all format-specific handlers:
6
+ * 1. Cache tool parameters
7
+ * 2. Inject synthetic instructions (if strategies enabled)
8
+ * 3. Build and inject prunable tools list
9
+ * 4. Replace pruned tool outputs
10
+ * 5. Log and save context
11
+ */
12
+ export declare function handleFormat(body: any, ctx: FetchHandlerContext, inputUrl: string, format: FormatDescriptor): Promise<FetchHandlerResult>;
13
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../lib/fetch-wrapper/handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAQxF;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAC9B,IAAI,EAAE,GAAG,EACT,GAAG,EAAE,mBAAmB,EACxB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,gBAAgB,GACzB,OAAO,CAAC,kBAAkB,CAAC,CAmG7B"}
@@ -0,0 +1,85 @@
1
+ import { PRUNED_CONTENT_MESSAGE, getAllPrunedIds, fetchSessionMessages } from "./types";
2
+ import { buildPrunableToolsList, buildEndInjection } from "../api-formats/prunable-list";
3
+ /**
4
+ * Generic format handler that processes any API format using a FormatDescriptor.
5
+ *
6
+ * This consolidates the common logic from all format-specific handlers:
7
+ * 1. Cache tool parameters
8
+ * 2. Inject synthetic instructions (if strategies enabled)
9
+ * 3. Build and inject prunable tools list
10
+ * 4. Replace pruned tool outputs
11
+ * 5. Log and save context
12
+ */
13
+ export async function handleFormat(body, ctx, inputUrl, format) {
14
+ const data = format.getDataArray(body);
15
+ if (!data) {
16
+ return { modified: false, body };
17
+ }
18
+ let modified = false;
19
+ format.cacheToolParameters(data, ctx.state, ctx.logger);
20
+ if (ctx.config.strategies.onTool.length > 0) {
21
+ if (format.injectSynth(data, ctx.prompts.synthInstruction, ctx.prompts.nudgeInstruction)) {
22
+ modified = true;
23
+ }
24
+ const sessionId = ctx.state.lastSeenSessionId;
25
+ if (sessionId) {
26
+ const toolIds = Array.from(ctx.state.toolParameters.keys());
27
+ const alreadyPruned = ctx.state.prunedIds.get(sessionId) ?? [];
28
+ const alreadyPrunedLower = new Set(alreadyPruned.map(id => id.toLowerCase()));
29
+ const unprunedIds = toolIds.filter(id => !alreadyPrunedLower.has(id.toLowerCase()));
30
+ const { list: prunableList, numericIds } = buildPrunableToolsList(sessionId, unprunedIds, ctx.state.toolParameters, ctx.config.protectedTools);
31
+ if (prunableList) {
32
+ const protectedSet = new Set(ctx.config.protectedTools);
33
+ format.trackNewToolResults(data, ctx.toolTracker, protectedSet);
34
+ const includeNudge = ctx.config.nudge_freq > 0 && ctx.toolTracker.toolResultCount > ctx.config.nudge_freq;
35
+ const endInjection = buildEndInjection(prunableList, includeNudge);
36
+ if (format.injectPrunableList(data, endInjection)) {
37
+ ctx.logger.debug("fetch", `Injected prunable tools list (${format.name})`, {
38
+ ids: numericIds,
39
+ nudge: includeNudge,
40
+ toolsSincePrune: ctx.toolTracker.toolResultCount
41
+ });
42
+ modified = true;
43
+ }
44
+ }
45
+ }
46
+ }
47
+ if (!format.hasToolOutputs(data)) {
48
+ return { modified, body };
49
+ }
50
+ const { allSessions, allPrunedIds } = await getAllPrunedIds(ctx.client, ctx.state, ctx.logger);
51
+ if (allPrunedIds.size === 0) {
52
+ return { modified, body };
53
+ }
54
+ const toolOutputs = format.extractToolOutputs(data, ctx.state);
55
+ const protectedToolsLower = new Set(ctx.config.protectedTools.map(t => t.toLowerCase()));
56
+ let replacedCount = 0;
57
+ for (const output of toolOutputs) {
58
+ if (output.toolName && protectedToolsLower.has(output.toolName.toLowerCase())) {
59
+ continue;
60
+ }
61
+ if (allPrunedIds.has(output.id)) {
62
+ if (format.replaceToolOutput(data, output.id, PRUNED_CONTENT_MESSAGE, ctx.state)) {
63
+ replacedCount++;
64
+ }
65
+ }
66
+ }
67
+ if (replacedCount > 0) {
68
+ ctx.logger.info("fetch", `Replaced pruned tool outputs (${format.name})`, {
69
+ replaced: replacedCount,
70
+ total: toolOutputs.length
71
+ });
72
+ if (ctx.logger.enabled) {
73
+ const activeSessions = allSessions.data?.filter((s) => !s.parentID) || [];
74
+ let sessionMessages;
75
+ if (activeSessions.length > 0) {
76
+ const mostRecentSession = activeSessions[0];
77
+ sessionMessages = await fetchSessionMessages(ctx.client, mostRecentSession.id);
78
+ }
79
+ await ctx.logger.saveWrappedContext("global", data, format.getLogMetadata(data, replacedCount, inputUrl), sessionMessages);
80
+ }
81
+ return { modified: true, body };
82
+ }
83
+ return { modified, body };
84
+ }
85
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../lib/fetch-wrapper/handler.ts"],"names":[],"mappings":"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"}
@@ -8,11 +8,12 @@ export type { FetchHandlerContext, FetchHandlerResult, SynthPrompts } from "./ty
8
8
  * Creates a wrapped global fetch that intercepts API calls and performs
9
9
  * context pruning on tool outputs that have been marked for removal.
10
10
  *
11
- * Supports four API formats:
11
+ * Supports five API formats:
12
12
  * 1. OpenAI Chat Completions (body.messages with role='tool')
13
13
  * 2. Anthropic (body.messages with role='user' containing tool_result)
14
14
  * 3. Google/Gemini (body.contents with functionResponse parts)
15
15
  * 4. OpenAI Responses API (body.input with function_call_output items)
16
+ * 5. AWS Bedrock Converse API (body.system + body.messages with toolResult blocks)
16
17
  */
17
18
  export declare function installFetchWrapper(state: PluginState, logger: Logger, client: any, config: PluginConfig, toolTracker: ToolTracker, prompts: SynthPrompts): () => void;
18
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/fetch-wrapper/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAuB,YAAY,EAAE,MAAM,SAAS,CAAA;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAQ7C,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAEpF;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAC/B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,YAAY,GACtB,MAAM,IAAI,CA4FZ"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/fetch-wrapper/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAuB,YAAY,EAAE,MAAM,SAAS,CAAA;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAO7C,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAEpF;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAC/B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,YAAY,GACtB,MAAM,IAAI,CA8FZ"}
@@ -1,6 +1,5 @@
1
- import { handleOpenAIChatAndAnthropic } from "./openai-chat";
2
- import { handleGemini } from "./gemini";
3
- import { handleOpenAIResponses } from "./openai-responses";
1
+ import { openaiChatFormat, openaiResponsesFormat, geminiFormat, bedrockFormat } from "./formats";
2
+ import { handleFormat } from "./handler";
4
3
  import { runStrategies } from "../core/strategies";
5
4
  import { accumulateGCStats } from "./gc-tracker";
6
5
  import { trimToolParametersCache } from "../state/tool-cache";
@@ -8,11 +7,12 @@ import { trimToolParametersCache } from "../state/tool-cache";
8
7
  * Creates a wrapped global fetch that intercepts API calls and performs
9
8
  * context pruning on tool outputs that have been marked for removal.
10
9
  *
11
- * Supports four API formats:
10
+ * Supports five API formats:
12
11
  * 1. OpenAI Chat Completions (body.messages with role='tool')
13
12
  * 2. Anthropic (body.messages with role='user' containing tool_result)
14
13
  * 3. Google/Gemini (body.contents with functionResponse parts)
15
14
  * 4. OpenAI Responses API (body.input with function_call_output items)
15
+ * 5. AWS Bedrock Converse API (body.system + body.messages with toolResult blocks)
16
16
  */
17
17
  export function installFetchWrapper(state, logger, client, config, toolTracker, prompts) {
18
18
  const originalGlobalFetch = globalThis.fetch;
@@ -36,26 +36,30 @@ export function installFetchWrapper(state, logger, client, config, toolTracker,
36
36
  const body = JSON.parse(init.body);
37
37
  const inputUrl = typeof input === 'string' ? input : 'URL object';
38
38
  let modified = false;
39
- // Capture tool IDs before handlers run to track what gets cached this request
40
39
  const toolIdsBefore = new Set(state.toolParameters.keys());
41
- // Try each format handler in order
42
- // OpenAI Chat Completions & Anthropic style (body.messages)
43
- if (body.messages && Array.isArray(body.messages)) {
44
- const result = await handleOpenAIChatAndAnthropic(body, ctx, inputUrl);
40
+ // Mutually exclusive format handlers
41
+ // Note: bedrockFormat must be checked before openaiChatFormat since both have messages[]
42
+ // but Bedrock has distinguishing system[] array and inferenceConfig
43
+ if (openaiResponsesFormat.detect(body)) {
44
+ const result = await handleFormat(body, ctx, inputUrl, openaiResponsesFormat);
45
45
  if (result.modified) {
46
46
  modified = true;
47
47
  }
48
48
  }
49
- // Google/Gemini style (body.contents)
50
- if (body.contents && Array.isArray(body.contents)) {
51
- const result = await handleGemini(body, ctx, inputUrl);
49
+ else if (bedrockFormat.detect(body)) {
50
+ const result = await handleFormat(body, ctx, inputUrl, bedrockFormat);
52
51
  if (result.modified) {
53
52
  modified = true;
54
53
  }
55
54
  }
56
- // OpenAI Responses API style (body.input)
57
- if (body.input && Array.isArray(body.input)) {
58
- const result = await handleOpenAIResponses(body, ctx, inputUrl);
55
+ else if (openaiChatFormat.detect(body)) {
56
+ const result = await handleFormat(body, ctx, inputUrl, openaiChatFormat);
57
+ if (result.modified) {
58
+ modified = true;
59
+ }
60
+ }
61
+ else if (geminiFormat.detect(body)) {
62
+ const result = await handleFormat(body, ctx, inputUrl, geminiFormat);
59
63
  if (result.modified) {
60
64
  modified = true;
61
65
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/fetch-wrapper/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/fetch-wrapper/index.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,41 @@ import type { ToolTracker } from "../api-formats/synth-instruction";
4
4
  import type { PluginConfig } from "../config";
5
5
  /** The message used to replace pruned tool output content */
6
6
  export declare const PRUNED_CONTENT_MESSAGE = "[Output removed to save context - information superseded or no longer needed]";
7
+ /** Represents a tool output that can be pruned */
8
+ export interface ToolOutput {
9
+ /** The tool call ID (tool_call_id, call_id, tool_use_id, or position key for Gemini) */
10
+ id: string;
11
+ /** The tool name (for protected tool checking) */
12
+ toolName?: string;
13
+ }
14
+ /**
15
+ * Describes how to handle a specific API format (OpenAI Chat, Anthropic, Gemini, etc.)
16
+ * Each format implements this interface to provide format-specific logic.
17
+ */
18
+ export interface FormatDescriptor {
19
+ /** Human-readable name for logging */
20
+ name: string;
21
+ /** Check if this format matches the request body */
22
+ detect(body: any): boolean;
23
+ /** Get the data array to process (messages, contents, input, etc.) */
24
+ getDataArray(body: any): any[] | undefined;
25
+ /** Cache tool parameters from the data array */
26
+ cacheToolParameters(data: any[], state: PluginState, logger?: Logger): void;
27
+ /** Inject synthetic instruction into the last user message */
28
+ injectSynth(data: any[], instruction: string, nudgeText: string): boolean;
29
+ /** Track new tool results for nudge frequency */
30
+ trackNewToolResults(data: any[], tracker: ToolTracker, protectedTools: Set<string>): number;
31
+ /** Inject prunable list at end of conversation */
32
+ injectPrunableList(data: any[], injection: string): boolean;
33
+ /** Extract all tool outputs from the data for pruning */
34
+ extractToolOutputs(data: any[], state: PluginState): ToolOutput[];
35
+ /** Replace a pruned tool output with the pruned message. Returns true if replaced. */
36
+ replaceToolOutput(data: any[], toolId: string, prunedMessage: string, state: PluginState): boolean;
37
+ /** Check if data has any tool outputs worth processing */
38
+ hasToolOutputs(data: any[]): boolean;
39
+ /** Get metadata for logging after replacements */
40
+ getLogMetadata(data: any[], replacedCount: number, inputUrl: string): Record<string, any>;
41
+ }
7
42
  /** Prompts used for synthetic instruction injection */
8
43
  export interface SynthPrompts {
9
44
  synthInstruction: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../lib/fetch-wrapper/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAyB,MAAM,UAAU,CAAA;AAClE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAE7C,6DAA6D;AAC7D,eAAO,MAAM,sBAAsB,kFAAkF,CAAA;AAErH,uDAAuD;AACvD,MAAM,WAAW,YAAY;IACzB,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,EAAE,MAAM,CAAA;CAC3B;AAED,qDAAqD;AACrD,MAAM,WAAW,mBAAmB;IAChC,KAAK,EAAE,WAAW,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,GAAG,CAAA;IACX,MAAM,EAAE,YAAY,CAAA;IACpB,WAAW,EAAE,WAAW,CAAA;IACxB,OAAO,EAAE,YAAY,CAAA;CACxB;AAED,4DAA4D;AAC5D,MAAM,WAAW,kBAAkB;IAC/B,gEAAgE;IAChE,QAAQ,EAAE,OAAO,CAAA;IACjB,2CAA2C;IAC3C,IAAI,EAAE,GAAG,CAAA;CACZ;AAED,iDAAiD;AACjD,MAAM,WAAW,YAAY;IACzB,WAAW,EAAE,GAAG,CAAA;IAChB,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAC5B;AAED,wBAAsB,eAAe,CACjC,MAAM,EAAE,GAAG,EACX,KAAK,EAAE,WAAW,EAClB,MAAM,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,CAAC,CAYvB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACtC,MAAM,EAAE,GAAG,EACX,SAAS,EAAE,MAAM,GAClB,OAAO,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAY5B;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,GAAG,GAAG,GAAG,GAAG,SAAS,CAG5E"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../lib/fetch-wrapper/types.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,13 @@ export async function getAllPrunedIds(client, state, logger) {
8
8
  if (currentSession) {
9
9
  await ensureSessionRestored(state, currentSession.id, logger);
10
10
  const prunedIds = state.prunedIds.get(currentSession.id) ?? [];
11
- prunedIds.forEach((id) => allPrunedIds.add(id));
11
+ prunedIds.forEach((id) => allPrunedIds.add(id.toLowerCase()));
12
+ if (logger && prunedIds.length > 0) {
13
+ logger.debug("fetch", "Loaded pruned IDs for replacement", {
14
+ sessionId: currentSession.id,
15
+ prunedCount: prunedIds.length
16
+ });
17
+ }
12
18
  }
13
19
  return { allSessions, allPrunedIds };
14
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../lib/fetch-wrapper/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAKlE,6DAA6D;AAC7D,MAAM,CAAC,MAAM,sBAAsB,GAAG,+EAA+E,CAAA;AAgCrH,MAAM,CAAC,KAAK,UAAU,eAAe,CACjC,MAAW,EACX,KAAkB,EAClB,MAAe;IAEf,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;IAC/C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAA;IAEtC,MAAM,cAAc,GAAG,0BAA0B,CAAC,WAAW,CAAC,CAAA;IAC9D,IAAI,cAAc,EAAE,CAAC;QACjB,MAAM,qBAAqB,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QAC7D,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,CAAA;QAC9D,SAAS,CAAC,OAAO,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IAC3D,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,CAAA;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACtC,MAAW,EACX,SAAiB;IAEjB,IAAI,CAAC;QACD,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;YACnD,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE;YACvB,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;SACxB,CAAC,CAAA;QACF,OAAO,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC;YACvC,CAAC,CAAC,gBAAgB,CAAC,IAAI;YACvB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAA;IACxE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,SAAS,CAAA;IACpB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,WAAgB;IACvD,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC9E,OAAO,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AACpE,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../lib/fetch-wrapper/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAKlE,6DAA6D;AAC7D,MAAM,CAAC,MAAM,sBAAsB,GAAG,+EAA+E,CAAA;AAmFrH,MAAM,CAAC,KAAK,UAAU,eAAe,CACjC,MAAW,EACX,KAAkB,EAClB,MAAe;IAEf,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;IAC/C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAA;IAEtC,MAAM,cAAc,GAAG,0BAA0B,CAAC,WAAW,CAAC,CAAA;IAC9D,IAAI,cAAc,EAAE,CAAC;QACjB,MAAM,qBAAqB,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QAC7D,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,CAAA;QAC9D,SAAS,CAAC,OAAO,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;QAErE,IAAI,MAAM,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,mCAAmC,EAAE;gBACvD,SAAS,EAAE,cAAc,CAAC,EAAE;gBAC5B,WAAW,EAAE,SAAS,CAAC,MAAM;aAChC,CAAC,CAAA;QACN,CAAC;IACL,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,CAAA;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACtC,MAAW,EACX,SAAiB;IAEjB,IAAI,CAAC;QACD,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;YACnD,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE;YACvB,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;SACxB,CAAC,CAAA;QACF,OAAO,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC;YACvC,CAAC,CAAC,gBAAgB,CAAC,IAAI;YACvB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAA;IACxE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,SAAS,CAAA;IACpB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,WAAgB;IACvD,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC9E,OAAO,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AACpE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../lib/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,UAAU,CAAA;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAA;AAGlE,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOxF;AAMD,wBAAgB,kBAAkB,CAC9B,MAAM,EAAE,GAAG,EACX,UAAU,EAAE,cAAc,EAC1B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,EACpB,WAAW,CAAC,EAAE,WAAW,IAEX,WAAW;IAAE,KAAK,EAAE,GAAG,CAAA;CAAE,mBA4B1C;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACnC,MAAM,EAAE,GAAG,EACX,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,IAEA,OAAO,GAAG,EAAE,SAAS,GAAG,mBA8EzC"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../lib/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,UAAU,CAAA;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAA;AAIlE,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOxF;AAMD,wBAAgB,kBAAkB,CAC9B,MAAM,EAAE,GAAG,EACX,UAAU,EAAE,cAAc,EAC1B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,EACpB,WAAW,CAAC,EAAE,WAAW,IAEX,WAAW;IAAE,KAAK,EAAE,GAAG,CAAA;CAAE,mBAyB1C;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACnC,MAAM,EAAE,GAAG,EACX,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,IAEA,OAAO,GAAG,EAAE,SAAS,GAAG,mBA4FzC"}
package/dist/lib/hooks.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { runOnIdle } from "./core/janitor";
2
2
  import { resetToolTrackerCount } from "./api-formats/synth-instruction";
3
+ import { clearAllMappings } from "./state/id-mapping";
3
4
  export async function isSubagentSession(client, sessionID) {
4
5
  try {
5
6
  const result = await client.session.get({ path: { id: sessionID } });
@@ -19,8 +20,6 @@ export function createEventHandler(client, janitorCtx, logger, config, toolTrack
19
20
  return;
20
21
  if (config.strategies.onIdle.length === 0)
21
22
  return;
22
- // Skip idle pruning if the last tool used was prune
23
- // and idle strategies cover the same work as tool strategies
24
23
  if (toolTracker?.skipNextIdle) {
25
24
  toolTracker.skipNextIdle = false;
26
25
  if (toolStrategiesCoveredByIdle(config.strategies.onIdle, config.strategies.onTool)) {
@@ -29,7 +28,6 @@ export function createEventHandler(client, janitorCtx, logger, config, toolTrack
29
28
  }
30
29
  try {
31
30
  const result = await runOnIdle(janitorCtx, event.properties.sessionID, config.strategies.onIdle);
32
- // Reset nudge counter if idle pruning succeeded and covers tool strategies
33
31
  if (result && result.prunedCount > 0 && toolTracker && config.nudge_freq > 0) {
34
32
  if (toolStrategiesCoveredByIdle(config.strategies.onIdle, config.strategies.onTool)) {
35
33
  resetToolTrackerCount(toolTracker);
@@ -53,9 +51,15 @@ export function createChatParamsHandler(client, state, logger) {
53
51
  if (!providerID && input.message?.model?.providerID) {
54
52
  providerID = input.message.model.providerID;
55
53
  }
56
- // Track the last seen session ID for fetch wrapper correlation
54
+ if (state.lastSeenSessionId && state.lastSeenSessionId !== sessionId) {
55
+ logger.info("chat.params", "Session changed, resetting state", {
56
+ from: state.lastSeenSessionId.substring(0, 8),
57
+ to: sessionId.substring(0, 8)
58
+ });
59
+ clearAllMappings();
60
+ state.toolParameters.clear();
61
+ }
57
62
  state.lastSeenSessionId = sessionId;
58
- // Check if this is a subagent session
59
63
  if (!state.checkedSessions.has(sessionId)) {
60
64
  state.checkedSessions.add(sessionId);
61
65
  const isSubagent = await isSubagentSession(client, sessionId);
@@ -63,15 +67,14 @@ export function createChatParamsHandler(client, state, logger) {
63
67
  state.subagentSessions.add(sessionId);
64
68
  }
65
69
  }
66
- // Cache model info for the session
70
+ // Cache model info for the session (used by janitor for model selection)
67
71
  if (providerID && modelID) {
68
72
  state.model.set(sessionId, {
69
73
  providerID: providerID,
70
74
  modelID: modelID
71
75
  });
72
76
  }
73
- // Build Google/Gemini tool call mapping for position-based correlation
74
- // This is needed because Google's native format loses tool call IDs
77
+ // Build position-based mapping for Gemini (which loses tool call IDs in native format)
75
78
  if (providerID === 'google' || providerID === 'google-vertex') {
76
79
  try {
77
80
  const messagesResponse = await client.session.messages({
@@ -80,22 +83,27 @@ export function createChatParamsHandler(client, state, logger) {
80
83
  });
81
84
  const messages = messagesResponse.data || messagesResponse;
82
85
  if (Array.isArray(messages)) {
83
- // Build position mapping: track tool calls by name and occurrence index
84
86
  const toolCallsByName = new Map();
85
87
  for (const msg of messages) {
86
88
  if (msg.parts) {
87
89
  for (const part of msg.parts) {
88
90
  if (part.type === 'tool' && part.callID && part.tool) {
89
91
  const toolName = part.tool.toLowerCase();
92
+ const callId = part.callID.toLowerCase();
90
93
  if (!toolCallsByName.has(toolName)) {
91
94
  toolCallsByName.set(toolName, []);
92
95
  }
93
- toolCallsByName.get(toolName).push(part.callID.toLowerCase());
96
+ toolCallsByName.get(toolName).push(callId);
97
+ if (!state.toolParameters.has(callId)) {
98
+ state.toolParameters.set(callId, {
99
+ tool: part.tool,
100
+ parameters: part.input ?? {}
101
+ });
102
+ }
94
103
  }
95
104
  }
96
105
  }
97
106
  }
98
- // Create position mapping: "toolName:index" -> toolCallId
99
107
  const positionMapping = new Map();
100
108
  for (const [toolName, callIds] of toolCallsByName) {
101
109
  callIds.forEach((callId, index) => {
@@ -105,7 +113,8 @@ export function createChatParamsHandler(client, state, logger) {
105
113
  state.googleToolCallMapping.set(sessionId, positionMapping);
106
114
  logger.info("chat.params", "Built Google tool call mapping", {
107
115
  sessionId: sessionId.substring(0, 8),
108
- toolCount: positionMapping.size
116
+ toolCount: positionMapping.size,
117
+ toolParamsCount: state.toolParameters.size
109
118
  });
110
119
  }
111
120
  }