opencode-recall 0.1.0
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 +21 -0
- package/README.md +161 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +123 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +73 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +779 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/explore-tool.d.ts +11 -0
- package/dist/lib/explore-tool.d.ts.map +1 -0
- package/dist/lib/explore-tool.js +240 -0
- package/dist/lib/explore-tool.js.map +1 -0
- package/dist/lib/hooks.d.ts +10 -0
- package/dist/lib/hooks.d.ts.map +1 -0
- package/dist/lib/hooks.js +58 -0
- package/dist/lib/hooks.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 +183 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/messages/index.d.ts +3 -0
- package/dist/lib/messages/index.d.ts.map +1 -0
- package/dist/lib/messages/index.js +3 -0
- package/dist/lib/messages/index.js.map +1 -0
- package/dist/lib/messages/inject.d.ts +5 -0
- package/dist/lib/messages/inject.d.ts.map +1 -0
- package/dist/lib/messages/inject.js +114 -0
- package/dist/lib/messages/inject.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 +179 -0
- package/dist/lib/messages/prune.js.map +1 -0
- package/dist/lib/messages/utils.d.ts +10 -0
- package/dist/lib/messages/utils.d.ts.map +1 -0
- package/dist/lib/messages/utils.js +193 -0
- package/dist/lib/messages/utils.js.map +1 -0
- package/dist/lib/prompts/agent/rcl-explorer.d.ts +2 -0
- package/dist/lib/prompts/agent/rcl-explorer.d.ts.map +1 -0
- package/dist/lib/prompts/agent/rcl-explorer.js +39 -0
- package/dist/lib/prompts/agent/rcl-explorer.js.map +1 -0
- package/dist/lib/prompts/discard-tool-spec.d.ts +2 -0
- package/dist/lib/prompts/discard-tool-spec.d.ts.map +1 -0
- package/dist/lib/prompts/discard-tool-spec.js +41 -0
- package/dist/lib/prompts/discard-tool-spec.js.map +1 -0
- package/dist/lib/prompts/extract-tool-spec.d.ts +2 -0
- package/dist/lib/prompts/extract-tool-spec.d.ts.map +1 -0
- package/dist/lib/prompts/extract-tool-spec.js +48 -0
- package/dist/lib/prompts/extract-tool-spec.js.map +1 -0
- package/dist/lib/prompts/index.d.ts +2 -0
- package/dist/lib/prompts/index.d.ts.map +1 -0
- package/dist/lib/prompts/index.js +41 -0
- package/dist/lib/prompts/index.js.map +1 -0
- package/dist/lib/prompts/nudge/both.d.ts +2 -0
- package/dist/lib/prompts/nudge/both.d.ts.map +1 -0
- package/dist/lib/prompts/nudge/both.js +11 -0
- package/dist/lib/prompts/nudge/both.js.map +1 -0
- package/dist/lib/prompts/nudge/discard.d.ts +2 -0
- package/dist/lib/prompts/nudge/discard.d.ts.map +1 -0
- package/dist/lib/prompts/nudge/discard.js +10 -0
- package/dist/lib/prompts/nudge/discard.js.map +1 -0
- package/dist/lib/prompts/nudge/extract.d.ts +2 -0
- package/dist/lib/prompts/nudge/extract.d.ts.map +1 -0
- package/dist/lib/prompts/nudge/extract.js +10 -0
- package/dist/lib/prompts/nudge/extract.js.map +1 -0
- package/dist/lib/prompts/restore-tool-spec.d.ts +2 -0
- package/dist/lib/prompts/restore-tool-spec.d.ts.map +1 -0
- package/dist/lib/prompts/restore-tool-spec.js +21 -0
- package/dist/lib/prompts/restore-tool-spec.js.map +1 -0
- package/dist/lib/prompts/system/both.d.ts +2 -0
- package/dist/lib/prompts/system/both.d.ts.map +1 -0
- package/dist/lib/prompts/system/both.js +72 -0
- package/dist/lib/prompts/system/both.js.map +1 -0
- package/dist/lib/prompts/system/core.d.ts +2 -0
- package/dist/lib/prompts/system/core.d.ts.map +1 -0
- package/dist/lib/prompts/system/core.js +26 -0
- package/dist/lib/prompts/system/core.js.map +1 -0
- package/dist/lib/prompts/system/discard.d.ts +2 -0
- package/dist/lib/prompts/system/discard.d.ts.map +1 -0
- package/dist/lib/prompts/system/discard.js +63 -0
- package/dist/lib/prompts/system/discard.js.map +1 -0
- package/dist/lib/prompts/system/extract.d.ts +2 -0
- package/dist/lib/prompts/system/extract.d.ts.map +1 -0
- package/dist/lib/prompts/system/extract.js +63 -0
- package/dist/lib/prompts/system/extract.js.map +1 -0
- package/dist/lib/protected-file-patterns.d.ts +12 -0
- package/dist/lib/protected-file-patterns.d.ts.map +1 -0
- package/dist/lib/protected-file-patterns.js +69 -0
- package/dist/lib/protected-file-patterns.js.map +1 -0
- package/dist/lib/pruned-blobs.d.ts +19 -0
- package/dist/lib/pruned-blobs.d.ts.map +1 -0
- package/dist/lib/pruned-blobs.js +111 -0
- package/dist/lib/pruned-blobs.js.map +1 -0
- package/dist/lib/rcl-pointer.d.ts +3 -0
- package/dist/lib/rcl-pointer.d.ts.map +1 -0
- package/dist/lib/rcl-pointer.js +63 -0
- package/dist/lib/rcl-pointer.js.map +1 -0
- package/dist/lib/restore-tool.d.ts +15 -0
- package/dist/lib/restore-tool.d.ts.map +1 -0
- package/dist/lib/restore-tool.js +142 -0
- package/dist/lib/restore-tool.js.map +1 -0
- package/dist/lib/shared-utils.d.ts +4 -0
- package/dist/lib/shared-utils.d.ts.map +1 -0
- package/dist/lib/shared-utils.js +14 -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 +16 -0
- package/dist/lib/state/persistence.d.ts.map +1 -0
- package/dist/lib/state/persistence.js +73 -0
- package/dist/lib/state/persistence.js.map +1 -0
- package/dist/lib/state/state.d.ts +8 -0
- package/dist/lib/state/state.d.ts.map +1 -0
- package/dist/lib/state/state.js +114 -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 +79 -0
- package/dist/lib/state/tool-cache.js.map +1 -0
- package/dist/lib/state/types.d.ts +33 -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 +2 -0
- package/dist/lib/state/utils.d.ts.map +1 -0
- package/dist/lib/state/utils.js +10 -0
- package/dist/lib/state/utils.js.map +1 -0
- package/dist/lib/strategies/deduplication.d.ts +10 -0
- package/dist/lib/strategies/deduplication.d.ts.map +1 -0
- package/dist/lib/strategies/deduplication.js +94 -0
- package/dist/lib/strategies/deduplication.js.map +1 -0
- package/dist/lib/strategies/index.d.ts +5 -0
- package/dist/lib/strategies/index.d.ts.map +1 -0
- package/dist/lib/strategies/index.js +5 -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 +59 -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 +84 -0
- package/dist/lib/strategies/supersede-writes.js.map +1 -0
- package/dist/lib/strategies/tools.d.ts +14 -0
- package/dist/lib/strategies/tools.d.ts.map +1 -0
- package/dist/lib/strategies/tools.js +135 -0
- package/dist/lib/strategies/tools.js.map +1 -0
- package/dist/lib/strategies/utils.d.ts +13 -0
- package/dist/lib/strategies/utils.d.ts.map +1 -0
- package/dist/lib/strategies/utils.js +93 -0
- package/dist/lib/strategies/utils.js.map +1 -0
- package/dist/lib/ui/notification.d.ts +8 -0
- package/dist/lib/ui/notification.d.ts.map +1 -0
- package/dist/lib/ui/notification.js +54 -0
- package/dist/lib/ui/notification.js.map +1 -0
- package/dist/lib/ui/utils.d.ts +15 -0
- package/dist/lib/ui/utils.d.ts.map +1 -0
- package/dist/lib/ui/utils.js +87 -0
- package/dist/lib/ui/utils.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { tool } from "@opencode-ai/plugin";
|
|
2
|
+
import type { SessionState } from "../state";
|
|
3
|
+
import type { PluginConfig } from "../config";
|
|
4
|
+
import type { Logger } from "../logger";
|
|
5
|
+
export interface PruneToolContext {
|
|
6
|
+
client: any;
|
|
7
|
+
state: SessionState;
|
|
8
|
+
logger: Logger;
|
|
9
|
+
config: PluginConfig;
|
|
10
|
+
workingDirectory: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function createDiscardTool(ctx: PruneToolContext): ReturnType<typeof tool>;
|
|
13
|
+
export declare function createExtractTool(ctx: PruneToolContext): ReturnType<typeof tool>;
|
|
14
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../lib/strategies/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAiC,MAAM,UAAU,CAAA;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAM7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAQvC,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;AA0HD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,gBAAgB,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAwBhF;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,gBAAgB,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAmChF"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { tool } from "@opencode-ai/plugin";
|
|
2
|
+
import { buildToolIdList } from "../messages/utils";
|
|
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 { loadPrompt } from "../prompts";
|
|
8
|
+
import { calculateTokensSaved, getCurrentParams } from "./utils";
|
|
9
|
+
import { getFilePathFromParameters, isProtectedFilePath } from "../protected-file-patterns";
|
|
10
|
+
const DISCARD_TOOL_DESCRIPTION = loadPrompt("discard-tool-spec");
|
|
11
|
+
const EXTRACT_TOOL_DESCRIPTION = loadPrompt("extract-tool-spec");
|
|
12
|
+
// Shared logic for executing prune operations.
|
|
13
|
+
async function executePruneOperation(ctx, toolCtx, ids, reason, toolName, distillation) {
|
|
14
|
+
const { client, state, logger, config, workingDirectory } = ctx;
|
|
15
|
+
const sessionId = toolCtx.sessionID;
|
|
16
|
+
logger.info(`${toolName} tool invoked`);
|
|
17
|
+
logger.info(JSON.stringify(reason ? { ids, reason } : { ids }));
|
|
18
|
+
if (!ids || ids.length === 0) {
|
|
19
|
+
logger.debug(`${toolName} tool called but ids is empty or undefined`);
|
|
20
|
+
return `No IDs provided. Check the <prunable-tools> list for available IDs to ${toolName.toLowerCase()}.`;
|
|
21
|
+
}
|
|
22
|
+
const numericToolIds = ids
|
|
23
|
+
.map((id) => parseInt(id, 10))
|
|
24
|
+
.filter((n) => !isNaN(n));
|
|
25
|
+
if (numericToolIds.length === 0) {
|
|
26
|
+
logger.debug(`No numeric tool IDs provided for ${toolName}: ` + JSON.stringify(ids));
|
|
27
|
+
return "No numeric IDs provided. Format: ids: [id1, id2, ...]";
|
|
28
|
+
}
|
|
29
|
+
// Fetch messages to calculate tokens and find current agent
|
|
30
|
+
const messagesResponse = await client.session.messages({
|
|
31
|
+
path: { id: sessionId },
|
|
32
|
+
});
|
|
33
|
+
const messages = messagesResponse.data || messagesResponse;
|
|
34
|
+
await ensureSessionInitialized(ctx.client, state, sessionId, logger, messages);
|
|
35
|
+
const currentParams = getCurrentParams(state, messages, logger);
|
|
36
|
+
const toolIdList = buildToolIdList(state, messages, logger);
|
|
37
|
+
// Validate that all numeric IDs are within bounds
|
|
38
|
+
if (numericToolIds.some((id) => id < 0 || id >= toolIdList.length)) {
|
|
39
|
+
logger.debug("Invalid tool IDs provided: " + numericToolIds.join(", "));
|
|
40
|
+
return "Invalid IDs provided. Only use numeric IDs from the <prunable-tools> list.";
|
|
41
|
+
}
|
|
42
|
+
// Validate that all IDs exist in cache and aren't protected
|
|
43
|
+
// (rejects hallucinated IDs and turn-protected tools not shown in <prunable-tools>)
|
|
44
|
+
for (const index of numericToolIds) {
|
|
45
|
+
const id = toolIdList[index];
|
|
46
|
+
const metadata = state.toolParameters.get(id);
|
|
47
|
+
if (!metadata) {
|
|
48
|
+
logger.debug("Rejecting prune request - ID not in cache (turn-protected or hallucinated)", { index, id });
|
|
49
|
+
return "Invalid IDs provided. Only use numeric IDs from the <prunable-tools> list.";
|
|
50
|
+
}
|
|
51
|
+
const allProtectedTools = config.tools.settings.protectedTools;
|
|
52
|
+
if (allProtectedTools.includes(metadata.tool)) {
|
|
53
|
+
logger.debug("Rejecting prune request - protected tool", {
|
|
54
|
+
index,
|
|
55
|
+
id,
|
|
56
|
+
tool: metadata.tool,
|
|
57
|
+
});
|
|
58
|
+
return "Invalid IDs provided. Only use numeric IDs from the <prunable-tools> list.";
|
|
59
|
+
}
|
|
60
|
+
const filePath = getFilePathFromParameters(metadata.parameters);
|
|
61
|
+
if (isProtectedFilePath(filePath, config.protectedFilePatterns)) {
|
|
62
|
+
logger.debug("Rejecting prune request - protected file path", {
|
|
63
|
+
index,
|
|
64
|
+
id,
|
|
65
|
+
tool: metadata.tool,
|
|
66
|
+
filePath,
|
|
67
|
+
});
|
|
68
|
+
return "Invalid IDs provided. Only use numeric IDs from the <prunable-tools> list.";
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const pruneToolIds = numericToolIds.map((index) => toolIdList[index]);
|
|
72
|
+
state.prune.toolIds.push(...pruneToolIds);
|
|
73
|
+
const toolMetadata = new Map();
|
|
74
|
+
for (const id of pruneToolIds) {
|
|
75
|
+
const toolParameters = state.toolParameters.get(id);
|
|
76
|
+
if (toolParameters) {
|
|
77
|
+
toolMetadata.set(id, toolParameters);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
logger.debug("No metadata found for ID", { id });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
state.stats.pruneTokenCounter += calculateTokensSaved(state, messages, pruneToolIds);
|
|
84
|
+
await sendUnifiedNotification(client, logger, config, state, sessionId, pruneToolIds, toolMetadata, reason, currentParams, workingDirectory, distillation);
|
|
85
|
+
state.stats.totalPruneTokens += state.stats.pruneTokenCounter;
|
|
86
|
+
state.stats.pruneTokenCounter = 0;
|
|
87
|
+
state.nudgeCounter = 0;
|
|
88
|
+
saveSessionState(state, logger).catch((err) => logger.error("Failed to persist state", { error: err.message }));
|
|
89
|
+
return formatPruningResultForTool(pruneToolIds, toolMetadata, workingDirectory);
|
|
90
|
+
}
|
|
91
|
+
export function createDiscardTool(ctx) {
|
|
92
|
+
return tool({
|
|
93
|
+
description: DISCARD_TOOL_DESCRIPTION,
|
|
94
|
+
args: {
|
|
95
|
+
ids: tool.schema
|
|
96
|
+
.array(tool.schema.string())
|
|
97
|
+
.describe("First element is the reason ('completion' or 'noise'), followed by numeric IDs as strings to discard"),
|
|
98
|
+
},
|
|
99
|
+
async execute(args, toolCtx) {
|
|
100
|
+
// Parse reason from first element, numeric IDs from the rest
|
|
101
|
+
const reason = args.ids?.[0];
|
|
102
|
+
const validReasons = ["completion", "noise"];
|
|
103
|
+
if (typeof reason !== "string" || !validReasons.includes(reason)) {
|
|
104
|
+
ctx.logger.debug("Invalid discard reason provided: " + reason);
|
|
105
|
+
return "No valid reason found. Use 'completion' or 'noise' as the first element.";
|
|
106
|
+
}
|
|
107
|
+
const numericIds = args.ids.slice(1);
|
|
108
|
+
return executePruneOperation(ctx, toolCtx, numericIds, reason, "Discard");
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
export function createExtractTool(ctx) {
|
|
113
|
+
return tool({
|
|
114
|
+
description: EXTRACT_TOOL_DESCRIPTION,
|
|
115
|
+
args: {
|
|
116
|
+
ids: tool.schema
|
|
117
|
+
.array(tool.schema.string())
|
|
118
|
+
.describe("Numeric IDs as strings to extract from the <prunable-tools> list"),
|
|
119
|
+
distillation: tool.schema
|
|
120
|
+
.array(tool.schema.string())
|
|
121
|
+
.describe("REQUIRED. Array of strings, one per ID (positional: distillation[0] is for ids[0], etc.)"),
|
|
122
|
+
},
|
|
123
|
+
async execute(args, toolCtx) {
|
|
124
|
+
if (!args.distillation || args.distillation.length === 0) {
|
|
125
|
+
ctx.logger.debug("Extract tool called without distillation: " + JSON.stringify(args));
|
|
126
|
+
return "Missing distillation. You must provide a distillation string for each ID.";
|
|
127
|
+
}
|
|
128
|
+
// Log the distillation for debugging/analysis
|
|
129
|
+
ctx.logger.info("Distillation data received:");
|
|
130
|
+
ctx.logger.info(JSON.stringify(args.distillation, null, 2));
|
|
131
|
+
return executePruneOperation(ctx, toolCtx, args.ids, "extraction", "Extract", args.distillation);
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../lib/strategies/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAG1C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAe,uBAAuB,EAAE,MAAM,oBAAoB,CAAA;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAA;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAChE,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAE3F,MAAM,wBAAwB,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAA;AAChE,MAAM,wBAAwB,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAA;AAUhE,+CAA+C;AAC/C,KAAK,UAAU,qBAAqB,CAChC,GAAqB,EACrB,OAA8B,EAC9B,GAAa,EACb,MAAmB,EACnB,QAAgB,EAChB,YAAuB;IAEvB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,GAAG,CAAA;IAC/D,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAA;IAEnC,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,eAAe,CAAC,CAAA;IACvC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAE/D,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,4CAA4C,CAAC,CAAA;QACrE,OAAO,yEAAyE,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAA;IAC7G,CAAC;IAED,MAAM,cAAc,GAAa,GAAG;SAC/B,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;SAC7B,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAE1C,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,oCAAoC,QAAQ,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAA;QACpF,OAAO,uDAAuD,CAAA;IAClE,CAAC;IAED,4DAA4D;IAC5D,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;QACnD,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE;KAC1B,CAAC,CAAA;IACF,MAAM,QAAQ,GAAgB,gBAAgB,CAAC,IAAI,IAAI,gBAAgB,CAAA;IAEvE,MAAM,wBAAwB,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;IAE9E,MAAM,aAAa,GAAG,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;IAC/D,MAAM,UAAU,GAAa,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;IAErE,kDAAkD;IAClD,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACjE,MAAM,CAAC,KAAK,CAAC,6BAA6B,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACvE,OAAO,4EAA4E,CAAA;IACvF,CAAC;IAED,4DAA4D;IAC5D,oFAAoF;IACpF,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACjC,MAAM,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;QAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC7C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,MAAM,CAAC,KAAK,CACR,4EAA4E,EAC5E,EAAE,KAAK,EAAE,EAAE,EAAE,CAChB,CAAA;YACD,OAAO,4EAA4E,CAAA;QACvF,CAAC;QACD,MAAM,iBAAiB,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAA;QAC9D,IAAI,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE;gBACrD,KAAK;gBACL,EAAE;gBACF,IAAI,EAAE,QAAQ,CAAC,IAAI;aACtB,CAAC,CAAA;YACF,OAAO,4EAA4E,CAAA;QACvF,CAAC;QAED,MAAM,QAAQ,GAAG,yBAAyB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;QAC/D,IAAI,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAC9D,MAAM,CAAC,KAAK,CAAC,+CAA+C,EAAE;gBAC1D,KAAK;gBACL,EAAE;gBACF,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,QAAQ;aACX,CAAC,CAAA;YACF,OAAO,4EAA4E,CAAA;QACvF,CAAC;IACL,CAAC;IAED,MAAM,YAAY,GAAa,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;IAC/E,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAA;IAEzC,MAAM,YAAY,GAAG,IAAI,GAAG,EAA8B,CAAA;IAC1D,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACnD,IAAI,cAAc,EAAE,CAAC;YACjB,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;QACxC,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QACpD,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,iBAAiB,IAAI,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAA;IAEpF,MAAM,uBAAuB,CACzB,MAAM,EACN,MAAM,EACN,MAAM,EACN,KAAK,EACL,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,MAAM,EACN,aAAa,EACb,gBAAgB,EAChB,YAAY,CACf,CAAA;IAED,KAAK,CAAC,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAA;IAC7D,KAAK,CAAC,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAA;IACjC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAA;IAEtB,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAC1C,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAClE,CAAA;IAED,OAAO,0BAA0B,CAAC,YAAY,EAAE,YAAY,EAAE,gBAAgB,CAAC,CAAA;AACnF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAqB;IACnD,OAAO,IAAI,CAAC;QACR,WAAW,EAAE,wBAAwB;QACrC,IAAI,EAAE;YACF,GAAG,EAAE,IAAI,CAAC,MAAM;iBACX,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;iBAC3B,QAAQ,CACL,sGAAsG,CACzG;SACR;QACD,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO;YACvB,6DAA6D;YAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;YAC5B,MAAM,YAAY,GAAG,CAAC,YAAY,EAAE,OAAO,CAAU,CAAA;YACrD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAa,CAAC,EAAE,CAAC;gBACtE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,GAAG,MAAM,CAAC,CAAA;gBAC9D,OAAO,0EAA0E,CAAA;YACrF,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YAEpC,OAAO,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,MAAqB,EAAE,SAAS,CAAC,CAAA;QAC5F,CAAC;KACJ,CAAC,CAAA;AACN,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAqB;IACnD,OAAO,IAAI,CAAC;QACR,WAAW,EAAE,wBAAwB;QACrC,IAAI,EAAE;YACF,GAAG,EAAE,IAAI,CAAC,MAAM;iBACX,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;iBAC3B,QAAQ,CAAC,kEAAkE,CAAC;YACjF,YAAY,EAAE,IAAI,CAAC,MAAM;iBACpB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;iBAC3B,QAAQ,CACL,0FAA0F,CAC7F;SACR;QACD,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO;YACvB,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvD,GAAG,CAAC,MAAM,CAAC,KAAK,CACZ,4CAA4C,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CACtE,CAAA;gBACD,OAAO,2EAA2E,CAAA;YACtF,CAAC;YAED,8CAA8C;YAC9C,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAA;YAC9C,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YAE3D,OAAO,qBAAqB,CACxB,GAAG,EACH,OAAO,EACP,IAAI,CAAC,GAAG,EACR,YAA2B,EAC3B,SAAS,EACT,IAAI,CAAC,YAAY,CACpB,CAAA;QACL,CAAC;KACJ,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { SessionState, WithParts } from "../state";
|
|
2
|
+
import { Logger } from "../logger";
|
|
3
|
+
export declare function getCurrentParams(state: SessionState, messages: WithParts[], logger: Logger): {
|
|
4
|
+
providerId: string | undefined;
|
|
5
|
+
modelId: string | undefined;
|
|
6
|
+
agent: string | undefined;
|
|
7
|
+
variant: string | undefined;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Calculates approximate tokens saved by pruning the given tool call IDs.
|
|
11
|
+
*/
|
|
12
|
+
export declare const calculateTokensSaved: (state: SessionState, messages: WithParts[], pruneToolIds: string[]) => number;
|
|
13
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../lib/strategies/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAElD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAIlC,wBAAgB,gBAAgB,CAC5B,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;AAaD;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAC7B,OAAO,YAAY,EACnB,UAAU,SAAS,EAAE,EACrB,cAAc,MAAM,EAAE,KACvB,MA+DF,CAAA"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { encode } from "gpt-tokenizer";
|
|
2
|
+
import { getLastUserMessage, isMessageCompacted } from "../shared-utils";
|
|
3
|
+
export function getCurrentParams(state, messages, logger) {
|
|
4
|
+
const userMsg = getLastUserMessage(messages);
|
|
5
|
+
if (!userMsg) {
|
|
6
|
+
logger.debug("No user message found when determining current params");
|
|
7
|
+
return {
|
|
8
|
+
providerId: undefined,
|
|
9
|
+
modelId: undefined,
|
|
10
|
+
agent: undefined,
|
|
11
|
+
variant: state.variant,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
const userInfo = userMsg.info;
|
|
15
|
+
const agent = userInfo.agent;
|
|
16
|
+
const providerId = userInfo.model.providerID;
|
|
17
|
+
const modelId = userInfo.model.modelID;
|
|
18
|
+
const variant = state.variant ?? userInfo.variant;
|
|
19
|
+
return { providerId, modelId, agent, variant };
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Estimates token counts for a batch of texts using gpt-tokenizer.
|
|
23
|
+
*/
|
|
24
|
+
function estimateTokensBatch(texts) {
|
|
25
|
+
try {
|
|
26
|
+
return texts.map((text) => encode(text).length);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return texts.map((text) => Math.round(text.length / 4));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Calculates approximate tokens saved by pruning the given tool call IDs.
|
|
34
|
+
*/
|
|
35
|
+
export const calculateTokensSaved = (state, messages, pruneToolIds) => {
|
|
36
|
+
try {
|
|
37
|
+
const contents = [];
|
|
38
|
+
for (const msg of messages) {
|
|
39
|
+
if (isMessageCompacted(state, msg)) {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
for (const part of msg.parts) {
|
|
43
|
+
if (part.type !== "tool" || !pruneToolIds.includes(part.callID)) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (part.tool === "question") {
|
|
47
|
+
const questions = part.state.input?.questions;
|
|
48
|
+
if (questions !== undefined) {
|
|
49
|
+
const content = typeof questions === "string" ? questions : JSON.stringify(questions);
|
|
50
|
+
contents.push(content);
|
|
51
|
+
}
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
// Some strategies (e.g. supersedeWrites / purgeErrors) primarily prune tool *inputs*.
|
|
55
|
+
// Approximate that savings by counting large string inputs that our pruning step removes.
|
|
56
|
+
const shouldCountInputs = part.tool === "write" || part.tool === "edit" || part.state.status === "error";
|
|
57
|
+
if (shouldCountInputs) {
|
|
58
|
+
const input = part.state?.input;
|
|
59
|
+
if (input && typeof input === "object") {
|
|
60
|
+
for (const [key, value] of Object.entries(input)) {
|
|
61
|
+
if (key === "filePath" ||
|
|
62
|
+
key === "path" ||
|
|
63
|
+
key === "offset" ||
|
|
64
|
+
key === "limit")
|
|
65
|
+
continue;
|
|
66
|
+
if (typeof value === "string" && value.length >= 200) {
|
|
67
|
+
contents.push(value);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (part.state.status === "completed") {
|
|
73
|
+
const content = typeof part.state.output === "string"
|
|
74
|
+
? part.state.output
|
|
75
|
+
: JSON.stringify(part.state.output);
|
|
76
|
+
contents.push(content);
|
|
77
|
+
}
|
|
78
|
+
else if (part.state.status === "error") {
|
|
79
|
+
const content = typeof part.state.error === "string"
|
|
80
|
+
? part.state.error
|
|
81
|
+
: JSON.stringify(part.state.error);
|
|
82
|
+
contents.push(content);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const tokenCounts = estimateTokensBatch(contents);
|
|
87
|
+
return tokenCounts.reduce((sum, count) => sum + count, 0);
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
return 0;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
//# 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,8 @@
|
|
|
1
|
+
import type { Logger } from "../logger";
|
|
2
|
+
import type { SessionState } from "../state";
|
|
3
|
+
import { ToolParameterEntry } from "../state";
|
|
4
|
+
import { PluginConfig } from "../config";
|
|
5
|
+
export type PruneReason = "completion" | "noise" | "extraction";
|
|
6
|
+
export declare const PRUNE_REASON_LABELS: Record<PruneReason, string>;
|
|
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
|
+
//# sourceMappingURL=notification.d.ts.map
|
|
@@ -0,0 +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;AAO5C,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;AAqCD,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,CA4BlB"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { formatExtracted, formatPrunedItemsList, formatStatsHeader, formatTokenCount, } from "./utils";
|
|
2
|
+
export const PRUNE_REASON_LABELS = {
|
|
3
|
+
completion: "Task Complete",
|
|
4
|
+
noise: "Noise Removal",
|
|
5
|
+
extraction: "Extraction",
|
|
6
|
+
};
|
|
7
|
+
function buildMinimalMessage(state, reason, distillation) {
|
|
8
|
+
const reasonSuffix = reason ? ` — ${PRUNE_REASON_LABELS[reason]}` : "";
|
|
9
|
+
let message = formatStatsHeader(state.stats.totalPruneTokens, state.stats.pruneTokenCounter) +
|
|
10
|
+
reasonSuffix;
|
|
11
|
+
return message + formatExtracted(distillation);
|
|
12
|
+
}
|
|
13
|
+
function buildDetailedMessage(state, reason, pruneToolIds, toolMetadata, workingDirectory, distillation) {
|
|
14
|
+
let message = formatStatsHeader(state.stats.totalPruneTokens, state.stats.pruneTokenCounter);
|
|
15
|
+
if (pruneToolIds.length > 0) {
|
|
16
|
+
const pruneTokenCounterStr = `~${formatTokenCount(state.stats.pruneTokenCounter)}`;
|
|
17
|
+
const reasonLabel = reason ? ` — ${PRUNE_REASON_LABELS[reason]}` : "";
|
|
18
|
+
message += `\n\n▣ Pruning (${pruneTokenCounterStr})${reasonLabel}`;
|
|
19
|
+
const itemLines = formatPrunedItemsList(pruneToolIds, toolMetadata, workingDirectory);
|
|
20
|
+
message += "\n" + itemLines.join("\n");
|
|
21
|
+
}
|
|
22
|
+
return (message + formatExtracted(distillation)).trim();
|
|
23
|
+
}
|
|
24
|
+
export async function sendUnifiedNotification(client, logger, config, state, sessionId, pruneToolIds, toolMetadata, reason, params, workingDirectory, distillation) {
|
|
25
|
+
const hasPruned = pruneToolIds.length > 0;
|
|
26
|
+
if (!hasPruned) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
if (config.pruneNotification === "off") {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
const showExtraction = config.tools.extract.showDistillation ? distillation : undefined;
|
|
33
|
+
const message = config.pruneNotification === "minimal"
|
|
34
|
+
? buildMinimalMessage(state, reason, showExtraction)
|
|
35
|
+
: buildDetailedMessage(state, reason, pruneToolIds, toolMetadata, workingDirectory, showExtraction);
|
|
36
|
+
// Notifications are shown via toast only. This avoids injecting extra messages
|
|
37
|
+
// into the session history (which can leak into the LLM context in some runtimes).
|
|
38
|
+
await showToastNotification(client, message, reason, config.pruneNotification).catch(() => { });
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
async function showToastNotification(client, message, reason, level) {
|
|
42
|
+
if (!client?.tui?.showToast) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const title = reason ? `RCL — ${PRUNE_REASON_LABELS[reason]}` : "RCL";
|
|
46
|
+
const variant = reason === "extraction" || reason === "completion" ? "success" : "info";
|
|
47
|
+
const duration = level === "minimal" ? 4000 : 8000;
|
|
48
|
+
await client.tui
|
|
49
|
+
.showToast({
|
|
50
|
+
body: { title, message, variant, duration },
|
|
51
|
+
})
|
|
52
|
+
.catch(() => { });
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=notification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification.js","sourceRoot":"","sources":["../../../lib/ui/notification.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ToolParameterEntry } from "../state";
|
|
2
|
+
export declare function formatExtracted(distillation?: string[]): string;
|
|
3
|
+
export declare function formatStatsHeader(totalTokensSaved: number, pruneTokenCounter: number): string;
|
|
4
|
+
export declare function formatTokenCount(tokens: number): string;
|
|
5
|
+
export declare function truncate(str: string, maxLen?: number): string;
|
|
6
|
+
export declare function shortenPath(input: string, workingDirectory?: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* Formats a list of pruned items in the style: "→ tool: parameter"
|
|
9
|
+
*/
|
|
10
|
+
export declare function formatPrunedItemsList(pruneToolIds: string[], toolMetadata: Map<string, ToolParameterEntry>, workingDirectory?: string): string[];
|
|
11
|
+
/**
|
|
12
|
+
* Formats a PruningResult into a human-readable string for the prune tool output.
|
|
13
|
+
*/
|
|
14
|
+
export declare function formatPruningResultForTool(prunedIds: string[], toolMetadata: Map<string, ToolParameterEntry>, workingDirectory?: string): string;
|
|
15
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../lib/ui/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAG7C,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;;GAEG;AACH,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;;GAEG;AACH,wBAAgB,0BAA0B,CACtC,SAAS,EAAE,MAAM,EAAE,EACnB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAC7C,gBAAgB,CAAC,EAAE,MAAM,GAC1B,MAAM,CAWR"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { extractParameterKey } from "../messages/utils";
|
|
2
|
+
export function formatExtracted(distillation) {
|
|
3
|
+
if (!distillation || distillation.length === 0) {
|
|
4
|
+
return "";
|
|
5
|
+
}
|
|
6
|
+
let result = `\n\n▣ Extracted`;
|
|
7
|
+
for (const finding of distillation) {
|
|
8
|
+
result += `\n───\n${finding}`;
|
|
9
|
+
}
|
|
10
|
+
return result;
|
|
11
|
+
}
|
|
12
|
+
export function formatStatsHeader(totalTokensSaved, pruneTokenCounter) {
|
|
13
|
+
const totalTokensSavedStr = `~${formatTokenCount(totalTokensSaved + pruneTokenCounter)}`;
|
|
14
|
+
return [`▣ RCL | ${totalTokensSavedStr} saved total`].join("\n");
|
|
15
|
+
}
|
|
16
|
+
export function formatTokenCount(tokens) {
|
|
17
|
+
if (tokens >= 1000) {
|
|
18
|
+
return `${(tokens / 1000).toFixed(1)}K`.replace(".0K", "K") + " tokens";
|
|
19
|
+
}
|
|
20
|
+
return tokens.toString() + " tokens";
|
|
21
|
+
}
|
|
22
|
+
export function truncate(str, maxLen = 60) {
|
|
23
|
+
if (str.length <= maxLen)
|
|
24
|
+
return str;
|
|
25
|
+
return str.slice(0, maxLen - 3) + "...";
|
|
26
|
+
}
|
|
27
|
+
export function shortenPath(input, workingDirectory) {
|
|
28
|
+
const inPathMatch = input.match(/^(.+) in (.+)$/);
|
|
29
|
+
if (inPathMatch) {
|
|
30
|
+
const prefix = inPathMatch[1];
|
|
31
|
+
const pathPart = inPathMatch[2];
|
|
32
|
+
const shortenedPath = shortenSinglePath(pathPart, workingDirectory);
|
|
33
|
+
return `${prefix} in ${shortenedPath}`;
|
|
34
|
+
}
|
|
35
|
+
return shortenSinglePath(input, workingDirectory);
|
|
36
|
+
}
|
|
37
|
+
function shortenSinglePath(path, workingDirectory) {
|
|
38
|
+
if (workingDirectory) {
|
|
39
|
+
if (path.startsWith(workingDirectory + "/")) {
|
|
40
|
+
return path.slice(workingDirectory.length + 1);
|
|
41
|
+
}
|
|
42
|
+
if (path === workingDirectory) {
|
|
43
|
+
return ".";
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return path;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Formats a list of pruned items in the style: "→ tool: parameter"
|
|
50
|
+
*/
|
|
51
|
+
export function formatPrunedItemsList(pruneToolIds, toolMetadata, workingDirectory) {
|
|
52
|
+
const lines = [];
|
|
53
|
+
for (const id of pruneToolIds) {
|
|
54
|
+
const metadata = toolMetadata.get(id);
|
|
55
|
+
if (metadata) {
|
|
56
|
+
const paramKey = extractParameterKey(metadata.tool, metadata.parameters);
|
|
57
|
+
if (paramKey) {
|
|
58
|
+
// Use 60 char limit to match notification style
|
|
59
|
+
const displayKey = truncate(shortenPath(paramKey, workingDirectory), 60);
|
|
60
|
+
lines.push(`→ ${metadata.tool}: ${displayKey}`);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
lines.push(`→ ${metadata.tool}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const knownCount = pruneToolIds.filter((id) => toolMetadata.has(id)).length;
|
|
68
|
+
const unknownCount = pruneToolIds.length - knownCount;
|
|
69
|
+
if (unknownCount > 0) {
|
|
70
|
+
lines.push(`→ (${unknownCount} tool${unknownCount > 1 ? "s" : ""} with unknown metadata)`);
|
|
71
|
+
}
|
|
72
|
+
return lines;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Formats a PruningResult into a human-readable string for the prune tool output.
|
|
76
|
+
*/
|
|
77
|
+
export function formatPruningResultForTool(prunedIds, toolMetadata, workingDirectory) {
|
|
78
|
+
const lines = [];
|
|
79
|
+
lines.push(`Context pruning complete. Pruned ${prunedIds.length} tool outputs.`);
|
|
80
|
+
lines.push("");
|
|
81
|
+
if (prunedIds.length > 0) {
|
|
82
|
+
lines.push(`Semantically pruned (${prunedIds.length}):`);
|
|
83
|
+
lines.push(...formatPrunedItemsList(prunedIds, toolMetadata, workingDirectory));
|
|
84
|
+
}
|
|
85
|
+
return lines.join("\n").trim();
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../lib/ui/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json.schemastore.org/package.json",
|
|
3
|
+
"name": "opencode-recall",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"description": "OpenCode plugin for reversible context pruning: prune tool I/O into on-disk blobs and restore on demand",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"scripts": {
|
|
10
|
+
"clean": "rm -rf dist",
|
|
11
|
+
"build": "npm run clean && npx -p typescript tsc",
|
|
12
|
+
"postbuild": "rm -rf dist/logs",
|
|
13
|
+
"prepublishOnly": "npm run build",
|
|
14
|
+
"dev": "opencode plugin dev",
|
|
15
|
+
"typecheck": "tsc --noEmit",
|
|
16
|
+
"test": "node --import tsx --test tests/*.test.ts",
|
|
17
|
+
"format": "prettier --write .",
|
|
18
|
+
"format:check": "prettier --check ."
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"opencode",
|
|
22
|
+
"opencode-plugin",
|
|
23
|
+
"plugin",
|
|
24
|
+
"context",
|
|
25
|
+
"pruning",
|
|
26
|
+
"reversible",
|
|
27
|
+
"restore",
|
|
28
|
+
"recall",
|
|
29
|
+
"optimization",
|
|
30
|
+
"tokens"
|
|
31
|
+
],
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "git+https://github.com/SleepingBag945/opencode-recall.git"
|
|
35
|
+
},
|
|
36
|
+
"bugs": {
|
|
37
|
+
"url": "https://github.com/SleepingBag945/opencode-recall/issues"
|
|
38
|
+
},
|
|
39
|
+
"homepage": "https://github.com/SleepingBag945/opencode-recall#readme",
|
|
40
|
+
"author": "SleepingBag945",
|
|
41
|
+
"license": "MIT",
|
|
42
|
+
"peerDependencies": {
|
|
43
|
+
"@opencode-ai/plugin": ">=0.13.7"
|
|
44
|
+
},
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"@opencode-ai/sdk": "^1.1.3",
|
|
47
|
+
"gpt-tokenizer": "^3.4.0",
|
|
48
|
+
"jsonc-parser": "^3.3.1",
|
|
49
|
+
"zod": "^4.1.13"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@opencode-ai/plugin": "^1.0.143",
|
|
53
|
+
"@types/node": "^24.10.1",
|
|
54
|
+
"prettier": "^3.4.2",
|
|
55
|
+
"tsx": "^4.21.0",
|
|
56
|
+
"typescript": "^5.9.3"
|
|
57
|
+
},
|
|
58
|
+
"files": [
|
|
59
|
+
"dist/",
|
|
60
|
+
"README.md",
|
|
61
|
+
"LICENSE"
|
|
62
|
+
]
|
|
63
|
+
}
|