@tarquinen/opencode-dcp 1.2.7 → 1.3.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -1
- package/dist/index.js.map +1 -1
- 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/config.d.ts +5 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +32 -2
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/hooks.d.ts.map +1 -1
- package/dist/lib/hooks.js +15 -2
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/messages/inject.d.ts.map +1 -1
- package/dist/lib/messages/inject.js +75 -27
- package/dist/lib/messages/inject.js.map +1 -1
- package/dist/lib/messages/prune.d.ts.map +1 -1
- package/dist/lib/messages/prune.js +42 -1
- package/dist/lib/messages/prune.js.map +1 -1
- package/dist/lib/messages/utils.d.ts +3 -1
- package/dist/lib/messages/utils.d.ts.map +1 -1
- package/dist/lib/messages/utils.js +32 -48
- package/dist/lib/messages/utils.js.map +1 -1
- package/dist/lib/prompts/discard-tool-spec.d.ts +1 -1
- package/dist/lib/prompts/discard-tool-spec.d.ts.map +1 -1
- package/dist/lib/prompts/discard-tool-spec.js +17 -40
- package/dist/lib/prompts/discard-tool-spec.js.map +1 -1
- package/dist/lib/prompts/extract-tool-spec.d.ts +1 -1
- package/dist/lib/prompts/extract-tool-spec.d.ts.map +1 -1
- package/dist/lib/prompts/extract-tool-spec.js +22 -47
- package/dist/lib/prompts/extract-tool-spec.js.map +1 -1
- package/dist/lib/prompts/index.d.ts.map +1 -1
- package/dist/lib/prompts/index.js +22 -4
- package/dist/lib/prompts/index.js.map +1 -1
- package/dist/lib/prompts/nudge/all.d.ts +2 -0
- package/dist/lib/prompts/nudge/all.d.ts.map +1 -0
- package/dist/lib/prompts/nudge/all.js +9 -0
- package/dist/lib/prompts/nudge/all.js.map +1 -0
- package/dist/lib/prompts/nudge/discard-extract.d.ts +2 -0
- package/dist/lib/prompts/nudge/discard-extract.d.ts.map +1 -0
- package/dist/lib/prompts/nudge/discard-extract.js +8 -0
- package/dist/lib/prompts/nudge/discard-extract.js.map +1 -0
- package/dist/lib/prompts/nudge/discard-squash.d.ts +2 -0
- package/dist/lib/prompts/nudge/discard-squash.d.ts.map +1 -0
- package/dist/lib/prompts/nudge/discard-squash.js +8 -0
- package/dist/lib/prompts/nudge/discard-squash.js.map +1 -0
- package/dist/lib/prompts/nudge/discard.d.ts +1 -1
- package/dist/lib/prompts/nudge/discard.d.ts.map +1 -1
- package/dist/lib/prompts/nudge/discard.js +5 -7
- package/dist/lib/prompts/nudge/discard.js.map +1 -1
- package/dist/lib/prompts/nudge/extract-squash.d.ts +2 -0
- package/dist/lib/prompts/nudge/extract-squash.d.ts.map +1 -0
- package/dist/lib/prompts/nudge/extract-squash.js +8 -0
- package/dist/lib/prompts/nudge/extract-squash.js.map +1 -0
- package/dist/lib/prompts/nudge/extract.d.ts +1 -1
- package/dist/lib/prompts/nudge/extract.d.ts.map +1 -1
- package/dist/lib/prompts/nudge/extract.js +5 -7
- package/dist/lib/prompts/nudge/extract.js.map +1 -1
- package/dist/lib/prompts/nudge/squash.d.ts +2 -0
- package/dist/lib/prompts/nudge/squash.d.ts.map +1 -0
- package/dist/lib/prompts/nudge/squash.js +8 -0
- package/dist/lib/prompts/nudge/squash.js.map +1 -0
- package/dist/lib/prompts/squash-tool-spec.d.ts +2 -0
- package/dist/lib/prompts/squash-tool-spec.d.ts.map +1 -0
- package/dist/lib/prompts/squash-tool-spec.js +33 -0
- package/dist/lib/prompts/squash-tool-spec.js.map +1 -0
- package/dist/lib/prompts/system/all.d.ts +2 -0
- package/dist/lib/prompts/system/all.d.ts.map +1 -0
- package/dist/lib/prompts/system/all.js +26 -0
- package/dist/lib/prompts/system/all.js.map +1 -0
- package/dist/lib/prompts/system/discard-extract.d.ts +2 -0
- package/dist/lib/prompts/system/discard-extract.d.ts.map +1 -0
- package/dist/lib/prompts/system/discard-extract.js +26 -0
- package/dist/lib/prompts/system/discard-extract.js.map +1 -0
- package/dist/lib/prompts/system/discard-squash.d.ts +2 -0
- package/dist/lib/prompts/system/discard-squash.d.ts.map +1 -0
- package/dist/lib/prompts/system/discard-squash.js +25 -0
- package/dist/lib/prompts/system/discard-squash.js.map +1 -0
- package/dist/lib/prompts/system/discard.d.ts +1 -1
- package/dist/lib/prompts/system/discard.d.ts.map +1 -1
- package/dist/lib/prompts/system/discard.js +18 -43
- package/dist/lib/prompts/system/discard.js.map +1 -1
- package/dist/lib/prompts/system/extract-squash.d.ts +2 -0
- package/dist/lib/prompts/system/extract-squash.d.ts.map +1 -0
- package/dist/lib/prompts/system/extract-squash.js +25 -0
- package/dist/lib/prompts/system/extract-squash.js.map +1 -0
- package/dist/lib/prompts/system/extract.d.ts +1 -1
- package/dist/lib/prompts/system/extract.d.ts.map +1 -1
- package/dist/lib/prompts/system/extract.js +18 -43
- package/dist/lib/prompts/system/extract.js.map +1 -1
- package/dist/lib/prompts/system/squash.d.ts +2 -0
- package/dist/lib/prompts/system/squash.d.ts.map +1 -0
- package/dist/lib/prompts/system/squash.js +27 -0
- package/dist/lib/prompts/system/squash.js.map +1 -0
- package/dist/lib/shared-utils.d.ts +1 -1
- package/dist/lib/shared-utils.d.ts.map +1 -1
- package/dist/lib/shared-utils.js +10 -3
- package/dist/lib/shared-utils.js.map +1 -1
- package/dist/lib/state/persistence.d.ts +2 -1
- package/dist/lib/state/persistence.d.ts.map +1 -1
- package/dist/lib/state/persistence.js +1 -0
- package/dist/lib/state/persistence.js.map +1 -1
- package/dist/lib/state/state.d.ts +0 -1
- package/dist/lib/state/state.d.ts.map +1 -1
- package/dist/lib/state/state.js +10 -29
- 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 +4 -2
- package/dist/lib/state/tool-cache.js.map +1 -1
- package/dist/lib/state/types.d.ts +6 -0
- package/dist/lib/state/types.d.ts.map +1 -1
- package/dist/lib/state/utils.d.ts +4 -0
- package/dist/lib/state/utils.d.ts.map +1 -1
- package/dist/lib/state/utils.js +33 -0
- package/dist/lib/state/utils.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/utils.d.ts +1 -0
- package/dist/lib/strategies/utils.d.ts.map +1 -1
- package/dist/lib/strategies/utils.js +5 -4
- package/dist/lib/strategies/utils.js.map +1 -1
- package/dist/lib/tools/discard.d.ts +4 -0
- package/dist/lib/tools/discard.d.ts.map +1 -0
- package/dist/lib/tools/discard.js +21 -0
- package/dist/lib/tools/discard.js.map +1 -0
- package/dist/lib/tools/extract.d.ts +4 -0
- package/dist/lib/tools/extract.d.ts.map +1 -0
- package/dist/lib/tools/extract.js +30 -0
- package/dist/lib/tools/extract.js.map +1 -0
- package/dist/lib/tools/index.d.ts +5 -0
- package/dist/lib/tools/index.d.ts.map +1 -0
- package/dist/lib/tools/index.js +4 -0
- package/dist/lib/tools/index.js.map +1 -0
- package/dist/lib/tools/prune-shared.d.ts +6 -0
- package/dist/lib/tools/prune-shared.d.ts.map +1 -0
- package/dist/lib/tools/prune-shared.js +107 -0
- package/dist/lib/tools/prune-shared.js.map +1 -0
- package/dist/lib/tools/squash.d.ts +4 -0
- package/dist/lib/tools/squash.d.ts.map +1 -0
- package/dist/lib/tools/squash.js +81 -0
- package/dist/lib/tools/squash.js.map +1 -0
- package/dist/lib/{strategies/tools.d.ts → tools/types.d.ts} +1 -4
- 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 +26 -0
- package/dist/lib/tools/utils.d.ts.map +1 -0
- package/dist/lib/tools/utils.js +121 -0
- package/dist/lib/tools/utils.js.map +1 -0
- 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 +29 -1
- package/dist/lib/ui/notification.js.map +1 -1
- package/dist/lib/ui/utils.d.ts +1 -6
- package/dist/lib/ui/utils.d.ts.map +1 -1
- package/dist/lib/ui/utils.js +16 -6
- package/dist/lib/ui/utils.js.map +1 -1
- package/package.json +2 -1
- package/dist/lib/prompts/nudge/both.d.ts +0 -2
- package/dist/lib/prompts/nudge/both.d.ts.map +0 -1
- package/dist/lib/prompts/nudge/both.js +0 -11
- package/dist/lib/prompts/nudge/both.js.map +0 -1
- package/dist/lib/prompts/system/both.d.ts +0 -2
- package/dist/lib/prompts/system/both.d.ts.map +0 -1
- package/dist/lib/prompts/system/both.js +0 -61
- package/dist/lib/prompts/system/both.js.map +0 -1
- package/dist/lib/strategies/tools.d.ts.map +0 -1
- package/dist/lib/strategies/tools.js +0 -135
- package/dist/lib/strategies/tools.js.map +0 -1
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { buildToolIdList } from "../messages/utils";
|
|
2
|
+
import { syncToolCache } from "../state/tool-cache";
|
|
3
|
+
import { sendUnifiedNotification } from "../ui/notification";
|
|
4
|
+
import { formatPruningResultForTool } from "../ui/utils";
|
|
5
|
+
import { ensureSessionInitialized } from "../state";
|
|
6
|
+
import { saveSessionState } from "../state/persistence";
|
|
7
|
+
import { calculateTokensSaved, getCurrentParams } from "../strategies/utils";
|
|
8
|
+
import { getFilePathFromParameters, isProtectedFilePath } from "../protected-file-patterns";
|
|
9
|
+
// Shared logic for executing prune operations.
|
|
10
|
+
export async function executePruneOperation(ctx, toolCtx, ids, reason, toolName, distillation) {
|
|
11
|
+
const { client, state, logger, config, workingDirectory } = ctx;
|
|
12
|
+
const sessionId = toolCtx.sessionID;
|
|
13
|
+
logger.info(`${toolName} tool invoked`);
|
|
14
|
+
logger.info(JSON.stringify(reason ? { ids, reason } : { ids }));
|
|
15
|
+
if (!ids || ids.length === 0) {
|
|
16
|
+
logger.debug(`${toolName} tool called but ids is empty or undefined`);
|
|
17
|
+
throw new Error(`No IDs provided. Check the <prunable-tools> list for available IDs to ${toolName.toLowerCase()}.`);
|
|
18
|
+
}
|
|
19
|
+
const numericToolIds = ids
|
|
20
|
+
.map((id) => parseInt(id, 10))
|
|
21
|
+
.filter((n) => !isNaN(n));
|
|
22
|
+
if (numericToolIds.length === 0) {
|
|
23
|
+
logger.debug(`No numeric tool IDs provided for ${toolName}: ` + JSON.stringify(ids));
|
|
24
|
+
throw new Error("No numeric IDs provided. Format: ids: [id1, id2, ...]");
|
|
25
|
+
}
|
|
26
|
+
// Fetch messages to calculate tokens and find current agent
|
|
27
|
+
const messagesResponse = await client.session.messages({
|
|
28
|
+
path: { id: sessionId },
|
|
29
|
+
});
|
|
30
|
+
const messages = messagesResponse.data || messagesResponse;
|
|
31
|
+
await ensureSessionInitialized(ctx.client, state, sessionId, logger, messages);
|
|
32
|
+
await syncToolCache(state, config, logger, messages);
|
|
33
|
+
const currentParams = getCurrentParams(state, messages, logger);
|
|
34
|
+
const toolIdList = buildToolIdList(state, messages, logger);
|
|
35
|
+
const validNumericIds = [];
|
|
36
|
+
const skippedIds = [];
|
|
37
|
+
// Validate and filter IDs
|
|
38
|
+
for (const index of numericToolIds) {
|
|
39
|
+
// Validate that all numeric IDs are within bounds
|
|
40
|
+
if (index < 0 || index >= toolIdList.length) {
|
|
41
|
+
logger.debug(`Rejecting prune request - index out of bounds: ${index}`);
|
|
42
|
+
skippedIds.push(index.toString());
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const id = toolIdList[index];
|
|
46
|
+
const metadata = state.toolParameters.get(id);
|
|
47
|
+
// Validate that all IDs exist in cache and aren't protected
|
|
48
|
+
// (rejects hallucinated IDs and turn-protected tools not shown in <prunable-tools>)
|
|
49
|
+
if (!metadata) {
|
|
50
|
+
logger.debug("Rejecting prune request - ID not in cache (turn-protected or hallucinated)", { index, id });
|
|
51
|
+
skippedIds.push(index.toString());
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const allProtectedTools = config.tools.settings.protectedTools;
|
|
55
|
+
if (allProtectedTools.includes(metadata.tool)) {
|
|
56
|
+
logger.debug("Rejecting prune request - protected tool", {
|
|
57
|
+
index,
|
|
58
|
+
id,
|
|
59
|
+
tool: metadata.tool,
|
|
60
|
+
});
|
|
61
|
+
skippedIds.push(index.toString());
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
const filePath = getFilePathFromParameters(metadata.parameters);
|
|
65
|
+
if (isProtectedFilePath(filePath, config.protectedFilePatterns)) {
|
|
66
|
+
logger.debug("Rejecting prune request - protected file path", {
|
|
67
|
+
index,
|
|
68
|
+
id,
|
|
69
|
+
tool: metadata.tool,
|
|
70
|
+
filePath,
|
|
71
|
+
});
|
|
72
|
+
skippedIds.push(index.toString());
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
validNumericIds.push(index);
|
|
76
|
+
}
|
|
77
|
+
if (validNumericIds.length === 0) {
|
|
78
|
+
const errorMsg = skippedIds.length > 0
|
|
79
|
+
? `Invalid IDs provided: [${skippedIds.join(", ")}]. Only use numeric IDs from the <prunable-tools> list.`
|
|
80
|
+
: `No valid IDs provided to ${toolName.toLowerCase()}.`;
|
|
81
|
+
throw new Error(errorMsg);
|
|
82
|
+
}
|
|
83
|
+
const pruneToolIds = validNumericIds.map((index) => toolIdList[index]);
|
|
84
|
+
state.prune.toolIds.push(...pruneToolIds);
|
|
85
|
+
const toolMetadata = new Map();
|
|
86
|
+
for (const id of pruneToolIds) {
|
|
87
|
+
const toolParameters = state.toolParameters.get(id);
|
|
88
|
+
if (toolParameters) {
|
|
89
|
+
toolMetadata.set(id, toolParameters);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
logger.debug("No metadata found for ID", { id });
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
state.stats.pruneTokenCounter += calculateTokensSaved(state, messages, pruneToolIds);
|
|
96
|
+
await sendUnifiedNotification(client, logger, config, state, sessionId, pruneToolIds, toolMetadata, reason, currentParams, workingDirectory, distillation);
|
|
97
|
+
state.stats.totalPruneTokens += state.stats.pruneTokenCounter;
|
|
98
|
+
state.stats.pruneTokenCounter = 0;
|
|
99
|
+
state.nudgeCounter = 0;
|
|
100
|
+
saveSessionState(state, logger).catch((err) => logger.error("Failed to persist state", { error: err.message }));
|
|
101
|
+
let result = formatPruningResultForTool(pruneToolIds, toolMetadata, workingDirectory);
|
|
102
|
+
if (skippedIds.length > 0) {
|
|
103
|
+
result += `\n\nNote: ${skippedIds.length} IDs were skipped (invalid, protected, or missing metadata): ${skippedIds.join(", ")}`;
|
|
104
|
+
}
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=prune-shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prune-shared.js","sourceRoot":"","sources":["../../../lib/tools/prune-shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"squash.d.ts","sourceRoot":"","sources":["../../../lib/tools/squash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAE1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAe/C,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAuI/E"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { tool } from "@opencode-ai/plugin";
|
|
2
|
+
import { ensureSessionInitialized } from "../state";
|
|
3
|
+
import { saveSessionState } from "../state/persistence";
|
|
4
|
+
import { loadPrompt } from "../prompts";
|
|
5
|
+
import { estimateTokensBatch, getCurrentParams } from "../strategies/utils";
|
|
6
|
+
import { collectContentInRange, findStringInMessages, collectToolIdsInRange, collectMessageIdsInRange, } from "./utils";
|
|
7
|
+
import { sendSquashNotification } from "../ui/notification";
|
|
8
|
+
const SQUASH_TOOL_DESCRIPTION = loadPrompt("squash-tool-spec");
|
|
9
|
+
export function createSquashTool(ctx) {
|
|
10
|
+
return tool({
|
|
11
|
+
description: SQUASH_TOOL_DESCRIPTION,
|
|
12
|
+
args: {
|
|
13
|
+
input: tool.schema
|
|
14
|
+
.array(tool.schema.string())
|
|
15
|
+
.length(4)
|
|
16
|
+
.describe("[startString, endString, topic, summary] - 4 required strings: (1) startString: unique text from conversation marking range start, (2) endString: unique text marking range end, (3) topic: short 3-5 word label for UI, (4) summary: comprehensive text replacing all squashed content"),
|
|
17
|
+
},
|
|
18
|
+
async execute(args, toolCtx) {
|
|
19
|
+
const { client, state, logger } = ctx;
|
|
20
|
+
const sessionId = toolCtx.sessionID;
|
|
21
|
+
const [startString, endString, topic, summary] = args.input;
|
|
22
|
+
logger.info("Squash tool invoked");
|
|
23
|
+
// logger.info(
|
|
24
|
+
// JSON.stringify({
|
|
25
|
+
// startString: startString?.substring(0, 50) + "...",
|
|
26
|
+
// endString: endString?.substring(0, 50) + "...",
|
|
27
|
+
// topic: topic,
|
|
28
|
+
// summaryLength: summary?.length,
|
|
29
|
+
// }),
|
|
30
|
+
// )
|
|
31
|
+
const messagesResponse = await client.session.messages({
|
|
32
|
+
path: { id: sessionId },
|
|
33
|
+
});
|
|
34
|
+
const messages = messagesResponse.data || messagesResponse;
|
|
35
|
+
await ensureSessionInitialized(client, state, sessionId, logger, messages);
|
|
36
|
+
const startResult = findStringInMessages(messages, startString, logger, state.squashSummaries);
|
|
37
|
+
const endResult = findStringInMessages(messages, endString, logger, state.squashSummaries);
|
|
38
|
+
if (startResult.messageIndex > endResult.messageIndex) {
|
|
39
|
+
throw new Error(`startString appears after endString in the conversation. Start must come before end.`);
|
|
40
|
+
}
|
|
41
|
+
const containedToolIds = collectToolIdsInRange(messages, startResult.messageIndex, endResult.messageIndex);
|
|
42
|
+
const containedMessageIds = collectMessageIdsInRange(messages, startResult.messageIndex, endResult.messageIndex);
|
|
43
|
+
state.prune.toolIds.push(...containedToolIds);
|
|
44
|
+
state.prune.messageIds.push(...containedMessageIds);
|
|
45
|
+
// Remove any existing summaries whose anchors are now inside this range
|
|
46
|
+
// This prevents duplicate injections when a larger squash subsumes a smaller one
|
|
47
|
+
const removedSummaries = state.squashSummaries.filter((s) => containedMessageIds.includes(s.anchorMessageId));
|
|
48
|
+
if (removedSummaries.length > 0) {
|
|
49
|
+
// logger.info("Removing subsumed squash summaries", {
|
|
50
|
+
// count: removedSummaries.length,
|
|
51
|
+
// anchorIds: removedSummaries.map((s) => s.anchorMessageId),
|
|
52
|
+
// })
|
|
53
|
+
state.squashSummaries = state.squashSummaries.filter((s) => !containedMessageIds.includes(s.anchorMessageId));
|
|
54
|
+
}
|
|
55
|
+
const squashSummary = {
|
|
56
|
+
anchorMessageId: startResult.messageId,
|
|
57
|
+
summary: summary,
|
|
58
|
+
};
|
|
59
|
+
state.squashSummaries.push(squashSummary);
|
|
60
|
+
const contentsToTokenize = collectContentInRange(messages, startResult.messageIndex, endResult.messageIndex);
|
|
61
|
+
const estimatedSquashedTokens = estimateTokensBatch(contentsToTokenize);
|
|
62
|
+
state.stats.pruneTokenCounter += estimatedSquashedTokens;
|
|
63
|
+
const currentParams = getCurrentParams(state, messages, logger);
|
|
64
|
+
await sendSquashNotification(client, logger, ctx.config, state, sessionId, containedToolIds, containedMessageIds, topic, summary, startResult, endResult, messages.length, currentParams);
|
|
65
|
+
state.stats.totalPruneTokens += state.stats.pruneTokenCounter;
|
|
66
|
+
state.stats.pruneTokenCounter = 0;
|
|
67
|
+
state.nudgeCounter = 0;
|
|
68
|
+
// logger.info("Squash range created", {
|
|
69
|
+
// startMessageId: startResult.messageId,
|
|
70
|
+
// endMessageId: endResult.messageId,
|
|
71
|
+
// toolIdsRemoved: containedToolIds.length,
|
|
72
|
+
// messagesInRange: containedMessageIds.length,
|
|
73
|
+
// estimatedTokens: estimatedSquashedTokens,
|
|
74
|
+
// })
|
|
75
|
+
saveSessionState(state, logger).catch((err) => logger.error("Failed to persist state", { error: err.message }));
|
|
76
|
+
const messagesSquashed = endResult.messageIndex - startResult.messageIndex + 1;
|
|
77
|
+
return `Squashed ${messagesSquashed} messages (${containedToolIds.length} tool calls) into summary. The content will be replaced with your summary.`;
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=squash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"squash.js","sourceRoot":"","sources":["../../../lib/tools/squash.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { tool } from "@opencode-ai/plugin";
|
|
2
1
|
import type { SessionState } from "../state";
|
|
3
2
|
import type { PluginConfig } from "../config";
|
|
4
3
|
import type { Logger } from "../logger";
|
|
@@ -9,6 +8,4 @@ export interface PruneToolContext {
|
|
|
9
8
|
config: PluginConfig;
|
|
10
9
|
workingDirectory: string;
|
|
11
10
|
}
|
|
12
|
-
|
|
13
|
-
export declare function createExtractTool(ctx: PruneToolContext): ReturnType<typeof tool>;
|
|
14
|
-
//# sourceMappingURL=tools.d.ts.map
|
|
11
|
+
//# 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;AAEvC,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,GAAG,CAAA;IACX,KAAK,EAAE,YAAY,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,YAAY,CAAA;IACpB,gBAAgB,EAAE,MAAM,CAAA;CAC3B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../lib/tools/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { WithParts, SquashSummary } from "../state";
|
|
2
|
+
import type { Logger } from "../logger";
|
|
3
|
+
/**
|
|
4
|
+
* Searches messages for a string and returns the message ID where it's found.
|
|
5
|
+
* Searches in text parts, tool outputs, tool inputs, and other textual content.
|
|
6
|
+
* Also searches through existing squash summaries to enable chained squashing.
|
|
7
|
+
* Throws an error if the string is not found or found more than once.
|
|
8
|
+
*/
|
|
9
|
+
export declare function findStringInMessages(messages: WithParts[], searchString: string, logger: Logger, squashSummaries?: SquashSummary[]): {
|
|
10
|
+
messageId: string;
|
|
11
|
+
messageIndex: number;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Collects all tool callIDs from messages between start and end indices (inclusive).
|
|
15
|
+
*/
|
|
16
|
+
export declare function collectToolIdsInRange(messages: WithParts[], startIndex: number, endIndex: number): string[];
|
|
17
|
+
/**
|
|
18
|
+
* Collects all message IDs from messages between start and end indices (inclusive).
|
|
19
|
+
*/
|
|
20
|
+
export declare function collectMessageIdsInRange(messages: WithParts[], startIndex: number, endIndex: number): string[];
|
|
21
|
+
/**
|
|
22
|
+
* Collects all textual content (text parts, tool inputs, and tool outputs)
|
|
23
|
+
* from a range of messages. Used for token estimation.
|
|
24
|
+
*/
|
|
25
|
+
export declare function collectContentInRange(messages: WithParts[], startIndex: number, endIndex: number): string[];
|
|
26
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../lib/tools/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAEvC;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAChC,QAAQ,EAAE,SAAS,EAAE,EACrB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,eAAe,GAAE,aAAa,EAAO,GACtC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CA2D7C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACjC,QAAQ,EAAE,SAAS,EAAE,EACrB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACjB,MAAM,EAAE,CAiBV;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACpC,QAAQ,EAAE,SAAS,EAAE,EACrB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACjB,MAAM,EAAE,CAWV;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACjC,QAAQ,EAAE,SAAS,EAAE,EACrB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACjB,MAAM,EAAE,CAkCV"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Searches messages for a string and returns the message ID where it's found.
|
|
3
|
+
* Searches in text parts, tool outputs, tool inputs, and other textual content.
|
|
4
|
+
* Also searches through existing squash summaries to enable chained squashing.
|
|
5
|
+
* Throws an error if the string is not found or found more than once.
|
|
6
|
+
*/
|
|
7
|
+
export function findStringInMessages(messages, searchString, logger, squashSummaries = []) {
|
|
8
|
+
const matches = [];
|
|
9
|
+
// First, search through existing squash summaries
|
|
10
|
+
// This allows referencing text from previous squash operations
|
|
11
|
+
for (const summary of squashSummaries) {
|
|
12
|
+
if (summary.summary.includes(searchString)) {
|
|
13
|
+
const anchorIndex = messages.findIndex((m) => m.info.id === summary.anchorMessageId);
|
|
14
|
+
if (anchorIndex !== -1) {
|
|
15
|
+
matches.push({
|
|
16
|
+
messageId: summary.anchorMessageId,
|
|
17
|
+
messageIndex: anchorIndex,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// Then search through raw messages
|
|
23
|
+
for (let i = 0; i < messages.length; i++) {
|
|
24
|
+
const msg = messages[i];
|
|
25
|
+
const parts = Array.isArray(msg.parts) ? msg.parts : [];
|
|
26
|
+
for (const part of parts) {
|
|
27
|
+
let content = "";
|
|
28
|
+
if (part.type === "text" && typeof part.text === "string") {
|
|
29
|
+
content = part.text;
|
|
30
|
+
}
|
|
31
|
+
else if (part.type === "tool" && part.state?.status === "completed") {
|
|
32
|
+
if (typeof part.state.output === "string") {
|
|
33
|
+
content = part.state.output;
|
|
34
|
+
}
|
|
35
|
+
if (part.state.input) {
|
|
36
|
+
const inputStr = typeof part.state.input === "string"
|
|
37
|
+
? part.state.input
|
|
38
|
+
: JSON.stringify(part.state.input);
|
|
39
|
+
content += " " + inputStr;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (content.includes(searchString)) {
|
|
43
|
+
matches.push({ messageId: msg.info.id, messageIndex: i });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (matches.length === 0) {
|
|
48
|
+
throw new Error(`String not found in conversation. Make sure the string exists in the conversation.`);
|
|
49
|
+
}
|
|
50
|
+
if (matches.length > 1) {
|
|
51
|
+
throw new Error(`String found in ${matches.length} messages. Please use a more unique string to identify the range boundary.`);
|
|
52
|
+
}
|
|
53
|
+
return matches[0];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Collects all tool callIDs from messages between start and end indices (inclusive).
|
|
57
|
+
*/
|
|
58
|
+
export function collectToolIdsInRange(messages, startIndex, endIndex) {
|
|
59
|
+
const toolIds = [];
|
|
60
|
+
for (let i = startIndex; i <= endIndex; i++) {
|
|
61
|
+
const msg = messages[i];
|
|
62
|
+
const parts = Array.isArray(msg.parts) ? msg.parts : [];
|
|
63
|
+
for (const part of parts) {
|
|
64
|
+
if (part.type === "tool" && part.callID) {
|
|
65
|
+
if (!toolIds.includes(part.callID)) {
|
|
66
|
+
toolIds.push(part.callID);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return toolIds;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Collects all message IDs from messages between start and end indices (inclusive).
|
|
75
|
+
*/
|
|
76
|
+
export function collectMessageIdsInRange(messages, startIndex, endIndex) {
|
|
77
|
+
const messageIds = [];
|
|
78
|
+
for (let i = startIndex; i <= endIndex; i++) {
|
|
79
|
+
const msgId = messages[i].info.id;
|
|
80
|
+
if (!messageIds.includes(msgId)) {
|
|
81
|
+
messageIds.push(msgId);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return messageIds;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Collects all textual content (text parts, tool inputs, and tool outputs)
|
|
88
|
+
* from a range of messages. Used for token estimation.
|
|
89
|
+
*/
|
|
90
|
+
export function collectContentInRange(messages, startIndex, endIndex) {
|
|
91
|
+
const contents = [];
|
|
92
|
+
for (let i = startIndex; i <= endIndex; i++) {
|
|
93
|
+
const msg = messages[i];
|
|
94
|
+
const parts = Array.isArray(msg.parts) ? msg.parts : [];
|
|
95
|
+
for (const part of parts) {
|
|
96
|
+
if (part.type === "text") {
|
|
97
|
+
contents.push(part.text);
|
|
98
|
+
}
|
|
99
|
+
else if (part.type === "tool") {
|
|
100
|
+
const toolState = part.state;
|
|
101
|
+
if (toolState?.input) {
|
|
102
|
+
contents.push(typeof toolState.input === "string"
|
|
103
|
+
? toolState.input
|
|
104
|
+
: JSON.stringify(toolState.input));
|
|
105
|
+
}
|
|
106
|
+
if (toolState?.status === "completed" && toolState?.output) {
|
|
107
|
+
contents.push(typeof toolState.output === "string"
|
|
108
|
+
? toolState.output
|
|
109
|
+
: JSON.stringify(toolState.output));
|
|
110
|
+
}
|
|
111
|
+
else if (toolState?.status === "error" && toolState?.error) {
|
|
112
|
+
contents.push(typeof toolState.error === "string"
|
|
113
|
+
? toolState.error
|
|
114
|
+
: JSON.stringify(toolState.error));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return contents;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../lib/tools/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,5 +5,6 @@ import { PluginConfig } from "../config";
|
|
|
5
5
|
export type PruneReason = "completion" | "noise" | "extraction";
|
|
6
6
|
export declare const PRUNE_REASON_LABELS: Record<PruneReason, string>;
|
|
7
7
|
export declare function sendUnifiedNotification(client: any, logger: Logger, config: PluginConfig, state: SessionState, sessionId: string, pruneToolIds: string[], toolMetadata: Map<string, ToolParameterEntry>, reason: PruneReason | undefined, params: any, workingDirectory: string, distillation?: string[]): Promise<boolean>;
|
|
8
|
+
export declare function sendSquashNotification(client: any, logger: Logger, config: PluginConfig, state: SessionState, sessionId: string, toolIds: string[], messageIds: string[], topic: string, summary: string, startResult: any, endResult: any, totalMessages: number, params: any): Promise<boolean>;
|
|
8
9
|
export declare function sendIgnoredMessage(client: any, sessionID: string, text: string, params: any, logger: Logger): Promise<void>;
|
|
9
10
|
//# sourceMappingURL=notification.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification.d.ts","sourceRoot":"","sources":["../../../lib/ui/notification.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"notification.d.ts","sourceRoot":"","sources":["../../../lib/ui/notification.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAS5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExC,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,OAAO,GAAG,YAAY,CAAA;AAC/D,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAI3D,CAAA;AA+CD,wBAAsB,uBAAuB,CACzC,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EAAE,EACtB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAC7C,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,MAAM,EAAE,GAAG,EACX,gBAAgB,EAAE,MAAM,EACxB,YAAY,CAAC,EAAE,MAAM,EAAE,GACxB,OAAO,CAAC,OAAO,CAAC,CA2BlB;AAED,wBAAsB,sBAAsB,CACxC,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EAAE,EACjB,UAAU,EAAE,MAAM,EAAE,EACpB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,GAAG,EAChB,SAAS,EAAE,GAAG,EACd,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,GAAG,GACZ,OAAO,CAAC,OAAO,CAAC,CAkClB;AAED,wBAAsB,kBAAkB,CACpC,MAAM,EAAE,GAAG,EACX,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAiCf"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { countDistillationTokens, formatExtracted, formatPrunedItemsList, formatStatsHeader, formatTokenCount, } from "./utils";
|
|
1
|
+
import { countDistillationTokens, formatExtracted, formatPrunedItemsList, formatStatsHeader, formatTokenCount, formatProgressBar, } from "./utils";
|
|
2
2
|
export const PRUNE_REASON_LABELS = {
|
|
3
3
|
completion: "Task Complete",
|
|
4
4
|
noise: "Noise Removal",
|
|
@@ -41,6 +41,34 @@ export async function sendUnifiedNotification(client, logger, config, state, ses
|
|
|
41
41
|
await sendIgnoredMessage(client, sessionId, message, params, logger);
|
|
42
42
|
return true;
|
|
43
43
|
}
|
|
44
|
+
export async function sendSquashNotification(client, logger, config, state, sessionId, toolIds, messageIds, topic, summary, startResult, endResult, totalMessages, params) {
|
|
45
|
+
if (config.pruneNotification === "off") {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
let message;
|
|
49
|
+
if (config.pruneNotification === "minimal") {
|
|
50
|
+
message = formatStatsHeader(state.stats.totalPruneTokens, state.stats.pruneTokenCounter);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
message = formatStatsHeader(state.stats.totalPruneTokens, state.stats.pruneTokenCounter);
|
|
54
|
+
const pruneTokenCounterStr = `~${formatTokenCount(state.stats.pruneTokenCounter)}`;
|
|
55
|
+
const progressBar = formatProgressBar(totalMessages, startResult.messageIndex, endResult.messageIndex, 25);
|
|
56
|
+
message += `\n\n▣ Squashing (${pruneTokenCounterStr}) ${progressBar}`;
|
|
57
|
+
message += `\n→ Topic: ${topic}`;
|
|
58
|
+
message += `\n→ Items: ${messageIds.length} messages`;
|
|
59
|
+
if (toolIds.length > 0) {
|
|
60
|
+
message += ` and ${toolIds.length} tools condensed`;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
message += ` condensed`;
|
|
64
|
+
}
|
|
65
|
+
if (config.tools.squash.showSummary) {
|
|
66
|
+
message += `\n→ Summary: ${summary}`;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
await sendIgnoredMessage(client, sessionId, message, params, logger);
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
44
72
|
export async function sendIgnoredMessage(client, sessionID, text, params, logger) {
|
|
45
73
|
const agent = params.agent || undefined;
|
|
46
74
|
const variant = params.variant || undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification.js","sourceRoot":"","sources":["../../../lib/ui/notification.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,uBAAuB,EACvB,eAAe,EACf,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"notification.js","sourceRoot":"","sources":["../../../lib/ui/notification.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/ui/utils.d.ts
CHANGED
|
@@ -4,13 +4,8 @@ export declare function formatExtracted(distillation?: string[]): string;
|
|
|
4
4
|
export declare function formatStatsHeader(totalTokensSaved: number, pruneTokenCounter: number): string;
|
|
5
5
|
export declare function formatTokenCount(tokens: number): string;
|
|
6
6
|
export declare function truncate(str: string, maxLen?: number): string;
|
|
7
|
+
export declare function formatProgressBar(total: number, start: number, end: number, width?: number): string;
|
|
7
8
|
export declare function shortenPath(input: string, workingDirectory?: string): string;
|
|
8
|
-
/**
|
|
9
|
-
* Formats a list of pruned items in the style: "→ tool: parameter"
|
|
10
|
-
*/
|
|
11
9
|
export declare function formatPrunedItemsList(pruneToolIds: string[], toolMetadata: Map<string, ToolParameterEntry>, workingDirectory?: string): string[];
|
|
12
|
-
/**
|
|
13
|
-
* Formats a PruningResult into a human-readable string for the prune tool output.
|
|
14
|
-
*/
|
|
15
10
|
export declare function formatPruningResultForTool(prunedIds: string[], toolMetadata: Map<string, ToolParameterEntry>, workingDirectory?: string): string;
|
|
16
11
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../lib/ui/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAI7C,wBAAgB,uBAAuB,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAGvE;AAED,wBAAgB,eAAe,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAS/D;AAED,wBAAgB,iBAAiB,CAAC,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAG7F;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKvD;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,MAAW,GAAG,MAAM,CAGjE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAU5E;AAeD
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../lib/ui/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAI7C,wBAAgB,uBAAuB,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAGvE;AAED,wBAAgB,eAAe,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAS/D;AAED,wBAAgB,iBAAiB,CAAC,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAG7F;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKvD;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,MAAW,GAAG,MAAM,CAGjE;AAED,wBAAgB,iBAAiB,CAC7B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,KAAK,GAAE,MAAW,GACnB,MAAM,CAgBR;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAU5E;AAeD,wBAAgB,qBAAqB,CACjC,YAAY,EAAE,MAAM,EAAE,EACtB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAC7C,gBAAgB,CAAC,EAAE,MAAM,GAC1B,MAAM,EAAE,CA0BV;AAED,wBAAgB,0BAA0B,CACtC,SAAS,EAAE,MAAM,EAAE,EACnB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAC7C,gBAAgB,CAAC,EAAE,MAAM,GAC1B,MAAM,CAWR"}
|
package/dist/lib/ui/utils.js
CHANGED
|
@@ -30,6 +30,22 @@ export function truncate(str, maxLen = 60) {
|
|
|
30
30
|
return str;
|
|
31
31
|
return str.slice(0, maxLen - 3) + "...";
|
|
32
32
|
}
|
|
33
|
+
export function formatProgressBar(total, start, end, width = 20) {
|
|
34
|
+
if (total <= 0)
|
|
35
|
+
return `│${" ".repeat(width)}│`;
|
|
36
|
+
const startIdx = Math.floor((start / total) * width);
|
|
37
|
+
const endIdx = Math.min(width - 1, Math.floor((end / total) * width));
|
|
38
|
+
let bar = "";
|
|
39
|
+
for (let i = 0; i < width; i++) {
|
|
40
|
+
if (i >= startIdx && i <= endIdx) {
|
|
41
|
+
bar += "░";
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
bar += "█";
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return `│${bar}│`;
|
|
48
|
+
}
|
|
33
49
|
export function shortenPath(input, workingDirectory) {
|
|
34
50
|
const inPathMatch = input.match(/^(.+) in (.+)$/);
|
|
35
51
|
if (inPathMatch) {
|
|
@@ -51,9 +67,6 @@ function shortenSinglePath(path, workingDirectory) {
|
|
|
51
67
|
}
|
|
52
68
|
return path;
|
|
53
69
|
}
|
|
54
|
-
/**
|
|
55
|
-
* Formats a list of pruned items in the style: "→ tool: parameter"
|
|
56
|
-
*/
|
|
57
70
|
export function formatPrunedItemsList(pruneToolIds, toolMetadata, workingDirectory) {
|
|
58
71
|
const lines = [];
|
|
59
72
|
for (const id of pruneToolIds) {
|
|
@@ -77,9 +90,6 @@ export function formatPrunedItemsList(pruneToolIds, toolMetadata, workingDirecto
|
|
|
77
90
|
}
|
|
78
91
|
return lines;
|
|
79
92
|
}
|
|
80
|
-
/**
|
|
81
|
-
* Formats a PruningResult into a human-readable string for the prune tool output.
|
|
82
|
-
*/
|
|
83
93
|
export function formatPruningResultForTool(prunedIds, toolMetadata, workingDirectory) {
|
|
84
94
|
const lines = [];
|
|
85
95
|
lines.push(`Context pruning complete. Pruned ${prunedIds.length} tool outputs.`);
|
package/dist/lib/ui/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../lib/ui/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEjD,MAAM,UAAU,uBAAuB,CAAC,YAAuB;IAC3D,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAA;IACxD,OAAO,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;AAC/C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,YAAuB;IACnD,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7C,OAAO,EAAE,CAAA;IACb,CAAC;IACD,IAAI,MAAM,GAAG,iBAAiB,CAAA;IAC9B,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,IAAI,UAAU,OAAO,EAAE,CAAA;IACjC,CAAC;IACD,OAAO,MAAM,CAAA;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,gBAAwB,EAAE,iBAAyB;IACjF,MAAM,mBAAmB,GAAG,IAAI,gBAAgB,CAAC,gBAAgB,GAAG,iBAAiB,CAAC,EAAE,CAAA;IACxF,OAAO,CAAC,WAAW,mBAAmB,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACpE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC3C,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACjB,OAAO,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,SAAS,CAAA;IAC3E,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAA;AACxC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,SAAiB,EAAE;IACrD,IAAI,GAAG,CAAC,MAAM,IAAI,MAAM;QAAE,OAAO,GAAG,CAAA;IACpC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAA;AAC3C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,gBAAyB;IAChE,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;IACjD,IAAI,WAAW,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;QAC7B,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;QAC/B,MAAM,aAAa,GAAG,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAA;QACnE,OAAO,GAAG,MAAM,OAAO,aAAa,EAAE,CAAA;IAC1C,CAAC;IAED,OAAO,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAA;AACrD,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,gBAAyB;IAC9D,IAAI,gBAAgB,EAAE,CAAC;QACnB,IAAI,IAAI,CAAC,UAAU,CAAC,gBAAgB,GAAG,GAAG,CAAC,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAClD,CAAC;QACD,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;YAC5B,OAAO,GAAG,CAAA;QACd,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAA;AACf,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../lib/ui/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "@tarquinen/opencode-dcp",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.3.0-beta.1",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "OpenCode plugin that optimizes token usage by pruning obsolete tool outputs from conversation context",
|
|
7
7
|
"main": "./dist/index.js",
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
"@anthropic-ai/tokenizer": "^0.0.4",
|
|
44
44
|
"@opencode-ai/sdk": "^1.1.3",
|
|
45
45
|
"jsonc-parser": "^3.3.1",
|
|
46
|
+
"ulid": "^3.0.2",
|
|
46
47
|
"zod": "^4.1.13"
|
|
47
48
|
},
|
|
48
49
|
"devDependencies": {
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export declare const NUDGE_BOTH = "<instruction name=context_management_required>\n**CRITICAL CONTEXT WARNING:** Your context window is filling with tool outputs. Strict adherence to context hygiene is required.\n\n**Immediate Actions Required:**\n1. **Task Completion:** If a sub-task is complete, decide: use `discard` if no valuable context to preserve (default), or use `extract` if insights are worth keeping.\n2. **Noise Removal:** If you read files or ran commands that yielded no value, use `discard` to remove them.\n3. **Knowledge Preservation:** If you are holding valuable raw data you'll need to reference later, use `extract` to distill the insights and remove the raw entry.\n\n**Protocol:** You should prioritize this cleanup, but do not interrupt a critical atomic operation if one is in progress. Once the immediate step is done, you must perform context management.\n</instruction>";
|
|
2
|
-
//# sourceMappingURL=both.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"both.d.ts","sourceRoot":"","sources":["../../../../lib/prompts/nudge/both.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,s2BASR,CAAA"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export const NUDGE_BOTH = `<instruction name=context_management_required>
|
|
2
|
-
**CRITICAL CONTEXT WARNING:** Your context window is filling with tool outputs. Strict adherence to context hygiene is required.
|
|
3
|
-
|
|
4
|
-
**Immediate Actions Required:**
|
|
5
|
-
1. **Task Completion:** If a sub-task is complete, decide: use \`discard\` if no valuable context to preserve (default), or use \`extract\` if insights are worth keeping.
|
|
6
|
-
2. **Noise Removal:** If you read files or ran commands that yielded no value, use \`discard\` to remove them.
|
|
7
|
-
3. **Knowledge Preservation:** If you are holding valuable raw data you'll need to reference later, use \`extract\` to distill the insights and remove the raw entry.
|
|
8
|
-
|
|
9
|
-
**Protocol:** You should prioritize this cleanup, but do not interrupt a critical atomic operation if one is in progress. Once the immediate step is done, you must perform context management.
|
|
10
|
-
</instruction>`;
|
|
11
|
-
//# sourceMappingURL=both.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"both.js","sourceRoot":"","sources":["../../../../lib/prompts/nudge/both.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;eASX,CAAA"}
|