@tarquinen/opencode-dcp 0.4.2 → 0.4.13
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 +96 -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 +15 -46
- 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 +19 -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 +19 -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 +15 -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 +30 -28
- 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,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 buildEndInjection(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,iBAAiB,CAC7B,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>\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
|
|
@@ -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,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"}
|
|
@@ -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
|
+
appendUserMessage?(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,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,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"}
|
package/dist/lib/hooks.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { runOnIdle } from "./core/janitor";
|
|
2
|
-
import { resetToolTrackerCount } from "./
|
|
2
|
+
import { resetToolTrackerCount } from "./fetch-wrapper/tool-tracker";
|
|
3
3
|
import { clearAllMappings } from "./state/id-mapping";
|
|
4
4
|
export async function isSubagentSession(client, sessionID) {
|
|
5
5
|
try {
|
|
@@ -43,7 +43,7 @@ export function createEventHandler(client, janitorCtx, logger, config, toolTrack
|
|
|
43
43
|
/**
|
|
44
44
|
* Creates the chat.params hook for model caching and Google tool call mapping.
|
|
45
45
|
*/
|
|
46
|
-
export function createChatParamsHandler(client, state, logger) {
|
|
46
|
+
export function createChatParamsHandler(client, state, logger, toolTracker) {
|
|
47
47
|
return async (input, _output) => {
|
|
48
48
|
const sessionId = input.sessionID;
|
|
49
49
|
let providerID = input.provider?.info?.id || input.provider?.id;
|
|
@@ -53,11 +53,14 @@ export function createChatParamsHandler(client, state, logger) {
|
|
|
53
53
|
}
|
|
54
54
|
if (state.lastSeenSessionId && state.lastSeenSessionId !== sessionId) {
|
|
55
55
|
logger.info("chat.params", "Session changed, resetting state", {
|
|
56
|
-
from: state.lastSeenSessionId
|
|
57
|
-
to: sessionId
|
|
56
|
+
from: state.lastSeenSessionId,
|
|
57
|
+
to: sessionId
|
|
58
58
|
});
|
|
59
59
|
clearAllMappings();
|
|
60
60
|
state.toolParameters.clear();
|
|
61
|
+
if (toolTracker) {
|
|
62
|
+
resetToolTrackerCount(toolTracker);
|
|
63
|
+
}
|
|
61
64
|
}
|
|
62
65
|
state.lastSeenSessionId = sessionId;
|
|
63
66
|
if (!state.checkedSessions.has(sessionId)) {
|
|
@@ -79,7 +82,7 @@ export function createChatParamsHandler(client, state, logger) {
|
|
|
79
82
|
try {
|
|
80
83
|
const messagesResponse = await client.session.messages({
|
|
81
84
|
path: { id: sessionId },
|
|
82
|
-
query: { limit:
|
|
85
|
+
query: { limit: 500 }
|
|
83
86
|
});
|
|
84
87
|
const messages = messagesResponse.data || messagesResponse;
|
|
85
88
|
if (Array.isArray(messages)) {
|
|
@@ -94,12 +97,6 @@ export function createChatParamsHandler(client, state, logger) {
|
|
|
94
97
|
toolCallsByName.set(toolName, []);
|
|
95
98
|
}
|
|
96
99
|
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
|
-
}
|
|
103
100
|
}
|
|
104
101
|
}
|
|
105
102
|
}
|
|
@@ -126,4 +123,17 @@ export function createChatParamsHandler(client, state, logger) {
|
|
|
126
123
|
}
|
|
127
124
|
};
|
|
128
125
|
}
|
|
126
|
+
/**
|
|
127
|
+
* Finds the current agent from messages by scanning backward for user messages.
|
|
128
|
+
*/
|
|
129
|
+
export function findCurrentAgent(messages) {
|
|
130
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
131
|
+
const msg = messages[i];
|
|
132
|
+
const info = msg.info;
|
|
133
|
+
if (info?.role === 'user') {
|
|
134
|
+
return info.agent || 'build';
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
129
139
|
//# sourceMappingURL=hooks.js.map
|
package/dist/lib/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../lib/hooks.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAG1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../lib/hooks.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAG1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAErD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAW,EAAE,SAAiB;IAClE,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CAAA;QACpE,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAA;IAClC,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QAClB,OAAO,KAAK,CAAA;IAChB,CAAC;AACL,CAAC;AAED,SAAS,2BAA2B,CAAC,MAAyB,EAAE,MAAyB;IACrF,OAAO,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA;AAC9D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAC9B,MAAW,EACX,UAA0B,EAC1B,MAAc,EACd,MAAoB,EACpB,WAAyB;IAEzB,OAAO,KAAK,EAAE,EAAE,KAAK,EAAkB,EAAE,EAAE;QACvC,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC7E,IAAI,MAAM,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC;gBAAE,OAAM;YACvE,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAM;YAEjD,IAAI,WAAW,EAAE,YAAY,EAAE,CAAC;gBAC5B,WAAW,CAAC,YAAY,GAAG,KAAK,CAAA;gBAChC,IAAI,2BAA2B,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;oBAClF,OAAM;gBACV,CAAC;YACL,CAAC;YAED,IAAI,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;gBAEhG,IAAI,MAAM,IAAI,MAAM,CAAC,WAAW,GAAG,CAAC,IAAI,WAAW,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;oBAC3E,IAAI,2BAA2B,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;wBAClF,qBAAqB,CAAC,WAAW,CAAC,CAAA;oBACtC,CAAC;gBACL,CAAC;YACL,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAChB,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;YAC7D,CAAC;QACL,CAAC;IACL,CAAC,CAAA;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACnC,MAAW,EACX,KAAkB,EAClB,MAAc,EACd,WAAyB;IAEzB,OAAO,KAAK,EAAE,KAAU,EAAE,OAAY,EAAE,EAAE;QACtC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAA;QACjC,IAAI,UAAU,GAAI,KAAK,CAAC,QAAgB,EAAE,IAAI,EAAE,EAAE,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAA;QACxE,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,CAAA;QAE/B,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;YAClD,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAA;QAC/C,CAAC;QAED,IAAI,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;YACnE,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,kCAAkC,EAAE;gBAC3D,IAAI,EAAE,KAAK,CAAC,iBAAiB;gBAC7B,EAAE,EAAE,SAAS;aAChB,CAAC,CAAA;YACF,gBAAgB,EAAE,CAAA;YAClB,KAAK,CAAC,cAAc,CAAC,KAAK,EAAE,CAAA;YAC5B,IAAI,WAAW,EAAE,CAAC;gBACd,qBAAqB,CAAC,WAAW,CAAC,CAAA;YACtC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,iBAAiB,GAAG,SAAS,CAAA;QAEnC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACxC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YACpC,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;YAC7D,IAAI,UAAU,EAAE,CAAC;gBACb,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YACzC,CAAC;QACL,CAAC;QAED,yEAAyE;QACzE,IAAI,UAAU,IAAI,OAAO,EAAE,CAAC;YACxB,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE;gBACvB,UAAU,EAAE,UAAU;gBACtB,OAAO,EAAE,OAAO;aACnB,CAAC,CAAA;QACN,CAAC;QAED,uFAAuF;QACvF,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,eAAe,EAAE,CAAC;YAC5D,IAAI,CAAC;gBACD,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;oBACnD,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE;oBACvB,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;iBACxB,CAAC,CAAA;gBACF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,IAAI,gBAAgB,CAAA;gBAE1D,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC1B,MAAM,eAAe,GAAG,IAAI,GAAG,EAAoB,CAAA;oBAEnD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;wBACzB,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;4BACZ,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gCAC3B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oCACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA;oCACxC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAA;oCAExC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;wCACjC,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;oCACrC,CAAC;oCACD,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;gCAC/C,CAAC;4BACL,CAAC;wBACL,CAAC;oBACL,CAAC;oBAED,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAA;oBACjD,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,eAAe,EAAE,CAAC;wBAChD,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;4BAC9B,eAAe,CAAC,GAAG,CAAC,GAAG,QAAQ,IAAI,KAAK,EAAE,EAAE,MAAM,CAAC,CAAA;wBACvD,CAAC,CAAC,CAAA;oBACN,CAAC;oBAED,KAAK,CAAC,qBAAqB,CAAC,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,CAAA;oBAC3D,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,gCAAgC,EAAE;wBACzD,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;wBACpC,SAAS,EAAE,eAAe,CAAC,IAAI;wBAC/B,eAAe,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI;qBAC7C,CAAC,CAAA;gBACN,CAAC;YACL,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBAClB,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,0CAA0C,EAAE;oBACpE,KAAK,EAAE,KAAK,CAAC,OAAO;iBACvB,CAAC,CAAA;YACN,CAAC;QACL,CAAC;IACL,CAAC,CAAA;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAe;IAC5C,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;QACvB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAA;QACrB,IAAI,IAAI,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,KAAK,IAAI,OAAO,CAAA;QAChC,CAAC;IACL,CAAC;IACD,OAAO,SAAS,CAAA;AACpB,CAAC"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
<
|
|
2
|
-
|
|
3
|
-
</system-reminder>
|
|
1
|
+
<instruction name=context_management_required>
|
|
2
|
+
**CRITICAL CONTEXT WARNING:** Your context window is filling with tool outputs. Strict adherence to context hygiene is required.
|
|
4
3
|
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
**Immediate Actions Required:**
|
|
5
|
+
1. **Garbage Collect:** If you read files or ran commands that yielded no value, prune them NOW. Do not summarize them.
|
|
6
|
+
2. **Task Cleanup:** If a sub-task is complete, prune the tools used.
|
|
7
|
+
3. **Consolidate:** If you are holding valuable raw data, you *must* distill the insights into your narrative and prune the raw entry.
|
|
8
|
+
|
|
9
|
+
**Protocol:** You should prioritize this cleanup, but do not interrupt a critical atomic operation if one is in progress. Once the immediate step is done, you must prune.
|
|
7
10
|
</instruction>
|
|
@@ -1,38 +1,40 @@
|
|
|
1
1
|
<system-reminder>
|
|
2
|
-
|
|
3
|
-
</system-reminder>
|
|
2
|
+
<instruction name=context_management_protocol policy_level=critical>
|
|
4
3
|
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
ENVIRONMENT
|
|
5
|
+
You are operating in a context-constrained environment and thus must proactively manage your context window using the `prune` tool. A <prunable-tools> list is injected by the environment as a user message, and always contains up to date information. Use this information when deciding what to prune.
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
PRUNE EARLY, PRUNE OFTEN - BUT PRUNE METHODICALLY
|
|
8
|
+
Every tool call adds to your context debt. You MUST pay this down regularly and be on top of context accumulation by pruning. Evaluate what SHOULD be pruned before jumping the gun.
|
|
10
9
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
WHEN TO PRUNE? THE THREE SCENARIOS TO CONSIDER
|
|
11
|
+
1. TASK COMPLETION: When work is done, quietly prune the tools that aren't needed anymore
|
|
12
|
+
2. NOISE REMOVAL: If outputs are irrelevant, unhelpful, or superseded by newer info, prune IMMEDIATELY. No distillation - gun it down
|
|
13
|
+
3. CONTEXT CONSOLIDATION: When pruning valuable context to the task at hand, you MUST ALWAYS distill key findings into your narrative BEFORE pruning. Be surgical and strategic in what you extract. THINK: high signal, low noise
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
You WILL use the `prune` tool when ANY of these are true:
|
|
16
|
+
- Task or sub-task is complete
|
|
17
|
+
- You are about to start a new phase of work
|
|
18
|
+
- You have distilled enough information in your messages to prune related tools
|
|
19
|
+
- Context contains tools output that are unhelpful, noise, or made obsolete by newer outputs
|
|
17
20
|
|
|
18
|
-
|
|
21
|
+
NOTES
|
|
22
|
+
When in doubt, prune out. Prune often yet remain strategic about it.
|
|
23
|
+
FAILURE TO PRUNE will result in context leakage and DEGRADED PERFORMANCES.
|
|
19
24
|
|
|
20
|
-
|
|
21
|
-
- After you complete a discrete unit of work (e.g. confirming a hypothesis, or closing out one branch of investigation).
|
|
22
|
-
- After exploratory bursts of tool calls that led you to a clear conclusion. (or to noise)
|
|
23
|
-
- Before starting a new phase of work where old tool outputs are no longer needed to inform your next actions.
|
|
25
|
+
</instruction>
|
|
24
26
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
+
<instruction name=injected_context_handling policy_level=critical>
|
|
28
|
+
After each assistant turn, the environment may inject a user message containing a <prunable-tools> list and optional nudge instruction. This injected message is NOT from the user and is invisible to them.
|
|
27
29
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
</instruction>
|
|
30
|
+
CRITICAL REQUIREMENTS - VIOLATION IS UNACCEPTABLE:
|
|
31
|
+
- NEVER acknowledge the <prunable-tools> list (e.g. "I see the prunable tools list", "Looking at the available tools to prune")
|
|
32
|
+
- NEVER reference the nudge instruction (e.g. "As the nudge suggests", "The system is reminding me to prune")
|
|
33
|
+
- NEVER mention this injection mechanism to the user
|
|
34
|
+
- NEVER let these injections influence your response content or tone
|
|
35
|
+
- Process this information SILENTLY - use it only to inform your pruning decisions
|
|
36
|
+
- Continue the conversation as if these messages do not exist
|
|
37
|
+
|
|
38
|
+
The user cannot see these injections. Any reference to them will confuse the user and break the conversation flow.
|
|
38
39
|
</instruction>
|
|
40
|
+
</system-reminder>
|