@tuanhung303/opencode-acp 2.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 +288 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +71 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/commands/context.d.ts +49 -0
- package/dist/lib/commands/context.d.ts.map +1 -0
- package/dist/lib/commands/context.js +191 -0
- package/dist/lib/commands/context.js.map +1 -0
- package/dist/lib/commands/help.d.ts +15 -0
- package/dist/lib/commands/help.d.ts.map +1 -0
- package/dist/lib/commands/help.js +26 -0
- package/dist/lib/commands/help.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 +44 -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 +191 -0
- package/dist/lib/commands/sweep.js.map +1 -0
- package/dist/lib/config.d.ts +82 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +864 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/hooks.d.ts +17 -0
- package/dist/lib/hooks.d.ts.map +1 -0
- package/dist/lib/hooks.js +123 -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 +189 -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 +127 -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 +86 -0
- package/dist/lib/messages/prune.js.map +1 -0
- package/dist/lib/messages/utils.d.ts +31 -0
- package/dist/lib/messages/utils.d.ts.map +1 -0
- package/dist/lib/messages/utils.js +228 -0
- package/dist/lib/messages/utils.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 +34 -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/system/both.d.ts +2 -0
- package/dist/lib/prompts/system/both.d.ts.map +1 -0
- package/dist/lib/prompts/system/both.js +61 -0
- package/dist/lib/prompts/system/both.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 +52 -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 +52 -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/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 +22 -0
- package/dist/lib/state/persistence.d.ts.map +1 -0
- package/dist/lib/state/persistence.js +107 -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 +115 -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 +77 -0
- package/dist/lib/state/tool-cache.js.map +1 -0
- package/dist/lib/state/types.d.ts +38 -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/head-tail-truncation.d.ts +15 -0
- package/dist/lib/strategies/head-tail-truncation.d.ts.map +1 -0
- package/dist/lib/strategies/head-tail-truncation.js +144 -0
- package/dist/lib/strategies/head-tail-truncation.js.map +1 -0
- package/dist/lib/strategies/index.d.ts +9 -0
- package/dist/lib/strategies/index.d.ts.map +1 -0
- package/dist/lib/strategies/index.js +9 -0
- package/dist/lib/strategies/index.js.map +1 -0
- package/dist/lib/strategies/placeholder-compression.d.ts +5 -0
- package/dist/lib/strategies/placeholder-compression.d.ts.map +1 -0
- package/dist/lib/strategies/placeholder-compression.js +148 -0
- package/dist/lib/strategies/placeholder-compression.js.map +1 -0
- package/dist/lib/strategies/prune-thinking.d.ts +15 -0
- package/dist/lib/strategies/prune-thinking.d.ts.map +1 -0
- package/dist/lib/strategies/prune-thinking.js +79 -0
- package/dist/lib/strategies/prune-thinking.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/read-consolidation.d.ts +21 -0
- package/dist/lib/strategies/read-consolidation.d.ts.map +1 -0
- package/dist/lib/strategies/read-consolidation.js +155 -0
- package/dist/lib/strategies/read-consolidation.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 +11 -0
- package/dist/lib/strategies/utils.d.ts.map +1 -0
- package/dist/lib/strategies/utils.js +75 -0
- package/dist/lib/strategies/utils.js.map +1 -0
- package/dist/lib/ui/notification.d.ts +9 -0
- package/dist/lib/ui/notification.d.ts.map +1 -0
- package/dist/lib/ui/notification.js +77 -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 +87 -0
- package/dist/lib/ui/utils.js.map +1 -0
- package/package.json +67 -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;AAoID,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,gBAAgB,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CA0BhF;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,gBAAgB,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAqChF"}
|
|
@@ -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
|
+
throw new Error(`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
|
+
throw new Error("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
|
+
throw new Error("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
|
+
throw new Error("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
|
+
throw new Error("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
|
+
throw new Error("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
|
+
throw new Error("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
|
+
throw new Error("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":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
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
|
+
export declare function countTokens(text: string): number;
|
|
10
|
+
export declare const calculateTokensSaved: (state: SessionState, messages: WithParts[], pruneToolIds: string[]) => number;
|
|
11
|
+
//# 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;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOhD;AAMD,eAAO,MAAM,oBAAoB,GAC7B,OAAO,YAAY,EACnB,UAAU,SAAS,EAAE,EACrB,cAAc,MAAM,EAAE,KACvB,MAyCF,CAAA"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { countTokens as anthropicCountTokens } from "@anthropic-ai/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
|
+
export function countTokens(text) {
|
|
22
|
+
if (!text)
|
|
23
|
+
return 0;
|
|
24
|
+
try {
|
|
25
|
+
return anthropicCountTokens(text);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return Math.round(text.length / 4);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function estimateTokensBatch(texts) {
|
|
32
|
+
return texts.map(countTokens);
|
|
33
|
+
}
|
|
34
|
+
export const calculateTokensSaved = (state, messages, pruneToolIds) => {
|
|
35
|
+
try {
|
|
36
|
+
const contents = [];
|
|
37
|
+
for (const msg of messages) {
|
|
38
|
+
if (isMessageCompacted(state, msg)) {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const parts = Array.isArray(msg.parts) ? msg.parts : [];
|
|
42
|
+
for (const part of 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
|
+
if (part.state.status === "completed") {
|
|
55
|
+
const content = typeof part.state.output === "string"
|
|
56
|
+
? part.state.output
|
|
57
|
+
: JSON.stringify(part.state.output);
|
|
58
|
+
contents.push(content);
|
|
59
|
+
}
|
|
60
|
+
else if (part.state.status === "error") {
|
|
61
|
+
const content = typeof part.state.error === "string"
|
|
62
|
+
? part.state.error
|
|
63
|
+
: JSON.stringify(part.state.error);
|
|
64
|
+
contents.push(content);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const tokenCounts = estimateTokensBatch(contents);
|
|
69
|
+
return tokenCounts.reduce((sum, count) => sum + count, 0);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
return 0;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
//# 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,9 @@
|
|
|
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
|
+
export declare function sendIgnoredMessage(client: any, sessionID: string, text: string, params: any, logger: Logger): Promise<void>;
|
|
9
|
+
//# 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;AAQ5C,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,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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { countDistillationTokens, 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, showDistillation) {
|
|
8
|
+
const extractedTokens = countDistillationTokens(distillation);
|
|
9
|
+
const extractedSuffix = extractedTokens > 0 ? ` (extracted ${formatTokenCount(extractedTokens)})` : "";
|
|
10
|
+
const reasonSuffix = reason && extractedTokens === 0 ? ` — ${PRUNE_REASON_LABELS[reason]}` : "";
|
|
11
|
+
let message = formatStatsHeader(state.stats.totalPruneTokens, state.stats.pruneTokenCounter) +
|
|
12
|
+
reasonSuffix +
|
|
13
|
+
extractedSuffix;
|
|
14
|
+
return message + formatExtracted(showDistillation ? distillation : undefined);
|
|
15
|
+
}
|
|
16
|
+
function buildDetailedMessage(state, reason, pruneToolIds, toolMetadata, workingDirectory, distillation, showDistillation) {
|
|
17
|
+
let message = formatStatsHeader(state.stats.totalPruneTokens, state.stats.pruneTokenCounter);
|
|
18
|
+
if (pruneToolIds.length > 0) {
|
|
19
|
+
const pruneTokenCounterStr = `~${formatTokenCount(state.stats.pruneTokenCounter)}`;
|
|
20
|
+
const extractedTokens = countDistillationTokens(distillation);
|
|
21
|
+
const extractedSuffix = extractedTokens > 0 ? `, extracted ${formatTokenCount(extractedTokens)}` : "";
|
|
22
|
+
const reasonLabel = reason && extractedTokens === 0 ? ` — ${PRUNE_REASON_LABELS[reason]}` : "";
|
|
23
|
+
message += `\n\n▣ Pruning (${pruneTokenCounterStr}${extractedSuffix})${reasonLabel}`;
|
|
24
|
+
const itemLines = formatPrunedItemsList(pruneToolIds, toolMetadata, workingDirectory);
|
|
25
|
+
message += "\n" + itemLines.join("\n");
|
|
26
|
+
}
|
|
27
|
+
return (message + formatExtracted(showDistillation ? distillation : undefined)).trim();
|
|
28
|
+
}
|
|
29
|
+
export async function sendUnifiedNotification(client, logger, config, state, sessionId, pruneToolIds, toolMetadata, reason, params, workingDirectory, distillation) {
|
|
30
|
+
const hasPruned = pruneToolIds.length > 0;
|
|
31
|
+
if (!hasPruned) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
if (config.pruneNotification === "off") {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
const showDistillation = config.tools.extract.showDistillation;
|
|
38
|
+
const message = config.pruneNotification === "minimal"
|
|
39
|
+
? buildMinimalMessage(state, reason, distillation, showDistillation)
|
|
40
|
+
: buildDetailedMessage(state, reason, pruneToolIds, toolMetadata, workingDirectory, distillation, showDistillation);
|
|
41
|
+
await sendIgnoredMessage(client, sessionId, message, params, logger);
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
export async function sendIgnoredMessage(client, sessionID, text, params, logger) {
|
|
45
|
+
const agent = params.agent || undefined;
|
|
46
|
+
const variant = params.variant || undefined;
|
|
47
|
+
const model = params.providerId && params.modelId
|
|
48
|
+
? {
|
|
49
|
+
providerID: params.providerId,
|
|
50
|
+
modelID: params.modelId,
|
|
51
|
+
}
|
|
52
|
+
: undefined;
|
|
53
|
+
try {
|
|
54
|
+
await client.session.prompt({
|
|
55
|
+
path: {
|
|
56
|
+
id: sessionID,
|
|
57
|
+
},
|
|
58
|
+
body: {
|
|
59
|
+
noReply: true,
|
|
60
|
+
agent: agent,
|
|
61
|
+
model: model,
|
|
62
|
+
variant: variant,
|
|
63
|
+
parts: [
|
|
64
|
+
{
|
|
65
|
+
type: "text",
|
|
66
|
+
text: text,
|
|
67
|
+
ignored: true,
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
logger.error("Failed to send notification", { error: error.message });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# 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,10 @@
|
|
|
1
|
+
import { ToolParameterEntry } from "../state";
|
|
2
|
+
export declare function countDistillationTokens(distillation?: string[]): number;
|
|
3
|
+
export declare function formatExtracted(distillation?: string[]): string;
|
|
4
|
+
export declare function formatStatsHeader(totalTokensSaved: number, pruneTokenCounter: number): string;
|
|
5
|
+
export declare function formatTokenCount(tokens: number): string;
|
|
6
|
+
export declare function truncate(str: string, maxLen?: number): string;
|
|
7
|
+
export declare function shortenPath(input: string, workingDirectory?: string): string;
|
|
8
|
+
export declare function formatPrunedItemsList(pruneToolIds: string[], toolMetadata: Map<string, ToolParameterEntry>, workingDirectory?: string): string[];
|
|
9
|
+
export declare function formatPruningResultForTool(prunedIds: string[], toolMetadata: Map<string, ToolParameterEntry>, workingDirectory?: string): string;
|
|
10
|
+
//# 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;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,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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { extractParameterKey } from "../messages/utils";
|
|
2
|
+
import { countTokens } from "../strategies/utils";
|
|
3
|
+
export function countDistillationTokens(distillation) {
|
|
4
|
+
if (!distillation || distillation.length === 0)
|
|
5
|
+
return 0;
|
|
6
|
+
return countTokens(distillation.join("\n"));
|
|
7
|
+
}
|
|
8
|
+
export function formatExtracted(distillation) {
|
|
9
|
+
if (!distillation || distillation.length === 0) {
|
|
10
|
+
return "";
|
|
11
|
+
}
|
|
12
|
+
let result = `\n\n▣ Extracted`;
|
|
13
|
+
for (const finding of distillation) {
|
|
14
|
+
result += `\n───\n${finding}`;
|
|
15
|
+
}
|
|
16
|
+
return result;
|
|
17
|
+
}
|
|
18
|
+
export function formatStatsHeader(totalTokensSaved, pruneTokenCounter) {
|
|
19
|
+
const totalTokensSavedStr = `~${formatTokenCount(totalTokensSaved + pruneTokenCounter)}`;
|
|
20
|
+
return [`▣ DCP | ${totalTokensSavedStr} saved total`].join("\n");
|
|
21
|
+
}
|
|
22
|
+
export function formatTokenCount(tokens) {
|
|
23
|
+
if (tokens >= 1000) {
|
|
24
|
+
return `${(tokens / 1000).toFixed(1)}K`.replace(".0K", "K") + " tokens";
|
|
25
|
+
}
|
|
26
|
+
return tokens.toString() + " tokens";
|
|
27
|
+
}
|
|
28
|
+
export function truncate(str, maxLen = 60) {
|
|
29
|
+
if (str.length <= maxLen)
|
|
30
|
+
return str;
|
|
31
|
+
return str.slice(0, maxLen - 3) + "...";
|
|
32
|
+
}
|
|
33
|
+
export function shortenPath(input, workingDirectory) {
|
|
34
|
+
const inPathMatch = input.match(/^(.+) in (.+)$/);
|
|
35
|
+
if (inPathMatch) {
|
|
36
|
+
const prefix = inPathMatch[1];
|
|
37
|
+
const pathPart = inPathMatch[2];
|
|
38
|
+
const shortenedPath = shortenSinglePath(pathPart, workingDirectory);
|
|
39
|
+
return `${prefix} in ${shortenedPath}`;
|
|
40
|
+
}
|
|
41
|
+
return shortenSinglePath(input, workingDirectory);
|
|
42
|
+
}
|
|
43
|
+
function shortenSinglePath(path, workingDirectory) {
|
|
44
|
+
if (workingDirectory) {
|
|
45
|
+
if (path.startsWith(workingDirectory + "/")) {
|
|
46
|
+
return path.slice(workingDirectory.length + 1);
|
|
47
|
+
}
|
|
48
|
+
if (path === workingDirectory) {
|
|
49
|
+
return ".";
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return path;
|
|
53
|
+
}
|
|
54
|
+
export function formatPrunedItemsList(pruneToolIds, toolMetadata, workingDirectory) {
|
|
55
|
+
const lines = [];
|
|
56
|
+
for (const id of pruneToolIds) {
|
|
57
|
+
const metadata = toolMetadata.get(id);
|
|
58
|
+
if (metadata) {
|
|
59
|
+
const paramKey = extractParameterKey(metadata.tool, metadata.parameters);
|
|
60
|
+
if (paramKey) {
|
|
61
|
+
// Use 60 char limit to match notification style
|
|
62
|
+
const displayKey = truncate(shortenPath(paramKey, workingDirectory), 60);
|
|
63
|
+
lines.push(`→ ${metadata.tool}: ${displayKey}`);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
lines.push(`→ ${metadata.tool}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const knownCount = pruneToolIds.filter((id) => toolMetadata.has(id)).length;
|
|
71
|
+
const unknownCount = pruneToolIds.length - knownCount;
|
|
72
|
+
if (unknownCount > 0) {
|
|
73
|
+
lines.push(`→ (${unknownCount} tool${unknownCount > 1 ? "s" : ""} with unknown metadata)`);
|
|
74
|
+
}
|
|
75
|
+
return lines;
|
|
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,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json.schemastore.org/package.json",
|
|
3
|
+
"name": "@tuanhung303/opencode-acp",
|
|
4
|
+
"version": "2.1.0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"description": "OpenCode plugin that optimizes token usage by pruning obsolete tool outputs - Aggressive fork with Head-Tail Truncation, Read Consolidation, Prune Thinking, and Placeholder Compression strategies",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"scripts": {
|
|
10
|
+
"clean": "rm -rf dist",
|
|
11
|
+
"build": "npm run clean && tsc",
|
|
12
|
+
"postbuild": "rm -rf dist/logs",
|
|
13
|
+
"prepublishOnly": "npm run build",
|
|
14
|
+
"dev": "opencode plugin dev",
|
|
15
|
+
"typecheck": "tsc --noEmit",
|
|
16
|
+
"test": "vitest run",
|
|
17
|
+
"test:watch": "vitest",
|
|
18
|
+
"test:coverage": "vitest run --coverage",
|
|
19
|
+
"format": "prettier --write .",
|
|
20
|
+
"format:check": "prettier --check ."
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"opencode",
|
|
24
|
+
"opencode-plugin",
|
|
25
|
+
"plugin",
|
|
26
|
+
"context",
|
|
27
|
+
"pruning",
|
|
28
|
+
"optimization",
|
|
29
|
+
"tokens",
|
|
30
|
+
"aggressive",
|
|
31
|
+
"thinking",
|
|
32
|
+
"compression"
|
|
33
|
+
],
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "git+https://github.com/tuanhung303/opencode-agent-context-pruning.git"
|
|
37
|
+
},
|
|
38
|
+
"bugs": {
|
|
39
|
+
"url": "https://github.com/tuanhung303/opencode-agent-context-pruning/issues"
|
|
40
|
+
},
|
|
41
|
+
"homepage": "https://github.com/tuanhung303/opencode-agent-context-pruning#readme",
|
|
42
|
+
"author": "tuanhung303",
|
|
43
|
+
"license": "MIT",
|
|
44
|
+
"peerDependencies": {
|
|
45
|
+
"@opencode-ai/plugin": ">=0.13.7"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"@anthropic-ai/tokenizer": "^0.0.4",
|
|
49
|
+
"@opencode-ai/sdk": "^1.1.3",
|
|
50
|
+
"jsonc-parser": "^3.3.1",
|
|
51
|
+
"zod": "^4.1.13"
|
|
52
|
+
},
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"@opencode-ai/plugin": "^1.0.143",
|
|
55
|
+
"@types/node": "^24.10.1",
|
|
56
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
57
|
+
"prettier": "^3.4.2",
|
|
58
|
+
"tsx": "^4.21.0",
|
|
59
|
+
"typescript": "^5.9.3",
|
|
60
|
+
"vitest": "^4.0.18"
|
|
61
|
+
},
|
|
62
|
+
"files": [
|
|
63
|
+
"dist/",
|
|
64
|
+
"README.md",
|
|
65
|
+
"LICENSE"
|
|
66
|
+
]
|
|
67
|
+
}
|