@tarquinen/opencode-dcp 2.1.6 → 2.2.0-beta0
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 +30 -49
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -29
- package/dist/index.js.map +1 -1
- package/dist/lib/commands/context.d.ts.map +1 -1
- package/dist/lib/commands/context.js +36 -8
- package/dist/lib/commands/context.js.map +1 -1
- package/dist/lib/commands/help.d.ts.map +1 -1
- package/dist/lib/commands/help.js +2 -6
- package/dist/lib/commands/help.js.map +1 -1
- package/dist/lib/commands/manual.d.ts +1 -3
- package/dist/lib/commands/manual.d.ts.map +1 -1
- package/dist/lib/commands/manual.js +4 -43
- package/dist/lib/commands/manual.js.map +1 -1
- package/dist/lib/commands/sweep.js +1 -1
- package/dist/lib/commands/sweep.js.map +1 -1
- package/dist/lib/compress-logger.d.ts +15 -0
- package/dist/lib/compress-logger.d.ts.map +1 -0
- package/dist/lib/compress-logger.js +132 -0
- package/dist/lib/compress-logger.js.map +1 -0
- package/dist/lib/config.d.ts +5 -20
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +172 -346
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/hooks.d.ts +7 -0
- package/dist/lib/hooks.d.ts.map +1 -1
- package/dist/lib/hooks.js +23 -16
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +6 -0
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/messages/index.d.ts +2 -2
- package/dist/lib/messages/index.d.ts.map +1 -1
- package/dist/lib/messages/index.js +2 -2
- package/dist/lib/messages/index.js.map +1 -1
- package/dist/lib/messages/inject/inject.d.ts +6 -0
- package/dist/lib/messages/inject/inject.d.ts.map +1 -0
- package/dist/lib/messages/inject/inject.js +99 -0
- package/dist/lib/messages/inject/inject.js.map +1 -0
- package/dist/lib/messages/inject/utils.d.ts +20 -0
- package/dist/lib/messages/inject/utils.d.ts.map +1 -0
- package/dist/lib/messages/inject/utils.js +137 -0
- package/dist/lib/messages/inject/utils.js.map +1 -0
- package/dist/lib/messages/prune.js +7 -7
- package/dist/lib/messages/prune.js.map +1 -1
- package/dist/lib/messages/utils.d.ts +16 -28
- package/dist/lib/messages/utils.d.ts.map +1 -1
- package/dist/lib/messages/utils.js +40 -133
- package/dist/lib/messages/utils.js.map +1 -1
- package/dist/lib/prompts/_codegen/system.generated.d.ts +1 -1
- package/dist/lib/prompts/_codegen/system.generated.d.ts.map +1 -1
- package/dist/lib/prompts/_codegen/system.generated.js +36 -32
- package/dist/lib/prompts/_codegen/system.generated.js.map +1 -1
- package/dist/lib/prompts/compress.d.ts +2 -0
- package/dist/lib/prompts/compress.d.ts.map +1 -0
- package/dist/lib/prompts/compress.js +122 -0
- package/dist/lib/prompts/compress.js.map +1 -0
- package/dist/lib/prompts/index.d.ts +6 -10
- package/dist/lib/prompts/index.d.ts.map +1 -1
- package/dist/lib/prompts/index.js +17 -40
- package/dist/lib/prompts/index.js.map +1 -1
- package/dist/lib/prompts/iteration-nudge.d.ts +2 -0
- package/dist/lib/prompts/iteration-nudge.d.ts.map +1 -0
- package/dist/lib/prompts/iteration-nudge.js +9 -0
- package/dist/lib/prompts/iteration-nudge.js.map +1 -0
- package/dist/lib/prompts/nudge.d.ts +2 -0
- package/dist/lib/prompts/nudge.d.ts.map +1 -0
- package/dist/lib/prompts/nudge.js +40 -0
- package/dist/lib/prompts/nudge.js.map +1 -0
- package/dist/lib/prompts/turn-nudge.d.ts +2 -0
- package/dist/lib/prompts/turn-nudge.d.ts.map +1 -0
- package/dist/lib/prompts/turn-nudge.js +12 -0
- package/dist/lib/prompts/turn-nudge.js.map +1 -0
- package/dist/lib/state/persistence.d.ts +6 -0
- package/dist/lib/state/persistence.d.ts.map +1 -1
- package/dist/lib/state/persistence.js +58 -38
- package/dist/lib/state/persistence.js.map +1 -1
- package/dist/lib/state/state.d.ts.map +1 -1
- package/dist/lib/state/state.js +20 -5
- package/dist/lib/state/state.js.map +1 -1
- package/dist/lib/state/tool-cache.d.ts.map +1 -1
- package/dist/lib/state/tool-cache.js +3 -17
- package/dist/lib/state/tool-cache.js.map +1 -1
- package/dist/lib/state/types.d.ts +7 -2
- 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 +33 -6
- 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 -0
- package/dist/lib/strategies/utils.d.ts.map +1 -1
- package/dist/lib/strategies/utils.js +15 -0
- package/dist/lib/strategies/utils.js.map +1 -1
- package/dist/lib/tools/compress-utils.d.ts +7 -4
- package/dist/lib/tools/compress-utils.d.ts.map +1 -1
- package/dist/lib/tools/compress-utils.js +34 -25
- package/dist/lib/tools/compress-utils.js.map +1 -1
- package/dist/lib/tools/compress.d.ts +2 -2
- package/dist/lib/tools/compress.d.ts.map +1 -1
- package/dist/lib/tools/compress.js +21 -58
- package/dist/lib/tools/compress.js.map +1 -1
- package/dist/lib/tools/index.d.ts +1 -3
- package/dist/lib/tools/index.d.ts.map +1 -1
- package/dist/lib/tools/index.js +0 -2
- package/dist/lib/tools/index.js.map +1 -1
- package/dist/lib/tools/types.d.ts +1 -1
- package/dist/lib/tools/types.d.ts.map +1 -1
- package/dist/lib/ui/notification.d.ts +2 -2
- package/dist/lib/ui/notification.d.ts.map +1 -1
- package/dist/lib/ui/notification.js +31 -28
- package/dist/lib/ui/notification.js.map +1 -1
- package/dist/lib/ui/utils.d.ts +3 -4
- package/dist/lib/ui/utils.d.ts.map +1 -1
- package/dist/lib/ui/utils.js +165 -24
- package/dist/lib/ui/utils.js.map +1 -1
- package/package.json +2 -1
- package/dist/lib/messages/inject.d.ts +0 -14
- package/dist/lib/messages/inject.d.ts.map +0 -1
- package/dist/lib/messages/inject.js +0 -266
- package/dist/lib/messages/inject.js.map +0 -1
- package/dist/lib/prompts/_codegen/compress-nudge.generated.d.ts +0 -2
- package/dist/lib/prompts/_codegen/compress-nudge.generated.d.ts.map +0 -1
- package/dist/lib/prompts/_codegen/compress-nudge.generated.js +0 -15
- package/dist/lib/prompts/_codegen/compress-nudge.generated.js.map +0 -1
- package/dist/lib/prompts/_codegen/compress.generated.d.ts +0 -2
- package/dist/lib/prompts/_codegen/compress.generated.d.ts.map +0 -1
- package/dist/lib/prompts/_codegen/compress.generated.js +0 -66
- package/dist/lib/prompts/_codegen/compress.generated.js.map +0 -1
- package/dist/lib/prompts/_codegen/distill.generated.d.ts +0 -2
- package/dist/lib/prompts/_codegen/distill.generated.d.ts.map +0 -1
- package/dist/lib/prompts/_codegen/distill.generated.js +0 -33
- package/dist/lib/prompts/_codegen/distill.generated.js.map +0 -1
- package/dist/lib/prompts/_codegen/nudge.generated.d.ts +0 -2
- package/dist/lib/prompts/_codegen/nudge.generated.d.ts.map +0 -1
- package/dist/lib/prompts/_codegen/nudge.generated.js +0 -17
- package/dist/lib/prompts/_codegen/nudge.generated.js.map +0 -1
- package/dist/lib/prompts/_codegen/prune.generated.d.ts +0 -2
- package/dist/lib/prompts/_codegen/prune.generated.d.ts.map +0 -1
- package/dist/lib/prompts/_codegen/prune.generated.js +0 -23
- package/dist/lib/prompts/_codegen/prune.generated.js.map +0 -1
- package/dist/lib/tools/distill.d.ts +0 -4
- package/dist/lib/tools/distill.d.ts.map +0 -1
- package/dist/lib/tools/distill.js +0 -41
- package/dist/lib/tools/distill.js.map +0 -1
- package/dist/lib/tools/prune-shared.d.ts +0 -6
- package/dist/lib/tools/prune-shared.d.ts.map +0 -1
- package/dist/lib/tools/prune-shared.js +0 -113
- package/dist/lib/tools/prune-shared.js.map +0 -1
- package/dist/lib/tools/prune.d.ts +0 -4
- package/dist/lib/tools/prune.d.ts.map +0 -1
- package/dist/lib/tools/prune.js +0 -28
- package/dist/lib/tools/prune.js.map +0 -1
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
import { tool } from "@opencode-ai/plugin";
|
|
2
|
+
import { COMPRESS_TOOL_SPEC } from "../prompts";
|
|
2
3
|
import { ensureSessionInitialized } from "../state";
|
|
4
|
+
import { wrapCompressedSummary, allocateBlockId, applyCompressionState, buildSearchContext, fetchSessionMessages, COMPRESSED_BLOCK_HEADER, injectBlockPlaceholders, parseBlockPlaceholders, resolveAnchorMessageId, resolveBoundaryIds, resolveRange, validateCompressArgs, validateSummaryPlaceholders, } from "./compress-utils";
|
|
5
|
+
import { getCurrentParams, getCurrentTokenUsage, countTokens } from "../strategies/utils";
|
|
3
6
|
import { saveSessionState } from "../state/persistence";
|
|
4
|
-
import { loadPrompt } from "../prompts";
|
|
5
|
-
import { getCurrentParams, getTotalToolTokens } from "../strategies/utils";
|
|
6
7
|
import { sendCompressNotification } from "../ui/notification";
|
|
7
|
-
import { assignMessageRefs } from "../message-ids";
|
|
8
|
-
import { addCompressedBlockHeader, allocateBlockId, buildSearchContext, fetchSessionMessages, injectBlockPlaceholders, parseBlockPlaceholders, resolveAnchorMessageId, resolveBoundaryIds, resolveRange, upsertCompressedSummary, validateCompressArgs, validateSummaryPlaceholders, } from "./compress-utils";
|
|
9
|
-
const COMPRESS_TOOL_DESCRIPTION = loadPrompt("compress-tool-spec");
|
|
10
8
|
export function createCompressTool(ctx) {
|
|
11
9
|
return tool({
|
|
12
|
-
description:
|
|
10
|
+
description: COMPRESS_TOOL_SPEC,
|
|
13
11
|
args: {
|
|
14
12
|
topic: tool.schema
|
|
15
13
|
.string()
|
|
@@ -29,8 +27,6 @@ export function createCompressTool(ctx) {
|
|
|
29
27
|
.describe("Compression details: ID boundaries and replacement summary"),
|
|
30
28
|
},
|
|
31
29
|
async execute(args, toolCtx) {
|
|
32
|
-
const { client, state, logger } = ctx;
|
|
33
|
-
const sessionId = toolCtx.sessionID;
|
|
34
30
|
await toolCtx.ask({
|
|
35
31
|
permission: "compress",
|
|
36
32
|
patterns: ["*"],
|
|
@@ -39,62 +35,29 @@ export function createCompressTool(ctx) {
|
|
|
39
35
|
});
|
|
40
36
|
const compressArgs = args;
|
|
41
37
|
validateCompressArgs(compressArgs);
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const
|
|
46
|
-
|
|
38
|
+
toolCtx.metadata({
|
|
39
|
+
title: `Compress: ${compressArgs.topic}`,
|
|
40
|
+
});
|
|
41
|
+
const rawMessages = await fetchSessionMessages(ctx.client, toolCtx.sessionID);
|
|
42
|
+
await ensureSessionInitialized(ctx.client, ctx.state, toolCtx.sessionID, ctx.logger, rawMessages, ctx.config.manualMode.enabled);
|
|
43
|
+
const searchContext = buildSearchContext(ctx.state, rawMessages);
|
|
44
|
+
const { startReference, endReference } = resolveBoundaryIds(searchContext, ctx.state, compressArgs.content.startId, compressArgs.content.endId);
|
|
47
45
|
const range = resolveRange(searchContext, startReference, endReference);
|
|
48
46
|
const anchorMessageId = resolveAnchorMessageId(range.startReference);
|
|
49
47
|
const parsedPlaceholders = parseBlockPlaceholders(compressArgs.content.summary);
|
|
50
48
|
validateSummaryPlaceholders(parsedPlaceholders, range.requiredBlockIds, range.startReference, range.endReference, searchContext.summaryByBlockId);
|
|
51
49
|
const injected = injectBlockPlaceholders(compressArgs.content.summary, parsedPlaceholders, searchContext.summaryByBlockId, range.startReference, range.endReference);
|
|
52
|
-
const blockId = allocateBlockId(state.compressSummaries);
|
|
53
|
-
const storedSummary =
|
|
54
|
-
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
62
|
-
const compressedToolIds = range.toolIds.filter((id) => !state.prune.tools.has(id));
|
|
63
|
-
const toolTokens = getTotalToolTokens(state, compressedToolIds);
|
|
64
|
-
for (const id of compressedToolIds) {
|
|
65
|
-
const entry = state.toolParameters.get(id);
|
|
66
|
-
state.prune.tools.set(id, entry?.tokenCount ?? 0);
|
|
67
|
-
}
|
|
68
|
-
const estimatedCompressedTokens = textTokens + toolTokens;
|
|
69
|
-
state.stats.pruneTokenCounter += estimatedCompressedTokens;
|
|
70
|
-
const rawStartResult = {
|
|
71
|
-
messageId: getBoundaryMessageId(startReference),
|
|
72
|
-
messageIndex: startReference.rawIndex,
|
|
73
|
-
};
|
|
74
|
-
const rawEndResult = {
|
|
75
|
-
messageId: getBoundaryMessageId(endReference),
|
|
76
|
-
messageIndex: endReference.rawIndex,
|
|
77
|
-
};
|
|
78
|
-
const currentParams = getCurrentParams(state, rawMessages, logger);
|
|
79
|
-
await sendCompressNotification(client, logger, ctx.config, state, sessionId, compressedToolIds, compressedMessageIds, compressArgs.topic, injected.expandedSummary, rawStartResult, rawEndResult, rawMessages.length, currentParams);
|
|
80
|
-
state.stats.totalPruneTokens += state.stats.pruneTokenCounter;
|
|
81
|
-
state.stats.pruneTokenCounter = 0;
|
|
82
|
-
state.nudgeCounter = 0;
|
|
83
|
-
await saveSessionState(state, logger);
|
|
84
|
-
return `Compressed ${compressedMessageIds.length} messages (${compressedToolIds.length} tool calls) into summary. The content will be replaced with your summary.`;
|
|
50
|
+
const blockId = allocateBlockId(ctx.state.compressSummaries);
|
|
51
|
+
const storedSummary = wrapCompressedSummary(blockId, injected.expandedSummary);
|
|
52
|
+
const summaryTokens = countTokens(storedSummary);
|
|
53
|
+
const applied = applyCompressionState(ctx.state, range, anchorMessageId, blockId, storedSummary, injected.consumedBlockIds);
|
|
54
|
+
await saveSessionState(ctx.state, ctx.logger);
|
|
55
|
+
const params = getCurrentParams(ctx.state, rawMessages, ctx.logger);
|
|
56
|
+
const totalSessionTokens = getCurrentTokenUsage(rawMessages);
|
|
57
|
+
const sessionMessageIds = rawMessages.map((msg) => msg.info.id);
|
|
58
|
+
await sendCompressNotification(ctx.client, ctx.logger, ctx.config, ctx.state, toolCtx.sessionID, range.toolIds, applied.messageIds, compressArgs.topic, injected.expandedSummary, summaryTokens, totalSessionTokens, applied.compressedTokens, sessionMessageIds, rawMessages.length, params);
|
|
59
|
+
return `Compressed ${applied.messageIds.length} messages into ${COMPRESSED_BLOCK_HEADER}.`;
|
|
85
60
|
},
|
|
86
61
|
});
|
|
87
62
|
}
|
|
88
|
-
function getBoundaryMessageId(reference) {
|
|
89
|
-
if (reference.kind === "message") {
|
|
90
|
-
if (!reference.messageId) {
|
|
91
|
-
throw new Error("Failed to map boundary matches back to raw messages");
|
|
92
|
-
}
|
|
93
|
-
return reference.messageId;
|
|
94
|
-
}
|
|
95
|
-
if (!reference.anchorMessageId) {
|
|
96
|
-
throw new Error("Failed to map boundary matches back to raw messages");
|
|
97
|
-
}
|
|
98
|
-
return reference.anchorMessageId;
|
|
99
|
-
}
|
|
100
63
|
//# sourceMappingURL=compress.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compress.js","sourceRoot":"","sources":["../../../lib/tools/compress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"compress.js","sourceRoot":"","sources":["../../../lib/tools/compress.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA"}
|
package/dist/lib/tools/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../lib/tools/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAEvC,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../lib/tools/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAEvC,MAAM,WAAW,WAAW;IACxB,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"}
|
|
@@ -4,7 +4,7 @@ import { ToolParameterEntry } from "../state";
|
|
|
4
4
|
import { PluginConfig } from "../config";
|
|
5
5
|
export type PruneReason = "completion" | "noise" | "extraction";
|
|
6
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
|
|
8
|
-
export declare function sendCompressNotification(client: any, logger: Logger, config: PluginConfig, state: SessionState, sessionId: string, toolIds: string[], messageIds: string[], topic: string, summary: 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): Promise<boolean>;
|
|
8
|
+
export declare function sendCompressNotification(client: any, logger: Logger, config: PluginConfig, state: SessionState, sessionId: string, toolIds: string[], messageIds: string[], topic: string, summary: string, summaryTokens: number, totalSessionTokens: number, compressedTokens: number, sessionMessageIds: string[], totalMessages: number, params: any): Promise<boolean>;
|
|
9
9
|
export declare function sendIgnoredMessage(client: any, sessionID: string, text: string, params: any, logger: Logger): Promise<void>;
|
|
10
10
|
//# sourceMappingURL=notification.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification.d.ts","sourceRoot":"","sources":["../../../lib/ui/notification.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"notification.d.ts","sourceRoot":"","sources":["../../../lib/ui/notification.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAO5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAGxC,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,OAAO,GAAG,YAAY,CAAA;AAC/D,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAI3D,CAAA;AAmED,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,GACzB,OAAO,CAAC,OAAO,CAAC,CAiClB;AAED,wBAAsB,wBAAwB,CAC1C,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EAAE,EACjB,UAAU,EAAE,MAAM,EAAE,EACpB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,kBAAkB,EAAE,MAAM,EAC1B,gBAAgB,EAAE,MAAM,EACxB,iBAAiB,EAAE,MAAM,EAAE,EAC3B,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,GAAG,GACZ,OAAO,CAAC,OAAO,CAAC,CAoElB;AAED,wBAAsB,kBAAkB,CACpC,MAAM,EAAE,GAAG,EACX,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAiCf"}
|
|
@@ -1,30 +1,25 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { formatPrunedItemsList, formatSessionMap, formatStatsHeader, formatTokenCount, } from "./utils";
|
|
2
|
+
import { clog, C } from "../compress-logger";
|
|
2
3
|
export const PRUNE_REASON_LABELS = {
|
|
3
4
|
completion: "Task Complete",
|
|
4
5
|
noise: "Noise Removal",
|
|
5
6
|
extraction: "Extraction",
|
|
6
7
|
};
|
|
7
|
-
function buildMinimalMessage(state, reason
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
let message = formatStatsHeader(state.stats.totalPruneTokens, state.stats.pruneTokenCounter) +
|
|
12
|
-
reasonSuffix +
|
|
13
|
-
extractedSuffix;
|
|
14
|
-
return message + formatExtracted(showDistillation ? distillation : undefined);
|
|
8
|
+
function buildMinimalMessage(state, reason) {
|
|
9
|
+
const reasonSuffix = reason ? ` — ${PRUNE_REASON_LABELS[reason]}` : "";
|
|
10
|
+
return (formatStatsHeader(state.stats.totalPruneTokens, state.stats.pruneTokenCounter) +
|
|
11
|
+
reasonSuffix);
|
|
15
12
|
}
|
|
16
|
-
function buildDetailedMessage(state, reason, pruneToolIds, toolMetadata, workingDirectory
|
|
13
|
+
function buildDetailedMessage(state, reason, pruneToolIds, toolMetadata, workingDirectory) {
|
|
17
14
|
let message = formatStatsHeader(state.stats.totalPruneTokens, state.stats.pruneTokenCounter);
|
|
18
15
|
if (pruneToolIds.length > 0) {
|
|
19
16
|
const pruneTokenCounterStr = `~${formatTokenCount(state.stats.pruneTokenCounter)}`;
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
const reasonLabel = reason && extractedTokens === 0 ? ` — ${PRUNE_REASON_LABELS[reason]}` : "";
|
|
23
|
-
message += `\n\n▣ Pruning (${pruneTokenCounterStr}${extractedSuffix})${reasonLabel}`;
|
|
17
|
+
const reasonLabel = reason ? ` — ${PRUNE_REASON_LABELS[reason]}` : "";
|
|
18
|
+
message += `\n\n▣ Pruning (${pruneTokenCounterStr})${reasonLabel}`;
|
|
24
19
|
const itemLines = formatPrunedItemsList(pruneToolIds, toolMetadata, workingDirectory);
|
|
25
20
|
message += "\n" + itemLines.join("\n");
|
|
26
21
|
}
|
|
27
|
-
return
|
|
22
|
+
return message.trim();
|
|
28
23
|
}
|
|
29
24
|
const TOAST_BODY_MAX_LINES = 12;
|
|
30
25
|
const TOAST_SUMMARY_MAX_CHARS = 600;
|
|
@@ -55,7 +50,7 @@ function truncateExtractedSection(message, maxChars = TOAST_SUMMARY_MAX_CHARS) {
|
|
|
55
50
|
}
|
|
56
51
|
return message.slice(0, index) + truncateToastSummary(extracted, maxChars);
|
|
57
52
|
}
|
|
58
|
-
export async function sendUnifiedNotification(client, logger, config, state, sessionId, pruneToolIds, toolMetadata, reason, params, workingDirectory
|
|
53
|
+
export async function sendUnifiedNotification(client, logger, config, state, sessionId, pruneToolIds, toolMetadata, reason, params, workingDirectory) {
|
|
59
54
|
const hasPruned = pruneToolIds.length > 0;
|
|
60
55
|
if (!hasPruned) {
|
|
61
56
|
return false;
|
|
@@ -63,17 +58,16 @@ export async function sendUnifiedNotification(client, logger, config, state, ses
|
|
|
63
58
|
if (config.pruneNotification === "off") {
|
|
64
59
|
return false;
|
|
65
60
|
}
|
|
66
|
-
const showDistillation = config.tools.distill.showDistillation;
|
|
67
61
|
const message = config.pruneNotification === "minimal"
|
|
68
|
-
? buildMinimalMessage(state, reason
|
|
69
|
-
: buildDetailedMessage(state, reason, pruneToolIds, toolMetadata, workingDirectory
|
|
62
|
+
? buildMinimalMessage(state, reason)
|
|
63
|
+
: buildDetailedMessage(state, reason, pruneToolIds, toolMetadata, workingDirectory);
|
|
70
64
|
if (config.pruneNotificationType === "toast") {
|
|
71
65
|
let toastMessage = truncateExtractedSection(message);
|
|
72
66
|
toastMessage =
|
|
73
67
|
config.pruneNotification === "minimal" ? toastMessage : truncateToastBody(toastMessage);
|
|
74
68
|
await client.tui.showToast({
|
|
75
69
|
body: {
|
|
76
|
-
title: "DCP:
|
|
70
|
+
title: "DCP: Compress Notification",
|
|
77
71
|
message: toastMessage,
|
|
78
72
|
variant: "info",
|
|
79
73
|
duration: 5000,
|
|
@@ -84,19 +78,28 @@ export async function sendUnifiedNotification(client, logger, config, state, ses
|
|
|
84
78
|
await sendIgnoredMessage(client, sessionId, message, params, logger);
|
|
85
79
|
return true;
|
|
86
80
|
}
|
|
87
|
-
export async function sendCompressNotification(client, logger, config, state, sessionId, toolIds, messageIds, topic, summary,
|
|
81
|
+
export async function sendCompressNotification(client, logger, config, state, sessionId, toolIds, messageIds, topic, summary, summaryTokens, totalSessionTokens, compressedTokens, sessionMessageIds, totalMessages, params) {
|
|
88
82
|
if (config.pruneNotification === "off") {
|
|
89
83
|
return false;
|
|
90
84
|
}
|
|
91
85
|
let message;
|
|
86
|
+
const summaryTokensStr = formatTokenCount(summaryTokens);
|
|
92
87
|
if (config.pruneNotification === "minimal") {
|
|
93
88
|
message = formatStatsHeader(state.stats.totalPruneTokens, state.stats.pruneTokenCounter);
|
|
94
89
|
}
|
|
95
90
|
else {
|
|
96
91
|
message = formatStatsHeader(state.stats.totalPruneTokens, state.stats.pruneTokenCounter);
|
|
97
|
-
const pruneTokenCounterStr = `~${formatTokenCount(
|
|
98
|
-
|
|
99
|
-
|
|
92
|
+
const pruneTokenCounterStr = `~${formatTokenCount(compressedTokens)}`;
|
|
93
|
+
clog.info(C.COMPRESS, `sendCompressNotification inputs`, {
|
|
94
|
+
summaryTokens,
|
|
95
|
+
totalSessionTokens,
|
|
96
|
+
compressedTokens,
|
|
97
|
+
ratio: totalSessionTokens > 0 ? (compressedTokens / totalSessionTokens).toFixed(4) : "N/A",
|
|
98
|
+
});
|
|
99
|
+
const progressBar = formatSessionMap(sessionMessageIds, state.prune.messages, 50);
|
|
100
|
+
const reduction = totalSessionTokens > 0 ? Math.round((compressedTokens / totalSessionTokens) * 100) : 0;
|
|
101
|
+
message += `\n\n${progressBar}`;
|
|
102
|
+
message += `\n▣ Compressing (${pruneTokenCounterStr} removed, ${reduction}% reduction)`;
|
|
100
103
|
message += `\n→ Topic: ${topic}`;
|
|
101
104
|
message += `\n→ Items: ${messageIds.length} messages`;
|
|
102
105
|
if (toolIds.length > 0) {
|
|
@@ -105,16 +108,16 @@ export async function sendCompressNotification(client, logger, config, state, se
|
|
|
105
108
|
else {
|
|
106
109
|
message += ` condensed`;
|
|
107
110
|
}
|
|
108
|
-
if (config.
|
|
109
|
-
message += `\n→ Compression: ${summary}`;
|
|
111
|
+
if (config.compress.showCompression) {
|
|
112
|
+
message += `\n→ Compression (~${summaryTokensStr}): ${summary}`;
|
|
110
113
|
}
|
|
111
114
|
}
|
|
112
115
|
if (config.pruneNotificationType === "toast") {
|
|
113
116
|
let toastMessage = message;
|
|
114
|
-
if (config.
|
|
117
|
+
if (config.compress.showCompression) {
|
|
115
118
|
const truncatedSummary = truncateToastSummary(summary);
|
|
116
119
|
if (truncatedSummary !== summary) {
|
|
117
|
-
toastMessage = toastMessage.replace(`\n→ Compression: ${summary}`, `\n→ Compression: ${truncatedSummary}`);
|
|
120
|
+
toastMessage = toastMessage.replace(`\n→ Compression (~${summaryTokensStr}): ${summary}`, `\n→ Compression (~${summaryTokensStr}): ${truncatedSummary}`);
|
|
118
121
|
}
|
|
119
122
|
}
|
|
120
123
|
toastMessage =
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification.js","sourceRoot":"","sources":["../../../lib/ui/notification.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,
|
|
1
|
+
{"version":3,"file":"notification.js","sourceRoot":"","sources":["../../../lib/ui/notification.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/ui/utils.d.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { ToolParameterEntry } from "../state";
|
|
2
|
-
export declare function countDistillationTokens(distillation?: string[]): number;
|
|
3
|
-
export declare function formatExtracted(distillation?: string[]): string;
|
|
1
|
+
import { SessionState, ToolParameterEntry, WithParts } from "../state";
|
|
4
2
|
export declare function formatStatsHeader(totalTokensSaved: number, pruneTokenCounter: number): string;
|
|
5
3
|
export declare function formatTokenCount(tokens: number): string;
|
|
6
4
|
export declare function truncate(str: string, maxLen?: number): string;
|
|
7
|
-
export declare function
|
|
5
|
+
export declare function formatSessionMap(messageIds: string[], prunedMessages: Map<string, number>, width?: number): string;
|
|
6
|
+
export declare function cacheSystemPromptTokens(state: SessionState, messages: WithParts[]): void;
|
|
8
7
|
export declare function shortenPath(input: string, workingDirectory?: string): string;
|
|
9
8
|
export declare function formatPrunedItemsList(pruneToolIds: string[], toolMetadata: Map<string, ToolParameterEntry>, workingDirectory?: string): string[];
|
|
10
9
|
export declare function formatPruningResultForTool(prunedIds: string[], toolMetadata: Map<string, ToolParameterEntry>, workingDirectory?: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../lib/ui/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../lib/ui/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AA2ItE,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,gBAAgB,CAC5B,UAAU,EAAE,MAAM,EAAE,EACpB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,KAAK,GAAE,MAAW,GACnB,MAAM,CAiBR;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,CAoCxF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAU5E;AAeD,wBAAgB,qBAAqB,CACjC,YAAY,EAAE,MAAM,EAAE,EACtB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAC7C,gBAAgB,CAAC,EAAE,MAAM,GAC1B,MAAM,EAAE,CA0BV;AAED,wBAAgB,0BAA0B,CACtC,SAAS,EAAE,MAAM,EAAE,EACnB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAC7C,gBAAgB,CAAC,EAAE,MAAM,GAC1B,MAAM,CAWR"}
|
package/dist/lib/ui/utils.js
CHANGED
|
@@ -1,19 +1,126 @@
|
|
|
1
|
-
import { extractParameterKey } from "../messages/utils";
|
|
2
1
|
import { countTokens } from "../strategies/utils";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
return countTokens(distillation.join("\n"));
|
|
7
|
-
}
|
|
8
|
-
export function formatExtracted(distillation) {
|
|
9
|
-
if (!distillation || distillation.length === 0) {
|
|
2
|
+
import { isIgnoredUserMessage } from "../messages/utils";
|
|
3
|
+
function extractParameterKey(tool, parameters) {
|
|
4
|
+
if (!parameters)
|
|
10
5
|
return "";
|
|
6
|
+
if (tool === "read" && parameters.filePath) {
|
|
7
|
+
const offset = parameters.offset;
|
|
8
|
+
const limit = parameters.limit;
|
|
9
|
+
if (offset !== undefined && limit !== undefined) {
|
|
10
|
+
return `${parameters.filePath} (lines ${offset}-${offset + limit})`;
|
|
11
|
+
}
|
|
12
|
+
if (offset !== undefined) {
|
|
13
|
+
return `${parameters.filePath} (lines ${offset}+)`;
|
|
14
|
+
}
|
|
15
|
+
if (limit !== undefined) {
|
|
16
|
+
return `${parameters.filePath} (lines 0-${limit})`;
|
|
17
|
+
}
|
|
18
|
+
return parameters.filePath;
|
|
19
|
+
}
|
|
20
|
+
if ((tool === "write" || tool === "edit" || tool === "multiedit") && parameters.filePath) {
|
|
21
|
+
return parameters.filePath;
|
|
22
|
+
}
|
|
23
|
+
if (tool === "apply_patch" && typeof parameters.patchText === "string") {
|
|
24
|
+
const pathRegex = /\*\*\* (?:Add|Delete|Update) File: ([^\n\r]+)/g;
|
|
25
|
+
const paths = [];
|
|
26
|
+
let match;
|
|
27
|
+
while ((match = pathRegex.exec(parameters.patchText)) !== null) {
|
|
28
|
+
paths.push(match[1].trim());
|
|
29
|
+
}
|
|
30
|
+
if (paths.length > 0) {
|
|
31
|
+
const uniquePaths = [...new Set(paths)];
|
|
32
|
+
const count = uniquePaths.length;
|
|
33
|
+
const plural = count > 1 ? "s" : "";
|
|
34
|
+
if (count === 1)
|
|
35
|
+
return uniquePaths[0];
|
|
36
|
+
if (count === 2)
|
|
37
|
+
return uniquePaths.join(", ");
|
|
38
|
+
return `${count} file${plural}: ${uniquePaths[0]}, ${uniquePaths[1]}...`;
|
|
39
|
+
}
|
|
40
|
+
return "patch";
|
|
41
|
+
}
|
|
42
|
+
if (tool === "list") {
|
|
43
|
+
return parameters.path || "(current directory)";
|
|
44
|
+
}
|
|
45
|
+
if (tool === "glob") {
|
|
46
|
+
if (parameters.pattern) {
|
|
47
|
+
const pathInfo = parameters.path ? ` in ${parameters.path}` : "";
|
|
48
|
+
return `"${parameters.pattern}"${pathInfo}`;
|
|
49
|
+
}
|
|
50
|
+
return "(unknown pattern)";
|
|
51
|
+
}
|
|
52
|
+
if (tool === "grep") {
|
|
53
|
+
if (parameters.pattern) {
|
|
54
|
+
const pathInfo = parameters.path ? ` in ${parameters.path}` : "";
|
|
55
|
+
return `"${parameters.pattern}"${pathInfo}`;
|
|
56
|
+
}
|
|
57
|
+
return "(unknown pattern)";
|
|
58
|
+
}
|
|
59
|
+
if (tool === "bash") {
|
|
60
|
+
if (parameters.description)
|
|
61
|
+
return parameters.description;
|
|
62
|
+
if (parameters.command) {
|
|
63
|
+
return parameters.command.length > 50
|
|
64
|
+
? parameters.command.substring(0, 50) + "..."
|
|
65
|
+
: parameters.command;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (tool === "webfetch" && parameters.url) {
|
|
69
|
+
return parameters.url;
|
|
70
|
+
}
|
|
71
|
+
if (tool === "websearch" && parameters.query) {
|
|
72
|
+
return `"${parameters.query}"`;
|
|
73
|
+
}
|
|
74
|
+
if (tool === "codesearch" && parameters.query) {
|
|
75
|
+
return `"${parameters.query}"`;
|
|
76
|
+
}
|
|
77
|
+
if (tool === "todowrite") {
|
|
78
|
+
return `${parameters.todos?.length || 0} todos`;
|
|
11
79
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
result += `\n───\n${finding}`;
|
|
80
|
+
if (tool === "todoread") {
|
|
81
|
+
return "read todo list";
|
|
15
82
|
}
|
|
16
|
-
|
|
83
|
+
if (tool === "task" && parameters.description) {
|
|
84
|
+
return parameters.description;
|
|
85
|
+
}
|
|
86
|
+
if (tool === "skill" && parameters.name) {
|
|
87
|
+
return parameters.name;
|
|
88
|
+
}
|
|
89
|
+
if (tool === "lsp") {
|
|
90
|
+
const op = parameters.operation || "lsp";
|
|
91
|
+
const path = parameters.filePath || "";
|
|
92
|
+
const line = parameters.line;
|
|
93
|
+
const char = parameters.character;
|
|
94
|
+
if (path && line !== undefined && char !== undefined) {
|
|
95
|
+
return `${op} ${path}:${line}:${char}`;
|
|
96
|
+
}
|
|
97
|
+
if (path) {
|
|
98
|
+
return `${op} ${path}`;
|
|
99
|
+
}
|
|
100
|
+
return op;
|
|
101
|
+
}
|
|
102
|
+
if (tool === "question") {
|
|
103
|
+
const questions = parameters.questions;
|
|
104
|
+
if (Array.isArray(questions) && questions.length > 0) {
|
|
105
|
+
const headers = questions
|
|
106
|
+
.map((q) => q.header || "")
|
|
107
|
+
.filter(Boolean)
|
|
108
|
+
.slice(0, 3);
|
|
109
|
+
const count = questions.length;
|
|
110
|
+
const plural = count > 1 ? "s" : "";
|
|
111
|
+
if (headers.length > 0) {
|
|
112
|
+
const suffix = count > 3 ? ` (+${count - 3} more)` : "";
|
|
113
|
+
return `${count} question${plural}: ${headers.join(", ")}${suffix}`;
|
|
114
|
+
}
|
|
115
|
+
return `${count} question${plural}`;
|
|
116
|
+
}
|
|
117
|
+
return "question";
|
|
118
|
+
}
|
|
119
|
+
const paramStr = JSON.stringify(parameters);
|
|
120
|
+
if (paramStr === "{}" || paramStr === "[]" || paramStr === "null") {
|
|
121
|
+
return "";
|
|
122
|
+
}
|
|
123
|
+
return paramStr.substring(0, 50);
|
|
17
124
|
}
|
|
18
125
|
export function formatStatsHeader(totalTokensSaved, pruneTokenCounter) {
|
|
19
126
|
const totalTokensSavedStr = `~${formatTokenCount(totalTokensSaved + pruneTokenCounter)}`;
|
|
@@ -30,21 +137,55 @@ export function truncate(str, maxLen = 60) {
|
|
|
30
137
|
return str;
|
|
31
138
|
return str.slice(0, maxLen - 3) + "...";
|
|
32
139
|
}
|
|
33
|
-
export function
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
let
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
140
|
+
export function formatSessionMap(messageIds, prunedMessages, width = 50) {
|
|
141
|
+
const total = messageIds.length;
|
|
142
|
+
if (total === 0)
|
|
143
|
+
return `│${"░".repeat(width)}│`;
|
|
144
|
+
const bar = new Array(width).fill("█");
|
|
145
|
+
for (let m = 0; m < total; m++) {
|
|
146
|
+
if (prunedMessages.has(messageIds[m])) {
|
|
147
|
+
const start = Math.floor((m / total) * width);
|
|
148
|
+
const end = Math.floor(((m + 1) / total) * width);
|
|
149
|
+
for (let i = start; i < end; i++) {
|
|
150
|
+
bar[i] = "░";
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return `│${bar.join("")}│`;
|
|
155
|
+
}
|
|
156
|
+
export function cacheSystemPromptTokens(state, messages) {
|
|
157
|
+
let firstInputTokens = 0;
|
|
158
|
+
for (const msg of messages) {
|
|
159
|
+
if (msg.info.role !== "assistant") {
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
const info = msg.info;
|
|
163
|
+
const input = info?.tokens?.input || 0;
|
|
164
|
+
const cacheRead = info?.tokens?.cache?.read || 0;
|
|
165
|
+
if (input > 0 || cacheRead > 0) {
|
|
166
|
+
firstInputTokens = input + cacheRead;
|
|
167
|
+
break;
|
|
42
168
|
}
|
|
43
|
-
|
|
44
|
-
|
|
169
|
+
}
|
|
170
|
+
if (firstInputTokens <= 0) {
|
|
171
|
+
state.systemPromptTokens = undefined;
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
let firstUserText = "";
|
|
175
|
+
for (const msg of messages) {
|
|
176
|
+
if (msg.info.role !== "user" || isIgnoredUserMessage(msg)) {
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
const parts = Array.isArray(msg.parts) ? msg.parts : [];
|
|
180
|
+
for (const part of parts) {
|
|
181
|
+
if (part.type === "text" && !part.ignored) {
|
|
182
|
+
firstUserText += part.text;
|
|
183
|
+
}
|
|
45
184
|
}
|
|
185
|
+
break;
|
|
46
186
|
}
|
|
47
|
-
|
|
187
|
+
const estimatedSystemTokens = Math.max(0, firstInputTokens - countTokens(firstUserText));
|
|
188
|
+
state.systemPromptTokens = estimatedSystemTokens > 0 ? estimatedSystemTokens : undefined;
|
|
48
189
|
}
|
|
49
190
|
export function shortenPath(input, workingDirectory) {
|
|
50
191
|
const inPathMatch = input.match(/^(.+) in (.+)$/);
|