@tarquinen/opencode-dcp 0.4.2 → 0.4.12
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 +8 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -15
- package/dist/index.js.map +1 -1
- package/dist/lib/config.js +2 -2
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/core/janitor.d.ts +3 -25
- package/dist/lib/core/janitor.d.ts.map +1 -1
- package/dist/lib/core/janitor.js +2 -11
- package/dist/lib/core/janitor.js.map +1 -1
- package/dist/lib/core/strategies/deduplication.d.ts +1 -1
- package/dist/lib/core/strategies/index.d.ts +32 -2
- package/dist/lib/core/strategies/index.d.ts.map +1 -1
- package/dist/lib/core/strategies/index.js.map +1 -1
- package/dist/lib/fetch-wrapper/formats/anthropic.d.ts +8 -0
- package/dist/lib/fetch-wrapper/formats/anthropic.d.ts.map +1 -0
- package/dist/lib/fetch-wrapper/formats/anthropic.js +122 -0
- package/dist/lib/fetch-wrapper/formats/anthropic.js.map +1 -0
- package/dist/lib/fetch-wrapper/formats/bedrock.d.ts +3 -9
- package/dist/lib/fetch-wrapper/formats/bedrock.d.ts.map +1 -1
- package/dist/lib/fetch-wrapper/formats/bedrock.js +25 -45
- package/dist/lib/fetch-wrapper/formats/bedrock.js.map +1 -1
- package/dist/lib/fetch-wrapper/formats/gemini.d.ts +1 -7
- package/dist/lib/fetch-wrapper/formats/gemini.d.ts.map +1 -1
- package/dist/lib/fetch-wrapper/formats/gemini.js +30 -23
- package/dist/lib/fetch-wrapper/formats/gemini.js.map +1 -1
- package/dist/lib/fetch-wrapper/formats/index.d.ts +1 -0
- package/dist/lib/fetch-wrapper/formats/index.d.ts.map +1 -1
- package/dist/lib/fetch-wrapper/formats/index.js +1 -0
- package/dist/lib/fetch-wrapper/formats/index.js.map +1 -1
- package/dist/lib/fetch-wrapper/formats/openai-chat.d.ts +0 -11
- package/dist/lib/fetch-wrapper/formats/openai-chat.d.ts.map +1 -1
- package/dist/lib/fetch-wrapper/formats/openai-chat.js +33 -25
- package/dist/lib/fetch-wrapper/formats/openai-chat.js.map +1 -1
- package/dist/lib/fetch-wrapper/formats/openai-responses.d.ts +0 -8
- package/dist/lib/fetch-wrapper/formats/openai-responses.d.ts.map +1 -1
- package/dist/lib/fetch-wrapper/formats/openai-responses.js +29 -21
- package/dist/lib/fetch-wrapper/formats/openai-responses.js.map +1 -1
- package/dist/lib/fetch-wrapper/handler.d.ts +0 -10
- package/dist/lib/fetch-wrapper/handler.d.ts.map +1 -1
- package/dist/lib/fetch-wrapper/handler.js +74 -41
- package/dist/lib/fetch-wrapper/handler.js.map +1 -1
- package/dist/lib/fetch-wrapper/index.d.ts +4 -5
- package/dist/lib/fetch-wrapper/index.d.ts.map +1 -1
- package/dist/lib/fetch-wrapper/index.js +16 -7
- package/dist/lib/fetch-wrapper/index.js.map +1 -1
- package/dist/lib/fetch-wrapper/prunable-list.d.ts +8 -0
- package/dist/lib/fetch-wrapper/prunable-list.d.ts.map +1 -0
- package/dist/lib/fetch-wrapper/prunable-list.js +38 -0
- package/dist/lib/fetch-wrapper/prunable-list.js.map +1 -0
- package/dist/lib/fetch-wrapper/tool-tracker.d.ts +8 -0
- package/dist/lib/fetch-wrapper/tool-tracker.d.ts.map +1 -0
- package/dist/lib/fetch-wrapper/tool-tracker.js +7 -0
- package/dist/lib/fetch-wrapper/tool-tracker.js.map +1 -0
- package/dist/lib/fetch-wrapper/types.d.ts +31 -46
- package/dist/lib/fetch-wrapper/types.d.ts.map +1 -1
- package/dist/lib/fetch-wrapper/types.js +6 -44
- package/dist/lib/fetch-wrapper/types.js.map +1 -1
- package/dist/lib/hooks.d.ts +6 -2
- package/dist/lib/hooks.d.ts.map +1 -1
- package/dist/lib/hooks.js +21 -11
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/prompts/nudge.txt +8 -5
- package/dist/lib/prompts/synthetic.txt +18 -30
- package/dist/lib/prompts/tool.txt +46 -63
- package/dist/lib/pruning-tool.d.ts +1 -1
- package/dist/lib/pruning-tool.d.ts.map +1 -1
- package/dist/lib/pruning-tool.js +30 -23
- package/dist/lib/pruning-tool.js.map +1 -1
- package/dist/lib/state/id-mapping.d.ts +0 -1
- package/dist/lib/state/id-mapping.d.ts.map +1 -1
- package/dist/lib/state/id-mapping.js +0 -3
- package/dist/lib/state/id-mapping.js.map +1 -1
- package/dist/lib/state/index.d.ts +3 -0
- package/dist/lib/state/index.d.ts.map +1 -1
- package/dist/lib/state/index.js.map +1 -1
- package/dist/lib/state/tool-cache.d.ts +5 -12
- package/dist/lib/state/tool-cache.d.ts.map +1 -1
- package/dist/lib/state/tool-cache.js +47 -72
- package/dist/lib/state/tool-cache.js.map +1 -1
- package/dist/lib/ui/display-utils.d.ts +12 -0
- package/dist/lib/ui/display-utils.d.ts.map +1 -1
- package/dist/lib/ui/display-utils.js +66 -0
- package/dist/lib/ui/display-utils.js.map +1 -1
- package/dist/lib/ui/notification.d.ts +5 -12
- package/dist/lib/ui/notification.d.ts.map +1 -1
- package/dist/lib/ui/notification.js +31 -138
- package/dist/lib/ui/notification.js.map +1 -1
- package/package.json +1 -1
- package/dist/lib/api-formats/prunable-list.d.ts +0 -49
- package/dist/lib/api-formats/prunable-list.d.ts.map +0 -1
- package/dist/lib/api-formats/prunable-list.js +0 -112
- package/dist/lib/api-formats/prunable-list.js.map +0 -1
- package/dist/lib/api-formats/synth-instruction.d.ts +0 -29
- package/dist/lib/api-formats/synth-instruction.d.ts.map +0 -1
- package/dist/lib/api-formats/synth-instruction.js +0 -171
- package/dist/lib/api-formats/synth-instruction.js.map +0 -1
- package/dist/lib/core/strategies/types.d.ts +0 -35
- package/dist/lib/core/strategies/types.d.ts.map +0 -1
- package/dist/lib/core/strategies/types.js +0 -6
- package/dist/lib/core/strategies/types.js.map +0 -1
|
@@ -1,46 +1,78 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { buildPrunableToolsList,
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
import { ensureSessionRestored } from "../state";
|
|
2
|
+
import { buildPrunableToolsList, buildAssistantInjection } 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
|
+
}
|
|
13
42
|
export async function handleFormat(body, ctx, inputUrl, format) {
|
|
14
43
|
const data = format.getDataArray(body);
|
|
15
44
|
if (!data) {
|
|
16
45
|
return { modified: false, body };
|
|
17
46
|
}
|
|
18
47
|
let modified = false;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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 assistantInjection = buildAssistantInjection(prunableList, includeNudge);
|
|
68
|
+
if (format.appendToLastAssistantMessage && format.appendToLastAssistantMessage(body, assistantInjection)) {
|
|
69
|
+
const nudgeMsg = includeNudge ? " with nudge" : "";
|
|
70
|
+
ctx.logger.debug("fetch", `Appended prunable tools list${nudgeMsg} to last assistant message (${format.name})`, {
|
|
71
|
+
ids: numericIds,
|
|
72
|
+
nudge: includeNudge,
|
|
73
|
+
toolsSincePrune: ctx.toolTracker.toolResultCount
|
|
74
|
+
});
|
|
75
|
+
modified = true;
|
|
44
76
|
}
|
|
45
77
|
}
|
|
46
78
|
}
|
|
@@ -52,12 +84,13 @@ export async function handleFormat(body, ctx, inputUrl, format) {
|
|
|
52
84
|
return { modified, body };
|
|
53
85
|
}
|
|
54
86
|
const toolOutputs = format.extractToolOutputs(data, ctx.state);
|
|
55
|
-
const protectedToolsLower = new Set(ctx.config.protectedTools.map(t => t.toLowerCase()));
|
|
56
87
|
let replacedCount = 0;
|
|
88
|
+
let prunableCount = 0;
|
|
57
89
|
for (const output of toolOutputs) {
|
|
58
|
-
|
|
90
|
+
// Skip tools not in cache (protected tools are excluded from cache)
|
|
91
|
+
if (!output.toolName)
|
|
59
92
|
continue;
|
|
60
|
-
|
|
93
|
+
prunableCount++;
|
|
61
94
|
if (allPrunedIds.has(output.id)) {
|
|
62
95
|
if (format.replaceToolOutput(data, output.id, PRUNED_CONTENT_MESSAGE, ctx.state)) {
|
|
63
96
|
replacedCount++;
|
|
@@ -67,7 +100,7 @@ export async function handleFormat(body, ctx, inputUrl, format) {
|
|
|
67
100
|
if (replacedCount > 0) {
|
|
68
101
|
ctx.logger.info("fetch", `Replaced pruned tool outputs (${format.name})`, {
|
|
69
102
|
replaced: replacedCount,
|
|
70
|
-
total:
|
|
103
|
+
total: prunableCount
|
|
71
104
|
});
|
|
72
105
|
if (ctx.logger.enabled) {
|
|
73
106
|
const activeSessions = allSessions.data?.filter((s) => !s.parentID) || [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../lib/fetch-wrapper/handler.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../lib/fetch-wrapper/handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAElE,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE3C,MAAM,qBAAqB,GAAG,UAAU,CAAC,WAAW,CAAC,CAAA;AACrD,MAAM,sBAAsB,GAAG,+EAA+E,CAAA;AAE9G,SAAS,0BAA0B,CAAC,WAAgB;IAChD,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;AAED,KAAK,UAAU,oBAAoB,CAC/B,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,KAAK,UAAU,eAAe,CAC1B,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,MAAM,CAAC,KAAK,UAAU,YAAY,CAC9B,IAAS,EACT,GAAwB,EACxB,QAAgB,EAChB,MAAwB;IAExB,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;IACtC,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IACpC,CAAC;IAED,IAAI,QAAQ,GAAG,KAAK,CAAA;IAEpB,4EAA4E;IAC5E,mDAAmD;IACnD,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAA;IAC7C,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;IACvD,IAAI,SAAS,EAAE,CAAC;QACZ,MAAM,qBAAqB,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;QAC7D,MAAM,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,WAAW,EAAE,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACpG,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC;QACvD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAA;QAC3D,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;QAC9D,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;QAC7E,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;QAEnF,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,sBAAsB,CAC7D,SAAS,EACT,WAAW,EACX,GAAG,CAAC,KAAK,CAAC,cAAc,EACxB,GAAG,CAAC,MAAM,CAAC,cAAc,CAC5B,CAAA;QAED,IAAI,YAAY,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,eAAe,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAA;YACzG,IAAI,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,qBAAqB,CAAC,EAAE,CAAC;gBAC1D,QAAQ,GAAG,IAAI,CAAA;YACnB,CAAC;YAED,MAAM,kBAAkB,GAAG,uBAAuB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAA;YAE9E,IAAI,MAAM,CAAC,4BAA4B,IAAI,MAAM,CAAC,4BAA4B,CAAC,IAAI,EAAE,kBAAkB,CAAC,EAAE,CAAC;gBACvG,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAA;gBAClD,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,+BAA+B,QAAQ,+BAA+B,MAAM,CAAC,IAAI,GAAG,EAAE;oBAC5G,GAAG,EAAE,UAAU;oBACf,KAAK,EAAE,YAAY;oBACnB,eAAe,EAAE,GAAG,CAAC,WAAW,CAAC,eAAe;iBACnD,CAAC,CAAA;gBACF,QAAQ,GAAG,IAAI,CAAA;YACnB,CAAC;QACL,CAAC;IACL,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IAC7B,CAAC;IAED,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAE9F,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IAC7B,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAA;IAC9D,IAAI,aAAa,GAAG,CAAC,CAAA;IACrB,IAAI,aAAa,GAAG,CAAC,CAAA;IAErB,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;QAC/B,oEAAoE;QACpE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE,SAAQ;QAC9B,aAAa,EAAE,CAAA;QAEf,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;YAC9B,IAAI,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,sBAAsB,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/E,aAAa,EAAE,CAAA;YACnB,CAAC;QACL,CAAC;IACL,CAAC;IAED,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QACpB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,iCAAiC,MAAM,CAAC,IAAI,GAAG,EAAE;YACtE,QAAQ,EAAE,aAAa;YACvB,KAAK,EAAE,aAAa;SACvB,CAAC,CAAA;QAEF,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;YAC9E,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,EACJ,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,CAAC,EACpD,eAAe,CAClB,CAAA;QACL,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IACnC,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;AAC7B,CAAC"}
|
|
@@ -1,19 +1,18 @@
|
|
|
1
1
|
import type { PluginState } from "../state";
|
|
2
2
|
import type { Logger } from "../logger";
|
|
3
|
-
import type {
|
|
4
|
-
import type { ToolTracker } from "../api-formats/synth-instruction";
|
|
3
|
+
import type { ToolTracker } from "./types";
|
|
5
4
|
import type { PluginConfig } from "../config";
|
|
6
|
-
export type { FetchHandlerContext, FetchHandlerResult
|
|
5
|
+
export type { FetchHandlerContext, FetchHandlerResult } from "./types";
|
|
7
6
|
/**
|
|
8
7
|
* Creates a wrapped global fetch that intercepts API calls and performs
|
|
9
8
|
* context pruning on tool outputs that have been marked for removal.
|
|
10
9
|
*
|
|
11
10
|
* Supports five API formats:
|
|
12
11
|
* 1. OpenAI Chat Completions (body.messages with role='tool')
|
|
13
|
-
* 2. Anthropic (body.messages with
|
|
12
|
+
* 2. Anthropic Messages API (body.system + body.messages with tool_result)
|
|
14
13
|
* 3. Google/Gemini (body.contents with functionResponse parts)
|
|
15
14
|
* 4. OpenAI Responses API (body.input with function_call_output items)
|
|
16
15
|
* 5. AWS Bedrock Converse API (body.system + body.messages with toolResult blocks)
|
|
17
16
|
*/
|
|
18
|
-
export declare function installFetchWrapper(state: PluginState, logger: Logger, client: any, config: PluginConfig, toolTracker: ToolTracker
|
|
17
|
+
export declare function installFetchWrapper(state: PluginState, logger: Logger, client: any, config: PluginConfig, toolTracker: ToolTracker): () => void;
|
|
19
18
|
//# 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;
|
|
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,4 +1,4 @@
|
|
|
1
|
-
import { openaiChatFormat, openaiResponsesFormat, geminiFormat, bedrockFormat } from "./formats";
|
|
1
|
+
import { openaiChatFormat, openaiResponsesFormat, geminiFormat, bedrockFormat, anthropicFormat } from "./formats";
|
|
2
2
|
import { handleFormat } from "./handler";
|
|
3
3
|
import { runStrategies } from "../core/strategies";
|
|
4
4
|
import { accumulateGCStats } from "./gc-tracker";
|
|
@@ -9,20 +9,19 @@ import { trimToolParametersCache } from "../state/tool-cache";
|
|
|
9
9
|
*
|
|
10
10
|
* Supports five API formats:
|
|
11
11
|
* 1. OpenAI Chat Completions (body.messages with role='tool')
|
|
12
|
-
* 2. Anthropic (body.messages with
|
|
12
|
+
* 2. Anthropic Messages API (body.system + body.messages with tool_result)
|
|
13
13
|
* 3. Google/Gemini (body.contents with functionResponse parts)
|
|
14
14
|
* 4. OpenAI Responses API (body.input with function_call_output items)
|
|
15
15
|
* 5. AWS Bedrock Converse API (body.system + body.messages with toolResult blocks)
|
|
16
16
|
*/
|
|
17
|
-
export function installFetchWrapper(state, logger, client, config, toolTracker
|
|
17
|
+
export function installFetchWrapper(state, logger, client, config, toolTracker) {
|
|
18
18
|
const originalGlobalFetch = globalThis.fetch;
|
|
19
19
|
const ctx = {
|
|
20
20
|
state,
|
|
21
21
|
logger,
|
|
22
22
|
client,
|
|
23
23
|
config,
|
|
24
|
-
toolTracker
|
|
25
|
-
prompts
|
|
24
|
+
toolTracker
|
|
26
25
|
};
|
|
27
26
|
globalThis.fetch = async (input, init) => {
|
|
28
27
|
if (state.lastSeenSessionId && state.subagentSessions.has(state.lastSeenSessionId)) {
|
|
@@ -38,8 +37,12 @@ export function installFetchWrapper(state, logger, client, config, toolTracker,
|
|
|
38
37
|
let modified = false;
|
|
39
38
|
const toolIdsBefore = new Set(state.toolParameters.keys());
|
|
40
39
|
// Mutually exclusive format handlers
|
|
41
|
-
//
|
|
42
|
-
//
|
|
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
|
|
43
46
|
if (openaiResponsesFormat.detect(body)) {
|
|
44
47
|
const result = await handleFormat(body, ctx, inputUrl, openaiResponsesFormat);
|
|
45
48
|
if (result.modified) {
|
|
@@ -52,6 +55,12 @@ export function installFetchWrapper(state, logger, client, config, toolTracker,
|
|
|
52
55
|
modified = true;
|
|
53
56
|
}
|
|
54
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
|
+
}
|
|
55
64
|
else if (openaiChatFormat.detect(body)) {
|
|
56
65
|
const result = await handleFormat(body, ctx, inputUrl, openaiChatFormat);
|
|
57
66
|
if (result.modified) {
|
|
@@ -1 +1 @@
|
|
|
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,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/fetch-wrapper/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
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 buildAssistantInjection(prunableList: string, includeNudge: boolean): string;
|
|
8
|
+
//# sourceMappingURL=prunable-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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,uBAAuB,CACnC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,OAAO,GACtB,MAAM,CAYR"}
|
|
@@ -0,0 +1,38 @@
|
|
|
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>\n${lines.join('\n')}\n</prunable-tools>`,
|
|
25
|
+
numericIds
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export function buildAssistantInjection(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
|
|
@@ -0,0 +1 @@
|
|
|
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,qBAAqB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB;QAChE,UAAU;KACb,CAAA;AACL,CAAC;AAED,MAAM,UAAU,uBAAuB,CACnC,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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
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
|
+
//# sourceMappingURL=tool-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -1,77 +1,62 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { PluginState } from "../state";
|
|
2
2
|
import type { Logger } from "../logger";
|
|
3
|
-
import type { ToolTracker } from "../api-formats/synth-instruction";
|
|
4
3
|
import type { PluginConfig } from "../config";
|
|
5
|
-
|
|
6
|
-
export
|
|
7
|
-
/** Represents a tool output that can be pruned */
|
|
4
|
+
import type { ToolTracker } from "./tool-tracker";
|
|
5
|
+
export type { ToolTracker } from "./tool-tracker";
|
|
8
6
|
export interface ToolOutput {
|
|
9
|
-
/** The tool call ID (tool_call_id, call_id, tool_use_id, or position key for Gemini) */
|
|
10
7
|
id: string;
|
|
11
|
-
/** The tool name (for protected tool checking) */
|
|
12
8
|
toolName?: string;
|
|
13
9
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
10
|
+
export interface ToolMetadata {
|
|
11
|
+
tool: string;
|
|
12
|
+
parameters?: any;
|
|
13
|
+
}
|
|
18
14
|
export interface FormatDescriptor {
|
|
19
|
-
/** Human-readable name for logging */
|
|
20
15
|
name: string;
|
|
21
|
-
/** Check if this format matches the request body */
|
|
22
16
|
detect(body: any): boolean;
|
|
23
|
-
/** Get the data array to process (messages, contents, input, etc.) */
|
|
24
17
|
getDataArray(body: any): any[] | undefined;
|
|
25
|
-
|
|
26
|
-
|
|
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 */
|
|
18
|
+
injectSystemMessage(body: any, injection: string): boolean;
|
|
19
|
+
appendToLastAssistantMessage?(body: any, injection: string): boolean;
|
|
34
20
|
extractToolOutputs(data: any[], state: PluginState): ToolOutput[];
|
|
35
|
-
/** Replace a pruned tool output with the pruned message. Returns true if replaced. */
|
|
36
21
|
replaceToolOutput(data: any[], toolId: string, prunedMessage: string, state: PluginState): boolean;
|
|
37
|
-
/** Check if data has any tool outputs worth processing */
|
|
38
22
|
hasToolOutputs(data: any[]): boolean;
|
|
39
|
-
/** Get metadata for logging after replacements */
|
|
40
23
|
getLogMetadata(data: any[], replacedCount: number, inputUrl: string): Record<string, any>;
|
|
41
24
|
}
|
|
42
|
-
/** Prompts used for synthetic instruction injection */
|
|
43
|
-
export interface SynthPrompts {
|
|
44
|
-
synthInstruction: string;
|
|
45
|
-
nudgeInstruction: string;
|
|
46
|
-
}
|
|
47
|
-
/** Context passed to each format-specific handler */
|
|
48
25
|
export interface FetchHandlerContext {
|
|
49
26
|
state: PluginState;
|
|
50
27
|
logger: Logger;
|
|
51
28
|
client: any;
|
|
52
29
|
config: PluginConfig;
|
|
53
30
|
toolTracker: ToolTracker;
|
|
54
|
-
prompts: SynthPrompts;
|
|
55
31
|
}
|
|
56
|
-
/** Result from a format handler indicating what happened */
|
|
57
32
|
export interface FetchHandlerResult {
|
|
58
|
-
/** Whether the body was modified and should be re-serialized */
|
|
59
33
|
modified: boolean;
|
|
60
|
-
/** The potentially modified body object */
|
|
61
34
|
body: any;
|
|
62
35
|
}
|
|
63
|
-
/** Session data returned from getAllPrunedIds */
|
|
64
36
|
export interface PrunedIdData {
|
|
65
37
|
allSessions: any;
|
|
66
38
|
allPrunedIds: Set<string>;
|
|
67
39
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
export
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
+
}
|
|
77
62
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../lib/fetch-wrapper/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
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,4BAA4B,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAA;IACpE,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,45 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const currentSession = getMostRecentActiveSession(allSessions);
|
|
8
|
-
if (currentSession) {
|
|
9
|
-
await ensureSessionRestored(state, currentSession.id, logger);
|
|
10
|
-
const prunedIds = state.prunedIds.get(currentSession.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
|
-
}
|
|
18
|
-
}
|
|
19
|
-
return { allSessions, allPrunedIds };
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Fetch session messages for logging purposes.
|
|
23
|
-
*/
|
|
24
|
-
export async function fetchSessionMessages(client, sessionId) {
|
|
25
|
-
try {
|
|
26
|
-
const messagesResponse = await client.session.messages({
|
|
27
|
-
path: { id: sessionId },
|
|
28
|
-
query: { limit: 100 }
|
|
29
|
-
});
|
|
30
|
-
return Array.isArray(messagesResponse.data)
|
|
31
|
-
? messagesResponse.data
|
|
32
|
-
: Array.isArray(messagesResponse) ? messagesResponse : undefined;
|
|
33
|
-
}
|
|
34
|
-
catch (e) {
|
|
35
|
-
return undefined;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Get the most recent active (non-subagent) session.
|
|
40
|
-
*/
|
|
41
|
-
export function getMostRecentActiveSession(allSessions) {
|
|
42
|
-
const activeSessions = allSessions.data?.filter((s) => !s.parentID) || [];
|
|
43
|
-
return activeSessions.length > 0 ? activeSessions[0] : undefined;
|
|
44
|
-
}
|
|
1
|
+
/** Human-readable labels for prune reasons */
|
|
2
|
+
export const PRUNE_REASON_LABELS = {
|
|
3
|
+
completion: "Task Complete",
|
|
4
|
+
noise: "Noise Removal",
|
|
5
|
+
consolidation: "Consolidation"
|
|
6
|
+
};
|
|
45
7
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../lib/fetch-wrapper/types.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/lib/hooks.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { PluginState } from "./state";
|
|
|
2
2
|
import type { Logger } from "./logger";
|
|
3
3
|
import type { JanitorContext } from "./core/janitor";
|
|
4
4
|
import type { PluginConfig } from "./config";
|
|
5
|
-
import type { ToolTracker } from "./
|
|
5
|
+
import type { ToolTracker } from "./fetch-wrapper/tool-tracker";
|
|
6
6
|
export declare function isSubagentSession(client: any, sessionID: string): Promise<boolean>;
|
|
7
7
|
export declare function createEventHandler(client: any, janitorCtx: JanitorContext, logger: Logger, config: PluginConfig, toolTracker?: ToolTracker): ({ event }: {
|
|
8
8
|
event: any;
|
|
@@ -10,5 +10,9 @@ export declare function createEventHandler(client: any, janitorCtx: JanitorConte
|
|
|
10
10
|
/**
|
|
11
11
|
* Creates the chat.params hook for model caching and Google tool call mapping.
|
|
12
12
|
*/
|
|
13
|
-
export declare function createChatParamsHandler(client: any, state: PluginState, logger: Logger): (input: any, _output: any) => Promise<void>;
|
|
13
|
+
export declare function createChatParamsHandler(client: any, state: PluginState, logger: Logger, toolTracker?: ToolTracker): (input: any, _output: any) => Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Finds the current agent from messages by scanning backward for user messages.
|
|
16
|
+
*/
|
|
17
|
+
export declare function findCurrentAgent(messages: any[]): string | undefined;
|
|
14
18
|
//# sourceMappingURL=hooks.d.ts.map
|
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,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,UAAU,CAAA;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,
|
|
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,8BAA8B,CAAA;AAI/D,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,EACd,WAAW,CAAC,EAAE,WAAW,IAEX,OAAO,GAAG,EAAE,SAAS,GAAG,mBAwFzC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,GAAG,SAAS,CASpE"}
|