@tarquinen/opencode-dcp 1.0.0-beta.3 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -12
- package/dist/lib/config.d.ts +0 -4
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +52 -25
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/hooks.d.ts.map +1 -1
- package/dist/lib/hooks.js +4 -0
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/messages/prune.d.ts.map +1 -1
- package/dist/lib/messages/prune.js +39 -11
- package/dist/lib/messages/prune.js.map +1 -1
- package/dist/lib/messages/utils.d.ts +3 -4
- package/dist/lib/messages/utils.d.ts.map +1 -1
- package/dist/lib/messages/utils.js +5 -16
- package/dist/lib/messages/utils.js.map +1 -1
- package/dist/lib/prompts/synthetic.txt +14 -6
- package/dist/lib/prompts/tool.txt +17 -1
- package/dist/lib/shared-utils.d.ts +6 -0
- package/dist/lib/shared-utils.d.ts.map +1 -0
- package/dist/lib/shared-utils.js +17 -0
- package/dist/lib/shared-utils.js.map +1 -0
- package/dist/lib/state/persistence.d.ts +1 -0
- package/dist/lib/state/persistence.d.ts.map +1 -1
- package/dist/lib/state/persistence.js +2 -2
- package/dist/lib/state/persistence.js.map +1 -1
- package/dist/lib/state/state.d.ts.map +1 -1
- package/dist/lib/state/state.js +6 -3
- package/dist/lib/state/state.js.map +1 -1
- package/dist/lib/state/tool-cache.d.ts.map +1 -1
- package/dist/lib/state/tool-cache.js +9 -5
- package/dist/lib/state/tool-cache.js.map +1 -1
- package/dist/lib/state/types.d.ts +1 -1
- package/dist/lib/state/types.d.ts.map +1 -1
- package/dist/lib/state/utils.d.ts +2 -0
- package/dist/lib/state/utils.d.ts.map +1 -0
- package/dist/lib/state/utils.js +10 -0
- package/dist/lib/state/utils.js.map +1 -0
- package/dist/lib/strategies/deduplication.js +3 -3
- package/dist/lib/strategies/deduplication.js.map +1 -1
- package/dist/lib/strategies/on-idle.d.ts.map +1 -1
- package/dist/lib/strategies/on-idle.js +10 -7
- package/dist/lib/strategies/on-idle.js.map +1 -1
- package/dist/lib/strategies/prune-tool.d.ts.map +1 -1
- package/dist/lib/strategies/prune-tool.js +13 -7
- package/dist/lib/strategies/prune-tool.js.map +1 -1
- package/dist/lib/strategies/utils.d.ts +13 -0
- package/dist/lib/strategies/utils.d.ts.map +1 -0
- package/dist/lib/{utils.js → strategies/utils.js} +28 -17
- package/dist/lib/strategies/utils.js.map +1 -0
- package/dist/lib/ui/notification.d.ts +2 -2
- package/dist/lib/ui/notification.d.ts.map +1 -1
- package/dist/lib/ui/notification.js +14 -7
- package/dist/lib/ui/notification.js.map +1 -1
- package/dist/lib/ui/{display-utils.d.ts → utils.d.ts} +2 -1
- package/dist/lib/ui/utils.d.ts.map +1 -0
- package/dist/lib/ui/{display-utils.js → utils.js} +7 -1
- package/dist/lib/ui/utils.js.map +1 -0
- package/package.json +1 -1
- package/dist/lib/ui/display-utils.d.ts.map +0 -1
- package/dist/lib/ui/display-utils.js.map +0 -1
- package/dist/lib/utils.d.ts +0 -9
- package/dist/lib/utils.d.ts.map +0 -1
- package/dist/lib/utils.js.map +0 -1
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
Prunes tool outputs from context to manage conversation size and reduce noise.
|
|
1
|
+
Prunes tool outputs from context to manage conversation size and reduce noise. For `write` and `edit` tools, the input content is pruned instead of the output.
|
|
2
2
|
|
|
3
3
|
## IMPORTANT: The Prunable List
|
|
4
4
|
A `<prunable-tools>` list is injected into user messages showing available tool outputs you can prune. Each line has the format `ID: tool, parameter` (e.g., `20: read, /path/to/file.ts`). You MUST only use numeric IDs that appear in this list to select which tools to prune.
|
|
5
5
|
|
|
6
|
+
**Note:** For `write` and `edit` tools, pruning removes the input content (the code being written/edited) while preserving the output confirmation. This is useful after completing a file modification when you no longer need the raw content in context.
|
|
7
|
+
|
|
6
8
|
## CRITICAL: When and How to Prune
|
|
7
9
|
|
|
8
10
|
You must use this tool in three specific scenarios. The rules for distillation (summarizing findings) differ for each. **You must specify the reason as the first element of the `ids` array** to indicate which scenario applies.
|
|
@@ -25,11 +27,14 @@ You must use this tool in three specific scenarios. The rules for distillation (
|
|
|
25
27
|
- Narrative format: "I found X in file Y..."
|
|
26
28
|
- Capture all relevant details (function names, logic, constraints).
|
|
27
29
|
- Once distilled into your response history, the raw tool output can be safely pruned.
|
|
30
|
+
- **Know when distillation isn't enough:** If you'll need to edit a file, grep for exact strings, or reference precise syntax, keep the raw output. Distillation works for understanding; implementation often requires the original.
|
|
31
|
+
- **Prefer keeping over re-fetching:** If uncertain whether you'll need the output again, keep it. The cost of retaining context is lower than the cost of redundant tool calls.
|
|
28
32
|
|
|
29
33
|
## Best Practices
|
|
30
34
|
- **Don't wait too long:** Prune frequently to keep the context agile.
|
|
31
35
|
- **Be surgical:** You can mix strategies. Prune noise without comment, while distilling useful context in the same turn.
|
|
32
36
|
- **Verify:** Ensure you have captured what you need before deleting useful raw data.
|
|
37
|
+
- **Think ahead:** Before pruning, ask: "Will I need this output for an upcoming task?" If you researched a file you'll later edit, or gathered context for implementation, do NOT prune it—even if you've distilled findings. Distillation captures *knowledge*; implementation requires *context*.
|
|
33
38
|
|
|
34
39
|
## Examples
|
|
35
40
|
|
|
@@ -54,3 +59,14 @@ Assistant: [Runs tests, they pass]
|
|
|
54
59
|
The tests passed. The feature is verified.
|
|
55
60
|
[Uses prune with ids: ["completion", "20", "21"]]
|
|
56
61
|
</example_completion>
|
|
62
|
+
|
|
63
|
+
<example_keep>
|
|
64
|
+
Assistant: [Reads 'auth.ts' to understand the login flow]
|
|
65
|
+
I've understood the auth flow. I'll need to modify this file to add the new validation, so I'm keeping this read in context rather than distilling and pruning.
|
|
66
|
+
</example_keep>
|
|
67
|
+
|
|
68
|
+
<example_edit_completion>
|
|
69
|
+
Assistant: [Edits 'auth.ts' to add validation]
|
|
70
|
+
The edit was successful. I no longer need the raw edit content in context.
|
|
71
|
+
[Uses prune with ids: ["completion", "15"]]
|
|
72
|
+
</example_edit_completion>
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Logger } from "./logger";
|
|
2
|
+
import { SessionState, WithParts } from "./state";
|
|
3
|
+
export declare const isMessageCompacted: (state: SessionState, msg: WithParts) => boolean;
|
|
4
|
+
export declare const getLastUserMessage: (messages: WithParts[]) => WithParts | null;
|
|
5
|
+
export declare const checkForCompaction: (state: SessionState, messages: WithParts[], logger: Logger) => void;
|
|
6
|
+
//# sourceMappingURL=shared-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-utils.d.ts","sourceRoot":"","sources":["../../lib/shared-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAEjD,eAAO,MAAM,kBAAkB,GAC3B,OAAO,YAAY,EACnB,KAAK,SAAS,KACf,OAEF,CAAA;AAED,eAAO,MAAM,kBAAkB,GAC3B,UAAU,SAAS,EAAE,KACtB,SAAS,GAAG,IAQd,CAAA;AAED,eAAO,MAAM,kBAAkB,GAC3B,OAAO,YAAY,EACnB,UAAU,SAAS,EAAE,EACrB,QAAQ,MAAM,KACf,IAIF,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export const isMessageCompacted = (state, msg) => {
|
|
2
|
+
return msg.info.time.created < state.lastCompaction;
|
|
3
|
+
};
|
|
4
|
+
export const getLastUserMessage = (messages) => {
|
|
5
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
6
|
+
const msg = messages[i];
|
|
7
|
+
if (msg.info.role === 'user') {
|
|
8
|
+
return msg;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
return null;
|
|
12
|
+
};
|
|
13
|
+
export const checkForCompaction = (state, messages, logger) => {
|
|
14
|
+
for (const msg of messages) {
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=shared-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-utils.js","sourceRoot":"","sources":["../../lib/shared-utils.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAC9B,KAAmB,EACnB,GAAc,EACP,EAAE;IACT,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,cAAc,CAAA;AACvD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAC9B,QAAqB,EACL,EAAE;IAClB,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,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3B,OAAO,GAAG,CAAA;QACd,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAA;AACf,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAC9B,KAAmB,EACnB,QAAqB,EACrB,MAAc,EACV,EAAE;IACN,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IAE7B,CAAC;AACL,CAAC,CAAA"}
|
|
@@ -10,6 +10,7 @@ export interface PersistedSessionState {
|
|
|
10
10
|
prune: Prune;
|
|
11
11
|
stats: SessionStats;
|
|
12
12
|
lastUpdated: string;
|
|
13
|
+
lastCompacted: number;
|
|
13
14
|
}
|
|
14
15
|
export declare function saveSessionState(sessionState: SessionState, logger: Logger, sessionName?: string): Promise<void>;
|
|
15
16
|
export declare function loadSessionState(sessionId: string, logger: Logger): Promise<PersistedSessionState | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../../lib/state/persistence.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAChE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,WAAW,qBAAqB;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,KAAK,CAAA;IACZ,KAAK,EAAE,YAAY,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../../lib/state/persistence.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAChE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,WAAW,qBAAqB;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,KAAK,CAAA;IACZ,KAAK,EAAE,YAAY,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAA;CACxB;AAsBD,wBAAsB,gBAAgB,CAClC,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAED,wBAAsB,gBAAgB,CAClC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACf,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAkCvC"}
|
|
@@ -27,6 +27,7 @@ export async function saveSessionState(sessionState, logger, sessionName) {
|
|
|
27
27
|
prune: sessionState.prune,
|
|
28
28
|
stats: sessionState.stats,
|
|
29
29
|
lastUpdated: new Date().toISOString(),
|
|
30
|
+
lastCompacted: sessionState.lastCompaction
|
|
30
31
|
};
|
|
31
32
|
const filePath = getSessionFilePath(sessionState.sessionId);
|
|
32
33
|
const content = JSON.stringify(state, null, 2);
|
|
@@ -61,8 +62,7 @@ export async function loadSessionState(sessionId, logger) {
|
|
|
61
62
|
return null;
|
|
62
63
|
}
|
|
63
64
|
logger.info("Loaded session state from disk", {
|
|
64
|
-
sessionId: sessionId
|
|
65
|
-
totalTokensSaved: state.stats.totalPruneTokens
|
|
65
|
+
sessionId: sessionId
|
|
66
66
|
});
|
|
67
67
|
return state;
|
|
68
68
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../../lib/state/persistence.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../../lib/state/persistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../lib/state/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAsB,SAAS,EAAE,MAAM,SAAS,CAAA;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAKvC,eAAO,MAAM,YAAY,GACrB,QAAQ,GAAG,EACX,OAAO,YAAY,EACnB,QAAQ,MAAM,EACd,UAAU,SAAS,EAAE,KACtB,OAAO,CAAC,IAAI,CAiBd,CAAA;AAED,wBAAgB,kBAAkB,IAAI,YAAY,
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../lib/state/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAsB,SAAS,EAAE,MAAM,SAAS,CAAA;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAKvC,eAAO,MAAM,YAAY,GACrB,QAAQ,GAAG,EACX,OAAO,YAAY,EACnB,QAAQ,MAAM,EACd,UAAU,SAAS,EAAE,KACtB,OAAO,CAAC,IAAI,CAiBd,CAAA;AAED,wBAAgB,kBAAkB,IAAI,YAAY,CAgBjD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAc3D;AAED,wBAAsB,wBAAwB,CAC1C,MAAM,EAAE,GAAG,EACX,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CA+Bf"}
|
package/dist/lib/state/state.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { loadSessionState } from "./persistence";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { isSubAgentSession } from "./utils";
|
|
3
|
+
import { getLastUserMessage } from "../shared-utils";
|
|
4
4
|
export const checkSession = async (client, state, logger, messages) => {
|
|
5
5
|
const lastUserMessage = getLastUserMessage(messages);
|
|
6
6
|
if (!lastUserMessage) {
|
|
@@ -30,7 +30,8 @@ export function createSessionState() {
|
|
|
30
30
|
},
|
|
31
31
|
toolParameters: new Map(),
|
|
32
32
|
nudgeCounter: 0,
|
|
33
|
-
lastToolPrune: false
|
|
33
|
+
lastToolPrune: false,
|
|
34
|
+
lastCompaction: 0
|
|
34
35
|
};
|
|
35
36
|
}
|
|
36
37
|
export function resetSessionState(state) {
|
|
@@ -46,6 +47,7 @@ export function resetSessionState(state) {
|
|
|
46
47
|
state.toolParameters.clear();
|
|
47
48
|
state.nudgeCounter = 0;
|
|
48
49
|
state.lastToolPrune = false;
|
|
50
|
+
state.lastCompaction = 0;
|
|
49
51
|
}
|
|
50
52
|
export async function ensureSessionInitialized(client, state, sessionId, logger) {
|
|
51
53
|
if (state.sessionId === sessionId) {
|
|
@@ -72,5 +74,6 @@ export async function ensureSessionInitialized(client, state, sessionId, logger)
|
|
|
72
74
|
pruneTokenCounter: persisted.stats?.pruneTokenCounter || 0,
|
|
73
75
|
totalPruneTokens: persisted.stats?.totalPruneTokens || 0,
|
|
74
76
|
};
|
|
77
|
+
state.lastCompaction = persisted.lastCompacted || 0;
|
|
75
78
|
}
|
|
76
79
|
//# sourceMappingURL=state.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../lib/state/state.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../lib/state/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-cache.d.ts","sourceRoot":"","sources":["../../../lib/state/tool-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAc,SAAS,EAAE,MAAM,SAAS,CAAA;AAClE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"tool-cache.d.ts","sourceRoot":"","sources":["../../../lib/state/tool-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAc,SAAS,EAAE,MAAM,SAAS,CAAA;AAClE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAKxC;;GAEG;AACH,wBAAsB,aAAa,CAC/B,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,SAAS,EAAE,GACtB,OAAO,CAAC,IAAI,CAAC,CA6Cf;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAWjE"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isMessageCompacted } from "../shared-utils";
|
|
1
2
|
const MAX_TOOL_CACHE_SIZE = 1000;
|
|
2
3
|
/**
|
|
3
4
|
* Sync tool parameters from OpenCode's session.messages() API.
|
|
@@ -7,10 +8,16 @@ export async function syncToolCache(state, config, logger, messages) {
|
|
|
7
8
|
logger.info("Syncing tool parameters from OpenCode messages");
|
|
8
9
|
state.nudgeCounter = 0;
|
|
9
10
|
for (const msg of messages) {
|
|
11
|
+
if (isMessageCompacted(state, msg)) {
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
10
14
|
for (const part of msg.parts) {
|
|
11
15
|
if (part.type !== "tool" || !part.callID) {
|
|
12
16
|
continue;
|
|
13
17
|
}
|
|
18
|
+
if (state.toolParameters.has(part.callID)) {
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
14
21
|
if (part.tool === "prune") {
|
|
15
22
|
state.nudgeCounter = 0;
|
|
16
23
|
}
|
|
@@ -18,19 +25,16 @@ export async function syncToolCache(state, config, logger, messages) {
|
|
|
18
25
|
state.nudgeCounter++;
|
|
19
26
|
}
|
|
20
27
|
state.lastToolPrune = part.tool === "prune";
|
|
21
|
-
if (state.toolParameters.has(part.callID)) {
|
|
22
|
-
continue;
|
|
23
|
-
}
|
|
24
28
|
state.toolParameters.set(part.callID, {
|
|
25
29
|
tool: part.tool,
|
|
26
30
|
parameters: part.state?.input ?? {},
|
|
27
31
|
status: part.state.status,
|
|
28
32
|
error: part.state.status === "error" ? part.state.error : undefined,
|
|
29
|
-
compacted: part.state.status === "completed" && !!part.state.time.compacted,
|
|
30
33
|
});
|
|
34
|
+
logger.info("Cached tool id: " + part.callID);
|
|
31
35
|
}
|
|
32
36
|
}
|
|
33
|
-
|
|
37
|
+
logger.info("Synced cache - size: " + state.toolParameters.size);
|
|
34
38
|
trimToolParametersCache(state);
|
|
35
39
|
}
|
|
36
40
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-cache.js","sourceRoot":"","sources":["../../../lib/state/tool-cache.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tool-cache.js","sourceRoot":"","sources":["../../../lib/state/tool-cache.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAEpD,MAAM,mBAAmB,GAAG,IAAI,CAAA;AAEhC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAC/B,KAAmB,EACnB,MAAoB,EACpB,MAAc,EACd,QAAqB;IAErB,IAAI,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAA;QAE7D,KAAK,CAAC,YAAY,GAAG,CAAC,CAAA;QAEtB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;gBACjC,SAAQ;YACZ,CAAC;YAED,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBAC3B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACvC,SAAQ;gBACZ,CAAC;gBACD,IAAI,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;oBACxC,SAAQ;gBACZ,CAAC;gBAED,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBACxB,KAAK,CAAC,YAAY,GAAG,CAAC,CAAA;gBAC1B,CAAC;qBAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACzE,KAAK,CAAC,YAAY,EAAE,CAAA;gBACxB,CAAC;gBACD,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,KAAK,OAAO,CAAA;gBAE3C,KAAK,CAAC,cAAc,CAAC,GAAG,CACpB,IAAI,CAAC,MAAM,EACX;oBACI,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;oBACnC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAgC;oBACnD,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;iBACtE,CACJ,CAAA;gBACD,MAAM,CAAC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA;YACjD,CAAC;QACL,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;QAChE,uBAAuB,CAAC,KAAK,CAAC,CAAA;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,8CAA8C,EAAE;YACxD,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAChE,CAAC,CAAA;IACN,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAmB;IACvD,IAAI,KAAK,CAAC,cAAc,CAAC,IAAI,IAAI,mBAAmB,EAAE,CAAC;QACnD,OAAM;IACV,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;SACvD,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,GAAG,mBAAmB,CAAC,CAAA;IAE9D,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC7B,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IACpC,CAAC;AACL,CAAC"}
|
|
@@ -9,7 +9,6 @@ export interface ToolParameterEntry {
|
|
|
9
9
|
parameters: any;
|
|
10
10
|
status?: ToolStatus;
|
|
11
11
|
error?: string;
|
|
12
|
-
compacted?: boolean;
|
|
13
12
|
}
|
|
14
13
|
export interface SessionStats {
|
|
15
14
|
pruneTokenCounter: number;
|
|
@@ -26,5 +25,6 @@ export interface SessionState {
|
|
|
26
25
|
toolParameters: Map<string, ToolParameterEntry>;
|
|
27
26
|
nudgeCounter: number;
|
|
28
27
|
lastToolPrune: boolean;
|
|
28
|
+
lastCompaction: number;
|
|
29
29
|
}
|
|
30
30
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../lib/state/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAEhD,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,EAAE,IAAI,EAAE,CAAA;CAChB;AAED,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAA;AAEtE,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,GAAG,CAAA;IACf,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../lib/state/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAEhD,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,EAAE,IAAI,EAAE,CAAA;CAChB;AAED,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAA;AAEtE,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,GAAG,CAAA;IACf,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,YAAY;IACzB,iBAAiB,EAAE,MAAM,CAAA;IACzB,gBAAgB,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,KAAK;IAClB,OAAO,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,YAAY;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,UAAU,EAAE,OAAO,CAAA;IACnB,KAAK,EAAE,KAAK,CAAA;IACZ,KAAK,EAAE,YAAY,CAAA;IACnB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;IAC/C,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,OAAO,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../lib/state/utils.ts"],"names":[],"mappings":"AAAA,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOxF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../lib/state/utils.ts"],"names":[],"mappings":"AAAA,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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { calculateTokensSaved } from "../utils";
|
|
2
1
|
import { buildToolIdList } from "../messages/utils";
|
|
2
|
+
import { calculateTokensSaved } from "./utils";
|
|
3
3
|
/**
|
|
4
4
|
* Deduplication strategy - prunes older tool calls that have identical
|
|
5
5
|
* tool name and parameters, keeping only the most recent occurrence.
|
|
@@ -10,7 +10,7 @@ export const deduplicate = (state, logger, config, messages) => {
|
|
|
10
10
|
return;
|
|
11
11
|
}
|
|
12
12
|
// Build list of all tool call IDs from messages (chronological order)
|
|
13
|
-
const allToolIds = buildToolIdList(messages);
|
|
13
|
+
const allToolIds = buildToolIdList(state, messages, logger);
|
|
14
14
|
if (allToolIds.length === 0) {
|
|
15
15
|
return;
|
|
16
16
|
}
|
|
@@ -48,7 +48,7 @@ export const deduplicate = (state, logger, config, messages) => {
|
|
|
48
48
|
newPruneIds.push(...idsToRemove);
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
|
-
state.stats.totalPruneTokens += calculateTokensSaved(messages, newPruneIds);
|
|
51
|
+
state.stats.totalPruneTokens += calculateTokensSaved(state, messages, newPruneIds);
|
|
52
52
|
if (newPruneIds.length > 0) {
|
|
53
53
|
state.prune.toolIds.push(...newPruneIds);
|
|
54
54
|
logger.debug(`Marked ${newPruneIds.length} duplicate tool calls for pruning`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deduplication.js","sourceRoot":"","sources":["../../../lib/strategies/deduplication.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"deduplication.js","sourceRoot":"","sources":["../../../lib/strategies/deduplication.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAE9C;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACvB,KAAmB,EACnB,MAAc,EACd,MAAoB,EACpB,QAAqB,EACjB,EAAE;IACN,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;QAC3C,OAAM;IACV,CAAC;IAED,sEAAsE;IACtE,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;IAC3D,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAM;IACV,CAAC;IAED,gCAAgC;IAChC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAClD,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IAEnE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAM;IACV,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,cAAc,CAAA;IAErE,yDAAyD;IACzD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoB,CAAA;IAEhD,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC7C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE,EAAE,CAAC,CAAA;YACvD,SAAQ;QACZ,CAAC;QAED,uBAAuB;QACvB,IAAI,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,SAAQ;QACZ,CAAC;QAED,MAAM,SAAS,GAAG,mBAAmB,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAA;QACzE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/B,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;QACnC,CAAC;QACD,YAAY,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACzC,CAAC;IAED,mEAAmE;IACnE,MAAM,WAAW,GAAa,EAAE,CAAA;IAEhC,KAAK,MAAM,CAAC,EAAE,GAAG,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;QAC3C,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjB,iDAAiD;YACjD,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YACpC,WAAW,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAA;QACpC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,gBAAgB,IAAI,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAA;IAElF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAA;QACxC,MAAM,CAAC,KAAK,CAAC,UAAU,WAAW,CAAC,MAAM,mCAAmC,CAAC,CAAA;IACjF,CAAC;AACL,CAAC,CAAA;AAED,SAAS,mBAAmB,CAAC,IAAY,EAAE,UAAgB;IACvD,IAAI,CAAC,UAAU,EAAE,CAAC;QACd,OAAO,IAAI,CAAA;IACf,CAAC;IACD,MAAM,UAAU,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAA;IAClD,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,CAAA;IACzC,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAA;AAC/C,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAW;IACpC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,MAAM,CAAA;IAChE,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAA;IAExC,MAAM,UAAU,GAAQ,EAAE,CAAA;IAC1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAChD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACxC,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QAC3B,CAAC;IACL,CAAC;IACD,OAAO,UAAU,CAAA;AACrB,CAAC;AAED,SAAS,cAAc,CAAC,GAAQ;IAC5B,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,GAAG,CAAA;IACvD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;IAEtD,MAAM,MAAM,GAAQ,EAAE,CAAA;IACtB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;IAC1C,CAAC;IACD,OAAO,MAAM,CAAA;AACjB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"on-idle.d.ts","sourceRoot":"","sources":["../../../lib/strategies/on-idle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAiC,MAAM,UAAU,CAAA;AAC3E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAQ7C,MAAM,WAAW,YAAY;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,EAAE,CAAA;CACtB;
|
|
1
|
+
{"version":3,"file":"on-idle.d.ts","sourceRoot":"","sources":["../../../lib/strategies/on-idle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAiC,MAAM,UAAU,CAAA;AAC3E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAQ7C,MAAM,WAAW,YAAY;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,EAAE,CAAA;CACtB;AAwLD;;;GAGG;AACH,wBAAsB,SAAS,CAC3B,MAAM,EAAE,GAAG,EACX,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,EACpB,gBAAgB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAgHtB"}
|
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { buildAnalysisPrompt } from "../prompt";
|
|
3
3
|
import { selectModel } from "../model-selector";
|
|
4
|
-
import { calculateTokensSaved } from "../utils";
|
|
5
|
-
import { findCurrentAgent } from "../messages/utils";
|
|
6
4
|
import { saveSessionState } from "../state/persistence";
|
|
7
5
|
import { sendUnifiedNotification } from "../ui/notification";
|
|
6
|
+
import { calculateTokensSaved, getCurrentParams } from "./utils";
|
|
7
|
+
import { isMessageCompacted } from "../shared-utils";
|
|
8
8
|
/**
|
|
9
9
|
* Parse messages to extract tool information.
|
|
10
10
|
*/
|
|
11
|
-
function parseMessages(messages, toolParametersCache) {
|
|
11
|
+
function parseMessages(state, messages, toolParametersCache) {
|
|
12
12
|
const toolCallIds = [];
|
|
13
13
|
const toolMetadata = new Map();
|
|
14
14
|
for (const msg of messages) {
|
|
15
|
+
if (isMessageCompacted(state, msg)) {
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
15
18
|
if (msg.parts) {
|
|
16
19
|
for (const part of msg.parts) {
|
|
17
20
|
if (part.type === "tool" && part.callID) {
|
|
@@ -155,8 +158,8 @@ export async function runOnIdle(client, state, logger, config, workingDirectory)
|
|
|
155
158
|
if (!messages || messages.length < 3) {
|
|
156
159
|
return null;
|
|
157
160
|
}
|
|
158
|
-
const
|
|
159
|
-
const { toolCallIds, toolMetadata } = parseMessages(messages, state.toolParameters);
|
|
161
|
+
const currentParams = getCurrentParams(messages, logger);
|
|
162
|
+
const { toolCallIds, toolMetadata } = parseMessages(state, messages, state.toolParameters);
|
|
160
163
|
const alreadyPrunedIds = state.prune.toolIds;
|
|
161
164
|
const unprunedToolCallIds = toolCallIds.filter(id => !alreadyPrunedIds.includes(id));
|
|
162
165
|
if (unprunedToolCallIds.length === 0) {
|
|
@@ -185,7 +188,7 @@ export async function runOnIdle(client, state, logger, config, workingDirectory)
|
|
|
185
188
|
// Update state
|
|
186
189
|
const allPrunedIds = [...new Set([...alreadyPrunedIds, ...newlyPrunedIds])];
|
|
187
190
|
state.prune.toolIds = allPrunedIds;
|
|
188
|
-
state.stats.pruneTokenCounter += calculateTokensSaved(messages, newlyPrunedIds);
|
|
191
|
+
state.stats.pruneTokenCounter += calculateTokensSaved(state, messages, newlyPrunedIds);
|
|
189
192
|
// Build tool metadata map for notification
|
|
190
193
|
const prunedToolMetadata = new Map();
|
|
191
194
|
for (const id of newlyPrunedIds) {
|
|
@@ -196,7 +199,7 @@ export async function runOnIdle(client, state, logger, config, workingDirectory)
|
|
|
196
199
|
}
|
|
197
200
|
// Send notification
|
|
198
201
|
await sendUnifiedNotification(client, logger, config, state, sessionId, newlyPrunedIds, prunedToolMetadata, undefined, // reason
|
|
199
|
-
|
|
202
|
+
currentParams, workingDirectory || "");
|
|
200
203
|
state.stats.totalPruneTokens += state.stats.pruneTokenCounter;
|
|
201
204
|
state.stats.pruneTokenCounter = 0;
|
|
202
205
|
state.nudgeCounter = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"on-idle.js","sourceRoot":"","sources":["../../../lib/strategies/on-idle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"on-idle.js","sourceRoot":"","sources":["../../../lib/strategies/on-idle.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prune-tool.d.ts","sourceRoot":"","sources":["../../../lib/strategies/prune-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAiC,MAAM,UAAU,CAAA;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"prune-tool.d.ts","sourceRoot":"","sources":["../../../lib/strategies/prune-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAiC,MAAM,UAAU,CAAA;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAM7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAOvC,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,GAAG,CAAA;IACX,KAAK,EAAE,YAAY,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,YAAY,CAAA;IACpB,gBAAgB,EAAE,MAAM,CAAA;CAC3B;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC3B,GAAG,EAAE,gBAAgB,GACtB,UAAU,CAAC,OAAO,IAAI,CAAC,CA2GzB"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { tool } from "@opencode-ai/plugin";
|
|
2
|
-
import {
|
|
3
|
-
import { calculateTokensSaved } from "../utils";
|
|
2
|
+
import { buildToolIdList } from "../messages/utils";
|
|
4
3
|
import { sendUnifiedNotification } from "../ui/notification";
|
|
5
|
-
import { formatPruningResultForTool } from "../ui/
|
|
4
|
+
import { formatPruningResultForTool } from "../ui/utils";
|
|
6
5
|
import { ensureSessionInitialized } from "../state";
|
|
7
6
|
import { saveSessionState } from "../state/persistence";
|
|
8
7
|
import { loadPrompt } from "../prompt";
|
|
8
|
+
import { calculateTokensSaved, getCurrentParams } from "./utils";
|
|
9
9
|
/** Tool description loaded from prompts/tool.txt */
|
|
10
10
|
const TOOL_DESCRIPTION = loadPrompt("tool");
|
|
11
11
|
/**
|
|
@@ -21,19 +21,24 @@ export function createPruneTool(ctx) {
|
|
|
21
21
|
async execute(args, toolCtx) {
|
|
22
22
|
const { client, state, logger, config, workingDirectory } = ctx;
|
|
23
23
|
const sessionId = toolCtx.sessionID;
|
|
24
|
+
logger.info("Prune tool invoked");
|
|
25
|
+
logger.info(JSON.stringify(args));
|
|
24
26
|
if (!args.ids || args.ids.length === 0) {
|
|
27
|
+
logger.debug("Prune tool called but args.ids is empty or undefined: " + JSON.stringify(args));
|
|
25
28
|
return "No IDs provided. Check the <prunable-tools> list for available IDs to prune.";
|
|
26
29
|
}
|
|
27
30
|
// Parse reason from first element, numeric IDs from the rest
|
|
28
31
|
const reason = args.ids[0];
|
|
29
32
|
const validReasons = ["completion", "noise", "consolidation"];
|
|
30
33
|
if (typeof reason !== "string" || !validReasons.includes(reason)) {
|
|
34
|
+
logger.debug("Invalid pruning reason provided: " + reason);
|
|
31
35
|
return "No valid pruning reason found. Use 'completion', 'noise', or 'consolidation' as the first element.";
|
|
32
36
|
}
|
|
33
37
|
const numericToolIds = args.ids.slice(1)
|
|
34
38
|
.map(id => parseInt(id, 10))
|
|
35
39
|
.filter((n) => !isNaN(n));
|
|
36
40
|
if (numericToolIds.length === 0) {
|
|
41
|
+
logger.debug("No numeric tool IDs provided for pruning, yet prune tool was called: " + JSON.stringify(args));
|
|
37
42
|
return "No numeric IDs provided. Format: [reason, id1, id2, ...] where reason is 'completion', 'noise', or 'consolidation'.";
|
|
38
43
|
}
|
|
39
44
|
await ensureSessionInitialized(ctx.client, state, sessionId, logger);
|
|
@@ -42,10 +47,11 @@ export function createPruneTool(ctx) {
|
|
|
42
47
|
path: { id: sessionId }
|
|
43
48
|
});
|
|
44
49
|
const messages = messagesResponse.data || messagesResponse;
|
|
45
|
-
const
|
|
46
|
-
const toolIdList = buildToolIdList(messages);
|
|
50
|
+
const currentParams = getCurrentParams(messages, logger);
|
|
51
|
+
const toolIdList = buildToolIdList(state, messages, logger);
|
|
47
52
|
// Validate that all numeric IDs are within bounds
|
|
48
53
|
if (numericToolIds.some(id => id < 0 || id >= toolIdList.length)) {
|
|
54
|
+
logger.debug("Invalid tool IDs provided: " + numericToolIds.join(", "));
|
|
49
55
|
return "Invalid IDs provided. Only use numeric IDs from the <prunable-tools> list.";
|
|
50
56
|
}
|
|
51
57
|
// Check for protected tools (model hallucinated an ID not in the prunable list)
|
|
@@ -68,8 +74,8 @@ export function createPruneTool(ctx) {
|
|
|
68
74
|
logger.debug("No metadata found for ID", { id });
|
|
69
75
|
}
|
|
70
76
|
}
|
|
71
|
-
state.stats.pruneTokenCounter += calculateTokensSaved(messages, pruneToolIds);
|
|
72
|
-
await sendUnifiedNotification(client, logger, config, state, sessionId, pruneToolIds, toolMetadata, reason,
|
|
77
|
+
state.stats.pruneTokenCounter += calculateTokensSaved(state, messages, pruneToolIds);
|
|
78
|
+
await sendUnifiedNotification(client, logger, config, state, sessionId, pruneToolIds, toolMetadata, reason, currentParams, workingDirectory);
|
|
73
79
|
state.stats.totalPruneTokens += state.stats.pruneTokenCounter;
|
|
74
80
|
state.stats.pruneTokenCounter = 0;
|
|
75
81
|
state.nudgeCounter = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prune-tool.js","sourceRoot":"","sources":["../../../lib/strategies/prune-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAG1C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"prune-tool.js","sourceRoot":"","sources":["../../../lib/strategies/prune-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { SessionState, WithParts } from "../state";
|
|
2
|
+
import { Logger } from "../logger";
|
|
3
|
+
export declare function getCurrentParams(messages: WithParts[], logger: Logger): {
|
|
4
|
+
providerId: string | undefined;
|
|
5
|
+
modelId: string | undefined;
|
|
6
|
+
agent: string | undefined;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Calculates approximate tokens saved by pruning the given tool call IDs.
|
|
10
|
+
* TODO: Make it count message content that are not tool outputs. Currently it ONLY covers tool outputs and errors
|
|
11
|
+
*/
|
|
12
|
+
export declare const calculateTokensSaved: (state: SessionState, messages: WithParts[], pruneToolIds: string[]) => number;
|
|
13
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../lib/strategies/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAElD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAIlC,wBAAgB,gBAAgB,CAC5B,QAAQ,EAAE,SAAS,EAAE,EACrB,MAAM,EAAE,MAAM,GACf;IACC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;CAC5B,CAWA;AAaD;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAC7B,OAAO,YAAY,EACnB,UAAU,SAAS,EAAE,EACrB,cAAc,MAAM,EAAE,KACvB,MAwCF,CAAA"}
|