@tarquinen/opencode-dcp 3.0.3 → 3.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/README.md +23 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -9
- package/dist/index.js.map +1 -1
- package/dist/lib/commands/compression-targets.d.ts +13 -0
- package/dist/lib/commands/compression-targets.d.ts.map +1 -0
- package/dist/lib/commands/compression-targets.js +97 -0
- package/dist/lib/commands/compression-targets.js.map +1 -0
- package/dist/lib/commands/context.js +1 -1
- package/dist/lib/commands/context.js.map +1 -1
- package/dist/lib/commands/decompress.d.ts.map +1 -1
- package/dist/lib/commands/decompress.js +43 -28
- package/dist/lib/commands/decompress.js.map +1 -1
- package/dist/lib/commands/manual.d.ts.map +1 -1
- package/dist/lib/commands/manual.js +6 -6
- package/dist/lib/commands/manual.js.map +1 -1
- package/dist/lib/commands/recompress.d.ts.map +1 -1
- package/dist/lib/commands/recompress.js +34 -31
- package/dist/lib/commands/recompress.js.map +1 -1
- package/dist/lib/compress/index.d.ts +4 -0
- package/dist/lib/compress/index.d.ts.map +1 -0
- package/dist/lib/compress/index.js +3 -0
- package/dist/lib/compress/index.js.map +1 -0
- package/dist/lib/compress/message-utils.d.ts +8 -0
- package/dist/lib/compress/message-utils.d.ts.map +1 -0
- package/dist/lib/compress/message-utils.js +123 -0
- package/dist/lib/compress/message-utils.js.map +1 -0
- package/dist/lib/compress/message.d.ts +4 -0
- package/dist/lib/compress/message.d.ts.map +1 -0
- package/dist/lib/compress/message.js +78 -0
- package/dist/lib/compress/message.js.map +1 -0
- package/dist/lib/compress/pipeline.d.ts +29 -0
- package/dist/lib/compress/pipeline.d.ts.map +1 -0
- package/dist/lib/compress/pipeline.js +40 -0
- package/dist/lib/compress/pipeline.js.map +1 -0
- package/dist/lib/compress/protected-content.d.ts +5 -0
- package/dist/lib/compress/protected-content.d.ts.map +1 -0
- package/dist/lib/compress/protected-content.js +106 -0
- package/dist/lib/compress/protected-content.js.map +1 -0
- package/dist/lib/compress/range-utils.d.ts +10 -0
- package/dist/lib/compress/range-utils.d.ts.map +1 -0
- package/dist/lib/compress/range-utils.js +199 -0
- package/dist/lib/compress/range-utils.js.map +1 -0
- package/dist/lib/compress/range.d.ts +4 -0
- package/dist/lib/compress/range.d.ts.map +1 -0
- package/dist/lib/compress/range.js +86 -0
- package/dist/lib/compress/range.js.map +1 -0
- package/dist/lib/compress/search.d.ts +11 -0
- package/dist/lib/compress/search.d.ts.map +1 -0
- package/dist/lib/compress/search.js +204 -0
- package/dist/lib/compress/search.js.map +1 -0
- package/dist/lib/compress/state.d.ts +8 -0
- package/dist/lib/compress/state.d.ts.map +1 -0
- package/dist/lib/compress/state.js +197 -0
- package/dist/lib/compress/state.js.map +1 -0
- package/dist/lib/compress/types.d.ts +92 -0
- package/dist/lib/compress/types.d.ts.map +1 -0
- package/dist/lib/{tools → compress}/types.js.map +1 -1
- package/dist/lib/config.d.ts +5 -7
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +24 -30
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/hooks.d.ts.map +1 -1
- package/dist/lib/hooks.js +6 -8
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/message-ids.d.ts +1 -1
- package/dist/lib/message-ids.d.ts.map +1 -1
- package/dist/lib/message-ids.js +19 -3
- package/dist/lib/message-ids.js.map +1 -1
- package/dist/lib/messages/inject/inject.d.ts +3 -2
- package/dist/lib/messages/inject/inject.d.ts.map +1 -1
- package/dist/lib/messages/inject/inject.js +31 -10
- package/dist/lib/messages/inject/inject.js.map +1 -1
- package/dist/lib/messages/inject/utils.d.ts +2 -2
- package/dist/lib/messages/inject/utils.d.ts.map +1 -1
- package/dist/lib/messages/inject/utils.js +102 -42
- package/dist/lib/messages/inject/utils.js.map +1 -1
- package/dist/lib/messages/priority.d.ts +13 -0
- package/dist/lib/messages/priority.d.ts.map +1 -0
- package/dist/lib/messages/priority.js +65 -0
- package/dist/lib/messages/priority.js.map +1 -0
- package/dist/lib/messages/prune.js +6 -4
- package/dist/lib/messages/prune.js.map +1 -1
- package/dist/lib/messages/utils.d.ts +9 -2
- package/dist/lib/messages/utils.d.ts.map +1 -1
- package/dist/lib/messages/utils.js +41 -9
- package/dist/lib/messages/utils.js.map +1 -1
- package/dist/lib/prompts/compress-message.d.ts +2 -0
- package/dist/lib/prompts/compress-message.d.ts.map +1 -0
- package/dist/lib/prompts/compress-message.js +44 -0
- package/dist/lib/prompts/compress-message.js.map +1 -0
- package/dist/lib/prompts/compress-range.d.ts +2 -0
- package/dist/lib/prompts/compress-range.d.ts.map +1 -0
- package/dist/lib/prompts/{compress.js → compress-range.js} +5 -29
- package/dist/lib/prompts/compress-range.js.map +1 -0
- package/dist/lib/prompts/internal-overlays.d.ts +2 -2
- package/dist/lib/prompts/internal-overlays.d.ts.map +1 -1
- package/dist/lib/prompts/internal-overlays.js +17 -11
- package/dist/lib/prompts/internal-overlays.js.map +1 -1
- package/dist/lib/prompts/message-priority-guidance.d.ts +2 -0
- package/dist/lib/prompts/message-priority-guidance.d.ts.map +1 -0
- package/dist/lib/prompts/message-priority-guidance.js +9 -0
- package/dist/lib/prompts/message-priority-guidance.js.map +1 -0
- package/dist/lib/prompts/store.d.ts +3 -2
- package/dist/lib/prompts/store.d.ts.map +1 -1
- package/dist/lib/prompts/store.js +30 -18
- package/dist/lib/prompts/store.js.map +1 -1
- package/dist/lib/prompts/system.d.ts +1 -1
- package/dist/lib/prompts/system.d.ts.map +1 -1
- package/dist/lib/prompts/system.js +26 -9
- package/dist/lib/prompts/system.js.map +1 -1
- package/dist/lib/shared-utils.d.ts +1 -0
- package/dist/lib/shared-utils.d.ts.map +1 -1
- package/dist/lib/shared-utils.js +7 -0
- package/dist/lib/shared-utils.js.map +1 -1
- package/dist/lib/state/persistence.d.ts +1 -0
- package/dist/lib/state/persistence.d.ts.map +1 -1
- package/dist/lib/state/persistence.js +1 -0
- package/dist/lib/state/persistence.js.map +1 -1
- package/dist/lib/state/types.d.ts +6 -0
- package/dist/lib/state/types.d.ts.map +1 -1
- package/dist/lib/state/utils.d.ts +1 -0
- package/dist/lib/state/utils.d.ts.map +1 -1
- package/dist/lib/state/utils.js +31 -9
- package/dist/lib/state/utils.js.map +1 -1
- package/dist/lib/strategies/index.d.ts +0 -1
- package/dist/lib/strategies/index.d.ts.map +1 -1
- package/dist/lib/strategies/index.js +0 -1
- package/dist/lib/strategies/index.js.map +1 -1
- package/dist/lib/strategies/utils.d.ts +1 -5
- package/dist/lib/strategies/utils.d.ts.map +1 -1
- package/dist/lib/strategies/utils.js +24 -28
- package/dist/lib/strategies/utils.js.map +1 -1
- package/dist/lib/ui/notification.d.ts +8 -1
- package/dist/lib/ui/notification.d.ts.map +1 -1
- package/dist/lib/ui/notification.js +66 -13
- package/dist/lib/ui/notification.js.map +1 -1
- package/package.json +1 -1
- package/dist/lib/prompts/compress.d.ts +0 -2
- package/dist/lib/prompts/compress.d.ts.map +0 -1
- package/dist/lib/prompts/compress.js.map +0 -1
- package/dist/lib/strategies/supersede-writes.d.ts +0 -13
- package/dist/lib/strategies/supersede-writes.d.ts.map +0 -1
- package/dist/lib/strategies/supersede-writes.js +0 -94
- package/dist/lib/strategies/supersede-writes.js.map +0 -1
- package/dist/lib/tools/compress.d.ts +0 -4
- package/dist/lib/tools/compress.d.ts.map +0 -1
- package/dist/lib/tools/compress.js +0 -110
- package/dist/lib/tools/compress.js.map +0 -1
- package/dist/lib/tools/index.d.ts +0 -3
- package/dist/lib/tools/index.d.ts.map +0 -1
- package/dist/lib/tools/index.js +0 -2
- package/dist/lib/tools/index.js.map +0 -1
- package/dist/lib/tools/types.d.ts +0 -13
- package/dist/lib/tools/types.d.ts.map +0 -1
- package/dist/lib/tools/utils.d.ts +0 -80
- package/dist/lib/tools/utils.d.ts.map +0 -1
- package/dist/lib/tools/utils.js +0 -694
- package/dist/lib/tools/utils.js.map +0 -1
- /package/dist/lib/{tools → compress}/types.js +0 -0
|
@@ -4,6 +4,7 @@ import { getCurrentParams } from "../strategies/utils";
|
|
|
4
4
|
import { saveSessionState } from "../state/persistence";
|
|
5
5
|
import { sendIgnoredMessage } from "../ui/notification";
|
|
6
6
|
import { formatTokenCount } from "../ui/utils";
|
|
7
|
+
import { getRecompressibleCompressionTargets, resolveCompressionTarget, } from "./compression-targets";
|
|
7
8
|
function parseBlockIdArg(arg) {
|
|
8
9
|
const normalized = arg.trim().toLowerCase();
|
|
9
10
|
const blockRef = parseBlockRef(normalized);
|
|
@@ -16,13 +17,6 @@ function parseBlockIdArg(arg) {
|
|
|
16
17
|
const parsed = Number.parseInt(normalized, 10);
|
|
17
18
|
return Number.isInteger(parsed) && parsed > 0 ? parsed : null;
|
|
18
19
|
}
|
|
19
|
-
function getRecompressibleBlocks(messagesState, availableMessageIds) {
|
|
20
|
-
return Array.from(messagesState.blocksById.values())
|
|
21
|
-
.filter((block) => block.deactivatedByUser &&
|
|
22
|
-
!block.active &&
|
|
23
|
-
availableMessageIds.has(block.compressMessageId))
|
|
24
|
-
.sort((a, b) => a.blockId - b.blockId);
|
|
25
|
-
}
|
|
26
20
|
function snapshotActiveMessages(messagesState) {
|
|
27
21
|
const activeMessages = new Set();
|
|
28
22
|
for (const [messageId, entry] of messagesState.byMessageId) {
|
|
@@ -32,9 +26,12 @@ function snapshotActiveMessages(messagesState) {
|
|
|
32
26
|
}
|
|
33
27
|
return activeMessages;
|
|
34
28
|
}
|
|
35
|
-
function formatRecompressMessage(
|
|
29
|
+
function formatRecompressMessage(target, recompressedMessageCount, recompressedTokens, deactivatedBlockIds) {
|
|
36
30
|
const lines = [];
|
|
37
|
-
lines.push(`Re-applied compression ${
|
|
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
|
+
}
|
|
38
35
|
if (deactivatedBlockIds.length > 0) {
|
|
39
36
|
const refs = deactivatedBlockIds.map((id) => String(id)).join(", ");
|
|
40
37
|
lines.push(`Also re-compressed nested compression(s): ${refs}.`);
|
|
@@ -47,19 +44,22 @@ function formatRecompressMessage(targetBlockId, recompressedMessageCount, recomp
|
|
|
47
44
|
}
|
|
48
45
|
return lines.join("\n");
|
|
49
46
|
}
|
|
50
|
-
function formatAvailableBlocksMessage(
|
|
47
|
+
function formatAvailableBlocksMessage(availableTargets) {
|
|
51
48
|
const lines = [];
|
|
52
49
|
lines.push("Usage: /dcp recompress <n>");
|
|
53
50
|
lines.push("");
|
|
54
|
-
if (
|
|
51
|
+
if (availableTargets.length === 0) {
|
|
55
52
|
lines.push("No user-decompressed blocks are available to re-compress.");
|
|
56
53
|
return lines.join("\n");
|
|
57
54
|
}
|
|
58
|
-
lines.push("Available user-decompressed
|
|
59
|
-
const entries =
|
|
60
|
-
const topic =
|
|
61
|
-
const label = `${
|
|
62
|
-
|
|
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
63
|
});
|
|
64
64
|
const labelWidth = Math.max(...entries.map((entry) => entry.label.length)) + 4;
|
|
65
65
|
for (const entry of entries) {
|
|
@@ -79,8 +79,8 @@ export async function handleRecompressCommand(ctx) {
|
|
|
79
79
|
const messagesState = state.prune.messages;
|
|
80
80
|
const availableMessageIds = new Set(messages.map((msg) => msg.info.id));
|
|
81
81
|
if (!targetArg) {
|
|
82
|
-
const
|
|
83
|
-
const message = formatAvailableBlocksMessage(
|
|
82
|
+
const availableTargets = getRecompressibleCompressionTargets(messagesState, availableMessageIds);
|
|
83
|
+
const message = formatAvailableBlocksMessage(availableTargets);
|
|
84
84
|
await sendIgnoredMessage(client, sessionId, message, params, logger);
|
|
85
85
|
return;
|
|
86
86
|
}
|
|
@@ -89,27 +89,29 @@ export async function handleRecompressCommand(ctx) {
|
|
|
89
89
|
await sendIgnoredMessage(client, sessionId, `Please enter a compression number. Example: /dcp recompress 2`, params, logger);
|
|
90
90
|
return;
|
|
91
91
|
}
|
|
92
|
-
const
|
|
93
|
-
if (!
|
|
92
|
+
const target = resolveCompressionTarget(messagesState, targetBlockId);
|
|
93
|
+
if (!target) {
|
|
94
94
|
await sendIgnoredMessage(client, sessionId, `Compression ${targetBlockId} does not exist.`, params, logger);
|
|
95
95
|
return;
|
|
96
96
|
}
|
|
97
|
-
if (!availableMessageIds.has(
|
|
98
|
-
await sendIgnoredMessage(client, sessionId, `Compression ${
|
|
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
99
|
return;
|
|
100
100
|
}
|
|
101
|
-
if (!
|
|
102
|
-
const message =
|
|
103
|
-
? `Compression ${
|
|
104
|
-
: `Compression ${
|
|
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
105
|
await sendIgnoredMessage(client, sessionId, message, params, logger);
|
|
106
106
|
return;
|
|
107
107
|
}
|
|
108
108
|
const activeMessagesBefore = snapshotActiveMessages(messagesState);
|
|
109
109
|
const activeBlockIdsBefore = new Set(messagesState.activeBlockIds);
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
110
|
+
for (const block of target.blocks) {
|
|
111
|
+
block.deactivatedByUser = false;
|
|
112
|
+
block.deactivatedAt = undefined;
|
|
113
|
+
block.deactivatedByBlockId = undefined;
|
|
114
|
+
}
|
|
113
115
|
syncCompressionBlocks(state, logger, messages);
|
|
114
116
|
let recompressedMessageCount = 0;
|
|
115
117
|
let recompressedTokens = 0;
|
|
@@ -125,10 +127,11 @@ export async function handleRecompressCommand(ctx) {
|
|
|
125
127
|
.filter((blockId) => !messagesState.activeBlockIds.has(blockId))
|
|
126
128
|
.sort((a, b) => a - b);
|
|
127
129
|
await saveSessionState(state, logger);
|
|
128
|
-
const message = formatRecompressMessage(
|
|
130
|
+
const message = formatRecompressMessage(target, recompressedMessageCount, recompressedTokens, deactivatedBlockIds);
|
|
129
131
|
await sendIgnoredMessage(client, sessionId, message, params, logger);
|
|
130
132
|
logger.info("Recompress command completed", {
|
|
131
|
-
targetBlockId,
|
|
133
|
+
targetBlockId: target.displayId,
|
|
134
|
+
targetRunId: target.runId,
|
|
132
135
|
recompressedMessageCount,
|
|
133
136
|
recompressedTokens,
|
|
134
137
|
deactivatedBlockIds,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recompress.js","sourceRoot":"","sources":["../../../lib/commands/recompress.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"recompress.js","sourceRoot":"","sources":["../../../lib/commands/recompress.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/compress/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACrC,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAA;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/compress/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAA;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { PluginConfig } from "../config";
|
|
2
|
+
import type { SessionState } from "../state";
|
|
3
|
+
import type { CompressMessageToolArgs, ResolvedMessageCompressionsResult, SearchContext } from "./types";
|
|
4
|
+
export declare function validateArgs(args: CompressMessageToolArgs): void;
|
|
5
|
+
export declare function formatResult(processedCount: number, skippedIssues: string[]): string;
|
|
6
|
+
export declare function formatIssues(skippedIssues: string[]): string;
|
|
7
|
+
export declare function resolveMessages(args: CompressMessageToolArgs, searchContext: SearchContext, state: SessionState, config: PluginConfig): ResolvedMessageCompressionsResult;
|
|
8
|
+
//# sourceMappingURL=message-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-utils.d.ts","sourceRoot":"","sources":["../../../lib/compress/message-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAK5C,OAAO,KAAK,EAER,uBAAuB,EAEvB,iCAAiC,EACjC,aAAa,EAChB,MAAM,SAAS,CAAA;AAIhB,wBAAgB,YAAY,CAAC,IAAI,EAAE,uBAAuB,GAAG,IAAI,CAyBhE;AAED,wBAAgB,YAAY,CAAC,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,MAAM,CAcpF;AAED,wBAAgB,YAAY,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,MAAM,CAI5D;AAED,wBAAgB,eAAe,CAC3B,IAAI,EAAE,uBAAuB,EAC7B,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,YAAY,GACrB,iCAAiC,CAwCnC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { parseBoundaryId } from "../message-ids";
|
|
2
|
+
import { isIgnoredUserMessage, isProtectedUserMessage } from "../messages/utils";
|
|
3
|
+
import { resolveAnchorMessageId, resolveBoundaryIds, resolveSelection } from "./search";
|
|
4
|
+
import { COMPRESSED_BLOCK_HEADER } from "./state";
|
|
5
|
+
class SoftIssue extends Error {
|
|
6
|
+
}
|
|
7
|
+
export function validateArgs(args) {
|
|
8
|
+
if (typeof args.topic !== "string" || args.topic.trim().length === 0) {
|
|
9
|
+
throw new Error("topic is required and must be a non-empty string");
|
|
10
|
+
}
|
|
11
|
+
if (!Array.isArray(args.content) || args.content.length === 0) {
|
|
12
|
+
throw new Error("content is required and must be a non-empty array");
|
|
13
|
+
}
|
|
14
|
+
for (let index = 0; index < args.content.length; index++) {
|
|
15
|
+
const entry = args.content[index];
|
|
16
|
+
const prefix = `content[${index}]`;
|
|
17
|
+
if (typeof entry?.messageId !== "string" || entry.messageId.trim().length === 0) {
|
|
18
|
+
throw new Error(`${prefix}.messageId is required and must be a non-empty string`);
|
|
19
|
+
}
|
|
20
|
+
if (typeof entry?.topic !== "string" || entry.topic.trim().length === 0) {
|
|
21
|
+
throw new Error(`${prefix}.topic is required and must be a non-empty string`);
|
|
22
|
+
}
|
|
23
|
+
if (typeof entry?.summary !== "string" || entry.summary.trim().length === 0) {
|
|
24
|
+
throw new Error(`${prefix}.summary is required and must be a non-empty string`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export function formatResult(processedCount, skippedIssues) {
|
|
29
|
+
const messageNoun = processedCount === 1 ? "message" : "messages";
|
|
30
|
+
const processedText = processedCount > 0
|
|
31
|
+
? `Compressed ${processedCount} ${messageNoun} into ${COMPRESSED_BLOCK_HEADER}.`
|
|
32
|
+
: "Compressed 0 messages.";
|
|
33
|
+
if (skippedIssues.length === 0) {
|
|
34
|
+
return processedText;
|
|
35
|
+
}
|
|
36
|
+
const issueNoun = skippedIssues.length === 1 ? "issue" : "issues";
|
|
37
|
+
const issueLines = skippedIssues.map((issue) => `- ${issue}`).join("\n");
|
|
38
|
+
return `${processedText}\nSkipped ${skippedIssues.length} ${issueNoun}:\n${issueLines}`;
|
|
39
|
+
}
|
|
40
|
+
export function formatIssues(skippedIssues) {
|
|
41
|
+
const issueNoun = skippedIssues.length === 1 ? "issue" : "issues";
|
|
42
|
+
const issueLines = skippedIssues.map((issue) => `- ${issue}`).join("\n");
|
|
43
|
+
return `Unable to compress any messages. Found ${skippedIssues.length} ${issueNoun}:\n${issueLines}`;
|
|
44
|
+
}
|
|
45
|
+
export function resolveMessages(args, searchContext, state, config) {
|
|
46
|
+
const issues = [];
|
|
47
|
+
const plans = [];
|
|
48
|
+
const seenMessageIds = new Set();
|
|
49
|
+
for (const entry of args.content) {
|
|
50
|
+
const normalizedMessageId = entry.messageId.trim();
|
|
51
|
+
if (seenMessageIds.has(normalizedMessageId)) {
|
|
52
|
+
issues.push(`messageId ${normalizedMessageId} was selected more than once in this batch.`);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
const plan = resolveMessage({
|
|
57
|
+
...entry,
|
|
58
|
+
messageId: normalizedMessageId,
|
|
59
|
+
}, searchContext, state, config);
|
|
60
|
+
seenMessageIds.add(plan.entry.messageId);
|
|
61
|
+
plans.push(plan);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
if (error instanceof SoftIssue) {
|
|
65
|
+
issues.push(error.message);
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
plans,
|
|
73
|
+
skippedIssues: issues,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function resolveMessage(entry, searchContext, state, config) {
|
|
77
|
+
if (entry.messageId.toUpperCase() === "BLOCKED") {
|
|
78
|
+
throw new SoftIssue("messageId BLOCKED refers to a protected message and cannot be compressed.");
|
|
79
|
+
}
|
|
80
|
+
const parsed = parseBoundaryId(entry.messageId);
|
|
81
|
+
if (!parsed) {
|
|
82
|
+
throw new Error(`messageId ${entry.messageId} is invalid. Use an injected raw message ID of the form mNNNN.`);
|
|
83
|
+
}
|
|
84
|
+
if (parsed.kind === "compressed-block") {
|
|
85
|
+
throw new SoftIssue(`messageId ${entry.messageId} is invalid here. Block IDs like bN are not allowed; use an mNNNN message ID instead.`);
|
|
86
|
+
}
|
|
87
|
+
const messageId = state.messageIds.byRef.get(parsed.ref);
|
|
88
|
+
const rawMessage = messageId ? searchContext.rawMessagesById.get(messageId) : undefined;
|
|
89
|
+
const hasBoundary = !!rawMessage &&
|
|
90
|
+
!!messageId &&
|
|
91
|
+
searchContext.rawIndexById.has(messageId) &&
|
|
92
|
+
!isIgnoredUserMessage(rawMessage);
|
|
93
|
+
if (!hasBoundary) {
|
|
94
|
+
throw new SoftIssue(`messageId ${parsed.ref} is not available in the current conversation context. Choose an injected mNNNN ID visible in context.`);
|
|
95
|
+
}
|
|
96
|
+
const { startReference, endReference } = resolveBoundaryIds(searchContext, state, parsed.ref, parsed.ref);
|
|
97
|
+
const selection = resolveSelection(searchContext, startReference, endReference);
|
|
98
|
+
const rawMessageId = selection.messageIds[0];
|
|
99
|
+
if (!rawMessageId) {
|
|
100
|
+
throw new Error(`messageId ${parsed.ref} could not be resolved to a raw message.`);
|
|
101
|
+
}
|
|
102
|
+
const message = searchContext.rawMessagesById.get(rawMessageId);
|
|
103
|
+
if (!message) {
|
|
104
|
+
throw new Error(`messageId ${parsed.ref} is not available in the current conversation.`);
|
|
105
|
+
}
|
|
106
|
+
if (isProtectedUserMessage(config, message)) {
|
|
107
|
+
throw new SoftIssue(`messageId ${parsed.ref} refers to a protected message and cannot be compressed.`);
|
|
108
|
+
}
|
|
109
|
+
const pruneEntry = state.prune.messages.byMessageId.get(rawMessageId);
|
|
110
|
+
if (pruneEntry && pruneEntry.activeBlockIds.length > 0) {
|
|
111
|
+
throw new Error(`messageId ${parsed.ref} is already part of an active compression.`);
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
entry: {
|
|
115
|
+
messageId: parsed.ref,
|
|
116
|
+
topic: entry.topic,
|
|
117
|
+
summary: entry.summary,
|
|
118
|
+
},
|
|
119
|
+
selection,
|
|
120
|
+
anchorMessageId: resolveAnchorMessageId(startReference),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=message-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-utils.js","sourceRoot":"","sources":["../../../lib/compress/message-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../lib/compress/message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAuC1C,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,WAAW,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CA2FnF"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { tool } from "@opencode-ai/plugin";
|
|
2
|
+
import { countTokens } from "../strategies/utils";
|
|
3
|
+
import { MESSAGE_FORMAT_OVERLAY } from "../prompts/internal-overlays";
|
|
4
|
+
import { formatIssues, formatResult, resolveMessages, validateArgs } from "./message-utils";
|
|
5
|
+
import { finalizeSession, prepareSession } from "./pipeline";
|
|
6
|
+
import { appendProtectedTools } from "./protected-content";
|
|
7
|
+
import { allocateBlockId, allocateRunId, applyCompressionState, wrapCompressedSummary, } from "./state";
|
|
8
|
+
function buildSchema() {
|
|
9
|
+
return {
|
|
10
|
+
topic: tool.schema
|
|
11
|
+
.string()
|
|
12
|
+
.describe("Short label (3-5 words) for the overall batch - e.g., 'Closed Research Notes'"),
|
|
13
|
+
content: tool.schema
|
|
14
|
+
.array(tool.schema.object({
|
|
15
|
+
messageId: tool.schema
|
|
16
|
+
.string()
|
|
17
|
+
.describe("Raw message ID to compress (e.g. m0001)"),
|
|
18
|
+
topic: tool.schema
|
|
19
|
+
.string()
|
|
20
|
+
.describe("Short label (3-5 words) for this one message summary"),
|
|
21
|
+
summary: tool.schema
|
|
22
|
+
.string()
|
|
23
|
+
.describe("Complete technical summary replacing that one message"),
|
|
24
|
+
}))
|
|
25
|
+
.describe("Batch of individual message summaries to create in one tool call"),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export function createCompressMessageTool(ctx) {
|
|
29
|
+
ctx.prompts.reload();
|
|
30
|
+
const runtimePrompts = ctx.prompts.getRuntimePrompts();
|
|
31
|
+
return tool({
|
|
32
|
+
description: runtimePrompts.compressMessage + MESSAGE_FORMAT_OVERLAY,
|
|
33
|
+
args: buildSchema(),
|
|
34
|
+
async execute(args, toolCtx) {
|
|
35
|
+
const input = args;
|
|
36
|
+
validateArgs(input);
|
|
37
|
+
const { rawMessages, searchContext } = await prepareSession(ctx, toolCtx, `Compress Message: ${input.topic}`);
|
|
38
|
+
const { plans, skippedIssues } = resolveMessages(input, searchContext, ctx.state, ctx.config);
|
|
39
|
+
if (plans.length === 0 && skippedIssues.length > 0) {
|
|
40
|
+
throw new Error(formatIssues(skippedIssues));
|
|
41
|
+
}
|
|
42
|
+
const notifications = [];
|
|
43
|
+
const preparedPlans = [];
|
|
44
|
+
for (const plan of plans) {
|
|
45
|
+
const summaryWithTools = await appendProtectedTools(ctx.client, ctx.state, ctx.config.experimental.allowSubAgents, plan.entry.summary, plan.selection, searchContext, ctx.config.compress.protectedTools, ctx.config.protectedFilePatterns);
|
|
46
|
+
preparedPlans.push({
|
|
47
|
+
plan,
|
|
48
|
+
summaryWithTools,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
const runId = allocateRunId(ctx.state);
|
|
52
|
+
for (const { plan, summaryWithTools } of preparedPlans) {
|
|
53
|
+
const blockId = allocateBlockId(ctx.state);
|
|
54
|
+
const storedSummary = wrapCompressedSummary(blockId, summaryWithTools);
|
|
55
|
+
const summaryTokens = countTokens(storedSummary);
|
|
56
|
+
applyCompressionState(ctx.state, {
|
|
57
|
+
topic: plan.entry.topic,
|
|
58
|
+
batchTopic: input.topic,
|
|
59
|
+
startId: plan.entry.messageId,
|
|
60
|
+
endId: plan.entry.messageId,
|
|
61
|
+
mode: "message",
|
|
62
|
+
runId,
|
|
63
|
+
compressMessageId: toolCtx.messageID,
|
|
64
|
+
summaryTokens,
|
|
65
|
+
}, plan.selection, plan.anchorMessageId, blockId, storedSummary, []);
|
|
66
|
+
notifications.push({
|
|
67
|
+
blockId,
|
|
68
|
+
runId,
|
|
69
|
+
summary: summaryWithTools,
|
|
70
|
+
summaryTokens,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
await finalizeSession(ctx, toolCtx, rawMessages, notifications, input.topic);
|
|
74
|
+
return formatResult(plans.length, skippedIssues);
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../../lib/compress/message.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { WithParts } from "../state";
|
|
2
|
+
import type { ToolContext } from "./types";
|
|
3
|
+
import type { SearchContext } from "./types";
|
|
4
|
+
interface RunContext {
|
|
5
|
+
ask(input: {
|
|
6
|
+
permission: string;
|
|
7
|
+
patterns: string[];
|
|
8
|
+
always: string[];
|
|
9
|
+
metadata: Record<string, unknown>;
|
|
10
|
+
}): Promise<void>;
|
|
11
|
+
metadata(input: {
|
|
12
|
+
title: string;
|
|
13
|
+
}): void;
|
|
14
|
+
sessionID: string;
|
|
15
|
+
}
|
|
16
|
+
export interface NotificationEntry {
|
|
17
|
+
blockId: number;
|
|
18
|
+
runId: number;
|
|
19
|
+
summary: string;
|
|
20
|
+
summaryTokens: number;
|
|
21
|
+
}
|
|
22
|
+
export interface PreparedSession {
|
|
23
|
+
rawMessages: WithParts[];
|
|
24
|
+
searchContext: SearchContext;
|
|
25
|
+
}
|
|
26
|
+
export declare function prepareSession(ctx: ToolContext, toolCtx: RunContext, title: string): Promise<PreparedSession>;
|
|
27
|
+
export declare function finalizeSession(ctx: ToolContext, toolCtx: RunContext, rawMessages: WithParts[], entries: NotificationEntry[], batchTopic: string | undefined): Promise<void>;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=pipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../lib/compress/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAQzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE5C,UAAU,UAAU;IAChB,GAAG,CAAC,KAAK,EAAE;QACP,UAAU,EAAE,MAAM,CAAA;QAClB,QAAQ,EAAE,MAAM,EAAE,CAAA;QAClB,MAAM,EAAE,MAAM,EAAE,CAAA;QAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KACpC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjB,QAAQ,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IACxC,SAAS,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,eAAe;IAC5B,WAAW,EAAE,SAAS,EAAE,CAAA;IACxB,aAAa,EAAE,aAAa,CAAA;CAC/B;AAED,wBAAsB,cAAc,CAChC,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,CAAC,CAoC1B;AAED,wBAAsB,eAAe,CACjC,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,UAAU,EACnB,WAAW,EAAE,SAAS,EAAE,EACxB,OAAO,EAAE,iBAAiB,EAAE,EAC5B,UAAU,EAAE,MAAM,GAAG,SAAS,GAC/B,OAAO,CAAC,IAAI,CAAC,CAsBf"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { ensureSessionInitialized } from "../state";
|
|
2
|
+
import { saveSessionState } from "../state/persistence";
|
|
3
|
+
import { assignMessageRefs } from "../message-ids";
|
|
4
|
+
import { isIgnoredUserMessage } from "../messages/utils";
|
|
5
|
+
import { deduplicate, purgeErrors } from "../strategies";
|
|
6
|
+
import { getCurrentParams, getCurrentTokenUsage } from "../strategies/utils";
|
|
7
|
+
import { sendCompressNotification } from "../ui/notification";
|
|
8
|
+
import { buildSearchContext, fetchSessionMessages } from "./search";
|
|
9
|
+
export async function prepareSession(ctx, toolCtx, title) {
|
|
10
|
+
if (ctx.state.manualMode && ctx.state.manualMode !== "compress-pending") {
|
|
11
|
+
throw new Error("Manual mode: compress blocked. Do not retry until `<compress triggered manually>` appears in user context.");
|
|
12
|
+
}
|
|
13
|
+
await toolCtx.ask({
|
|
14
|
+
permission: "compress",
|
|
15
|
+
patterns: ["*"],
|
|
16
|
+
always: ["*"],
|
|
17
|
+
metadata: {},
|
|
18
|
+
});
|
|
19
|
+
toolCtx.metadata({ title });
|
|
20
|
+
const rawMessages = await fetchSessionMessages(ctx.client, toolCtx.sessionID);
|
|
21
|
+
await ensureSessionInitialized(ctx.client, ctx.state, toolCtx.sessionID, ctx.logger, rawMessages, ctx.config.manualMode.enabled);
|
|
22
|
+
assignMessageRefs(ctx.state, rawMessages);
|
|
23
|
+
deduplicate(ctx.state, ctx.logger, ctx.config, rawMessages);
|
|
24
|
+
purgeErrors(ctx.state, ctx.logger, ctx.config, rawMessages);
|
|
25
|
+
return {
|
|
26
|
+
rawMessages,
|
|
27
|
+
searchContext: buildSearchContext(ctx.state, rawMessages),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export async function finalizeSession(ctx, toolCtx, rawMessages, entries, batchTopic) {
|
|
31
|
+
ctx.state.manualMode = ctx.state.manualMode ? "active" : false;
|
|
32
|
+
await saveSessionState(ctx.state, ctx.logger);
|
|
33
|
+
const params = getCurrentParams(ctx.state, rawMessages, ctx.logger);
|
|
34
|
+
const totalSessionTokens = getCurrentTokenUsage(ctx.state, rawMessages);
|
|
35
|
+
const sessionMessageIds = rawMessages
|
|
36
|
+
.filter((msg) => !isIgnoredUserMessage(msg))
|
|
37
|
+
.map((msg) => msg.info.id);
|
|
38
|
+
await sendCompressNotification(ctx.client, ctx.logger, ctx.config, ctx.state, toolCtx.sessionID, entries, batchTopic, totalSessionTokens, sessionMessageIds, params);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../lib/compress/pipeline.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AACxD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA;AAE7D,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AA0BnE,MAAM,CAAC,KAAK,UAAU,cAAc,CAChC,GAAgB,EAChB,OAAmB,EACnB,KAAa;IAEb,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,kBAAkB,EAAE,CAAC;QACtE,MAAM,IAAI,KAAK,CACX,4GAA4G,CAC/G,CAAA;IACL,CAAC;IAED,MAAM,OAAO,CAAC,GAAG,CAAC;QACd,UAAU,EAAE,UAAU;QACtB,QAAQ,EAAE,CAAC,GAAG,CAAC;QACf,MAAM,EAAE,CAAC,GAAG,CAAC;QACb,QAAQ,EAAE,EAAE;KACf,CAAC,CAAA;IAEF,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;IAE3B,MAAM,WAAW,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;IAE7E,MAAM,wBAAwB,CAC1B,GAAG,CAAC,MAAM,EACV,GAAG,CAAC,KAAK,EACT,OAAO,CAAC,SAAS,EACjB,GAAG,CAAC,MAAM,EACV,WAAW,EACX,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAChC,CAAA;IAED,iBAAiB,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;IAEzC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IAC3D,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IAE3D,OAAO;QACH,WAAW;QACX,aAAa,EAAE,kBAAkB,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC;KAC5D,CAAA;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACjC,GAAgB,EAChB,OAAmB,EACnB,WAAwB,EACxB,OAA4B,EAC5B,UAA8B;IAE9B,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAA;IAC9D,MAAM,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAE7C,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACnE,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;IACvE,MAAM,iBAAiB,GAAG,WAAW;SAChC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;SAC3C,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAE9B,MAAM,wBAAwB,CAC1B,GAAG,CAAC,MAAM,EACV,GAAG,CAAC,MAAM,EACV,GAAG,CAAC,MAAM,EACV,GAAG,CAAC,KAAK,EACT,OAAO,CAAC,SAAS,EACjB,OAAO,EACP,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,MAAM,CACT,CAAA;AACL,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { SessionState } from "../state";
|
|
2
|
+
import type { SearchContext, SelectionResolution } from "./types";
|
|
3
|
+
export declare function appendProtectedUserMessages(summary: string, selection: SelectionResolution, searchContext: SearchContext, state: SessionState, enabled: boolean): string;
|
|
4
|
+
export declare function appendProtectedTools(client: any, state: SessionState, allowSubAgents: boolean, summary: string, selection: SelectionResolution, searchContext: SearchContext, protectedTools: string[], protectedFilePatterns?: string[]): Promise<string>;
|
|
5
|
+
//# sourceMappingURL=protected-content.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protected-content.d.ts","sourceRoot":"","sources":["../../../lib/compress/protected-content.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAa5C,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAEjE,wBAAgB,2BAA2B,CACvC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,mBAAmB,EAC9B,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,OAAO,GACjB,MAAM,CAgCR;AAED,wBAAsB,oBAAoB,CACtC,MAAM,EAAE,GAAG,EACX,KAAK,EAAE,YAAY,EACnB,cAAc,EAAE,OAAO,EACvB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,mBAAmB,EAC9B,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,MAAM,EAAE,EACxB,qBAAqB,GAAE,MAAM,EAAO,GACrC,OAAO,CAAC,MAAM,CAAC,CAyFjB"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { isIgnoredUserMessage } from "../messages/utils";
|
|
2
|
+
import { getFilePathsFromParameters, isFilePathProtected, isToolNameProtected, } from "../protected-patterns";
|
|
3
|
+
import { buildSubagentResultText, getSubAgentId, mergeSubagentResult, } from "../subagents/subagent-results";
|
|
4
|
+
import { fetchSessionMessages } from "./search";
|
|
5
|
+
export function appendProtectedUserMessages(summary, selection, searchContext, state, enabled) {
|
|
6
|
+
if (!enabled)
|
|
7
|
+
return summary;
|
|
8
|
+
const userTexts = [];
|
|
9
|
+
for (const messageId of selection.messageIds) {
|
|
10
|
+
const existingCompressionEntry = state.prune.messages.byMessageId.get(messageId);
|
|
11
|
+
if (existingCompressionEntry && existingCompressionEntry.activeBlockIds.length > 0) {
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
const message = searchContext.rawMessagesById.get(messageId);
|
|
15
|
+
if (!message)
|
|
16
|
+
continue;
|
|
17
|
+
if (message.info.role !== "user")
|
|
18
|
+
continue;
|
|
19
|
+
if (isIgnoredUserMessage(message))
|
|
20
|
+
continue;
|
|
21
|
+
const parts = Array.isArray(message.parts) ? message.parts : [];
|
|
22
|
+
for (const part of parts) {
|
|
23
|
+
if (part.type === "text" && typeof part.text === "string" && part.text.trim()) {
|
|
24
|
+
userTexts.push(part.text);
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (userTexts.length === 0) {
|
|
30
|
+
return summary;
|
|
31
|
+
}
|
|
32
|
+
const heading = "\n\nThe following user messages were sent in this conversation verbatim:";
|
|
33
|
+
const body = userTexts.map((text) => `\n${text}`).join("");
|
|
34
|
+
return summary + heading + body;
|
|
35
|
+
}
|
|
36
|
+
export async function appendProtectedTools(client, state, allowSubAgents, summary, selection, searchContext, protectedTools, protectedFilePatterns = []) {
|
|
37
|
+
const protectedOutputs = [];
|
|
38
|
+
for (const messageId of selection.messageIds) {
|
|
39
|
+
const existingCompressionEntry = state.prune.messages.byMessageId.get(messageId);
|
|
40
|
+
if (existingCompressionEntry && existingCompressionEntry.activeBlockIds.length > 0) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const message = searchContext.rawMessagesById.get(messageId);
|
|
44
|
+
if (!message)
|
|
45
|
+
continue;
|
|
46
|
+
const parts = Array.isArray(message.parts) ? message.parts : [];
|
|
47
|
+
for (const part of parts) {
|
|
48
|
+
if (part.type === "tool" && part.callID) {
|
|
49
|
+
let isToolProtected = isToolNameProtected(part.tool, protectedTools);
|
|
50
|
+
if (!isToolProtected && protectedFilePatterns.length > 0) {
|
|
51
|
+
const filePaths = getFilePathsFromParameters(part.tool, part.state?.input);
|
|
52
|
+
if (isFilePathProtected(filePaths, protectedFilePatterns)) {
|
|
53
|
+
isToolProtected = true;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (isToolProtected) {
|
|
57
|
+
const title = `Tool: ${part.tool}`;
|
|
58
|
+
let output = "";
|
|
59
|
+
if (part.state?.status === "completed" && part.state?.output) {
|
|
60
|
+
output =
|
|
61
|
+
typeof part.state.output === "string"
|
|
62
|
+
? part.state.output
|
|
63
|
+
: JSON.stringify(part.state.output);
|
|
64
|
+
}
|
|
65
|
+
if (allowSubAgents &&
|
|
66
|
+
part.tool === "task" &&
|
|
67
|
+
part.state?.status === "completed" &&
|
|
68
|
+
typeof part.state?.output === "string") {
|
|
69
|
+
const cachedSubAgentResult = state.subAgentResultCache.get(part.callID);
|
|
70
|
+
if (cachedSubAgentResult !== undefined) {
|
|
71
|
+
if (cachedSubAgentResult) {
|
|
72
|
+
output = mergeSubagentResult(part.state.output, cachedSubAgentResult);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
const subAgentSessionId = getSubAgentId(part);
|
|
77
|
+
if (subAgentSessionId) {
|
|
78
|
+
let subAgentResultText = "";
|
|
79
|
+
try {
|
|
80
|
+
const subAgentMessages = await fetchSessionMessages(client, subAgentSessionId);
|
|
81
|
+
subAgentResultText = buildSubagentResultText(subAgentMessages);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
subAgentResultText = "";
|
|
85
|
+
}
|
|
86
|
+
if (subAgentResultText) {
|
|
87
|
+
state.subAgentResultCache.set(part.callID, subAgentResultText);
|
|
88
|
+
output = mergeSubagentResult(part.state.output, subAgentResultText);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (output) {
|
|
94
|
+
protectedOutputs.push(`\n### ${title}\n${output}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (protectedOutputs.length === 0) {
|
|
101
|
+
return summary;
|
|
102
|
+
}
|
|
103
|
+
const heading = "\n\nThe following protected tools were used in this conversation as well:";
|
|
104
|
+
return summary + heading + protectedOutputs.join("");
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=protected-content.js.map
|