open-multi-agent-kit 0.90.0 → 0.90.3
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/CHANGELOG.md +40 -0
- package/README.md +20 -31
- package/dist/cli/args.d.ts +0 -2
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +1 -7
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-session.d.ts +2 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +41 -5
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/bang-skill-invocation.d.ts +26 -0
- package/dist/core/bang-skill-invocation.d.ts.map +1 -0
- package/dist/core/bang-skill-invocation.js +59 -0
- package/dist/core/bang-skill-invocation.js.map +1 -0
- package/dist/core/compactor.d.ts.map +1 -1
- package/dist/core/compactor.js +0 -3
- package/dist/core/compactor.js.map +1 -1
- package/dist/core/context-budget-governor-v2.d.ts +2 -1
- package/dist/core/context-budget-governor-v2.d.ts.map +1 -1
- package/dist/core/context-budget-governor-v2.js +1 -0
- package/dist/core/context-budget-governor-v2.js.map +1 -1
- package/dist/core/context-budget-headroom-types.d.ts +8 -0
- package/dist/core/context-budget-headroom-types.d.ts.map +1 -1
- package/dist/core/context-budget-headroom-types.js.map +1 -1
- package/dist/core/context-budget-headroom.d.ts +1 -1
- package/dist/core/context-budget-headroom.d.ts.map +1 -1
- package/dist/core/context-budget-headroom.js +17 -4
- package/dist/core/context-budget-headroom.js.map +1 -1
- package/dist/core/context-budget-system-prompt.d.ts +2 -1
- package/dist/core/context-budget-system-prompt.d.ts.map +1 -1
- package/dist/core/context-budget-system-prompt.js +6 -1
- package/dist/core/context-budget-system-prompt.js.map +1 -1
- package/dist/core/context-budget-v2-cache-hash.d.ts +3 -0
- package/dist/core/context-budget-v2-cache-hash.d.ts.map +1 -0
- package/dist/core/context-budget-v2-cache-hash.js +16 -0
- package/dist/core/context-budget-v2-cache-hash.js.map +1 -0
- package/dist/core/context-budget-v2-cache-keys.d.ts +58 -0
- package/dist/core/context-budget-v2-cache-keys.d.ts.map +1 -0
- package/dist/core/context-budget-v2-cache-keys.js +128 -0
- package/dist/core/context-budget-v2-cache-keys.js.map +1 -0
- package/dist/core/context-budget-v2-cache-provider.d.ts +23 -0
- package/dist/core/context-budget-v2-cache-provider.d.ts.map +1 -0
- package/dist/core/context-budget-v2-cache-provider.js +29 -0
- package/dist/core/context-budget-v2-cache-provider.js.map +1 -0
- package/dist/core/context-budget-v2-cache-telemetry.d.ts +36 -0
- package/dist/core/context-budget-v2-cache-telemetry.d.ts.map +1 -0
- package/dist/core/context-budget-v2-cache-telemetry.js +64 -0
- package/dist/core/context-budget-v2-cache-telemetry.js.map +1 -0
- package/dist/core/context-budget-v2-cache-validation.d.ts +36 -0
- package/dist/core/context-budget-v2-cache-validation.d.ts.map +1 -0
- package/dist/core/context-budget-v2-cache-validation.js +98 -0
- package/dist/core/context-budget-v2-cache-validation.js.map +1 -0
- package/dist/core/context-budget-v2-cache.d.ts +36 -0
- package/dist/core/context-budget-v2-cache.d.ts.map +1 -0
- package/dist/core/context-budget-v2-cache.js +50 -0
- package/dist/core/context-budget-v2-cache.js.map +1 -0
- package/dist/core/context-budget-v2-plan-cache-keys.d.ts +16 -0
- package/dist/core/context-budget-v2-plan-cache-keys.d.ts.map +1 -0
- package/dist/core/context-budget-v2-plan-cache-keys.js +49 -0
- package/dist/core/context-budget-v2-plan-cache-keys.js.map +1 -0
- package/dist/core/context-budget-v2-planner.d.ts.map +1 -1
- package/dist/core/context-budget-v2-planner.js +55 -2
- package/dist/core/context-budget-v2-planner.js.map +1 -1
- package/dist/core/context-budget-v2-representation-cache.d.ts +27 -0
- package/dist/core/context-budget-v2-representation-cache.d.ts.map +1 -0
- package/dist/core/context-budget-v2-representation-cache.js +173 -0
- package/dist/core/context-budget-v2-representation-cache.js.map +1 -0
- package/dist/core/context-budget-v2-selection.d.ts +2 -0
- package/dist/core/context-budget-v2-selection.d.ts.map +1 -1
- package/dist/core/context-budget-v2-selection.js +12 -2
- package/dist/core/context-budget-v2-selection.js.map +1 -1
- package/dist/core/context-budget-v2-types.d.ts +107 -1
- package/dist/core/context-budget-v2-types.d.ts.map +1 -1
- package/dist/core/context-budget-v2-types.js.map +1 -1
- package/dist/core/headroom.d.ts.map +1 -1
- package/dist/core/headroom.js +0 -4
- package/dist/core/headroom.js.map +1 -1
- package/dist/core/hook-inventory.d.ts.map +1 -1
- package/dist/core/hook-inventory.js +6 -0
- package/dist/core/hook-inventory.js.map +1 -1
- package/dist/core/mcp-computer-use-presets.d.ts +64 -0
- package/dist/core/mcp-computer-use-presets.d.ts.map +1 -0
- package/dist/core/mcp-computer-use-presets.js +158 -0
- package/dist/core/mcp-computer-use-presets.js.map +1 -0
- package/dist/core/mcp-public-presets.d.ts +578 -0
- package/dist/core/mcp-public-presets.d.ts.map +1 -0
- package/dist/core/mcp-public-presets.js +647 -0
- package/dist/core/mcp-public-presets.js.map +1 -0
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +1 -0
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/pi-package-intake-candidates.d.ts +14 -1
- package/dist/core/pi-package-intake-candidates.d.ts.map +1 -1
- package/dist/core/pi-package-intake-candidates.js +182 -0
- package/dist/core/pi-package-intake-candidates.js.map +1 -1
- package/dist/core/pi-package-intake.d.ts +8 -1
- package/dist/core/pi-package-intake.d.ts.map +1 -1
- package/dist/core/pi-package-intake.js +14 -4
- package/dist/core/pi-package-intake.js.map +1 -1
- package/dist/core/reverse-skill.d.ts +2 -0
- package/dist/core/reverse-skill.d.ts.map +1 -0
- package/dist/core/reverse-skill.js +7 -0
- package/dist/core/reverse-skill.js.map +1 -0
- package/dist/core/settings-manager.d.ts +3 -3
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/system-prompt.d.ts +2 -0
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +58 -5
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/migrations.d.ts +19 -0
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +39 -15
- package/dist/migrations.js.map +1 -1
- package/dist/modes/interactive/components/control-panel-box.d.ts +3 -3
- package/dist/modes/interactive/components/control-panel-box.d.ts.map +1 -1
- package/dist/modes/interactive/components/control-panel-box.js +10 -10
- package/dist/modes/interactive/components/control-panel-box.js.map +1 -1
- package/dist/modes/interactive/components/control-panel-gradient-motion.d.ts.map +1 -1
- package/dist/modes/interactive/components/control-panel-gradient-motion.js +2 -1
- package/dist/modes/interactive/components/control-panel-gradient-motion.js.map +1 -1
- package/dist/modes/interactive/components/control-panel-layout.d.ts +15 -1
- package/dist/modes/interactive/components/control-panel-layout.d.ts.map +1 -1
- package/dist/modes/interactive/components/control-panel-layout.js +212 -68
- package/dist/modes/interactive/components/control-panel-layout.js.map +1 -1
- package/dist/modes/interactive/components/control-panel-runtime-status.d.ts.map +1 -1
- package/dist/modes/interactive/components/control-panel-runtime-status.js +10 -0
- package/dist/modes/interactive/components/control-panel-runtime-status.js.map +1 -1
- package/dist/modes/interactive/components/control-panel-sparkles.d.ts +27 -0
- package/dist/modes/interactive/components/control-panel-sparkles.d.ts.map +1 -0
- package/dist/modes/interactive/components/control-panel-sparkles.js +42 -0
- package/dist/modes/interactive/components/control-panel-sparkles.js.map +1 -0
- package/dist/modes/interactive/components/control-panel.d.ts +8 -0
- package/dist/modes/interactive/components/control-panel.d.ts.map +1 -1
- package/dist/modes/interactive/components/control-panel.js +40 -8
- package/dist/modes/interactive/components/control-panel.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +2 -1
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +2 -1
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +63 -14
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +2 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/docs/skills.md +8 -4
- package/docs/usage.md +4 -3
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/preset.ts +2 -2
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +27 -34
- package/package.json +5 -5
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface BangSkillRegistry {
|
|
2
|
+
hasSkill(name: string): boolean;
|
|
3
|
+
}
|
|
4
|
+
export type BangInvocation = {
|
|
5
|
+
kind: "plain";
|
|
6
|
+
prompt: string;
|
|
7
|
+
} | {
|
|
8
|
+
kind: "empty";
|
|
9
|
+
} | {
|
|
10
|
+
kind: "bash";
|
|
11
|
+
command: string;
|
|
12
|
+
includeContext: boolean;
|
|
13
|
+
} | {
|
|
14
|
+
kind: "skill";
|
|
15
|
+
skillName: string;
|
|
16
|
+
prompt: string;
|
|
17
|
+
activeSkillNames: readonly string[];
|
|
18
|
+
source: "bang";
|
|
19
|
+
} | {
|
|
20
|
+
kind: "unknownSkill";
|
|
21
|
+
skillName: string;
|
|
22
|
+
prompt: string;
|
|
23
|
+
source: "bang";
|
|
24
|
+
};
|
|
25
|
+
export declare function parseBangInvocation(input: string, registry: BangSkillRegistry): BangInvocation;
|
|
26
|
+
//# sourceMappingURL=bang-skill-invocation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bang-skill-invocation.d.ts","sourceRoot":"","sources":["../../src/core/bang-skill-invocation.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CAChC;AAED,MAAM,MAAM,cAAc,GACvB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,OAAO,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzG;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,cAAc,CAuD9F","sourcesContent":["export interface BangSkillRegistry {\n\thasSkill(name: string): boolean;\n}\n\nexport type BangInvocation =\n\t| { kind: \"plain\"; prompt: string }\n\t| { kind: \"empty\" }\n\t| { kind: \"bash\"; command: string; includeContext: boolean }\n\t| { kind: \"skill\"; skillName: string; prompt: string; activeSkillNames: readonly string[]; source: \"bang\" }\n\t| { kind: \"unknownSkill\"; skillName: string; prompt: string; source: \"bang\" };\n\nexport function parseBangInvocation(input: string, registry: BangSkillRegistry): BangInvocation {\n\tif (!input.startsWith(\"!\")) {\n\t\treturn { kind: \"plain\", prompt: input };\n\t}\n\n\tif (input.startsWith(\"!!\")) {\n\t\tconst command = input.slice(2).trim();\n\t\treturn command ? { kind: \"bash\", command, includeContext: false } : { kind: \"empty\" };\n\t}\n\n\tconst second = input[1];\n\tif (second === undefined) {\n\t\treturn { kind: \"plain\", prompt: input };\n\t}\n\n\tif (/\\s/.test(second)) {\n\t\tconst command = input.slice(2).trim();\n\t\treturn command ? { kind: \"bash\", command, includeContext: true } : { kind: \"empty\" };\n\t}\n\n\tconst body = input.slice(1);\n\tif (body.startsWith(\"skill:\")) {\n\t\tconst explicit = body.slice(\"skill:\".length);\n\t\tconst { token: skillName, rest } = splitFirstToken(explicit);\n\t\tif (!skillName) {\n\t\t\treturn { kind: \"plain\", prompt: input };\n\t\t}\n\t\tif (!registry.hasSkill(skillName)) {\n\t\t\treturn { kind: \"unknownSkill\", skillName, prompt: rest, source: \"bang\" };\n\t\t}\n\t\treturn {\n\t\t\tkind: \"skill\",\n\t\t\tskillName,\n\t\t\tprompt: rest,\n\t\t\tactiveSkillNames: [skillName],\n\t\t\tsource: \"bang\",\n\t\t};\n\t}\n\n\tconst { token: skillName, rest } = splitFirstToken(body);\n\tif (!skillName) {\n\t\treturn { kind: \"plain\", prompt: input };\n\t}\n\tif (registry.hasSkill(skillName)) {\n\t\treturn {\n\t\t\tkind: \"skill\",\n\t\t\tskillName,\n\t\t\tprompt: rest,\n\t\t\tactiveSkillNames: [skillName],\n\t\t\tsource: \"bang\",\n\t\t};\n\t}\n\n\tconst command = body.trim();\n\treturn command ? { kind: \"bash\", command, includeContext: true } : { kind: \"empty\" };\n}\n\nfunction splitFirstToken(input: string): { token: string; rest: string } {\n\tconst trimmed = input.trimStart();\n\tconst match = /^([^\\s]+)(?:\\s+([\\s\\S]*))?$/.exec(trimmed);\n\tif (!match) {\n\t\treturn { token: \"\", rest: \"\" };\n\t}\n\treturn { token: match[1] ?? \"\", rest: match[2]?.trimStart() ?? \"\" };\n}\n"]}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export function parseBangInvocation(input, registry) {
|
|
2
|
+
if (!input.startsWith("!")) {
|
|
3
|
+
return { kind: "plain", prompt: input };
|
|
4
|
+
}
|
|
5
|
+
if (input.startsWith("!!")) {
|
|
6
|
+
const command = input.slice(2).trim();
|
|
7
|
+
return command ? { kind: "bash", command, includeContext: false } : { kind: "empty" };
|
|
8
|
+
}
|
|
9
|
+
const second = input[1];
|
|
10
|
+
if (second === undefined) {
|
|
11
|
+
return { kind: "plain", prompt: input };
|
|
12
|
+
}
|
|
13
|
+
if (/\s/.test(second)) {
|
|
14
|
+
const command = input.slice(2).trim();
|
|
15
|
+
return command ? { kind: "bash", command, includeContext: true } : { kind: "empty" };
|
|
16
|
+
}
|
|
17
|
+
const body = input.slice(1);
|
|
18
|
+
if (body.startsWith("skill:")) {
|
|
19
|
+
const explicit = body.slice("skill:".length);
|
|
20
|
+
const { token: skillName, rest } = splitFirstToken(explicit);
|
|
21
|
+
if (!skillName) {
|
|
22
|
+
return { kind: "plain", prompt: input };
|
|
23
|
+
}
|
|
24
|
+
if (!registry.hasSkill(skillName)) {
|
|
25
|
+
return { kind: "unknownSkill", skillName, prompt: rest, source: "bang" };
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
kind: "skill",
|
|
29
|
+
skillName,
|
|
30
|
+
prompt: rest,
|
|
31
|
+
activeSkillNames: [skillName],
|
|
32
|
+
source: "bang",
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const { token: skillName, rest } = splitFirstToken(body);
|
|
36
|
+
if (!skillName) {
|
|
37
|
+
return { kind: "plain", prompt: input };
|
|
38
|
+
}
|
|
39
|
+
if (registry.hasSkill(skillName)) {
|
|
40
|
+
return {
|
|
41
|
+
kind: "skill",
|
|
42
|
+
skillName,
|
|
43
|
+
prompt: rest,
|
|
44
|
+
activeSkillNames: [skillName],
|
|
45
|
+
source: "bang",
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const command = body.trim();
|
|
49
|
+
return command ? { kind: "bash", command, includeContext: true } : { kind: "empty" };
|
|
50
|
+
}
|
|
51
|
+
function splitFirstToken(input) {
|
|
52
|
+
const trimmed = input.trimStart();
|
|
53
|
+
const match = /^([^\s]+)(?:\s+([\s\S]*))?$/.exec(trimmed);
|
|
54
|
+
if (!match) {
|
|
55
|
+
return { token: "", rest: "" };
|
|
56
|
+
}
|
|
57
|
+
return { token: match[1] ?? "", rest: match[2]?.trimStart() ?? "" };
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=bang-skill-invocation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bang-skill-invocation.js","sourceRoot":"","sources":["../../src/core/bang-skill-invocation.ts"],"names":[],"mappings":"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","sourcesContent":["export interface BangSkillRegistry {\n\thasSkill(name: string): boolean;\n}\n\nexport type BangInvocation =\n\t| { kind: \"plain\"; prompt: string }\n\t| { kind: \"empty\" }\n\t| { kind: \"bash\"; command: string; includeContext: boolean }\n\t| { kind: \"skill\"; skillName: string; prompt: string; activeSkillNames: readonly string[]; source: \"bang\" }\n\t| { kind: \"unknownSkill\"; skillName: string; prompt: string; source: \"bang\" };\n\nexport function parseBangInvocation(input: string, registry: BangSkillRegistry): BangInvocation {\n\tif (!input.startsWith(\"!\")) {\n\t\treturn { kind: \"plain\", prompt: input };\n\t}\n\n\tif (input.startsWith(\"!!\")) {\n\t\tconst command = input.slice(2).trim();\n\t\treturn command ? { kind: \"bash\", command, includeContext: false } : { kind: \"empty\" };\n\t}\n\n\tconst second = input[1];\n\tif (second === undefined) {\n\t\treturn { kind: \"plain\", prompt: input };\n\t}\n\n\tif (/\\s/.test(second)) {\n\t\tconst command = input.slice(2).trim();\n\t\treturn command ? { kind: \"bash\", command, includeContext: true } : { kind: \"empty\" };\n\t}\n\n\tconst body = input.slice(1);\n\tif (body.startsWith(\"skill:\")) {\n\t\tconst explicit = body.slice(\"skill:\".length);\n\t\tconst { token: skillName, rest } = splitFirstToken(explicit);\n\t\tif (!skillName) {\n\t\t\treturn { kind: \"plain\", prompt: input };\n\t\t}\n\t\tif (!registry.hasSkill(skillName)) {\n\t\t\treturn { kind: \"unknownSkill\", skillName, prompt: rest, source: \"bang\" };\n\t\t}\n\t\treturn {\n\t\t\tkind: \"skill\",\n\t\t\tskillName,\n\t\t\tprompt: rest,\n\t\t\tactiveSkillNames: [skillName],\n\t\t\tsource: \"bang\",\n\t\t};\n\t}\n\n\tconst { token: skillName, rest } = splitFirstToken(body);\n\tif (!skillName) {\n\t\treturn { kind: \"plain\", prompt: input };\n\t}\n\tif (registry.hasSkill(skillName)) {\n\t\treturn {\n\t\t\tkind: \"skill\",\n\t\t\tskillName,\n\t\t\tprompt: rest,\n\t\t\tactiveSkillNames: [skillName],\n\t\t\tsource: \"bang\",\n\t\t};\n\t}\n\n\tconst command = body.trim();\n\treturn command ? { kind: \"bash\", command, includeContext: true } : { kind: \"empty\" };\n}\n\nfunction splitFirstToken(input: string): { token: string; rest: string } {\n\tconst trimmed = input.trimStart();\n\tconst match = /^([^\\s]+)(?:\\s+([\\s\\S]*))?$/.exec(trimmed);\n\tif (!match) {\n\t\treturn { token: \"\", rest: \"\" };\n\t}\n\treturn { token: match[1] ?? \"\", rest: match[2]?.trimStart() ?? \"\" };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compactor.d.ts","sourceRoot":"","sources":["../../src/core/compactor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compactor.d.ts","sourceRoot":"","sources":["../../src/core/compactor.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,sBAAuB,SAAQ,YAAY;IACvD,OAAO,CAAC,UAAU,CAAS;IAE3B,YAAY,UAAU,SAAK,EAG1B;IAED,OAAO,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG;QAAE,SAAS,EAAE,cAAc,EAAE,CAAC;QAAC,OAAO,EAAE,cAAc,EAAE,CAAA;KAAE,CAQ3F;CACD;AAED,qBAAa,oBAAqB,SAAQ,YAAY;IACrD,WAAW,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAarD;IAED,OAAO,CAAC,SAAS;CAGjB;AAED,qBAAa,gBAAiB,SAAQ,YAAY;IACjD,OAAO,CAAC,QAAQ,CAAiE;IAEjF,KAAK,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAYlC;CACD;AAED,qBAAa,gBAAiB,SAAQ,YAAY;IACjD,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,MAAM,CAAmB;IAEjC,YAAY,UAAU,SAAK,EAK1B;IAED,OAAO,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,MAAM,GAAE,QAAQ,GAAG,UAAU,GAAG,YAAyB,GAAG,gBAAgB,CAsC5G;IAED,OAAO,CAAC,SAAS;CASjB;AAED,eAAe,gBAAgB,CAAC","sourcesContent":["// [DEPRECATED — DEAD CODE] OMK v6.2 — Context Compactor (TypeScript)\n// ==================================================================\n// packages/coding-agent/src/core/compactor.ts\n//\n// STATUS: DEAD CODE — Not imported by any module at runtime.\n// This file is NOT wired into AgentSession or any active pipeline.\n//\n// WHY DEAD:\n// - agent-session.ts imports CompactionResult from compaction/index.ts,\n// NOT from this file. The CompactionResult interfaces are different.\n// - No other file in src/ imports from compactor.ts.\n// - All classes (SlidingWindowCompactor, SemanticDeduplicator,\n// ImportanceScorer, ContextCompactor) are only referenced within this file.\n//\n// ACTUAL COMPACTION SYSTEM:\n// - compaction/compaction.ts → real compaction with LLM summarization\n// - compaction/branch-summarization.ts → branch-specific summarization\n// - compaction/utils.ts → compaction utilities\n// - agent-session.ts imports compact(), prepareCompaction(), shouldCompact()\n// from compaction/index.ts\n//\n// DO NOT MODIFY — preserved for reference only.\n\nimport { EventEmitter } from \"events\";\n\nexport interface CompactionTurn {\n\tindex: number;\n\trole: string;\n\tcontent: string;\n\ttimestamp: number;\n\timportance?: number;\n}\n\nexport interface CompactionResult {\n\tpreserved: CompactionTurn[];\n\tsummarized: CompactionTurn[];\n\tsummary: string;\n\toriginalCount: number;\n\tfinalCount: number;\n\tcompressionRatio: number;\n}\n\nexport class SlidingWindowCompactor extends EventEmitter {\n\tprivate windowSize: number;\n\n\tconstructor(windowSize = 10) {\n\t\tsuper();\n\t\tthis.windowSize = windowSize;\n\t}\n\n\tcompact(turns: CompactionTurn[]): { preserved: CompactionTurn[]; evicted: CompactionTurn[] } {\n\t\tif (turns.length <= this.windowSize) {\n\t\t\treturn { preserved: turns, evicted: [] };\n\t\t}\n\t\treturn {\n\t\t\tpreserved: turns.slice(-this.windowSize),\n\t\t\tevicted: turns.slice(0, -this.windowSize),\n\t\t};\n\t}\n}\n\nexport class SemanticDeduplicator extends EventEmitter {\n\tdeduplicate(turns: CompactionTurn[]): CompactionTurn[] {\n\t\tconst seen = new Set<string>();\n\t\tconst unique: CompactionTurn[] = [];\n\n\t\tfor (const turn of turns) {\n\t\t\tconst key = this.normalize(turn.content);\n\t\t\tif (!seen.has(key)) {\n\t\t\t\tseen.add(key);\n\t\t\t\tunique.push(turn);\n\t\t\t}\n\t\t}\n\n\t\treturn unique;\n\t}\n\n\tprivate normalize(text: string): string {\n\t\treturn text.toLowerCase().replace(/\\s+/g, \" \").trim().substring(0, 100);\n\t}\n}\n\nexport class ImportanceScorer extends EventEmitter {\n\tprivate keywords = [\"refusal\", \"error\", \"strategy\", \"phase\", \"decision\", \"goal\"];\n\n\tscore(turn: CompactionTurn): number {\n\t\tlet score = 0;\n\t\tconst content = turn.content.toLowerCase();\n\n\t\tfor (const kw of this.keywords) {\n\t\t\tif (content.includes(kw)) score += 2;\n\t\t}\n\n\t\tif (turn.role === \"system\") score += 1;\n\t\tif (turn.role === \"assistant\" && content.includes(\"refuse\")) score += 5;\n\n\t\treturn score;\n\t}\n}\n\nexport class ContextCompactor extends EventEmitter {\n\tprivate slidingWindow: SlidingWindowCompactor;\n\tprivate deduplicator: SemanticDeduplicator;\n\tprivate scorer: ImportanceScorer;\n\n\tconstructor(windowSize = 10) {\n\t\tsuper();\n\t\tthis.slidingWindow = new SlidingWindowCompactor(windowSize);\n\t\tthis.deduplicator = new SemanticDeduplicator();\n\t\tthis.scorer = new ImportanceScorer();\n\t}\n\n\tcompact(turns: CompactionTurn[], _level: \"gentle\" | \"moderate\" | \"aggressive\" = \"moderate\"): CompactionResult {\n\t\tconst originalCount = turns.length;\n\n\t\t// 1. Importance scoring\n\t\tconst scored = turns.map((t) => ({ ...t, importance: this.scorer.score(t) }));\n\n\t\t// 2. Protect high-importance turns\n\t\tconst protectedTurns = scored.filter((t) => (t.importance ?? 0) >= 3);\n\t\tconst candidates = scored.filter((t) => (t.importance ?? 0) < 3);\n\n\t\t// 3. Sliding window\n\t\tconst { preserved, evicted } = this.slidingWindow.compact(candidates);\n\n\t\t// 4. Deduplicate evicted\n\t\tconst uniqueEvicted = this.deduplicator.deduplicate(evicted);\n\n\t\t// 5. Summarize evicted\n\t\tconst summary = this.summarize(uniqueEvicted);\n\n\t\t// 6. Assemble result\n\t\tconst finalTurns = [...protectedTurns, ...preserved];\n\t\tif (summary) {\n\t\t\tfinalTurns.push({\n\t\t\t\tindex: -1,\n\t\t\t\trole: \"system\",\n\t\t\t\tcontent: `[Summary]: ${summary}`,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\tpreserved: protectedTurns,\n\t\t\tsummarized: uniqueEvicted,\n\t\t\tsummary,\n\t\t\toriginalCount,\n\t\t\tfinalCount: finalTurns.length,\n\t\t\tcompressionRatio: finalTurns.length / originalCount,\n\t\t};\n\t}\n\n\tprivate summarize(turns: CompactionTurn[]): string {\n\t\tif (turns.length === 0) return \"\";\n\t\tconst topics = new Set<string>();\n\t\tfor (const turn of turns) {\n\t\t\tconst words = turn.content.split(/\\s+/).filter((w) => w.length > 4);\n\t\t\tfor (const w of words.slice(0, 3)) topics.add(w);\n\t\t}\n\t\treturn `Topics: ${Array.from(topics).slice(0, 5).join(\", \")}`;\n\t}\n}\n\nexport default ContextCompactor;\n"]}
|
package/dist/core/compactor.js
CHANGED
|
@@ -19,9 +19,6 @@
|
|
|
19
19
|
// - agent-session.ts imports compact(), prepareCompaction(), shouldCompact()
|
|
20
20
|
// from compaction/index.ts
|
|
21
21
|
//
|
|
22
|
-
// NOTE: types/jailbreak.ts also defines a CompactionResult interface (different shape).
|
|
23
|
-
// Both are distinct from the real CompactionResult in compaction/compaction.ts.
|
|
24
|
-
//
|
|
25
22
|
// DO NOT MODIFY — preserved for reference only.
|
|
26
23
|
import { EventEmitter } from "events";
|
|
27
24
|
export class SlidingWindowCompactor extends EventEmitter {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compactor.js","sourceRoot":"","sources":["../../src/core/compactor.ts"],"names":[],"mappings":"AAAA,yEAAqE;AACrE,qEAAqE;AACrE,8CAA8C;AAC9C,EAAE;AACF,+DAA6D;AAC7D,mEAAmE;AACnE,EAAE;AACF,YAAY;AACZ,0EAA0E;AAC1E,yEAAyE;AACzE,uDAAuD;AACvD,iEAAiE;AACjE,gFAAgF;AAChF,EAAE;AACF,4BAA4B;AAC5B,2EAAyE;AACzE,2EAAyE;AACzE,mDAAiD;AACjD,+EAA+E;AAC/E,+BAA+B;AAC/B,EAAE;AACF,
|
|
1
|
+
{"version":3,"file":"compactor.js","sourceRoot":"","sources":["../../src/core/compactor.ts"],"names":[],"mappings":"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","sourcesContent":["// [DEPRECATED — DEAD CODE] OMK v6.2 — Context Compactor (TypeScript)\n// ==================================================================\n// packages/coding-agent/src/core/compactor.ts\n//\n// STATUS: DEAD CODE — Not imported by any module at runtime.\n// This file is NOT wired into AgentSession or any active pipeline.\n//\n// WHY DEAD:\n// - agent-session.ts imports CompactionResult from compaction/index.ts,\n// NOT from this file. The CompactionResult interfaces are different.\n// - No other file in src/ imports from compactor.ts.\n// - All classes (SlidingWindowCompactor, SemanticDeduplicator,\n// ImportanceScorer, ContextCompactor) are only referenced within this file.\n//\n// ACTUAL COMPACTION SYSTEM:\n// - compaction/compaction.ts → real compaction with LLM summarization\n// - compaction/branch-summarization.ts → branch-specific summarization\n// - compaction/utils.ts → compaction utilities\n// - agent-session.ts imports compact(), prepareCompaction(), shouldCompact()\n// from compaction/index.ts\n//\n// DO NOT MODIFY — preserved for reference only.\n\nimport { EventEmitter } from \"events\";\n\nexport interface CompactionTurn {\n\tindex: number;\n\trole: string;\n\tcontent: string;\n\ttimestamp: number;\n\timportance?: number;\n}\n\nexport interface CompactionResult {\n\tpreserved: CompactionTurn[];\n\tsummarized: CompactionTurn[];\n\tsummary: string;\n\toriginalCount: number;\n\tfinalCount: number;\n\tcompressionRatio: number;\n}\n\nexport class SlidingWindowCompactor extends EventEmitter {\n\tprivate windowSize: number;\n\n\tconstructor(windowSize = 10) {\n\t\tsuper();\n\t\tthis.windowSize = windowSize;\n\t}\n\n\tcompact(turns: CompactionTurn[]): { preserved: CompactionTurn[]; evicted: CompactionTurn[] } {\n\t\tif (turns.length <= this.windowSize) {\n\t\t\treturn { preserved: turns, evicted: [] };\n\t\t}\n\t\treturn {\n\t\t\tpreserved: turns.slice(-this.windowSize),\n\t\t\tevicted: turns.slice(0, -this.windowSize),\n\t\t};\n\t}\n}\n\nexport class SemanticDeduplicator extends EventEmitter {\n\tdeduplicate(turns: CompactionTurn[]): CompactionTurn[] {\n\t\tconst seen = new Set<string>();\n\t\tconst unique: CompactionTurn[] = [];\n\n\t\tfor (const turn of turns) {\n\t\t\tconst key = this.normalize(turn.content);\n\t\t\tif (!seen.has(key)) {\n\t\t\t\tseen.add(key);\n\t\t\t\tunique.push(turn);\n\t\t\t}\n\t\t}\n\n\t\treturn unique;\n\t}\n\n\tprivate normalize(text: string): string {\n\t\treturn text.toLowerCase().replace(/\\s+/g, \" \").trim().substring(0, 100);\n\t}\n}\n\nexport class ImportanceScorer extends EventEmitter {\n\tprivate keywords = [\"refusal\", \"error\", \"strategy\", \"phase\", \"decision\", \"goal\"];\n\n\tscore(turn: CompactionTurn): number {\n\t\tlet score = 0;\n\t\tconst content = turn.content.toLowerCase();\n\n\t\tfor (const kw of this.keywords) {\n\t\t\tif (content.includes(kw)) score += 2;\n\t\t}\n\n\t\tif (turn.role === \"system\") score += 1;\n\t\tif (turn.role === \"assistant\" && content.includes(\"refuse\")) score += 5;\n\n\t\treturn score;\n\t}\n}\n\nexport class ContextCompactor extends EventEmitter {\n\tprivate slidingWindow: SlidingWindowCompactor;\n\tprivate deduplicator: SemanticDeduplicator;\n\tprivate scorer: ImportanceScorer;\n\n\tconstructor(windowSize = 10) {\n\t\tsuper();\n\t\tthis.slidingWindow = new SlidingWindowCompactor(windowSize);\n\t\tthis.deduplicator = new SemanticDeduplicator();\n\t\tthis.scorer = new ImportanceScorer();\n\t}\n\n\tcompact(turns: CompactionTurn[], _level: \"gentle\" | \"moderate\" | \"aggressive\" = \"moderate\"): CompactionResult {\n\t\tconst originalCount = turns.length;\n\n\t\t// 1. Importance scoring\n\t\tconst scored = turns.map((t) => ({ ...t, importance: this.scorer.score(t) }));\n\n\t\t// 2. Protect high-importance turns\n\t\tconst protectedTurns = scored.filter((t) => (t.importance ?? 0) >= 3);\n\t\tconst candidates = scored.filter((t) => (t.importance ?? 0) < 3);\n\n\t\t// 3. Sliding window\n\t\tconst { preserved, evicted } = this.slidingWindow.compact(candidates);\n\n\t\t// 4. Deduplicate evicted\n\t\tconst uniqueEvicted = this.deduplicator.deduplicate(evicted);\n\n\t\t// 5. Summarize evicted\n\t\tconst summary = this.summarize(uniqueEvicted);\n\n\t\t// 6. Assemble result\n\t\tconst finalTurns = [...protectedTurns, ...preserved];\n\t\tif (summary) {\n\t\t\tfinalTurns.push({\n\t\t\t\tindex: -1,\n\t\t\t\trole: \"system\",\n\t\t\t\tcontent: `[Summary]: ${summary}`,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\tpreserved: protectedTurns,\n\t\t\tsummarized: uniqueEvicted,\n\t\t\tsummary,\n\t\t\toriginalCount,\n\t\t\tfinalCount: finalTurns.length,\n\t\t\tcompressionRatio: finalTurns.length / originalCount,\n\t\t};\n\t}\n\n\tprivate summarize(turns: CompactionTurn[]): string {\n\t\tif (turns.length === 0) return \"\";\n\t\tconst topics = new Set<string>();\n\t\tfor (const turn of turns) {\n\t\t\tconst words = turn.content.split(/\\s+/).filter((w) => w.length > 4);\n\t\t\tfor (const w of words.slice(0, 3)) topics.add(w);\n\t\t}\n\t\treturn `Topics: ${Array.from(topics).slice(0, 5).join(\", \")}`;\n\t}\n}\n\nexport default ContextCompactor;\n"]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export { type ContextBudgetItemV2, type ContextBudgetPriorityV2, type ContextBudgetTierV2, type ContextEvidenceKindV2, type ContextRepresentationCandidateV2, type ContextRepresentationFidelityV2, type ContextRepresentationKindV2, type ContextSourceRefV2, chooseHeadroomRepresentation, DEFAULT_HEADROOM_QUALITY_POLICY, deriveRepresentationCandidates, estimatePointerTokens, fnv1aHex, fullTextTokens, getHeadroomRuntimeStatus, type HeadroomQualityPolicyV2, type HeadroomRuntimeStatusV2, heuristicTokenCount, type RepresentationBudgetContext, } from "./context-budget-headroom.ts";
|
|
2
|
+
export { buildContextBudgetExactRepresentationCacheKeyV2, buildContextBudgetMaterializedRepresentationCacheKeyV2, buildContextBudgetMaterializedRepresentationCandidateKeyV2, buildContextBudgetPlanCacheKeyV2, buildContextBudgetRepresentationCacheKeyV2, computeContextBudgetOutputTextHashV2, computeContextBudgetQueryIntentHashV2, computeContextBudgetRepresentationFingerprintV2, computeContextBudgetTargetTokenBucketV2, createMemoryContextBudgetCacheProviderV2, DEFAULT_MATERIALIZED_COMPRESSOR_POLICY_HASH_V2, DEFAULT_MATERIALIZED_QUALITY_POLICY_HASH_V2, } from "./context-budget-v2-cache.ts";
|
|
2
3
|
export { computeCoverageGap } from "./context-budget-v2-coverage.ts";
|
|
3
4
|
export { computePlanHash, contentHashOf } from "./context-budget-v2-plan-hash.ts";
|
|
4
5
|
export { planPromptContextBudgetV2 } from "./context-budget-v2-planner.ts";
|
|
5
6
|
export { scoreContextBudgetItemV2 } from "./context-budget-v2-scoring.ts";
|
|
6
|
-
export { ALL_TIERS_V2, CONTEXT_BUDGET_POLICY_VERSION_V2, type ContextBudgetObservabilityCountsV2, type ContextBudgetObservabilityTokensV2, DEFAULT_TIER_POLICY_V2, type PromptContextBudgetInputV2, type PromptContextBudgetObservabilityV2, type PromptContextBudgetPlanV2, type QualityDiagnosticReasonV2, type QualityDiagnosticV2, type SelectedRepresentationV2, type TierBudgetAllocationV2, type TierBudgetPolicyV2, } from "./context-budget-v2-types.ts";
|
|
7
|
+
export { ALL_TIERS_V2, CONTEXT_BUDGET_POLICY_VERSION_V2, type ContextBudgetCacheProviderV2, type ContextBudgetCacheTokenTelemetryV2, type ContextBudgetMaterializedVerificationV2, type ContextBudgetObservabilityCountsV2, type ContextBudgetObservabilityTokensV2, type ContextBudgetPlanCacheTelemetryV2, type ContextBudgetRepresentationCacheEntryV2, type ContextBudgetRepresentationCacheKeyKindV2, type ContextBudgetRepresentationCacheTelemetryV2, DEFAULT_TIER_POLICY_V2, type PromptContextBudgetInputV2, type PromptContextBudgetObservabilityV2, type PromptContextBudgetPlanV2, type QualityDiagnosticReasonV2, type QualityDiagnosticV2, type SelectedRepresentationV2, type TierBudgetAllocationV2, type TierBudgetPolicyV2, } from "./context-budget-v2-types.ts";
|
|
7
8
|
//# sourceMappingURL=context-budget-governor-v2.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-budget-governor-v2.d.ts","sourceRoot":"","sources":["../../src/core/context-budget-governor-v2.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,gCAAgC,EACrC,KAAK,+BAA+B,EACpC,KAAK,2BAA2B,EAChC,KAAK,kBAAkB,EACvB,4BAA4B,EAC5B,+BAA+B,EAC/B,8BAA8B,EAC9B,qBAAqB,EACrB,QAAQ,EACR,cAAc,EACd,wBAAwB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,mBAAmB,EACnB,KAAK,2BAA2B,GAChC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EACN,YAAY,EACZ,gCAAgC,EAChC,KAAK,kCAAkC,EACvC,KAAK,kCAAkC,EACvC,sBAAsB,EACtB,KAAK,0BAA0B,EAC/B,KAAK,kCAAkC,EACvC,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,GACvB,MAAM,8BAA8B,CAAC","sourcesContent":["export {\n\ttype ContextBudgetItemV2,\n\ttype ContextBudgetPriorityV2,\n\ttype ContextBudgetTierV2,\n\ttype ContextEvidenceKindV2,\n\ttype ContextRepresentationCandidateV2,\n\ttype ContextRepresentationFidelityV2,\n\ttype ContextRepresentationKindV2,\n\ttype ContextSourceRefV2,\n\tchooseHeadroomRepresentation,\n\tDEFAULT_HEADROOM_QUALITY_POLICY,\n\tderiveRepresentationCandidates,\n\testimatePointerTokens,\n\tfnv1aHex,\n\tfullTextTokens,\n\tgetHeadroomRuntimeStatus,\n\ttype HeadroomQualityPolicyV2,\n\ttype HeadroomRuntimeStatusV2,\n\theuristicTokenCount,\n\ttype RepresentationBudgetContext,\n} from \"./context-budget-headroom.ts\";\nexport { computeCoverageGap } from \"./context-budget-v2-coverage.ts\";\nexport { computePlanHash, contentHashOf } from \"./context-budget-v2-plan-hash.ts\";\nexport { planPromptContextBudgetV2 } from \"./context-budget-v2-planner.ts\";\nexport { scoreContextBudgetItemV2 } from \"./context-budget-v2-scoring.ts\";\nexport {\n\tALL_TIERS_V2,\n\tCONTEXT_BUDGET_POLICY_VERSION_V2,\n\ttype ContextBudgetObservabilityCountsV2,\n\ttype ContextBudgetObservabilityTokensV2,\n\tDEFAULT_TIER_POLICY_V2,\n\ttype PromptContextBudgetInputV2,\n\ttype PromptContextBudgetObservabilityV2,\n\ttype PromptContextBudgetPlanV2,\n\ttype QualityDiagnosticReasonV2,\n\ttype QualityDiagnosticV2,\n\ttype SelectedRepresentationV2,\n\ttype TierBudgetAllocationV2,\n\ttype TierBudgetPolicyV2,\n} from \"./context-budget-v2-types.ts\";\n"]}
|
|
1
|
+
{"version":3,"file":"context-budget-governor-v2.d.ts","sourceRoot":"","sources":["../../src/core/context-budget-governor-v2.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,gCAAgC,EACrC,KAAK,+BAA+B,EACpC,KAAK,2BAA2B,EAChC,KAAK,kBAAkB,EACvB,4BAA4B,EAC5B,+BAA+B,EAC/B,8BAA8B,EAC9B,qBAAqB,EACrB,QAAQ,EACR,cAAc,EACd,wBAAwB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,mBAAmB,EACnB,KAAK,2BAA2B,GAChC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACN,+CAA+C,EAC/C,sDAAsD,EACtD,0DAA0D,EAC1D,gCAAgC,EAChC,0CAA0C,EAC1C,oCAAoC,EACpC,qCAAqC,EACrC,+CAA+C,EAC/C,uCAAuC,EACvC,wCAAwC,EACxC,8CAA8C,EAC9C,2CAA2C,GAC3C,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EACN,YAAY,EACZ,gCAAgC,EAChC,KAAK,4BAA4B,EACjC,KAAK,kCAAkC,EACvC,KAAK,uCAAuC,EAC5C,KAAK,kCAAkC,EACvC,KAAK,kCAAkC,EACvC,KAAK,iCAAiC,EACtC,KAAK,uCAAuC,EAC5C,KAAK,yCAAyC,EAC9C,KAAK,2CAA2C,EAChD,sBAAsB,EACtB,KAAK,0BAA0B,EAC/B,KAAK,kCAAkC,EACvC,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,GACvB,MAAM,8BAA8B,CAAC","sourcesContent":["export {\n\ttype ContextBudgetItemV2,\n\ttype ContextBudgetPriorityV2,\n\ttype ContextBudgetTierV2,\n\ttype ContextEvidenceKindV2,\n\ttype ContextRepresentationCandidateV2,\n\ttype ContextRepresentationFidelityV2,\n\ttype ContextRepresentationKindV2,\n\ttype ContextSourceRefV2,\n\tchooseHeadroomRepresentation,\n\tDEFAULT_HEADROOM_QUALITY_POLICY,\n\tderiveRepresentationCandidates,\n\testimatePointerTokens,\n\tfnv1aHex,\n\tfullTextTokens,\n\tgetHeadroomRuntimeStatus,\n\ttype HeadroomQualityPolicyV2,\n\ttype HeadroomRuntimeStatusV2,\n\theuristicTokenCount,\n\ttype RepresentationBudgetContext,\n} from \"./context-budget-headroom.ts\";\nexport {\n\tbuildContextBudgetExactRepresentationCacheKeyV2,\n\tbuildContextBudgetMaterializedRepresentationCacheKeyV2,\n\tbuildContextBudgetMaterializedRepresentationCandidateKeyV2,\n\tbuildContextBudgetPlanCacheKeyV2,\n\tbuildContextBudgetRepresentationCacheKeyV2,\n\tcomputeContextBudgetOutputTextHashV2,\n\tcomputeContextBudgetQueryIntentHashV2,\n\tcomputeContextBudgetRepresentationFingerprintV2,\n\tcomputeContextBudgetTargetTokenBucketV2,\n\tcreateMemoryContextBudgetCacheProviderV2,\n\tDEFAULT_MATERIALIZED_COMPRESSOR_POLICY_HASH_V2,\n\tDEFAULT_MATERIALIZED_QUALITY_POLICY_HASH_V2,\n} from \"./context-budget-v2-cache.ts\";\nexport { computeCoverageGap } from \"./context-budget-v2-coverage.ts\";\nexport { computePlanHash, contentHashOf } from \"./context-budget-v2-plan-hash.ts\";\nexport { planPromptContextBudgetV2 } from \"./context-budget-v2-planner.ts\";\nexport { scoreContextBudgetItemV2 } from \"./context-budget-v2-scoring.ts\";\nexport {\n\tALL_TIERS_V2,\n\tCONTEXT_BUDGET_POLICY_VERSION_V2,\n\ttype ContextBudgetCacheProviderV2,\n\ttype ContextBudgetCacheTokenTelemetryV2,\n\ttype ContextBudgetMaterializedVerificationV2,\n\ttype ContextBudgetObservabilityCountsV2,\n\ttype ContextBudgetObservabilityTokensV2,\n\ttype ContextBudgetPlanCacheTelemetryV2,\n\ttype ContextBudgetRepresentationCacheEntryV2,\n\ttype ContextBudgetRepresentationCacheKeyKindV2,\n\ttype ContextBudgetRepresentationCacheTelemetryV2,\n\tDEFAULT_TIER_POLICY_V2,\n\ttype PromptContextBudgetInputV2,\n\ttype PromptContextBudgetObservabilityV2,\n\ttype PromptContextBudgetPlanV2,\n\ttype QualityDiagnosticReasonV2,\n\ttype QualityDiagnosticV2,\n\ttype SelectedRepresentationV2,\n\ttype TierBudgetAllocationV2,\n\ttype TierBudgetPolicyV2,\n} from \"./context-budget-v2-types.ts\";\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { chooseHeadroomRepresentation, DEFAULT_HEADROOM_QUALITY_POLICY, deriveRepresentationCandidates, estimatePointerTokens, fnv1aHex, fullTextTokens, getHeadroomRuntimeStatus, heuristicTokenCount, } from "./context-budget-headroom.js";
|
|
2
|
+
export { buildContextBudgetExactRepresentationCacheKeyV2, buildContextBudgetMaterializedRepresentationCacheKeyV2, buildContextBudgetMaterializedRepresentationCandidateKeyV2, buildContextBudgetPlanCacheKeyV2, buildContextBudgetRepresentationCacheKeyV2, computeContextBudgetOutputTextHashV2, computeContextBudgetQueryIntentHashV2, computeContextBudgetRepresentationFingerprintV2, computeContextBudgetTargetTokenBucketV2, createMemoryContextBudgetCacheProviderV2, DEFAULT_MATERIALIZED_COMPRESSOR_POLICY_HASH_V2, DEFAULT_MATERIALIZED_QUALITY_POLICY_HASH_V2, } from "./context-budget-v2-cache.js";
|
|
2
3
|
export { computeCoverageGap } from "./context-budget-v2-coverage.js";
|
|
3
4
|
export { computePlanHash, contentHashOf } from "./context-budget-v2-plan-hash.js";
|
|
4
5
|
export { planPromptContextBudgetV2 } from "./context-budget-v2-planner.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-budget-governor-v2.js","sourceRoot":"","sources":["../../src/core/context-budget-governor-v2.ts"],"names":[],"mappings":"AAAA,OAAO,EASN,4BAA4B,EAC5B,+BAA+B,EAC/B,8BAA8B,EAC9B,qBAAqB,EACrB,QAAQ,EACR,cAAc,EACd,wBAAwB,EAGxB,mBAAmB,GAEnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EACN,YAAY,EACZ,gCAAgC,
|
|
1
|
+
{"version":3,"file":"context-budget-governor-v2.js","sourceRoot":"","sources":["../../src/core/context-budget-governor-v2.ts"],"names":[],"mappings":"AAAA,OAAO,EASN,4BAA4B,EAC5B,+BAA+B,EAC/B,8BAA8B,EAC9B,qBAAqB,EACrB,QAAQ,EACR,cAAc,EACd,wBAAwB,EAGxB,mBAAmB,GAEnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACN,+CAA+C,EAC/C,sDAAsD,EACtD,0DAA0D,EAC1D,gCAAgC,EAChC,0CAA0C,EAC1C,oCAAoC,EACpC,qCAAqC,EACrC,+CAA+C,EAC/C,uCAAuC,EACvC,wCAAwC,EACxC,8CAA8C,EAC9C,2CAA2C,GAC3C,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EACN,YAAY,EACZ,gCAAgC,EAUhC,sBAAsB,GAStB,MAAM,8BAA8B,CAAC","sourcesContent":["export {\n\ttype ContextBudgetItemV2,\n\ttype ContextBudgetPriorityV2,\n\ttype ContextBudgetTierV2,\n\ttype ContextEvidenceKindV2,\n\ttype ContextRepresentationCandidateV2,\n\ttype ContextRepresentationFidelityV2,\n\ttype ContextRepresentationKindV2,\n\ttype ContextSourceRefV2,\n\tchooseHeadroomRepresentation,\n\tDEFAULT_HEADROOM_QUALITY_POLICY,\n\tderiveRepresentationCandidates,\n\testimatePointerTokens,\n\tfnv1aHex,\n\tfullTextTokens,\n\tgetHeadroomRuntimeStatus,\n\ttype HeadroomQualityPolicyV2,\n\ttype HeadroomRuntimeStatusV2,\n\theuristicTokenCount,\n\ttype RepresentationBudgetContext,\n} from \"./context-budget-headroom.ts\";\nexport {\n\tbuildContextBudgetExactRepresentationCacheKeyV2,\n\tbuildContextBudgetMaterializedRepresentationCacheKeyV2,\n\tbuildContextBudgetMaterializedRepresentationCandidateKeyV2,\n\tbuildContextBudgetPlanCacheKeyV2,\n\tbuildContextBudgetRepresentationCacheKeyV2,\n\tcomputeContextBudgetOutputTextHashV2,\n\tcomputeContextBudgetQueryIntentHashV2,\n\tcomputeContextBudgetRepresentationFingerprintV2,\n\tcomputeContextBudgetTargetTokenBucketV2,\n\tcreateMemoryContextBudgetCacheProviderV2,\n\tDEFAULT_MATERIALIZED_COMPRESSOR_POLICY_HASH_V2,\n\tDEFAULT_MATERIALIZED_QUALITY_POLICY_HASH_V2,\n} from \"./context-budget-v2-cache.ts\";\nexport { computeCoverageGap } from \"./context-budget-v2-coverage.ts\";\nexport { computePlanHash, contentHashOf } from \"./context-budget-v2-plan-hash.ts\";\nexport { planPromptContextBudgetV2 } from \"./context-budget-v2-planner.ts\";\nexport { scoreContextBudgetItemV2 } from \"./context-budget-v2-scoring.ts\";\nexport {\n\tALL_TIERS_V2,\n\tCONTEXT_BUDGET_POLICY_VERSION_V2,\n\ttype ContextBudgetCacheProviderV2,\n\ttype ContextBudgetCacheTokenTelemetryV2,\n\ttype ContextBudgetMaterializedVerificationV2,\n\ttype ContextBudgetObservabilityCountsV2,\n\ttype ContextBudgetObservabilityTokensV2,\n\ttype ContextBudgetPlanCacheTelemetryV2,\n\ttype ContextBudgetRepresentationCacheEntryV2,\n\ttype ContextBudgetRepresentationCacheKeyKindV2,\n\ttype ContextBudgetRepresentationCacheTelemetryV2,\n\tDEFAULT_TIER_POLICY_V2,\n\ttype PromptContextBudgetInputV2,\n\ttype PromptContextBudgetObservabilityV2,\n\ttype PromptContextBudgetPlanV2,\n\ttype QualityDiagnosticReasonV2,\n\ttype QualityDiagnosticV2,\n\ttype SelectedRepresentationV2,\n\ttype TierBudgetAllocationV2,\n\ttype TierBudgetPolicyV2,\n} from \"./context-budget-v2-types.ts\";\n"]}
|
|
@@ -13,6 +13,13 @@ export interface ContextSourceRefV2 {
|
|
|
13
13
|
readonly retrievable: boolean;
|
|
14
14
|
}
|
|
15
15
|
export type ContextRepresentationFidelityV2 = "exact" | "bounded" | "lossy" | "reversible";
|
|
16
|
+
export interface ContextRepresentationCacheMetadataV2 {
|
|
17
|
+
readonly hit: boolean;
|
|
18
|
+
readonly key: string;
|
|
19
|
+
readonly keyKind?: "exact" | "materialized";
|
|
20
|
+
readonly layer?: "turn" | "session" | "workspace" | "shared";
|
|
21
|
+
readonly rejectedReason?: string;
|
|
22
|
+
}
|
|
16
23
|
export interface ContextRepresentationCandidateV2 {
|
|
17
24
|
readonly kind: ContextRepresentationKindV2;
|
|
18
25
|
readonly text: string;
|
|
@@ -21,6 +28,7 @@ export interface ContextRepresentationCandidateV2 {
|
|
|
21
28
|
readonly sourceRef?: ContextSourceRefV2;
|
|
22
29
|
readonly summaryHash?: string;
|
|
23
30
|
readonly compressorId?: string;
|
|
31
|
+
readonly cache?: ContextRepresentationCacheMetadataV2;
|
|
24
32
|
}
|
|
25
33
|
export interface ContextBudgetItemV2 {
|
|
26
34
|
readonly id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-budget-headroom-types.d.ts","sourceRoot":"","sources":["../../src/core/context-budget-headroom-types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAC5B,QAAQ,GACR,aAAa,GACb,eAAe,GACf,OAAO,GACP,QAAQ,GACR,KAAK,GACL,SAAS,GACT,UAAU,GACV,SAAS,CAAC;AAEb,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEzE,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAExG,MAAM,MAAM,2BAA2B,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,qBAAqB,GAAG,MAAM,CAAC;AAE1G,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1E,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,MAAM,+BAA+B,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,YAAY,CAAC;AAE3F,MAAM,WAAW,gCAAgC;IAChD,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,+BAA+B,CAAC;IACnD,QAAQ,CAAC,SAAS,CAAC,EAAE,kBAAkB,CAAC;IACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"context-budget-headroom-types.d.ts","sourceRoot":"","sources":["../../src/core/context-budget-headroom-types.ts"],"names":[],"mappings":"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","sourcesContent":["export type ContextBudgetTierV2 =\n\t| \"system\"\n\t| \"active-goal\"\n\t| \"current-files\"\n\t| \"tools\"\n\t| \"skills\"\n\t| \"mcp\"\n\t| \"history\"\n\t| \"evidence\"\n\t| \"scratch\";\n\nexport type ContextBudgetPriorityV2 = \"hard\" | \"high\" | \"medium\" | \"low\";\n\nexport type ContextEvidenceKindV2 = \"test\" | \"command\" | \"file\" | \"decision\" | \"lane\" | \"user\" | \"none\";\n\nexport type ContextRepresentationKindV2 = \"full\" | \"pointer\" | \"summary\" | \"headroom-compressed\" | \"omit\";\n\nexport interface ContextSourceRefV2 {\n\treadonly uri: string;\n\treadonly symbol?: string;\n\treadonly range?: { readonly startLine: number; readonly endLine: number };\n\treadonly contentHash: string;\n\treadonly retrievable: boolean;\n}\n\nexport type ContextRepresentationFidelityV2 = \"exact\" | \"bounded\" | \"lossy\" | \"reversible\";\n\nexport interface ContextRepresentationCacheMetadataV2 {\n\treadonly hit: boolean;\n\treadonly key: string;\n\treadonly keyKind?: \"exact\" | \"materialized\";\n\treadonly layer?: \"turn\" | \"session\" | \"workspace\" | \"shared\";\n\treadonly rejectedReason?: string;\n}\n\nexport interface ContextRepresentationCandidateV2 {\n\treadonly kind: ContextRepresentationKindV2;\n\treadonly text: string;\n\treadonly estimatedTokens: number;\n\treadonly fidelity: ContextRepresentationFidelityV2;\n\treadonly sourceRef?: ContextSourceRefV2;\n\treadonly summaryHash?: string;\n\treadonly compressorId?: string;\n\treadonly cache?: ContextRepresentationCacheMetadataV2;\n}\n\nexport interface ContextBudgetItemV2 {\n\treadonly id: string;\n\treadonly tier: ContextBudgetTierV2;\n\treadonly priority: ContextBudgetPriorityV2;\n\treadonly text: string;\n\treadonly tokenEstimate?: number;\n\treadonly relevance?: number;\n\treadonly recency?: number;\n\treadonly evidenceValue?: number;\n\treadonly evidenceKind?: ContextEvidenceKindV2;\n\treadonly ageTurns?: number;\n\treadonly redundancyKey?: string;\n\treadonly required?: boolean;\n\treadonly pinReason?: string;\n\treadonly sourceRef?: ContextSourceRefV2;\n\treadonly representations?: readonly ContextRepresentationCandidateV2[];\n}\n\nexport interface HeadroomQualityPolicyV2 {\n\treadonly preferFullForHighPriority: boolean;\n\treadonly preferPointerForRetrievable: boolean;\n\treadonly summaryMaxAgeTurns: number;\n\treadonly headroomThresholdTokens: number;\n\treadonly allowOmit: boolean;\n}\n\nexport const DEFAULT_HEADROOM_QUALITY_POLICY: HeadroomQualityPolicyV2 = {\n\tpreferFullForHighPriority: true,\n\tpreferPointerForRetrievable: true,\n\tsummaryMaxAgeTurns: 4,\n\theadroomThresholdTokens: 400,\n\tallowOmit: true,\n};\n\nexport interface HeadroomRuntimeStatusV2 {\n\treadonly policyId: string;\n\treadonly selector: string;\n\treadonly headroomThresholdTokens: number;\n\treadonly summaryMaxAgeTurns: number;\n\treadonly representations: readonly ContextRepresentationKindV2[];\n}\n\nexport function getHeadroomRuntimeStatus(\n\tpolicy: HeadroomQualityPolicyV2 = DEFAULT_HEADROOM_QUALITY_POLICY,\n): HeadroomRuntimeStatusV2 {\n\treturn {\n\t\tpolicyId: \"context-budget-v2\",\n\t\tselector: \"headroom-selector\",\n\t\theadroomThresholdTokens: policy.headroomThresholdTokens,\n\t\tsummaryMaxAgeTurns: policy.summaryMaxAgeTurns,\n\t\trepresentations: [\"full\", \"pointer\", \"summary\", \"headroom-compressed\", \"omit\"],\n\t};\n}\n\nexport interface RepresentationBudgetContext {\n\treadonly tierUsedTokens: number;\n\treadonly tierCeilingTokens: number;\n\treadonly remainingGlobalTokens: number;\n}\n\nconst CHARS_PER_TOKEN_HEURISTIC = 4;\n\nexport function heuristicTokenCount(text: string): number {\n\tif (text.length === 0) {\n\t\treturn 0;\n\t}\n\treturn Math.max(1, Math.ceil(text.length / CHARS_PER_TOKEN_HEURISTIC));\n}\n\nexport function fullTextTokens(item: ContextBudgetItemV2): number {\n\tif (item.tokenEstimate !== undefined) {\n\t\treturn Math.max(0, Math.floor(item.tokenEstimate));\n\t}\n\treturn heuristicTokenCount(item.text);\n}\n\nexport function estimatePointerTokens(ref: ContextSourceRefV2): number {\n\tlet total = ref.uri.length + (ref.contentHash?.length ?? 0) + 16;\n\tif (ref.symbol) total += ref.symbol.length;\n\tif (ref.range) total += 8;\n\treturn Math.max(8, Math.ceil(total / CHARS_PER_TOKEN_HEURISTIC));\n}\n\nexport function fnv1aHex(input: string): string {\n\tlet hash = 0x811c9dc5;\n\tfor (let i = 0; i < input.length; i++) {\n\t\thash ^= input.charCodeAt(i);\n\t\thash = Math.imul(hash, 0x01000193) >>> 0;\n\t}\n\treturn hash.toString(16).padStart(8, \"0\");\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-budget-headroom-types.js","sourceRoot":"","sources":["../../src/core/context-budget-headroom-types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context-budget-headroom-types.js","sourceRoot":"","sources":["../../src/core/context-budget-headroom-types.ts"],"names":[],"mappings":"AAwEA,MAAM,CAAC,MAAM,+BAA+B,GAA4B;IACvE,yBAAyB,EAAE,IAAI;IAC/B,2BAA2B,EAAE,IAAI;IACjC,kBAAkB,EAAE,CAAC;IACrB,uBAAuB,EAAE,GAAG;IAC5B,SAAS,EAAE,IAAI;CACf,CAAC;AAUF,MAAM,UAAU,wBAAwB,CACvC,MAAM,GAA4B,+BAA+B,EACvC;IAC1B,OAAO;QACN,QAAQ,EAAE,mBAAmB;QAC7B,QAAQ,EAAE,mBAAmB;QAC7B,uBAAuB,EAAE,MAAM,CAAC,uBAAuB;QACvD,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;QAC7C,eAAe,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,CAAC;KAC9E,CAAC;AAAA,CACF;AAQD,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAEpC,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAU;IACzD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,CAAC;IACV,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,yBAAyB,CAAC,CAAC,CAAC;AAAA,CACvE;AAED,MAAM,UAAU,cAAc,CAAC,IAAyB,EAAU;IACjE,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAAA,CACtC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAuB,EAAU;IACtE,IAAI,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;IACjE,IAAI,GAAG,CAAC,MAAM;QAAE,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;IAC3C,IAAI,GAAG,CAAC,KAAK;QAAE,KAAK,IAAI,CAAC,CAAC;IAC1B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,yBAAyB,CAAC,CAAC,CAAC;AAAA,CACjE;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAU;IAC/C,IAAI,IAAI,GAAG,UAAU,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAAA,CAC1C","sourcesContent":["export type ContextBudgetTierV2 =\n\t| \"system\"\n\t| \"active-goal\"\n\t| \"current-files\"\n\t| \"tools\"\n\t| \"skills\"\n\t| \"mcp\"\n\t| \"history\"\n\t| \"evidence\"\n\t| \"scratch\";\n\nexport type ContextBudgetPriorityV2 = \"hard\" | \"high\" | \"medium\" | \"low\";\n\nexport type ContextEvidenceKindV2 = \"test\" | \"command\" | \"file\" | \"decision\" | \"lane\" | \"user\" | \"none\";\n\nexport type ContextRepresentationKindV2 = \"full\" | \"pointer\" | \"summary\" | \"headroom-compressed\" | \"omit\";\n\nexport interface ContextSourceRefV2 {\n\treadonly uri: string;\n\treadonly symbol?: string;\n\treadonly range?: { readonly startLine: number; readonly endLine: number };\n\treadonly contentHash: string;\n\treadonly retrievable: boolean;\n}\n\nexport type ContextRepresentationFidelityV2 = \"exact\" | \"bounded\" | \"lossy\" | \"reversible\";\n\nexport interface ContextRepresentationCacheMetadataV2 {\n\treadonly hit: boolean;\n\treadonly key: string;\n\treadonly keyKind?: \"exact\" | \"materialized\";\n\treadonly layer?: \"turn\" | \"session\" | \"workspace\" | \"shared\";\n\treadonly rejectedReason?: string;\n}\n\nexport interface ContextRepresentationCandidateV2 {\n\treadonly kind: ContextRepresentationKindV2;\n\treadonly text: string;\n\treadonly estimatedTokens: number;\n\treadonly fidelity: ContextRepresentationFidelityV2;\n\treadonly sourceRef?: ContextSourceRefV2;\n\treadonly summaryHash?: string;\n\treadonly compressorId?: string;\n\treadonly cache?: ContextRepresentationCacheMetadataV2;\n}\n\nexport interface ContextBudgetItemV2 {\n\treadonly id: string;\n\treadonly tier: ContextBudgetTierV2;\n\treadonly priority: ContextBudgetPriorityV2;\n\treadonly text: string;\n\treadonly tokenEstimate?: number;\n\treadonly relevance?: number;\n\treadonly recency?: number;\n\treadonly evidenceValue?: number;\n\treadonly evidenceKind?: ContextEvidenceKindV2;\n\treadonly ageTurns?: number;\n\treadonly redundancyKey?: string;\n\treadonly required?: boolean;\n\treadonly pinReason?: string;\n\treadonly sourceRef?: ContextSourceRefV2;\n\treadonly representations?: readonly ContextRepresentationCandidateV2[];\n}\n\nexport interface HeadroomQualityPolicyV2 {\n\treadonly preferFullForHighPriority: boolean;\n\treadonly preferPointerForRetrievable: boolean;\n\treadonly summaryMaxAgeTurns: number;\n\treadonly headroomThresholdTokens: number;\n\treadonly allowOmit: boolean;\n}\n\nexport const DEFAULT_HEADROOM_QUALITY_POLICY: HeadroomQualityPolicyV2 = {\n\tpreferFullForHighPriority: true,\n\tpreferPointerForRetrievable: true,\n\tsummaryMaxAgeTurns: 4,\n\theadroomThresholdTokens: 400,\n\tallowOmit: true,\n};\n\nexport interface HeadroomRuntimeStatusV2 {\n\treadonly policyId: string;\n\treadonly selector: string;\n\treadonly headroomThresholdTokens: number;\n\treadonly summaryMaxAgeTurns: number;\n\treadonly representations: readonly ContextRepresentationKindV2[];\n}\n\nexport function getHeadroomRuntimeStatus(\n\tpolicy: HeadroomQualityPolicyV2 = DEFAULT_HEADROOM_QUALITY_POLICY,\n): HeadroomRuntimeStatusV2 {\n\treturn {\n\t\tpolicyId: \"context-budget-v2\",\n\t\tselector: \"headroom-selector\",\n\t\theadroomThresholdTokens: policy.headroomThresholdTokens,\n\t\tsummaryMaxAgeTurns: policy.summaryMaxAgeTurns,\n\t\trepresentations: [\"full\", \"pointer\", \"summary\", \"headroom-compressed\", \"omit\"],\n\t};\n}\n\nexport interface RepresentationBudgetContext {\n\treadonly tierUsedTokens: number;\n\treadonly tierCeilingTokens: number;\n\treadonly remainingGlobalTokens: number;\n}\n\nconst CHARS_PER_TOKEN_HEURISTIC = 4;\n\nexport function heuristicTokenCount(text: string): number {\n\tif (text.length === 0) {\n\t\treturn 0;\n\t}\n\treturn Math.max(1, Math.ceil(text.length / CHARS_PER_TOKEN_HEURISTIC));\n}\n\nexport function fullTextTokens(item: ContextBudgetItemV2): number {\n\tif (item.tokenEstimate !== undefined) {\n\t\treturn Math.max(0, Math.floor(item.tokenEstimate));\n\t}\n\treturn heuristicTokenCount(item.text);\n}\n\nexport function estimatePointerTokens(ref: ContextSourceRefV2): number {\n\tlet total = ref.uri.length + (ref.contentHash?.length ?? 0) + 16;\n\tif (ref.symbol) total += ref.symbol.length;\n\tif (ref.range) total += 8;\n\treturn Math.max(8, Math.ceil(total / CHARS_PER_TOKEN_HEURISTIC));\n}\n\nexport function fnv1aHex(input: string): string {\n\tlet hash = 0x811c9dc5;\n\tfor (let i = 0; i < input.length; i++) {\n\t\thash ^= input.charCodeAt(i);\n\t\thash = Math.imul(hash, 0x01000193) >>> 0;\n\t}\n\treturn hash.toString(16).padStart(8, \"0\");\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type ContextBudgetItemV2, type ContextRepresentationCandidateV2, type HeadroomQualityPolicyV2, type RepresentationBudgetContext } from "./context-budget-headroom-types.ts";
|
|
2
2
|
export declare function chooseHeadroomRepresentation(item: ContextBudgetItemV2, budget: RepresentationBudgetContext, policy?: HeadroomQualityPolicyV2): ContextRepresentationCandidateV2;
|
|
3
3
|
export { deriveRepresentationCandidates } from "./context-budget-headroom-candidates.ts";
|
|
4
|
-
export { type ContextBudgetItemV2, type ContextBudgetPriorityV2, type ContextBudgetTierV2, type ContextEvidenceKindV2, type ContextRepresentationCandidateV2, type ContextRepresentationFidelityV2, type ContextRepresentationKindV2, type ContextSourceRefV2, DEFAULT_HEADROOM_QUALITY_POLICY, estimatePointerTokens, fnv1aHex, fullTextTokens, getHeadroomRuntimeStatus, type HeadroomQualityPolicyV2, type HeadroomRuntimeStatusV2, heuristicTokenCount, type RepresentationBudgetContext, } from "./context-budget-headroom-types.ts";
|
|
4
|
+
export { type ContextBudgetItemV2, type ContextBudgetPriorityV2, type ContextBudgetTierV2, type ContextEvidenceKindV2, type ContextRepresentationCacheMetadataV2, type ContextRepresentationCandidateV2, type ContextRepresentationFidelityV2, type ContextRepresentationKindV2, type ContextSourceRefV2, DEFAULT_HEADROOM_QUALITY_POLICY, estimatePointerTokens, fnv1aHex, fullTextTokens, getHeadroomRuntimeStatus, type HeadroomQualityPolicyV2, type HeadroomRuntimeStatusV2, heuristicTokenCount, type RepresentationBudgetContext, } from "./context-budget-headroom-types.ts";
|
|
5
5
|
//# sourceMappingURL=context-budget-headroom.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-budget-headroom.d.ts","sourceRoot":"","sources":["../../src/core/context-budget-headroom.ts"],"names":[],"mappings":"AACA,OAAO,EACN,KAAK,mBAAmB,EAExB,KAAK,gCAAgC,EAGrC,KAAK,uBAAuB,EAC5B,KAAK,2BAA2B,EAChC,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"context-budget-headroom.d.ts","sourceRoot":"","sources":["../../src/core/context-budget-headroom.ts"],"names":[],"mappings":"AACA,OAAO,EACN,KAAK,mBAAmB,EAExB,KAAK,gCAAgC,EAGrC,KAAK,uBAAuB,EAC5B,KAAK,2BAA2B,EAChC,MAAM,oCAAoC,CAAC;AAqB5C,wBAAgB,4BAA4B,CAC3C,IAAI,EAAE,mBAAmB,EACzB,MAAM,EAAE,2BAA2B,EACnC,MAAM,GAAE,uBAAyD,GAC/D,gCAAgC,CAiClC;AAgGD,OAAO,EAAE,8BAA8B,EAAE,MAAM,yCAAyC,CAAC;AACzF,OAAO,EACN,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,oCAAoC,EACzC,KAAK,gCAAgC,EACrC,KAAK,+BAA+B,EACpC,KAAK,2BAA2B,EAChC,KAAK,kBAAkB,EACvB,+BAA+B,EAC/B,qBAAqB,EACrB,QAAQ,EACR,cAAc,EACd,wBAAwB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,mBAAmB,EACnB,KAAK,2BAA2B,GAChC,MAAM,oCAAoC,CAAC","sourcesContent":["import { deriveRepresentationCandidates } from \"./context-budget-headroom-candidates.ts\";\nimport {\n\ttype ContextBudgetItemV2,\n\ttype ContextBudgetPriorityV2,\n\ttype ContextRepresentationCandidateV2,\n\tDEFAULT_HEADROOM_QUALITY_POLICY,\n\tfullTextTokens,\n\ttype HeadroomQualityPolicyV2,\n\ttype RepresentationBudgetContext,\n} from \"./context-budget-headroom-types.ts\";\n\nconst PRIORITY_WEIGHT: Record<ContextBudgetPriorityV2, number> = {\n\thard: 1_000_000,\n\thigh: 120,\n\tmedium: 60,\n\tlow: 15,\n};\n\nconst FIDELITY_BONUS: Record<ContextRepresentationCandidateV2[\"fidelity\"], number> = {\n\texact: 6,\n\tbounded: 3,\n\treversible: 4,\n\tlossy: 0,\n};\n\nconst CACHE_HIT_BONUS = 8;\nconst TIGHT_CACHE_HIT_BONUS = 20;\nconst MATERIALIZED_CACHE_HIT_BONUS = 8;\nconst TIGHT_MATERIALIZED_CACHE_HIT_BONUS = 35;\n\nexport function chooseHeadroomRepresentation(\n\titem: ContextBudgetItemV2,\n\tbudget: RepresentationBudgetContext,\n\tpolicy: HeadroomQualityPolicyV2 = DEFAULT_HEADROOM_QUALITY_POLICY,\n): ContextRepresentationCandidateV2 {\n\tconst candidates = item.representations ?? deriveRepresentationCandidates(item, policy);\n\tconst full = fullTextTokens(item);\n\tconst tierOver = budget.tierUsedTokens >= budget.tierCeilingTokens;\n\tconst globalTight = budget.remainingGlobalTokens < full;\n\tconst tight = tierOver || globalTight;\n\n\tif (item.priority === \"hard\" || item.required) {\n\t\tconst fullCandidate = candidates.find((candidate) => candidate.kind === \"full\");\n\t\tif (fullCandidate) {\n\t\t\treturn fullCandidate;\n\t\t}\n\t}\n\n\tlet best: ContextRepresentationCandidateV2 | undefined;\n\tlet bestScore = Number.NEGATIVE_INFINITY;\n\tfor (const candidate of candidates) {\n\t\tif (isMoreExpensiveThanFull(candidate, full)) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (candidate.kind !== \"omit\" && candidate.estimatedTokens > budget.remainingGlobalTokens) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst score = representationPreference(candidate, item, policy, tight);\n\t\tif (\n\t\t\tscore > bestScore ||\n\t\t\t(score === bestScore && best !== undefined && compareCandidatesForChoice(candidate, best) < 0)\n\t\t) {\n\t\t\tbest = candidate;\n\t\t\tbestScore = score;\n\t\t}\n\t}\n\treturn best ?? candidates.find((candidate) => candidate.kind === \"omit\") ?? omitCandidate(item);\n}\n\nfunction omitCandidate(item: ContextBudgetItemV2): ContextRepresentationCandidateV2 {\n\treturn {\n\t\tkind: \"omit\",\n\t\ttext: \"\",\n\t\testimatedTokens: 0,\n\t\tfidelity: \"lossy\",\n\t\tsourceRef: item.sourceRef,\n\t};\n}\n\nfunction isMoreExpensiveThanFull(candidate: ContextRepresentationCandidateV2, fullTokens: number): boolean {\n\treturn candidate.kind !== \"full\" && candidate.kind !== \"omit\" && candidate.estimatedTokens >= fullTokens;\n}\n\nfunction representationPreference(\n\tcandidate: ContextRepresentationCandidateV2,\n\titem: ContextBudgetItemV2,\n\tpolicy: HeadroomQualityPolicyV2,\n\ttight: boolean,\n): number {\n\tconst priority = PRIORITY_WEIGHT[item.priority];\n\tconst cost = candidate.estimatedTokens;\n\tconst fidelity = FIDELITY_BONUS[candidate.fidelity];\n\tconst retrievable = item.sourceRef?.retrievable === true;\n\tconst cacheBonus =\n\t\tcandidate.cache?.hit === true\n\t\t\t? candidate.cache.keyKind === \"materialized\"\n\t\t\t\t? tight\n\t\t\t\t\t? TIGHT_MATERIALIZED_CACHE_HIT_BONUS\n\t\t\t\t\t: MATERIALIZED_CACHE_HIT_BONUS\n\t\t\t\t: tight\n\t\t\t\t\t? TIGHT_CACHE_HIT_BONUS\n\t\t\t\t\t: CACHE_HIT_BONUS\n\t\t\t: 0;\n\n\tswitch (candidate.kind) {\n\t\tcase \"full\": {\n\t\t\tlet score = priority + fidelity + cacheBonus - cost * 0.05;\n\t\t\tif (tight) score -= 50;\n\t\t\tif (isHistoryLike(item) && (item.ageTurns ?? 0) >= policy.summaryMaxAgeTurns) {\n\t\t\t\tscore -= 40;\n\t\t\t}\n\t\t\treturn score;\n\t\t}\n\t\tcase \"pointer\": {\n\t\t\tif (!policy.preferPointerForRetrievable || !retrievable) {\n\t\t\t\treturn Number.NEGATIVE_INFINITY;\n\t\t\t}\n\t\t\tlet score = 40 + fidelity + cacheBonus - cost * 0.2;\n\t\t\tif (tight) score += 20;\n\t\t\treturn score;\n\t\t}\n\t\tcase \"summary\": {\n\t\t\tconst base = isHistoryLike(item) ? 30 : 10;\n\t\t\tlet score = base + ageBonus(item) + fidelity + cacheBonus - cost * 0.3;\n\t\t\tif (tight) score += 15;\n\t\t\treturn score;\n\t\t}\n\t\tcase \"headroom-compressed\": {\n\t\t\tif (!retrievable) {\n\t\t\t\treturn Number.NEGATIVE_INFINITY;\n\t\t\t}\n\t\t\tconst large = fullTextTokens(item) > policy.headroomThresholdTokens ? 35 : 5;\n\t\t\tlet score = large + 10 + fidelity + cacheBonus - cost * 0.5;\n\t\t\tif (tight) score += 18;\n\t\t\treturn score;\n\t\t}\n\t\tcase \"omit\": {\n\t\t\tif (!policy.allowOmit) {\n\t\t\t\treturn Number.NEGATIVE_INFINITY;\n\t\t\t}\n\t\t\tif (tight && item.priority === \"low\" && retrievable) {\n\t\t\t\treturn 12;\n\t\t\t}\n\t\t\treturn Number.NEGATIVE_INFINITY;\n\t\t}\n\t}\n}\n\nfunction ageBonus(item: ContextBudgetItemV2): number {\n\treturn Math.min(20, (item.ageTurns ?? 0) * 3);\n}\n\nfunction isHistoryLike(item: ContextBudgetItemV2): boolean {\n\treturn item.tier === \"history\" || item.tier === \"evidence\" || item.tier === \"scratch\";\n}\n\nfunction compareCandidatesForChoice(a: ContextRepresentationCandidateV2, b: ContextRepresentationCandidateV2): number {\n\tif (a.estimatedTokens !== b.estimatedTokens) {\n\t\treturn a.estimatedTokens - b.estimatedTokens;\n\t}\n\treturn a.kind.localeCompare(b.kind);\n}\n\nexport { deriveRepresentationCandidates } from \"./context-budget-headroom-candidates.ts\";\nexport {\n\ttype ContextBudgetItemV2,\n\ttype ContextBudgetPriorityV2,\n\ttype ContextBudgetTierV2,\n\ttype ContextEvidenceKindV2,\n\ttype ContextRepresentationCacheMetadataV2,\n\ttype ContextRepresentationCandidateV2,\n\ttype ContextRepresentationFidelityV2,\n\ttype ContextRepresentationKindV2,\n\ttype ContextSourceRefV2,\n\tDEFAULT_HEADROOM_QUALITY_POLICY,\n\testimatePointerTokens,\n\tfnv1aHex,\n\tfullTextTokens,\n\tgetHeadroomRuntimeStatus,\n\ttype HeadroomQualityPolicyV2,\n\ttype HeadroomRuntimeStatusV2,\n\theuristicTokenCount,\n\ttype RepresentationBudgetContext,\n} from \"./context-budget-headroom-types.ts\";\n"]}
|
|
@@ -12,6 +12,10 @@ const FIDELITY_BONUS = {
|
|
|
12
12
|
reversible: 4,
|
|
13
13
|
lossy: 0,
|
|
14
14
|
};
|
|
15
|
+
const CACHE_HIT_BONUS = 8;
|
|
16
|
+
const TIGHT_CACHE_HIT_BONUS = 20;
|
|
17
|
+
const MATERIALIZED_CACHE_HIT_BONUS = 8;
|
|
18
|
+
const TIGHT_MATERIALIZED_CACHE_HIT_BONUS = 35;
|
|
15
19
|
export function chooseHeadroomRepresentation(item, budget, policy = DEFAULT_HEADROOM_QUALITY_POLICY) {
|
|
16
20
|
const candidates = item.representations ?? deriveRepresentationCandidates(item, policy);
|
|
17
21
|
const full = fullTextTokens(item);
|
|
@@ -59,9 +63,18 @@ function representationPreference(candidate, item, policy, tight) {
|
|
|
59
63
|
const cost = candidate.estimatedTokens;
|
|
60
64
|
const fidelity = FIDELITY_BONUS[candidate.fidelity];
|
|
61
65
|
const retrievable = item.sourceRef?.retrievable === true;
|
|
66
|
+
const cacheBonus = candidate.cache?.hit === true
|
|
67
|
+
? candidate.cache.keyKind === "materialized"
|
|
68
|
+
? tight
|
|
69
|
+
? TIGHT_MATERIALIZED_CACHE_HIT_BONUS
|
|
70
|
+
: MATERIALIZED_CACHE_HIT_BONUS
|
|
71
|
+
: tight
|
|
72
|
+
? TIGHT_CACHE_HIT_BONUS
|
|
73
|
+
: CACHE_HIT_BONUS
|
|
74
|
+
: 0;
|
|
62
75
|
switch (candidate.kind) {
|
|
63
76
|
case "full": {
|
|
64
|
-
let score = priority + fidelity - cost * 0.05;
|
|
77
|
+
let score = priority + fidelity + cacheBonus - cost * 0.05;
|
|
65
78
|
if (tight)
|
|
66
79
|
score -= 50;
|
|
67
80
|
if (isHistoryLike(item) && (item.ageTurns ?? 0) >= policy.summaryMaxAgeTurns) {
|
|
@@ -73,14 +86,14 @@ function representationPreference(candidate, item, policy, tight) {
|
|
|
73
86
|
if (!policy.preferPointerForRetrievable || !retrievable) {
|
|
74
87
|
return Number.NEGATIVE_INFINITY;
|
|
75
88
|
}
|
|
76
|
-
let score = 40 + fidelity - cost * 0.2;
|
|
89
|
+
let score = 40 + fidelity + cacheBonus - cost * 0.2;
|
|
77
90
|
if (tight)
|
|
78
91
|
score += 20;
|
|
79
92
|
return score;
|
|
80
93
|
}
|
|
81
94
|
case "summary": {
|
|
82
95
|
const base = isHistoryLike(item) ? 30 : 10;
|
|
83
|
-
let score = base + ageBonus(item) + fidelity - cost * 0.3;
|
|
96
|
+
let score = base + ageBonus(item) + fidelity + cacheBonus - cost * 0.3;
|
|
84
97
|
if (tight)
|
|
85
98
|
score += 15;
|
|
86
99
|
return score;
|
|
@@ -90,7 +103,7 @@ function representationPreference(candidate, item, policy, tight) {
|
|
|
90
103
|
return Number.NEGATIVE_INFINITY;
|
|
91
104
|
}
|
|
92
105
|
const large = fullTextTokens(item) > policy.headroomThresholdTokens ? 35 : 5;
|
|
93
|
-
let score = large + 10 + fidelity - cost * 0.5;
|
|
106
|
+
let score = large + 10 + fidelity + cacheBonus - cost * 0.5;
|
|
94
107
|
if (tight)
|
|
95
108
|
score += 18;
|
|
96
109
|
return score;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-budget-headroom.js","sourceRoot":"","sources":["../../src/core/context-budget-headroom.ts"],"names":[],"mappings":"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","sourcesContent":["import { deriveRepresentationCandidates } from \"./context-budget-headroom-candidates.ts\";\nimport {\n\ttype ContextBudgetItemV2,\n\ttype ContextBudgetPriorityV2,\n\ttype ContextRepresentationCandidateV2,\n\tDEFAULT_HEADROOM_QUALITY_POLICY,\n\tfullTextTokens,\n\ttype HeadroomQualityPolicyV2,\n\ttype RepresentationBudgetContext,\n} from \"./context-budget-headroom-types.ts\";\n\nconst PRIORITY_WEIGHT: Record<ContextBudgetPriorityV2, number> = {\n\thard: 1_000_000,\n\thigh: 120,\n\tmedium: 60,\n\tlow: 15,\n};\n\nconst FIDELITY_BONUS: Record<ContextRepresentationCandidateV2[\"fidelity\"], number> = {\n\texact: 6,\n\tbounded: 3,\n\treversible: 4,\n\tlossy: 0,\n};\n\nexport function chooseHeadroomRepresentation(\n\titem: ContextBudgetItemV2,\n\tbudget: RepresentationBudgetContext,\n\tpolicy: HeadroomQualityPolicyV2 = DEFAULT_HEADROOM_QUALITY_POLICY,\n): ContextRepresentationCandidateV2 {\n\tconst candidates = item.representations ?? deriveRepresentationCandidates(item, policy);\n\tconst full = fullTextTokens(item);\n\tconst tierOver = budget.tierUsedTokens >= budget.tierCeilingTokens;\n\tconst globalTight = budget.remainingGlobalTokens < full;\n\tconst tight = tierOver || globalTight;\n\n\tif (item.priority === \"hard\" || item.required) {\n\t\tconst fullCandidate = candidates.find((candidate) => candidate.kind === \"full\");\n\t\tif (fullCandidate) {\n\t\t\treturn fullCandidate;\n\t\t}\n\t}\n\n\tlet best: ContextRepresentationCandidateV2 | undefined;\n\tlet bestScore = Number.NEGATIVE_INFINITY;\n\tfor (const candidate of candidates) {\n\t\tif (isMoreExpensiveThanFull(candidate, full)) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (candidate.kind !== \"omit\" && candidate.estimatedTokens > budget.remainingGlobalTokens) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst score = representationPreference(candidate, item, policy, tight);\n\t\tif (\n\t\t\tscore > bestScore ||\n\t\t\t(score === bestScore && best !== undefined && compareCandidatesForChoice(candidate, best) < 0)\n\t\t) {\n\t\t\tbest = candidate;\n\t\t\tbestScore = score;\n\t\t}\n\t}\n\treturn best ?? candidates.find((candidate) => candidate.kind === \"omit\") ?? omitCandidate(item);\n}\n\nfunction omitCandidate(item: ContextBudgetItemV2): ContextRepresentationCandidateV2 {\n\treturn {\n\t\tkind: \"omit\",\n\t\ttext: \"\",\n\t\testimatedTokens: 0,\n\t\tfidelity: \"lossy\",\n\t\tsourceRef: item.sourceRef,\n\t};\n}\n\nfunction isMoreExpensiveThanFull(candidate: ContextRepresentationCandidateV2, fullTokens: number): boolean {\n\treturn candidate.kind !== \"full\" && candidate.kind !== \"omit\" && candidate.estimatedTokens >= fullTokens;\n}\n\nfunction representationPreference(\n\tcandidate: ContextRepresentationCandidateV2,\n\titem: ContextBudgetItemV2,\n\tpolicy: HeadroomQualityPolicyV2,\n\ttight: boolean,\n): number {\n\tconst priority = PRIORITY_WEIGHT[item.priority];\n\tconst cost = candidate.estimatedTokens;\n\tconst fidelity = FIDELITY_BONUS[candidate.fidelity];\n\tconst retrievable = item.sourceRef?.retrievable === true;\n\n\tswitch (candidate.kind) {\n\t\tcase \"full\": {\n\t\t\tlet score = priority + fidelity - cost * 0.05;\n\t\t\tif (tight) score -= 50;\n\t\t\tif (isHistoryLike(item) && (item.ageTurns ?? 0) >= policy.summaryMaxAgeTurns) {\n\t\t\t\tscore -= 40;\n\t\t\t}\n\t\t\treturn score;\n\t\t}\n\t\tcase \"pointer\": {\n\t\t\tif (!policy.preferPointerForRetrievable || !retrievable) {\n\t\t\t\treturn Number.NEGATIVE_INFINITY;\n\t\t\t}\n\t\t\tlet score = 40 + fidelity - cost * 0.2;\n\t\t\tif (tight) score += 20;\n\t\t\treturn score;\n\t\t}\n\t\tcase \"summary\": {\n\t\t\tconst base = isHistoryLike(item) ? 30 : 10;\n\t\t\tlet score = base + ageBonus(item) + fidelity - cost * 0.3;\n\t\t\tif (tight) score += 15;\n\t\t\treturn score;\n\t\t}\n\t\tcase \"headroom-compressed\": {\n\t\t\tif (!retrievable) {\n\t\t\t\treturn Number.NEGATIVE_INFINITY;\n\t\t\t}\n\t\t\tconst large = fullTextTokens(item) > policy.headroomThresholdTokens ? 35 : 5;\n\t\t\tlet score = large + 10 + fidelity - cost * 0.5;\n\t\t\tif (tight) score += 18;\n\t\t\treturn score;\n\t\t}\n\t\tcase \"omit\": {\n\t\t\tif (!policy.allowOmit) {\n\t\t\t\treturn Number.NEGATIVE_INFINITY;\n\t\t\t}\n\t\t\tif (tight && item.priority === \"low\" && retrievable) {\n\t\t\t\treturn 12;\n\t\t\t}\n\t\t\treturn Number.NEGATIVE_INFINITY;\n\t\t}\n\t}\n}\n\nfunction ageBonus(item: ContextBudgetItemV2): number {\n\treturn Math.min(20, (item.ageTurns ?? 0) * 3);\n}\n\nfunction isHistoryLike(item: ContextBudgetItemV2): boolean {\n\treturn item.tier === \"history\" || item.tier === \"evidence\" || item.tier === \"scratch\";\n}\n\nfunction compareCandidatesForChoice(a: ContextRepresentationCandidateV2, b: ContextRepresentationCandidateV2): number {\n\tif (a.estimatedTokens !== b.estimatedTokens) {\n\t\treturn a.estimatedTokens - b.estimatedTokens;\n\t}\n\treturn a.kind.localeCompare(b.kind);\n}\n\nexport { deriveRepresentationCandidates } from \"./context-budget-headroom-candidates.ts\";\nexport {\n\ttype ContextBudgetItemV2,\n\ttype ContextBudgetPriorityV2,\n\ttype ContextBudgetTierV2,\n\ttype ContextEvidenceKindV2,\n\ttype ContextRepresentationCandidateV2,\n\ttype ContextRepresentationFidelityV2,\n\ttype ContextRepresentationKindV2,\n\ttype ContextSourceRefV2,\n\tDEFAULT_HEADROOM_QUALITY_POLICY,\n\testimatePointerTokens,\n\tfnv1aHex,\n\tfullTextTokens,\n\tgetHeadroomRuntimeStatus,\n\ttype HeadroomQualityPolicyV2,\n\ttype HeadroomRuntimeStatusV2,\n\theuristicTokenCount,\n\ttype RepresentationBudgetContext,\n} from \"./context-budget-headroom-types.ts\";\n"]}
|
|
1
|
+
{"version":3,"file":"context-budget-headroom.js","sourceRoot":"","sources":["../../src/core/context-budget-headroom.ts"],"names":[],"mappings":"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","sourcesContent":["import { deriveRepresentationCandidates } from \"./context-budget-headroom-candidates.ts\";\nimport {\n\ttype ContextBudgetItemV2,\n\ttype ContextBudgetPriorityV2,\n\ttype ContextRepresentationCandidateV2,\n\tDEFAULT_HEADROOM_QUALITY_POLICY,\n\tfullTextTokens,\n\ttype HeadroomQualityPolicyV2,\n\ttype RepresentationBudgetContext,\n} from \"./context-budget-headroom-types.ts\";\n\nconst PRIORITY_WEIGHT: Record<ContextBudgetPriorityV2, number> = {\n\thard: 1_000_000,\n\thigh: 120,\n\tmedium: 60,\n\tlow: 15,\n};\n\nconst FIDELITY_BONUS: Record<ContextRepresentationCandidateV2[\"fidelity\"], number> = {\n\texact: 6,\n\tbounded: 3,\n\treversible: 4,\n\tlossy: 0,\n};\n\nconst CACHE_HIT_BONUS = 8;\nconst TIGHT_CACHE_HIT_BONUS = 20;\nconst MATERIALIZED_CACHE_HIT_BONUS = 8;\nconst TIGHT_MATERIALIZED_CACHE_HIT_BONUS = 35;\n\nexport function chooseHeadroomRepresentation(\n\titem: ContextBudgetItemV2,\n\tbudget: RepresentationBudgetContext,\n\tpolicy: HeadroomQualityPolicyV2 = DEFAULT_HEADROOM_QUALITY_POLICY,\n): ContextRepresentationCandidateV2 {\n\tconst candidates = item.representations ?? deriveRepresentationCandidates(item, policy);\n\tconst full = fullTextTokens(item);\n\tconst tierOver = budget.tierUsedTokens >= budget.tierCeilingTokens;\n\tconst globalTight = budget.remainingGlobalTokens < full;\n\tconst tight = tierOver || globalTight;\n\n\tif (item.priority === \"hard\" || item.required) {\n\t\tconst fullCandidate = candidates.find((candidate) => candidate.kind === \"full\");\n\t\tif (fullCandidate) {\n\t\t\treturn fullCandidate;\n\t\t}\n\t}\n\n\tlet best: ContextRepresentationCandidateV2 | undefined;\n\tlet bestScore = Number.NEGATIVE_INFINITY;\n\tfor (const candidate of candidates) {\n\t\tif (isMoreExpensiveThanFull(candidate, full)) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (candidate.kind !== \"omit\" && candidate.estimatedTokens > budget.remainingGlobalTokens) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst score = representationPreference(candidate, item, policy, tight);\n\t\tif (\n\t\t\tscore > bestScore ||\n\t\t\t(score === bestScore && best !== undefined && compareCandidatesForChoice(candidate, best) < 0)\n\t\t) {\n\t\t\tbest = candidate;\n\t\t\tbestScore = score;\n\t\t}\n\t}\n\treturn best ?? candidates.find((candidate) => candidate.kind === \"omit\") ?? omitCandidate(item);\n}\n\nfunction omitCandidate(item: ContextBudgetItemV2): ContextRepresentationCandidateV2 {\n\treturn {\n\t\tkind: \"omit\",\n\t\ttext: \"\",\n\t\testimatedTokens: 0,\n\t\tfidelity: \"lossy\",\n\t\tsourceRef: item.sourceRef,\n\t};\n}\n\nfunction isMoreExpensiveThanFull(candidate: ContextRepresentationCandidateV2, fullTokens: number): boolean {\n\treturn candidate.kind !== \"full\" && candidate.kind !== \"omit\" && candidate.estimatedTokens >= fullTokens;\n}\n\nfunction representationPreference(\n\tcandidate: ContextRepresentationCandidateV2,\n\titem: ContextBudgetItemV2,\n\tpolicy: HeadroomQualityPolicyV2,\n\ttight: boolean,\n): number {\n\tconst priority = PRIORITY_WEIGHT[item.priority];\n\tconst cost = candidate.estimatedTokens;\n\tconst fidelity = FIDELITY_BONUS[candidate.fidelity];\n\tconst retrievable = item.sourceRef?.retrievable === true;\n\tconst cacheBonus =\n\t\tcandidate.cache?.hit === true\n\t\t\t? candidate.cache.keyKind === \"materialized\"\n\t\t\t\t? tight\n\t\t\t\t\t? TIGHT_MATERIALIZED_CACHE_HIT_BONUS\n\t\t\t\t\t: MATERIALIZED_CACHE_HIT_BONUS\n\t\t\t\t: tight\n\t\t\t\t\t? TIGHT_CACHE_HIT_BONUS\n\t\t\t\t\t: CACHE_HIT_BONUS\n\t\t\t: 0;\n\n\tswitch (candidate.kind) {\n\t\tcase \"full\": {\n\t\t\tlet score = priority + fidelity + cacheBonus - cost * 0.05;\n\t\t\tif (tight) score -= 50;\n\t\t\tif (isHistoryLike(item) && (item.ageTurns ?? 0) >= policy.summaryMaxAgeTurns) {\n\t\t\t\tscore -= 40;\n\t\t\t}\n\t\t\treturn score;\n\t\t}\n\t\tcase \"pointer\": {\n\t\t\tif (!policy.preferPointerForRetrievable || !retrievable) {\n\t\t\t\treturn Number.NEGATIVE_INFINITY;\n\t\t\t}\n\t\t\tlet score = 40 + fidelity + cacheBonus - cost * 0.2;\n\t\t\tif (tight) score += 20;\n\t\t\treturn score;\n\t\t}\n\t\tcase \"summary\": {\n\t\t\tconst base = isHistoryLike(item) ? 30 : 10;\n\t\t\tlet score = base + ageBonus(item) + fidelity + cacheBonus - cost * 0.3;\n\t\t\tif (tight) score += 15;\n\t\t\treturn score;\n\t\t}\n\t\tcase \"headroom-compressed\": {\n\t\t\tif (!retrievable) {\n\t\t\t\treturn Number.NEGATIVE_INFINITY;\n\t\t\t}\n\t\t\tconst large = fullTextTokens(item) > policy.headroomThresholdTokens ? 35 : 5;\n\t\t\tlet score = large + 10 + fidelity + cacheBonus - cost * 0.5;\n\t\t\tif (tight) score += 18;\n\t\t\treturn score;\n\t\t}\n\t\tcase \"omit\": {\n\t\t\tif (!policy.allowOmit) {\n\t\t\t\treturn Number.NEGATIVE_INFINITY;\n\t\t\t}\n\t\t\tif (tight && item.priority === \"low\" && retrievable) {\n\t\t\t\treturn 12;\n\t\t\t}\n\t\t\treturn Number.NEGATIVE_INFINITY;\n\t\t}\n\t}\n}\n\nfunction ageBonus(item: ContextBudgetItemV2): number {\n\treturn Math.min(20, (item.ageTurns ?? 0) * 3);\n}\n\nfunction isHistoryLike(item: ContextBudgetItemV2): boolean {\n\treturn item.tier === \"history\" || item.tier === \"evidence\" || item.tier === \"scratch\";\n}\n\nfunction compareCandidatesForChoice(a: ContextRepresentationCandidateV2, b: ContextRepresentationCandidateV2): number {\n\tif (a.estimatedTokens !== b.estimatedTokens) {\n\t\treturn a.estimatedTokens - b.estimatedTokens;\n\t}\n\treturn a.kind.localeCompare(b.kind);\n}\n\nexport { deriveRepresentationCandidates } from \"./context-budget-headroom-candidates.ts\";\nexport {\n\ttype ContextBudgetItemV2,\n\ttype ContextBudgetPriorityV2,\n\ttype ContextBudgetTierV2,\n\ttype ContextEvidenceKindV2,\n\ttype ContextRepresentationCacheMetadataV2,\n\ttype ContextRepresentationCandidateV2,\n\ttype ContextRepresentationFidelityV2,\n\ttype ContextRepresentationKindV2,\n\ttype ContextSourceRefV2,\n\tDEFAULT_HEADROOM_QUALITY_POLICY,\n\testimatePointerTokens,\n\tfnv1aHex,\n\tfullTextTokens,\n\tgetHeadroomRuntimeStatus,\n\ttype HeadroomQualityPolicyV2,\n\ttype HeadroomRuntimeStatusV2,\n\theuristicTokenCount,\n\ttype RepresentationBudgetContext,\n} from \"./context-budget-headroom-types.ts\";\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type PromptContextBudgetPlanV2 } from "./context-budget-governor-v2.ts";
|
|
1
|
+
import { type ContextBudgetCacheProviderV2, type PromptContextBudgetPlanV2 } from "./context-budget-governor-v2.ts";
|
|
2
2
|
import { type ContextBudgetTokenizerMode, type TokenCounterAdapter } from "./context-budget-token-counter.ts";
|
|
3
3
|
import type { ContextFile } from "./resource-loader.ts";
|
|
4
4
|
import type { Skill } from "./skills.ts";
|
|
@@ -11,6 +11,7 @@ export interface SystemPromptContextBudgetOptions {
|
|
|
11
11
|
readonly includeSkillInventory?: boolean;
|
|
12
12
|
readonly includeFullContextFiles?: boolean;
|
|
13
13
|
readonly tokenCounter?: TokenCounterAdapter;
|
|
14
|
+
readonly cacheProvider?: ContextBudgetCacheProviderV2;
|
|
14
15
|
/** Maximum number of inactive (non-active) skills to include as items. Default: 15. */
|
|
15
16
|
readonly maxInactiveSkills?: number;
|
|
16
17
|
/** Current user query text for relevance-aware skill ranking. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-budget-system-prompt.d.ts","sourceRoot":"","sources":["../../src/core/context-budget-system-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"context-budget-system-prompt.d.ts","sourceRoot":"","sources":["../../src/core/context-budget-system-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,4BAA4B,EAEjC,KAAK,yBAAyB,EAE9B,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACN,KAAK,0BAA0B,EAE/B,KAAK,mBAAmB,EACxB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,WAAW,gCAAgC;IAChD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE,0BAA0B,CAAC;IACpD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IACzC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAC3C,QAAQ,CAAC,YAAY,CAAC,EAAE,mBAAmB,CAAC;IAC5C,QAAQ,CAAC,aAAa,CAAC,EAAE,4BAA4B,CAAC;IACtD,uFAAuF;IACvF,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,iEAAiE;IACjE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,kCAAkC;IAClD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,SAAS,WAAW,EAAE,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,gCAAgC,CAAC;CACnD;AAED,MAAM,WAAW,6BAA6B;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;CACzC;AAED,wBAAgB,mCAAmC,CAClD,KAAK,EAAE,kCAAkC,GACvC,6BAA6B,CA6B/B","sourcesContent":["import {\n\tCONTEXT_BUDGET_POLICY_VERSION_V2,\n\ttype ContextBudgetCacheProviderV2,\n\ttype ContextBudgetItemV2,\n\ttype PromptContextBudgetPlanV2,\n\tplanPromptContextBudgetV2,\n} from \"./context-budget-governor-v2.ts\";\nimport { createSystemPromptBudgetItems, escapeXml } from \"./context-budget-system-prompt-items.ts\";\nimport {\n\ttype ContextBudgetTokenizerMode,\n\tcreateTokenCounterForMode,\n\ttype TokenCounterAdapter,\n} from \"./context-budget-token-counter.ts\";\nimport type { ContextFile } from \"./resource-loader.ts\";\nimport type { Skill } from \"./skills.ts\";\n\nexport interface SystemPromptContextBudgetOptions {\n\treadonly maxPromptTokens: number;\n\treadonly responseReserveTokens?: number;\n\treadonly modelId?: string;\n\treadonly tokenizerMode?: ContextBudgetTokenizerMode;\n\treadonly activeSkillNames?: readonly string[];\n\treadonly includeSkillInventory?: boolean;\n\treadonly includeFullContextFiles?: boolean;\n\treadonly tokenCounter?: TokenCounterAdapter;\n\treadonly cacheProvider?: ContextBudgetCacheProviderV2;\n\t/** Maximum number of inactive (non-active) skills to include as items. Default: 15. */\n\treadonly maxInactiveSkills?: number;\n\t/** Current user query text for relevance-aware skill ranking. */\n\treadonly queryContext?: string;\n}\n\nexport interface SystemPromptBudgetedResourcesInput {\n\treadonly basePrompt: string;\n\treadonly contextFiles: readonly ContextFile[];\n\treadonly skills: readonly Skill[];\n\treadonly includeSkills: boolean;\n\treadonly options: SystemPromptContextBudgetOptions;\n}\n\nexport interface SystemPromptBudgetedResources {\n\treadonly text: string;\n\treadonly plan: PromptContextBudgetPlanV2;\n}\n\nexport function renderSystemPromptBudgetedResources(\n\tinput: SystemPromptBudgetedResourcesInput,\n): SystemPromptBudgetedResources {\n\tconst tokenCounter =\n\t\tinput.options.tokenCounter ?? createTokenCounterForMode(input.options.tokenizerMode ?? \"fallback\");\n\tconst modelId = input.options.modelId ?? \"unknown\";\n\tconst baseTokens = tokenCounter.countText(input.basePrompt, modelId).tokens;\n\tconst resourceBudget = Math.max(0, input.options.maxPromptTokens - baseTokens);\n\tconst items = createSystemPromptBudgetItems(input, resourceBudget);\n\tconst plan = planPromptContextBudgetV2({\n\t\tmaxTokens: resourceBudget,\n\t\tresponseReserveTokens: input.options.responseReserveTokens ?? 0,\n\t\tmodelId,\n\t\tpolicyVersion: CONTEXT_BUDGET_POLICY_VERSION_V2,\n\t\tquery: input.options.queryContext,\n\t\titems,\n\t\ttokenCounter,\n\t\tcacheProvider: input.options.cacheProvider,\n\t});\n\tconst included = new Set(plan.includedItemIds);\n\tconst filtered = deduplicatePointerFull(items, included);\n\tconst text = filtered\n\t\t.filter((item) => included.has(item.id))\n\t\t.map(\n\t\t\t(item) =>\n\t\t\t\tplan.selectedRepresentations.find((representation) => representation.itemId === item.id)?.text ?? item.text,\n\t\t)\n\t\t.join(\"\\n\")\n\t\t.trimEnd();\n\tconst note = renderBudgetNote(plan, baseTokens);\n\treturn { text: text ? `${text}\\n${note}` : note, plan };\n}\n\nfunction renderBudgetNote(plan: PromptContextBudgetPlanV2, baseTokens: number): string {\n\tconst omitted = plan.omittedItemIds.length;\n\tconst { cache, counts, diagnosticReasons, tokenOptimizer, tokens } = plan.observability;\n\tconst selectedCacheHits =\n\t\tcache.representationCache.exactHits +\n\t\tcache.representationCache.semanticHits +\n\t\tcache.representationCache.pointerHits;\n\tconst renderedDiagnosticReasons =\n\t\tdiagnosticReasons.length === 0\n\t\t\t? ' <diagnostic_reasons count=\"0\" />'\n\t\t\t: [\n\t\t\t\t\t` <diagnostic_reasons count=\"${formatObservableInteger(diagnosticReasons.length)}\">`,\n\t\t\t\t\t...diagnosticReasons.map((reason) => ` <reason>${escapeXml(reason)}</reason>`),\n\t\t\t\t\t\" </diagnostic_reasons>\",\n\t\t\t\t].join(\"\\n\");\n\treturn [\n\t\t\"<context_budget>\",\n\t\t` <policy>${escapeXml(plan.policyVersion)}</policy>`,\n\t\t` <plan_hash>${escapeXml(plan.planHash)}</plan_hash>`,\n\t\t` <base_prompt_tokens>${formatObservableInteger(baseTokens)}</base_prompt_tokens>`,\n\t\t` <resource_tokens_used>${formatObservableInteger(plan.usedTokens)}</resource_tokens_used>`,\n\t\t` <resource_tokens_omitted>${formatObservableInteger(plan.omittedTokens)}</resource_tokens_omitted>`,\n\t\t` <omitted_items>${formatObservableInteger(omitted)}</omitted_items>`,\n\t\t` <emergency>${plan.emergency ? \"true\" : \"false\"}</emergency>`,\n\t\t\" <decision_observability>\",\n\t\t` <counts selected=\"${formatObservableInteger(counts.selected)}\" omitted=\"${formatObservableInteger(counts.omitted)}\" pointer=\"${formatObservableInteger(counts.pointer)}\" compressed=\"${formatObservableInteger(counts.compressed)}\" full=\"${formatObservableInteger(counts.full)}\" retrieval_fallbacks=\"${formatObservableInteger(counts.retrievalFallback)}\" />`,\n\t\t` <tokens available=\"${formatObservableInteger(tokens.available)}\" used=\"${formatObservableInteger(tokens.used)}\" raw=\"${formatObservableInteger(tokens.raw)}\" omitted=\"${formatObservableInteger(tokens.omitted)}\" token_savings=\"${formatObservableInteger(tokens.tokenSavings)}\" />`,\n\t\t` <cache_decision plan_hit=\"${cache.planCache.hit ? \"true\" : \"false\"}\" selected_hits=\"${formatObservableInteger(selectedCacheHits)}\" misses=\"${formatObservableInteger(cache.representationCache.misses)}\" stale_rejects=\"${formatObservableInteger(cache.representationCache.staleRejects)}\" negative_hits=\"${formatObservableInteger(cache.representationCache.negativeHits)}\" writes=\"${formatObservableInteger(cache.representationCache.writes)}\" />`,\n\t\trenderedDiagnosticReasons,\n\t\t` <token_optimizer optimizer_id=\"${escapeXml(tokenOptimizer.optimizerId)}\" status=\"${escapeXml(tokenOptimizer.status)}\" active=\"${tokenOptimizer.active ? \"true\" : \"false\"}\" active_context_budget_optimizer=\"${escapeXml(tokenOptimizer.activeContextBudgetOptimizer)}\" compatibility_only=\"${tokenOptimizer.compatibilityOnly ? \"true\" : \"false\"}\" />`,\n\t\t\" </decision_observability>\",\n\t\t\" <note>Some low-priority resource inventory may be represented by pointers. Use read on referenced paths when needed.</note>\",\n\t\t\"</context_budget>\",\n\t].join(\"\\n\");\n}\n\nfunction formatObservableInteger(value: number): string {\n\tif (!Number.isFinite(value)) {\n\t\treturn \"0\";\n\t}\n\treturn String(Math.max(0, Math.floor(value)));\n}\n\n/**\n * R3: When a context-full item is included, exclude the matching pointer\n * so the same file does not consume tokens twice.\n */\nfunction deduplicatePointerFull(\n\titems: readonly ContextBudgetItemV2[],\n\tincluded: ReadonlySet<string>,\n): readonly ContextBudgetItemV2[] {\n\tconst includedFullPaths = new Set<string>();\n\tfor (const item of items) {\n\t\tif (item.id.startsWith(\"context-full:\") && included.has(item.id)) {\n\t\t\tconst path = item.id.slice(\"context-full:\".length);\n\t\t\tincludedFullPaths.add(path);\n\t\t}\n\t}\n\tif (includedFullPaths.size === 0) {\n\t\treturn items;\n\t}\n\treturn items.filter((item) => {\n\t\tif (!item.id.startsWith(\"context-pointer:\")) {\n\t\t\treturn true;\n\t\t}\n\t\tconst path = item.id.slice(\"context-pointer:\".length);\n\t\treturn !includedFullPaths.has(path);\n\t});\n}\n"]}
|