@nervekit/agent 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/NOTICE +5 -0
- package/dist/agent-loop.d.ts +2 -0
- package/dist/agent-loop.d.ts.map +1 -0
- package/dist/agent-loop.js +2 -0
- package/dist/agent-loop.js.map +1 -0
- package/dist/agent.d.ts +125 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +427 -0
- package/dist/agent.js.map +1 -0
- package/dist/harness/agent-harness.d.ts +114 -0
- package/dist/harness/agent-harness.d.ts.map +1 -0
- package/dist/harness/agent-harness.js +474 -0
- package/dist/harness/agent-harness.js.map +1 -0
- package/dist/harness/compaction/branch-summarization.d.ts +54 -0
- package/dist/harness/compaction/branch-summarization.d.ts.map +1 -0
- package/dist/harness/compaction/branch-summarization.js +183 -0
- package/dist/harness/compaction/branch-summarization.js.map +1 -0
- package/dist/harness/compaction/compaction.d.ts +19 -0
- package/dist/harness/compaction/compaction.d.ts.map +1 -0
- package/dist/harness/compaction/compaction.js +335 -0
- package/dist/harness/compaction/compaction.js.map +1 -0
- package/dist/harness/compaction/cut-points.d.ts +7 -0
- package/dist/harness/compaction/cut-points.d.ts.map +1 -0
- package/dist/harness/compaction/cut-points.js +106 -0
- package/dist/harness/compaction/cut-points.js.map +1 -0
- package/dist/harness/compaction/overflow.d.ts +3 -0
- package/dist/harness/compaction/overflow.d.ts.map +1 -0
- package/dist/harness/compaction/overflow.js +54 -0
- package/dist/harness/compaction/overflow.js.map +1 -0
- package/dist/harness/compaction/policy.d.ts +8 -0
- package/dist/harness/compaction/policy.d.ts.map +1 -0
- package/dist/harness/compaction/policy.js +57 -0
- package/dist/harness/compaction/policy.js.map +1 -0
- package/dist/harness/compaction/types.d.ts +79 -0
- package/dist/harness/compaction/types.d.ts.map +1 -0
- package/dist/harness/compaction/types.js +2 -0
- package/dist/harness/compaction/types.js.map +1 -0
- package/dist/harness/compaction/usage.d.ts +30 -0
- package/dist/harness/compaction/usage.d.ts.map +1 -0
- package/dist/harness/compaction/usage.js +177 -0
- package/dist/harness/compaction/usage.js.map +1 -0
- package/dist/harness/compaction/utils.d.ts +25 -0
- package/dist/harness/compaction/utils.d.ts.map +1 -0
- package/dist/harness/compaction/utils.js +131 -0
- package/dist/harness/compaction/utils.js.map +1 -0
- package/dist/harness/configuration.d.ts +34 -0
- package/dist/harness/configuration.d.ts.map +1 -0
- package/dist/harness/configuration.js +75 -0
- package/dist/harness/configuration.js.map +1 -0
- package/dist/harness/conversation/context.d.ts +24 -0
- package/dist/harness/conversation/context.d.ts.map +1 -0
- package/dist/harness/conversation/context.js +76 -0
- package/dist/harness/conversation/context.js.map +1 -0
- package/dist/harness/conversation/conversation.d.ts +36 -0
- package/dist/harness/conversation/conversation.d.ts.map +1 -0
- package/dist/harness/conversation/conversation.js +163 -0
- package/dist/harness/conversation/conversation.js.map +1 -0
- package/dist/harness/conversation/entries.d.ts +117 -0
- package/dist/harness/conversation/entries.d.ts.map +1 -0
- package/dist/harness/conversation/entries.js +2 -0
- package/dist/harness/conversation/entries.js.map +1 -0
- package/dist/harness/conversation/jsonl-repo.d.ts +27 -0
- package/dist/harness/conversation/jsonl-repo.d.ts.map +1 -0
- package/dist/harness/conversation/jsonl-repo.js +110 -0
- package/dist/harness/conversation/jsonl-repo.js.map +1 -0
- package/dist/harness/conversation/jsonl-storage.d.ts +34 -0
- package/dist/harness/conversation/jsonl-storage.d.ts.map +1 -0
- package/dist/harness/conversation/jsonl-storage.js +213 -0
- package/dist/harness/conversation/jsonl-storage.js.map +1 -0
- package/dist/harness/conversation/memory-repo.d.ts +18 -0
- package/dist/harness/conversation/memory-repo.d.ts.map +1 -0
- package/dist/harness/conversation/memory-repo.js +45 -0
- package/dist/harness/conversation/memory-repo.js.map +1 -0
- package/dist/harness/conversation/memory-storage.d.ts +25 -0
- package/dist/harness/conversation/memory-storage.d.ts.map +1 -0
- package/dist/harness/conversation/memory-storage.js +88 -0
- package/dist/harness/conversation/memory-storage.js.map +1 -0
- package/dist/harness/conversation/repo-utils.d.ts +13 -0
- package/dist/harness/conversation/repo-utils.d.ts.map +1 -0
- package/dist/harness/conversation/repo-utils.js +39 -0
- package/dist/harness/conversation/repo-utils.js.map +1 -0
- package/dist/harness/conversation/storage-utils.d.ts +11 -0
- package/dist/harness/conversation/storage-utils.d.ts.map +1 -0
- package/dist/harness/conversation/storage-utils.js +32 -0
- package/dist/harness/conversation/storage-utils.js.map +1 -0
- package/dist/harness/conversation/text-extraction.d.ts +8 -0
- package/dist/harness/conversation/text-extraction.d.ts.map +1 -0
- package/dist/harness/conversation/text-extraction.js +24 -0
- package/dist/harness/conversation/text-extraction.js.map +1 -0
- package/dist/harness/conversation/uuid.d.ts +2 -0
- package/dist/harness/conversation/uuid.d.ts.map +1 -0
- package/dist/harness/conversation/uuid.js +54 -0
- package/dist/harness/conversation/uuid.js.map +1 -0
- package/dist/harness/conversation-writes.d.ts +9 -0
- package/dist/harness/conversation-writes.d.ts.map +1 -0
- package/dist/harness/conversation-writes.js +54 -0
- package/dist/harness/conversation-writes.js.map +1 -0
- package/dist/harness/env/nodejs.d.ts +53 -0
- package/dist/harness/env/nodejs.d.ts.map +1 -0
- package/dist/harness/env/nodejs.js +497 -0
- package/dist/harness/env/nodejs.js.map +1 -0
- package/dist/harness/env/types.d.ts +106 -0
- package/dist/harness/env/types.d.ts.map +1 -0
- package/dist/harness/env/types.js +2 -0
- package/dist/harness/env/types.js.map +1 -0
- package/dist/harness/errors.d.ts +48 -0
- package/dist/harness/errors.d.ts.map +1 -0
- package/dist/harness/errors.js +63 -0
- package/dist/harness/errors.js.map +1 -0
- package/dist/harness/events.d.ts +238 -0
- package/dist/harness/events.d.ts.map +1 -0
- package/dist/harness/events.js +2 -0
- package/dist/harness/events.js.map +1 -0
- package/dist/harness/harness-configuration-methods.d.ts +36 -0
- package/dist/harness/harness-configuration-methods.d.ts.map +1 -0
- package/dist/harness/harness-configuration-methods.js +145 -0
- package/dist/harness/harness-configuration-methods.js.map +1 -0
- package/dist/harness/harness-continuation.d.ts +18 -0
- package/dist/harness/harness-continuation.d.ts.map +1 -0
- package/dist/harness/harness-continuation.js +56 -0
- package/dist/harness/harness-continuation.js.map +1 -0
- package/dist/harness/harness-events.d.ts +23 -0
- package/dist/harness/harness-events.d.ts.map +1 -0
- package/dist/harness/harness-events.js +129 -0
- package/dist/harness/harness-events.js.map +1 -0
- package/dist/harness/harness-invocations.d.ts +20 -0
- package/dist/harness/harness-invocations.d.ts.map +1 -0
- package/dist/harness/harness-invocations.js +22 -0
- package/dist/harness/harness-invocations.js.map +1 -0
- package/dist/harness/harness-maintenance.d.ts +30 -0
- package/dist/harness/harness-maintenance.d.ts.map +1 -0
- package/dist/harness/harness-maintenance.js +155 -0
- package/dist/harness/harness-maintenance.js.map +1 -0
- package/dist/harness/harness-queue-methods.d.ts +45 -0
- package/dist/harness/harness-queue-methods.d.ts.map +1 -0
- package/dist/harness/harness-queue-methods.js +51 -0
- package/dist/harness/harness-queue-methods.js.map +1 -0
- package/dist/harness/messages.d.ts +76 -0
- package/dist/harness/messages.d.ts.map +1 -0
- package/dist/harness/messages.js +147 -0
- package/dist/harness/messages.js.map +1 -0
- package/dist/harness/options.d.ts +95 -0
- package/dist/harness/options.d.ts.map +1 -0
- package/dist/harness/options.js +2 -0
- package/dist/harness/options.js.map +1 -0
- package/dist/harness/prompt-templates.d.ts +49 -0
- package/dist/harness/prompt-templates.d.ts.map +1 -0
- package/dist/harness/prompt-templates.js +230 -0
- package/dist/harness/prompt-templates.js.map +1 -0
- package/dist/harness/result.d.ts +19 -0
- package/dist/harness/result.d.ts.map +1 -0
- package/dist/harness/result.js +32 -0
- package/dist/harness/result.js.map +1 -0
- package/dist/harness/run/messages.d.ts +5 -0
- package/dist/harness/run/messages.d.ts.map +1 -0
- package/dist/harness/run/messages.js +37 -0
- package/dist/harness/run/messages.js.map +1 -0
- package/dist/harness/skills/format.d.ts +6 -0
- package/dist/harness/skills/format.d.ts.map +1 -0
- package/dist/harness/skills/format.js +38 -0
- package/dist/harness/skills/format.js.map +1 -0
- package/dist/harness/skills/index.d.ts +5 -0
- package/dist/harness/skills/index.d.ts.map +1 -0
- package/dist/harness/skills/index.js +5 -0
- package/dist/harness/skills/index.js.map +1 -0
- package/dist/harness/skills/loader.d.ts +43 -0
- package/dist/harness/skills/loader.d.ts.map +1 -0
- package/dist/harness/skills/loader.js +279 -0
- package/dist/harness/skills/loader.js.map +1 -0
- package/dist/harness/skills/parser.d.ts +12 -0
- package/dist/harness/skills/parser.d.ts.map +1 -0
- package/dist/harness/skills/parser.js +22 -0
- package/dist/harness/skills/parser.js.map +1 -0
- package/dist/harness/skills/validation.d.ts +3 -0
- package/dist/harness/skills/validation.d.ts.map +1 -0
- package/dist/harness/skills/validation.js +28 -0
- package/dist/harness/skills/validation.js.map +1 -0
- package/dist/harness/skills.d.ts +2 -0
- package/dist/harness/skills.d.ts.map +1 -0
- package/dist/harness/skills.js +2 -0
- package/dist/harness/skills.js.map +1 -0
- package/dist/harness/stream-options.d.ts +5 -0
- package/dist/harness/stream-options.d.ts.map +1 -0
- package/dist/harness/stream-options.js +67 -0
- package/dist/harness/stream-options.js.map +1 -0
- package/dist/harness/system-prompt.d.ts +2 -0
- package/dist/harness/system-prompt.d.ts.map +1 -0
- package/dist/harness/system-prompt.js +2 -0
- package/dist/harness/system-prompt.js.map +1 -0
- package/dist/harness/turn-state.d.ts +27 -0
- package/dist/harness/turn-state.d.ts.map +1 -0
- package/dist/harness/turn-state.js +35 -0
- package/dist/harness/turn-state.js.map +1 -0
- package/dist/harness/types.d.ts +9 -0
- package/dist/harness/types.d.ts.map +1 -0
- package/dist/harness/types.js +8 -0
- package/dist/harness/types.js.map +1 -0
- package/dist/harness/utils/env-path.d.ts +14 -0
- package/dist/harness/utils/env-path.d.ts.map +1 -0
- package/dist/harness/utils/env-path.js +99 -0
- package/dist/harness/utils/env-path.js.map +1 -0
- package/dist/harness/utils/shell-output.d.ts +16 -0
- package/dist/harness/utils/shell-output.d.ts.map +1 -0
- package/dist/harness/utils/shell-output.js +137 -0
- package/dist/harness/utils/shell-output.js.map +1 -0
- package/dist/harness/utils/truncate.d.ts +70 -0
- package/dist/harness/utils/truncate.d.ts.map +1 -0
- package/dist/harness/utils/truncate.js +289 -0
- package/dist/harness/utils/truncate.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/node.d.ts +3 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +3 -0
- package/dist/node.js.map +1 -0
- package/dist/proxy.d.ts +67 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +299 -0
- package/dist/proxy.js.map +1 -0
- package/dist/runtime/loop/agent-loop.d.ts +24 -0
- package/dist/runtime/loop/agent-loop.d.ts.map +1 -0
- package/dist/runtime/loop/agent-loop.js +72 -0
- package/dist/runtime/loop/agent-loop.js.map +1 -0
- package/dist/runtime/loop/events.d.ts +5 -0
- package/dist/runtime/loop/events.d.ts.map +1 -0
- package/dist/runtime/loop/events.js +5 -0
- package/dist/runtime/loop/events.js.map +1 -0
- package/dist/runtime/loop/index.d.ts +6 -0
- package/dist/runtime/loop/index.d.ts.map +1 -0
- package/dist/runtime/loop/index.js +6 -0
- package/dist/runtime/loop/index.js.map +1 -0
- package/dist/runtime/loop/stream-assistant.d.ts +9 -0
- package/dist/runtime/loop/stream-assistant.d.ts.map +1 -0
- package/dist/runtime/loop/stream-assistant.js +87 -0
- package/dist/runtime/loop/stream-assistant.js.map +1 -0
- package/dist/runtime/loop/tool-execution.d.ts +15 -0
- package/dist/runtime/loop/tool-execution.d.ts.map +1 -0
- package/dist/runtime/loop/tool-execution.js +271 -0
- package/dist/runtime/loop/tool-execution.js.map +1 -0
- package/dist/runtime/loop/turn-loop.d.ts +7 -0
- package/dist/runtime/loop/turn-loop.d.ts.map +1 -0
- package/dist/runtime/loop/turn-loop.js +84 -0
- package/dist/runtime/loop/turn-loop.js.map +1 -0
- package/dist/runtime.d.ts +63 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +170 -0
- package/dist/runtime.js.map +1 -0
- package/dist/suspension.d.ts +18 -0
- package/dist/suspension.d.ts.map +1 -0
- package/dist/suspension.js +19 -0
- package/dist/suspension.js.map +1 -0
- package/dist/types.d.ts +395 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/worker.d.ts +2 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +88 -0
- package/dist/worker.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { estimateTokens } from "./usage.js";
|
|
2
|
+
function findValidCutPoints(entries, startIndex, endIndex) {
|
|
3
|
+
const cutPoints = [];
|
|
4
|
+
for (let i = startIndex; i < endIndex; i++) {
|
|
5
|
+
const entry = entries[i];
|
|
6
|
+
switch (entry.type) {
|
|
7
|
+
case "message": {
|
|
8
|
+
const role = entry.message.role;
|
|
9
|
+
switch (role) {
|
|
10
|
+
case "bashExecution":
|
|
11
|
+
case "custom":
|
|
12
|
+
case "branchSummary":
|
|
13
|
+
case "compactionSummary":
|
|
14
|
+
case "user":
|
|
15
|
+
case "assistant":
|
|
16
|
+
cutPoints.push(i);
|
|
17
|
+
break;
|
|
18
|
+
case "toolResult":
|
|
19
|
+
break;
|
|
20
|
+
}
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
case "thinking_level_change":
|
|
24
|
+
case "model_change":
|
|
25
|
+
case "active_tools_change":
|
|
26
|
+
case "compaction":
|
|
27
|
+
case "branch_summary":
|
|
28
|
+
case "custom":
|
|
29
|
+
case "custom_message":
|
|
30
|
+
case "label":
|
|
31
|
+
case "conversation_info":
|
|
32
|
+
case "leaf":
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
if (entry.type === "branch_summary" || entry.type === "custom_message") {
|
|
36
|
+
cutPoints.push(i);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return cutPoints;
|
|
40
|
+
}
|
|
41
|
+
/** Find the user-visible message that starts the turn containing an entry. */
|
|
42
|
+
export function findTurnStartIndex(entries, entryIndex, startIndex) {
|
|
43
|
+
for (let i = entryIndex; i >= startIndex; i--) {
|
|
44
|
+
const entry = entries[i];
|
|
45
|
+
if (entry.type === "branch_summary" || entry.type === "custom_message") {
|
|
46
|
+
return i;
|
|
47
|
+
}
|
|
48
|
+
if (entry.type === "message") {
|
|
49
|
+
const role = entry.message.role;
|
|
50
|
+
if (role === "user" || role === "bashExecution") {
|
|
51
|
+
return i;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return -1;
|
|
56
|
+
}
|
|
57
|
+
/** Find the compaction cut point that keeps approximately the requested recent-token budget. */
|
|
58
|
+
export function findCutPoint(entries, startIndex, endIndex, keepRecentTokens) {
|
|
59
|
+
const cutPoints = findValidCutPoints(entries, startIndex, endIndex);
|
|
60
|
+
if (cutPoints.length === 0) {
|
|
61
|
+
return {
|
|
62
|
+
firstKeptEntryIndex: startIndex,
|
|
63
|
+
turnStartIndex: -1,
|
|
64
|
+
isSplitTurn: false,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
let accumulatedTokens = 0;
|
|
68
|
+
let cutIndex = cutPoints[0];
|
|
69
|
+
for (let i = endIndex - 1; i >= startIndex; i--) {
|
|
70
|
+
const entry = entries[i];
|
|
71
|
+
if (entry.type !== "message")
|
|
72
|
+
continue;
|
|
73
|
+
const messageTokens = estimateTokens(entry.message);
|
|
74
|
+
accumulatedTokens += messageTokens;
|
|
75
|
+
if (accumulatedTokens >= keepRecentTokens) {
|
|
76
|
+
for (let c = 0; c < cutPoints.length; c++) {
|
|
77
|
+
if (cutPoints[c] >= i) {
|
|
78
|
+
cutIndex = cutPoints[c];
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
while (cutIndex > startIndex) {
|
|
86
|
+
const prevEntry = entries[cutIndex - 1];
|
|
87
|
+
if (prevEntry.type === "compaction") {
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
if (prevEntry.type === "message") {
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
cutIndex--;
|
|
94
|
+
}
|
|
95
|
+
const cutEntry = entries[cutIndex];
|
|
96
|
+
const isUserMessage = cutEntry.type === "message" && cutEntry.message.role === "user";
|
|
97
|
+
const turnStartIndex = isUserMessage
|
|
98
|
+
? -1
|
|
99
|
+
: findTurnStartIndex(entries, cutIndex, startIndex);
|
|
100
|
+
return {
|
|
101
|
+
firstKeptEntryIndex: cutIndex,
|
|
102
|
+
turnStartIndex,
|
|
103
|
+
isSplitTurn: !isUserMessage && turnStartIndex !== -1,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=cut-points.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cut-points.js","sourceRoot":"","sources":["../../../src/harness/compaction/cut-points.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overflow.d.ts","sourceRoot":"","sources":["../../../src/harness/compaction/overflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAoC9D,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,gBAAgB,EACzB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CA8BT"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
const OVERFLOW_PATTERNS = [
|
|
2
|
+
/prompt is too long/i,
|
|
3
|
+
/request_too_large/i,
|
|
4
|
+
/input is too long for requested model/i,
|
|
5
|
+
/exceeds the context window/i,
|
|
6
|
+
/exceeds (?:the )?(?:model'?s )?maximum context length of [\d,]+ tokens?/i,
|
|
7
|
+
/input token count.*exceeds the maximum/i,
|
|
8
|
+
/maximum prompt length is \d+/i,
|
|
9
|
+
/reduce the length of the messages/i,
|
|
10
|
+
/maximum context length is [\d,]+ tokens/i,
|
|
11
|
+
/exceeds (?:the )?maximum allowed input length of [\d,]+ tokens?/i,
|
|
12
|
+
/input \([\d,]+ tokens\) is longer than the model'?s context length \([\d,]+ tokens\)/i,
|
|
13
|
+
/exceeds the limit of [\d,]+/i,
|
|
14
|
+
/exceeds the available context size/i,
|
|
15
|
+
/greater than the context length/i,
|
|
16
|
+
/context window exceeds limit/i,
|
|
17
|
+
/exceeded model token limit/i,
|
|
18
|
+
/too large for model with [\d,]+ maximum context length/i,
|
|
19
|
+
/model_context_window_exceeded/i,
|
|
20
|
+
/prompt too long; exceeded (?:max )?context length/i,
|
|
21
|
+
/context[_ ]length[_ ]exceeded/i,
|
|
22
|
+
/too many tokens/i,
|
|
23
|
+
/token limit exceeded/i,
|
|
24
|
+
/^4(?:00|13)\s*(?:status code)?\s*\(no body\)/i,
|
|
25
|
+
];
|
|
26
|
+
const NON_OVERFLOW_PATTERNS = [
|
|
27
|
+
/^(Throttling error|Service unavailable):/i,
|
|
28
|
+
/rate limit/i,
|
|
29
|
+
/too many requests/i,
|
|
30
|
+
/throttling/i,
|
|
31
|
+
/service unavailable/i,
|
|
32
|
+
];
|
|
33
|
+
export function isContextOverflowAssistantMessage(message, contextWindow) {
|
|
34
|
+
if (message.stopReason === "error" && message.errorMessage) {
|
|
35
|
+
const isNonOverflow = NON_OVERFLOW_PATTERNS.some((pattern) => pattern.test(message.errorMessage ?? ""));
|
|
36
|
+
if (!isNonOverflow &&
|
|
37
|
+
OVERFLOW_PATTERNS.some((pattern) => pattern.test(message.errorMessage ?? ""))) {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (contextWindow && contextWindow > 0) {
|
|
42
|
+
const inputTokens = message.usage.input + message.usage.cacheRead;
|
|
43
|
+
if (message.stopReason === "stop" && inputTokens > contextWindow) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
if (message.stopReason === "length" &&
|
|
47
|
+
message.usage.output === 0 &&
|
|
48
|
+
inputTokens >= contextWindow * 0.99) {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=overflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overflow.js","sourceRoot":"","sources":["../../../src/harness/compaction/overflow.ts"],"names":[],"mappings":"AAEA,MAAM,iBAAiB,GAAG;IACxB,qBAAqB;IACrB,oBAAoB;IACpB,wCAAwC;IACxC,6BAA6B;IAC7B,0EAA0E;IAC1E,yCAAyC;IACzC,+BAA+B;IAC/B,oCAAoC;IACpC,0CAA0C;IAC1C,kEAAkE;IAClE,uFAAuF;IACvF,8BAA8B;IAC9B,qCAAqC;IACrC,kCAAkC;IAClC,+BAA+B;IAC/B,6BAA6B;IAC7B,yDAAyD;IACzD,gCAAgC;IAChC,oDAAoD;IACpD,gCAAgC;IAChC,kBAAkB;IAClB,uBAAuB;IACvB,+CAA+C;CAChD,CAAC;AAEF,MAAM,qBAAqB,GAAG;IAC5B,2CAA2C;IAC3C,aAAa;IACb,oBAAoB;IACpB,aAAa;IACb,sBAAsB;CACvB,CAAC;AAEF,MAAM,UAAU,iCAAiC,CAC/C,OAAyB,EACzB,aAAsB;IAEtB,IAAI,OAAO,CAAC,UAAU,KAAK,OAAO,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QAC3D,MAAM,aAAa,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAC3D,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CACzC,CAAC;QACF,IACE,CAAC,aAAa;YACd,iBAAiB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CACjC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CACzC,EACD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,IAAI,aAAa,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QACvC,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;QAClE,IAAI,OAAO,CAAC,UAAU,KAAK,MAAM,IAAI,WAAW,GAAG,aAAa,EAAE,CAAC;YACjE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IACE,OAAO,CAAC,UAAU,KAAK,QAAQ;YAC/B,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAC1B,WAAW,IAAI,aAAa,GAAG,IAAI,EACnC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AutoCompactionPolicy, CompactionSettings } from "./types.js";
|
|
2
|
+
/** Default compaction settings used by the harness. */
|
|
3
|
+
export declare const DEFAULT_COMPACTION_SETTINGS: CompactionSettings;
|
|
4
|
+
export declare function deriveAutoCompactionPolicy(contextWindow: number, enabled?: boolean): AutoCompactionPolicy;
|
|
5
|
+
export declare function shouldAutoCompact(contextTokens: number | null | undefined, policy: AutoCompactionPolicy): boolean;
|
|
6
|
+
/** Return whether context usage exceeds the configured compaction threshold. */
|
|
7
|
+
export declare function shouldCompact(contextTokens: number, contextWindow: number, settings: CompactionSettings): boolean;
|
|
8
|
+
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../src/harness/compaction/policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE3E,uDAAuD;AACvD,eAAO,MAAM,2BAA2B,EAAE,kBAIzC,CAAC;AAYF,wBAAgB,0BAA0B,CACxC,aAAa,EAAE,MAAM,EACrB,OAAO,UAAO,GACb,oBAAoB,CAsCtB;AAED,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACxC,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAWT;AAED,gFAAgF;AAChF,wBAAgB,aAAa,CAC3B,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,kBAAkB,GAC3B,OAAO,CAGT"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/** Default compaction settings used by the harness. */
|
|
2
|
+
export const DEFAULT_COMPACTION_SETTINGS = {
|
|
3
|
+
enabled: true,
|
|
4
|
+
reserveTokens: 16384,
|
|
5
|
+
keepRecentTokens: 20000,
|
|
6
|
+
};
|
|
7
|
+
const AUTO_COMPACTION_THRESHOLD_PERCENT = 90;
|
|
8
|
+
const AUTO_COMPACTION_KEEP_RECENT_PERCENT = 10;
|
|
9
|
+
const AUTO_COMPACTION_MIN_KEEP_RECENT_TOKENS = 4_000;
|
|
10
|
+
const AUTO_COMPACTION_MAX_KEEP_RECENT_TOKENS = 50_000;
|
|
11
|
+
const AUTO_COMPACTION_SUMMARY_RESERVE_TOKENS = 16_384;
|
|
12
|
+
function clamp(value, min, max) {
|
|
13
|
+
return Math.min(Math.max(value, min), max);
|
|
14
|
+
}
|
|
15
|
+
export function deriveAutoCompactionPolicy(contextWindow, enabled = true) {
|
|
16
|
+
const normalizedWindow = Number.isFinite(contextWindow)
|
|
17
|
+
? Math.max(0, Math.floor(contextWindow))
|
|
18
|
+
: 0;
|
|
19
|
+
if (normalizedWindow <= 0) {
|
|
20
|
+
return {
|
|
21
|
+
enabled,
|
|
22
|
+
contextWindow: 0,
|
|
23
|
+
thresholdPercent: AUTO_COMPACTION_THRESHOLD_PERCENT,
|
|
24
|
+
thresholdTokens: 0,
|
|
25
|
+
triggerReserveTokens: 0,
|
|
26
|
+
keepRecentTokens: 0,
|
|
27
|
+
summaryReserveTokens: AUTO_COMPACTION_SUMMARY_RESERVE_TOKENS,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const thresholdTokens = Math.floor(normalizedWindow * (AUTO_COMPACTION_THRESHOLD_PERCENT / 100));
|
|
31
|
+
const maxKeepRecentTokens = Math.min(AUTO_COMPACTION_MAX_KEEP_RECENT_TOKENS, Math.floor(normalizedWindow * 0.5));
|
|
32
|
+
const keepRecentTokens = clamp(Math.floor(normalizedWindow * (AUTO_COMPACTION_KEEP_RECENT_PERCENT / 100)), Math.min(AUTO_COMPACTION_MIN_KEEP_RECENT_TOKENS, maxKeepRecentTokens), maxKeepRecentTokens);
|
|
33
|
+
return {
|
|
34
|
+
enabled,
|
|
35
|
+
contextWindow: normalizedWindow,
|
|
36
|
+
thresholdPercent: AUTO_COMPACTION_THRESHOLD_PERCENT,
|
|
37
|
+
thresholdTokens,
|
|
38
|
+
triggerReserveTokens: Math.max(0, normalizedWindow - thresholdTokens),
|
|
39
|
+
keepRecentTokens,
|
|
40
|
+
summaryReserveTokens: AUTO_COMPACTION_SUMMARY_RESERVE_TOKENS,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export function shouldAutoCompact(contextTokens, policy) {
|
|
44
|
+
if (!policy.enabled ||
|
|
45
|
+
policy.contextWindow <= 0 ||
|
|
46
|
+
policy.thresholdTokens <= 0) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
return (typeof contextTokens === "number" && contextTokens >= policy.thresholdTokens);
|
|
50
|
+
}
|
|
51
|
+
/** Return whether context usage exceeds the configured compaction threshold. */
|
|
52
|
+
export function shouldCompact(contextTokens, contextWindow, settings) {
|
|
53
|
+
if (!settings.enabled || contextWindow <= 0)
|
|
54
|
+
return false;
|
|
55
|
+
return contextTokens > contextWindow - settings.reserveTokens;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/harness/compaction/policy.ts"],"names":[],"mappings":"AAEA,uDAAuD;AACvD,MAAM,CAAC,MAAM,2BAA2B,GAAuB;IAC7D,OAAO,EAAE,IAAI;IACb,aAAa,EAAE,KAAK;IACpB,gBAAgB,EAAE,KAAK;CACxB,CAAC;AAEF,MAAM,iCAAiC,GAAG,EAAE,CAAC;AAC7C,MAAM,mCAAmC,GAAG,EAAE,CAAC;AAC/C,MAAM,sCAAsC,GAAG,KAAK,CAAC;AACrD,MAAM,sCAAsC,GAAG,MAAM,CAAC;AACtD,MAAM,sCAAsC,GAAG,MAAM,CAAC;AAEtD,SAAS,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;IACpD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,aAAqB,EACrB,OAAO,GAAG,IAAI;IAEd,MAAM,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC;QACrD,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC,CAAC;IACN,IAAI,gBAAgB,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,OAAO;YACP,aAAa,EAAE,CAAC;YAChB,gBAAgB,EAAE,iCAAiC;YACnD,eAAe,EAAE,CAAC;YAClB,oBAAoB,EAAE,CAAC;YACvB,gBAAgB,EAAE,CAAC;YACnB,oBAAoB,EAAE,sCAAsC;SAC7D,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAChC,gBAAgB,GAAG,CAAC,iCAAiC,GAAG,GAAG,CAAC,CAC7D,CAAC;IACF,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAClC,sCAAsC,EACtC,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,GAAG,CAAC,CACnC,CAAC;IACF,MAAM,gBAAgB,GAAG,KAAK,CAC5B,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,mCAAmC,GAAG,GAAG,CAAC,CAAC,EAC1E,IAAI,CAAC,GAAG,CAAC,sCAAsC,EAAE,mBAAmB,CAAC,EACrE,mBAAmB,CACpB,CAAC;IAEF,OAAO;QACL,OAAO;QACP,aAAa,EAAE,gBAAgB;QAC/B,gBAAgB,EAAE,iCAAiC;QACnD,eAAe;QACf,oBAAoB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,gBAAgB,GAAG,eAAe,CAAC;QACrE,gBAAgB;QAChB,oBAAoB,EAAE,sCAAsC;KAC7D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,aAAwC,EACxC,MAA4B;IAE5B,IACE,CAAC,MAAM,CAAC,OAAO;QACf,MAAM,CAAC,aAAa,IAAI,CAAC;QACzB,MAAM,CAAC,eAAe,IAAI,CAAC,EAC3B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,CACL,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,IAAI,MAAM,CAAC,eAAe,CAC7E,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,aAAa,CAC3B,aAAqB,EACrB,aAAqB,EACrB,QAA4B;IAE5B,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,aAAa,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1D,OAAO,aAAa,GAAG,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { AgentMessage } from "../../types.js";
|
|
2
|
+
import type { FileOperations } from "./utils.js";
|
|
3
|
+
/** File-operation details stored on generated compaction entries. */
|
|
4
|
+
export interface CompactionDetails {
|
|
5
|
+
/** Files read in the compacted history. */
|
|
6
|
+
readFiles: string[];
|
|
7
|
+
/** Files modified in the compacted history. */
|
|
8
|
+
modifiedFiles: string[];
|
|
9
|
+
}
|
|
10
|
+
/** Generated compaction data ready to be persisted as a compaction entry. */
|
|
11
|
+
export interface CompactionResult<T = unknown> {
|
|
12
|
+
/** Summary text that replaces compacted history in future context. */
|
|
13
|
+
summary: string;
|
|
14
|
+
/** Entry id where retained history starts. */
|
|
15
|
+
firstKeptEntryId: string;
|
|
16
|
+
/** Estimated context tokens before compaction. */
|
|
17
|
+
tokensBefore: number;
|
|
18
|
+
/** Optional implementation-specific details stored with the compaction entry. */
|
|
19
|
+
details?: T;
|
|
20
|
+
}
|
|
21
|
+
/** Compaction thresholds and retention settings. */
|
|
22
|
+
export interface CompactionSettings {
|
|
23
|
+
/** Enable automatic compaction decisions. */
|
|
24
|
+
enabled: boolean;
|
|
25
|
+
/** Tokens reserved for summary prompt and output. */
|
|
26
|
+
reserveTokens: number;
|
|
27
|
+
/** Approximate recent-context tokens to keep after compaction. */
|
|
28
|
+
keepRecentTokens: number;
|
|
29
|
+
}
|
|
30
|
+
export type AutoCompactionReason = "threshold" | "overflow" | "manual";
|
|
31
|
+
export interface AutoCompactionPolicy {
|
|
32
|
+
enabled: boolean;
|
|
33
|
+
contextWindow: number;
|
|
34
|
+
thresholdPercent: number;
|
|
35
|
+
thresholdTokens: number;
|
|
36
|
+
triggerReserveTokens: number;
|
|
37
|
+
keepRecentTokens: number;
|
|
38
|
+
summaryReserveTokens: number;
|
|
39
|
+
}
|
|
40
|
+
/** Estimated context-token usage for a message list. */
|
|
41
|
+
export interface ContextUsageEstimate {
|
|
42
|
+
/** Estimated total context tokens. */
|
|
43
|
+
tokens: number;
|
|
44
|
+
/** Tokens reported by the most recent assistant usage block. */
|
|
45
|
+
usageTokens: number;
|
|
46
|
+
/** Estimated tokens after the most recent assistant usage block. */
|
|
47
|
+
trailingTokens: number;
|
|
48
|
+
/** Index of the message that provided usage, or null when none exists. */
|
|
49
|
+
lastUsageIndex: number | null;
|
|
50
|
+
}
|
|
51
|
+
/** Cut point selected for compaction. */
|
|
52
|
+
export interface CutPointResult {
|
|
53
|
+
/** Index of the first entry retained after compaction. */
|
|
54
|
+
firstKeptEntryIndex: number;
|
|
55
|
+
/** Index of the turn-start entry when the cut splits a turn, otherwise -1. */
|
|
56
|
+
turnStartIndex: number;
|
|
57
|
+
/** Whether the selected cut point splits an in-progress turn. */
|
|
58
|
+
isSplitTurn: boolean;
|
|
59
|
+
}
|
|
60
|
+
/** Prepared inputs for a compaction run. */
|
|
61
|
+
export interface CompactionPreparation {
|
|
62
|
+
/** Entry id where retained history starts. */
|
|
63
|
+
firstKeptEntryId: string;
|
|
64
|
+
/** Messages summarized into the history summary. */
|
|
65
|
+
messagesToSummarize: AgentMessage[];
|
|
66
|
+
/** Prefix messages summarized separately when compaction splits a turn. */
|
|
67
|
+
turnPrefixMessages: AgentMessage[];
|
|
68
|
+
/** Whether compaction splits a turn. */
|
|
69
|
+
isSplitTurn: boolean;
|
|
70
|
+
/** Estimated context tokens before compaction. */
|
|
71
|
+
tokensBefore: number;
|
|
72
|
+
/** Previous compaction summary used for iterative updates. */
|
|
73
|
+
previousSummary?: string;
|
|
74
|
+
/** File operations extracted from summarized history. */
|
|
75
|
+
fileOps: FileOperations;
|
|
76
|
+
/** Settings used to prepare compaction. */
|
|
77
|
+
settings: CompactionSettings;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/harness/compaction/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,qEAAqE;AACrE,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,+CAA+C;IAC/C,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,6EAA6E;AAC7E,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,OAAO;IAC3C,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,gBAAgB,EAAE,MAAM,CAAC;IACzB,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,OAAO,CAAC,EAAE,CAAC,CAAC;CACb;AAED,oDAAoD;AACpD,MAAM,WAAW,kBAAkB;IACjC,6CAA6C;IAC7C,OAAO,EAAE,OAAO,CAAC;IACjB,qDAAqD;IACrD,aAAa,EAAE,MAAM,CAAC;IACtB,kEAAkE;IAClE,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEvE,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,wDAAwD;AACxD,MAAM,WAAW,oBAAoB;IACnC,sCAAsC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,cAAc,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,yCAAyC;AACzC,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,mBAAmB,EAAE,MAAM,CAAC;IAC5B,8EAA8E;IAC9E,cAAc,EAAE,MAAM,CAAC;IACvB,iEAAiE;IACjE,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,4CAA4C;AAC5C,MAAM,WAAW,qBAAqB;IACpC,8CAA8C;IAC9C,gBAAgB,EAAE,MAAM,CAAC;IACzB,oDAAoD;IACpD,mBAAmB,EAAE,YAAY,EAAE,CAAC;IACpC,2EAA2E;IAC3E,kBAAkB,EAAE,YAAY,EAAE,CAAC;IACnC,wCAAwC;IACxC,WAAW,EAAE,OAAO,CAAC;IACrB,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,OAAO,EAAE,cAAc,CAAC;IACxB,2CAA2C;IAC3C,QAAQ,EAAE,kBAAkB,CAAC;CAC9B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/harness/compaction/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Usage } from "@earendil-works/pi-ai";
|
|
2
|
+
import type { ContextUsage } from "@nervekit/shared";
|
|
3
|
+
import type { AgentMessage } from "../../types.js";
|
|
4
|
+
import type { CompactionEntry, ConversationTreeEntry } from "../conversation/entries.js";
|
|
5
|
+
import type { ContextUsageEstimate } from "./types.js";
|
|
6
|
+
/** Calculate total context tokens from provider usage. */
|
|
7
|
+
export declare function calculateContextTokens(usage: Usage): number;
|
|
8
|
+
/** Return usage from the last successful assistant message in conversation entries. */
|
|
9
|
+
export declare function getLastAssistantUsage(entries: ConversationTreeEntry[]): Usage | undefined;
|
|
10
|
+
/** Estimate context tokens for messages using provider usage when available. */
|
|
11
|
+
export declare function estimateContextTokens(messages: AgentMessage[]): ContextUsageEstimate;
|
|
12
|
+
/** Return the most recent compaction entry in a branch, if any. */
|
|
13
|
+
export declare function getLatestCompactionEntry(entries: ConversationTreeEntry[]): CompactionEntry | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* Compute compaction-aware context-window usage.
|
|
16
|
+
*
|
|
17
|
+
* Mirrors pi's `AgentConversation.getContextUsage()`:
|
|
18
|
+
* - `contextWindow <= 0` -> usage unknown (`tokens`/`percent` null).
|
|
19
|
+
* - After the latest compaction, usage is unknown until a fresh, non-aborted
|
|
20
|
+
* assistant response provides usage again.
|
|
21
|
+
* - Otherwise estimate from messages and report a percentage of the window.
|
|
22
|
+
*
|
|
23
|
+
* @param messages Reconstructed branch messages (e.g. from `buildConversationContext`).
|
|
24
|
+
* @param branchEntries Raw branch entries used to detect the compaction boundary.
|
|
25
|
+
* @param contextWindow The selected model's context window (0 when unknown).
|
|
26
|
+
*/
|
|
27
|
+
export declare function computeContextUsage(messages: AgentMessage[], branchEntries: ConversationTreeEntry[], contextWindow: number): ContextUsage;
|
|
28
|
+
/** Estimate token count for one message using a conservative character heuristic. */
|
|
29
|
+
export declare function estimateTokens(message: AgentMessage): number;
|
|
30
|
+
//# sourceMappingURL=usage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../../src/harness/compaction/usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EACtB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAUvD,0DAA0D;AAC1D,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAK3D;AAgBD,uFAAuF;AACvF,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,qBAAqB,EAAE,GAC/B,KAAK,GAAG,SAAS,CASnB;AAYD,gFAAgF;AAChF,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,YAAY,EAAE,GACvB,oBAAoB,CA4BtB;AAED,mEAAmE;AACnE,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,qBAAqB,EAAE,GAC/B,eAAe,GAAG,SAAS,CAM7B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,YAAY,EAAE,EACxB,aAAa,EAAE,qBAAqB,EAAE,EACtC,aAAa,EAAE,MAAM,GACpB,YAAY,CA2Bd;AAsBD,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CA6C5D"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
function safeJsonStringify(value) {
|
|
2
|
+
try {
|
|
3
|
+
return JSON.stringify(value) ?? "undefined";
|
|
4
|
+
}
|
|
5
|
+
catch {
|
|
6
|
+
return "[unserializable]";
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
/** Calculate total context tokens from provider usage. */
|
|
10
|
+
export function calculateContextTokens(usage) {
|
|
11
|
+
return (usage.totalTokens ||
|
|
12
|
+
usage.input + usage.output + usage.cacheRead + usage.cacheWrite);
|
|
13
|
+
}
|
|
14
|
+
function getAssistantUsage(msg) {
|
|
15
|
+
if (msg.role === "assistant" && "usage" in msg) {
|
|
16
|
+
const assistantMsg = msg;
|
|
17
|
+
if (assistantMsg.stopReason !== "aborted" &&
|
|
18
|
+
assistantMsg.stopReason !== "error" &&
|
|
19
|
+
assistantMsg.usage) {
|
|
20
|
+
return assistantMsg.usage;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
/** Return usage from the last successful assistant message in conversation entries. */
|
|
26
|
+
export function getLastAssistantUsage(entries) {
|
|
27
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
28
|
+
const entry = entries[i];
|
|
29
|
+
if (entry.type === "message") {
|
|
30
|
+
const usage = getAssistantUsage(entry.message);
|
|
31
|
+
if (usage)
|
|
32
|
+
return usage;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
function getLastAssistantUsageInfo(messages) {
|
|
38
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
39
|
+
const usage = getAssistantUsage(messages[i]);
|
|
40
|
+
if (usage)
|
|
41
|
+
return { usage, index: i };
|
|
42
|
+
}
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
/** Estimate context tokens for messages using provider usage when available. */
|
|
46
|
+
export function estimateContextTokens(messages) {
|
|
47
|
+
const usageInfo = getLastAssistantUsageInfo(messages);
|
|
48
|
+
if (!usageInfo) {
|
|
49
|
+
let estimated = 0;
|
|
50
|
+
for (const message of messages) {
|
|
51
|
+
estimated += estimateTokens(message);
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
tokens: estimated,
|
|
55
|
+
usageTokens: 0,
|
|
56
|
+
trailingTokens: estimated,
|
|
57
|
+
lastUsageIndex: null,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const usageTokens = calculateContextTokens(usageInfo.usage);
|
|
61
|
+
let trailingTokens = 0;
|
|
62
|
+
for (let i = usageInfo.index + 1; i < messages.length; i++) {
|
|
63
|
+
trailingTokens += estimateTokens(messages[i]);
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
tokens: usageTokens + trailingTokens,
|
|
67
|
+
usageTokens,
|
|
68
|
+
trailingTokens,
|
|
69
|
+
lastUsageIndex: usageInfo.index,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/** Return the most recent compaction entry in a branch, if any. */
|
|
73
|
+
export function getLatestCompactionEntry(entries) {
|
|
74
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
75
|
+
const entry = entries[i];
|
|
76
|
+
if (entry.type === "compaction")
|
|
77
|
+
return entry;
|
|
78
|
+
}
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Compute compaction-aware context-window usage.
|
|
83
|
+
*
|
|
84
|
+
* Mirrors pi's `AgentConversation.getContextUsage()`:
|
|
85
|
+
* - `contextWindow <= 0` -> usage unknown (`tokens`/`percent` null).
|
|
86
|
+
* - After the latest compaction, usage is unknown until a fresh, non-aborted
|
|
87
|
+
* assistant response provides usage again.
|
|
88
|
+
* - Otherwise estimate from messages and report a percentage of the window.
|
|
89
|
+
*
|
|
90
|
+
* @param messages Reconstructed branch messages (e.g. from `buildConversationContext`).
|
|
91
|
+
* @param branchEntries Raw branch entries used to detect the compaction boundary.
|
|
92
|
+
* @param contextWindow The selected model's context window (0 when unknown).
|
|
93
|
+
*/
|
|
94
|
+
export function computeContextUsage(messages, branchEntries, contextWindow) {
|
|
95
|
+
if (contextWindow <= 0) {
|
|
96
|
+
return { tokens: null, contextWindow: 0, percent: null };
|
|
97
|
+
}
|
|
98
|
+
const latestCompaction = getLatestCompactionEntry(branchEntries);
|
|
99
|
+
if (latestCompaction) {
|
|
100
|
+
const compactionIndex = branchEntries.lastIndexOf(latestCompaction);
|
|
101
|
+
let hasPostCompactionUsage = false;
|
|
102
|
+
for (let i = branchEntries.length - 1; i > compactionIndex; i--) {
|
|
103
|
+
const entry = branchEntries[i];
|
|
104
|
+
if (entry.type === "message") {
|
|
105
|
+
const usage = getAssistantUsage(entry.message);
|
|
106
|
+
if (usage) {
|
|
107
|
+
hasPostCompactionUsage = calculateContextTokens(usage) > 0;
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (!hasPostCompactionUsage) {
|
|
113
|
+
return { tokens: null, contextWindow, percent: null };
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const estimate = estimateContextTokens(messages);
|
|
117
|
+
const percent = (estimate.tokens / contextWindow) * 100;
|
|
118
|
+
return { tokens: estimate.tokens, contextWindow, percent };
|
|
119
|
+
}
|
|
120
|
+
const ESTIMATED_IMAGE_CHARS = 4800;
|
|
121
|
+
function estimateTextAndImageContentChars(content) {
|
|
122
|
+
if (typeof content === "string") {
|
|
123
|
+
return content.length;
|
|
124
|
+
}
|
|
125
|
+
let chars = 0;
|
|
126
|
+
for (const block of content) {
|
|
127
|
+
if (block.type === "text" && block.text) {
|
|
128
|
+
chars += block.text.length;
|
|
129
|
+
}
|
|
130
|
+
else if (block.type === "image") {
|
|
131
|
+
chars += ESTIMATED_IMAGE_CHARS;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return chars;
|
|
135
|
+
}
|
|
136
|
+
/** Estimate token count for one message using a conservative character heuristic. */
|
|
137
|
+
export function estimateTokens(message) {
|
|
138
|
+
let chars = 0;
|
|
139
|
+
switch (message.role) {
|
|
140
|
+
case "user": {
|
|
141
|
+
chars = estimateTextAndImageContentChars(message.content);
|
|
142
|
+
return Math.ceil(chars / 4);
|
|
143
|
+
}
|
|
144
|
+
case "assistant": {
|
|
145
|
+
const assistant = message;
|
|
146
|
+
for (const block of assistant.content) {
|
|
147
|
+
if (block.type === "text") {
|
|
148
|
+
chars += block.text.length;
|
|
149
|
+
}
|
|
150
|
+
else if (block.type === "thinking") {
|
|
151
|
+
chars += block.thinking.length;
|
|
152
|
+
}
|
|
153
|
+
else if (block.type === "toolCall") {
|
|
154
|
+
chars +=
|
|
155
|
+
block.name.length + safeJsonStringify(block.arguments).length;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return Math.ceil(chars / 4);
|
|
159
|
+
}
|
|
160
|
+
case "custom":
|
|
161
|
+
case "toolResult": {
|
|
162
|
+
chars = estimateTextAndImageContentChars(message.content);
|
|
163
|
+
return Math.ceil(chars / 4);
|
|
164
|
+
}
|
|
165
|
+
case "bashExecution": {
|
|
166
|
+
chars = message.command.length + message.output.length;
|
|
167
|
+
return Math.ceil(chars / 4);
|
|
168
|
+
}
|
|
169
|
+
case "branchSummary":
|
|
170
|
+
case "compactionSummary": {
|
|
171
|
+
chars = message.summary.length;
|
|
172
|
+
return Math.ceil(chars / 4);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return 0;
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../src/harness/compaction/usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Message } from "@earendil-works/pi-ai";
|
|
2
|
+
import type { AgentMessage } from "../../types.js";
|
|
3
|
+
/** File paths touched by a conversation branch or compaction range. */
|
|
4
|
+
export interface FileOperations {
|
|
5
|
+
/** Files read but not necessarily modified. */
|
|
6
|
+
read: Set<string>;
|
|
7
|
+
/** Files written by full-file write operations. */
|
|
8
|
+
written: Set<string>;
|
|
9
|
+
/** Files modified by edit operations. */
|
|
10
|
+
edited: Set<string>;
|
|
11
|
+
}
|
|
12
|
+
/** Create an empty file-operation accumulator. */
|
|
13
|
+
export declare function createFileOps(): FileOperations;
|
|
14
|
+
/** Add file operations from assistant tool calls to an accumulator. */
|
|
15
|
+
export declare function extractFileOpsFromMessage(message: AgentMessage, fileOps: FileOperations): void;
|
|
16
|
+
/** Compute sorted read-only and modified file lists from accumulated operations. */
|
|
17
|
+
export declare function computeFileLists(fileOps: FileOperations): {
|
|
18
|
+
readFiles: string[];
|
|
19
|
+
modifiedFiles: string[];
|
|
20
|
+
};
|
|
21
|
+
/** Format file lists as summary metadata tags. */
|
|
22
|
+
export declare function formatFileOperations(readFiles: string[], modifiedFiles: string[]): string;
|
|
23
|
+
/** Serialize LLM messages to plain text for summarization prompts. */
|
|
24
|
+
export declare function serializeConversation(messages: Message[]): string;
|
|
25
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/harness/compaction/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,uEAAuE;AACvE,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClB,mDAAmD;IACnD,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,yCAAyC;IACzC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACrB;AAED,kDAAkD;AAClD,wBAAgB,aAAa,IAAI,cAAc,CAM9C;AAED,uEAAuE;AACvE,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,cAAc,GACtB,IAAI,CA2BN;AAED,oFAAoF;AACpF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG;IACzD,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB,CAKA;AAED,kDAAkD;AAClD,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EAAE,EACnB,aAAa,EAAE,MAAM,EAAE,GACtB,MAAM,CAYR;AAkBD,sEAAsE;AACtE,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAyDjE"}
|