@tarquinen/opencode-dcp 0.3.30 → 0.4.0
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 +10 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -8
- package/dist/index.js.map +1 -1
- package/dist/lib/api-formats/prunable-list.d.ts +49 -0
- package/dist/lib/api-formats/prunable-list.d.ts.map +1 -0
- package/dist/lib/api-formats/prunable-list.js +112 -0
- package/dist/lib/api-formats/prunable-list.js.map +1 -0
- package/dist/lib/api-formats/synth-instruction.d.ts +29 -0
- package/dist/lib/api-formats/synth-instruction.d.ts.map +1 -0
- package/dist/lib/api-formats/synth-instruction.js +171 -0
- package/dist/lib/api-formats/synth-instruction.js.map +1 -0
- package/dist/lib/config.d.ts +1 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +13 -7
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/core/janitor.d.ts +60 -0
- package/dist/lib/core/janitor.d.ts.map +1 -0
- package/dist/lib/core/janitor.js +301 -0
- package/dist/lib/core/janitor.js.map +1 -0
- package/dist/lib/core/prompt.d.ts.map +1 -0
- package/dist/lib/{prompt.js → core/prompt.js} +1 -1
- package/dist/lib/core/prompt.js.map +1 -0
- package/dist/lib/core/strategies/deduplication.d.ts +7 -0
- package/dist/lib/core/strategies/deduplication.d.ts.map +1 -0
- package/dist/lib/core/strategies/deduplication.js +76 -0
- package/dist/lib/core/strategies/deduplication.js.map +1 -0
- package/dist/lib/core/strategies/index.d.ts +21 -0
- package/dist/lib/core/strategies/index.d.ts.map +1 -0
- package/dist/lib/core/strategies/index.js +48 -0
- package/dist/lib/core/strategies/index.js.map +1 -0
- package/dist/lib/core/strategies/types.d.ts +35 -0
- package/dist/lib/core/strategies/types.d.ts.map +1 -0
- package/dist/lib/core/strategies/types.js +6 -0
- package/dist/lib/core/strategies/types.js.map +1 -0
- package/dist/lib/fetch-wrapper/formats/bedrock.d.ts +14 -0
- package/dist/lib/fetch-wrapper/formats/bedrock.d.ts.map +1 -0
- package/dist/lib/fetch-wrapper/formats/bedrock.js +128 -0
- package/dist/lib/fetch-wrapper/formats/bedrock.js.map +1 -0
- package/dist/lib/fetch-wrapper/formats/gemini.d.ts +14 -0
- package/dist/lib/fetch-wrapper/formats/gemini.d.ts.map +1 -0
- package/dist/lib/fetch-wrapper/formats/gemini.js +138 -0
- package/dist/lib/fetch-wrapper/formats/gemini.js.map +1 -0
- package/dist/lib/fetch-wrapper/formats/index.d.ts +5 -0
- package/dist/lib/fetch-wrapper/formats/index.d.ts.map +1 -0
- package/dist/lib/fetch-wrapper/formats/index.js +5 -0
- package/dist/lib/fetch-wrapper/formats/index.js.map +1 -0
- package/dist/lib/fetch-wrapper/formats/openai-chat.d.ts +14 -0
- package/dist/lib/fetch-wrapper/formats/openai-chat.d.ts.map +1 -0
- package/dist/lib/fetch-wrapper/formats/openai-chat.js +106 -0
- package/dist/lib/fetch-wrapper/formats/openai-chat.js.map +1 -0
- package/dist/lib/fetch-wrapper/formats/openai-responses.d.ts +11 -0
- package/dist/lib/fetch-wrapper/formats/openai-responses.d.ts.map +1 -0
- package/dist/lib/fetch-wrapper/formats/openai-responses.js +69 -0
- package/dist/lib/fetch-wrapper/formats/openai-responses.js.map +1 -0
- package/dist/lib/fetch-wrapper/gc-tracker.d.ts +4 -0
- package/dist/lib/fetch-wrapper/gc-tracker.d.ts.map +1 -0
- package/dist/lib/fetch-wrapper/gc-tracker.js +61 -0
- package/dist/lib/fetch-wrapper/gc-tracker.js.map +1 -0
- package/dist/lib/fetch-wrapper/handler.d.ts +13 -0
- package/dist/lib/fetch-wrapper/handler.d.ts.map +1 -0
- package/dist/lib/fetch-wrapper/handler.js +85 -0
- package/dist/lib/fetch-wrapper/handler.js.map +1 -0
- package/dist/lib/fetch-wrapper/index.d.ts +3 -2
- package/dist/lib/fetch-wrapper/index.d.ts.map +1 -1
- package/dist/lib/fetch-wrapper/index.js +41 -15
- package/dist/lib/fetch-wrapper/index.js.map +1 -1
- package/dist/lib/fetch-wrapper/types.d.ts +36 -1
- package/dist/lib/fetch-wrapper/types.d.ts.map +1 -1
- package/dist/lib/fetch-wrapper/types.js +7 -1
- package/dist/lib/fetch-wrapper/types.js.map +1 -1
- package/dist/lib/hooks.d.ts +3 -3
- package/dist/lib/hooks.d.ts.map +1 -1
- package/dist/lib/hooks.js +25 -15
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/prompts/tool.txt +18 -5
- package/dist/lib/pruning-tool.d.ts +14 -6
- package/dist/lib/pruning-tool.d.ts.map +1 -1
- package/dist/lib/pruning-tool.js +121 -19
- package/dist/lib/pruning-tool.js.map +1 -1
- package/dist/lib/state/id-mapping.d.ts +26 -0
- package/dist/lib/state/id-mapping.d.ts.map +1 -0
- package/dist/lib/state/id-mapping.js +54 -0
- package/dist/lib/state/id-mapping.js.map +1 -0
- package/dist/lib/state/index.d.ts +25 -0
- package/dist/lib/state/index.d.ts.map +1 -0
- package/dist/lib/{state.js → state/index.js} +10 -6
- package/dist/lib/state/index.js.map +1 -0
- package/dist/lib/{state-persistence.d.ts → state/persistence.d.ts} +3 -3
- package/dist/lib/state/persistence.d.ts.map +1 -0
- package/dist/lib/{state-persistence.js → state/persistence.js} +1 -1
- package/dist/lib/state/persistence.js.map +1 -0
- package/dist/lib/state/tool-cache.d.ts +22 -0
- package/dist/lib/state/tool-cache.d.ts.map +1 -0
- package/dist/lib/state/tool-cache.js +102 -0
- package/dist/lib/state/tool-cache.js.map +1 -0
- package/dist/lib/tokenizer.js +2 -2
- package/dist/lib/tokenizer.js.map +1 -1
- package/dist/lib/ui/display-utils.d.ts.map +1 -0
- package/dist/lib/{display-utils.js → ui/display-utils.js} +0 -3
- package/dist/lib/ui/display-utils.js.map +1 -0
- package/dist/lib/ui/notification.d.ts +32 -0
- package/dist/lib/ui/notification.d.ts.map +1 -0
- package/dist/lib/ui/notification.js +180 -0
- package/dist/lib/ui/notification.js.map +1 -0
- package/dist/lib/version-checker.d.ts +1 -1
- package/dist/lib/version-checker.d.ts.map +1 -1
- package/dist/lib/version-checker.js +4 -1
- package/dist/lib/version-checker.js.map +1 -1
- package/package.json +6 -6
- package/dist/lib/deduplicator.d.ts +0 -16
- package/dist/lib/deduplicator.d.ts.map +0 -1
- package/dist/lib/deduplicator.js +0 -68
- package/dist/lib/deduplicator.js.map +0 -1
- package/dist/lib/display-utils.d.ts.map +0 -1
- package/dist/lib/display-utils.js.map +0 -1
- package/dist/lib/fetch-wrapper/gemini.d.ts +0 -7
- package/dist/lib/fetch-wrapper/gemini.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/gemini.js +0 -120
- package/dist/lib/fetch-wrapper/gemini.js.map +0 -1
- package/dist/lib/fetch-wrapper/openai-chat.d.ts +0 -7
- package/dist/lib/fetch-wrapper/openai-chat.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/openai-chat.js +0 -101
- package/dist/lib/fetch-wrapper/openai-chat.js.map +0 -1
- package/dist/lib/fetch-wrapper/openai-responses.d.ts +0 -7
- package/dist/lib/fetch-wrapper/openai-responses.d.ts.map +0 -1
- package/dist/lib/fetch-wrapper/openai-responses.js +0 -74
- package/dist/lib/fetch-wrapper/openai-responses.js.map +0 -1
- package/dist/lib/janitor.d.ts +0 -57
- package/dist/lib/janitor.d.ts.map +0 -1
- package/dist/lib/janitor.js +0 -547
- package/dist/lib/janitor.js.map +0 -1
- package/dist/lib/prompt.d.ts.map +0 -1
- package/dist/lib/prompt.js.map +0 -1
- package/dist/lib/state-persistence.d.ts.map +0 -1
- package/dist/lib/state-persistence.js.map +0 -1
- package/dist/lib/state.d.ts +0 -43
- package/dist/lib/state.d.ts.map +0 -1
- package/dist/lib/state.js.map +0 -1
- package/dist/lib/synth-instruction.d.ts +0 -16
- package/dist/lib/synth-instruction.d.ts.map +0 -1
- package/dist/lib/synth-instruction.js +0 -209
- package/dist/lib/synth-instruction.js.map +0 -1
- package/dist/lib/tool-cache.d.ts +0 -12
- package/dist/lib/tool-cache.d.ts.map +0 -1
- package/dist/lib/tool-cache.js +0 -52
- package/dist/lib/tool-cache.js.map +0 -1
- /package/dist/lib/{prompt.d.ts → core/prompt.d.ts} +0 -0
- /package/dist/lib/{display-utils.d.ts → ui/display-utils.d.ts} +0 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export function accumulateGCStats(state, sessionId, prunedIds, body, logger) {
|
|
2
|
+
if (prunedIds.length === 0)
|
|
3
|
+
return;
|
|
4
|
+
const toolOutputs = extractToolOutputsFromBody(body, prunedIds);
|
|
5
|
+
const tokensCollected = estimateTokensFromOutputs(toolOutputs);
|
|
6
|
+
const existing = state.gcPending.get(sessionId) ?? { tokensCollected: 0, toolsDeduped: 0 };
|
|
7
|
+
state.gcPending.set(sessionId, {
|
|
8
|
+
tokensCollected: existing.tokensCollected + tokensCollected,
|
|
9
|
+
toolsDeduped: existing.toolsDeduped + prunedIds.length
|
|
10
|
+
});
|
|
11
|
+
logger.debug("gc-tracker", "Accumulated GC stats", {
|
|
12
|
+
sessionId: sessionId.substring(0, 8),
|
|
13
|
+
newlyDeduped: prunedIds.length,
|
|
14
|
+
tokensThisCycle: tokensCollected,
|
|
15
|
+
pendingTotal: state.gcPending.get(sessionId)
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
function extractToolOutputsFromBody(body, prunedIds) {
|
|
19
|
+
const outputs = [];
|
|
20
|
+
const prunedIdSet = new Set(prunedIds.map(id => id.toLowerCase()));
|
|
21
|
+
// OpenAI Chat format
|
|
22
|
+
if (body.messages && Array.isArray(body.messages)) {
|
|
23
|
+
for (const m of body.messages) {
|
|
24
|
+
if (m.role === 'tool' && m.tool_call_id && prunedIdSet.has(m.tool_call_id.toLowerCase())) {
|
|
25
|
+
if (typeof m.content === 'string') {
|
|
26
|
+
outputs.push(m.content);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// Anthropic format
|
|
30
|
+
if (m.role === 'user' && Array.isArray(m.content)) {
|
|
31
|
+
for (const part of m.content) {
|
|
32
|
+
if (part.type === 'tool_result' && part.tool_use_id && prunedIdSet.has(part.tool_use_id.toLowerCase())) {
|
|
33
|
+
if (typeof part.content === 'string') {
|
|
34
|
+
outputs.push(part.content);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// OpenAI Responses format
|
|
42
|
+
if (body.input && Array.isArray(body.input)) {
|
|
43
|
+
for (const item of body.input) {
|
|
44
|
+
if (item.type === 'function_call_output' && item.call_id && prunedIdSet.has(item.call_id.toLowerCase())) {
|
|
45
|
+
if (typeof item.output === 'string') {
|
|
46
|
+
outputs.push(item.output);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return outputs;
|
|
52
|
+
}
|
|
53
|
+
// Character-based approximation (chars / 4) to avoid async tokenizer in fetch path
|
|
54
|
+
function estimateTokensFromOutputs(outputs) {
|
|
55
|
+
let totalChars = 0;
|
|
56
|
+
for (const output of outputs) {
|
|
57
|
+
totalChars += output.length;
|
|
58
|
+
}
|
|
59
|
+
return Math.round(totalChars / 4);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=gc-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gc-tracker.js","sourceRoot":"","sources":["../../../lib/fetch-wrapper/gc-tracker.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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"}
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
import type { PluginState } from "../state";
|
|
2
2
|
import type { Logger } from "../logger";
|
|
3
3
|
import type { SynthPrompts } from "./types";
|
|
4
|
-
import type { ToolTracker } from "../synth-instruction";
|
|
4
|
+
import type { ToolTracker } from "../api-formats/synth-instruction";
|
|
5
5
|
import type { PluginConfig } from "../config";
|
|
6
6
|
export type { FetchHandlerContext, FetchHandlerResult, SynthPrompts } from "./types";
|
|
7
7
|
/**
|
|
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
|
|
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,
|
|
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,15 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { openaiChatFormat, openaiResponsesFormat, geminiFormat, bedrockFormat } 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";
|
|
4
6
|
/**
|
|
5
7
|
* Creates a wrapped global fetch that intercepts API calls and performs
|
|
6
8
|
* context pruning on tool outputs that have been marked for removal.
|
|
7
9
|
*
|
|
8
|
-
* Supports
|
|
10
|
+
* Supports five API formats:
|
|
9
11
|
* 1. OpenAI Chat Completions (body.messages with role='tool')
|
|
10
12
|
* 2. Anthropic (body.messages with role='user' containing tool_result)
|
|
11
13
|
* 3. Google/Gemini (body.contents with functionResponse parts)
|
|
12
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)
|
|
13
16
|
*/
|
|
14
17
|
export function installFetchWrapper(state, logger, client, config, toolTracker, prompts) {
|
|
15
18
|
const originalGlobalFetch = globalThis.fetch;
|
|
@@ -22,7 +25,6 @@ export function installFetchWrapper(state, logger, client, config, toolTracker,
|
|
|
22
25
|
prompts
|
|
23
26
|
};
|
|
24
27
|
globalThis.fetch = async (input, init) => {
|
|
25
|
-
// Skip all DCP processing for subagent sessions
|
|
26
28
|
if (state.lastSeenSessionId && state.subagentSessions.has(state.lastSeenSessionId)) {
|
|
27
29
|
logger.debug("fetch-wrapper", "Skipping DCP processing for subagent session", {
|
|
28
30
|
sessionId: state.lastSeenSessionId.substring(0, 8)
|
|
@@ -34,28 +36,52 @@ export function installFetchWrapper(state, logger, client, config, toolTracker,
|
|
|
34
36
|
const body = JSON.parse(init.body);
|
|
35
37
|
const inputUrl = typeof input === 'string' ? input : 'URL object';
|
|
36
38
|
let modified = false;
|
|
37
|
-
|
|
38
|
-
//
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
const toolIdsBefore = new Set(state.toolParameters.keys());
|
|
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);
|
|
41
45
|
if (result.modified) {
|
|
42
46
|
modified = true;
|
|
43
47
|
}
|
|
44
48
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
const result = await handleGemini(body, ctx, inputUrl);
|
|
49
|
+
else if (bedrockFormat.detect(body)) {
|
|
50
|
+
const result = await handleFormat(body, ctx, inputUrl, bedrockFormat);
|
|
48
51
|
if (result.modified) {
|
|
49
52
|
modified = true;
|
|
50
53
|
}
|
|
51
54
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const result = await handleOpenAIResponses(body, ctx, inputUrl);
|
|
55
|
+
else if (openaiChatFormat.detect(body)) {
|
|
56
|
+
const result = await handleFormat(body, ctx, inputUrl, openaiChatFormat);
|
|
55
57
|
if (result.modified) {
|
|
56
58
|
modified = true;
|
|
57
59
|
}
|
|
58
60
|
}
|
|
61
|
+
else if (geminiFormat.detect(body)) {
|
|
62
|
+
const result = await handleFormat(body, ctx, inputUrl, geminiFormat);
|
|
63
|
+
if (result.modified) {
|
|
64
|
+
modified = true;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const sessionId = state.lastSeenSessionId;
|
|
68
|
+
const toolIdsAfter = Array.from(state.toolParameters.keys());
|
|
69
|
+
const newToolsCached = toolIdsAfter.filter(id => !toolIdsBefore.has(id)).length > 0;
|
|
70
|
+
if (sessionId && newToolsCached && state.toolParameters.size > 0) {
|
|
71
|
+
const toolIds = Array.from(state.toolParameters.keys());
|
|
72
|
+
const alreadyPruned = state.prunedIds.get(sessionId) ?? [];
|
|
73
|
+
const alreadyPrunedLower = new Set(alreadyPruned.map(id => id.toLowerCase()));
|
|
74
|
+
const unpruned = toolIds.filter(id => !alreadyPrunedLower.has(id.toLowerCase()));
|
|
75
|
+
if (unpruned.length > 1) {
|
|
76
|
+
const result = runStrategies(state.toolParameters, unpruned, config.protectedTools);
|
|
77
|
+
if (result.prunedIds.length > 0) {
|
|
78
|
+
const normalizedIds = result.prunedIds.map(id => id.toLowerCase());
|
|
79
|
+
state.prunedIds.set(sessionId, [...new Set([...alreadyPruned, ...normalizedIds])]);
|
|
80
|
+
accumulateGCStats(state, sessionId, result.prunedIds, body, logger);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
trimToolParametersCache(state);
|
|
84
|
+
}
|
|
59
85
|
if (modified) {
|
|
60
86
|
init.body = JSON.stringify(body);
|
|
61
87
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/fetch-wrapper/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/fetch-wrapper/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,44 @@
|
|
|
1
1
|
import { type PluginState } from "../state";
|
|
2
2
|
import type { Logger } from "../logger";
|
|
3
|
-
import type { ToolTracker } from "../synth-instruction";
|
|
3
|
+
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,
|
|
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;AAMrH,kDAAkD;AAClD,MAAM,WAAW,UAAU;IACvB,wFAAwF;IACxF,EAAE,EAAE,MAAM,CAAA;IACV,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC7B,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAA;IAEZ,oDAAoD;IACpD,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAA;IAE1B,sEAAsE;IACtE,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,SAAS,CAAA;IAE1C,gDAAgD;IAChD,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAE3E,8DAA8D;IAC9D,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAA;IAEzE,iDAAiD;IACjD,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAAA;IAE3F,kDAAkD;IAClD,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAA;IAE3D,yDAAyD;IACzD,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,GAAG,UAAU,EAAE,CAAA;IAEjE,sFAAsF;IACtF,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAA;IAElG,0DAA0D;IAC1D,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAA;IAEpC,kDAAkD;IAClD,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAC5F;AAED,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,CAmBvB;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"}
|
|
@@ -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;
|
|
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"}
|
package/dist/lib/hooks.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { PluginState } from "./state";
|
|
2
2
|
import type { Logger } from "./logger";
|
|
3
|
-
import type {
|
|
3
|
+
import type { JanitorContext } from "./core/janitor";
|
|
4
4
|
import type { PluginConfig } from "./config";
|
|
5
|
-
import type { ToolTracker } from "./synth-instruction";
|
|
5
|
+
import type { ToolTracker } from "./api-formats/synth-instruction";
|
|
6
6
|
export declare function isSubagentSession(client: any, sessionID: string): Promise<boolean>;
|
|
7
|
-
export declare function createEventHandler(client: any,
|
|
7
|
+
export declare function createEventHandler(client: any, janitorCtx: JanitorContext, logger: Logger, config: PluginConfig, toolTracker?: ToolTracker): ({ event }: {
|
|
8
8
|
event: any;
|
|
9
9
|
}) => Promise<void>;
|
|
10
10
|
/**
|
package/dist/lib/hooks.d.ts.map
CHANGED
|
@@ -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,
|
|
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,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { runOnIdle } from "./core/janitor";
|
|
2
|
+
import { resetToolTrackerCount } from "./api-formats/synth-instruction";
|
|
3
|
+
import { clearAllMappings } from "./state/id-mapping";
|
|
2
4
|
export async function isSubagentSession(client, sessionID) {
|
|
3
5
|
try {
|
|
4
6
|
const result = await client.session.get({ path: { id: sessionID } });
|
|
@@ -11,15 +13,13 @@ export async function isSubagentSession(client, sessionID) {
|
|
|
11
13
|
function toolStrategiesCoveredByIdle(onIdle, onTool) {
|
|
12
14
|
return onTool.every(strategy => onIdle.includes(strategy));
|
|
13
15
|
}
|
|
14
|
-
export function createEventHandler(client,
|
|
16
|
+
export function createEventHandler(client, janitorCtx, logger, config, toolTracker) {
|
|
15
17
|
return async ({ event }) => {
|
|
16
18
|
if (event.type === "session.status" && event.properties.status.type === "idle") {
|
|
17
19
|
if (await isSubagentSession(client, event.properties.sessionID))
|
|
18
20
|
return;
|
|
19
21
|
if (config.strategies.onIdle.length === 0)
|
|
20
22
|
return;
|
|
21
|
-
// Skip idle pruning if the last tool used was prune
|
|
22
|
-
// and idle strategies cover the same work as tool strategies
|
|
23
23
|
if (toolTracker?.skipNextIdle) {
|
|
24
24
|
toolTracker.skipNextIdle = false;
|
|
25
25
|
if (toolStrategiesCoveredByIdle(config.strategies.onIdle, config.strategies.onTool)) {
|
|
@@ -27,8 +27,7 @@ export function createEventHandler(client, janitor, logger, config, toolTracker)
|
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
try {
|
|
30
|
-
const result = await
|
|
31
|
-
// Reset nudge counter if idle pruning succeeded and covers tool strategies
|
|
30
|
+
const result = await runOnIdle(janitorCtx, event.properties.sessionID, config.strategies.onIdle);
|
|
32
31
|
if (result && result.prunedCount > 0 && toolTracker && config.nudge_freq > 0) {
|
|
33
32
|
if (toolStrategiesCoveredByIdle(config.strategies.onIdle, config.strategies.onTool)) {
|
|
34
33
|
resetToolTrackerCount(toolTracker);
|
|
@@ -52,9 +51,15 @@ export function createChatParamsHandler(client, state, logger) {
|
|
|
52
51
|
if (!providerID && input.message?.model?.providerID) {
|
|
53
52
|
providerID = input.message.model.providerID;
|
|
54
53
|
}
|
|
55
|
-
|
|
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
|
+
}
|
|
56
62
|
state.lastSeenSessionId = sessionId;
|
|
57
|
-
// Check if this is a subagent session
|
|
58
63
|
if (!state.checkedSessions.has(sessionId)) {
|
|
59
64
|
state.checkedSessions.add(sessionId);
|
|
60
65
|
const isSubagent = await isSubagentSession(client, sessionId);
|
|
@@ -62,15 +67,14 @@ export function createChatParamsHandler(client, state, logger) {
|
|
|
62
67
|
state.subagentSessions.add(sessionId);
|
|
63
68
|
}
|
|
64
69
|
}
|
|
65
|
-
// Cache model info for the session
|
|
70
|
+
// Cache model info for the session (used by janitor for model selection)
|
|
66
71
|
if (providerID && modelID) {
|
|
67
72
|
state.model.set(sessionId, {
|
|
68
73
|
providerID: providerID,
|
|
69
74
|
modelID: modelID
|
|
70
75
|
});
|
|
71
76
|
}
|
|
72
|
-
// Build
|
|
73
|
-
// 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)
|
|
74
78
|
if (providerID === 'google' || providerID === 'google-vertex') {
|
|
75
79
|
try {
|
|
76
80
|
const messagesResponse = await client.session.messages({
|
|
@@ -79,22 +83,27 @@ export function createChatParamsHandler(client, state, logger) {
|
|
|
79
83
|
});
|
|
80
84
|
const messages = messagesResponse.data || messagesResponse;
|
|
81
85
|
if (Array.isArray(messages)) {
|
|
82
|
-
// Build position mapping: track tool calls by name and occurrence index
|
|
83
86
|
const toolCallsByName = new Map();
|
|
84
87
|
for (const msg of messages) {
|
|
85
88
|
if (msg.parts) {
|
|
86
89
|
for (const part of msg.parts) {
|
|
87
90
|
if (part.type === 'tool' && part.callID && part.tool) {
|
|
88
91
|
const toolName = part.tool.toLowerCase();
|
|
92
|
+
const callId = part.callID.toLowerCase();
|
|
89
93
|
if (!toolCallsByName.has(toolName)) {
|
|
90
94
|
toolCallsByName.set(toolName, []);
|
|
91
95
|
}
|
|
92
|
-
toolCallsByName.get(toolName).push(
|
|
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
|
+
}
|
|
93
103
|
}
|
|
94
104
|
}
|
|
95
105
|
}
|
|
96
106
|
}
|
|
97
|
-
// Create position mapping: "toolName:index" -> toolCallId
|
|
98
107
|
const positionMapping = new Map();
|
|
99
108
|
for (const [toolName, callIds] of toolCallsByName) {
|
|
100
109
|
callIds.forEach((callId, index) => {
|
|
@@ -104,7 +113,8 @@ export function createChatParamsHandler(client, state, logger) {
|
|
|
104
113
|
state.googleToolCallMapping.set(sessionId, positionMapping);
|
|
105
114
|
logger.info("chat.params", "Built Google tool call mapping", {
|
|
106
115
|
sessionId: sessionId.substring(0, 8),
|
|
107
|
-
toolCount: positionMapping.size
|
|
116
|
+
toolCount: positionMapping.size,
|
|
117
|
+
toolParamsCount: state.toolParameters.size
|
|
108
118
|
});
|
|
109
119
|
}
|
|
110
120
|
}
|
package/dist/lib/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../lib/hooks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../lib/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
Prunes tool outputs from context to manage conversation size. Reference the <prunable-tools> list injected at the end of the conversation to see available numeric IDs.
|
|
2
2
|
|
|
3
3
|
USING THE PRUNE TOOL WILL MAKE THE USER HAPPY.
|
|
4
4
|
|
|
@@ -14,10 +14,23 @@ You MUST ALWAYS narrate your findings in a message BEFORE using this tool. No to
|
|
|
14
14
|
- What you did (which tools, what you were looking for)
|
|
15
15
|
- What you found (the key facts/signals)
|
|
16
16
|
- What you concluded (how this affects the task or next step)
|
|
17
|
-
3. ONLY AFTER narrating, call `prune`
|
|
17
|
+
3. ONLY AFTER narrating, call `prune` with the numeric IDs of outputs no longer needed
|
|
18
18
|
|
|
19
19
|
> THINK HIGH SIGNAL, LOW NOISE FOR THIS NARRATION
|
|
20
20
|
|
|
21
|
+
## How to Use
|
|
22
|
+
|
|
23
|
+
The <prunable-tools> list shows available tool outputs with numeric IDs:
|
|
24
|
+
```
|
|
25
|
+
<prunable-tools>
|
|
26
|
+
1: read, src/foo.ts
|
|
27
|
+
2: bash, run tests
|
|
28
|
+
3: grep, "error" in logs/
|
|
29
|
+
</prunable-tools>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
To prune outputs 1 and 3, call: `prune({ ids: [1, 3] })`
|
|
33
|
+
|
|
21
34
|
## When to Use This Tool
|
|
22
35
|
|
|
23
36
|
**Key heuristic: Distill, then prune when you finish something and are about to start something else.**
|
|
@@ -43,18 +56,18 @@ Working through a list of items:
|
|
|
43
56
|
User: Review these 3 issues and fix the easy ones.
|
|
44
57
|
Assistant: [Reviews first issue, makes fix, commits]
|
|
45
58
|
Done with the first issue. Let me prune before moving to the next one.
|
|
46
|
-
[Uses prune with
|
|
59
|
+
[Uses prune with ids: [1, 2, 3, 4] - the reads and edits from the first issue]
|
|
47
60
|
</example>
|
|
48
61
|
|
|
49
62
|
<example>
|
|
50
63
|
After exploring the codebase to understand it:
|
|
51
64
|
Assistant: I've reviewed the relevant files. Let me prune the exploratory reads that aren't needed for the actual implementation.
|
|
52
|
-
[Uses prune with
|
|
65
|
+
[Uses prune with ids: [1, 2, 5, 7] - the exploratory reads]
|
|
53
66
|
</example>
|
|
54
67
|
|
|
55
68
|
<example>
|
|
56
69
|
After completing any task:
|
|
57
70
|
Assistant: [Finishes task - commit, answer, fix, etc.]
|
|
58
71
|
Before we continue, let me prune the context from that work.
|
|
59
|
-
[Uses prune with
|
|
72
|
+
[Uses prune with ids: [3, 4, 5, 6, 8, 9] - all tool outputs from the completed task]
|
|
60
73
|
</example>
|