@p4r4d0xb0x/opencode-dcp 3.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +619 -0
- package/README.md +229 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +88 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/auth.d.ts +4 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +32 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/commands/context.d.ts +52 -0
- package/dist/lib/commands/context.d.ts.map +1 -0
- package/dist/lib/commands/context.js +241 -0
- package/dist/lib/commands/context.js.map +1 -0
- package/dist/lib/commands/decompress.d.ts +12 -0
- package/dist/lib/commands/decompress.d.ts.map +1 -0
- package/dist/lib/commands/decompress.js +159 -0
- package/dist/lib/commands/decompress.js.map +1 -0
- package/dist/lib/commands/help.d.ts +17 -0
- package/dist/lib/commands/help.d.ts.map +1 -0
- package/dist/lib/commands/help.js +52 -0
- package/dist/lib/commands/help.js.map +1 -0
- package/dist/lib/commands/manual.d.ts +22 -0
- package/dist/lib/commands/manual.d.ts.map +1 -0
- package/dist/lib/commands/manual.js +48 -0
- package/dist/lib/commands/manual.js.map +1 -0
- package/dist/lib/commands/recompress.d.ts +12 -0
- package/dist/lib/commands/recompress.d.ts.map +1 -0
- package/dist/lib/commands/recompress.js +137 -0
- package/dist/lib/commands/recompress.js.map +1 -0
- package/dist/lib/commands/stats.d.ts +15 -0
- package/dist/lib/commands/stats.d.ts.map +1 -0
- package/dist/lib/commands/stats.js +62 -0
- package/dist/lib/commands/stats.js.map +1 -0
- package/dist/lib/commands/sweep.d.ts +23 -0
- package/dist/lib/commands/sweep.d.ts.map +1 -0
- package/dist/lib/commands/sweep.js +194 -0
- package/dist/lib/commands/sweep.js.map +1 -0
- package/dist/lib/config.d.ts +72 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +766 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/hooks.d.ts +33 -0
- package/dist/lib/hooks.d.ts.map +1 -0
- package/dist/lib/hooks.js +195 -0
- package/dist/lib/hooks.js.map +1 -0
- package/dist/lib/host-permissions.d.ts +11 -0
- package/dist/lib/host-permissions.d.ts.map +1 -0
- package/dist/lib/host-permissions.js +58 -0
- package/dist/lib/host-permissions.js.map +1 -0
- package/dist/lib/logger.d.ts +31 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +204 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/message-ids.d.ts +19 -0
- package/dist/lib/message-ids.d.ts.map +1 -0
- package/dist/lib/message-ids.js +112 -0
- package/dist/lib/message-ids.js.map +1 -0
- package/dist/lib/messages/index.d.ts +7 -0
- package/dist/lib/messages/index.d.ts.map +1 -0
- package/dist/lib/messages/index.js +7 -0
- package/dist/lib/messages/index.js.map +1 -0
- package/dist/lib/messages/inject/inject.d.ts +7 -0
- package/dist/lib/messages/inject/inject.d.ts.map +1 -0
- package/dist/lib/messages/inject/inject.js +131 -0
- package/dist/lib/messages/inject/inject.js.map +1 -0
- package/dist/lib/messages/inject/subagent-results.d.ts +4 -0
- package/dist/lib/messages/inject/subagent-results.d.ts.map +1 -0
- package/dist/lib/messages/inject/subagent-results.js +58 -0
- package/dist/lib/messages/inject/subagent-results.js.map +1 -0
- package/dist/lib/messages/inject/utils.d.ts +25 -0
- package/dist/lib/messages/inject/utils.d.ts.map +1 -0
- package/dist/lib/messages/inject/utils.js +198 -0
- package/dist/lib/messages/inject/utils.js.map +1 -0
- package/dist/lib/messages/prune.d.ts +5 -0
- package/dist/lib/messages/prune.d.ts.map +1 -0
- package/dist/lib/messages/prune.js +177 -0
- package/dist/lib/messages/prune.js.map +1 -0
- package/dist/lib/messages/reasoning-strip.d.ts +8 -0
- package/dist/lib/messages/reasoning-strip.d.ts.map +1 -0
- package/dist/lib/messages/reasoning-strip.js +33 -0
- package/dist/lib/messages/reasoning-strip.js.map +1 -0
- package/dist/lib/messages/sync.d.ts +4 -0
- package/dist/lib/messages/sync.d.ts.map +1 -0
- package/dist/lib/messages/sync.js +93 -0
- package/dist/lib/messages/sync.js.map +1 -0
- package/dist/lib/messages/utils.d.ts +21 -0
- package/dist/lib/messages/utils.d.ts.map +1 -0
- package/dist/lib/messages/utils.js +118 -0
- package/dist/lib/messages/utils.js.map +1 -0
- 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 +85 -0
- package/dist/lib/prompts/compress.js.map +1 -0
- package/dist/lib/prompts/context-limit-nudge.d.ts +2 -0
- package/dist/lib/prompts/context-limit-nudge.d.ts.map +1 -0
- package/dist/lib/prompts/context-limit-nudge.js +25 -0
- package/dist/lib/prompts/context-limit-nudge.js.map +1 -0
- package/dist/lib/prompts/index.d.ts +3 -0
- package/dist/lib/prompts/index.d.ts.map +1 -0
- package/dist/lib/prompts/index.js +19 -0
- package/dist/lib/prompts/index.js.map +1 -0
- package/dist/lib/prompts/internal-overlays.d.ts +5 -0
- package/dist/lib/prompts/internal-overlays.d.ts.map +1 -0
- package/dist/lib/prompts/internal-overlays.js +43 -0
- package/dist/lib/prompts/internal-overlays.js.map +1 -0
- 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/store.d.ts +24 -0
- package/dist/lib/prompts/store.d.ts.map +1 -0
- package/dist/lib/prompts/store.js +346 -0
- package/dist/lib/prompts/store.js.map +1 -0
- package/dist/lib/prompts/system.d.ts +2 -0
- package/dist/lib/prompts/system.d.ts.map +1 -0
- package/dist/lib/prompts/system.js +30 -0
- package/dist/lib/prompts/system.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/protected-patterns.d.ts +5 -0
- package/dist/lib/protected-patterns.d.ts.map +1 -0
- package/dist/lib/protected-patterns.js +107 -0
- package/dist/lib/protected-patterns.js.map +1 -0
- package/dist/lib/shared-utils.d.ts +8 -0
- package/dist/lib/shared-utils.d.ts.map +1 -0
- package/dist/lib/shared-utils.js +30 -0
- package/dist/lib/shared-utils.js.map +1 -0
- package/dist/lib/state/index.d.ts +4 -0
- package/dist/lib/state/index.d.ts.map +1 -0
- package/dist/lib/state/index.js +4 -0
- package/dist/lib/state/index.js.map +1 -0
- package/dist/lib/state/persistence.d.ts +41 -0
- package/dist/lib/state/persistence.d.ts.map +1 -0
- package/dist/lib/state/persistence.js +174 -0
- package/dist/lib/state/persistence.js.map +1 -0
- package/dist/lib/state/state.d.ts +7 -0
- package/dist/lib/state/state.d.ts.map +1 -0
- package/dist/lib/state/state.js +134 -0
- package/dist/lib/state/state.js.map +1 -0
- package/dist/lib/state/tool-cache.d.ts +13 -0
- package/dist/lib/state/tool-cache.d.ts.map +1 -0
- package/dist/lib/state/tool-cache.js +69 -0
- package/dist/lib/state/tool-cache.js.map +1 -0
- package/dist/lib/state/types.d.ts +90 -0
- package/dist/lib/state/types.d.ts.map +1 -0
- package/dist/lib/state/types.js +2 -0
- package/dist/lib/state/types.js.map +1 -0
- package/dist/lib/state/utils.d.ts +18 -0
- package/dist/lib/state/utils.d.ts.map +1 -0
- package/dist/lib/state/utils.js +196 -0
- package/dist/lib/state/utils.js.map +1 -0
- package/dist/lib/strategies/deduplication.d.ts +10 -0
- package/dist/lib/strategies/deduplication.d.ts.map +1 -0
- package/dist/lib/strategies/deduplication.js +100 -0
- package/dist/lib/strategies/deduplication.js.map +1 -0
- package/dist/lib/strategies/index.d.ts +4 -0
- package/dist/lib/strategies/index.d.ts.map +1 -0
- package/dist/lib/strategies/index.js +4 -0
- package/dist/lib/strategies/index.js.map +1 -0
- package/dist/lib/strategies/purge-errors.d.ts +13 -0
- package/dist/lib/strategies/purge-errors.d.ts.map +1 -0
- package/dist/lib/strategies/purge-errors.js +62 -0
- package/dist/lib/strategies/purge-errors.js.map +1 -0
- package/dist/lib/strategies/supersede-writes.d.ts +13 -0
- package/dist/lib/strategies/supersede-writes.d.ts.map +1 -0
- package/dist/lib/strategies/supersede-writes.js +94 -0
- package/dist/lib/strategies/supersede-writes.js.map +1 -0
- package/dist/lib/strategies/utils.d.ts +21 -0
- package/dist/lib/strategies/utils.d.ts.map +1 -0
- package/dist/lib/strategies/utils.js +128 -0
- package/dist/lib/strategies/utils.js.map +1 -0
- package/dist/lib/subagents/subagent-results.d.ts +5 -0
- package/dist/lib/subagents/subagent-results.d.ts.map +1 -0
- package/dist/lib/subagents/subagent-results.js +52 -0
- package/dist/lib/subagents/subagent-results.js.map +1 -0
- package/dist/lib/tools/compress.d.ts +4 -0
- package/dist/lib/tools/compress.d.ts.map +1 -0
- package/dist/lib/tools/compress.js +110 -0
- package/dist/lib/tools/compress.js.map +1 -0
- package/dist/lib/tools/index.d.ts +3 -0
- package/dist/lib/tools/index.d.ts.map +1 -0
- package/dist/lib/tools/index.js +2 -0
- package/dist/lib/tools/index.js.map +1 -0
- package/dist/lib/tools/types.d.ts +13 -0
- package/dist/lib/tools/types.d.ts.map +1 -0
- package/dist/lib/tools/types.js +2 -0
- package/dist/lib/tools/types.js.map +1 -0
- package/dist/lib/tools/utils.d.ts +80 -0
- package/dist/lib/tools/utils.d.ts.map +1 -0
- package/dist/lib/tools/utils.js +675 -0
- package/dist/lib/tools/utils.js.map +1 -0
- package/dist/lib/ui/notification.d.ts +10 -0
- package/dist/lib/ui/notification.d.ts.map +1 -0
- package/dist/lib/ui/notification.js +182 -0
- package/dist/lib/ui/notification.js.map +1 -0
- package/dist/lib/ui/utils.d.ts +10 -0
- package/dist/lib/ui/utils.d.ts.map +1 -0
- package/dist/lib/ui/utils.js +255 -0
- package/dist/lib/ui/utils.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { SessionState, WithParts } from "./state";
|
|
2
|
+
export declare const MESSAGE_REF_MAX_INDEX = 9999;
|
|
3
|
+
export type ParsedBoundaryId = {
|
|
4
|
+
kind: "message";
|
|
5
|
+
ref: string;
|
|
6
|
+
index: number;
|
|
7
|
+
} | {
|
|
8
|
+
kind: "compressed-block";
|
|
9
|
+
ref: string;
|
|
10
|
+
blockId: number;
|
|
11
|
+
};
|
|
12
|
+
export declare function formatMessageRef(index: number): string;
|
|
13
|
+
export declare function formatBlockRef(blockId: number): string;
|
|
14
|
+
export declare function parseMessageRef(ref: string): number | null;
|
|
15
|
+
export declare function parseBlockRef(ref: string): number | null;
|
|
16
|
+
export declare function parseBoundaryId(id: string): ParsedBoundaryId | null;
|
|
17
|
+
export declare function formatMessageIdTag(ref: string): string;
|
|
18
|
+
export declare function assignMessageRefs(state: SessionState, messages: WithParts[]): number;
|
|
19
|
+
//# sourceMappingURL=message-ids.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-ids.d.ts","sourceRoot":"","sources":["../../lib/message-ids.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAStD,eAAO,MAAM,qBAAqB,OAAO,CAAA;AAEzC,MAAM,MAAM,gBAAgB,GACtB;IACI,IAAI,EAAE,SAAS,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;CAChB,GACD;IACI,IAAI,EAAE,kBAAkB,CAAA;IACxB,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;CAClB,CAAA;AAEP,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWtD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAc1D;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQxD;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAqBnE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,CAkCpF"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { isIgnoredUserMessage } from "./messages/utils";
|
|
2
|
+
const MESSAGE_REF_REGEX = /^m(\d{4})$/;
|
|
3
|
+
const BLOCK_REF_REGEX = /^b([1-9]\d*)$/;
|
|
4
|
+
const MESSAGE_ID_TAG_NAME = "dcp-message-id";
|
|
5
|
+
const MESSAGE_REF_WIDTH = 4;
|
|
6
|
+
const MESSAGE_REF_MIN_INDEX = 1;
|
|
7
|
+
export const MESSAGE_REF_MAX_INDEX = 9999;
|
|
8
|
+
export function formatMessageRef(index) {
|
|
9
|
+
if (!Number.isInteger(index) ||
|
|
10
|
+
index < MESSAGE_REF_MIN_INDEX ||
|
|
11
|
+
index > MESSAGE_REF_MAX_INDEX) {
|
|
12
|
+
throw new Error(`Message ID index out of bounds: ${index}. Supported range is 0-${MESSAGE_REF_MAX_INDEX}.`);
|
|
13
|
+
}
|
|
14
|
+
return `m${index.toString().padStart(MESSAGE_REF_WIDTH, "0")}`;
|
|
15
|
+
}
|
|
16
|
+
export function formatBlockRef(blockId) {
|
|
17
|
+
if (!Number.isInteger(blockId) || blockId < 1) {
|
|
18
|
+
throw new Error(`Invalid block ID: ${blockId}`);
|
|
19
|
+
}
|
|
20
|
+
return `b${blockId}`;
|
|
21
|
+
}
|
|
22
|
+
export function parseMessageRef(ref) {
|
|
23
|
+
const normalized = ref.trim().toLowerCase();
|
|
24
|
+
const match = normalized.match(MESSAGE_REF_REGEX);
|
|
25
|
+
if (!match) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
const index = Number.parseInt(match[1], 10);
|
|
29
|
+
if (!Number.isInteger(index)) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
if (index < MESSAGE_REF_MIN_INDEX || index > MESSAGE_REF_MAX_INDEX) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
return index;
|
|
36
|
+
}
|
|
37
|
+
export function parseBlockRef(ref) {
|
|
38
|
+
const normalized = ref.trim().toLowerCase();
|
|
39
|
+
const match = normalized.match(BLOCK_REF_REGEX);
|
|
40
|
+
if (!match) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
const id = Number.parseInt(match[1], 10);
|
|
44
|
+
return Number.isInteger(id) ? id : null;
|
|
45
|
+
}
|
|
46
|
+
export function parseBoundaryId(id) {
|
|
47
|
+
const normalized = id.trim().toLowerCase();
|
|
48
|
+
const messageIndex = parseMessageRef(normalized);
|
|
49
|
+
if (messageIndex !== null) {
|
|
50
|
+
return {
|
|
51
|
+
kind: "message",
|
|
52
|
+
ref: formatMessageRef(messageIndex),
|
|
53
|
+
index: messageIndex,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
const blockId = parseBlockRef(normalized);
|
|
57
|
+
if (blockId !== null) {
|
|
58
|
+
return {
|
|
59
|
+
kind: "compressed-block",
|
|
60
|
+
ref: formatBlockRef(blockId),
|
|
61
|
+
blockId,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
export function formatMessageIdTag(ref) {
|
|
67
|
+
return `\n<${MESSAGE_ID_TAG_NAME}>${ref}</${MESSAGE_ID_TAG_NAME}>`;
|
|
68
|
+
}
|
|
69
|
+
export function assignMessageRefs(state, messages) {
|
|
70
|
+
let assigned = 0;
|
|
71
|
+
let skippedSubAgentPrompt = false;
|
|
72
|
+
for (const message of messages) {
|
|
73
|
+
if (message.info.role === "user" && isIgnoredUserMessage(message)) {
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (state.isSubAgent && !skippedSubAgentPrompt && message.info.role === "user") {
|
|
77
|
+
skippedSubAgentPrompt = true;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
const rawMessageId = message.info.id;
|
|
81
|
+
if (typeof rawMessageId !== "string" || rawMessageId.length === 0) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
const existingRef = state.messageIds.byRawId.get(rawMessageId);
|
|
85
|
+
if (existingRef) {
|
|
86
|
+
if (state.messageIds.byRef.get(existingRef) !== rawMessageId) {
|
|
87
|
+
state.messageIds.byRef.set(existingRef, rawMessageId);
|
|
88
|
+
}
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const ref = allocateNextMessageRef(state);
|
|
92
|
+
state.messageIds.byRawId.set(rawMessageId, ref);
|
|
93
|
+
state.messageIds.byRef.set(ref, rawMessageId);
|
|
94
|
+
assigned++;
|
|
95
|
+
}
|
|
96
|
+
return assigned;
|
|
97
|
+
}
|
|
98
|
+
function allocateNextMessageRef(state) {
|
|
99
|
+
let candidate = Number.isInteger(state.messageIds.nextRef)
|
|
100
|
+
? Math.max(MESSAGE_REF_MIN_INDEX, state.messageIds.nextRef)
|
|
101
|
+
: MESSAGE_REF_MIN_INDEX;
|
|
102
|
+
while (candidate <= MESSAGE_REF_MAX_INDEX) {
|
|
103
|
+
const ref = formatMessageRef(candidate);
|
|
104
|
+
if (!state.messageIds.byRef.has(ref)) {
|
|
105
|
+
state.messageIds.nextRef = candidate + 1;
|
|
106
|
+
return ref;
|
|
107
|
+
}
|
|
108
|
+
candidate++;
|
|
109
|
+
}
|
|
110
|
+
throw new Error(`Message ID alias capacity exceeded. Cannot allocate more than ${formatMessageRef(MESSAGE_REF_MAX_INDEX)} aliases in this session.`);
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=message-ids.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-ids.js","sourceRoot":"","sources":["../../lib/message-ids.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { prune } from "./prune";
|
|
2
|
+
export { syncCompressionBlocks } from "./sync";
|
|
3
|
+
export { injectCompressNudges } from "./inject/inject";
|
|
4
|
+
export { injectMessageIds } from "./inject/inject";
|
|
5
|
+
export { injectExtendedSubAgentResults } from "./inject/subagent-results";
|
|
6
|
+
export { stripStaleMetadata } from "./reasoning-strip";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/messages/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,QAAQ,CAAA;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAA;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { prune } from "./prune";
|
|
2
|
+
export { syncCompressionBlocks } from "./sync";
|
|
3
|
+
export { injectCompressNudges } from "./inject/inject";
|
|
4
|
+
export { injectMessageIds } from "./inject/inject";
|
|
5
|
+
export { injectExtendedSubAgentResults } from "./inject/subagent-results";
|
|
6
|
+
export { stripStaleMetadata } from "./reasoning-strip";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/messages/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,QAAQ,CAAA;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAA;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SessionState, WithParts } from "../../state";
|
|
2
|
+
import type { Logger } from "../../logger";
|
|
3
|
+
import type { PluginConfig } from "../../config";
|
|
4
|
+
import type { RuntimePrompts } from "../../prompts/store";
|
|
5
|
+
export declare const injectCompressNudges: (state: SessionState, config: PluginConfig, logger: Logger, messages: WithParts[], prompts: RuntimePrompts) => void;
|
|
6
|
+
export declare const injectMessageIds: (state: SessionState, config: PluginConfig, messages: WithParts[]) => void;
|
|
7
|
+
//# sourceMappingURL=inject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inject.d.ts","sourceRoot":"","sources":["../../../../lib/messages/inject/inject.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAsBzD,eAAO,MAAM,oBAAoB,GAC7B,OAAO,YAAY,EACnB,QAAQ,YAAY,EACpB,QAAQ,MAAM,EACd,UAAU,SAAS,EAAE,EACrB,SAAS,cAAc,KACxB,IAuGF,CAAA;AAED,eAAO,MAAM,gBAAgB,GACzB,OAAO,YAAY,EACnB,QAAQ,YAAY,EACpB,UAAU,SAAS,EAAE,KACtB,IAmDF,CAAA"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { formatMessageIdTag } from "../../message-ids";
|
|
2
|
+
import { compressPermission, getLastUserMessage } from "../../shared-utils";
|
|
3
|
+
import { saveSessionState } from "../../state/persistence";
|
|
4
|
+
import { appendIdToTool, createSyntheticTextPart, findLastToolPart, isIgnoredUserMessage, } from "../utils";
|
|
5
|
+
import { addAnchor, applyAnchoredNudges, countMessagesAfterIndex, findLastNonIgnoredMessage, getIterationNudgeThreshold, getNudgeFrequency, getModelInfo, isContextOverLimits, messageHasCompress, } from "./utils";
|
|
6
|
+
export const injectCompressNudges = (state, config, logger, messages, prompts) => {
|
|
7
|
+
if (compressPermission(state, config) === "deny") {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
if (state.manualMode) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const lastMessage = findLastNonIgnoredMessage(messages);
|
|
14
|
+
const lastAssistantMessage = messages.findLast((message) => message.info.role === "assistant");
|
|
15
|
+
if (lastAssistantMessage && messageHasCompress(lastAssistantMessage)) {
|
|
16
|
+
state.nudges.contextLimitAnchors.clear();
|
|
17
|
+
state.nudges.turnNudgeAnchors.clear();
|
|
18
|
+
state.nudges.iterationNudgeAnchors.clear();
|
|
19
|
+
void saveSessionState(state, logger);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const { providerId, modelId } = getModelInfo(messages);
|
|
23
|
+
let anchorsChanged = false;
|
|
24
|
+
const { overMaxLimit, overMinLimit } = isContextOverLimits(config, state, providerId, modelId, messages);
|
|
25
|
+
if (!overMinLimit) {
|
|
26
|
+
const hadTurnAnchors = state.nudges.turnNudgeAnchors.size > 0;
|
|
27
|
+
const hadIterationAnchors = state.nudges.iterationNudgeAnchors.size > 0;
|
|
28
|
+
if (hadTurnAnchors || hadIterationAnchors) {
|
|
29
|
+
state.nudges.turnNudgeAnchors.clear();
|
|
30
|
+
state.nudges.iterationNudgeAnchors.clear();
|
|
31
|
+
anchorsChanged = true;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (overMaxLimit) {
|
|
35
|
+
if (lastMessage) {
|
|
36
|
+
const interval = getNudgeFrequency(config);
|
|
37
|
+
const added = addAnchor(state.nudges.contextLimitAnchors, lastMessage.message.info.id, lastMessage.index, messages, interval);
|
|
38
|
+
if (added) {
|
|
39
|
+
anchorsChanged = true;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else if (overMinLimit) {
|
|
44
|
+
const isLastMessageUser = lastMessage?.message.info.role === "user";
|
|
45
|
+
if (isLastMessageUser && lastAssistantMessage) {
|
|
46
|
+
const previousSize = state.nudges.turnNudgeAnchors.size;
|
|
47
|
+
state.nudges.turnNudgeAnchors.add(lastMessage.message.info.id);
|
|
48
|
+
state.nudges.turnNudgeAnchors.add(lastAssistantMessage.info.id);
|
|
49
|
+
if (state.nudges.turnNudgeAnchors.size !== previousSize) {
|
|
50
|
+
anchorsChanged = true;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const lastUserMessage = getLastUserMessage(messages);
|
|
54
|
+
if (lastUserMessage && lastMessage) {
|
|
55
|
+
const lastUserMessageIndex = messages.findIndex((message) => message.info.id === lastUserMessage.info.id);
|
|
56
|
+
if (lastUserMessageIndex >= 0) {
|
|
57
|
+
const messagesSinceUser = countMessagesAfterIndex(messages, lastUserMessageIndex);
|
|
58
|
+
const iterationThreshold = getIterationNudgeThreshold(config);
|
|
59
|
+
if (lastMessage.index > lastUserMessageIndex &&
|
|
60
|
+
messagesSinceUser >= iterationThreshold) {
|
|
61
|
+
const interval = getNudgeFrequency(config);
|
|
62
|
+
const added = addAnchor(state.nudges.iterationNudgeAnchors, lastMessage.message.info.id, lastMessage.index, messages, interval);
|
|
63
|
+
if (added) {
|
|
64
|
+
anchorsChanged = true;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
applyAnchoredNudges(state, config, messages, prompts);
|
|
71
|
+
if (anchorsChanged) {
|
|
72
|
+
void saveSessionState(state, logger);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
export const injectMessageIds = (state, config, messages) => {
|
|
76
|
+
if (compressPermission(state, config) === "deny") {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// Find the last assistant message index to avoid injecting synthetic text
|
|
80
|
+
// parts into it, which would cause "assistant message prefill" errors
|
|
81
|
+
// on models that don't support prefill (e.g. claude-opus-4-6).
|
|
82
|
+
const lastAssistantIndex = findLastAssistantIndex(messages);
|
|
83
|
+
for (let i = 0; i < messages.length; i++) {
|
|
84
|
+
const message = messages[i];
|
|
85
|
+
if (message.info.role === "user" && isIgnoredUserMessage(message)) {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
const messageRef = state.messageIds.byRawId.get(message.info.id);
|
|
89
|
+
if (!messageRef) {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const tag = formatMessageIdTag(messageRef);
|
|
93
|
+
if (message.info.role === "user") {
|
|
94
|
+
message.parts.push(createSyntheticTextPart(message, tag));
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (message.info.role !== "assistant") {
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
const lastToolPart = findLastToolPart(message);
|
|
101
|
+
if (lastToolPart && appendIdToTool(lastToolPart, tag)) {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
// Skip adding synthetic text parts to the last assistant message
|
|
105
|
+
// to prevent prefill errors on models that don't support it.
|
|
106
|
+
if (i === lastAssistantIndex) {
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
const syntheticPart = createSyntheticTextPart(message, tag);
|
|
110
|
+
const firstToolIndex = message.parts.findIndex((p) => p.type === "tool");
|
|
111
|
+
if (firstToolIndex === -1) {
|
|
112
|
+
message.parts.push(syntheticPart);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
message.parts.splice(firstToolIndex, 0, syntheticPart);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
/**
|
|
120
|
+
* Find the index of the last assistant message in the array.
|
|
121
|
+
* Returns -1 if no assistant message is found.
|
|
122
|
+
*/
|
|
123
|
+
function findLastAssistantIndex(messages) {
|
|
124
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
125
|
+
if (messages[i].info.role === "assistant") {
|
|
126
|
+
return i;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return -1;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=inject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inject.js","sourceRoot":"","sources":["../../../../lib/messages/inject/inject.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Logger } from "../../logger";
|
|
2
|
+
import type { SessionState, WithParts } from "../../state";
|
|
3
|
+
export declare const injectExtendedSubAgentResults: (client: any, state: SessionState, logger: Logger, messages: WithParts[], allowSubAgents: boolean) => Promise<void>;
|
|
4
|
+
//# sourceMappingURL=subagent-results.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent-results.d.ts","sourceRoot":"","sources":["../../../../lib/messages/inject/subagent-results.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAiB1D,eAAO,MAAM,6BAA6B,GACtC,QAAQ,GAAG,EACX,OAAO,YAAY,EACnB,QAAQ,MAAM,EACd,UAAU,SAAS,EAAE,EACrB,gBAAgB,OAAO,KACxB,OAAO,CAAC,IAAI,CAyDd,CAAA"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { buildSubagentResultText, getSubAgentId, mergeSubagentResult, } from "../../subagents/subagent-results";
|
|
2
|
+
import { stripHallucinationsFromString } from "../utils";
|
|
3
|
+
async function fetchSubAgentMessages(client, sessionId) {
|
|
4
|
+
const response = await client.session.messages({
|
|
5
|
+
path: { id: sessionId },
|
|
6
|
+
});
|
|
7
|
+
const payload = (response?.data || response);
|
|
8
|
+
return Array.isArray(payload) ? payload : [];
|
|
9
|
+
}
|
|
10
|
+
export const injectExtendedSubAgentResults = async (client, state, logger, messages, allowSubAgents) => {
|
|
11
|
+
if (!allowSubAgents) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
for (const message of messages) {
|
|
15
|
+
const parts = Array.isArray(message.parts) ? message.parts : [];
|
|
16
|
+
for (const part of parts) {
|
|
17
|
+
if (part.type !== "tool" || part.tool !== "task" || !part.callID) {
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
if (state.prune.tools.has(part.callID)) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
if (part.state?.status !== "completed" || typeof part.state.output !== "string") {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
const cachedResult = state.subAgentResultCache.get(part.callID);
|
|
27
|
+
if (cachedResult !== undefined) {
|
|
28
|
+
if (cachedResult) {
|
|
29
|
+
part.state.output = stripHallucinationsFromString(mergeSubagentResult(part.state.output, cachedResult));
|
|
30
|
+
}
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const subAgentSessionId = getSubAgentId(part);
|
|
34
|
+
if (!subAgentSessionId) {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
let subAgentMessages = [];
|
|
38
|
+
try {
|
|
39
|
+
subAgentMessages = await fetchSubAgentMessages(client, subAgentSessionId);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
logger.warn("Failed to fetch subagent session for output expansion", {
|
|
43
|
+
subAgentSessionId,
|
|
44
|
+
callID: part.callID,
|
|
45
|
+
error: error instanceof Error ? error.message : String(error),
|
|
46
|
+
});
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
const subAgentResultText = buildSubagentResultText(subAgentMessages);
|
|
50
|
+
if (!subAgentResultText) {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
state.subAgentResultCache.set(part.callID, subAgentResultText);
|
|
54
|
+
part.state.output = stripHallucinationsFromString(mergeSubagentResult(part.state.output, subAgentResultText));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=subagent-results.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent-results.js","sourceRoot":"","sources":["../../../../lib/messages/inject/subagent-results.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { SessionState, WithParts } from "../../state";
|
|
2
|
+
import type { PluginConfig } from "../../config";
|
|
3
|
+
import type { RuntimePrompts } from "../../prompts/store";
|
|
4
|
+
export interface LastUserModelContext {
|
|
5
|
+
providerId: string | undefined;
|
|
6
|
+
modelId: string | undefined;
|
|
7
|
+
}
|
|
8
|
+
export interface LastNonIgnoredMessage {
|
|
9
|
+
message: WithParts;
|
|
10
|
+
index: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function getNudgeFrequency(config: PluginConfig): number;
|
|
13
|
+
export declare function getIterationNudgeThreshold(config: PluginConfig): number;
|
|
14
|
+
export declare function findLastNonIgnoredMessage(messages: WithParts[]): LastNonIgnoredMessage | null;
|
|
15
|
+
export declare function countMessagesAfterIndex(messages: WithParts[], index: number): number;
|
|
16
|
+
export declare function messageHasCompress(message: WithParts): boolean;
|
|
17
|
+
export declare function getModelInfo(messages: WithParts[]): LastUserModelContext;
|
|
18
|
+
export declare function isContextOverLimits(config: PluginConfig, state: SessionState, providerId: string | undefined, modelId: string | undefined, messages: WithParts[]): {
|
|
19
|
+
overMaxLimit: boolean;
|
|
20
|
+
overMinLimit: boolean;
|
|
21
|
+
};
|
|
22
|
+
export declare function addAnchor(anchorMessageIds: Set<string>, anchorMessageId: string, anchorMessageIndex: number, messages: WithParts[], interval: number): boolean;
|
|
23
|
+
export declare function buildCompressedBlockGuidance(state: SessionState): string;
|
|
24
|
+
export declare function applyAnchoredNudges(state: SessionState, config: PluginConfig, messages: WithParts[], prompts: RuntimePrompts): void;
|
|
25
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../lib/messages/inject/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAMzD,MAAM,WAAW,oBAAoB;IACjC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;CAC9B;AAED,MAAM,WAAW,qBAAqB;IAClC,OAAO,EAAE,SAAS,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;CAChB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAE9D;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAEvE;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,qBAAqB,GAAG,IAAI,CAU7F;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAYpF;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAM9D;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,oBAAoB,CAcxE;AA+CD,wBAAgB,mBAAmB,CAC/B,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,QAAQ,EAAE,SAAS,EAAE;;;EAaxB;AAED,wBAAgB,SAAS,CACrB,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,EAC7B,eAAe,EAAE,MAAM,EACvB,kBAAkB,EAAE,MAAM,EAC1B,QAAQ,EAAE,SAAS,EAAE,EACrB,QAAQ,EAAE,MAAM,GACjB,OAAO,CAsBT;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAaxE;AA0ED,wBAAgB,mBAAmB,CAC/B,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,SAAS,EAAE,EACrB,OAAO,EAAE,cAAc,GACxB,IAAI,CA0BN"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { createSyntheticTextPart, isIgnoredUserMessage } from "../utils";
|
|
2
|
+
import { getLastUserMessage } from "../../shared-utils";
|
|
3
|
+
import { getCurrentTokenUsage } from "../../strategies/utils";
|
|
4
|
+
export function getNudgeFrequency(config) {
|
|
5
|
+
return Math.max(1, Math.floor(config.compress.nudgeFrequency || 1));
|
|
6
|
+
}
|
|
7
|
+
export function getIterationNudgeThreshold(config) {
|
|
8
|
+
return Math.max(1, Math.floor(config.compress.iterationNudgeThreshold || 1));
|
|
9
|
+
}
|
|
10
|
+
export function findLastNonIgnoredMessage(messages) {
|
|
11
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
12
|
+
const message = messages[i];
|
|
13
|
+
if (message.info.role === "user" && isIgnoredUserMessage(message)) {
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
return { message, index: i };
|
|
17
|
+
}
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
export function countMessagesAfterIndex(messages, index) {
|
|
21
|
+
let count = 0;
|
|
22
|
+
for (let i = index + 1; i < messages.length; i++) {
|
|
23
|
+
const message = messages[i];
|
|
24
|
+
if (message.info.role === "user" && isIgnoredUserMessage(message)) {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
count++;
|
|
28
|
+
}
|
|
29
|
+
return count;
|
|
30
|
+
}
|
|
31
|
+
export function messageHasCompress(message) {
|
|
32
|
+
const parts = Array.isArray(message.parts) ? message.parts : [];
|
|
33
|
+
return parts.some((part) => part.type === "tool" && part.state.status === "completed" && part.tool === "compress");
|
|
34
|
+
}
|
|
35
|
+
export function getModelInfo(messages) {
|
|
36
|
+
const lastUserMessage = getLastUserMessage(messages);
|
|
37
|
+
if (!lastUserMessage) {
|
|
38
|
+
return {
|
|
39
|
+
providerId: undefined,
|
|
40
|
+
modelId: undefined,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const userInfo = lastUserMessage.info;
|
|
44
|
+
return {
|
|
45
|
+
providerId: userInfo.model.providerID,
|
|
46
|
+
modelId: userInfo.model.modelID,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function resolveContextTokenLimit(config, state, providerId, modelId, threshold) {
|
|
50
|
+
const parseLimitValue = (limit) => {
|
|
51
|
+
if (limit === undefined) {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
if (typeof limit === "number") {
|
|
55
|
+
return limit;
|
|
56
|
+
}
|
|
57
|
+
if (!limit.endsWith("%") || state.modelContextLimit === undefined) {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
const parsedPercent = parseFloat(limit.slice(0, -1));
|
|
61
|
+
if (isNaN(parsedPercent)) {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
const roundedPercent = Math.round(parsedPercent);
|
|
65
|
+
const clampedPercent = Math.max(0, Math.min(100, roundedPercent));
|
|
66
|
+
return Math.round((clampedPercent / 100) * state.modelContextLimit);
|
|
67
|
+
};
|
|
68
|
+
const modelLimits = threshold === "max" ? config.compress.modelMaxLimits : config.compress.modelMinLimits;
|
|
69
|
+
if (modelLimits && providerId !== undefined && modelId !== undefined) {
|
|
70
|
+
const providerModelId = `${providerId}/${modelId}`;
|
|
71
|
+
const modelLimit = modelLimits[providerModelId];
|
|
72
|
+
if (modelLimit !== undefined) {
|
|
73
|
+
return parseLimitValue(modelLimit);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const globalLimit = threshold === "max" ? config.compress.maxContextLimit : config.compress.minContextLimit;
|
|
77
|
+
return parseLimitValue(globalLimit);
|
|
78
|
+
}
|
|
79
|
+
export function isContextOverLimits(config, state, providerId, modelId, messages) {
|
|
80
|
+
const maxContextLimit = resolveContextTokenLimit(config, state, providerId, modelId, "max");
|
|
81
|
+
const minContextLimit = resolveContextTokenLimit(config, state, providerId, modelId, "min");
|
|
82
|
+
const currentTokens = getCurrentTokenUsage(messages);
|
|
83
|
+
const overMaxLimit = maxContextLimit === undefined ? false : currentTokens > maxContextLimit;
|
|
84
|
+
const overMinLimit = minContextLimit === undefined ? true : currentTokens >= minContextLimit;
|
|
85
|
+
return {
|
|
86
|
+
overMaxLimit,
|
|
87
|
+
overMinLimit,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
export function addAnchor(anchorMessageIds, anchorMessageId, anchorMessageIndex, messages, interval) {
|
|
91
|
+
if (anchorMessageIndex < 0) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
let latestAnchorMessageIndex = -1;
|
|
95
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
96
|
+
if (anchorMessageIds.has(messages[i].info.id)) {
|
|
97
|
+
latestAnchorMessageIndex = i;
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
const shouldAdd = latestAnchorMessageIndex < 0 || anchorMessageIndex - latestAnchorMessageIndex >= interval;
|
|
102
|
+
if (!shouldAdd) {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
const previousSize = anchorMessageIds.size;
|
|
106
|
+
anchorMessageIds.add(anchorMessageId);
|
|
107
|
+
return anchorMessageIds.size !== previousSize;
|
|
108
|
+
}
|
|
109
|
+
export function buildCompressedBlockGuidance(state) {
|
|
110
|
+
const refs = Array.from(state.prune.messages.activeBlockIds)
|
|
111
|
+
.filter((id) => Number.isInteger(id) && id > 0)
|
|
112
|
+
.sort((a, b) => a - b)
|
|
113
|
+
.map((id) => `b${id}`);
|
|
114
|
+
const blockCount = refs.length;
|
|
115
|
+
const blockList = blockCount > 0 ? refs.join(", ") : "none";
|
|
116
|
+
return [
|
|
117
|
+
"Compressed block context:",
|
|
118
|
+
`- Active compressed blocks in this session: ${blockCount} (${blockList})`,
|
|
119
|
+
"- If your selected compression range includes any listed block, include each required placeholder exactly once in the summary using \`(bN)\`.",
|
|
120
|
+
].join("\n");
|
|
121
|
+
}
|
|
122
|
+
function appendGuidanceToDcpTag(hintText, guidance) {
|
|
123
|
+
const closeTag = "</dcp-system-reminder>";
|
|
124
|
+
const closeTagIndex = hintText.lastIndexOf(closeTag);
|
|
125
|
+
if (closeTagIndex === -1) {
|
|
126
|
+
return hintText;
|
|
127
|
+
}
|
|
128
|
+
const beforeClose = hintText.slice(0, closeTagIndex).trimEnd();
|
|
129
|
+
const afterClose = hintText.slice(closeTagIndex);
|
|
130
|
+
return `${beforeClose}\n\n${guidance}\n${afterClose}`;
|
|
131
|
+
}
|
|
132
|
+
function applyAnchoredNudge(anchorMessageIds, messages, hintText) {
|
|
133
|
+
if (anchorMessageIds.size === 0) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
// Find the last assistant message to avoid injecting synthetic text
|
|
137
|
+
// parts into it, which would cause "assistant message prefill" errors
|
|
138
|
+
// on models that don't support prefill (e.g. claude-opus-4-6).
|
|
139
|
+
const lastAssistantId = findLastAssistantId(messages);
|
|
140
|
+
for (const anchorMessageId of anchorMessageIds) {
|
|
141
|
+
const messageIndex = messages.findIndex((message) => message.info.id === anchorMessageId);
|
|
142
|
+
if (messageIndex === -1) {
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
const message = messages[messageIndex];
|
|
146
|
+
if (message.info.role === "user") {
|
|
147
|
+
message.parts.push(createSyntheticTextPart(message, hintText));
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
if (message.info.role !== "assistant") {
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
// Skip adding synthetic text parts to the last assistant message
|
|
154
|
+
// to prevent prefill errors on models that don't support it.
|
|
155
|
+
if (message.info.id === lastAssistantId) {
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
const syntheticPart = createSyntheticTextPart(message, hintText);
|
|
159
|
+
const firstToolIndex = message.parts.findIndex((p) => p.type === "tool");
|
|
160
|
+
if (firstToolIndex === -1) {
|
|
161
|
+
message.parts.push(syntheticPart);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
message.parts.splice(firstToolIndex, 0, syntheticPart);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Find the ID of the last assistant message in the array.
|
|
170
|
+
* Returns undefined if no assistant message is found.
|
|
171
|
+
*/
|
|
172
|
+
function findLastAssistantId(messages) {
|
|
173
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
174
|
+
if (messages[i].info.role === "assistant") {
|
|
175
|
+
return messages[i].info.id;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return undefined;
|
|
179
|
+
}
|
|
180
|
+
export function applyAnchoredNudges(state, config, messages, prompts) {
|
|
181
|
+
const compressedBlockGuidance = buildCompressedBlockGuidance(state);
|
|
182
|
+
const contextLimitNudge = appendGuidanceToDcpTag(prompts.contextLimitNudge, compressedBlockGuidance);
|
|
183
|
+
applyAnchoredNudge(state.nudges.contextLimitAnchors, messages, contextLimitNudge);
|
|
184
|
+
const turnNudgeAnchors = new Set();
|
|
185
|
+
const targetRole = config.compress.nudgeForce === "strong" ? "user" : "assistant";
|
|
186
|
+
const turnNudge = appendGuidanceToDcpTag(prompts.turnNudge, compressedBlockGuidance);
|
|
187
|
+
for (const message of messages) {
|
|
188
|
+
if (!state.nudges.turnNudgeAnchors.has(message.info.id))
|
|
189
|
+
continue;
|
|
190
|
+
if (message.info.role === targetRole) {
|
|
191
|
+
turnNudgeAnchors.add(message.info.id);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
applyAnchoredNudge(turnNudgeAnchors, messages, turnNudge);
|
|
195
|
+
const iterationNudge = appendGuidanceToDcpTag(prompts.iterationNudge, compressedBlockGuidance);
|
|
196
|
+
applyAnchoredNudge(state.nudges.iterationNudgeAnchors, messages, iterationNudge);
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=utils.js.map
|