@p4r4d0xb0x/opencode-dcp 3.0.5 → 3.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -26
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7909 -76
- package/dist/index.js.map +1 -1
- package/dist/lib/commands/compression-targets.d.ts +14 -0
- package/dist/lib/commands/compression-targets.d.ts.map +1 -0
- package/dist/lib/commands/context.d.ts.map +1 -1
- package/dist/lib/commands/decompress.d.ts.map +1 -1
- package/dist/lib/commands/index.d.ts +8 -0
- package/dist/lib/commands/index.d.ts.map +1 -0
- package/dist/lib/commands/manual.d.ts +1 -0
- package/dist/lib/commands/manual.d.ts.map +1 -1
- package/dist/lib/commands/recompress.d.ts.map +1 -1
- package/dist/lib/commands/stats.d.ts.map +1 -1
- package/dist/lib/commands/sweep.d.ts.map +1 -1
- package/dist/lib/compress/index.d.ts +4 -0
- package/dist/lib/compress/index.d.ts.map +1 -0
- package/dist/lib/compress/message-utils.d.ts +8 -0
- package/dist/lib/compress/message-utils.d.ts.map +1 -0
- package/dist/lib/compress/message.d.ts +4 -0
- package/dist/lib/compress/message.d.ts.map +1 -0
- package/dist/lib/compress/pipeline.d.ts +29 -0
- package/dist/lib/compress/pipeline.d.ts.map +1 -0
- package/dist/lib/compress/protected-content.d.ts +7 -0
- package/dist/lib/compress/protected-content.d.ts.map +1 -0
- package/dist/lib/compress/range-utils.d.ts +10 -0
- package/dist/lib/compress/range-utils.d.ts.map +1 -0
- package/dist/lib/compress/range.d.ts +4 -0
- package/dist/lib/compress/range.d.ts.map +1 -0
- package/dist/lib/compress/search.d.ts +11 -0
- package/dist/lib/compress/search.d.ts.map +1 -0
- package/dist/lib/compress/state.d.ts +9 -0
- package/dist/lib/compress/state.d.ts.map +1 -0
- package/dist/lib/compress/timing.d.ts +18 -0
- package/dist/lib/compress/timing.d.ts.map +1 -0
- package/dist/lib/compress/types.d.ts +94 -0
- package/dist/lib/compress/types.d.ts.map +1 -0
- package/dist/lib/{shared-utils.d.ts → compress-permission.d.ts} +2 -4
- package/dist/lib/compress-permission.d.ts.map +1 -0
- package/dist/lib/config.d.ts +7 -7
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/hooks.d.ts +4 -1
- package/dist/lib/hooks.d.ts.map +1 -1
- package/dist/lib/message-ids.d.ts +1 -1
- package/dist/lib/message-ids.d.ts.map +1 -1
- package/dist/lib/messages/index.d.ts +2 -0
- package/dist/lib/messages/index.d.ts.map +1 -1
- package/dist/lib/messages/inject/inject.d.ts +3 -2
- package/dist/lib/messages/inject/inject.d.ts.map +1 -1
- package/dist/lib/messages/inject/utils.d.ts +2 -3
- package/dist/lib/messages/inject/utils.d.ts.map +1 -1
- package/dist/lib/messages/priority.d.ts +13 -0
- package/dist/lib/messages/priority.d.ts.map +1 -0
- package/dist/lib/messages/prune.d.ts.map +1 -1
- package/dist/lib/messages/query.d.ts +7 -0
- package/dist/lib/messages/query.d.ts.map +1 -0
- package/dist/lib/messages/shape.d.ts +5 -0
- package/dist/lib/messages/shape.d.ts.map +1 -0
- package/dist/lib/messages/utils.d.ts +10 -4
- package/dist/lib/messages/utils.d.ts.map +1 -1
- package/dist/lib/prompts/compress-message.d.ts +2 -0
- package/dist/lib/prompts/compress-message.d.ts.map +1 -0
- package/dist/lib/prompts/compress-range.d.ts +2 -0
- package/dist/lib/prompts/compress-range.d.ts.map +1 -0
- package/dist/lib/prompts/context-limit-nudge.d.ts +1 -1
- package/dist/lib/prompts/context-limit-nudge.d.ts.map +1 -1
- package/dist/lib/prompts/extensions/nudge.d.ts +5 -0
- package/dist/lib/prompts/extensions/nudge.d.ts.map +1 -0
- package/dist/lib/prompts/extensions/system.d.ts +4 -0
- package/dist/lib/prompts/extensions/system.d.ts.map +1 -0
- package/dist/lib/prompts/extensions/tool.d.ts +3 -0
- package/dist/lib/prompts/extensions/tool.d.ts.map +1 -0
- package/dist/lib/prompts/index.d.ts +2 -1
- package/dist/lib/prompts/index.d.ts.map +1 -1
- package/dist/lib/prompts/iteration-nudge.d.ts +1 -1
- package/dist/lib/prompts/iteration-nudge.d.ts.map +1 -1
- package/dist/lib/prompts/store.d.ts +5 -4
- package/dist/lib/prompts/store.d.ts.map +1 -1
- package/dist/lib/prompts/system.d.ts +1 -1
- package/dist/lib/prompts/system.d.ts.map +1 -1
- package/dist/lib/prompts/turn-nudge.d.ts +1 -1
- package/dist/lib/prompts/turn-nudge.d.ts.map +1 -1
- package/dist/lib/state/index.d.ts +1 -0
- package/dist/lib/state/index.d.ts.map +1 -1
- package/dist/lib/state/persistence.d.ts +1 -0
- package/dist/lib/state/persistence.d.ts.map +1 -1
- package/dist/lib/state/state.d.ts.map +1 -1
- package/dist/lib/state/types.d.ts +10 -1
- package/dist/lib/state/types.d.ts.map +1 -1
- package/dist/lib/state/utils.d.ts +9 -5
- package/dist/lib/state/utils.d.ts.map +1 -1
- package/dist/lib/strategies/index.d.ts +0 -1
- package/dist/lib/strategies/index.d.ts.map +1 -1
- package/dist/lib/{strategies/utils.d.ts → token-utils.d.ts} +6 -8
- package/dist/lib/token-utils.d.ts.map +1 -0
- package/dist/lib/ui/notification.d.ts +8 -1
- package/dist/lib/ui/notification.d.ts.map +1 -1
- package/dist/lib/ui/utils.d.ts +1 -1
- package/dist/lib/ui/utils.d.ts.map +1 -1
- package/dist/lib/update.d.ts +22 -0
- package/dist/lib/update.d.ts.map +1 -0
- package/package.json +26 -15
- package/dist/lib/auth.js +0 -32
- package/dist/lib/auth.js.map +0 -1
- package/dist/lib/commands/context.js +0 -241
- package/dist/lib/commands/context.js.map +0 -1
- package/dist/lib/commands/decompress.js +0 -159
- package/dist/lib/commands/decompress.js.map +0 -1
- package/dist/lib/commands/help.js +0 -52
- package/dist/lib/commands/help.js.map +0 -1
- package/dist/lib/commands/manual.js +0 -48
- package/dist/lib/commands/manual.js.map +0 -1
- package/dist/lib/commands/recompress.js +0 -137
- package/dist/lib/commands/recompress.js.map +0 -1
- package/dist/lib/commands/stats.js +0 -62
- package/dist/lib/commands/stats.js.map +0 -1
- package/dist/lib/commands/sweep.js +0 -194
- package/dist/lib/commands/sweep.js.map +0 -1
- package/dist/lib/config.js +0 -766
- package/dist/lib/config.js.map +0 -1
- package/dist/lib/hooks.js +0 -195
- package/dist/lib/hooks.js.map +0 -1
- package/dist/lib/host-permissions.js +0 -58
- package/dist/lib/host-permissions.js.map +0 -1
- package/dist/lib/logger.js +0 -204
- package/dist/lib/logger.js.map +0 -1
- package/dist/lib/message-ids.js +0 -112
- package/dist/lib/message-ids.js.map +0 -1
- package/dist/lib/messages/index.js +0 -7
- package/dist/lib/messages/index.js.map +0 -1
- package/dist/lib/messages/inject/inject.js +0 -131
- package/dist/lib/messages/inject/inject.js.map +0 -1
- package/dist/lib/messages/inject/subagent-results.js +0 -58
- package/dist/lib/messages/inject/subagent-results.js.map +0 -1
- package/dist/lib/messages/inject/utils.js +0 -198
- package/dist/lib/messages/inject/utils.js.map +0 -1
- package/dist/lib/messages/prune.js +0 -177
- package/dist/lib/messages/prune.js.map +0 -1
- package/dist/lib/messages/reasoning-strip.js +0 -33
- package/dist/lib/messages/reasoning-strip.js.map +0 -1
- package/dist/lib/messages/sync.js +0 -93
- package/dist/lib/messages/sync.js.map +0 -1
- package/dist/lib/messages/utils.js +0 -118
- package/dist/lib/messages/utils.js.map +0 -1
- package/dist/lib/prompts/compress.d.ts +0 -2
- package/dist/lib/prompts/compress.d.ts.map +0 -1
- package/dist/lib/prompts/compress.js +0 -85
- package/dist/lib/prompts/compress.js.map +0 -1
- package/dist/lib/prompts/context-limit-nudge.js +0 -25
- package/dist/lib/prompts/context-limit-nudge.js.map +0 -1
- package/dist/lib/prompts/index.js +0 -19
- package/dist/lib/prompts/index.js.map +0 -1
- package/dist/lib/prompts/internal-overlays.d.ts +0 -5
- package/dist/lib/prompts/internal-overlays.d.ts.map +0 -1
- package/dist/lib/prompts/internal-overlays.js +0 -43
- package/dist/lib/prompts/internal-overlays.js.map +0 -1
- package/dist/lib/prompts/iteration-nudge.js +0 -9
- package/dist/lib/prompts/iteration-nudge.js.map +0 -1
- package/dist/lib/prompts/store.js +0 -346
- package/dist/lib/prompts/store.js.map +0 -1
- package/dist/lib/prompts/system.js +0 -30
- package/dist/lib/prompts/system.js.map +0 -1
- package/dist/lib/prompts/turn-nudge.js +0 -12
- package/dist/lib/prompts/turn-nudge.js.map +0 -1
- package/dist/lib/protected-patterns.js +0 -107
- package/dist/lib/protected-patterns.js.map +0 -1
- package/dist/lib/shared-utils.d.ts.map +0 -1
- package/dist/lib/shared-utils.js +0 -30
- package/dist/lib/shared-utils.js.map +0 -1
- package/dist/lib/state/index.js +0 -4
- package/dist/lib/state/index.js.map +0 -1
- package/dist/lib/state/persistence.js +0 -174
- package/dist/lib/state/persistence.js.map +0 -1
- package/dist/lib/state/state.js +0 -134
- package/dist/lib/state/state.js.map +0 -1
- package/dist/lib/state/tool-cache.js +0 -69
- package/dist/lib/state/tool-cache.js.map +0 -1
- package/dist/lib/state/types.js +0 -2
- package/dist/lib/state/types.js.map +0 -1
- package/dist/lib/state/utils.js +0 -196
- package/dist/lib/state/utils.js.map +0 -1
- package/dist/lib/strategies/deduplication.js +0 -100
- package/dist/lib/strategies/deduplication.js.map +0 -1
- package/dist/lib/strategies/index.js +0 -4
- package/dist/lib/strategies/index.js.map +0 -1
- package/dist/lib/strategies/purge-errors.js +0 -62
- package/dist/lib/strategies/purge-errors.js.map +0 -1
- package/dist/lib/strategies/supersede-writes.d.ts +0 -13
- package/dist/lib/strategies/supersede-writes.d.ts.map +0 -1
- package/dist/lib/strategies/supersede-writes.js +0 -94
- package/dist/lib/strategies/supersede-writes.js.map +0 -1
- package/dist/lib/strategies/utils.d.ts.map +0 -1
- package/dist/lib/strategies/utils.js +0 -128
- package/dist/lib/strategies/utils.js.map +0 -1
- package/dist/lib/subagents/subagent-results.js +0 -52
- package/dist/lib/subagents/subagent-results.js.map +0 -1
- package/dist/lib/tools/compress.d.ts +0 -4
- package/dist/lib/tools/compress.d.ts.map +0 -1
- package/dist/lib/tools/compress.js +0 -110
- package/dist/lib/tools/compress.js.map +0 -1
- package/dist/lib/tools/index.d.ts +0 -3
- package/dist/lib/tools/index.d.ts.map +0 -1
- package/dist/lib/tools/index.js +0 -2
- package/dist/lib/tools/index.js.map +0 -1
- package/dist/lib/tools/types.d.ts +0 -13
- package/dist/lib/tools/types.d.ts.map +0 -1
- package/dist/lib/tools/types.js +0 -2
- package/dist/lib/tools/types.js.map +0 -1
- package/dist/lib/tools/utils.d.ts +0 -80
- package/dist/lib/tools/utils.d.ts.map +0 -1
- package/dist/lib/tools/utils.js +0 -675
- package/dist/lib/tools/utils.js.map +0 -1
- package/dist/lib/ui/notification.js +0 -182
- package/dist/lib/ui/notification.js.map +0 -1
- package/dist/lib/ui/utils.js +0 -255
- package/dist/lib/ui/utils.js.map +0 -1
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import { getFilePathsFromParameters, isFilePathProtected, isToolNameProtected, } from "../protected-patterns";
|
|
2
|
-
import { getTotalToolTokens } from "./utils";
|
|
3
|
-
/**
|
|
4
|
-
* Deduplication strategy - prunes older tool calls that have identical
|
|
5
|
-
* tool name and parameters, keeping only the most recent occurrence.
|
|
6
|
-
* Modifies the session state in place to add pruned tool call IDs.
|
|
7
|
-
*/
|
|
8
|
-
export const deduplicate = (state, logger, config, messages) => {
|
|
9
|
-
if (state.manualMode && !config.manualMode.automaticStrategies) {
|
|
10
|
-
return;
|
|
11
|
-
}
|
|
12
|
-
if (!config.strategies.deduplication.enabled) {
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
const allToolIds = state.toolIdList;
|
|
16
|
-
if (allToolIds.length === 0) {
|
|
17
|
-
return;
|
|
18
|
-
}
|
|
19
|
-
// Filter out IDs already pruned
|
|
20
|
-
const unprunedIds = allToolIds.filter((id) => !state.prune.tools.has(id));
|
|
21
|
-
if (unprunedIds.length === 0) {
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
const protectedTools = config.strategies.deduplication.protectedTools;
|
|
25
|
-
// Group by signature (tool name + normalized parameters)
|
|
26
|
-
const signatureMap = new Map();
|
|
27
|
-
for (const id of unprunedIds) {
|
|
28
|
-
const metadata = state.toolParameters.get(id);
|
|
29
|
-
if (!metadata) {
|
|
30
|
-
// logger.warn(`Missing metadata for tool call ID: ${id}`)
|
|
31
|
-
continue;
|
|
32
|
-
}
|
|
33
|
-
// Skip protected tools
|
|
34
|
-
if (isToolNameProtected(metadata.tool, protectedTools)) {
|
|
35
|
-
continue;
|
|
36
|
-
}
|
|
37
|
-
const filePaths = getFilePathsFromParameters(metadata.tool, metadata.parameters);
|
|
38
|
-
if (isFilePathProtected(filePaths, config.protectedFilePatterns)) {
|
|
39
|
-
continue;
|
|
40
|
-
}
|
|
41
|
-
const signature = createToolSignature(metadata.tool, metadata.parameters);
|
|
42
|
-
if (!signatureMap.has(signature)) {
|
|
43
|
-
signatureMap.set(signature, []);
|
|
44
|
-
}
|
|
45
|
-
const ids = signatureMap.get(signature);
|
|
46
|
-
if (ids) {
|
|
47
|
-
ids.push(id);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
// Find duplicates - keep only the most recent (last) in each group
|
|
51
|
-
const newPruneIds = [];
|
|
52
|
-
for (const [, ids] of signatureMap.entries()) {
|
|
53
|
-
if (ids.length > 1) {
|
|
54
|
-
// All except last (most recent) should be pruned
|
|
55
|
-
const idsToRemove = ids.slice(0, -1);
|
|
56
|
-
newPruneIds.push(...idsToRemove);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
state.stats.totalPruneTokens += getTotalToolTokens(state, newPruneIds);
|
|
60
|
-
if (newPruneIds.length > 0) {
|
|
61
|
-
for (const id of newPruneIds) {
|
|
62
|
-
const entry = state.toolParameters.get(id);
|
|
63
|
-
state.prune.tools.set(id, entry?.tokenCount ?? 0);
|
|
64
|
-
}
|
|
65
|
-
logger.debug(`Marked ${newPruneIds.length} duplicate tool calls for pruning`);
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
|
-
function createToolSignature(tool, parameters) {
|
|
69
|
-
if (!parameters) {
|
|
70
|
-
return tool;
|
|
71
|
-
}
|
|
72
|
-
const normalized = normalizeParameters(parameters);
|
|
73
|
-
const sorted = sortObjectKeys(normalized);
|
|
74
|
-
return `${tool}::${JSON.stringify(sorted)}`;
|
|
75
|
-
}
|
|
76
|
-
function normalizeParameters(params) {
|
|
77
|
-
if (typeof params !== "object" || params === null)
|
|
78
|
-
return params;
|
|
79
|
-
if (Array.isArray(params))
|
|
80
|
-
return params;
|
|
81
|
-
const normalized = {};
|
|
82
|
-
for (const [key, value] of Object.entries(params)) {
|
|
83
|
-
if (value !== undefined && value !== null) {
|
|
84
|
-
normalized[key] = value;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
return normalized;
|
|
88
|
-
}
|
|
89
|
-
function sortObjectKeys(obj) {
|
|
90
|
-
if (typeof obj !== "object" || obj === null)
|
|
91
|
-
return obj;
|
|
92
|
-
if (Array.isArray(obj))
|
|
93
|
-
return obj.map(sortObjectKeys);
|
|
94
|
-
const sorted = {};
|
|
95
|
-
for (const key of Object.keys(obj).sort()) {
|
|
96
|
-
sorted[key] = sortObjectKeys(obj[key]);
|
|
97
|
-
}
|
|
98
|
-
return sorted;
|
|
99
|
-
}
|
|
100
|
-
//# sourceMappingURL=deduplication.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deduplication.js","sourceRoot":"","sources":["../../../lib/strategies/deduplication.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
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,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import { getFilePathsFromParameters, isFilePathProtected, isToolNameProtected, } from "../protected-patterns";
|
|
2
|
-
import { getTotalToolTokens } from "./utils";
|
|
3
|
-
/**
|
|
4
|
-
* Purge Errors strategy - prunes tool inputs for tools that errored
|
|
5
|
-
* after they are older than a configurable number of turns.
|
|
6
|
-
* The error message is preserved, but the (potentially large) inputs
|
|
7
|
-
* are removed to save context.
|
|
8
|
-
*
|
|
9
|
-
* Modifies the session state in place to add pruned tool call IDs.
|
|
10
|
-
*/
|
|
11
|
-
export const purgeErrors = (state, logger, config, messages) => {
|
|
12
|
-
if (state.manualMode && !config.manualMode.automaticStrategies) {
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
if (!config.strategies.purgeErrors.enabled) {
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
const allToolIds = state.toolIdList;
|
|
19
|
-
if (allToolIds.length === 0) {
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
// Filter out IDs already pruned
|
|
23
|
-
const unprunedIds = allToolIds.filter((id) => !state.prune.tools.has(id));
|
|
24
|
-
if (unprunedIds.length === 0) {
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
const protectedTools = config.strategies.purgeErrors.protectedTools;
|
|
28
|
-
const turnThreshold = Math.max(1, config.strategies.purgeErrors.turns);
|
|
29
|
-
const newPruneIds = [];
|
|
30
|
-
for (const id of unprunedIds) {
|
|
31
|
-
const metadata = state.toolParameters.get(id);
|
|
32
|
-
if (!metadata) {
|
|
33
|
-
continue;
|
|
34
|
-
}
|
|
35
|
-
// Skip protected tools
|
|
36
|
-
if (isToolNameProtected(metadata.tool, protectedTools)) {
|
|
37
|
-
continue;
|
|
38
|
-
}
|
|
39
|
-
const filePaths = getFilePathsFromParameters(metadata.tool, metadata.parameters);
|
|
40
|
-
if (isFilePathProtected(filePaths, config.protectedFilePatterns)) {
|
|
41
|
-
continue;
|
|
42
|
-
}
|
|
43
|
-
// Only process error tools
|
|
44
|
-
if (metadata.status !== "error") {
|
|
45
|
-
continue;
|
|
46
|
-
}
|
|
47
|
-
// Check if the tool is old enough to prune
|
|
48
|
-
const turnAge = state.currentTurn - metadata.turn;
|
|
49
|
-
if (turnAge >= turnThreshold) {
|
|
50
|
-
newPruneIds.push(id);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
if (newPruneIds.length > 0) {
|
|
54
|
-
state.stats.totalPruneTokens += getTotalToolTokens(state, newPruneIds);
|
|
55
|
-
for (const id of newPruneIds) {
|
|
56
|
-
const entry = state.toolParameters.get(id);
|
|
57
|
-
state.prune.tools.set(id, entry?.tokenCount ?? 0);
|
|
58
|
-
}
|
|
59
|
-
logger.debug(`Marked ${newPruneIds.length} error tool calls for pruning (older than ${turnThreshold} turns)`);
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
//# sourceMappingURL=purge-errors.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"purge-errors.js","sourceRoot":"","sources":["../../../lib/strategies/purge-errors.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,GACtB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAE5C;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACvB,KAAmB,EACnB,MAAc,EACd,MAAoB,EACpB,QAAqB,EACjB,EAAE;IACN,IAAI,KAAK,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC;QAC7D,OAAM;IACV,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACzC,OAAM;IACV,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAA;IACnC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAM;IACV,CAAC;IAED,gCAAgC;IAChC,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IAEzE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAM;IACV,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,cAAc,CAAA;IACnE,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;IAEtE,MAAM,WAAW,GAAa,EAAE,CAAA;IAEhC,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,SAAQ;QACZ,CAAC;QAED,uBAAuB;QACvB,IAAI,mBAAmB,CAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC;YACrD,SAAQ;QACZ,CAAC;QAED,MAAM,SAAS,GAAG,0BAA0B,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAA;QAChF,IAAI,mBAAmB,CAAC,SAAS,EAAE,MAAM,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAC/D,SAAQ;QACZ,CAAC;QAED,2BAA2B;QAC3B,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC9B,SAAQ;QACZ,CAAC;QAED,2CAA2C;QAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAA;QACjD,IAAI,OAAO,IAAI,aAAa,EAAE,CAAC;YAC3B,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACxB,CAAC;IACL,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,KAAK,CAAC,gBAAgB,IAAI,kBAAkB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;QACtE,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YAC1C,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,IAAI,CAAC,CAAC,CAAA;QACrD,CAAC;QACD,MAAM,CAAC,KAAK,CACR,UAAU,WAAW,CAAC,MAAM,6CAA6C,aAAa,SAAS,CAClG,CAAA;IACL,CAAC;AACL,CAAC,CAAA"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { PluginConfig } from "../config";
|
|
2
|
-
import { Logger } from "../logger";
|
|
3
|
-
import type { SessionState, WithParts } from "../state";
|
|
4
|
-
/**
|
|
5
|
-
* Supersede Writes strategy - prunes write tool inputs for files that have
|
|
6
|
-
* subsequently been read. When a file is written and later read, the original
|
|
7
|
-
* write content becomes redundant since the current file state is captured
|
|
8
|
-
* in the read result.
|
|
9
|
-
*
|
|
10
|
-
* Modifies the session state in place to add pruned tool call IDs.
|
|
11
|
-
*/
|
|
12
|
-
export declare const supersedeWrites: (state: SessionState, logger: Logger, config: PluginConfig, messages: WithParts[]) => void;
|
|
13
|
-
//# sourceMappingURL=supersede-writes.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"supersede-writes.d.ts","sourceRoot":"","sources":["../../../lib/strategies/supersede-writes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAClC,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAIvD;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GACxB,OAAO,YAAY,EACnB,QAAQ,MAAM,EACd,QAAQ,YAAY,EACpB,UAAU,SAAS,EAAE,KACtB,IA+FF,CAAA"}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import { getFilePathsFromParameters, isFilePathProtected } from "../protected-patterns";
|
|
2
|
-
import { getTotalToolTokens } from "./utils";
|
|
3
|
-
/**
|
|
4
|
-
* Supersede Writes strategy - prunes write tool inputs for files that have
|
|
5
|
-
* subsequently been read. When a file is written and later read, the original
|
|
6
|
-
* write content becomes redundant since the current file state is captured
|
|
7
|
-
* in the read result.
|
|
8
|
-
*
|
|
9
|
-
* Modifies the session state in place to add pruned tool call IDs.
|
|
10
|
-
*/
|
|
11
|
-
export const supersedeWrites = (state, logger, config, messages) => {
|
|
12
|
-
if (state.manualMode && !config.manualMode.automaticStrategies) {
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
if (!config.strategies.supersedeWrites.enabled) {
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
const allToolIds = state.toolIdList;
|
|
19
|
-
if (allToolIds.length === 0) {
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
// Filter out IDs already pruned
|
|
23
|
-
const unprunedIds = allToolIds.filter((id) => !state.prune.tools.has(id));
|
|
24
|
-
if (unprunedIds.length === 0) {
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
// Track write tools by file path: filePath -> [{ id, index }]
|
|
28
|
-
// We track index to determine chronological order
|
|
29
|
-
const writesByFile = new Map();
|
|
30
|
-
// Track read file paths with their index
|
|
31
|
-
const readsByFile = new Map();
|
|
32
|
-
for (let i = 0; i < allToolIds.length; i++) {
|
|
33
|
-
const id = allToolIds[i];
|
|
34
|
-
const metadata = state.toolParameters.get(id);
|
|
35
|
-
if (!metadata) {
|
|
36
|
-
continue;
|
|
37
|
-
}
|
|
38
|
-
const filePaths = getFilePathsFromParameters(metadata.tool, metadata.parameters);
|
|
39
|
-
if (filePaths.length === 0) {
|
|
40
|
-
continue;
|
|
41
|
-
}
|
|
42
|
-
const filePath = filePaths[0];
|
|
43
|
-
if (isFilePathProtected(filePaths, config.protectedFilePatterns)) {
|
|
44
|
-
continue;
|
|
45
|
-
}
|
|
46
|
-
if (metadata.tool === "write") {
|
|
47
|
-
if (!writesByFile.has(filePath)) {
|
|
48
|
-
writesByFile.set(filePath, []);
|
|
49
|
-
}
|
|
50
|
-
const writes = writesByFile.get(filePath);
|
|
51
|
-
if (writes) {
|
|
52
|
-
writes.push({ id, index: i });
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
else if (metadata.tool === "read") {
|
|
56
|
-
if (!readsByFile.has(filePath)) {
|
|
57
|
-
readsByFile.set(filePath, []);
|
|
58
|
-
}
|
|
59
|
-
const reads = readsByFile.get(filePath);
|
|
60
|
-
if (reads) {
|
|
61
|
-
reads.push(i);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
// Find writes that are superseded by subsequent reads
|
|
66
|
-
const newPruneIds = [];
|
|
67
|
-
for (const [filePath, writes] of writesByFile.entries()) {
|
|
68
|
-
const reads = readsByFile.get(filePath);
|
|
69
|
-
if (!reads || reads.length === 0) {
|
|
70
|
-
continue;
|
|
71
|
-
}
|
|
72
|
-
// For each write, check if there's a read that comes after it
|
|
73
|
-
for (const write of writes) {
|
|
74
|
-
// Skip if already pruned
|
|
75
|
-
if (state.prune.tools.has(write.id)) {
|
|
76
|
-
continue;
|
|
77
|
-
}
|
|
78
|
-
// Check if any read comes after this write
|
|
79
|
-
const hasSubsequentRead = reads.some((readIndex) => readIndex > write.index);
|
|
80
|
-
if (hasSubsequentRead) {
|
|
81
|
-
newPruneIds.push(write.id);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
if (newPruneIds.length > 0) {
|
|
86
|
-
state.stats.totalPruneTokens += getTotalToolTokens(state, newPruneIds);
|
|
87
|
-
for (const id of newPruneIds) {
|
|
88
|
-
const entry = state.toolParameters.get(id);
|
|
89
|
-
state.prune.tools.set(id, entry?.tokenCount ?? 0);
|
|
90
|
-
}
|
|
91
|
-
logger.debug(`Marked ${newPruneIds.length} superseded write tool calls for pruning`);
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
//# sourceMappingURL=supersede-writes.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"supersede-writes.js","sourceRoot":"","sources":["../../../lib/strategies/supersede-writes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
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;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,CAgBlE;AAED,wBAAgB,gBAAgB,CAC5B,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,SAAS,EAAE,EACrB,MAAM,EAAE,MAAM,GACf;IACC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;CAC9B,CAkBA;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOhD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAG3D;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,EAAE,CAqCtD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,CAGjD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAOjF;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM,CAU7D;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM,CAY5D"}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import { countTokens as anthropicCountTokens } from "@anthropic-ai/tokenizer";
|
|
2
|
-
import { getLastUserMessage } from "../shared-utils";
|
|
3
|
-
/**
|
|
4
|
-
* Get current token usage from the last assistant message.
|
|
5
|
-
* Returns total tokens (input + output + reasoning + cache).
|
|
6
|
-
*/
|
|
7
|
-
export function getCurrentTokenUsage(messages) {
|
|
8
|
-
for (let i = messages.length - 1; i >= 0; i--) {
|
|
9
|
-
const msg = messages[i];
|
|
10
|
-
if (msg.info.role === "assistant") {
|
|
11
|
-
const assistantInfo = msg.info;
|
|
12
|
-
if (assistantInfo.tokens?.output > 0) {
|
|
13
|
-
const input = assistantInfo.tokens?.input || 0;
|
|
14
|
-
const output = assistantInfo.tokens?.output || 0;
|
|
15
|
-
const reasoning = assistantInfo.tokens?.reasoning || 0;
|
|
16
|
-
const cacheRead = assistantInfo.tokens?.cache?.read || 0;
|
|
17
|
-
const cacheWrite = assistantInfo.tokens?.cache?.write || 0;
|
|
18
|
-
return input + output + reasoning + cacheRead + cacheWrite;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
return 0;
|
|
23
|
-
}
|
|
24
|
-
export function getCurrentParams(state, messages, logger) {
|
|
25
|
-
const userMsg = getLastUserMessage(messages);
|
|
26
|
-
if (!userMsg) {
|
|
27
|
-
logger.debug("No user message found when determining current params");
|
|
28
|
-
return {
|
|
29
|
-
providerId: undefined,
|
|
30
|
-
modelId: undefined,
|
|
31
|
-
agent: undefined,
|
|
32
|
-
variant: state.variant,
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
const userInfo = userMsg.info;
|
|
36
|
-
const agent = userInfo.agent;
|
|
37
|
-
const providerId = userInfo.model.providerID;
|
|
38
|
-
const modelId = userInfo.model.modelID;
|
|
39
|
-
const variant = state.variant ?? userInfo.variant;
|
|
40
|
-
return { providerId, modelId, agent, variant };
|
|
41
|
-
}
|
|
42
|
-
export function countTokens(text) {
|
|
43
|
-
if (!text)
|
|
44
|
-
return 0;
|
|
45
|
-
try {
|
|
46
|
-
return anthropicCountTokens(text);
|
|
47
|
-
}
|
|
48
|
-
catch {
|
|
49
|
-
return Math.round(text.length / 4);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
export function estimateTokensBatch(texts) {
|
|
53
|
-
if (texts.length === 0)
|
|
54
|
-
return 0;
|
|
55
|
-
return countTokens(texts.join(" "));
|
|
56
|
-
}
|
|
57
|
-
export function extractToolContent(part) {
|
|
58
|
-
const contents = [];
|
|
59
|
-
if (part.tool === "question") {
|
|
60
|
-
const questions = part.state?.input?.questions;
|
|
61
|
-
if (questions !== undefined) {
|
|
62
|
-
const content = typeof questions === "string" ? questions : JSON.stringify(questions);
|
|
63
|
-
contents.push(content);
|
|
64
|
-
}
|
|
65
|
-
return contents;
|
|
66
|
-
}
|
|
67
|
-
if (part.tool === "edit" || part.tool === "write") {
|
|
68
|
-
if (part.state?.input) {
|
|
69
|
-
const inputContent = typeof part.state.input === "string"
|
|
70
|
-
? part.state.input
|
|
71
|
-
: JSON.stringify(part.state.input);
|
|
72
|
-
contents.push(inputContent);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
if (part.state?.status === "completed" && part.state?.output) {
|
|
76
|
-
const content = typeof part.state.output === "string"
|
|
77
|
-
? part.state.output
|
|
78
|
-
: JSON.stringify(part.state.output);
|
|
79
|
-
contents.push(content);
|
|
80
|
-
}
|
|
81
|
-
else if (part.state?.status === "error" && part.state?.error) {
|
|
82
|
-
const content = typeof part.state.error === "string"
|
|
83
|
-
? part.state.error
|
|
84
|
-
: JSON.stringify(part.state.error);
|
|
85
|
-
contents.push(content);
|
|
86
|
-
}
|
|
87
|
-
return contents;
|
|
88
|
-
}
|
|
89
|
-
export function countToolTokens(part) {
|
|
90
|
-
const contents = extractToolContent(part);
|
|
91
|
-
return estimateTokensBatch(contents);
|
|
92
|
-
}
|
|
93
|
-
export function getTotalToolTokens(state, toolIds) {
|
|
94
|
-
let total = 0;
|
|
95
|
-
for (const id of toolIds) {
|
|
96
|
-
const entry = state.toolParameters.get(id);
|
|
97
|
-
total += entry?.tokenCount ?? 0;
|
|
98
|
-
}
|
|
99
|
-
return total;
|
|
100
|
-
}
|
|
101
|
-
export function countMessageTextTokens(msg) {
|
|
102
|
-
const texts = [];
|
|
103
|
-
const parts = Array.isArray(msg.parts) ? msg.parts : [];
|
|
104
|
-
for (const part of parts) {
|
|
105
|
-
if (part.type === "text") {
|
|
106
|
-
texts.push(part.text);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
if (texts.length === 0)
|
|
110
|
-
return 0;
|
|
111
|
-
return estimateTokensBatch(texts);
|
|
112
|
-
}
|
|
113
|
-
export function countAllMessageTokens(msg) {
|
|
114
|
-
const parts = Array.isArray(msg.parts) ? msg.parts : [];
|
|
115
|
-
const texts = [];
|
|
116
|
-
for (const part of parts) {
|
|
117
|
-
if (part.type === "text") {
|
|
118
|
-
texts.push(part.text);
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
texts.push(...extractToolContent(part));
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
if (texts.length === 0)
|
|
125
|
-
return 0;
|
|
126
|
-
return estimateTokensBatch(texts);
|
|
127
|
-
}
|
|
128
|
-
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../lib/strategies/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
const SUB_AGENT_RESULT_BLOCK_REGEX = /(<task_result>\s*)([\s\S]*?)(\s*<\/task_result>)/i;
|
|
2
|
-
export function getSubAgentId(part) {
|
|
3
|
-
const sessionId = part?.state?.metadata?.sessionId;
|
|
4
|
-
if (typeof sessionId !== "string") {
|
|
5
|
-
return null;
|
|
6
|
-
}
|
|
7
|
-
const value = sessionId.trim();
|
|
8
|
-
return value.length > 0 ? value : null;
|
|
9
|
-
}
|
|
10
|
-
export function buildSubagentResultText(messages) {
|
|
11
|
-
const assistantMessages = messages.filter((message) => message.info.role === "assistant");
|
|
12
|
-
if (assistantMessages.length === 0) {
|
|
13
|
-
return "";
|
|
14
|
-
}
|
|
15
|
-
const lastAssistant = assistantMessages[assistantMessages.length - 1];
|
|
16
|
-
const lastText = getLastTextPart(lastAssistant);
|
|
17
|
-
if (assistantMessages.length < 2) {
|
|
18
|
-
return lastText;
|
|
19
|
-
}
|
|
20
|
-
const secondToLastAssistant = assistantMessages[assistantMessages.length - 2];
|
|
21
|
-
if (!assistantMessageHasCompressTool(secondToLastAssistant)) {
|
|
22
|
-
return lastText;
|
|
23
|
-
}
|
|
24
|
-
const secondToLastText = getLastTextPart(secondToLastAssistant);
|
|
25
|
-
return [secondToLastText, lastText].filter((text) => text.length > 0).join("\n\n");
|
|
26
|
-
}
|
|
27
|
-
export function mergeSubagentResult(output, subAgentResultText) {
|
|
28
|
-
if (!subAgentResultText || typeof output !== "string") {
|
|
29
|
-
return output;
|
|
30
|
-
}
|
|
31
|
-
return output.replace(SUB_AGENT_RESULT_BLOCK_REGEX, (_match, openTag, _body, closeTag) => `${openTag}${subAgentResultText}${closeTag}`);
|
|
32
|
-
}
|
|
33
|
-
function getLastTextPart(message) {
|
|
34
|
-
const parts = Array.isArray(message.parts) ? message.parts : [];
|
|
35
|
-
for (let index = parts.length - 1; index >= 0; index--) {
|
|
36
|
-
const part = parts[index];
|
|
37
|
-
if (part.type !== "text" || typeof part.text !== "string") {
|
|
38
|
-
continue;
|
|
39
|
-
}
|
|
40
|
-
const text = part.text.trim();
|
|
41
|
-
if (!text) {
|
|
42
|
-
continue;
|
|
43
|
-
}
|
|
44
|
-
return text;
|
|
45
|
-
}
|
|
46
|
-
return "";
|
|
47
|
-
}
|
|
48
|
-
function assistantMessageHasCompressTool(message) {
|
|
49
|
-
const parts = Array.isArray(message.parts) ? message.parts : [];
|
|
50
|
-
return parts.some((part) => part.type === "tool" && part.tool === "compress" && part.state?.status === "completed");
|
|
51
|
-
}
|
|
52
|
-
//# sourceMappingURL=subagent-results.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-results.js","sourceRoot":"","sources":["../../../lib/subagents/subagent-results.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"compress.d.ts","sourceRoot":"","sources":["../../../lib/tools/compress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAyE1C,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAqJ5E"}
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import { tool } from "@opencode-ai/plugin";
|
|
2
|
-
import { ensureSessionInitialized } from "../state";
|
|
3
|
-
import { appendMissingBlockSummaries, appendProtectedUserMessages, appendProtectedTools, wrapCompressedSummary, allocateBlockId, applyCompressionState, buildSearchContext, fetchSessionMessages, COMPRESSED_BLOCK_HEADER, injectBlockPlaceholders, parseBlockPlaceholders, resolveAnchorMessageId, resolveBoundaryIds, resolveRange, normalizeCompressArgs, validateCompressArgs, validateSummaryPlaceholders, } from "./utils";
|
|
4
|
-
import { isIgnoredUserMessage } from "../messages/utils";
|
|
5
|
-
import { assignMessageRefs } from "../message-ids";
|
|
6
|
-
import { getCurrentParams, getCurrentTokenUsage, countTokens } from "../strategies/utils";
|
|
7
|
-
import { deduplicate, purgeErrors } from "../strategies";
|
|
8
|
-
import { saveSessionState } from "../state/persistence";
|
|
9
|
-
import { sendCompressNotification } from "../ui/notification";
|
|
10
|
-
import { NESTED_FORMAT_OVERLAY, FLAT_FORMAT_OVERLAY } from "../prompts/internal-overlays";
|
|
11
|
-
// This schema looks better in the TUI (non primitive args aren't displayed), but LLMs are more likely to fail
|
|
12
|
-
// the tool call
|
|
13
|
-
function buildNestedSchema() {
|
|
14
|
-
return {
|
|
15
|
-
topic: tool.schema
|
|
16
|
-
.string()
|
|
17
|
-
.describe("Short label (3-5 words) for display - e.g., 'Auth System Exploration'"),
|
|
18
|
-
content: tool.schema
|
|
19
|
-
.object({
|
|
20
|
-
startId: tool.schema
|
|
21
|
-
.string()
|
|
22
|
-
.describe("Message or block ID marking the beginning of range (e.g. m0001, b2)"),
|
|
23
|
-
endId: tool.schema
|
|
24
|
-
.string()
|
|
25
|
-
.describe("Message or block ID marking the end of range (e.g. m0012, b5)"),
|
|
26
|
-
summary: tool.schema
|
|
27
|
-
.string()
|
|
28
|
-
.describe("Complete technical summary replacing all content in range"),
|
|
29
|
-
})
|
|
30
|
-
.describe("Compression details: ID boundaries and replacement summary"),
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
// Simpler schema for models that are not as good at tool calling reliably
|
|
34
|
-
function buildFlatSchema() {
|
|
35
|
-
return {
|
|
36
|
-
topic: tool.schema
|
|
37
|
-
.string()
|
|
38
|
-
.describe("Short label (3-5 words) for display - e.g., 'Auth System Exploration'"),
|
|
39
|
-
startId: tool.schema
|
|
40
|
-
.string()
|
|
41
|
-
.describe("Message or block ID marking the beginning of range (e.g. m0001, b2)"),
|
|
42
|
-
endId: tool.schema
|
|
43
|
-
.string()
|
|
44
|
-
.describe("Message or block ID marking the end of range (e.g. m0012, b5)"),
|
|
45
|
-
summary: tool.schema
|
|
46
|
-
.string()
|
|
47
|
-
.describe("Complete technical summary replacing all content in range"),
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
export function createCompressTool(ctx) {
|
|
51
|
-
ctx.prompts.reload();
|
|
52
|
-
const runtimePrompts = ctx.prompts.getRuntimePrompts();
|
|
53
|
-
const useFlatSchema = ctx.config.compress.flatSchema;
|
|
54
|
-
return tool({
|
|
55
|
-
description: runtimePrompts.compress + (useFlatSchema ? FLAT_FORMAT_OVERLAY : NESTED_FORMAT_OVERLAY),
|
|
56
|
-
args: useFlatSchema ? buildFlatSchema() : buildNestedSchema(),
|
|
57
|
-
async execute(args, toolCtx) {
|
|
58
|
-
if (ctx.state.manualMode && ctx.state.manualMode !== "compress-pending") {
|
|
59
|
-
throw new Error("Manual mode: compress blocked. Do not retry until `<compress triggered manually>` appears in user context.");
|
|
60
|
-
}
|
|
61
|
-
await toolCtx.ask({
|
|
62
|
-
permission: "compress",
|
|
63
|
-
patterns: ["*"],
|
|
64
|
-
always: ["*"],
|
|
65
|
-
metadata: {},
|
|
66
|
-
});
|
|
67
|
-
const compressArgs = normalizeCompressArgs(args);
|
|
68
|
-
validateCompressArgs(compressArgs);
|
|
69
|
-
toolCtx.metadata({
|
|
70
|
-
title: `Compress: ${compressArgs.topic}`,
|
|
71
|
-
});
|
|
72
|
-
const rawMessages = await fetchSessionMessages(ctx.client, toolCtx.sessionID);
|
|
73
|
-
await ensureSessionInitialized(ctx.client, ctx.state, toolCtx.sessionID, ctx.logger, rawMessages, ctx.config.manualMode.enabled);
|
|
74
|
-
assignMessageRefs(ctx.state, rawMessages);
|
|
75
|
-
deduplicate(ctx.state, ctx.logger, ctx.config, rawMessages);
|
|
76
|
-
// supersedeWrites(ctx.state, ctx.logger, ctx.config, rawMessages)
|
|
77
|
-
purgeErrors(ctx.state, ctx.logger, ctx.config, rawMessages);
|
|
78
|
-
const searchContext = buildSearchContext(ctx.state, rawMessages);
|
|
79
|
-
const { startReference, endReference } = resolveBoundaryIds(searchContext, ctx.state, compressArgs.content.startId, compressArgs.content.endId);
|
|
80
|
-
const range = resolveRange(searchContext, startReference, endReference);
|
|
81
|
-
const anchorMessageId = resolveAnchorMessageId(range.startReference);
|
|
82
|
-
const parsedPlaceholders = parseBlockPlaceholders(compressArgs.content.summary);
|
|
83
|
-
const missingRequiredBlockIds = validateSummaryPlaceholders(parsedPlaceholders, range.requiredBlockIds, range.startReference, range.endReference, searchContext.summaryByBlockId);
|
|
84
|
-
const injected = injectBlockPlaceholders(compressArgs.content.summary, parsedPlaceholders, searchContext.summaryByBlockId, range.startReference, range.endReference);
|
|
85
|
-
const summaryWithUserMessages = appendProtectedUserMessages(injected.expandedSummary, range, searchContext, ctx.state, ctx.config.compress.protectUserMessages);
|
|
86
|
-
const summaryWithProtectedTools = await appendProtectedTools(ctx.client, ctx.state, ctx.config.experimental.allowSubAgents, summaryWithUserMessages, range, searchContext, ctx.config.compress.protectedTools, ctx.config.protectedFilePatterns);
|
|
87
|
-
const finalSummaryResult = appendMissingBlockSummaries(summaryWithProtectedTools, missingRequiredBlockIds, searchContext.summaryByBlockId, injected.consumedBlockIds);
|
|
88
|
-
const finalSummary = finalSummaryResult.expandedSummary;
|
|
89
|
-
const blockId = allocateBlockId(ctx.state);
|
|
90
|
-
const storedSummary = wrapCompressedSummary(blockId, finalSummary);
|
|
91
|
-
const summaryTokens = countTokens(storedSummary);
|
|
92
|
-
const applied = applyCompressionState(ctx.state, {
|
|
93
|
-
topic: compressArgs.topic,
|
|
94
|
-
startId: compressArgs.content.startId,
|
|
95
|
-
endId: compressArgs.content.endId,
|
|
96
|
-
compressMessageId: toolCtx.messageID,
|
|
97
|
-
}, range, anchorMessageId, blockId, storedSummary, finalSummaryResult.consumedBlockIds);
|
|
98
|
-
ctx.state.manualMode = ctx.state.manualMode ? "active" : false;
|
|
99
|
-
await saveSessionState(ctx.state, ctx.logger);
|
|
100
|
-
const params = getCurrentParams(ctx.state, rawMessages, ctx.logger);
|
|
101
|
-
const totalSessionTokens = getCurrentTokenUsage(rawMessages);
|
|
102
|
-
const sessionMessageIds = rawMessages
|
|
103
|
-
.filter((msg) => !(msg.info.role === "user" && isIgnoredUserMessage(msg)))
|
|
104
|
-
.map((msg) => msg.info.id);
|
|
105
|
-
await sendCompressNotification(ctx.client, ctx.logger, ctx.config, ctx.state, toolCtx.sessionID, blockId, compressArgs.content.summary, summaryTokens, totalSessionTokens, sessionMessageIds, params);
|
|
106
|
-
return `Compressed ${applied.messageIds.length} messages into ${COMPRESSED_BLOCK_HEADER}.`;
|
|
107
|
-
},
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
//# sourceMappingURL=compress.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"compress.js","sourceRoot":"","sources":["../../../lib/tools/compress.ts"],"names":[],"mappings":"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"}
|