@tarquinen/opencode-dcp 0.4.16 → 1.0.0-beta.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.
- package/README.md +58 -30
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -59
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +30 -13
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +339 -121
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/hooks.d.ts +5 -13
- package/dist/lib/hooks.d.ts.map +1 -1
- package/dist/lib/hooks.js +26 -125
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/logger.d.ts +5 -9
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +30 -160
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/messages/index.d.ts +2 -0
- package/dist/lib/messages/index.d.ts.map +1 -0
- package/dist/lib/messages/index.js +2 -0
- package/dist/lib/messages/index.js.map +1 -0
- package/dist/lib/messages/prune.d.ts +6 -0
- package/dist/lib/messages/prune.d.ts.map +1 -0
- package/dist/lib/messages/prune.js +85 -0
- package/dist/lib/messages/prune.js.map +1 -0
- package/dist/lib/messages/utils.d.ts +10 -0
- package/dist/lib/messages/utils.d.ts.map +1 -0
- package/dist/lib/messages/utils.js +103 -0
- package/dist/lib/messages/utils.js.map +1 -0
- package/dist/lib/model-selector.js +3 -3
- package/dist/lib/model-selector.js.map +1 -1
- package/dist/lib/{core/prompt.d.ts → prompt.d.ts} +1 -1
- package/dist/lib/prompt.d.ts.map +1 -0
- package/dist/lib/{core/prompt.js → prompt.js} +2 -6
- package/dist/lib/prompt.js.map +1 -0
- package/dist/lib/prompts/pruning.txt +1 -1
- package/dist/lib/prompts/tool.txt +3 -3
- package/dist/lib/state/index.d.ts +3 -27
- package/dist/lib/state/index.d.ts.map +1 -1
- package/dist/lib/state/index.js +3 -40
- package/dist/lib/state/index.js.map +1 -1
- package/dist/lib/state/persistence.d.ts +4 -4
- package/dist/lib/state/persistence.d.ts.map +1 -1
- package/dist/lib/state/persistence.js +24 -20
- package/dist/lib/state/persistence.js.map +1 -1
- package/dist/lib/state/state.d.ts +7 -0
- package/dist/lib/state/state.d.ts.map +1 -0
- package/dist/lib/state/state.js +76 -0
- package/dist/lib/state/state.js.map +1 -0
- package/dist/lib/state/tool-cache.d.ts +4 -6
- package/dist/lib/state/tool-cache.d.ts.map +1 -1
- package/dist/lib/state/tool-cache.js +14 -46
- package/dist/lib/state/tool-cache.js.map +1 -1
- package/dist/lib/state/types.d.ts +30 -0
- package/dist/lib/state/types.d.ts.map +1 -0
- package/dist/lib/state/types.js +2 -0
- package/dist/lib/state/types.js.map +1 -0
- package/dist/lib/strategies/deduplication.d.ts +10 -0
- package/dist/lib/strategies/deduplication.d.ts.map +1 -0
- package/dist/lib/strategies/deduplication.js +89 -0
- package/dist/lib/strategies/deduplication.js.map +1 -0
- package/dist/lib/strategies/index.d.ts +4 -0
- package/dist/lib/strategies/index.d.ts.map +1 -0
- package/dist/lib/strategies/index.js +4 -0
- package/dist/lib/strategies/index.js.map +1 -0
- package/dist/lib/strategies/on-idle.d.ts +14 -0
- package/dist/lib/strategies/on-idle.d.ts.map +1 -0
- package/dist/lib/strategies/on-idle.js +216 -0
- package/dist/lib/strategies/on-idle.js.map +1 -0
- package/dist/lib/strategies/prune-tool.d.ts +17 -0
- package/dist/lib/strategies/prune-tool.d.ts.map +1 -0
- package/dist/lib/strategies/prune-tool.js +70 -0
- package/dist/lib/strategies/prune-tool.js.map +1 -0
- package/dist/lib/ui/display-utils.d.ts +3 -12
- package/dist/lib/ui/display-utils.d.ts.map +1 -1
- package/dist/lib/ui/display-utils.js +12 -79
- package/dist/lib/ui/display-utils.js.map +1 -1
- package/dist/lib/ui/notification.d.ts +7 -23
- package/dist/lib/ui/notification.d.ts.map +1 -1
- package/dist/lib/ui/notification.js +38 -47
- package/dist/lib/ui/notification.js.map +1 -1
- package/dist/lib/utils.d.ts +9 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +61 -0
- package/dist/lib/utils.js.map +1 -0
- package/package.json +1 -1
- package/dist/lib/core/janitor.d.ts +0 -38
- package/dist/lib/core/janitor.d.ts.map +0 -1
- package/dist/lib/core/janitor.js +0 -292
- package/dist/lib/core/janitor.js.map +0 -1
- package/dist/lib/core/prompt.d.ts.map +0 -1
- package/dist/lib/core/prompt.js.map +0 -1
- package/dist/lib/core/strategies/deduplication.d.ts +0 -7
- package/dist/lib/core/strategies/deduplication.d.ts.map +0 -1
- package/dist/lib/core/strategies/deduplication.js +0 -76
- package/dist/lib/core/strategies/deduplication.js.map +0 -1
- package/dist/lib/core/strategies/index.d.ts +0 -51
- package/dist/lib/core/strategies/index.d.ts.map +0 -1
- package/dist/lib/core/strategies/index.js +0 -48
- package/dist/lib/core/strategies/index.js.map +0 -1
- package/dist/lib/fetch-wrapper/formats/anthropic.d.ts +0 -8
- package/dist/lib/fetch-wrapper/formats/anthropic.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/formats/anthropic.js +0 -96
- package/dist/lib/fetch-wrapper/formats/anthropic.js.map +0 -1
- package/dist/lib/fetch-wrapper/formats/bedrock.d.ts +0 -8
- package/dist/lib/fetch-wrapper/formats/bedrock.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/formats/bedrock.js +0 -97
- package/dist/lib/fetch-wrapper/formats/bedrock.js.map +0 -1
- package/dist/lib/fetch-wrapper/formats/gemini.d.ts +0 -8
- package/dist/lib/fetch-wrapper/formats/gemini.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/formats/gemini.js +0 -134
- package/dist/lib/fetch-wrapper/formats/gemini.js.map +0 -1
- package/dist/lib/fetch-wrapper/formats/index.d.ts +0 -6
- package/dist/lib/fetch-wrapper/formats/index.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/formats/index.js +0 -6
- package/dist/lib/fetch-wrapper/formats/index.js.map +0 -1
- package/dist/lib/fetch-wrapper/formats/openai-chat.d.ts +0 -3
- package/dist/lib/fetch-wrapper/formats/openai-chat.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/formats/openai-chat.js +0 -100
- package/dist/lib/fetch-wrapper/formats/openai-chat.js.map +0 -1
- package/dist/lib/fetch-wrapper/formats/openai-responses.d.ts +0 -3
- package/dist/lib/fetch-wrapper/formats/openai-responses.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/formats/openai-responses.js +0 -63
- package/dist/lib/fetch-wrapper/formats/openai-responses.js.map +0 -1
- package/dist/lib/fetch-wrapper/gc-tracker.d.ts +0 -4
- package/dist/lib/fetch-wrapper/gc-tracker.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/gc-tracker.js +0 -61
- package/dist/lib/fetch-wrapper/gc-tracker.js.map +0 -1
- package/dist/lib/fetch-wrapper/handler.d.ts +0 -3
- package/dist/lib/fetch-wrapper/handler.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/handler.js +0 -118
- package/dist/lib/fetch-wrapper/handler.js.map +0 -1
- package/dist/lib/fetch-wrapper/index.d.ts +0 -18
- package/dist/lib/fetch-wrapper/index.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/index.js +0 -107
- package/dist/lib/fetch-wrapper/index.js.map +0 -1
- package/dist/lib/fetch-wrapper/prunable-list.d.ts +0 -8
- package/dist/lib/fetch-wrapper/prunable-list.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/prunable-list.js +0 -38
- package/dist/lib/fetch-wrapper/prunable-list.js.map +0 -1
- package/dist/lib/fetch-wrapper/tool-tracker.d.ts +0 -9
- package/dist/lib/fetch-wrapper/tool-tracker.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/tool-tracker.js +0 -12
- package/dist/lib/fetch-wrapper/tool-tracker.js.map +0 -1
- package/dist/lib/fetch-wrapper/types.d.ts +0 -62
- package/dist/lib/fetch-wrapper/types.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/types.js +0 -7
- package/dist/lib/fetch-wrapper/types.js.map +0 -1
- package/dist/lib/pruning-tool.d.ts +0 -20
- package/dist/lib/pruning-tool.d.ts.map +0 -1
- package/dist/lib/pruning-tool.js +0 -160
- package/dist/lib/pruning-tool.js.map +0 -1
- package/dist/lib/state/id-mapping.d.ts +0 -25
- package/dist/lib/state/id-mapping.d.ts.map +0 -1
- package/dist/lib/state/id-mapping.js +0 -51
- package/dist/lib/state/id-mapping.js.map +0 -1
- package/dist/lib/tokenizer.d.ts +0 -3
- package/dist/lib/tokenizer.d.ts.map +0 -1
- package/dist/lib/tokenizer.js +0 -16
- package/dist/lib/tokenizer.js.map +0 -1
- package/dist/lib/version-checker.d.ts +0 -9
- package/dist/lib/version-checker.d.ts.map +0 -1
- package/dist/lib/version-checker.js +0 -77
- package/dist/lib/version-checker.js.map +0 -1
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import { ensureSessionRestored } from "../state";
|
|
2
|
-
import { buildPrunableToolsList, buildEndInjection } from "./prunable-list";
|
|
3
|
-
import { syncToolCache } from "../state/tool-cache";
|
|
4
|
-
import { loadPrompt } from "../core/prompt";
|
|
5
|
-
const SYNTHETIC_INSTRUCTION = loadPrompt("synthetic");
|
|
6
|
-
const PRUNED_CONTENT_MESSAGE = '[Output removed to save context - information superseded or no longer needed]';
|
|
7
|
-
function getMostRecentActiveSession(allSessions) {
|
|
8
|
-
const activeSessions = allSessions.data?.filter((s) => !s.parentID) || [];
|
|
9
|
-
return activeSessions.length > 0 ? activeSessions[0] : undefined;
|
|
10
|
-
}
|
|
11
|
-
async function fetchSessionMessages(client, sessionId) {
|
|
12
|
-
try {
|
|
13
|
-
const messagesResponse = await client.session.messages({
|
|
14
|
-
path: { id: sessionId },
|
|
15
|
-
query: { limit: 500 }
|
|
16
|
-
});
|
|
17
|
-
return Array.isArray(messagesResponse.data)
|
|
18
|
-
? messagesResponse.data
|
|
19
|
-
: Array.isArray(messagesResponse) ? messagesResponse : undefined;
|
|
20
|
-
}
|
|
21
|
-
catch (e) {
|
|
22
|
-
return undefined;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
async function getAllPrunedIds(client, state, logger) {
|
|
26
|
-
const allSessions = await client.session.list();
|
|
27
|
-
const allPrunedIds = new Set();
|
|
28
|
-
const currentSession = getMostRecentActiveSession(allSessions);
|
|
29
|
-
if (currentSession) {
|
|
30
|
-
await ensureSessionRestored(state, currentSession.id, logger);
|
|
31
|
-
const prunedIds = state.prunedIds.get(currentSession.id) ?? [];
|
|
32
|
-
prunedIds.forEach((id) => allPrunedIds.add(id.toLowerCase()));
|
|
33
|
-
if (logger && prunedIds.length > 0) {
|
|
34
|
-
logger.debug("fetch", "Loaded pruned IDs for replacement", {
|
|
35
|
-
sessionId: currentSession.id,
|
|
36
|
-
prunedCount: prunedIds.length
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
return { allSessions, allPrunedIds };
|
|
41
|
-
}
|
|
42
|
-
export async function handleFormat(body, ctx, inputUrl, format) {
|
|
43
|
-
const data = format.getDataArray(body);
|
|
44
|
-
if (!data) {
|
|
45
|
-
return { modified: false, body };
|
|
46
|
-
}
|
|
47
|
-
let modified = false;
|
|
48
|
-
// Sync tool parameters from OpenCode's session API (single source of truth)
|
|
49
|
-
// Also tracks new tool results for nudge injection
|
|
50
|
-
const sessionId = ctx.state.lastSeenSessionId;
|
|
51
|
-
const protectedSet = new Set(ctx.config.protectedTools);
|
|
52
|
-
if (sessionId) {
|
|
53
|
-
await ensureSessionRestored(ctx.state, sessionId, ctx.logger);
|
|
54
|
-
await syncToolCache(ctx.client, sessionId, ctx.state, ctx.toolTracker, protectedSet, ctx.logger);
|
|
55
|
-
}
|
|
56
|
-
if (ctx.config.strategies.onTool.length > 0 && sessionId) {
|
|
57
|
-
const toolIds = Array.from(ctx.state.toolParameters.keys());
|
|
58
|
-
const alreadyPruned = ctx.state.prunedIds.get(sessionId) ?? [];
|
|
59
|
-
const alreadyPrunedLower = new Set(alreadyPruned.map(id => id.toLowerCase()));
|
|
60
|
-
const unprunedIds = toolIds.filter(id => !alreadyPrunedLower.has(id.toLowerCase()));
|
|
61
|
-
const { list: prunableList, numericIds } = buildPrunableToolsList(sessionId, unprunedIds, ctx.state.toolParameters, ctx.config.protectedTools);
|
|
62
|
-
if (prunableList) {
|
|
63
|
-
const includeNudge = ctx.config.nudge_freq > 0 && ctx.toolTracker.toolResultCount > ctx.config.nudge_freq;
|
|
64
|
-
if (format.injectSystemMessage(body, SYNTHETIC_INSTRUCTION)) {
|
|
65
|
-
modified = true;
|
|
66
|
-
}
|
|
67
|
-
const endInjection = buildEndInjection(prunableList, includeNudge);
|
|
68
|
-
if (format.appendUserMessage && format.appendUserMessage(body, endInjection)) {
|
|
69
|
-
const nudgeMsg = includeNudge ? " with nudge" : "";
|
|
70
|
-
ctx.logger.debug("fetch", `Appended prunable tools list${nudgeMsg} as user message (${format.name})`, {
|
|
71
|
-
ids: numericIds,
|
|
72
|
-
nudge: includeNudge,
|
|
73
|
-
toolsSincePrune: ctx.toolTracker.toolResultCount
|
|
74
|
-
});
|
|
75
|
-
modified = true;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
if (!format.hasToolOutputs(data)) {
|
|
80
|
-
return { modified, body };
|
|
81
|
-
}
|
|
82
|
-
const { allSessions, allPrunedIds } = await getAllPrunedIds(ctx.client, ctx.state, ctx.logger);
|
|
83
|
-
if (allPrunedIds.size === 0) {
|
|
84
|
-
return { modified, body };
|
|
85
|
-
}
|
|
86
|
-
const toolOutputs = format.extractToolOutputs(data, ctx.state);
|
|
87
|
-
let replacedCount = 0;
|
|
88
|
-
let prunableCount = 0;
|
|
89
|
-
for (const output of toolOutputs) {
|
|
90
|
-
// Skip tools not in cache (protected tools are excluded from cache)
|
|
91
|
-
if (!output.toolName)
|
|
92
|
-
continue;
|
|
93
|
-
prunableCount++;
|
|
94
|
-
if (allPrunedIds.has(output.id)) {
|
|
95
|
-
if (format.replaceToolOutput(data, output.id, PRUNED_CONTENT_MESSAGE, ctx.state)) {
|
|
96
|
-
replacedCount++;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
if (replacedCount > 0) {
|
|
101
|
-
ctx.logger.info("fetch", `Replaced pruned tool outputs (${format.name})`, {
|
|
102
|
-
replaced: replacedCount,
|
|
103
|
-
total: prunableCount
|
|
104
|
-
});
|
|
105
|
-
if (ctx.logger.enabled) {
|
|
106
|
-
const activeSessions = allSessions.data?.filter((s) => !s.parentID) || [];
|
|
107
|
-
let sessionMessages;
|
|
108
|
-
if (activeSessions.length > 0) {
|
|
109
|
-
const mostRecentSession = activeSessions[0];
|
|
110
|
-
sessionMessages = await fetchSessionMessages(ctx.client, mostRecentSession.id);
|
|
111
|
-
}
|
|
112
|
-
await ctx.logger.saveWrappedContext("global", data, format.getLogMetadata(data, replacedCount, inputUrl), sessionMessages);
|
|
113
|
-
}
|
|
114
|
-
return { modified: true, body };
|
|
115
|
-
}
|
|
116
|
-
return { modified, body };
|
|
117
|
-
}
|
|
118
|
-
//# sourceMappingURL=handler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../lib/fetch-wrapper/handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { PluginState } from "../state";
|
|
2
|
-
import type { Logger } from "../logger";
|
|
3
|
-
import type { ToolTracker } from "./types";
|
|
4
|
-
import type { PluginConfig } from "../config";
|
|
5
|
-
export type { FetchHandlerContext, FetchHandlerResult } from "./types";
|
|
6
|
-
/**
|
|
7
|
-
* Creates a wrapped global fetch that intercepts API calls and performs
|
|
8
|
-
* context pruning on tool outputs that have been marked for removal.
|
|
9
|
-
*
|
|
10
|
-
* Supports five API formats:
|
|
11
|
-
* 1. OpenAI Chat Completions (body.messages with role='tool')
|
|
12
|
-
* 2. Anthropic Messages API (body.system + body.messages with tool_result)
|
|
13
|
-
* 3. Google/Gemini (body.contents with functionResponse parts)
|
|
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
|
-
*/
|
|
17
|
-
export declare function installFetchWrapper(state: PluginState, logger: Logger, client: any, config: PluginConfig, toolTracker: ToolTracker): () => void;
|
|
18
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
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;AAEvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAO7C,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAEtE;;;;;;;;;;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,GACzB,MAAM,IAAI,CAuGZ"}
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import { openaiChatFormat, openaiResponsesFormat, geminiFormat, bedrockFormat, anthropicFormat } from "./formats";
|
|
2
|
-
import { handleFormat } from "./handler";
|
|
3
|
-
import { runStrategies } from "../core/strategies";
|
|
4
|
-
import { accumulateGCStats } from "./gc-tracker";
|
|
5
|
-
import { trimToolParametersCache } from "../state/tool-cache";
|
|
6
|
-
/**
|
|
7
|
-
* Creates a wrapped global fetch that intercepts API calls and performs
|
|
8
|
-
* context pruning on tool outputs that have been marked for removal.
|
|
9
|
-
*
|
|
10
|
-
* Supports five API formats:
|
|
11
|
-
* 1. OpenAI Chat Completions (body.messages with role='tool')
|
|
12
|
-
* 2. Anthropic Messages API (body.system + body.messages with tool_result)
|
|
13
|
-
* 3. Google/Gemini (body.contents with functionResponse parts)
|
|
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
|
-
*/
|
|
17
|
-
export function installFetchWrapper(state, logger, client, config, toolTracker) {
|
|
18
|
-
const originalGlobalFetch = globalThis.fetch;
|
|
19
|
-
const ctx = {
|
|
20
|
-
state,
|
|
21
|
-
logger,
|
|
22
|
-
client,
|
|
23
|
-
config,
|
|
24
|
-
toolTracker
|
|
25
|
-
};
|
|
26
|
-
globalThis.fetch = async (input, init) => {
|
|
27
|
-
if (state.lastSeenSessionId && state.subagentSessions.has(state.lastSeenSessionId)) {
|
|
28
|
-
logger.debug("fetch-wrapper", "Skipping DCP processing for subagent session", {
|
|
29
|
-
sessionId: state.lastSeenSessionId.substring(0, 8)
|
|
30
|
-
});
|
|
31
|
-
return originalGlobalFetch(input, init);
|
|
32
|
-
}
|
|
33
|
-
if (init?.body && typeof init.body === 'string') {
|
|
34
|
-
try {
|
|
35
|
-
const body = JSON.parse(init.body);
|
|
36
|
-
const inputUrl = typeof input === 'string' ? input : 'URL object';
|
|
37
|
-
let modified = false;
|
|
38
|
-
const toolIdsBefore = new Set(state.toolParameters.keys());
|
|
39
|
-
// Mutually exclusive format handlers
|
|
40
|
-
// Order matters: More specific formats first to avoid incorrect detection
|
|
41
|
-
// 1. OpenAI Responses API: has body.input (not body.messages)
|
|
42
|
-
// 2. Bedrock: has body.system + body.inferenceConfig + body.messages
|
|
43
|
-
// 3. Anthropic: has body.system + body.messages (no inferenceConfig)
|
|
44
|
-
// 4. OpenAI Chat: has body.messages (no top-level system)
|
|
45
|
-
// 5. Gemini: has body.contents
|
|
46
|
-
if (openaiResponsesFormat.detect(body)) {
|
|
47
|
-
const result = await handleFormat(body, ctx, inputUrl, openaiResponsesFormat);
|
|
48
|
-
if (result.modified) {
|
|
49
|
-
modified = true;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
else if (bedrockFormat.detect(body)) {
|
|
53
|
-
const result = await handleFormat(body, ctx, inputUrl, bedrockFormat);
|
|
54
|
-
if (result.modified) {
|
|
55
|
-
modified = true;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
else if (anthropicFormat.detect(body)) {
|
|
59
|
-
const result = await handleFormat(body, ctx, inputUrl, anthropicFormat);
|
|
60
|
-
if (result.modified) {
|
|
61
|
-
modified = true;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
else if (openaiChatFormat.detect(body)) {
|
|
65
|
-
const result = await handleFormat(body, ctx, inputUrl, openaiChatFormat);
|
|
66
|
-
if (result.modified) {
|
|
67
|
-
modified = true;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
else if (geminiFormat.detect(body)) {
|
|
71
|
-
const result = await handleFormat(body, ctx, inputUrl, geminiFormat);
|
|
72
|
-
if (result.modified) {
|
|
73
|
-
modified = true;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
const sessionId = state.lastSeenSessionId;
|
|
77
|
-
const toolIdsAfter = Array.from(state.toolParameters.keys());
|
|
78
|
-
const newToolsCached = toolIdsAfter.filter(id => !toolIdsBefore.has(id)).length > 0;
|
|
79
|
-
if (sessionId && newToolsCached && state.toolParameters.size > 0) {
|
|
80
|
-
const toolIds = Array.from(state.toolParameters.keys());
|
|
81
|
-
const alreadyPruned = state.prunedIds.get(sessionId) ?? [];
|
|
82
|
-
const alreadyPrunedLower = new Set(alreadyPruned.map(id => id.toLowerCase()));
|
|
83
|
-
const unpruned = toolIds.filter(id => !alreadyPrunedLower.has(id.toLowerCase()));
|
|
84
|
-
if (unpruned.length > 1) {
|
|
85
|
-
const result = runStrategies(state.toolParameters, unpruned, config.protectedTools);
|
|
86
|
-
if (result.prunedIds.length > 0) {
|
|
87
|
-
const normalizedIds = result.prunedIds.map(id => id.toLowerCase());
|
|
88
|
-
state.prunedIds.set(sessionId, [...new Set([...alreadyPruned, ...normalizedIds])]);
|
|
89
|
-
accumulateGCStats(state, sessionId, result.prunedIds, body, logger);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
trimToolParametersCache(state);
|
|
93
|
-
}
|
|
94
|
-
if (modified) {
|
|
95
|
-
init.body = JSON.stringify(body);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
catch (e) {
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
return originalGlobalFetch(input, init);
|
|
102
|
-
};
|
|
103
|
-
return () => {
|
|
104
|
-
globalThis.fetch = originalGlobalFetch;
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/fetch-wrapper/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AACjH,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAI7D;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CAC/B,KAAkB,EAClB,MAAc,EACd,MAAW,EACX,MAAoB,EACpB,WAAwB;IAExB,MAAM,mBAAmB,GAAG,UAAU,CAAC,KAAK,CAAA;IAE5C,MAAM,GAAG,GAAwB;QAC7B,KAAK;QACL,MAAM;QACN,MAAM;QACN,MAAM;QACN,WAAW;KACd,CAAA;IAED,UAAU,CAAC,KAAK,GAAG,KAAK,EAAE,KAAU,EAAE,IAAU,EAAE,EAAE;QAChD,IAAI,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACjF,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,8CAA8C,EAAE;gBAC1E,SAAS,EAAE,KAAK,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;aACrD,CAAC,CAAA;YACF,OAAO,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QAC3C,CAAC;QAED,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,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAA;gBAE1D,qCAAqC;gBACrC,0EAA0E;gBAC1E,8DAA8D;gBAC9D,qEAAqE;gBACrE,qEAAqE;gBACrE,0DAA0D;gBAC1D,+BAA+B;gBAC/B,IAAI,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAA;oBAC7E,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;wBAClB,QAAQ,GAAG,IAAI,CAAA;oBACnB,CAAC;gBACL,CAAC;qBACI,IAAI,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;oBAClC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAA;oBACrE,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;wBAClB,QAAQ,GAAG,IAAI,CAAA;oBACnB,CAAC;gBACL,CAAC;qBACI,IAAI,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;oBACpC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAA;oBACvE,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;wBAClB,QAAQ,GAAG,IAAI,CAAA;oBACnB,CAAC;gBACL,CAAC;qBACI,IAAI,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAA;oBACxE,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;wBAClB,QAAQ,GAAG,IAAI,CAAA;oBACnB,CAAC;gBACL,CAAC;qBACI,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;oBACjC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAA;oBACpE,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;wBAClB,QAAQ,GAAG,IAAI,CAAA;oBACnB,CAAC;gBACL,CAAC;gBAED,MAAM,SAAS,GAAG,KAAK,CAAC,iBAAiB,CAAA;gBACzC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAA;gBAC5D,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;gBAEnF,IAAI,SAAS,IAAI,cAAc,IAAI,KAAK,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;oBAC/D,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAA;oBACvD,MAAM,aAAa,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;oBAC1D,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;oBAC7E,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;oBAChF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACtB,MAAM,MAAM,GAAG,aAAa,CACxB,KAAK,CAAC,cAAc,EACpB,QAAQ,EACR,MAAM,CAAC,cAAc,CACxB,CAAA;wBACD,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BAC9B,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;4BAClE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,aAAa,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;4BAClF,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;wBACvE,CAAC;oBACL,CAAC;oBAED,uBAAuB,CAAC,KAAK,CAAC,CAAA;gBAClC,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;YACb,CAAC;QACL,CAAC;QAED,OAAO,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IAC3C,CAAC,CAAA;IAED,OAAO,GAAG,EAAE;QACR,UAAU,CAAC,KAAK,GAAG,mBAAmB,CAAA;IAC1C,CAAC,CAAA;AACL,CAAC"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { ToolMetadata } from './types';
|
|
2
|
-
export interface PrunableListResult {
|
|
3
|
-
list: string;
|
|
4
|
-
numericIds: number[];
|
|
5
|
-
}
|
|
6
|
-
export declare function buildPrunableToolsList(sessionId: string, unprunedToolCallIds: string[], toolMetadata: Map<string, ToolMetadata>, protectedTools: string[]): PrunableListResult;
|
|
7
|
-
export declare function buildEndInjection(prunableList: string, includeNudge: boolean): string;
|
|
8
|
-
//# sourceMappingURL=prunable-list.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prunable-list.d.ts","sourceRoot":"","sources":["../../../lib/fetch-wrapper/prunable-list.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAI3C,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,EAAE,CAAA;CACvB;AAED,wBAAgB,sBAAsB,CAClC,SAAS,EAAE,MAAM,EACjB,mBAAmB,EAAE,MAAM,EAAE,EAC7B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EACvC,cAAc,EAAE,MAAM,EAAE,GACzB,kBAAkB,CAyBpB;AAED,wBAAgB,iBAAiB,CAC7B,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,OAAO,GACtB,MAAM,CAYR"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { extractParameterKey } from '../ui/display-utils';
|
|
2
|
-
import { getOrCreateNumericId } from '../state/id-mapping';
|
|
3
|
-
import { loadPrompt } from '../core/prompt';
|
|
4
|
-
const NUDGE_INSTRUCTION = loadPrompt("nudge");
|
|
5
|
-
export function buildPrunableToolsList(sessionId, unprunedToolCallIds, toolMetadata, protectedTools) {
|
|
6
|
-
const lines = [];
|
|
7
|
-
const numericIds = [];
|
|
8
|
-
for (const actualId of unprunedToolCallIds) {
|
|
9
|
-
const metadata = toolMetadata.get(actualId);
|
|
10
|
-
if (!metadata)
|
|
11
|
-
continue;
|
|
12
|
-
if (protectedTools.includes(metadata.tool))
|
|
13
|
-
continue;
|
|
14
|
-
const numericId = getOrCreateNumericId(sessionId, actualId);
|
|
15
|
-
numericIds.push(numericId);
|
|
16
|
-
const paramKey = extractParameterKey(metadata);
|
|
17
|
-
const description = paramKey ? `${metadata.tool}, ${paramKey}` : metadata.tool;
|
|
18
|
-
lines.push(`${numericId}: ${description}`);
|
|
19
|
-
}
|
|
20
|
-
if (lines.length === 0) {
|
|
21
|
-
return { list: '', numericIds: [] };
|
|
22
|
-
}
|
|
23
|
-
return {
|
|
24
|
-
list: `<prunable-tools>\nThe following tools have been invoked and are available for pruning. This list does not mandate immediate action. Consider your current goals and the resources you need before discarding valuable tool outputs. Keep the context free of noise.\n${lines.join('\n')}\n</prunable-tools>`,
|
|
25
|
-
numericIds
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
export function buildEndInjection(prunableList, includeNudge) {
|
|
29
|
-
if (!prunableList) {
|
|
30
|
-
return '';
|
|
31
|
-
}
|
|
32
|
-
const parts = [prunableList];
|
|
33
|
-
if (includeNudge) {
|
|
34
|
-
parts.push(NUDGE_INSTRUCTION);
|
|
35
|
-
}
|
|
36
|
-
return parts.join('\n\n');
|
|
37
|
-
}
|
|
38
|
-
//# sourceMappingURL=prunable-list.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prunable-list.js","sourceRoot":"","sources":["../../../lib/fetch-wrapper/prunable-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAG3C,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;AAO7C,MAAM,UAAU,sBAAsB,CAClC,SAAiB,EACjB,mBAA6B,EAC7B,YAAuC,EACvC,cAAwB;IAExB,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,MAAM,UAAU,GAAa,EAAE,CAAA;IAE/B,KAAK,MAAM,QAAQ,IAAI,mBAAmB,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC3C,IAAI,CAAC,QAAQ;YAAE,SAAQ;QACvB,IAAI,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAQ;QAEpD,MAAM,SAAS,GAAG,oBAAoB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;QAC3D,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAE1B,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAA;QAC9C,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAA;QAC9E,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,WAAW,EAAE,CAAC,CAAA;IAC9C,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAA;IACvC,CAAC;IAED,OAAO;QACH,IAAI,EAAE,wQAAwQ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB;QACnT,UAAU;KACb,CAAA;AACL,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC7B,YAAoB,EACpB,YAAqB;IAErB,IAAI,CAAC,YAAY,EAAE,CAAC;QAChB,OAAO,EAAE,CAAA;IACb,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,YAAY,CAAC,CAAA;IAE5B,IAAI,YAAY,EAAE,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IACjC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AAC7B,CAAC"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export interface ToolTracker {
|
|
2
|
-
seenToolResultIds: Set<string>;
|
|
3
|
-
toolResultCount: number;
|
|
4
|
-
skipNextIdle: boolean;
|
|
5
|
-
}
|
|
6
|
-
export declare function createToolTracker(): ToolTracker;
|
|
7
|
-
export declare function resetToolTrackerCount(tracker: ToolTracker): void;
|
|
8
|
-
export declare function clearToolTracker(tracker: ToolTracker): void;
|
|
9
|
-
//# sourceMappingURL=tool-tracker.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tool-tracker.d.ts","sourceRoot":"","sources":["../../../lib/fetch-wrapper/tool-tracker.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IACxB,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC9B,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,EAAE,OAAO,CAAA;CACxB;AAED,wBAAgB,iBAAiB,IAAI,WAAW,CAE/C;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAEhE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAI3D"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export function createToolTracker() {
|
|
2
|
-
return { seenToolResultIds: new Set(), toolResultCount: 0, skipNextIdle: false };
|
|
3
|
-
}
|
|
4
|
-
export function resetToolTrackerCount(tracker) {
|
|
5
|
-
tracker.toolResultCount = 0;
|
|
6
|
-
}
|
|
7
|
-
export function clearToolTracker(tracker) {
|
|
8
|
-
tracker.seenToolResultIds.clear();
|
|
9
|
-
tracker.toolResultCount = 0;
|
|
10
|
-
tracker.skipNextIdle = false;
|
|
11
|
-
}
|
|
12
|
-
//# sourceMappingURL=tool-tracker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tool-tracker.js","sourceRoot":"","sources":["../../../lib/fetch-wrapper/tool-tracker.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,iBAAiB;IAC7B,OAAO,EAAE,iBAAiB,EAAE,IAAI,GAAG,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAA;AACpF,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAoB;IACtD,OAAO,CAAC,eAAe,GAAG,CAAC,CAAA;AAC/B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAoB;IACjD,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAA;IACjC,OAAO,CAAC,eAAe,GAAG,CAAC,CAAA;IAC3B,OAAO,CAAC,YAAY,GAAG,KAAK,CAAA;AAChC,CAAC"}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import type { PluginState } from "../state";
|
|
2
|
-
import type { Logger } from "../logger";
|
|
3
|
-
import type { PluginConfig } from "../config";
|
|
4
|
-
import type { ToolTracker } from "./tool-tracker";
|
|
5
|
-
export type { ToolTracker } from "./tool-tracker";
|
|
6
|
-
export interface ToolOutput {
|
|
7
|
-
id: string;
|
|
8
|
-
toolName?: string;
|
|
9
|
-
}
|
|
10
|
-
export interface ToolMetadata {
|
|
11
|
-
tool: string;
|
|
12
|
-
parameters?: any;
|
|
13
|
-
}
|
|
14
|
-
export interface FormatDescriptor {
|
|
15
|
-
name: string;
|
|
16
|
-
detect(body: any): boolean;
|
|
17
|
-
getDataArray(body: any): any[] | undefined;
|
|
18
|
-
injectSystemMessage(body: any, injection: string): boolean;
|
|
19
|
-
appendUserMessage?(body: any, injection: string): boolean;
|
|
20
|
-
extractToolOutputs(data: any[], state: PluginState): ToolOutput[];
|
|
21
|
-
replaceToolOutput(data: any[], toolId: string, prunedMessage: string, state: PluginState): boolean;
|
|
22
|
-
hasToolOutputs(data: any[]): boolean;
|
|
23
|
-
getLogMetadata(data: any[], replacedCount: number, inputUrl: string): Record<string, any>;
|
|
24
|
-
}
|
|
25
|
-
export interface FetchHandlerContext {
|
|
26
|
-
state: PluginState;
|
|
27
|
-
logger: Logger;
|
|
28
|
-
client: any;
|
|
29
|
-
config: PluginConfig;
|
|
30
|
-
toolTracker: ToolTracker;
|
|
31
|
-
}
|
|
32
|
-
export interface FetchHandlerResult {
|
|
33
|
-
modified: boolean;
|
|
34
|
-
body: any;
|
|
35
|
-
}
|
|
36
|
-
export interface PrunedIdData {
|
|
37
|
-
allSessions: any;
|
|
38
|
-
allPrunedIds: Set<string>;
|
|
39
|
-
}
|
|
40
|
-
/** The 3 scenarios that trigger explicit LLM pruning */
|
|
41
|
-
export type PruneReason = "completion" | "noise" | "consolidation";
|
|
42
|
-
/** Human-readable labels for prune reasons */
|
|
43
|
-
export declare const PRUNE_REASON_LABELS: Record<PruneReason, string>;
|
|
44
|
-
export interface SessionStats {
|
|
45
|
-
totalToolsPruned: number;
|
|
46
|
-
totalTokensSaved: number;
|
|
47
|
-
totalGCTokens: number;
|
|
48
|
-
totalGCTools: number;
|
|
49
|
-
}
|
|
50
|
-
export interface GCStats {
|
|
51
|
-
tokensCollected: number;
|
|
52
|
-
toolsDeduped: number;
|
|
53
|
-
}
|
|
54
|
-
export interface PruningResult {
|
|
55
|
-
prunedCount: number;
|
|
56
|
-
tokensSaved: number;
|
|
57
|
-
llmPrunedIds: string[];
|
|
58
|
-
toolMetadata: Map<string, ToolMetadata>;
|
|
59
|
-
sessionStats: SessionStats;
|
|
60
|
-
reason?: PruneReason;
|
|
61
|
-
}
|
|
62
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../lib/fetch-wrapper/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjD,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAEjD,MAAM,WAAW,UAAU;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,GAAG,CAAA;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAA;IAC1B,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,SAAS,CAAA;IAC1C,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAA;IAC1D,iBAAiB,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAA;IACzD,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,GAAG,UAAU,EAAE,CAAA;IACjE,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAA;IAClG,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAA;IACpC,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAC5F;AAED,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;CAC3B;AAED,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,EAAE,OAAO,CAAA;IACjB,IAAI,EAAE,GAAG,CAAA;CACZ;AAED,MAAM,WAAW,YAAY;IACzB,WAAW,EAAE,GAAG,CAAA;IAChB,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAC5B;AAED,wDAAwD;AACxD,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,OAAO,GAAG,eAAe,CAAA;AAElE,8CAA8C;AAC9C,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAI3D,CAAA;AAED,MAAM,WAAW,YAAY;IACzB,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,EAAE,MAAM,CAAA;IACxB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,OAAO;IACpB,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,aAAa;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACvC,YAAY,EAAE,YAAY,CAAA;IAC1B,MAAM,CAAC,EAAE,WAAW,CAAA;CACvB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../lib/fetch-wrapper/types.ts"],"names":[],"mappings":"AAiDA,8CAA8C;AAC9C,MAAM,CAAC,MAAM,mBAAmB,GAAgC;IAC5D,UAAU,EAAE,eAAe;IAC3B,KAAK,EAAE,eAAe;IACtB,aAAa,EAAE,eAAe;CACjC,CAAA"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { tool } from "@opencode-ai/plugin";
|
|
2
|
-
import type { PluginState } from "./state";
|
|
3
|
-
import type { PluginConfig } from "./config";
|
|
4
|
-
import type { ToolTracker } from "./fetch-wrapper/tool-tracker";
|
|
5
|
-
import { type NotificationContext } from "./ui/notification";
|
|
6
|
-
import type { Logger } from "./logger";
|
|
7
|
-
export interface PruneToolContext {
|
|
8
|
-
client: any;
|
|
9
|
-
state: PluginState;
|
|
10
|
-
logger: Logger;
|
|
11
|
-
config: PluginConfig;
|
|
12
|
-
notificationCtx: NotificationContext;
|
|
13
|
-
workingDirectory?: string;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Creates the prune tool definition.
|
|
17
|
-
* Accepts numeric IDs from the <prunable-tools> list and prunes those tool outputs.
|
|
18
|
-
*/
|
|
19
|
-
export declare function createPruningTool(ctx: PruneToolContext, toolTracker: ToolTracker): ReturnType<typeof tool>;
|
|
20
|
-
//# sourceMappingURL=pruning-tool.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pruning-tool.d.ts","sourceRoot":"","sources":["../../lib/pruning-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAK/D,OAAO,EAA2B,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAIrF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAQtC,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,GAAG,CAAA;IACX,KAAK,EAAE,WAAW,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,YAAY,CAAA;IACpB,eAAe,EAAE,mBAAmB,CAAA;IACpC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC7B,GAAG,EAAE,gBAAgB,EACrB,WAAW,EAAE,WAAW,GACzB,UAAU,CAAC,OAAO,IAAI,CAAC,CAwHzB"}
|
package/dist/lib/pruning-tool.js
DELETED
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
import { tool } from "@opencode-ai/plugin";
|
|
2
|
-
import { resetToolTrackerCount } from "./fetch-wrapper/tool-tracker";
|
|
3
|
-
import { findCurrentAgent } from "./hooks";
|
|
4
|
-
import { getActualId } from "./state/id-mapping";
|
|
5
|
-
import { sendUnifiedNotification } from "./ui/notification";
|
|
6
|
-
import { formatPruningResultForTool } from "./ui/display-utils";
|
|
7
|
-
import { ensureSessionRestored } from "./state";
|
|
8
|
-
import { saveSessionState } from "./state/persistence";
|
|
9
|
-
import { estimateTokensBatch } from "./tokenizer";
|
|
10
|
-
import { loadPrompt } from "./core/prompt";
|
|
11
|
-
/** Tool description loaded from prompts/tool.txt */
|
|
12
|
-
const TOOL_DESCRIPTION = loadPrompt("tool");
|
|
13
|
-
/**
|
|
14
|
-
* Creates the prune tool definition.
|
|
15
|
-
* Accepts numeric IDs from the <prunable-tools> list and prunes those tool outputs.
|
|
16
|
-
*/
|
|
17
|
-
export function createPruningTool(ctx, toolTracker) {
|
|
18
|
-
return tool({
|
|
19
|
-
description: TOOL_DESCRIPTION,
|
|
20
|
-
args: {
|
|
21
|
-
ids: tool.schema.array(tool.schema.union([
|
|
22
|
-
tool.schema.enum(["completion", "noise", "consolidation"]),
|
|
23
|
-
tool.schema.number()
|
|
24
|
-
])).describe("First element is the reason ('completion', 'noise', 'consolidation'), followed by numeric IDs to prune"),
|
|
25
|
-
},
|
|
26
|
-
async execute(args, toolCtx) {
|
|
27
|
-
const { client, state, logger, config, notificationCtx } = ctx;
|
|
28
|
-
const sessionId = toolCtx.sessionID;
|
|
29
|
-
if (!args.ids || args.ids.length === 0) {
|
|
30
|
-
return "No IDs provided. Check the <prunable-tools> list for available IDs to prune.";
|
|
31
|
-
}
|
|
32
|
-
// Parse reason from first element, numeric IDs from the rest
|
|
33
|
-
const firstElement = args.ids[0];
|
|
34
|
-
const validReasons = ["completion", "noise", "consolidation"];
|
|
35
|
-
let reason;
|
|
36
|
-
let numericIds;
|
|
37
|
-
if (typeof firstElement === "string" && validReasons.includes(firstElement)) {
|
|
38
|
-
reason = firstElement;
|
|
39
|
-
numericIds = args.ids.slice(1).filter((id) => typeof id === "number");
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
numericIds = args.ids.filter((id) => typeof id === "number");
|
|
43
|
-
}
|
|
44
|
-
if (numericIds.length === 0) {
|
|
45
|
-
return "No numeric IDs provided. Format: [reason, id1, id2, ...] where reason is 'completion', 'noise', or 'consolidation'.";
|
|
46
|
-
}
|
|
47
|
-
await ensureSessionRestored(state, sessionId, logger);
|
|
48
|
-
const prunedIds = numericIds
|
|
49
|
-
.map(numId => getActualId(sessionId, numId))
|
|
50
|
-
.filter((id) => id !== undefined);
|
|
51
|
-
if (prunedIds.length === 0) {
|
|
52
|
-
return "None of the provided IDs were valid. Check the <prunable-tools> list for available IDs.";
|
|
53
|
-
}
|
|
54
|
-
// Fetch messages to calculate tokens and find current agent
|
|
55
|
-
const messagesResponse = await client.session.messages({
|
|
56
|
-
path: { id: sessionId },
|
|
57
|
-
query: { limit: 200 }
|
|
58
|
-
});
|
|
59
|
-
const messages = messagesResponse.data || messagesResponse;
|
|
60
|
-
const currentAgent = findCurrentAgent(messages);
|
|
61
|
-
const tokensSaved = await calculateTokensSavedFromMessages(messages, prunedIds);
|
|
62
|
-
const currentStats = state.stats.get(sessionId) ?? {
|
|
63
|
-
totalToolsPruned: 0,
|
|
64
|
-
totalTokensSaved: 0,
|
|
65
|
-
totalGCTokens: 0,
|
|
66
|
-
totalGCTools: 0
|
|
67
|
-
};
|
|
68
|
-
const sessionStats = {
|
|
69
|
-
...currentStats,
|
|
70
|
-
totalToolsPruned: currentStats.totalToolsPruned + prunedIds.length,
|
|
71
|
-
totalTokensSaved: currentStats.totalTokensSaved + tokensSaved
|
|
72
|
-
};
|
|
73
|
-
state.stats.set(sessionId, sessionStats);
|
|
74
|
-
const alreadyPrunedIds = state.prunedIds.get(sessionId) ?? [];
|
|
75
|
-
const allPrunedIds = [...alreadyPrunedIds, ...prunedIds];
|
|
76
|
-
state.prunedIds.set(sessionId, allPrunedIds);
|
|
77
|
-
saveSessionState(sessionId, new Set(allPrunedIds), sessionStats, logger)
|
|
78
|
-
.catch(err => logger.error("prune-tool", "Failed to persist state", { error: err.message }));
|
|
79
|
-
const toolMetadata = new Map();
|
|
80
|
-
for (const id of prunedIds) {
|
|
81
|
-
const meta = state.toolParameters.get(id.toLowerCase());
|
|
82
|
-
if (meta) {
|
|
83
|
-
toolMetadata.set(id.toLowerCase(), meta);
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
logger.debug("prune-tool", "No metadata found for ID", {
|
|
87
|
-
id,
|
|
88
|
-
idLower: id.toLowerCase(),
|
|
89
|
-
hasLower: state.toolParameters.has(id.toLowerCase())
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
await sendUnifiedNotification(notificationCtx, sessionId, {
|
|
94
|
-
aiPrunedCount: prunedIds.length,
|
|
95
|
-
aiTokensSaved: tokensSaved,
|
|
96
|
-
aiPrunedIds: prunedIds,
|
|
97
|
-
toolMetadata,
|
|
98
|
-
gcPending: null,
|
|
99
|
-
sessionStats,
|
|
100
|
-
reason
|
|
101
|
-
}, currentAgent);
|
|
102
|
-
toolTracker.skipNextIdle = true;
|
|
103
|
-
if (config.nudge_freq > 0) {
|
|
104
|
-
resetToolTrackerCount(toolTracker);
|
|
105
|
-
}
|
|
106
|
-
const result = {
|
|
107
|
-
prunedCount: prunedIds.length,
|
|
108
|
-
tokensSaved,
|
|
109
|
-
llmPrunedIds: prunedIds,
|
|
110
|
-
toolMetadata,
|
|
111
|
-
sessionStats,
|
|
112
|
-
reason
|
|
113
|
-
};
|
|
114
|
-
return formatPruningResultForTool(result, ctx.workingDirectory);
|
|
115
|
-
},
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Calculates approximate tokens saved by pruning the given tool call IDs.
|
|
120
|
-
* Uses pre-fetched messages to avoid duplicate API calls.
|
|
121
|
-
*/
|
|
122
|
-
async function calculateTokensSavedFromMessages(messages, prunedIds) {
|
|
123
|
-
try {
|
|
124
|
-
const toolOutputs = new Map();
|
|
125
|
-
for (const msg of messages) {
|
|
126
|
-
if (msg.role === 'tool' && msg.tool_call_id) {
|
|
127
|
-
const content = typeof msg.content === 'string'
|
|
128
|
-
? msg.content
|
|
129
|
-
: JSON.stringify(msg.content);
|
|
130
|
-
toolOutputs.set(msg.tool_call_id.toLowerCase(), content);
|
|
131
|
-
}
|
|
132
|
-
if (msg.role === 'user' && Array.isArray(msg.content)) {
|
|
133
|
-
for (const part of msg.content) {
|
|
134
|
-
if (part.type === 'tool_result' && part.tool_use_id) {
|
|
135
|
-
const content = typeof part.content === 'string'
|
|
136
|
-
? part.content
|
|
137
|
-
: JSON.stringify(part.content);
|
|
138
|
-
toolOutputs.set(part.tool_use_id.toLowerCase(), content);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
const contents = [];
|
|
144
|
-
for (const id of prunedIds) {
|
|
145
|
-
const content = toolOutputs.get(id.toLowerCase());
|
|
146
|
-
if (content) {
|
|
147
|
-
contents.push(content);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
if (contents.length === 0) {
|
|
151
|
-
return prunedIds.length * 500;
|
|
152
|
-
}
|
|
153
|
-
const tokenCounts = await estimateTokensBatch(contents);
|
|
154
|
-
return tokenCounts.reduce((sum, count) => sum + count, 0);
|
|
155
|
-
}
|
|
156
|
-
catch (error) {
|
|
157
|
-
return prunedIds.length * 500;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
//# sourceMappingURL=pruning-tool.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pruning-tool.js","sourceRoot":"","sources":["../../lib/pruning-tool.ts"],"names":[],"mappings":"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"}
|