@p4r4d0xb0x/opencode-dcp 3.0.5
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/LICENSE +619 -0
- package/README.md +229 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +88 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/auth.d.ts +4 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +32 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/commands/context.d.ts +52 -0
- package/dist/lib/commands/context.d.ts.map +1 -0
- package/dist/lib/commands/context.js +241 -0
- package/dist/lib/commands/context.js.map +1 -0
- package/dist/lib/commands/decompress.d.ts +12 -0
- package/dist/lib/commands/decompress.d.ts.map +1 -0
- package/dist/lib/commands/decompress.js +159 -0
- package/dist/lib/commands/decompress.js.map +1 -0
- package/dist/lib/commands/help.d.ts +17 -0
- package/dist/lib/commands/help.d.ts.map +1 -0
- package/dist/lib/commands/help.js +52 -0
- package/dist/lib/commands/help.js.map +1 -0
- package/dist/lib/commands/manual.d.ts +22 -0
- package/dist/lib/commands/manual.d.ts.map +1 -0
- package/dist/lib/commands/manual.js +48 -0
- package/dist/lib/commands/manual.js.map +1 -0
- package/dist/lib/commands/recompress.d.ts +12 -0
- package/dist/lib/commands/recompress.d.ts.map +1 -0
- package/dist/lib/commands/recompress.js +137 -0
- package/dist/lib/commands/recompress.js.map +1 -0
- package/dist/lib/commands/stats.d.ts +15 -0
- package/dist/lib/commands/stats.d.ts.map +1 -0
- package/dist/lib/commands/stats.js +62 -0
- package/dist/lib/commands/stats.js.map +1 -0
- package/dist/lib/commands/sweep.d.ts +23 -0
- package/dist/lib/commands/sweep.d.ts.map +1 -0
- package/dist/lib/commands/sweep.js +194 -0
- package/dist/lib/commands/sweep.js.map +1 -0
- package/dist/lib/config.d.ts +72 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +766 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/hooks.d.ts +33 -0
- package/dist/lib/hooks.d.ts.map +1 -0
- package/dist/lib/hooks.js +195 -0
- package/dist/lib/hooks.js.map +1 -0
- package/dist/lib/host-permissions.d.ts +11 -0
- package/dist/lib/host-permissions.d.ts.map +1 -0
- package/dist/lib/host-permissions.js +58 -0
- package/dist/lib/host-permissions.js.map +1 -0
- package/dist/lib/logger.d.ts +31 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +204 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/message-ids.d.ts +19 -0
- package/dist/lib/message-ids.d.ts.map +1 -0
- package/dist/lib/message-ids.js +112 -0
- package/dist/lib/message-ids.js.map +1 -0
- package/dist/lib/messages/index.d.ts +7 -0
- package/dist/lib/messages/index.d.ts.map +1 -0
- package/dist/lib/messages/index.js +7 -0
- package/dist/lib/messages/index.js.map +1 -0
- package/dist/lib/messages/inject/inject.d.ts +7 -0
- package/dist/lib/messages/inject/inject.d.ts.map +1 -0
- package/dist/lib/messages/inject/inject.js +131 -0
- package/dist/lib/messages/inject/inject.js.map +1 -0
- package/dist/lib/messages/inject/subagent-results.d.ts +4 -0
- package/dist/lib/messages/inject/subagent-results.d.ts.map +1 -0
- package/dist/lib/messages/inject/subagent-results.js +58 -0
- package/dist/lib/messages/inject/subagent-results.js.map +1 -0
- package/dist/lib/messages/inject/utils.d.ts +25 -0
- package/dist/lib/messages/inject/utils.d.ts.map +1 -0
- package/dist/lib/messages/inject/utils.js +198 -0
- package/dist/lib/messages/inject/utils.js.map +1 -0
- package/dist/lib/messages/prune.d.ts +5 -0
- package/dist/lib/messages/prune.d.ts.map +1 -0
- package/dist/lib/messages/prune.js +177 -0
- package/dist/lib/messages/prune.js.map +1 -0
- package/dist/lib/messages/reasoning-strip.d.ts +8 -0
- package/dist/lib/messages/reasoning-strip.d.ts.map +1 -0
- package/dist/lib/messages/reasoning-strip.js +33 -0
- package/dist/lib/messages/reasoning-strip.js.map +1 -0
- package/dist/lib/messages/sync.d.ts +4 -0
- package/dist/lib/messages/sync.d.ts.map +1 -0
- package/dist/lib/messages/sync.js +93 -0
- package/dist/lib/messages/sync.js.map +1 -0
- package/dist/lib/messages/utils.d.ts +21 -0
- package/dist/lib/messages/utils.d.ts.map +1 -0
- package/dist/lib/messages/utils.js +118 -0
- package/dist/lib/messages/utils.js.map +1 -0
- package/dist/lib/prompts/compress.d.ts +2 -0
- package/dist/lib/prompts/compress.d.ts.map +1 -0
- package/dist/lib/prompts/compress.js +85 -0
- package/dist/lib/prompts/compress.js.map +1 -0
- package/dist/lib/prompts/context-limit-nudge.d.ts +2 -0
- package/dist/lib/prompts/context-limit-nudge.d.ts.map +1 -0
- package/dist/lib/prompts/context-limit-nudge.js +25 -0
- package/dist/lib/prompts/context-limit-nudge.js.map +1 -0
- package/dist/lib/prompts/index.d.ts +3 -0
- package/dist/lib/prompts/index.d.ts.map +1 -0
- package/dist/lib/prompts/index.js +19 -0
- package/dist/lib/prompts/index.js.map +1 -0
- package/dist/lib/prompts/internal-overlays.d.ts +5 -0
- package/dist/lib/prompts/internal-overlays.d.ts.map +1 -0
- package/dist/lib/prompts/internal-overlays.js +43 -0
- package/dist/lib/prompts/internal-overlays.js.map +1 -0
- package/dist/lib/prompts/iteration-nudge.d.ts +2 -0
- package/dist/lib/prompts/iteration-nudge.d.ts.map +1 -0
- package/dist/lib/prompts/iteration-nudge.js +9 -0
- package/dist/lib/prompts/iteration-nudge.js.map +1 -0
- package/dist/lib/prompts/store.d.ts +24 -0
- package/dist/lib/prompts/store.d.ts.map +1 -0
- package/dist/lib/prompts/store.js +346 -0
- package/dist/lib/prompts/store.js.map +1 -0
- package/dist/lib/prompts/system.d.ts +2 -0
- package/dist/lib/prompts/system.d.ts.map +1 -0
- package/dist/lib/prompts/system.js +30 -0
- package/dist/lib/prompts/system.js.map +1 -0
- package/dist/lib/prompts/turn-nudge.d.ts +2 -0
- package/dist/lib/prompts/turn-nudge.d.ts.map +1 -0
- package/dist/lib/prompts/turn-nudge.js +12 -0
- package/dist/lib/prompts/turn-nudge.js.map +1 -0
- package/dist/lib/protected-patterns.d.ts +5 -0
- package/dist/lib/protected-patterns.d.ts.map +1 -0
- package/dist/lib/protected-patterns.js +107 -0
- package/dist/lib/protected-patterns.js.map +1 -0
- package/dist/lib/shared-utils.d.ts +8 -0
- package/dist/lib/shared-utils.d.ts.map +1 -0
- package/dist/lib/shared-utils.js +30 -0
- package/dist/lib/shared-utils.js.map +1 -0
- package/dist/lib/state/index.d.ts +4 -0
- package/dist/lib/state/index.d.ts.map +1 -0
- package/dist/lib/state/index.js +4 -0
- package/dist/lib/state/index.js.map +1 -0
- package/dist/lib/state/persistence.d.ts +41 -0
- package/dist/lib/state/persistence.d.ts.map +1 -0
- package/dist/lib/state/persistence.js +174 -0
- package/dist/lib/state/persistence.js.map +1 -0
- package/dist/lib/state/state.d.ts +7 -0
- package/dist/lib/state/state.d.ts.map +1 -0
- package/dist/lib/state/state.js +134 -0
- package/dist/lib/state/state.js.map +1 -0
- package/dist/lib/state/tool-cache.d.ts +13 -0
- package/dist/lib/state/tool-cache.d.ts.map +1 -0
- package/dist/lib/state/tool-cache.js +69 -0
- package/dist/lib/state/tool-cache.js.map +1 -0
- package/dist/lib/state/types.d.ts +90 -0
- package/dist/lib/state/types.d.ts.map +1 -0
- package/dist/lib/state/types.js +2 -0
- package/dist/lib/state/types.js.map +1 -0
- package/dist/lib/state/utils.d.ts +18 -0
- package/dist/lib/state/utils.d.ts.map +1 -0
- package/dist/lib/state/utils.js +196 -0
- package/dist/lib/state/utils.js.map +1 -0
- package/dist/lib/strategies/deduplication.d.ts +10 -0
- package/dist/lib/strategies/deduplication.d.ts.map +1 -0
- package/dist/lib/strategies/deduplication.js +100 -0
- package/dist/lib/strategies/deduplication.js.map +1 -0
- package/dist/lib/strategies/index.d.ts +4 -0
- package/dist/lib/strategies/index.d.ts.map +1 -0
- package/dist/lib/strategies/index.js +4 -0
- package/dist/lib/strategies/index.js.map +1 -0
- package/dist/lib/strategies/purge-errors.d.ts +13 -0
- package/dist/lib/strategies/purge-errors.d.ts.map +1 -0
- package/dist/lib/strategies/purge-errors.js +62 -0
- package/dist/lib/strategies/purge-errors.js.map +1 -0
- package/dist/lib/strategies/supersede-writes.d.ts +13 -0
- package/dist/lib/strategies/supersede-writes.d.ts.map +1 -0
- package/dist/lib/strategies/supersede-writes.js +94 -0
- package/dist/lib/strategies/supersede-writes.js.map +1 -0
- package/dist/lib/strategies/utils.d.ts +21 -0
- package/dist/lib/strategies/utils.d.ts.map +1 -0
- package/dist/lib/strategies/utils.js +128 -0
- package/dist/lib/strategies/utils.js.map +1 -0
- package/dist/lib/subagents/subagent-results.d.ts +5 -0
- package/dist/lib/subagents/subagent-results.d.ts.map +1 -0
- package/dist/lib/subagents/subagent-results.js +52 -0
- package/dist/lib/subagents/subagent-results.js.map +1 -0
- package/dist/lib/tools/compress.d.ts +4 -0
- package/dist/lib/tools/compress.d.ts.map +1 -0
- package/dist/lib/tools/compress.js +110 -0
- package/dist/lib/tools/compress.js.map +1 -0
- package/dist/lib/tools/index.d.ts +3 -0
- package/dist/lib/tools/index.d.ts.map +1 -0
- package/dist/lib/tools/index.js +2 -0
- package/dist/lib/tools/index.js.map +1 -0
- package/dist/lib/tools/types.d.ts +13 -0
- package/dist/lib/tools/types.d.ts.map +1 -0
- package/dist/lib/tools/types.js +2 -0
- package/dist/lib/tools/types.js.map +1 -0
- package/dist/lib/tools/utils.d.ts +80 -0
- package/dist/lib/tools/utils.d.ts.map +1 -0
- package/dist/lib/tools/utils.js +675 -0
- package/dist/lib/tools/utils.js.map +1 -0
- package/dist/lib/ui/notification.d.ts +10 -0
- package/dist/lib/ui/notification.d.ts.map +1 -0
- package/dist/lib/ui/notification.js +182 -0
- package/dist/lib/ui/notification.js.map +1 -0
- package/dist/lib/ui/utils.d.ts +10 -0
- package/dist/lib/ui/utils.d.ts.map +1 -0
- package/dist/lib/ui/utils.js +255 -0
- package/dist/lib/ui/utils.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,13 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supersede-writes.js","sourceRoot":"","sources":["../../../lib/strategies/supersede-writes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { SessionState, WithParts } from "../state";
|
|
2
|
+
import { Logger } from "../logger";
|
|
3
|
+
/**
|
|
4
|
+
* Get current token usage from the last assistant message.
|
|
5
|
+
* Returns total tokens (input + output + reasoning + cache).
|
|
6
|
+
*/
|
|
7
|
+
export declare function getCurrentTokenUsage(messages: WithParts[]): number;
|
|
8
|
+
export declare function getCurrentParams(state: SessionState, messages: WithParts[], logger: Logger): {
|
|
9
|
+
providerId: string | undefined;
|
|
10
|
+
modelId: string | undefined;
|
|
11
|
+
agent: string | undefined;
|
|
12
|
+
variant: string | undefined;
|
|
13
|
+
};
|
|
14
|
+
export declare function countTokens(text: string): number;
|
|
15
|
+
export declare function estimateTokensBatch(texts: string[]): number;
|
|
16
|
+
export declare function extractToolContent(part: any): string[];
|
|
17
|
+
export declare function countToolTokens(part: any): number;
|
|
18
|
+
export declare function getTotalToolTokens(state: SessionState, toolIds: string[]): number;
|
|
19
|
+
export declare function countMessageTextTokens(msg: WithParts): number;
|
|
20
|
+
export declare function countAllMessageTokens(msg: WithParts): number;
|
|
21
|
+
//# 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;;;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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../lib/strategies/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { WithParts } from "../state";
|
|
2
|
+
export declare function getSubAgentId(part: any): string | null;
|
|
3
|
+
export declare function buildSubagentResultText(messages: WithParts[]): string;
|
|
4
|
+
export declare function mergeSubagentResult(output: string, subAgentResultText: string): string;
|
|
5
|
+
//# sourceMappingURL=subagent-results.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent-results.d.ts","sourceRoot":"","sources":["../../../lib/subagents/subagent-results.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAIzC,wBAAgB,aAAa,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI,CAQtD;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,CAoBrE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,MAAM,CAUtF"}
|
|
@@ -0,0 +1,52 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent-results.js","sourceRoot":"","sources":["../../../lib/subagents/subagent-results.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compress.js","sourceRoot":"","sources":["../../../lib/tools/compress.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SessionState } from "../state";
|
|
2
|
+
import type { PluginConfig } from "../config";
|
|
3
|
+
import type { Logger } from "../logger";
|
|
4
|
+
import type { PromptStore } from "../prompts/store";
|
|
5
|
+
export interface ToolContext {
|
|
6
|
+
client: any;
|
|
7
|
+
state: SessionState;
|
|
8
|
+
logger: Logger;
|
|
9
|
+
config: PluginConfig;
|
|
10
|
+
workingDirectory: string;
|
|
11
|
+
prompts: PromptStore;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../lib/tools/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAEnD,MAAM,WAAW,WAAW;IACxB,MAAM,EAAE,GAAG,CAAA;IACX,KAAK,EAAE,YAAY,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,YAAY,CAAA;IACpB,gBAAgB,EAAE,MAAM,CAAA;IACxB,OAAO,EAAE,WAAW,CAAA;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../lib/tools/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { CompressionBlock, SessionState, WithParts } from "../state";
|
|
2
|
+
export interface CompressToolArgs {
|
|
3
|
+
topic: string;
|
|
4
|
+
content: {
|
|
5
|
+
startId: string;
|
|
6
|
+
endId: string;
|
|
7
|
+
summary: string;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export interface FlatCompressToolArgs {
|
|
11
|
+
topic: string;
|
|
12
|
+
startId: string;
|
|
13
|
+
endId: string;
|
|
14
|
+
summary: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function normalizeCompressArgs(args: Record<string, unknown>): CompressToolArgs;
|
|
17
|
+
export interface BoundaryReference {
|
|
18
|
+
kind: "message" | "compressed-block";
|
|
19
|
+
rawIndex: number;
|
|
20
|
+
messageId?: string;
|
|
21
|
+
blockId?: number;
|
|
22
|
+
anchorMessageId?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface SearchContext {
|
|
25
|
+
rawMessages: WithParts[];
|
|
26
|
+
rawMessagesById: Map<string, WithParts>;
|
|
27
|
+
rawIndexById: Map<string, number>;
|
|
28
|
+
summaryByBlockId: Map<number, CompressionBlock>;
|
|
29
|
+
}
|
|
30
|
+
export interface RangeResolution {
|
|
31
|
+
startReference: BoundaryReference;
|
|
32
|
+
endReference: BoundaryReference;
|
|
33
|
+
messageIds: string[];
|
|
34
|
+
messageTokenById: Map<string, number>;
|
|
35
|
+
toolIds: string[];
|
|
36
|
+
requiredBlockIds: number[];
|
|
37
|
+
}
|
|
38
|
+
export interface ParsedBlockPlaceholder {
|
|
39
|
+
raw: string;
|
|
40
|
+
blockId: number;
|
|
41
|
+
startIndex: number;
|
|
42
|
+
endIndex: number;
|
|
43
|
+
}
|
|
44
|
+
export interface InjectedSummaryResult {
|
|
45
|
+
expandedSummary: string;
|
|
46
|
+
consumedBlockIds: number[];
|
|
47
|
+
}
|
|
48
|
+
export interface AppliedCompressionResult {
|
|
49
|
+
compressedTokens: number;
|
|
50
|
+
messageIds: string[];
|
|
51
|
+
newlyCompressedMessageIds: string[];
|
|
52
|
+
newlyCompressedToolIds: string[];
|
|
53
|
+
}
|
|
54
|
+
export interface CompressionStateInput {
|
|
55
|
+
topic: string;
|
|
56
|
+
startId: string;
|
|
57
|
+
endId: string;
|
|
58
|
+
compressMessageId: string;
|
|
59
|
+
}
|
|
60
|
+
export declare const COMPRESSED_BLOCK_HEADER = "[Compressed conversation section]";
|
|
61
|
+
export declare function formatBlockPlaceholder(blockId: number): string;
|
|
62
|
+
export declare function validateCompressArgs(args: CompressToolArgs): void;
|
|
63
|
+
export declare function fetchSessionMessages(client: any, sessionId: string): Promise<WithParts[]>;
|
|
64
|
+
export declare function buildSearchContext(state: SessionState, rawMessages: WithParts[]): SearchContext;
|
|
65
|
+
export declare function resolveBoundaryIds(context: SearchContext, state: SessionState, startId: string, endId: string): {
|
|
66
|
+
startReference: BoundaryReference;
|
|
67
|
+
endReference: BoundaryReference;
|
|
68
|
+
};
|
|
69
|
+
export declare function resolveRange(context: SearchContext, startReference: BoundaryReference, endReference: BoundaryReference): RangeResolution;
|
|
70
|
+
export declare function resolveAnchorMessageId(startReference: BoundaryReference): string;
|
|
71
|
+
export declare function parseBlockPlaceholders(summary: string): ParsedBlockPlaceholder[];
|
|
72
|
+
export declare function validateSummaryPlaceholders(placeholders: ParsedBlockPlaceholder[], requiredBlockIds: number[], startReference: BoundaryReference, endReference: BoundaryReference, summaryByBlockId: Map<number, CompressionBlock>): number[];
|
|
73
|
+
export declare function injectBlockPlaceholders(summary: string, placeholders: ParsedBlockPlaceholder[], summaryByBlockId: Map<number, CompressionBlock>, startReference: BoundaryReference, endReference: BoundaryReference): InjectedSummaryResult;
|
|
74
|
+
export declare function allocateBlockId(state: SessionState): number;
|
|
75
|
+
export declare function wrapCompressedSummary(blockId: number, summary: string): string;
|
|
76
|
+
export declare function applyCompressionState(state: SessionState, input: CompressionStateInput, range: RangeResolution, anchorMessageId: string, blockId: number, summary: string, consumedBlockIds: number[]): AppliedCompressionResult;
|
|
77
|
+
export declare function appendProtectedUserMessages(summary: string, range: RangeResolution, searchContext: SearchContext, state: SessionState, enabled: boolean): string;
|
|
78
|
+
export declare function appendProtectedTools(client: any, state: SessionState, allowSubAgents: boolean, summary: string, range: RangeResolution, searchContext: SearchContext, protectedTools: string[], protectedFilePatterns?: string[]): Promise<string>;
|
|
79
|
+
export declare function appendMissingBlockSummaries(summary: string, missingBlockIds: number[], summaryByBlockId: Map<number, CompressionBlock>, consumedBlockIds: number[]): InjectedSummaryResult;
|
|
80
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../lib/tools/utils.ts"],"names":[],"mappings":"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"}
|