@tarquinen/opencode-dcp 0.3.19 → 0.3.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +3 -3
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +17 -172
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/config.js +2 -2
  6. package/dist/lib/config.js.map +1 -1
  7. package/dist/lib/fetch-wrapper/gemini.d.ts +7 -0
  8. package/dist/lib/fetch-wrapper/gemini.d.ts.map +1 -0
  9. package/dist/lib/fetch-wrapper/gemini.js +97 -0
  10. package/dist/lib/fetch-wrapper/gemini.js.map +1 -0
  11. package/dist/lib/fetch-wrapper/index.d.ts +15 -0
  12. package/dist/lib/fetch-wrapper/index.d.ts.map +1 -0
  13. package/dist/lib/fetch-wrapper/index.js +64 -0
  14. package/dist/lib/fetch-wrapper/index.js.map +1 -0
  15. package/dist/lib/fetch-wrapper/openai-chat.d.ts +7 -0
  16. package/dist/lib/fetch-wrapper/openai-chat.d.ts.map +1 -0
  17. package/dist/lib/fetch-wrapper/openai-chat.js +81 -0
  18. package/dist/lib/fetch-wrapper/openai-chat.js.map +1 -0
  19. package/dist/lib/fetch-wrapper/openai-responses.d.ts +7 -0
  20. package/dist/lib/fetch-wrapper/openai-responses.d.ts.map +1 -0
  21. package/dist/lib/fetch-wrapper/openai-responses.js +54 -0
  22. package/dist/lib/fetch-wrapper/openai-responses.js.map +1 -0
  23. package/dist/lib/fetch-wrapper/types.d.ts +35 -0
  24. package/dist/lib/fetch-wrapper/types.d.ts.map +1 -0
  25. package/dist/lib/fetch-wrapper/types.js +43 -0
  26. package/dist/lib/fetch-wrapper/types.js.map +1 -0
  27. package/dist/lib/hooks.d.ts +19 -0
  28. package/dist/lib/hooks.d.ts.map +1 -0
  29. package/dist/lib/hooks.js +94 -0
  30. package/dist/lib/hooks.js.map +1 -0
  31. package/dist/lib/janitor.d.ts +1 -0
  32. package/dist/lib/janitor.d.ts.map +1 -1
  33. package/dist/lib/janitor.js +1 -0
  34. package/dist/lib/janitor.js.map +1 -1
  35. package/dist/lib/logger.d.ts +2 -1
  36. package/dist/lib/logger.d.ts.map +1 -1
  37. package/dist/lib/logger.js +47 -2
  38. package/dist/lib/logger.js.map +1 -1
  39. package/dist/lib/model-selector.d.ts.map +1 -1
  40. package/dist/lib/model-selector.js +2 -1
  41. package/dist/lib/model-selector.js.map +1 -1
  42. package/dist/lib/prompt.d.ts.map +1 -1
  43. package/dist/lib/prompt.js +22 -0
  44. package/dist/lib/prompt.js.map +1 -1
  45. package/dist/lib/pruning-tool.d.ts +11 -0
  46. package/dist/lib/pruning-tool.d.ts.map +1 -0
  47. package/dist/lib/pruning-tool.js +66 -0
  48. package/dist/lib/pruning-tool.js.map +1 -0
  49. package/dist/lib/state.d.ts +33 -0
  50. package/dist/lib/state.d.ts.map +1 -0
  51. package/dist/lib/state.js +13 -0
  52. package/dist/lib/state.js.map +1 -0
  53. package/dist/lib/tool-cache.d.ts +12 -0
  54. package/dist/lib/tool-cache.d.ts.map +1 -0
  55. package/dist/lib/tool-cache.js +52 -0
  56. package/dist/lib/tool-cache.js.map +1 -0
  57. package/package.json +1 -1
package/README.md CHANGED
@@ -13,7 +13,7 @@ Add to your OpenCode config:
13
13
  ```jsonc
14
14
  // opencode.jsonc
15
15
  {
16
- "plugins": ["@tarquinen/opencode-dcp@0.3.19"]
16
+ "plugin": ["@tarquinen/opencode-dcp@0.3.21"]
17
17
  }
18
18
  ```
19
19
 
