@tarquinen/opencode-dcp 3.1.9 → 3.1.10
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 +3 -0
- package/dist/index.d.ts +2 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7832 -76
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +1 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/hooks.d.ts +2 -10
- package/dist/lib/hooks.d.ts.map +1 -1
- package/dist/lib/messages/index.d.ts +1 -0
- package/dist/lib/messages/index.d.ts.map +1 -1
- package/dist/lib/messages/inject/utils.d.ts +7 -0
- package/dist/lib/messages/inject/utils.d.ts.map +1 -1
- package/dist/lib/messages/utils.d.ts +1 -1
- package/dist/lib/messages/utils.d.ts.map +1 -1
- package/dist/lib/state/state.d.ts.map +1 -1
- package/dist/lib/state/types.d.ts +0 -1
- package/dist/lib/state/types.d.ts.map +1 -1
- package/dist/lib/update.d.ts +22 -0
- package/dist/lib/update.d.ts.map +1 -0
- package/package.json +6 -5
- package/dist/lib/auth.js +0 -32
- package/dist/lib/auth.js.map +0 -1
- package/dist/lib/commands/compression-targets.js +0 -98
- package/dist/lib/commands/compression-targets.js.map +0 -1
- package/dist/lib/commands/context.js +0 -239
- package/dist/lib/commands/context.js.map +0 -1
- package/dist/lib/commands/decompress.js +0 -174
- package/dist/lib/commands/decompress.js.map +0 -1
- package/dist/lib/commands/help.js +0 -52
- package/dist/lib/commands/help.js.map +0 -1
- package/dist/lib/commands/index.js +0 -8
- package/dist/lib/commands/index.js.map +0 -1
- package/dist/lib/commands/manual.js +0 -75
- package/dist/lib/commands/manual.js.map +0 -1
- package/dist/lib/commands/recompress.js +0 -140
- package/dist/lib/commands/recompress.js.map +0 -1
- package/dist/lib/commands/stats.js +0 -97
- package/dist/lib/commands/stats.js.map +0 -1
- package/dist/lib/commands/sweep.js +0 -195
- package/dist/lib/commands/sweep.js.map +0 -1
- package/dist/lib/compress/index.js +0 -3
- package/dist/lib/compress/index.js.map +0 -1
- package/dist/lib/compress/message-utils.js +0 -179
- package/dist/lib/compress/message-utils.js.map +0 -1
- package/dist/lib/compress/message.js +0 -82
- package/dist/lib/compress/message.js.map +0 -1
- package/dist/lib/compress/pipeline.js +0 -41
- package/dist/lib/compress/pipeline.js.map +0 -1
- package/dist/lib/compress/protected-content.js +0 -106
- package/dist/lib/compress/protected-content.js.map +0 -1
- package/dist/lib/compress/range-utils.js +0 -199
- package/dist/lib/compress/range-utils.js.map +0 -1
- package/dist/lib/compress/range.js +0 -90
- package/dist/lib/compress/range.js.map +0 -1
- package/dist/lib/compress/search.js +0 -204
- package/dist/lib/compress/search.js.map +0 -1
- package/dist/lib/compress/state.js +0 -213
- package/dist/lib/compress/state.js.map +0 -1
- package/dist/lib/compress/timing.js +0 -42
- package/dist/lib/compress/timing.js.map +0 -1
- package/dist/lib/compress/types.js +0 -2
- package/dist/lib/compress/types.js.map +0 -1
- package/dist/lib/compress-permission.js +0 -10
- package/dist/lib/compress-permission.js.map +0 -1
- package/dist/lib/config.js +0 -760
- package/dist/lib/config.js.map +0 -1
- package/dist/lib/hooks.js +0 -245
- package/dist/lib/hooks.js.map +0 -1
- package/dist/lib/host-permissions.js +0 -58
- package/dist/lib/host-permissions.js.map +0 -1
- package/dist/lib/logger.js +0 -204
- package/dist/lib/logger.js.map +0 -1
- package/dist/lib/message-ids.js +0 -128
- package/dist/lib/message-ids.js.map +0 -1
- package/dist/lib/messages/index.js +0 -9
- package/dist/lib/messages/index.js.map +0 -1
- package/dist/lib/messages/inject/inject.js +0 -128
- package/dist/lib/messages/inject/inject.js.map +0 -1
- package/dist/lib/messages/inject/subagent-results.js +0 -58
- package/dist/lib/messages/inject/subagent-results.js.map +0 -1
- package/dist/lib/messages/inject/utils.js +0 -211
- package/dist/lib/messages/inject/utils.js.map +0 -1
- package/dist/lib/messages/priority.js +0 -65
- package/dist/lib/messages/priority.js.map +0 -1
- package/dist/lib/messages/prune.js +0 -180
- package/dist/lib/messages/prune.js.map +0 -1
- package/dist/lib/messages/query.js +0 -52
- package/dist/lib/messages/query.js.map +0 -1
- package/dist/lib/messages/reasoning-strip.js +0 -33
- package/dist/lib/messages/reasoning-strip.js.map +0 -1
- package/dist/lib/messages/shape.js +0 -39
- package/dist/lib/messages/shape.js.map +0 -1
- package/dist/lib/messages/sync.js +0 -93
- package/dist/lib/messages/sync.js.map +0 -1
- package/dist/lib/messages/utils.js +0 -146
- package/dist/lib/messages/utils.js.map +0 -1
- package/dist/lib/prompts/compress-message.js +0 -44
- package/dist/lib/prompts/compress-message.js.map +0 -1
- package/dist/lib/prompts/compress-range.js +0 -61
- package/dist/lib/prompts/compress-range.js.map +0 -1
- package/dist/lib/prompts/context-limit-nudge.js +0 -19
- package/dist/lib/prompts/context-limit-nudge.js.map +0 -1
- package/dist/lib/prompts/extensions/nudge.js +0 -35
- package/dist/lib/prompts/extensions/nudge.js.map +0 -1
- package/dist/lib/prompts/extensions/system.js +0 -30
- package/dist/lib/prompts/extensions/system.js.map +0 -1
- package/dist/lib/prompts/extensions/tool.js +0 -34
- package/dist/lib/prompts/extensions/tool.js.map +0 -1
- package/dist/lib/prompts/index.js +0 -18
- package/dist/lib/prompts/index.js.map +0 -1
- package/dist/lib/prompts/iteration-nudge.js +0 -7
- package/dist/lib/prompts/iteration-nudge.js.map +0 -1
- package/dist/lib/prompts/store.js +0 -358
- package/dist/lib/prompts/store.js.map +0 -1
- package/dist/lib/prompts/system.js +0 -34
- package/dist/lib/prompts/system.js.map +0 -1
- package/dist/lib/prompts/turn-nudge.js +0 -11
- package/dist/lib/prompts/turn-nudge.js.map +0 -1
- package/dist/lib/protected-patterns.js +0 -107
- package/dist/lib/protected-patterns.js.map +0 -1
- package/dist/lib/state/index.js +0 -5
- package/dist/lib/state/index.js.map +0 -1
- package/dist/lib/state/persistence.js +0 -172
- package/dist/lib/state/persistence.js.map +0 -1
- package/dist/lib/state/state.js +0 -143
- package/dist/lib/state/state.js.map +0 -1
- package/dist/lib/state/tool-cache.js +0 -69
- package/dist/lib/state/tool-cache.js.map +0 -1
- package/dist/lib/state/types.js +0 -2
- package/dist/lib/state/types.js.map +0 -1
- package/dist/lib/state/utils.js +0 -265
- package/dist/lib/state/utils.js.map +0 -1
- package/dist/lib/strategies/deduplication.js +0 -100
- package/dist/lib/strategies/deduplication.js.map +0 -1
- package/dist/lib/strategies/index.js +0 -3
- package/dist/lib/strategies/index.js.map +0 -1
- package/dist/lib/strategies/purge-errors.js +0 -62
- package/dist/lib/strategies/purge-errors.js.map +0 -1
- package/dist/lib/subagents/subagent-results.js +0 -52
- package/dist/lib/subagents/subagent-results.js.map +0 -1
- package/dist/lib/token-utils.js +0 -133
- package/dist/lib/token-utils.js.map +0 -1
- package/dist/lib/ui/notification.js +0 -243
- package/dist/lib/ui/notification.js.map +0 -1
- package/dist/lib/ui/utils.js +0 -256
- package/dist/lib/ui/utils.js.map +0 -1
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
import { syncCompressionBlocks } from "../messages";
|
|
2
|
-
import { parseBlockRef } from "../message-ids";
|
|
3
|
-
import { getCurrentParams } from "../token-utils";
|
|
4
|
-
import { saveSessionState } from "../state/persistence";
|
|
5
|
-
import { sendIgnoredMessage } from "../ui/notification";
|
|
6
|
-
import { formatTokenCount } from "../ui/utils";
|
|
7
|
-
import { getActiveCompressionTargets, resolveCompressionTarget, } from "./compression-targets";
|
|
8
|
-
function parseBlockIdArg(arg) {
|
|
9
|
-
const normalized = arg.trim().toLowerCase();
|
|
10
|
-
const blockRef = parseBlockRef(normalized);
|
|
11
|
-
if (blockRef !== null) {
|
|
12
|
-
return blockRef;
|
|
13
|
-
}
|
|
14
|
-
if (!/^[1-9]\d*$/.test(normalized)) {
|
|
15
|
-
return null;
|
|
16
|
-
}
|
|
17
|
-
const parsed = Number.parseInt(normalized, 10);
|
|
18
|
-
return Number.isInteger(parsed) && parsed > 0 ? parsed : null;
|
|
19
|
-
}
|
|
20
|
-
function findActiveParentBlockId(messagesState, block) {
|
|
21
|
-
const queue = [...block.parentBlockIds];
|
|
22
|
-
const visited = new Set();
|
|
23
|
-
while (queue.length > 0) {
|
|
24
|
-
const parentBlockId = queue.shift();
|
|
25
|
-
if (parentBlockId === undefined || visited.has(parentBlockId)) {
|
|
26
|
-
continue;
|
|
27
|
-
}
|
|
28
|
-
visited.add(parentBlockId);
|
|
29
|
-
const parent = messagesState.blocksById.get(parentBlockId);
|
|
30
|
-
if (!parent) {
|
|
31
|
-
continue;
|
|
32
|
-
}
|
|
33
|
-
if (parent.active) {
|
|
34
|
-
return parent.blockId;
|
|
35
|
-
}
|
|
36
|
-
for (const ancestorId of parent.parentBlockIds) {
|
|
37
|
-
if (!visited.has(ancestorId)) {
|
|
38
|
-
queue.push(ancestorId);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
function findActiveAncestorBlockId(messagesState, target) {
|
|
45
|
-
for (const block of target.blocks) {
|
|
46
|
-
const activeAncestorBlockId = findActiveParentBlockId(messagesState, block);
|
|
47
|
-
if (activeAncestorBlockId !== null) {
|
|
48
|
-
return activeAncestorBlockId;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return null;
|
|
52
|
-
}
|
|
53
|
-
function snapshotActiveMessages(messagesState) {
|
|
54
|
-
const activeMessages = new Map();
|
|
55
|
-
for (const [messageId, entry] of messagesState.byMessageId) {
|
|
56
|
-
if (entry.activeBlockIds.length > 0) {
|
|
57
|
-
activeMessages.set(messageId, entry.tokenCount);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
return activeMessages;
|
|
61
|
-
}
|
|
62
|
-
function formatDecompressMessage(target, restoredMessageCount, restoredTokens, reactivatedBlockIds) {
|
|
63
|
-
const lines = [];
|
|
64
|
-
lines.push(`Restored compression ${target.displayId}.`);
|
|
65
|
-
if (target.runId !== target.displayId || target.grouped) {
|
|
66
|
-
lines.push(`Tool call label: Compression #${target.runId}.`);
|
|
67
|
-
}
|
|
68
|
-
if (reactivatedBlockIds.length > 0) {
|
|
69
|
-
const refs = reactivatedBlockIds.map((id) => String(id)).join(", ");
|
|
70
|
-
lines.push(`Also restored nested compression(s): ${refs}.`);
|
|
71
|
-
}
|
|
72
|
-
if (restoredMessageCount > 0) {
|
|
73
|
-
lines.push(`Restored ${restoredMessageCount} message(s) (~${formatTokenCount(restoredTokens)}).`);
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
lines.push("No messages were restored.");
|
|
77
|
-
}
|
|
78
|
-
return lines.join("\n");
|
|
79
|
-
}
|
|
80
|
-
function formatAvailableBlocksMessage(availableTargets) {
|
|
81
|
-
const lines = [];
|
|
82
|
-
lines.push("Usage: /dcp decompress <n>");
|
|
83
|
-
lines.push("");
|
|
84
|
-
if (availableTargets.length === 0) {
|
|
85
|
-
lines.push("No compressions are available to restore.");
|
|
86
|
-
return lines.join("\n");
|
|
87
|
-
}
|
|
88
|
-
lines.push("Available compressions:");
|
|
89
|
-
const entries = availableTargets.map((target) => {
|
|
90
|
-
const topic = target.topic.replace(/\s+/g, " ").trim() || "(no topic)";
|
|
91
|
-
const label = `${target.displayId} (${formatTokenCount(target.compressedTokens)})`;
|
|
92
|
-
const details = target.grouped
|
|
93
|
-
? `Compression #${target.runId} - ${target.blocks.length} messages`
|
|
94
|
-
: `Compression #${target.runId}`;
|
|
95
|
-
return { label, topic: `${details} - ${topic}` };
|
|
96
|
-
});
|
|
97
|
-
const labelWidth = Math.max(...entries.map((entry) => entry.label.length)) + 4;
|
|
98
|
-
for (const entry of entries) {
|
|
99
|
-
lines.push(` ${entry.label.padEnd(labelWidth)}${entry.topic}`);
|
|
100
|
-
}
|
|
101
|
-
return lines.join("\n");
|
|
102
|
-
}
|
|
103
|
-
export async function handleDecompressCommand(ctx) {
|
|
104
|
-
const { client, state, logger, sessionId, messages, args } = ctx;
|
|
105
|
-
const params = getCurrentParams(state, messages, logger);
|
|
106
|
-
const targetArg = args[0];
|
|
107
|
-
if (args.length > 1) {
|
|
108
|
-
await sendIgnoredMessage(client, sessionId, "Invalid arguments. Usage: /dcp decompress <n>", params, logger);
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
syncCompressionBlocks(state, logger, messages);
|
|
112
|
-
const messagesState = state.prune.messages;
|
|
113
|
-
if (!targetArg) {
|
|
114
|
-
const availableTargets = getActiveCompressionTargets(messagesState);
|
|
115
|
-
const message = formatAvailableBlocksMessage(availableTargets);
|
|
116
|
-
await sendIgnoredMessage(client, sessionId, message, params, logger);
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
const targetBlockId = parseBlockIdArg(targetArg);
|
|
120
|
-
if (targetBlockId === null) {
|
|
121
|
-
await sendIgnoredMessage(client, sessionId, `Please enter a compression number. Example: /dcp decompress 2`, params, logger);
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
const target = resolveCompressionTarget(messagesState, targetBlockId);
|
|
125
|
-
if (!target) {
|
|
126
|
-
await sendIgnoredMessage(client, sessionId, `Compression ${targetBlockId} does not exist.`, params, logger);
|
|
127
|
-
return;
|
|
128
|
-
}
|
|
129
|
-
const activeBlocks = target.blocks.filter((block) => block.active);
|
|
130
|
-
if (activeBlocks.length === 0) {
|
|
131
|
-
const activeAncestorBlockId = findActiveAncestorBlockId(messagesState, target);
|
|
132
|
-
if (activeAncestorBlockId !== null) {
|
|
133
|
-
await sendIgnoredMessage(client, sessionId, `Compression ${target.displayId} is inside compression ${activeAncestorBlockId}. Restore compression ${activeAncestorBlockId} first.`, params, logger);
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
await sendIgnoredMessage(client, sessionId, `Compression ${target.displayId} is not active.`, params, logger);
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
const activeMessagesBefore = snapshotActiveMessages(messagesState);
|
|
140
|
-
const activeBlockIdsBefore = new Set(messagesState.activeBlockIds);
|
|
141
|
-
const deactivatedAt = Date.now();
|
|
142
|
-
for (const block of target.blocks) {
|
|
143
|
-
block.active = false;
|
|
144
|
-
block.deactivatedByUser = true;
|
|
145
|
-
block.deactivatedAt = deactivatedAt;
|
|
146
|
-
block.deactivatedByBlockId = undefined;
|
|
147
|
-
}
|
|
148
|
-
syncCompressionBlocks(state, logger, messages);
|
|
149
|
-
let restoredMessageCount = 0;
|
|
150
|
-
let restoredTokens = 0;
|
|
151
|
-
for (const [messageId, tokenCount] of activeMessagesBefore) {
|
|
152
|
-
const entry = messagesState.byMessageId.get(messageId);
|
|
153
|
-
const isActiveNow = entry ? entry.activeBlockIds.length > 0 : false;
|
|
154
|
-
if (!isActiveNow) {
|
|
155
|
-
restoredMessageCount++;
|
|
156
|
-
restoredTokens += tokenCount;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
state.stats.totalPruneTokens = Math.max(0, state.stats.totalPruneTokens - restoredTokens);
|
|
160
|
-
const reactivatedBlockIds = Array.from(messagesState.activeBlockIds)
|
|
161
|
-
.filter((blockId) => !activeBlockIdsBefore.has(blockId))
|
|
162
|
-
.sort((a, b) => a - b);
|
|
163
|
-
await saveSessionState(state, logger);
|
|
164
|
-
const message = formatDecompressMessage(target, restoredMessageCount, restoredTokens, reactivatedBlockIds);
|
|
165
|
-
await sendIgnoredMessage(client, sessionId, message, params, logger);
|
|
166
|
-
logger.info("Decompress command completed", {
|
|
167
|
-
targetBlockId: target.displayId,
|
|
168
|
-
targetRunId: target.runId,
|
|
169
|
-
restoredMessageCount,
|
|
170
|
-
restoredTokens,
|
|
171
|
-
reactivatedBlockIds,
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
//# sourceMappingURL=decompress.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"decompress.js","sourceRoot":"","sources":["../../../lib/commands/decompress.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DCP Help command handler.
|
|
3
|
-
* Shows available DCP commands and their descriptions.
|
|
4
|
-
*/
|
|
5
|
-
import { compressPermission } from "../compress-permission";
|
|
6
|
-
import { sendIgnoredMessage } from "../ui/notification";
|
|
7
|
-
import { getCurrentParams } from "../token-utils";
|
|
8
|
-
const BASE_COMMANDS = [
|
|
9
|
-
["/dcp context", "Show token usage breakdown for current session"],
|
|
10
|
-
["/dcp stats", "Show DCP pruning statistics"],
|
|
11
|
-
["/dcp sweep [n]", "Prune tools since last user message, or last n tools"],
|
|
12
|
-
["/dcp manual [on|off]", "Toggle manual mode or set explicit state"],
|
|
13
|
-
];
|
|
14
|
-
const TOOL_COMMANDS = {
|
|
15
|
-
compress: ["/dcp compress [focus]", "Trigger manual compress tool execution"],
|
|
16
|
-
decompress: ["/dcp decompress <n>", "Restore selected compression"],
|
|
17
|
-
recompress: ["/dcp recompress <n>", "Re-apply a user-decompressed compression"],
|
|
18
|
-
};
|
|
19
|
-
function getVisibleCommands(state, config) {
|
|
20
|
-
const commands = [...BASE_COMMANDS];
|
|
21
|
-
if (compressPermission(state, config) !== "deny") {
|
|
22
|
-
commands.push(TOOL_COMMANDS.compress);
|
|
23
|
-
commands.push(TOOL_COMMANDS.decompress);
|
|
24
|
-
commands.push(TOOL_COMMANDS.recompress);
|
|
25
|
-
}
|
|
26
|
-
return commands;
|
|
27
|
-
}
|
|
28
|
-
function formatHelpMessage(state, config) {
|
|
29
|
-
const commands = getVisibleCommands(state, config);
|
|
30
|
-
const colWidth = Math.max(...commands.map(([cmd]) => cmd.length)) + 4;
|
|
31
|
-
const lines = [];
|
|
32
|
-
lines.push("╭─────────────────────────────────────────────────────────────────────────╮");
|
|
33
|
-
lines.push("│ DCP Commands │");
|
|
34
|
-
lines.push("╰─────────────────────────────────────────────────────────────────────────╯");
|
|
35
|
-
lines.push("");
|
|
36
|
-
lines.push(` ${"Manual mode:".padEnd(colWidth)}${state.manualMode ? "ON" : "OFF"}`);
|
|
37
|
-
lines.push("");
|
|
38
|
-
for (const [cmd, desc] of commands) {
|
|
39
|
-
lines.push(` ${cmd.padEnd(colWidth)}${desc}`);
|
|
40
|
-
}
|
|
41
|
-
lines.push("");
|
|
42
|
-
return lines.join("\n");
|
|
43
|
-
}
|
|
44
|
-
export async function handleHelpCommand(ctx) {
|
|
45
|
-
const { client, state, logger, sessionId, messages } = ctx;
|
|
46
|
-
const { config } = ctx;
|
|
47
|
-
const message = formatHelpMessage(state, config);
|
|
48
|
-
const params = getCurrentParams(state, messages, logger);
|
|
49
|
-
await sendIgnoredMessage(client, sessionId, message, params, logger);
|
|
50
|
-
logger.info("Help command executed");
|
|
51
|
-
}
|
|
52
|
-
//# sourceMappingURL=help.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../../lib/commands/help.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAWjD,MAAM,aAAa,GAAuB;IACtC,CAAC,cAAc,EAAE,gDAAgD,CAAC;IAClE,CAAC,YAAY,EAAE,6BAA6B,CAAC;IAC7C,CAAC,gBAAgB,EAAE,sDAAsD,CAAC;IAC1E,CAAC,sBAAsB,EAAE,0CAA0C,CAAC;CACvE,CAAA;AAED,MAAM,aAAa,GAAqC;IACpD,QAAQ,EAAE,CAAC,uBAAuB,EAAE,wCAAwC,CAAC;IAC7E,UAAU,EAAE,CAAC,qBAAqB,EAAE,8BAA8B,CAAC;IACnE,UAAU,EAAE,CAAC,qBAAqB,EAAE,0CAA0C,CAAC;CAClF,CAAA;AAED,SAAS,kBAAkB,CAAC,KAAmB,EAAE,MAAoB;IACjE,MAAM,QAAQ,GAAG,CAAC,GAAG,aAAa,CAAC,CAAA;IAEnC,IAAI,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,MAAM,EAAE,CAAC;QAC/C,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;QACrC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAA;QACvC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAA;IAC3C,CAAC;IAED,OAAO,QAAQ,CAAA;AACnB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAmB,EAAE,MAAoB;IAChE,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAA;IACrE,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAA;IACzF,KAAK,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAA;IACzF,KAAK,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAA;IACzF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,KAAK,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;IACpF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,EAAE,CAAC,CAAA;IAClD,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAuB;IAC3D,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAA;IAE1D,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAA;IACtB,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAEhD,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;IACxD,MAAM,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAEpE,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;AACxC,CAAC"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export { handleContextCommand } from "./context";
|
|
2
|
-
export { handleDecompressCommand } from "./decompress";
|
|
3
|
-
export { handleHelpCommand } from "./help";
|
|
4
|
-
export { applyPendingManualTrigger, handleManualToggleCommand, handleManualTriggerCommand, } from "./manual";
|
|
5
|
-
export { handleRecompressCommand } from "./recompress";
|
|
6
|
-
export { handleStatsCommand } from "./stats";
|
|
7
|
-
export { handleSweepCommand } from "./sweep";
|
|
8
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AAC1C,OAAO,EACH,yBAAyB,EACzB,yBAAyB,EACzB,0BAA0B,GAC7B,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA"}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DCP Manual mode command handler.
|
|
3
|
-
* Handles toggling manual mode and triggering individual tool executions.
|
|
4
|
-
*
|
|
5
|
-
* Usage:
|
|
6
|
-
* /dcp manual [on|off] - Toggle manual mode or set explicit state
|
|
7
|
-
* /dcp compress [focus] - Trigger manual compress execution
|
|
8
|
-
*/
|
|
9
|
-
import { sendIgnoredMessage } from "../ui/notification";
|
|
10
|
-
import { getCurrentParams } from "../token-utils";
|
|
11
|
-
import { buildCompressedBlockGuidance } from "../prompts/extensions/nudge";
|
|
12
|
-
import { isIgnoredUserMessage } from "../messages/query";
|
|
13
|
-
const MANUAL_MODE_ON = "Manual mode is now ON. Use /dcp compress to trigger context tools manually.";
|
|
14
|
-
const MANUAL_MODE_OFF = "Manual mode is now OFF.";
|
|
15
|
-
const COMPRESS_TRIGGER_PROMPT = [
|
|
16
|
-
"<compress triggered manually>",
|
|
17
|
-
"Manual mode trigger received. You must now use the compress tool.",
|
|
18
|
-
"Find the most significant completed conversation content that can be compressed into a high-fidelity technical summary.",
|
|
19
|
-
"Follow the active compress mode, preserve all critical implementation details, and choose safe targets.",
|
|
20
|
-
"Return after compress with a brief explanation of what content was compressed.",
|
|
21
|
-
].join("\n\n");
|
|
22
|
-
function getTriggerPrompt(tool, state, config, userFocus) {
|
|
23
|
-
const base = COMPRESS_TRIGGER_PROMPT;
|
|
24
|
-
const compressedBlockGuidance = config.compress.mode === "message" ? "" : buildCompressedBlockGuidance(state);
|
|
25
|
-
const sections = [base, compressedBlockGuidance];
|
|
26
|
-
if (userFocus && userFocus.trim().length > 0) {
|
|
27
|
-
sections.push(`Additional user focus:\n${userFocus.trim()}`);
|
|
28
|
-
}
|
|
29
|
-
return sections.join("\n\n");
|
|
30
|
-
}
|
|
31
|
-
export async function handleManualToggleCommand(ctx, modeArg) {
|
|
32
|
-
const { client, state, logger, sessionId, messages } = ctx;
|
|
33
|
-
if (modeArg === "on") {
|
|
34
|
-
state.manualMode = "active";
|
|
35
|
-
}
|
|
36
|
-
else if (modeArg === "off") {
|
|
37
|
-
state.manualMode = false;
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
state.manualMode = state.manualMode ? false : "active";
|
|
41
|
-
}
|
|
42
|
-
const params = getCurrentParams(state, messages, logger);
|
|
43
|
-
await sendIgnoredMessage(client, sessionId, state.manualMode ? MANUAL_MODE_ON : MANUAL_MODE_OFF, params, logger);
|
|
44
|
-
logger.info("Manual mode toggled", { manualMode: state.manualMode });
|
|
45
|
-
}
|
|
46
|
-
export async function handleManualTriggerCommand(ctx, tool, userFocus) {
|
|
47
|
-
return getTriggerPrompt(tool, ctx.state, ctx.config, userFocus);
|
|
48
|
-
}
|
|
49
|
-
export function applyPendingManualTrigger(state, messages, logger) {
|
|
50
|
-
const pending = state.pendingManualTrigger;
|
|
51
|
-
if (!pending) {
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
if (!state.sessionId || pending.sessionId !== state.sessionId) {
|
|
55
|
-
state.pendingManualTrigger = null;
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
for (let i = messages.length - 1; i >= 0; i--) {
|
|
59
|
-
const msg = messages[i];
|
|
60
|
-
if (msg.info.role !== "user" || isIgnoredUserMessage(msg)) {
|
|
61
|
-
continue;
|
|
62
|
-
}
|
|
63
|
-
for (const part of msg.parts) {
|
|
64
|
-
if (part.type !== "text" || part.ignored || part.synthetic) {
|
|
65
|
-
continue;
|
|
66
|
-
}
|
|
67
|
-
part.text = pending.prompt;
|
|
68
|
-
state.pendingManualTrigger = null;
|
|
69
|
-
logger.debug("Applied manual prompt", { sessionId: pending.sessionId });
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
state.pendingManualTrigger = null;
|
|
74
|
-
}
|
|
75
|
-
//# sourceMappingURL=manual.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"manual.js","sourceRoot":"","sources":["../../../lib/commands/manual.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
import { syncCompressionBlocks } from "../messages";
|
|
2
|
-
import { parseBlockRef } from "../message-ids";
|
|
3
|
-
import { getCurrentParams } from "../token-utils";
|
|
4
|
-
import { saveSessionState } from "../state/persistence";
|
|
5
|
-
import { sendIgnoredMessage } from "../ui/notification";
|
|
6
|
-
import { formatTokenCount } from "../ui/utils";
|
|
7
|
-
import { getRecompressibleCompressionTargets, resolveCompressionTarget, } from "./compression-targets";
|
|
8
|
-
function parseBlockIdArg(arg) {
|
|
9
|
-
const normalized = arg.trim().toLowerCase();
|
|
10
|
-
const blockRef = parseBlockRef(normalized);
|
|
11
|
-
if (blockRef !== null) {
|
|
12
|
-
return blockRef;
|
|
13
|
-
}
|
|
14
|
-
if (!/^[1-9]\d*$/.test(normalized)) {
|
|
15
|
-
return null;
|
|
16
|
-
}
|
|
17
|
-
const parsed = Number.parseInt(normalized, 10);
|
|
18
|
-
return Number.isInteger(parsed) && parsed > 0 ? parsed : null;
|
|
19
|
-
}
|
|
20
|
-
function snapshotActiveMessages(messagesState) {
|
|
21
|
-
const activeMessages = new Set();
|
|
22
|
-
for (const [messageId, entry] of messagesState.byMessageId) {
|
|
23
|
-
if (entry.activeBlockIds.length > 0) {
|
|
24
|
-
activeMessages.add(messageId);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
return activeMessages;
|
|
28
|
-
}
|
|
29
|
-
function formatRecompressMessage(target, recompressedMessageCount, recompressedTokens, deactivatedBlockIds) {
|
|
30
|
-
const lines = [];
|
|
31
|
-
lines.push(`Re-applied compression ${target.displayId}.`);
|
|
32
|
-
if (target.runId !== target.displayId || target.grouped) {
|
|
33
|
-
lines.push(`Tool call label: Compression #${target.runId}.`);
|
|
34
|
-
}
|
|
35
|
-
if (deactivatedBlockIds.length > 0) {
|
|
36
|
-
const refs = deactivatedBlockIds.map((id) => String(id)).join(", ");
|
|
37
|
-
lines.push(`Also re-compressed nested compression(s): ${refs}.`);
|
|
38
|
-
}
|
|
39
|
-
if (recompressedMessageCount > 0) {
|
|
40
|
-
lines.push(`Re-compressed ${recompressedMessageCount} message(s) (~${formatTokenCount(recompressedTokens)}).`);
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
lines.push("No messages were re-compressed.");
|
|
44
|
-
}
|
|
45
|
-
return lines.join("\n");
|
|
46
|
-
}
|
|
47
|
-
function formatAvailableBlocksMessage(availableTargets) {
|
|
48
|
-
const lines = [];
|
|
49
|
-
lines.push("Usage: /dcp recompress <n>");
|
|
50
|
-
lines.push("");
|
|
51
|
-
if (availableTargets.length === 0) {
|
|
52
|
-
lines.push("No user-decompressed blocks are available to re-compress.");
|
|
53
|
-
return lines.join("\n");
|
|
54
|
-
}
|
|
55
|
-
lines.push("Available user-decompressed compressions:");
|
|
56
|
-
const entries = availableTargets.map((target) => {
|
|
57
|
-
const topic = target.topic.replace(/\s+/g, " ").trim() || "(no topic)";
|
|
58
|
-
const label = `${target.displayId} (${formatTokenCount(target.compressedTokens)})`;
|
|
59
|
-
const details = target.grouped
|
|
60
|
-
? `Compression #${target.runId} - ${target.blocks.length} messages`
|
|
61
|
-
: `Compression #${target.runId}`;
|
|
62
|
-
return { label, topic: `${details} - ${topic}` };
|
|
63
|
-
});
|
|
64
|
-
const labelWidth = Math.max(...entries.map((entry) => entry.label.length)) + 4;
|
|
65
|
-
for (const entry of entries) {
|
|
66
|
-
lines.push(` ${entry.label.padEnd(labelWidth)}${entry.topic}`);
|
|
67
|
-
}
|
|
68
|
-
return lines.join("\n");
|
|
69
|
-
}
|
|
70
|
-
export async function handleRecompressCommand(ctx) {
|
|
71
|
-
const { client, state, logger, sessionId, messages, args } = ctx;
|
|
72
|
-
const params = getCurrentParams(state, messages, logger);
|
|
73
|
-
const targetArg = args[0];
|
|
74
|
-
if (args.length > 1) {
|
|
75
|
-
await sendIgnoredMessage(client, sessionId, "Invalid arguments. Usage: /dcp recompress <n>", params, logger);
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
syncCompressionBlocks(state, logger, messages);
|
|
79
|
-
const messagesState = state.prune.messages;
|
|
80
|
-
const availableMessageIds = new Set(messages.map((msg) => msg.info.id));
|
|
81
|
-
if (!targetArg) {
|
|
82
|
-
const availableTargets = getRecompressibleCompressionTargets(messagesState, availableMessageIds);
|
|
83
|
-
const message = formatAvailableBlocksMessage(availableTargets);
|
|
84
|
-
await sendIgnoredMessage(client, sessionId, message, params, logger);
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
const targetBlockId = parseBlockIdArg(targetArg);
|
|
88
|
-
if (targetBlockId === null) {
|
|
89
|
-
await sendIgnoredMessage(client, sessionId, `Please enter a compression number. Example: /dcp recompress 2`, params, logger);
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
const target = resolveCompressionTarget(messagesState, targetBlockId);
|
|
93
|
-
if (!target) {
|
|
94
|
-
await sendIgnoredMessage(client, sessionId, `Compression ${targetBlockId} does not exist.`, params, logger);
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
if (target.blocks.some((block) => !availableMessageIds.has(block.compressMessageId))) {
|
|
98
|
-
await sendIgnoredMessage(client, sessionId, `Compression ${target.displayId} can no longer be re-applied because its origin message is no longer in this session.`, params, logger);
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
if (!target.blocks.some((block) => block.deactivatedByUser)) {
|
|
102
|
-
const message = target.blocks.some((block) => block.active)
|
|
103
|
-
? `Compression ${target.displayId} is already active.`
|
|
104
|
-
: `Compression ${target.displayId} is not user-decompressed.`;
|
|
105
|
-
await sendIgnoredMessage(client, sessionId, message, params, logger);
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
const activeMessagesBefore = snapshotActiveMessages(messagesState);
|
|
109
|
-
const activeBlockIdsBefore = new Set(messagesState.activeBlockIds);
|
|
110
|
-
for (const block of target.blocks) {
|
|
111
|
-
block.deactivatedByUser = false;
|
|
112
|
-
block.deactivatedAt = undefined;
|
|
113
|
-
block.deactivatedByBlockId = undefined;
|
|
114
|
-
}
|
|
115
|
-
syncCompressionBlocks(state, logger, messages);
|
|
116
|
-
let recompressedMessageCount = 0;
|
|
117
|
-
let recompressedTokens = 0;
|
|
118
|
-
for (const [messageId, entry] of messagesState.byMessageId) {
|
|
119
|
-
const isActiveNow = entry.activeBlockIds.length > 0;
|
|
120
|
-
if (isActiveNow && !activeMessagesBefore.has(messageId)) {
|
|
121
|
-
recompressedMessageCount++;
|
|
122
|
-
recompressedTokens += entry.tokenCount;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
state.stats.totalPruneTokens += recompressedTokens;
|
|
126
|
-
const deactivatedBlockIds = Array.from(activeBlockIdsBefore)
|
|
127
|
-
.filter((blockId) => !messagesState.activeBlockIds.has(blockId))
|
|
128
|
-
.sort((a, b) => a - b);
|
|
129
|
-
await saveSessionState(state, logger);
|
|
130
|
-
const message = formatRecompressMessage(target, recompressedMessageCount, recompressedTokens, deactivatedBlockIds);
|
|
131
|
-
await sendIgnoredMessage(client, sessionId, message, params, logger);
|
|
132
|
-
logger.info("Recompress command completed", {
|
|
133
|
-
targetBlockId: target.displayId,
|
|
134
|
-
targetRunId: target.runId,
|
|
135
|
-
recompressedMessageCount,
|
|
136
|
-
recompressedTokens,
|
|
137
|
-
deactivatedBlockIds,
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
//# sourceMappingURL=recompress.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"recompress.js","sourceRoot":"","sources":["../../../lib/commands/recompress.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DCP Stats command handler.
|
|
3
|
-
* Shows pruning statistics for the current session and all-time totals.
|
|
4
|
-
*/
|
|
5
|
-
import { sendIgnoredMessage } from "../ui/notification";
|
|
6
|
-
import { formatTokenCount } from "../ui/utils";
|
|
7
|
-
import { loadAllSessionStats } from "../state/persistence";
|
|
8
|
-
import { getCurrentParams } from "../token-utils";
|
|
9
|
-
import { getActiveCompressionTargets } from "./compression-targets";
|
|
10
|
-
function formatStatsMessage(sessionTokens, sessionSummaryTokens, sessionTools, sessionMessages, sessionDurationMs, allTime) {
|
|
11
|
-
const lines = [];
|
|
12
|
-
lines.push("╭───────────────────────────────────────────────────────────╮");
|
|
13
|
-
lines.push("│ DCP Statistics │");
|
|
14
|
-
lines.push("╰───────────────────────────────────────────────────────────╯");
|
|
15
|
-
lines.push("");
|
|
16
|
-
lines.push("Compression:");
|
|
17
|
-
lines.push("─".repeat(60));
|
|
18
|
-
lines.push(` Tokens in|out: ~${formatTokenCount(sessionTokens)} | ~${formatTokenCount(sessionSummaryTokens)}`);
|
|
19
|
-
lines.push(` Ratio: ${formatCompressionRatio(sessionTokens, sessionSummaryTokens)}`);
|
|
20
|
-
lines.push(` Time: ${formatCompressionTime(sessionDurationMs)}`);
|
|
21
|
-
lines.push(` Messages: ${sessionMessages}`);
|
|
22
|
-
lines.push(` Tools: ${sessionTools}`);
|
|
23
|
-
lines.push("");
|
|
24
|
-
lines.push("All-time:");
|
|
25
|
-
lines.push("─".repeat(60));
|
|
26
|
-
lines.push(` Tokens saved: ~${formatTokenCount(allTime.totalTokens)}`);
|
|
27
|
-
lines.push(` Tools pruned: ${allTime.totalTools}`);
|
|
28
|
-
lines.push(` Messages pruned: ${allTime.totalMessages}`);
|
|
29
|
-
lines.push(` Sessions: ${allTime.sessionCount}`);
|
|
30
|
-
return lines.join("\n");
|
|
31
|
-
}
|
|
32
|
-
function formatCompressionRatio(inputTokens, outputTokens) {
|
|
33
|
-
if (inputTokens <= 0) {
|
|
34
|
-
return "0:1";
|
|
35
|
-
}
|
|
36
|
-
if (outputTokens <= 0) {
|
|
37
|
-
return "∞:1";
|
|
38
|
-
}
|
|
39
|
-
const ratio = Math.max(1, Math.round(inputTokens / outputTokens));
|
|
40
|
-
return `${ratio}:1`;
|
|
41
|
-
}
|
|
42
|
-
function formatCompressionTime(ms) {
|
|
43
|
-
const safeMs = Math.max(0, Math.round(ms));
|
|
44
|
-
if (safeMs < 1000) {
|
|
45
|
-
return `${safeMs} ms`;
|
|
46
|
-
}
|
|
47
|
-
const totalSeconds = safeMs / 1000;
|
|
48
|
-
if (totalSeconds < 60) {
|
|
49
|
-
return `${totalSeconds.toFixed(1)} s`;
|
|
50
|
-
}
|
|
51
|
-
const wholeSeconds = Math.floor(totalSeconds);
|
|
52
|
-
const hours = Math.floor(wholeSeconds / 3600);
|
|
53
|
-
const minutes = Math.floor((wholeSeconds % 3600) / 60);
|
|
54
|
-
const seconds = wholeSeconds % 60;
|
|
55
|
-
if (hours > 0) {
|
|
56
|
-
return `${hours}h ${minutes}m ${seconds}s`;
|
|
57
|
-
}
|
|
58
|
-
return `${minutes}m ${seconds}s`;
|
|
59
|
-
}
|
|
60
|
-
export async function handleStatsCommand(ctx) {
|
|
61
|
-
const { client, state, logger, sessionId, messages } = ctx;
|
|
62
|
-
// Session stats from in-memory state
|
|
63
|
-
const sessionTokens = state.stats.totalPruneTokens;
|
|
64
|
-
const sessionSummaryTokens = Array.from(state.prune.messages.blocksById.values()).reduce((total, block) => (block.active ? total + block.summaryTokens : total), 0);
|
|
65
|
-
const sessionDurationMs = getActiveCompressionTargets(state.prune.messages).reduce((total, target) => total + target.durationMs, 0);
|
|
66
|
-
const prunedToolIds = new Set(state.prune.tools.keys());
|
|
67
|
-
for (const block of state.prune.messages.blocksById.values()) {
|
|
68
|
-
if (block.active) {
|
|
69
|
-
for (const toolId of block.effectiveToolIds) {
|
|
70
|
-
prunedToolIds.add(toolId);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
const sessionTools = prunedToolIds.size;
|
|
75
|
-
let sessionMessages = 0;
|
|
76
|
-
for (const entry of state.prune.messages.byMessageId.values()) {
|
|
77
|
-
if (entry.activeBlockIds.length > 0) {
|
|
78
|
-
sessionMessages++;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
// All-time stats from storage files
|
|
82
|
-
const allTime = await loadAllSessionStats(logger);
|
|
83
|
-
const message = formatStatsMessage(sessionTokens, sessionSummaryTokens, sessionTools, sessionMessages, sessionDurationMs, allTime);
|
|
84
|
-
const params = getCurrentParams(state, messages, logger);
|
|
85
|
-
await sendIgnoredMessage(client, sessionId, message, params, logger);
|
|
86
|
-
logger.info("Stats command executed", {
|
|
87
|
-
sessionTokens,
|
|
88
|
-
sessionSummaryTokens,
|
|
89
|
-
sessionTools,
|
|
90
|
-
sessionMessages,
|
|
91
|
-
sessionDurationMs,
|
|
92
|
-
allTimeTokens: allTime.totalTokens,
|
|
93
|
-
allTimeTools: allTime.totalTools,
|
|
94
|
-
allTimeMessages: allTime.totalMessages,
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
//# sourceMappingURL=stats.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../lib/commands/stats.ts"],"names":[],"mappings":"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"}
|