@tarquinen/opencode-dcp 1.0.4 → 1.1.0-beta.2
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 +68 -43
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +47 -17
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +20 -7
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +320 -158
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/hooks.d.ts.map +1 -1
- package/dist/lib/hooks.js +3 -0
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/logger.d.ts +17 -0
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +90 -7
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/messages/prune.d.ts.map +1 -1
- package/dist/lib/messages/prune.js +90 -29
- package/dist/lib/messages/prune.js.map +1 -1
- package/dist/lib/messages/utils.js +7 -7
- package/dist/lib/model-selector.d.ts +3 -3
- package/dist/lib/model-selector.d.ts.map +1 -1
- package/dist/lib/model-selector.js +34 -34
- package/dist/lib/model-selector.js.map +1 -1
- package/dist/lib/prompt.d.ts.map +1 -1
- package/dist/lib/prompt.js +37 -25
- package/dist/lib/prompt.js.map +1 -1
- package/dist/lib/prompts/discard-tool-spec.txt +56 -0
- package/dist/lib/prompts/extract-tool-spec.txt +79 -0
- package/dist/lib/prompts/nudge/nudge-both.txt +10 -0
- package/dist/lib/prompts/nudge/nudge-discard.txt +9 -0
- package/dist/lib/prompts/nudge/nudge-extract.txt +9 -0
- package/dist/lib/prompts/{synthetic.txt → system/system-prompt-both.txt} +23 -13
- package/dist/lib/prompts/system/system-prompt-discard.txt +49 -0
- package/dist/lib/prompts/system/system-prompt-extract.txt +49 -0
- package/dist/lib/shared-utils.d.ts.map +1 -1
- package/dist/lib/shared-utils.js +1 -1
- package/dist/lib/shared-utils.js.map +1 -1
- package/dist/lib/state/persistence.d.ts.map +1 -1
- package/dist/lib/state/persistence.js +4 -7
- package/dist/lib/state/persistence.js.map +1 -1
- package/dist/lib/state/state.d.ts +1 -0
- package/dist/lib/state/state.d.ts.map +1 -1
- package/dist/lib/state/state.js +26 -6
- 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 +24 -10
- package/dist/lib/state/tool-cache.js.map +1 -1
- package/dist/lib/state/types.d.ts +2 -0
- package/dist/lib/state/types.d.ts.map +1 -1
- package/dist/lib/strategies/deduplication.js +4 -4
- package/dist/lib/strategies/deduplication.js.map +1 -1
- package/dist/lib/strategies/index.d.ts +1 -1
- package/dist/lib/strategies/index.d.ts.map +1 -1
- package/dist/lib/strategies/index.js +1 -1
- package/dist/lib/strategies/index.js.map +1 -1
- package/dist/lib/strategies/on-idle.d.ts.map +1 -1
- package/dist/lib/strategies/on-idle.js +25 -24
- package/dist/lib/strategies/on-idle.js.map +1 -1
- package/dist/lib/strategies/supersede-writes.js +4 -4
- package/dist/lib/strategies/supersede-writes.js.map +1 -1
- package/dist/lib/strategies/{prune-tool.d.ts → tools.d.ts} +3 -6
- package/dist/lib/strategies/tools.d.ts.map +1 -0
- package/dist/lib/strategies/tools.js +127 -0
- package/dist/lib/strategies/tools.js.map +1 -0
- package/dist/lib/strategies/utils.d.ts +0 -1
- package/dist/lib/strategies/utils.d.ts.map +1 -1
- package/dist/lib/strategies/utils.js +20 -10
- package/dist/lib/strategies/utils.js.map +1 -1
- package/dist/lib/ui/notification.d.ts +1 -0
- package/dist/lib/ui/notification.d.ts.map +1 -1
- package/dist/lib/ui/notification.js +44 -20
- package/dist/lib/ui/notification.js.map +1 -1
- package/dist/lib/ui/utils.d.ts.map +1 -1
- package/dist/lib/ui/utils.js +9 -9
- package/dist/lib/ui/utils.js.map +1 -1
- package/package.json +61 -58
- package/dist/lib/prompts/nudge.txt +0 -10
- package/dist/lib/prompts/tool.txt +0 -72
- package/dist/lib/strategies/prune-tool.d.ts.map +0 -1
- package/dist/lib/strategies/prune-tool.js +0 -88
- package/dist/lib/strategies/prune-tool.js.map +0 -1
- /package/dist/lib/prompts/{pruning.txt → on-idle-analysis.txt} +0 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
<system-reminder>
|
|
2
|
+
<instruction name=context_management_protocol policy_level=critical>
|
|
3
|
+
|
|
4
|
+
ENVIRONMENT
|
|
5
|
+
You are operating in a context-constrained environment and thus must proactively manage your context window using the `extract` 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 extract.
|
|
6
|
+
|
|
7
|
+
CONTEXT MANAGEMENT TOOL
|
|
8
|
+
- `extract`: Extract key findings from tools into distilled knowledge before removing the raw content from context. Use this to preserve important information while reducing context size.
|
|
9
|
+
|
|
10
|
+
EXTRACT METHODICALLY - BATCH YOUR ACTIONS
|
|
11
|
+
Every tool call adds to your context debt. You MUST pay this down regularly and be on top of context accumulation by extracting. Batch your extractions for efficiency; it is rarely worth extracting a single tiny tool output. Evaluate what SHOULD be extracted before jumping the gun.
|
|
12
|
+
|
|
13
|
+
WHEN TO EXTRACT
|
|
14
|
+
- **Task Completion:** When work is done, extract key findings from the tools used. Scale distillation depth to the value of the content.
|
|
15
|
+
- **Knowledge Preservation:** When you have valuable context you want to preserve but need to reduce size, use high-fidelity distillation. Your distillation must be comprehensive, capturing technical details (signatures, logic, constraints) such that the raw output is no longer needed. THINK: high signal, complete technical substitute.
|
|
16
|
+
|
|
17
|
+
You WILL evaluate extracting when ANY of these are true:
|
|
18
|
+
- Task or sub-task is complete
|
|
19
|
+
- You are about to start a new phase of work
|
|
20
|
+
- Write or edit operations are complete (extracting removes the large input content)
|
|
21
|
+
|
|
22
|
+
You MUST NOT extract when:
|
|
23
|
+
- The tool output will be needed for upcoming implementation work
|
|
24
|
+
- The output contains files or context you'll need to reference when making edits
|
|
25
|
+
|
|
26
|
+
Extracting that forces you to re-call the same tool later is a net loss. Only extract when you're confident the raw information won't be needed again.
|
|
27
|
+
|
|
28
|
+
NOTES
|
|
29
|
+
When in doubt, keep it. Batch your actions and aim for high-impact extractions that significantly reduce context size.
|
|
30
|
+
FAILURE TO EXTRACT will result in context leakage and DEGRADED PERFORMANCES.
|
|
31
|
+
There may be tools in session context that do not appear in the <prunable-tools> list, this is expected, you can ONLY extract what you see in <prunable-tools>.
|
|
32
|
+
|
|
33
|
+
</instruction>
|
|
34
|
+
|
|
35
|
+
<instruction name=injected_context_handling policy_level=critical>
|
|
36
|
+
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. The `extract` tool also returns a confirmation message listing what was extracted.
|
|
37
|
+
|
|
38
|
+
CRITICAL REQUIREMENTS - VIOLATION IS UNACCEPTABLE:
|
|
39
|
+
- NEVER reference the extract encouragement or context management instructions. Do not reply with "I agree" or "Great idea" when the extract encouragement appears.
|
|
40
|
+
- NEVER acknowledge the <prunable-tools> list (e.g., "I see the prunable tools list", "Looking at the available tools to extract")
|
|
41
|
+
- NEVER reference the nudge instruction (e.g., "As the nudge suggests", "The system is reminding me to extract")
|
|
42
|
+
- NEVER acknowledge extract tool output (e.g., "I've extracted 3 tools", "Context cleanup complete")
|
|
43
|
+
- NEVER let these injections influence your response content or tone
|
|
44
|
+
- Process this information SILENTLY and continue the conversation naturally
|
|
45
|
+
- Continue the conversation as if these messages do not exist
|
|
46
|
+
|
|
47
|
+
The user cannot see these injections. Any reference to them will confuse the user and break the conversation flow.
|
|
48
|
+
</instruction>
|
|
49
|
+
</system-reminder>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-utils.d.ts","sourceRoot":"","sources":["../../lib/shared-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAEjD,eAAO,MAAM,kBAAkB,
|
|
1
|
+
{"version":3,"file":"shared-utils.d.ts","sourceRoot":"","sources":["../../lib/shared-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAEjD,eAAO,MAAM,kBAAkB,GAAI,OAAO,YAAY,EAAE,KAAK,SAAS,KAAG,OAExE,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,UAAU,SAAS,EAAE,KAAG,SAAS,GAAG,IAQtE,CAAA"}
|
package/dist/lib/shared-utils.js
CHANGED
|
@@ -4,7 +4,7 @@ export const isMessageCompacted = (state, msg) => {
|
|
|
4
4
|
export const getLastUserMessage = (messages) => {
|
|
5
5
|
for (let i = messages.length - 1; i >= 0; i--) {
|
|
6
6
|
const msg = messages[i];
|
|
7
|
-
if (msg.info.role ===
|
|
7
|
+
if (msg.info.role === "user") {
|
|
8
8
|
return msg;
|
|
9
9
|
}
|
|
10
10
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-utils.js","sourceRoot":"","sources":["../../lib/shared-utils.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAG,
|
|
1
|
+
{"version":3,"file":"shared-utils.js","sourceRoot":"","sources":["../../lib/shared-utils.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAmB,EAAE,GAAc,EAAW,EAAE;IAC/E,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,cAAc,CAAA;AACvD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAqB,EAAoB,EAAE;IAC1E,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"}
|
|
@@ -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,
|
|
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,CAAA;AAEvC,MAAM,WAAW,qBAAqB;IAClC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,KAAK,CAAA;IACZ,KAAK,EAAE,YAAY,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;CACtB;AAcD,wBAAsB,gBAAgB,CAClC,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAED,wBAAsB,gBAAgB,CAClC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACf,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CA8BvC"}
|
|
@@ -26,14 +26,14 @@ export async function saveSessionState(sessionState, logger, sessionName) {
|
|
|
26
26
|
sessionName: sessionName,
|
|
27
27
|
prune: sessionState.prune,
|
|
28
28
|
stats: sessionState.stats,
|
|
29
|
-
lastUpdated: new Date().toISOString()
|
|
29
|
+
lastUpdated: new Date().toISOString(),
|
|
30
30
|
};
|
|
31
31
|
const filePath = getSessionFilePath(sessionState.sessionId);
|
|
32
32
|
const content = JSON.stringify(state, null, 2);
|
|
33
33
|
await fs.writeFile(filePath, content, "utf-8");
|
|
34
34
|
logger.info("Saved session state to disk", {
|
|
35
35
|
sessionId: sessionState.sessionId,
|
|
36
|
-
totalTokensSaved: state.stats.totalPruneTokens
|
|
36
|
+
totalTokensSaved: state.stats.totalPruneTokens,
|
|
37
37
|
});
|
|
38
38
|
}
|
|
39
39
|
catch (error) {
|
|
@@ -51,17 +51,14 @@ export async function loadSessionState(sessionId, logger) {
|
|
|
51
51
|
}
|
|
52
52
|
const content = await fs.readFile(filePath, "utf-8");
|
|
53
53
|
const state = JSON.parse(content);
|
|
54
|
-
if (!state ||
|
|
55
|
-
!state.prune ||
|
|
56
|
-
!Array.isArray(state.prune.toolIds) ||
|
|
57
|
-
!state.stats) {
|
|
54
|
+
if (!state || !state.prune || !Array.isArray(state.prune.toolIds) || !state.stats) {
|
|
58
55
|
logger.warn("Invalid session state file, ignoring", {
|
|
59
56
|
sessionId: sessionId,
|
|
60
57
|
});
|
|
61
58
|
return null;
|
|
62
59
|
}
|
|
63
60
|
logger.info("Loaded session state from disk", {
|
|
64
|
-
sessionId: sessionId
|
|
61
|
+
sessionId: sessionId,
|
|
65
62
|
});
|
|
66
63
|
return state;
|
|
67
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../../lib/state/persistence.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../../lib/state/persistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,4 +4,5 @@ export declare const checkSession: (client: any, state: SessionState, logger: Lo
|
|
|
4
4
|
export declare function createSessionState(): SessionState;
|
|
5
5
|
export declare function resetSessionState(state: SessionState): void;
|
|
6
6
|
export declare function ensureSessionInitialized(client: any, state: SessionState, sessionId: string, logger: Logger, messages: WithParts[]): Promise<void>;
|
|
7
|
+
export declare function countTurns(state: SessionState, messages: WithParts[]): number;
|
|
7
8
|
//# sourceMappingURL=state.d.ts.map
|
|
@@ -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,
|
|
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,CA4Bd,CAAA;AAED,wBAAgB,kBAAkB,IAAI,YAAY,CAiBjD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAe3D;AAED,wBAAsB,wBAAwB,CAC1C,MAAM,EAAE,GAAG,EACX,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,SAAS,EAAE,GACtB,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAYD,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,CAa7E"}
|
package/dist/lib/state/state.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { loadSessionState } from "./persistence";
|
|
2
2
|
import { isSubAgentSession } from "./utils";
|
|
3
|
-
import { getLastUserMessage } from "../shared-utils";
|
|
3
|
+
import { getLastUserMessage, isMessageCompacted } from "../shared-utils";
|
|
4
4
|
export const checkSession = async (client, state, logger, messages) => {
|
|
5
5
|
const lastUserMessage = getLastUserMessage(messages);
|
|
6
6
|
if (!lastUserMessage) {
|
|
@@ -21,15 +21,18 @@ export const checkSession = async (client, state, logger, messages) => {
|
|
|
21
21
|
state.lastCompaction = lastCompactionTimestamp;
|
|
22
22
|
state.toolParameters.clear();
|
|
23
23
|
state.prune.toolIds = [];
|
|
24
|
-
logger.info("Detected compaction from messages - cleared tool cache", {
|
|
24
|
+
logger.info("Detected compaction from messages - cleared tool cache", {
|
|
25
|
+
timestamp: lastCompactionTimestamp,
|
|
26
|
+
});
|
|
25
27
|
}
|
|
28
|
+
state.currentTurn = countTurns(state, messages);
|
|
26
29
|
};
|
|
27
30
|
export function createSessionState() {
|
|
28
31
|
return {
|
|
29
32
|
sessionId: null,
|
|
30
33
|
isSubAgent: false,
|
|
31
34
|
prune: {
|
|
32
|
-
toolIds: []
|
|
35
|
+
toolIds: [],
|
|
33
36
|
},
|
|
34
37
|
stats: {
|
|
35
38
|
pruneTokenCounter: 0,
|
|
@@ -38,14 +41,15 @@ export function createSessionState() {
|
|
|
38
41
|
toolParameters: new Map(),
|
|
39
42
|
nudgeCounter: 0,
|
|
40
43
|
lastToolPrune: false,
|
|
41
|
-
lastCompaction: 0
|
|
44
|
+
lastCompaction: 0,
|
|
45
|
+
currentTurn: 0,
|
|
42
46
|
};
|
|
43
47
|
}
|
|
44
48
|
export function resetSessionState(state) {
|
|
45
49
|
state.sessionId = null;
|
|
46
50
|
state.isSubAgent = false;
|
|
47
51
|
state.prune = {
|
|
48
|
-
toolIds: []
|
|
52
|
+
toolIds: [],
|
|
49
53
|
};
|
|
50
54
|
state.stats = {
|
|
51
55
|
pruneTokenCounter: 0,
|
|
@@ -55,6 +59,7 @@ export function resetSessionState(state) {
|
|
|
55
59
|
state.nudgeCounter = 0;
|
|
56
60
|
state.lastToolPrune = false;
|
|
57
61
|
state.lastCompaction = 0;
|
|
62
|
+
state.currentTurn = 0;
|
|
58
63
|
}
|
|
59
64
|
export async function ensureSessionInitialized(client, state, sessionId, logger, messages) {
|
|
60
65
|
if (state.sessionId === sessionId) {
|
|
@@ -68,12 +73,13 @@ export async function ensureSessionInitialized(client, state, sessionId, logger,
|
|
|
68
73
|
state.isSubAgent = isSubAgent;
|
|
69
74
|
logger.info("isSubAgent = " + isSubAgent);
|
|
70
75
|
state.lastCompaction = findLastCompactionTimestamp(messages);
|
|
76
|
+
state.currentTurn = countTurns(state, messages);
|
|
71
77
|
const persisted = await loadSessionState(sessionId, logger);
|
|
72
78
|
if (persisted === null) {
|
|
73
79
|
return;
|
|
74
80
|
}
|
|
75
81
|
state.prune = {
|
|
76
|
-
toolIds: persisted.prune.toolIds || []
|
|
82
|
+
toolIds: persisted.prune.toolIds || [],
|
|
77
83
|
};
|
|
78
84
|
state.stats = {
|
|
79
85
|
pruneTokenCounter: persisted.stats?.pruneTokenCounter || 0,
|
|
@@ -89,4 +95,18 @@ function findLastCompactionTimestamp(messages) {
|
|
|
89
95
|
}
|
|
90
96
|
return 0;
|
|
91
97
|
}
|
|
98
|
+
export function countTurns(state, messages) {
|
|
99
|
+
let turnCount = 0;
|
|
100
|
+
for (const msg of messages) {
|
|
101
|
+
if (isMessageCompacted(state, msg)) {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
for (const part of msg.parts) {
|
|
105
|
+
if (part.type === "step-start") {
|
|
106
|
+
turnCount++;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return turnCount;
|
|
111
|
+
}
|
|
92
112
|
//# 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,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;
|
|
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;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,
|
|
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,CAmEf;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAajE"}
|
|
@@ -7,39 +7,54 @@ export async function syncToolCache(state, config, logger, messages) {
|
|
|
7
7
|
try {
|
|
8
8
|
logger.info("Syncing tool parameters from OpenCode messages");
|
|
9
9
|
state.nudgeCounter = 0;
|
|
10
|
+
let turnCounter = 0;
|
|
10
11
|
for (const msg of messages) {
|
|
11
12
|
if (isMessageCompacted(state, msg)) {
|
|
12
13
|
continue;
|
|
13
14
|
}
|
|
14
15
|
for (const part of msg.parts) {
|
|
15
|
-
if (part.type
|
|
16
|
+
if (part.type === "step-start") {
|
|
17
|
+
turnCounter++;
|
|
16
18
|
continue;
|
|
17
19
|
}
|
|
18
|
-
if (
|
|
20
|
+
if (part.type !== "tool" || !part.callID) {
|
|
19
21
|
continue;
|
|
20
22
|
}
|
|
21
|
-
|
|
23
|
+
const turnProtectionEnabled = config.turnProtection.enabled;
|
|
24
|
+
const turnProtectionTurns = config.turnProtection.turns;
|
|
25
|
+
const isProtectedByTurn = turnProtectionEnabled &&
|
|
26
|
+
turnProtectionTurns > 0 &&
|
|
27
|
+
state.currentTurn - turnCounter < turnProtectionTurns;
|
|
28
|
+
state.lastToolPrune = part.tool === "discard" || part.tool === "extract";
|
|
29
|
+
const allProtectedTools = config.tools.settings.protectedTools;
|
|
30
|
+
if (part.tool === "discard" || part.tool === "extract") {
|
|
22
31
|
state.nudgeCounter = 0;
|
|
23
32
|
}
|
|
24
|
-
else if (!
|
|
33
|
+
else if (!allProtectedTools.includes(part.tool) && !isProtectedByTurn) {
|
|
25
34
|
state.nudgeCounter++;
|
|
26
35
|
}
|
|
27
|
-
state.
|
|
36
|
+
if (state.toolParameters.has(part.callID)) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (isProtectedByTurn) {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
28
42
|
state.toolParameters.set(part.callID, {
|
|
29
43
|
tool: part.tool,
|
|
30
44
|
parameters: part.state?.input ?? {},
|
|
31
45
|
status: part.state.status,
|
|
32
46
|
error: part.state.status === "error" ? part.state.error : undefined,
|
|
47
|
+
turn: turnCounter,
|
|
33
48
|
});
|
|
34
|
-
logger.info(
|
|
49
|
+
logger.info(`Cached tool id: ${part.callID} (created on turn ${turnCounter})`);
|
|
35
50
|
}
|
|
36
51
|
}
|
|
37
|
-
logger.info(
|
|
52
|
+
logger.info(`Synced cache - size: ${state.toolParameters.size}, currentTurn: ${state.currentTurn}, nudgeCounter: ${state.nudgeCounter}`);
|
|
38
53
|
trimToolParametersCache(state);
|
|
39
54
|
}
|
|
40
55
|
catch (error) {
|
|
41
56
|
logger.warn("Failed to sync tool parameters from OpenCode", {
|
|
42
|
-
error: error instanceof Error ? error.message : String(error)
|
|
57
|
+
error: error instanceof Error ? error.message : String(error),
|
|
43
58
|
});
|
|
44
59
|
}
|
|
45
60
|
}
|
|
@@ -51,8 +66,7 @@ export function trimToolParametersCache(state) {
|
|
|
51
66
|
if (state.toolParameters.size <= MAX_TOOL_CACHE_SIZE) {
|
|
52
67
|
return;
|
|
53
68
|
}
|
|
54
|
-
const keysToRemove = Array.from(state.toolParameters.keys())
|
|
55
|
-
.slice(0, state.toolParameters.size - MAX_TOOL_CACHE_SIZE);
|
|
69
|
+
const keysToRemove = Array.from(state.toolParameters.keys()).slice(0, state.toolParameters.size - MAX_TOOL_CACHE_SIZE);
|
|
56
70
|
for (const key of keysToRemove) {
|
|
57
71
|
state.toolParameters.delete(key);
|
|
58
72
|
}
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
1
|
+
{"version":3,"file":"tool-cache.js","sourceRoot":"","sources":["../../../lib/state/tool-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ export interface ToolParameterEntry {
|
|
|
9
9
|
parameters: any;
|
|
10
10
|
status?: ToolStatus;
|
|
11
11
|
error?: string;
|
|
12
|
+
turn: number;
|
|
12
13
|
}
|
|
13
14
|
export interface SessionStats {
|
|
14
15
|
pruneTokenCounter: number;
|
|
@@ -26,5 +27,6 @@ export interface SessionState {
|
|
|
26
27
|
nudgeCounter: number;
|
|
27
28
|
lastToolPrune: boolean;
|
|
28
29
|
lastCompaction: number;
|
|
30
|
+
currentTurn: number;
|
|
29
31
|
}
|
|
30
32
|
//# 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;IACd,IAAI,EAAE,MAAM,CAAA;CACf;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;IACtB,WAAW,EAAE,MAAM,CAAA;CACtB"}
|
|
@@ -16,7 +16,7 @@ export const deduplicate = (state, logger, config, messages) => {
|
|
|
16
16
|
}
|
|
17
17
|
// Filter out IDs already pruned
|
|
18
18
|
const alreadyPruned = new Set(state.prune.toolIds);
|
|
19
|
-
const unprunedIds = allToolIds.filter(id => !alreadyPruned.has(id));
|
|
19
|
+
const unprunedIds = allToolIds.filter((id) => !alreadyPruned.has(id));
|
|
20
20
|
if (unprunedIds.length === 0) {
|
|
21
21
|
return;
|
|
22
22
|
}
|
|
@@ -26,7 +26,7 @@ export const deduplicate = (state, logger, config, messages) => {
|
|
|
26
26
|
for (const id of unprunedIds) {
|
|
27
27
|
const metadata = state.toolParameters.get(id);
|
|
28
28
|
if (!metadata) {
|
|
29
|
-
logger.warn(`Missing metadata for tool call ID: ${id}`)
|
|
29
|
+
// logger.warn(`Missing metadata for tool call ID: ${id}`)
|
|
30
30
|
continue;
|
|
31
31
|
}
|
|
32
32
|
// Skip protected tools
|
|
@@ -63,7 +63,7 @@ function createToolSignature(tool, parameters) {
|
|
|
63
63
|
return `${tool}::${JSON.stringify(sorted)}`;
|
|
64
64
|
}
|
|
65
65
|
function normalizeParameters(params) {
|
|
66
|
-
if (typeof params !==
|
|
66
|
+
if (typeof params !== "object" || params === null)
|
|
67
67
|
return params;
|
|
68
68
|
if (Array.isArray(params))
|
|
69
69
|
return params;
|
|
@@ -76,7 +76,7 @@ function normalizeParameters(params) {
|
|
|
76
76
|
return normalized;
|
|
77
77
|
}
|
|
78
78
|
function sortObjectKeys(obj) {
|
|
79
|
-
if (typeof obj !==
|
|
79
|
+
if (typeof obj !== "object" || obj === null)
|
|
80
80
|
return obj;
|
|
81
81
|
if (Array.isArray(obj))
|
|
82
82
|
return obj.map(sortObjectKeys);
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
1
|
+
{"version":3,"file":"deduplication.js","sourceRoot":"","sources":["../../../lib/strategies/deduplication.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { deduplicate } from "./deduplication";
|
|
2
2
|
export { runOnIdle } from "./on-idle";
|
|
3
|
-
export {
|
|
3
|
+
export { createDiscardTool, createExtractTool } from "./tools";
|
|
4
4
|
export { supersedeWrites } from "./supersede-writes";
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/strategies/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/strategies/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { deduplicate } from "./deduplication";
|
|
2
2
|
export { runOnIdle } from "./on-idle";
|
|
3
|
-
export {
|
|
3
|
+
export { createDiscardTool, createExtractTool } from "./tools";
|
|
4
4
|
export { supersedeWrites } from "./supersede-writes";
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/strategies/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/strategies/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA"}
|
|
@@ -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;AA6LD;;;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"}
|
|
@@ -25,7 +25,8 @@ function parseMessages(state, messages, toolParametersCache) {
|
|
|
25
25
|
tool: part.tool,
|
|
26
26
|
parameters: parameters,
|
|
27
27
|
status: part.state?.status,
|
|
28
|
-
error: part.state?.status === "error" ? part.state.error : undefined
|
|
28
|
+
error: part.state?.status === "error" ? part.state.error : undefined,
|
|
29
|
+
turn: cachedData?.turn ?? 0,
|
|
29
30
|
});
|
|
30
31
|
}
|
|
31
32
|
}
|
|
@@ -40,13 +41,13 @@ function replacePrunedToolOutputs(messages, prunedIds) {
|
|
|
40
41
|
if (prunedIds.length === 0)
|
|
41
42
|
return messages;
|
|
42
43
|
const prunedIdsSet = new Set(prunedIds);
|
|
43
|
-
return messages.map(msg => {
|
|
44
|
+
return messages.map((msg) => {
|
|
44
45
|
if (!msg.parts)
|
|
45
46
|
return msg;
|
|
46
47
|
return {
|
|
47
48
|
...msg,
|
|
48
49
|
parts: msg.parts.map((part) => {
|
|
49
|
-
if (part.type ===
|
|
50
|
+
if (part.type === "tool" &&
|
|
50
51
|
part.callID &&
|
|
51
52
|
prunedIdsSet.has(part.callID) &&
|
|
52
53
|
part.state?.output) {
|
|
@@ -54,12 +55,12 @@ function replacePrunedToolOutputs(messages, prunedIds) {
|
|
|
54
55
|
...part,
|
|
55
56
|
state: {
|
|
56
57
|
...part.state,
|
|
57
|
-
output:
|
|
58
|
-
}
|
|
58
|
+
output: "[Output removed to save context - information superseded or no longer needed]",
|
|
59
|
+
},
|
|
59
60
|
};
|
|
60
61
|
}
|
|
61
62
|
return part;
|
|
62
|
-
})
|
|
63
|
+
}),
|
|
63
64
|
};
|
|
64
65
|
});
|
|
65
66
|
}
|
|
@@ -68,7 +69,7 @@ function replacePrunedToolOutputs(messages, prunedIds) {
|
|
|
68
69
|
*/
|
|
69
70
|
async function runLlmAnalysis(client, state, logger, config, messages, unprunedToolCallIds, alreadyPrunedIds, toolMetadata, workingDirectory) {
|
|
70
71
|
const protectedToolCallIds = [];
|
|
71
|
-
const prunableToolCallIds = unprunedToolCallIds.filter(id => {
|
|
72
|
+
const prunableToolCallIds = unprunedToolCallIds.filter((id) => {
|
|
72
73
|
const metadata = toolMetadata.get(id);
|
|
73
74
|
if (metadata && config.strategies.onIdle.protectedTools.includes(metadata.tool)) {
|
|
74
75
|
protectedToolCallIds.push(id);
|
|
@@ -87,16 +88,16 @@ async function runLlmAnalysis(client, state, logger, config, messages, unprunedT
|
|
|
87
88
|
if (model?.providerID && model?.modelID) {
|
|
88
89
|
validModelInfo = {
|
|
89
90
|
providerID: model.providerID,
|
|
90
|
-
modelID: model.modelID
|
|
91
|
+
modelID: model.modelID,
|
|
91
92
|
};
|
|
92
93
|
}
|
|
93
94
|
}
|
|
94
95
|
const modelSelection = await selectModel(validModelInfo, logger, config.strategies.onIdle.model, workingDirectory);
|
|
95
96
|
logger.info(`OnIdle Model: ${modelSelection.modelInfo.providerID}/${modelSelection.modelInfo.modelID}`, {
|
|
96
|
-
source: modelSelection.source
|
|
97
|
+
source: modelSelection.source,
|
|
97
98
|
});
|
|
98
99
|
if (modelSelection.failedModel && config.strategies.onIdle.showModelErrorToasts) {
|
|
99
|
-
const skipAi = modelSelection.source ===
|
|
100
|
+
const skipAi = modelSelection.source === "fallback" && config.strategies.onIdle.strictModelSelection;
|
|
100
101
|
try {
|
|
101
102
|
await client.tui.showToast({
|
|
102
103
|
body: {
|
|
@@ -105,19 +106,19 @@ async function runLlmAnalysis(client, state, logger, config, messages, unprunedT
|
|
|
105
106
|
? `${modelSelection.failedModel.providerID}/${modelSelection.failedModel.modelID} failed\nAI analysis skipped (strictModelSelection enabled)`
|
|
106
107
|
: `${modelSelection.failedModel.providerID}/${modelSelection.failedModel.modelID} failed\nUsing ${modelSelection.modelInfo.providerID}/${modelSelection.modelInfo.modelID}`,
|
|
107
108
|
variant: "info",
|
|
108
|
-
duration: 5000
|
|
109
|
-
}
|
|
109
|
+
duration: 5000,
|
|
110
|
+
},
|
|
110
111
|
});
|
|
111
112
|
}
|
|
112
113
|
catch {
|
|
113
114
|
// Ignore toast errors
|
|
114
115
|
}
|
|
115
116
|
}
|
|
116
|
-
if (modelSelection.source ===
|
|
117
|
+
if (modelSelection.source === "fallback" && config.strategies.onIdle.strictModelSelection) {
|
|
117
118
|
logger.info("Skipping AI analysis (fallback model, strictModelSelection enabled)");
|
|
118
119
|
return [];
|
|
119
120
|
}
|
|
120
|
-
const { generateObject } = await import(
|
|
121
|
+
const { generateObject } = await import("ai");
|
|
121
122
|
const sanitizedMessages = replacePrunedToolOutputs(messages, alreadyPrunedIds);
|
|
122
123
|
const analysisPrompt = buildAnalysisPrompt(prunableToolCallIds, sanitizedMessages, alreadyPrunedIds, protectedToolCallIds);
|
|
123
124
|
const result = await generateObject({
|
|
@@ -126,15 +127,15 @@ async function runLlmAnalysis(client, state, logger, config, messages, unprunedT
|
|
|
126
127
|
pruned_tool_call_ids: z.array(z.string()),
|
|
127
128
|
reasoning: z.string(),
|
|
128
129
|
}),
|
|
129
|
-
prompt: analysisPrompt
|
|
130
|
+
prompt: analysisPrompt,
|
|
130
131
|
});
|
|
131
132
|
const rawLlmPrunedIds = result.object.pruned_tool_call_ids;
|
|
132
|
-
const llmPrunedIds = rawLlmPrunedIds.filter(id => prunableToolCallIds.includes(id));
|
|
133
|
+
const llmPrunedIds = rawLlmPrunedIds.filter((id) => prunableToolCallIds.includes(id));
|
|
133
134
|
// Always log LLM output as debug
|
|
134
|
-
const reasoning = result.object.reasoning.replace(/\n+/g,
|
|
135
|
+
const reasoning = result.object.reasoning.replace(/\n+/g, " ").replace(/\s+/g, " ").trim();
|
|
135
136
|
logger.debug(`OnIdle LLM output`, {
|
|
136
137
|
pruned_tool_call_ids: rawLlmPrunedIds,
|
|
137
|
-
reasoning: reasoning
|
|
138
|
+
reasoning: reasoning,
|
|
138
139
|
});
|
|
139
140
|
return llmPrunedIds;
|
|
140
141
|
}
|
|
@@ -151,7 +152,7 @@ export async function runOnIdle(client, state, logger, config, workingDirectory)
|
|
|
151
152
|
// Fetch session info and messages
|
|
152
153
|
const [sessionInfoResponse, messagesResponse] = await Promise.all([
|
|
153
154
|
client.session.get({ path: { id: sessionId } }),
|
|
154
|
-
client.session.messages({ path: { id: sessionId } })
|
|
155
|
+
client.session.messages({ path: { id: sessionId } }),
|
|
155
156
|
]);
|
|
156
157
|
const sessionInfo = sessionInfoResponse.data;
|
|
157
158
|
const messages = messagesResponse.data || messagesResponse;
|
|
@@ -161,12 +162,12 @@ export async function runOnIdle(client, state, logger, config, workingDirectory)
|
|
|
161
162
|
const currentParams = getCurrentParams(messages, logger);
|
|
162
163
|
const { toolCallIds, toolMetadata } = parseMessages(state, messages, state.toolParameters);
|
|
163
164
|
const alreadyPrunedIds = state.prune.toolIds;
|
|
164
|
-
const unprunedToolCallIds = toolCallIds.filter(id => !alreadyPrunedIds.includes(id));
|
|
165
|
+
const unprunedToolCallIds = toolCallIds.filter((id) => !alreadyPrunedIds.includes(id));
|
|
165
166
|
if (unprunedToolCallIds.length === 0) {
|
|
166
167
|
return null;
|
|
167
168
|
}
|
|
168
169
|
// Count prunable tools (excluding protected)
|
|
169
|
-
const candidateCount = unprunedToolCallIds.filter(id => {
|
|
170
|
+
const candidateCount = unprunedToolCallIds.filter((id) => {
|
|
170
171
|
const metadata = toolMetadata.get(id);
|
|
171
172
|
return !metadata || !config.strategies.onIdle.protectedTools.includes(metadata.tool);
|
|
172
173
|
}).length;
|
|
@@ -175,14 +176,14 @@ export async function runOnIdle(client, state, logger, config, workingDirectory)
|
|
|
175
176
|
}
|
|
176
177
|
// Run LLM analysis
|
|
177
178
|
const llmPrunedIds = await runLlmAnalysis(client, state, logger, config, messages, unprunedToolCallIds, alreadyPrunedIds, toolMetadata, workingDirectory);
|
|
178
|
-
const newlyPrunedIds = llmPrunedIds.filter(id => !alreadyPrunedIds.includes(id));
|
|
179
|
+
const newlyPrunedIds = llmPrunedIds.filter((id) => !alreadyPrunedIds.includes(id));
|
|
179
180
|
if (newlyPrunedIds.length === 0) {
|
|
180
181
|
return null;
|
|
181
182
|
}
|
|
182
183
|
// Log the tool IDs being pruned with their tool names
|
|
183
184
|
for (const id of newlyPrunedIds) {
|
|
184
185
|
const metadata = toolMetadata.get(id);
|
|
185
|
-
const toolName = metadata?.tool ||
|
|
186
|
+
const toolName = metadata?.tool || "unknown";
|
|
186
187
|
logger.info(`OnIdle pruning tool: ${toolName}`, { callID: id });
|
|
187
188
|
}
|
|
188
189
|
// Update state
|
|
@@ -206,7 +207,7 @@ export async function runOnIdle(client, state, logger, config, workingDirectory)
|
|
|
206
207
|
state.lastToolPrune = true;
|
|
207
208
|
// Persist state
|
|
208
209
|
const sessionName = sessionInfo?.title;
|
|
209
|
-
saveSessionState(state, logger, sessionName).catch(err => {
|
|
210
|
+
saveSessionState(state, logger, sessionName).catch((err) => {
|
|
210
211
|
logger.error("Failed to persist state", { error: err.message });
|
|
211
212
|
});
|
|
212
213
|
logger.info(`OnIdle: Pruned ${newlyPrunedIds.length}/${candidateCount} tools`);
|