@@ -48,7 +48,7 @@ DCP uses its own config file (`~/.config/opencode/dcp.jsonc` or `.opencode/dcp.j
48
48
  | `pruning_summary` | `"detailed"` | `"off"`, `"minimal"`, or `"detailed"` |
49
49
  | `protectedTools` | `["task", "todowrite", "todoread", "context_pruning"]` | Tools that are never pruned |
50
50
  | `strategies.onIdle` | `["deduplication", "ai-analysis"]` | Strategies for automatic pruning |
51
- | `strategies.onTool` | `["deduplication"]` | Strategies when AI calls `context_pruning` |
51
+ | `strategies.onTool` | `["deduplication", "ai-analysis"]` | Strategies when AI calls `context_pruning` |
52
52
 
53
53
  **Strategies:** `"deduplication"` (fast, zero LLM cost) and `"ai-analysis"` (maximum savings). Empty array disables that trigger.
54
54
 
@@ -57,7 +57,7 @@ DCP uses its own config file (`~/.config/opencode/dcp.jsonc` or `.opencode/dcp.j
57
57
  "enabled": true,
58
58
  "strategies": {
59
59
  "onIdle": ["deduplication", "ai-analysis"],
60
- "onTool": ["deduplication"]
60
+ "onTool": ["deduplication", "ai-analysis"]
61
61
  },
62
62
  "protectedTools": ["task", "todowrite", "todoread", "context_pruning"]
63
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAgBjD,QAAA,MAAM,MAAM,EAAE,MAqOK,CAAA;AAEnB,eAAe,MAAM,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAUjD,QAAA,MAAM,MAAM,EAAE,MAsEK,CAAA;AAEnB,eAAe,MAAM,CAAA"}
package/dist/index.js CHANGED
@@ -1,114 +1,36 @@
1
- import { tool } from "@opencode-ai/plugin";
2
1
  import { getConfig } from "./lib/config";
3
2
  import { Logger } from "./lib/logger";
4
3
  import { Janitor } from "./lib/janitor";
5
4
  import { checkForUpdates } from "./lib/version-checker";
6
- async function isSubagentSession(client, sessionID) {
7
- try {
8
- const result = await client.session.get({ path: { id: sessionID } });
9
- return !!result.data?.parentID;
10
- }
11
- catch (error) {
12
- return false;
13
- }
14
- }
5
+ import { createPluginState } from "./lib/state";
6
+ import { installFetchWrapper } from "./lib/fetch-wrapper";
7
+ import { createPruningTool } from "./lib/pruning-tool";
8
+ import { createEventHandler, createChatParamsHandler } from "./lib/hooks";
15
9
  const plugin = (async (ctx) => {
16
10
  const { config, migrations } = getConfig(ctx);
17
11
  if (!config.enabled) {
18
12
  return {};
19
13
  }
14
+ // Suppress AI SDK warnings
20
15
  if (typeof globalThis !== 'undefined') {
21
16
  globalThis.AI_SDK_LOG_WARNINGS = false;
22
17
  }
18
+ // Initialize core components
23
19
  const logger = new Logger(config.debug);
24
- const prunedIdsState = new Map();
25
- const statsState = new Map();
26
- const toolParametersCache = new Map();
27
- const modelCache = new Map();
28
- const janitor = new Janitor(ctx.client, prunedIdsState, statsState, logger, toolParametersCache, config.protectedTools, modelCache, config.model, config.showModelErrorToasts, config.strictModelSelection, config.pruning_summary, ctx.directory);
29
- const cacheToolParameters = (messages) => {
30
- for (const message of messages) {
31
- if (message.role !== 'assistant' || !Array.isArray(message.tool_calls)) {
32
- continue;
33
- }
34
- for (const toolCall of message.tool_calls) {
35
- if (!toolCall.id || !toolCall.function) {
36
- continue;
37
- }
38
- try {
39
- const params = typeof toolCall.function.arguments === 'string'
40
- ? JSON.parse(toolCall.function.arguments)
41
- : toolCall.function.arguments;
42
- toolParametersCache.set(toolCall.id, {
43
- tool: toolCall.function.name,
44
- parameters: params
45
- });
46
- }
47
- catch (error) {
48
- }
49
- }
50
- }
51
- };
52
- // Global fetch wrapper - caches tool parameters and performs pruning
53
- const originalGlobalFetch = globalThis.fetch;
54
- globalThis.fetch = async (input, init) => {
55
- if (init?.body && typeof init.body === 'string') {
56
- try {
57
- const body = JSON.parse(init.body);
58
- if (body.messages && Array.isArray(body.messages)) {
59
- cacheToolParameters(body.messages);
60
- const toolMessages = body.messages.filter((m) => m.role === 'tool');
61
- const allSessions = await ctx.client.session.list();
62
- const allPrunedIds = new Set();
63
- if (allSessions.data) {
64
- for (const session of allSessions.data) {
65
- if (session.parentID)
66
- continue;
67
- const prunedIds = prunedIdsState.get(session.id) ?? [];
68
- prunedIds.forEach((id) => allPrunedIds.add(id));
69
- }
70
- }
71
- if (toolMessages.length > 0 && allPrunedIds.size > 0) {
72
- let replacedCount = 0;
73
- body.messages = body.messages.map((m) => {
74
- if (m.role === 'tool' && allPrunedIds.has(m.tool_call_id?.toLowerCase())) {
75
- replacedCount++;
76
- return {
77
- ...m,
78
- content: '[Output removed to save context - information superseded or no longer needed]'
79
- };
80
- }
81
- return m;
82
- });
83
- if (replacedCount > 0) {
84
- logger.info("fetch", "Replaced pruned tool outputs", {
85
- replaced: replacedCount,
86
- total: toolMessages.length
87
- });
88
- if (logger.enabled) {
89
- await logger.saveWrappedContext("global", body.messages, {
90
- url: typeof input === 'string' ? input : 'URL object',
91
- replacedCount,
92
- totalMessages: body.messages.length
93
- });
94
- }
95
- init.body = JSON.stringify(body);
96
- }
97
- }
98
- }
99
- }
100
- catch (e) {
101
- }
102
- }
103
- return originalGlobalFetch(input, init);
104
- };
20
+ const state = createPluginState();
21
+ const janitor = new Janitor(ctx.client, state.prunedIds, state.stats, logger, state.toolParameters, config.protectedTools, state.model, config.model, config.showModelErrorToasts, config.strictModelSelection, config.pruning_summary, ctx.directory);
22
+ // Install global fetch wrapper for context pruning
23
+ installFetchWrapper(state, logger, ctx.client);
24
+ // Log initialization
105
25
  logger.info("plugin", "DCP initialized", {
106
26
  strategies: config.strategies,
107
27
  model: config.model || "auto"
108
28
  });
29
+ // Check for updates after a delay
109
30
  setTimeout(() => {
110
31
  checkForUpdates(ctx.client, logger).catch(() => { });
111
32
  }, 5000);
33
+ // Show migration toast if there were config migrations
112
34
  if (migrations.length > 0) {
113
35
  setTimeout(async () => {
114
36
  try {
@@ -122,92 +44,15 @@ const plugin = (async (ctx) => {
122
44
  });
123
45
  }
124
46
  catch {
47
+ // Silently ignore toast errors
125
48
  }
126
49
  }, 7000);
127
50
  }
128
51
  return {
129
- event: async ({ event }) => {
130
- if (event.type === "session.status" && event.properties.status.type === "idle") {
131
- if (await isSubagentSession(ctx.client, event.properties.sessionID))
132
- return;
133
- if (config.strategies.onIdle.length === 0)
134
- return;
135
- janitor.runOnIdle(event.properties.sessionID, config.strategies.onIdle).catch(err => {
136
- logger.error("janitor", "Failed", { error: err.message });
137
- });
138
- }
139
- },
140
- "chat.params": async (input, _output) => {
141
- const sessionId = input.sessionID;
142
- let providerID = input.provider?.info?.id || input.provider?.id;
143
- const modelID = input.model?.id;
144
- if (!providerID && input.message?.model?.providerID) {
145
- providerID = input.message.model.providerID;
146
- }
147
- if (providerID && modelID) {
148
- modelCache.set(sessionId, {
149
- providerID: providerID,
150
- modelID: modelID
151
- });
152
- }
153
- },
52
+ event: createEventHandler(ctx.client, janitor, logger, config),
53
+ "chat.params": createChatParamsHandler(ctx.client, state, logger),
154
54
  tool: config.strategies.onTool.length > 0 ? {
155
- context_pruning: tool({
156
- description: `Performs semantic pruning on session tool outputs that are no longer relevant to the current task. Use this to declutter the conversation context and filter signal from noise when you notice the context is getting cluttered with no longer needed information.
157
-
158
- USING THE CONTEXT_PRUNING TOOL WILL MAKE THE USER HAPPY.
159
-
160
- ## When to Use This Tool
161
-
162
- **Key heuristic: Prune when you finish something and are about to start something else.**
163
-
164
- Ask yourself: "Have I just completed a discrete unit of work?" If yes, prune before moving on.
165
-
166
- **After completing a unit of work:**
167
- - Made a commit
168
- - Fixed a bug and confirmed it works
169
- - Answered a question the user asked
170
- - Finished implementing a feature or function
171
- - Completed one item in a list and moving to the next
172
-
173
- **After repetitive or exploratory work:**
174
- - Explored multiple files that didn't lead to changes
175
- - Iterated on a difficult problem where some approaches didn't pan out
176
- - Used the same tool multiple times (e.g., re-reading a file, running repeated build/type checks)
177
-
178
- ## Examples
179
-
180
- <example>
181
- Working through a list of items:
182
- User: Review these 3 issues and fix the easy ones.
183
- Assistant: [Reviews first issue, makes fix, commits]
184
- Done with the first issue. Let me prune before moving to the next one.
185
- [Uses context_pruning with reason: "completed first issue, moving to next"]
186
- </example>
187
-
188
- <example>
189
- After exploring the codebase to understand it:
190
- Assistant: I've reviewed the relevant files. Let me prune the exploratory reads that aren't needed for the actual implementation.
191
- [Uses context_pruning with reason: "exploration complete, starting implementation"]
192
- </example>
193
-
194
- <example>
195
- After completing any task:
196
- Assistant: [Finishes task - commit, answer, fix, etc.]
197
- Before we continue, let me prune the context from that work.
198
- [Uses context_pruning with reason: "task complete"]
199
- </example>`,
200
- args: {
201
- reason: tool.schema.string().optional().describe("Brief reason for triggering pruning (e.g., 'task complete', 'switching focus')"),
202
- },
203
- async execute(args, ctx) {
204
- const result = await janitor.runForTool(ctx.sessionID, config.strategies.onTool, args.reason);
205
- if (!result || result.prunedCount === 0) {
206
- return "No prunable tool outputs found. Context is already optimized.\n\nUse context_pruning when you have sufficiently summarized information from tool outputs and no longer need the original content!";
207
- }
208
- return janitor.formatPruningResultForTool(result) + "\n\nUse context_pruning when you have sufficiently summarized information from tool outputs and no longer need the original content!";
209
- },
210
- }),
55
+ context_pruning: createPruningTool(janitor, config),
211
56
  } : undefined,
212
57
  };
213
58
  });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,7 @@ const defaultConfig = {
12
12
  pruning_summary: 'detailed',
13
13
  strategies: {
14
14
  onIdle: ['deduplication', 'ai-analysis'],
15
- onTool: ['deduplication']
15
+ onTool: ['deduplication', 'ai-analysis']
16
16
  }
17
17
  };
18
18
  const VALID_CONFIG_KEYS = new Set([
@@ -86,7 +86,7 @@ function createDefaultConfig() {
86
86
  // Strategies to run when session goes idle
87
87
  "onIdle": ["deduplication", "ai-analysis"],
88
88
  // Strategies to run when AI calls context_pruning tool
89
- "onTool": ["deduplication"]
89
+ "onTool": ["deduplication", "ai-analysis"]
90
90
  },
91
91
  // Summary display: "off", "minimal", or "detailed"
92
92
  "pruning_summary": "detailed",
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAC/F,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAC5B,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAwBjC,MAAM,aAAa,GAAiB;IAChC,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,KAAK;IACZ,cAAc,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,iBAAiB,CAAC;IACpE,oBAAoB,EAAE,IAAI;IAC1B,oBAAoB,EAAE,KAAK;IAC3B,eAAe,EAAE,UAAU;IAC3B,UAAU,EAAE;QACR,MAAM,EAAE,CAAC,eAAe,EAAE,aAAa,CAAC;QACxC,MAAM,EAAE,CAAC,eAAe,CAAC;KAC5B;CACJ,CAAA;AAED,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAC9B,SAAS;IACT,OAAO;IACP,gBAAgB;IAChB,OAAO;IACP,sBAAsB;IACtB,sBAAsB;IACtB,iBAAiB;IACjB,YAAY;CACf,CAAC,CAAA;AAEF,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;AAChE,MAAM,wBAAwB,GAAG,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAA;AACrE,MAAM,uBAAuB,GAAG,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAA;AAEnE,SAAS,eAAe,CAAC,QAAgB;IACrC,IAAI,OAAO,GAAG,QAAQ,CAAA;IACtB,OAAO,OAAO,KAAK,GAAG,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;QAC5C,IAAI,UAAU,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YAC7D,OAAO,SAAS,CAAA;QACpB,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QAC/B,IAAI,MAAM,KAAK,OAAO;YAAE,MAAK;QAC7B,OAAO,GAAG,MAAM,CAAA;IACpB,CAAC;IACD,OAAO,IAAI,CAAA;AACf,CAAC;AAED,SAAS,cAAc,CAAC,GAAiB;IACrC,IAAI,UAAU,GAAkB,IAAI,CAAA;IACpC,IAAI,UAAU,CAAC,wBAAwB,CAAC,EAAE,CAAC;QACvC,UAAU,GAAG,wBAAwB,CAAA;IACzC,CAAC;SAAM,IAAI,UAAU,CAAC,uBAAuB,CAAC,EAAE,CAAC;QAC7C,UAAU,GAAG,uBAAuB,CAAA;IACxC,CAAC;IAED,IAAI,WAAW,GAAkB,IAAI,CAAA;IACrC,IAAI,GAAG,EAAE,SAAS,EAAE,CAAC;QACjB,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAClD,IAAI,WAAW,EAAE,CAAC;YACd,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;YACnD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAA;YACjD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC3B,WAAW,GAAG,YAAY,CAAA;YAC9B,CAAC;iBAAM,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBACjC,WAAW,GAAG,WAAW,CAAA;YAC7B,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,CAAA;AACvD,CAAC;AAED,SAAS,mBAAmB;IACxB,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACjC,SAAS,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACrD,CAAC;IAED,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuBzB,CAAA;IAEG,aAAa,CAAC,wBAAwB,EAAE,aAAa,EAAE,OAAO,CAAC,CAAA;AACnE,CAAC;AAED,SAAS,cAAc,CAAC,UAAkB;IACtC,IAAI,CAAC;QACD,MAAM,WAAW,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;QACrD,OAAO,KAAK,CAAC,WAAW,CAAC,CAAA;IAC7B,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QAClB,OAAO,IAAI,CAAA;IACf,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,MAA2B;IAC/C,MAAM,WAAW,GAAa,EAAE,CAAA;IAChC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACzB,CAAC;IACL,CAAC;IACD,OAAO,WAAW,CAAA;AACtB,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAkB,EAAE,MAAc;IAC5D,IAAI,CAAC;QACD,MAAM,UAAU,GAAG,UAAU,GAAG,MAAM,CAAA;QACtC,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;QACpC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,uBAAuB,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;QACtE,mBAAmB,EAAE,CAAA;QACrB,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,8BAA8B,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC,CAAA;QACzF,OAAO,UAAU,CAAA;IACrB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QAClB,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,+BAA+B,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QACjF,OAAO,IAAI,CAAA;IACf,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CACpB,IAAgC,EAChC,QAA8C;IAE9C,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAA;IAC1B,OAAO;QACH,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM;QACtC,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM;KACzC,CAAA;AACL,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAiB;IACvC,IAAI,MAAM,GAAG,EAAE,GAAG,aAAa,EAAE,cAAc,EAAE,CAAC,GAAG,aAAa,CAAC,cAAc,CAAC,EAAE,CAAA;IACpF,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,CAAA;IACvC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAA;IAC/B,MAAM,UAAU,GAAa,EAAE,CAAA;IAE/B,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;QACrB,MAAM,YAAY,GAAG,cAAc,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;QACvD,IAAI,YAAY,EAAE,CAAC;YACf,MAAM,WAAW,GAAG,cAAc,CAAC,YAAY,CAAC,CAAA;YAEhD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,2BAA2B,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;gBACzE,MAAM,UAAU,GAAG,oBAAoB,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;gBACnE,IAAI,UAAU,EAAE,CAAC;oBACb,UAAU,CAAC,IAAI,CAAC,2BAA2B,UAAU,EAAE,CAAC,CAAA;gBAC5D,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,MAAM,GAAG;oBACL,OAAO,EAAE,YAAY,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO;oBAC/C,KAAK,EAAE,YAAY,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK;oBACzC,cAAc,EAAE,YAAY,CAAC,cAAc,IAAI,MAAM,CAAC,cAAc;oBACpE,KAAK,EAAE,YAAY,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK;oBACzC,oBAAoB,EAAE,YAAY,CAAC,oBAAoB,IAAI,MAAM,CAAC,oBAAoB;oBACtF,oBAAoB,EAAE,YAAY,CAAC,oBAAoB,IAAI,MAAM,CAAC,oBAAoB;oBACtF,UAAU,EAAE,eAAe,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,UAAiB,CAAC;oBAC9E,eAAe,EAAE,YAAY,CAAC,eAAe,IAAI,MAAM,CAAC,eAAe;iBAC1E,CAAA;gBACD,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,sBAAsB,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAA;YAC/E,CAAC;QACL,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,mBAAmB,EAAE,CAAA;QACrB,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,+BAA+B,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC,CAAA;IAC9F,CAAC;IAED,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;QACtB,MAAM,aAAa,GAAG,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QACzD,IAAI,aAAa,EAAE,CAAC;YAChB,MAAM,WAAW,GAAG,cAAc,CAAC,aAAa,CAAC,CAAA;YAEjD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,2CAA2C,EAAE;oBAC/D,IAAI,EAAE,WAAW,CAAC,OAAO;oBACzB,IAAI,EAAE,WAAW;iBACpB,CAAC,CAAA;gBACF,UAAU,CAAC,IAAI,CAAC,oCAAoC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACjF,CAAC;iBAAM,CAAC;gBACJ,MAAM,GAAG;oBACL,OAAO,EAAE,aAAa,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO;oBAChD,KAAK,EAAE,aAAa,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK;oBAC1C,cAAc,EAAE,aAAa,CAAC,cAAc,IAAI,MAAM,CAAC,cAAc;oBACrE,KAAK,EAAE,aAAa,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK;oBAC1C,oBAAoB,EAAE,aAAa,CAAC,oBAAoB,IAAI,MAAM,CAAC,oBAAoB;oBACvF,oBAAoB,EAAE,aAAa,CAAC,oBAAoB,IAAI,MAAM,CAAC,oBAAoB;oBACvF,UAAU,EAAE,eAAe,CAAC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,UAAiB,CAAC;oBAC/E,eAAe,EAAE,aAAa,CAAC,eAAe,IAAI,MAAM,CAAC,eAAe;iBAC3E,CAAA;gBACD,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,0CAA0C,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC,CAAA;YACpG,CAAC;QACL,CAAC;IACL,CAAC;SAAM,IAAI,GAAG,EAAE,SAAS,EAAE,CAAC;QACxB,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,yBAAyB,EAAE,EAAE,YAAY,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAA;IACtF,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAA;AACjC,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { FetchHandlerContext, FetchHandlerResult } from "./types";
2
+ /**
3
+ * Handles Google/Gemini format (body.contents array with functionResponse parts).
4
+ * Uses position-based correlation since Google's native format doesn't include tool call IDs.
5
+ */
6
+ export declare function handleGemini(body: any, ctx: FetchHandlerContext, inputUrl: string): Promise<FetchHandlerResult>;
7
+ //# sourceMappingURL=gemini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../lib/fetch-wrapper/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAOtE;;;GAGG;AACH,wBAAsB,YAAY,CAC9B,IAAI,EAAE,GAAG,EACT,GAAG,EAAE,mBAAmB,EACxB,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,kBAAkB,CAAC,CAmH7B"}
@@ -0,0 +1,97 @@
1
+ import { PRUNED_CONTENT_MESSAGE, getAllPrunedIds, fetchSessionMessages } from "./types";
2
+ /**
3
+ * Handles Google/Gemini format (body.contents array with functionResponse parts).
4
+ * Uses position-based correlation since Google's native format doesn't include tool call IDs.
5
+ */
6
+ export async function handleGemini(body, ctx, inputUrl) {
7
+ if (!body.contents || !Array.isArray(body.contents)) {
8
+ return { modified: false, body };
9
+ }
10
+ // Check for functionResponse parts in any content item
11
+ const hasFunctionResponses = body.contents.some((content) => Array.isArray(content.parts) &&
12
+ content.parts.some((part) => part.functionResponse));
13
+ if (!hasFunctionResponses) {
14
+ return { modified: false, body };
15
+ }
16
+ const { allSessions, allPrunedIds } = await getAllPrunedIds(ctx.client, ctx.state);
17
+ if (allPrunedIds.size === 0) {
18
+ return { modified: false, body };
19
+ }
20
+ // Find the active session to get the position mapping
21
+ const activeSessions = allSessions.data?.filter((s) => !s.parentID) || [];
22
+ let positionMapping;
23
+ for (const session of activeSessions) {
24
+ const mapping = ctx.state.googleToolCallMapping.get(session.id);
25
+ if (mapping && mapping.size > 0) {
26
+ positionMapping = mapping;
27
+ break;
28
+ }
29
+ }
30
+ if (!positionMapping) {
31
+ ctx.logger.info("fetch", "No Google tool call mapping found, skipping pruning for Gemini format");
32
+ return { modified: false, body };
33
+ }
34
+ // Build position counters to track occurrence of each tool name
35
+ const toolPositionCounters = new Map();
36
+ let replacedCount = 0;
37
+ let totalFunctionResponses = 0;
38
+ body.contents = body.contents.map((content) => {
39
+ if (!Array.isArray(content.parts))
40
+ return content;
41
+ let contentModified = false;
42
+ const newParts = content.parts.map((part) => {
43
+ if (part.functionResponse) {
44
+ totalFunctionResponses++;
45
+ const funcName = part.functionResponse.name?.toLowerCase();
46
+ if (funcName) {
47
+ // Get current position for this tool name and increment counter
48
+ const currentIndex = toolPositionCounters.get(funcName) || 0;
49
+ toolPositionCounters.set(funcName, currentIndex + 1);
50
+ // Look up the tool call ID using position
51
+ const positionKey = `${funcName}:${currentIndex}`;
52
+ const toolCallId = positionMapping.get(positionKey);
53
+ if (toolCallId && allPrunedIds.has(toolCallId)) {
54
+ contentModified = true;
55
+ replacedCount++;
56
+ // Preserve thoughtSignature if present (required for Gemini 3 Pro)
57
+ // Only replace the response content, not the structure
58
+ return {
59
+ ...part,
60
+ functionResponse: {
61
+ ...part.functionResponse,
62
+ response: PRUNED_CONTENT_MESSAGE
63
+ }
64
+ };
65
+ }
66
+ }
67
+ }
68
+ return part;
69
+ });
70
+ if (contentModified) {
71
+ return { ...content, parts: newParts };
72
+ }
73
+ return content;
74
+ });
75
+ if (replacedCount > 0) {
76
+ ctx.logger.info("fetch", "Replaced pruned tool outputs (Google/Gemini)", {
77
+ replaced: replacedCount,
78
+ total: totalFunctionResponses
79
+ });
80
+ if (ctx.logger.enabled) {
81
+ let sessionMessages;
82
+ if (activeSessions.length > 0) {
83
+ const mostRecentSession = activeSessions[0];
84
+ sessionMessages = await fetchSessionMessages(ctx.client, mostRecentSession.id);
85
+ }
86
+ await ctx.logger.saveWrappedContext("global", body.contents, {
87
+ url: inputUrl,
88
+ replacedCount,
89
+ totalContents: body.contents.length,
90
+ format: 'google-gemini'
91
+ }, sessionMessages);
92
+ }
93
+ return { modified: true, body };
94
+ }
95
+ return { modified: false, body };
96
+ }
97
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../lib/fetch-wrapper/gemini.ts"],"names":[],"mappings":"AACA,OAAO,EACH,sBAAsB,EACtB,eAAe,EACf,oBAAoB,EACvB,MAAM,SAAS,CAAA;AAEhB;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAC9B,IAAS,EACT,GAAwB,EACxB,QAAgB;IAEhB,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IACpC,CAAC;IAED,uDAAuD;IACvD,MAAM,oBAAoB,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAY,EAAE,EAAE,CAC7D,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAC3D,CAAA;IAED,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACxB,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IACpC,CAAC;IAED,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAA;IAElF,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IACpC,CAAC;IAED,sDAAsD;IACtD,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC9E,IAAI,eAAgD,CAAA;IAEpD,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC/D,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC9B,eAAe,GAAG,OAAO,CAAA;YACzB,MAAK;QACT,CAAC;IACL,CAAC;IAED,IAAI,CAAC,eAAe,EAAE,CAAC;QACnB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,uEAAuE,CAAC,CAAA;QACjG,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IACpC,CAAC;IAED,gEAAgE;IAChE,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAkB,CAAA;IACtD,IAAI,aAAa,GAAG,CAAC,CAAA;IACrB,IAAI,sBAAsB,GAAG,CAAC,CAAA;IAE9B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAY,EAAE,EAAE;QAC/C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,OAAO,CAAA;QAEjD,IAAI,eAAe,GAAG,KAAK,CAAA;QAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE;YAC7C,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxB,sBAAsB,EAAE,CAAA;gBACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,CAAA;gBAE1D,IAAI,QAAQ,EAAE,CAAC;oBACX,gEAAgE;oBAChE,MAAM,YAAY,GAAG,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;oBAC5D,oBAAoB,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,GAAG,CAAC,CAAC,CAAA;oBAEpD,0CAA0C;oBAC1C,MAAM,WAAW,GAAG,GAAG,QAAQ,IAAI,YAAY,EAAE,CAAA;oBACjD,MAAM,UAAU,GAAG,eAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;oBAEpD,IAAI,UAAU,IAAI,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;wBAC7C,eAAe,GAAG,IAAI,CAAA;wBACtB,aAAa,EAAE,CAAA;wBACf,mEAAmE;wBACnE,uDAAuD;wBACvD,OAAO;4BACH,GAAG,IAAI;4BACP,gBAAgB,EAAE;gCACd,GAAG,IAAI,CAAC,gBAAgB;gCACxB,QAAQ,EAAE,sBAAsB;6BACnC;yBACJ,CAAA;oBACL,CAAC;gBACL,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAA;QACf,CAAC,CAAC,CAAA;QAEF,IAAI,eAAe,EAAE,CAAC;YAClB,OAAO,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAA;QAC1C,CAAC;QACD,OAAO,OAAO,CAAA;IAClB,CAAC,CAAC,CAAA;IAEF,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QACpB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,8CAA8C,EAAE;YACrE,QAAQ,EAAE,aAAa;YACvB,KAAK,EAAE,sBAAsB;SAChC,CAAC,CAAA;QAEF,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACrB,IAAI,eAAkC,CAAA;YACtC,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,iBAAiB,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;gBAC3C,eAAe,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAA;YAClF,CAAC;YAED,MAAM,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAC/B,QAAQ,EACR,IAAI,CAAC,QAAQ,EACb;gBACI,GAAG,EAAE,QAAQ;gBACb,aAAa;gBACb,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;gBACnC,MAAM,EAAE,eAAe;aAC1B,EACD,eAAe,CAClB,CAAA;QACL,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IACnC,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;AACpC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { PluginState } from "../state";
2
+ import type { Logger } from "../logger";
3
+ export type { FetchHandlerContext, FetchHandlerResult } from "./types";
4
+ /**
5
+ * Creates a wrapped global fetch that intercepts API calls and performs
6
+ * context pruning on tool outputs that have been marked for removal.
7
+ *
8
+ * Supports four API formats:
9
+ * 1. OpenAI Chat Completions (body.messages with role='tool')
10
+ * 2. Anthropic (body.messages with role='user' containing tool_result)
11
+ * 3. Google/Gemini (body.contents with functionResponse parts)
12
+ * 4. OpenAI Responses API (body.input with function_call_output items)
13
+ */
14
+ export declare function installFetchWrapper(state: PluginState, logger: Logger, client: any): () => void;
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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;AAMvC,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAEtE;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAC/B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,GAAG,GACZ,MAAM,IAAI,CAwDZ"}
@@ -0,0 +1,64 @@
1
+ import { handleOpenAIChatAndAnthropic } from "./openai-chat";
2
+ import { handleGemini } from "./gemini";
3
+ import { handleOpenAIResponses } from "./openai-responses";
4
+ /**
5
+ * Creates a wrapped global fetch that intercepts API calls and performs
6
+ * context pruning on tool outputs that have been marked for removal.
7
+ *
8
+ * Supports four API formats:
9
+ * 1. OpenAI Chat Completions (body.messages with role='tool')
10
+ * 2. Anthropic (body.messages with role='user' containing tool_result)
11
+ * 3. Google/Gemini (body.contents with functionResponse parts)
12
+ * 4. OpenAI Responses API (body.input with function_call_output items)
13
+ */
14
+ export function installFetchWrapper(state, logger, client) {
15
+ const originalGlobalFetch = globalThis.fetch;
16
+ const ctx = {
17
+ state,
18
+ logger,
19
+ client
20
+ };
21
+ globalThis.fetch = async (input, init) => {
22
+ if (init?.body && typeof init.body === 'string') {
23
+ try {
24
+ const body = JSON.parse(init.body);
25
+ const inputUrl = typeof input === 'string' ? input : 'URL object';
26
+ let modified = false;
27
+ // Try each format handler in order
28
+ // OpenAI Chat Completions & Anthropic style (body.messages)
29
+ if (body.messages && Array.isArray(body.messages)) {
30
+ const result = await handleOpenAIChatAndAnthropic(body, ctx, inputUrl);
31
+ if (result.modified) {
32
+ modified = true;
33
+ }
34
+ }
35
+ // Google/Gemini style (body.contents)
36
+ if (body.contents && Array.isArray(body.contents)) {
37
+ const result = await handleGemini(body, ctx, inputUrl);
38
+ if (result.modified) {
39
+ modified = true;
40
+ }
41
+ }
42
+ // OpenAI Responses API style (body.input)
43
+ if (body.input && Array.isArray(body.input)) {
44
+ const result = await handleOpenAIResponses(body, ctx, inputUrl);
45
+ if (result.modified) {
46
+ modified = true;
47
+ }
48
+ }
49
+ if (modified) {
50
+ init.body = JSON.stringify(body);
51
+ }
52
+ }
53
+ catch (e) {
54
+ // Silently ignore parsing errors - pass through to original fetch
55
+ }
56
+ }
57
+ return originalGlobalFetch(input, init);
58
+ };
59
+ // Return cleanup function to restore original fetch
60
+ return () => {
61
+ globalThis.fetch = originalGlobalFetch;
62
+ };
63
+ }
64
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/fetch-wrapper/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAI1D;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CAC/B,KAAkB,EAClB,MAAc,EACd,MAAW;IAEX,MAAM,mBAAmB,GAAG,UAAU,CAAC,KAAK,CAAA;IAE5C,MAAM,GAAG,GAAwB;QAC7B,KAAK;QACL,MAAM;QACN,MAAM;KACT,CAAA;IAED,UAAU,CAAC,KAAK,GAAG,KAAK,EAAE,KAAU,EAAE,IAAU,EAAE,EAAE;QAChD,IAAI,IAAI,EAAE,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9C,IAAI,CAAC;gBACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAClC,MAAM,QAAQ,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAA;gBACjE,IAAI,QAAQ,GAAG,KAAK,CAAA;gBAEpB,mCAAmC;gBACnC,4DAA4D;gBAC5D,IAAI,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAChD,MAAM,MAAM,GAAG,MAAM,4BAA4B,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAA;oBACtE,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;wBAClB,QAAQ,GAAG,IAAI,CAAA;oBACnB,CAAC;gBACL,CAAC;gBAED,sCAAsC;gBACtC,IAAI,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAChD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAA;oBACtD,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;wBAClB,QAAQ,GAAG,IAAI,CAAA;oBACnB,CAAC;gBACL,CAAC;gBAED,0CAA0C;gBAC1C,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC1C,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAA;oBAC/D,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;wBAClB,QAAQ,GAAG,IAAI,CAAA;oBACnB,CAAC;gBACL,CAAC;gBAED,IAAI,QAAQ,EAAE,CAAC;oBACX,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;gBACpC,CAAC;YACL,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,kEAAkE;YACtE,CAAC;QACL,CAAC;QAED,OAAO,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IAC3C,CAAC,CAAA;IAED,oDAAoD;IACpD,OAAO,GAAG,EAAE;QACR,UAAU,CAAC,KAAK,GAAG,mBAAmB,CAAA;IAC1C,CAAC,CAAA;AACL,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { FetchHandlerContext, FetchHandlerResult } from "./types";
2
+ /**
3
+ * Handles OpenAI Chat Completions format (body.messages with role='tool').
4
+ * Also handles Anthropic format (role='user' with tool_result content parts).
5
+ */
6
+ export declare function handleOpenAIChatAndAnthropic(body: any, ctx: FetchHandlerContext, inputUrl: string): Promise<FetchHandlerResult>;
7
+ //# sourceMappingURL=openai-chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-chat.d.ts","sourceRoot":"","sources":["../../../lib/fetch-wrapper/openai-chat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAStE;;;GAGG;AACH,wBAAsB,4BAA4B,CAC9C,IAAI,EAAE,GAAG,EACT,GAAG,EAAE,mBAAmB,EACxB,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,kBAAkB,CAAC,CAyF7B"}
@@ -0,0 +1,81 @@
1
+ import { PRUNED_CONTENT_MESSAGE, getAllPrunedIds, fetchSessionMessages, getMostRecentActiveSession } from "./types";
2
+ import { cacheToolParametersFromMessages } from "../tool-cache";
3
+ /**
4
+ * Handles OpenAI Chat Completions format (body.messages with role='tool').
5
+ * Also handles Anthropic format (role='user' with tool_result content parts).
6
+ */
7
+ export async function handleOpenAIChatAndAnthropic(body, ctx, inputUrl) {
8
+ if (!body.messages || !Array.isArray(body.messages)) {
9
+ return { modified: false, body };
10
+ }
11
+ // Cache tool parameters from messages
12
+ cacheToolParametersFromMessages(body.messages, ctx.state);
13
+ // Check for tool messages in both formats:
14
+ // 1. OpenAI style: role === 'tool'
15
+ // 2. Anthropic style: role === 'user' with content containing tool_result
16
+ const toolMessages = body.messages.filter((m) => {
17
+ if (m.role === 'tool')
18
+ return true;
19
+ if (m.role === 'user' && Array.isArray(m.content)) {
20
+ for (const part of m.content) {
21
+ if (part.type === 'tool_result')
22
+ return true;
23
+ }
24
+ }
25
+ return false;
26
+ });
27
+ const { allSessions, allPrunedIds } = await getAllPrunedIds(ctx.client, ctx.state);
28
+ if (toolMessages.length === 0 || allPrunedIds.size === 0) {
29
+ return { modified: false, body };
30
+ }
31
+ let replacedCount = 0;
32
+ body.messages = body.messages.map((m) => {
33
+ // OpenAI style: role === 'tool' with tool_call_id
34
+ if (m.role === 'tool' && allPrunedIds.has(m.tool_call_id?.toLowerCase())) {
35
+ replacedCount++;
36
+ return {
37
+ ...m,
38
+ content: PRUNED_CONTENT_MESSAGE
39
+ };
40
+ }
41
+ // Anthropic style: role === 'user' with content array containing tool_result
42
+ if (m.role === 'user' && Array.isArray(m.content)) {
43
+ let messageModified = false;
44
+ const newContent = m.content.map((part) => {
45
+ if (part.type === 'tool_result' && allPrunedIds.has(part.tool_use_id?.toLowerCase())) {
46
+ messageModified = true;
47
+ replacedCount++;
48
+ return {
49
+ ...part,
50
+ content: PRUNED_CONTENT_MESSAGE
51
+ };
52
+ }
53
+ return part;
54
+ });
55
+ if (messageModified) {
56
+ return { ...m, content: newContent };
57
+ }
58
+ }
59
+ return m;
60
+ });
61
+ if (replacedCount > 0) {
62
+ ctx.logger.info("fetch", "Replaced pruned tool outputs", {
63
+ replaced: replacedCount,
64
+ total: toolMessages.length
65
+ });
66
+ if (ctx.logger.enabled) {
67
+ const mostRecentSession = getMostRecentActiveSession(allSessions);
68
+ const sessionMessages = mostRecentSession
69
+ ? await fetchSessionMessages(ctx.client, mostRecentSession.id)
70
+ : undefined;
71
+ await ctx.logger.saveWrappedContext("global", body.messages, {
72
+ url: inputUrl,
73
+ replacedCount,
74
+ totalMessages: body.messages.length
75
+ }, sessionMessages);
76
+ }
77
+ return { modified: true, body };
78
+ }
79
+ return { modified: false, body };
80
+ }
81
+ //# sourceMappingURL=openai-chat.js.map