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
|
@@ -15,6 +15,7 @@ export function renderSystemPromptBudgetedResources(input) {
|
|
|
15
15
|
query: input.options.queryContext,
|
|
16
16
|
items,
|
|
17
17
|
tokenCounter,
|
|
18
|
+
cacheProvider: input.options.cacheProvider,
|
|
18
19
|
});
|
|
19
20
|
const included = new Set(plan.includedItemIds);
|
|
20
21
|
const filtered = deduplicatePointerFull(items, included);
|
|
@@ -28,7 +29,10 @@ export function renderSystemPromptBudgetedResources(input) {
|
|
|
28
29
|
}
|
|
29
30
|
function renderBudgetNote(plan, baseTokens) {
|
|
30
31
|
const omitted = plan.omittedItemIds.length;
|
|
31
|
-
const { counts, diagnosticReasons, tokenOptimizer, tokens } = plan.observability;
|
|
32
|
+
const { cache, counts, diagnosticReasons, tokenOptimizer, tokens } = plan.observability;
|
|
33
|
+
const selectedCacheHits = cache.representationCache.exactHits +
|
|
34
|
+
cache.representationCache.semanticHits +
|
|
35
|
+
cache.representationCache.pointerHits;
|
|
32
36
|
const renderedDiagnosticReasons = diagnosticReasons.length === 0
|
|
33
37
|
? ' <diagnostic_reasons count="0" />'
|
|
34
38
|
: [
|
|
@@ -48,6 +52,7 @@ function renderBudgetNote(plan, baseTokens) {
|
|
|
48
52
|
" <decision_observability>",
|
|
49
53
|
` <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)}" />`,
|
|
50
54
|
` <tokens available="${formatObservableInteger(tokens.available)}" used="${formatObservableInteger(tokens.used)}" raw="${formatObservableInteger(tokens.raw)}" omitted="${formatObservableInteger(tokens.omitted)}" token_savings="${formatObservableInteger(tokens.tokenSavings)}" />`,
|
|
55
|
+
` <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)}" />`,
|
|
51
56
|
renderedDiagnosticReasons,
|
|
52
57
|
` <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"}" />`,
|
|
53
58
|
" </decision_observability>",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-budget-system-prompt.js","sourceRoot":"","sources":["../../src/core/context-budget-system-prompt.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tCONTEXT_BUDGET_POLICY_VERSION_V2,\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\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});\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 { counts, diagnosticReasons, tokenOptimizer, tokens } = plan.observability;\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\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"]}
|
|
1
|
+
{"version":3,"file":"context-budget-system-prompt.js","sourceRoot":"","sources":["../../src/core/context-budget-system-prompt.ts"],"names":[],"mappings":"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","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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-budget-v2-cache-hash.d.ts","sourceRoot":"","sources":["../../src/core/context-budget-v2-cache-hash.ts"],"names":[],"mappings":"AAEA,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEtD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C","sourcesContent":["import { createHash } from \"node:crypto\";\n\nexport function sha256Canonical(value: unknown): string {\n\treturn sha256Hex(JSON.stringify(sortCanonical(value)));\n}\n\nexport function sha256Hex(value: string): string {\n\treturn createHash(\"sha256\").update(value, \"utf8\").digest(\"hex\");\n}\n\nfunction sortCanonical(value: unknown): unknown {\n\tif (Array.isArray(value)) return value.map(sortCanonical);\n\tif (!value || typeof value !== \"object\") return value;\n\tconst entries = Object.entries(value).sort(([a], [b]) => a.localeCompare(b));\n\treturn Object.fromEntries(entries.map(([key, item]) => [key, sortCanonical(item)]));\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
export function sha256Canonical(value) {
|
|
3
|
+
return sha256Hex(JSON.stringify(sortCanonical(value)));
|
|
4
|
+
}
|
|
5
|
+
export function sha256Hex(value) {
|
|
6
|
+
return createHash("sha256").update(value, "utf8").digest("hex");
|
|
7
|
+
}
|
|
8
|
+
function sortCanonical(value) {
|
|
9
|
+
if (Array.isArray(value))
|
|
10
|
+
return value.map(sortCanonical);
|
|
11
|
+
if (!value || typeof value !== "object")
|
|
12
|
+
return value;
|
|
13
|
+
const entries = Object.entries(value).sort(([a], [b]) => a.localeCompare(b));
|
|
14
|
+
return Object.fromEntries(entries.map(([key, item]) => [key, sortCanonical(item)]));
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=context-budget-v2-cache-hash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-budget-v2-cache-hash.js","sourceRoot":"","sources":["../../src/core/context-budget-v2-cache-hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,eAAe,CAAC,KAAc,EAAU;IACvD,OAAO,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAAA,CACvD;AAED,MAAM,UAAU,SAAS,CAAC,KAAa,EAAU;IAChD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAAA,CAChE;AAED,SAAS,aAAa,CAAC,KAAc,EAAW;IAC/C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC1D,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAAA,CACpF","sourcesContent":["import { createHash } from \"node:crypto\";\n\nexport function sha256Canonical(value: unknown): string {\n\treturn sha256Hex(JSON.stringify(sortCanonical(value)));\n}\n\nexport function sha256Hex(value: string): string {\n\treturn createHash(\"sha256\").update(value, \"utf8\").digest(\"hex\");\n}\n\nfunction sortCanonical(value: unknown): unknown {\n\tif (Array.isArray(value)) return value.map(sortCanonical);\n\tif (!value || typeof value !== \"object\") return value;\n\tconst entries = Object.entries(value).sort(([a], [b]) => a.localeCompare(b));\n\treturn Object.fromEntries(entries.map(([key, item]) => [key, sortCanonical(item)]));\n}\n"]}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { ContextRepresentationCandidateV2, ContextRepresentationKindV2 } from "./context-budget-headroom.ts";
|
|
2
|
+
export declare const DEFAULT_MATERIALIZED_COMPRESSOR_POLICY_HASH_V2 = "context-budget-v2-default-compressor";
|
|
3
|
+
export declare const DEFAULT_MATERIALIZED_QUALITY_POLICY_HASH_V2 = "context-budget-v2-default-quality";
|
|
4
|
+
type ContextBudgetRepresentationFingerprintInputV2 = Pick<ContextRepresentationCandidateV2, "compressorId" | "estimatedTokens" | "fidelity" | "kind" | "sourceRef" | "summaryHash" | "text">;
|
|
5
|
+
export interface ContextBudgetCacheKeyBaseV2 {
|
|
6
|
+
readonly namespace: string;
|
|
7
|
+
readonly modelId: string;
|
|
8
|
+
readonly tokenizerId: string;
|
|
9
|
+
readonly policyVersion: string;
|
|
10
|
+
readonly queryIntentHash: string;
|
|
11
|
+
readonly queryIntentCluster?: string;
|
|
12
|
+
readonly budgetBucket: string;
|
|
13
|
+
readonly redactionPolicyHash: string;
|
|
14
|
+
readonly safetyProfileHash: string;
|
|
15
|
+
readonly compressorPolicyHash?: string;
|
|
16
|
+
readonly qualityPolicyHash?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function createContextBudgetCacheKeyBaseV2(input: {
|
|
19
|
+
readonly namespace?: string;
|
|
20
|
+
readonly modelId: string;
|
|
21
|
+
readonly tokenizerId?: string;
|
|
22
|
+
readonly policyVersion: string;
|
|
23
|
+
readonly query?: string;
|
|
24
|
+
readonly queryIntentHash?: string;
|
|
25
|
+
readonly queryIntentCluster?: string;
|
|
26
|
+
readonly budgetBucket?: string;
|
|
27
|
+
readonly redactionPolicyHash?: string;
|
|
28
|
+
readonly safetyProfileHash?: string;
|
|
29
|
+
readonly compressorPolicyHash?: string;
|
|
30
|
+
readonly qualityPolicyHash?: string;
|
|
31
|
+
}): ContextBudgetCacheKeyBaseV2;
|
|
32
|
+
export declare function computeContextBudgetQueryIntentHashV2(query: string | undefined): string;
|
|
33
|
+
export declare function buildContextBudgetRepresentationCacheKeyV2(input: ContextBudgetCacheKeyBaseV2 & {
|
|
34
|
+
readonly representationKind: ContextRepresentationKindV2;
|
|
35
|
+
readonly sourceHash: string;
|
|
36
|
+
readonly representationFingerprint?: string;
|
|
37
|
+
readonly compressorId?: string;
|
|
38
|
+
}): string;
|
|
39
|
+
export declare function buildContextBudgetExactRepresentationCacheKeyV2(input: ContextBudgetCacheKeyBaseV2 & {
|
|
40
|
+
readonly representationKind: ContextRepresentationKindV2;
|
|
41
|
+
readonly sourceHash: string;
|
|
42
|
+
readonly representationFingerprint?: string;
|
|
43
|
+
readonly compressorId?: string;
|
|
44
|
+
}): string;
|
|
45
|
+
export declare function buildContextBudgetMaterializedRepresentationCacheKeyV2(input: ContextBudgetCacheKeyBaseV2 & {
|
|
46
|
+
readonly representationKind: ContextRepresentationKindV2;
|
|
47
|
+
readonly sourceHash: string;
|
|
48
|
+
readonly compressorId?: string;
|
|
49
|
+
readonly targetTokenBucket: number;
|
|
50
|
+
}): string;
|
|
51
|
+
export declare function computeContextBudgetRepresentationFingerprintV2(candidate: ContextBudgetRepresentationFingerprintInputV2): string;
|
|
52
|
+
export declare function buildContextBudgetRepresentationCandidateKeyV2(keyBase: ContextBudgetCacheKeyBaseV2, candidate: ContextBudgetRepresentationFingerprintInputV2, sourceHash: string): string;
|
|
53
|
+
export declare function buildContextBudgetMaterializedRepresentationCandidateKeyV2(keyBase: ContextBudgetCacheKeyBaseV2, candidate: ContextBudgetRepresentationFingerprintInputV2, sourceHash: string): string;
|
|
54
|
+
export declare function computeContextBudgetTargetTokenBucketV2(tokens: number): number;
|
|
55
|
+
export declare function computeContextBudgetOutputTextHashV2(text: string): string;
|
|
56
|
+
export declare function fingerprintSourceRef(sourceRef: ContextRepresentationCandidateV2["sourceRef"]): unknown;
|
|
57
|
+
export {};
|
|
58
|
+
//# sourceMappingURL=context-budget-v2-cache-keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-budget-v2-cache-keys.d.ts","sourceRoot":"","sources":["../../src/core/context-budget-v2-cache-keys.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ContextRepresentationCandidateV2, ContextRepresentationKindV2 } from \"./context-budget-headroom.ts\";\nimport { sha256Canonical, sha256Hex } from \"./context-budget-v2-cache-hash.ts\";\n\nconst DEFAULT_CACHE_NAMESPACE = \"context-budget-v2\";\nconst DEFAULT_TOKENIZER_ID = \"heuristic-v1\";\nconst DEFAULT_REDACTION_POLICY_HASH = \"none\";\nconst DEFAULT_SAFETY_PROFILE_HASH = \"default\";\nconst NO_COMPRESSOR_ID = \"none\";\nexport const DEFAULT_MATERIALIZED_COMPRESSOR_POLICY_HASH_V2 = \"context-budget-v2-default-compressor\";\nexport const DEFAULT_MATERIALIZED_QUALITY_POLICY_HASH_V2 = \"context-budget-v2-default-quality\";\nconst MATERIALIZED_TARGET_TOKEN_BUCKET_SIZE = 100;\n\ntype ContextBudgetRepresentationFingerprintInputV2 = Pick<\n\tContextRepresentationCandidateV2,\n\t\"compressorId\" | \"estimatedTokens\" | \"fidelity\" | \"kind\" | \"sourceRef\" | \"summaryHash\" | \"text\"\n>;\n\nexport interface ContextBudgetCacheKeyBaseV2 {\n\treadonly namespace: string;\n\treadonly modelId: string;\n\treadonly tokenizerId: string;\n\treadonly policyVersion: string;\n\treadonly queryIntentHash: string;\n\treadonly queryIntentCluster?: string;\n\treadonly budgetBucket: string;\n\treadonly redactionPolicyHash: string;\n\treadonly safetyProfileHash: string;\n\treadonly compressorPolicyHash?: string;\n\treadonly qualityPolicyHash?: string;\n}\n\nexport function createContextBudgetCacheKeyBaseV2(input: {\n\treadonly namespace?: string;\n\treadonly modelId: string;\n\treadonly tokenizerId?: string;\n\treadonly policyVersion: string;\n\treadonly query?: string;\n\treadonly queryIntentHash?: string;\n\treadonly queryIntentCluster?: string;\n\treadonly budgetBucket?: string;\n\treadonly redactionPolicyHash?: string;\n\treadonly safetyProfileHash?: string;\n\treadonly compressorPolicyHash?: string;\n\treadonly qualityPolicyHash?: string;\n}): ContextBudgetCacheKeyBaseV2 {\n\tconst queryIntentHash = input.queryIntentHash ?? computeContextBudgetQueryIntentHashV2(input.query);\n\treturn {\n\t\tnamespace: input.namespace ?? DEFAULT_CACHE_NAMESPACE,\n\t\tmodelId: input.modelId,\n\t\ttokenizerId: input.tokenizerId ?? DEFAULT_TOKENIZER_ID,\n\t\tpolicyVersion: input.policyVersion,\n\t\tqueryIntentHash,\n\t\tqueryIntentCluster: input.queryIntentCluster ?? queryIntentHash,\n\t\tbudgetBucket: input.budgetBucket ?? \"unknown\",\n\t\tredactionPolicyHash: input.redactionPolicyHash ?? DEFAULT_REDACTION_POLICY_HASH,\n\t\tsafetyProfileHash: input.safetyProfileHash ?? DEFAULT_SAFETY_PROFILE_HASH,\n\t\tcompressorPolicyHash: input.compressorPolicyHash ?? DEFAULT_MATERIALIZED_COMPRESSOR_POLICY_HASH_V2,\n\t\tqualityPolicyHash: input.qualityPolicyHash ?? DEFAULT_MATERIALIZED_QUALITY_POLICY_HASH_V2,\n\t};\n}\n\nexport function computeContextBudgetQueryIntentHashV2(query: string | undefined): string {\n\tconst normalized = (query ?? \"\")\n\t\t.toLowerCase()\n\t\t.split(/[\\s,.;:!?()[\\]{}\"'`]+/u)\n\t\t.map((term) => term.trim())\n\t\t.filter((term) => term.length > 0)\n\t\t.sort()\n\t\t.join(\" \");\n\treturn sha256Hex(normalized.length > 0 ? normalized : \"none\");\n}\n\nexport function buildContextBudgetRepresentationCacheKeyV2(\n\tinput: ContextBudgetCacheKeyBaseV2 & {\n\t\treadonly representationKind: ContextRepresentationKindV2;\n\t\treadonly sourceHash: string;\n\t\treadonly representationFingerprint?: string;\n\t\treadonly compressorId?: string;\n\t},\n): string {\n\treturn buildContextBudgetExactRepresentationCacheKeyV2(input);\n}\n\nexport function buildContextBudgetExactRepresentationCacheKeyV2(\n\tinput: ContextBudgetCacheKeyBaseV2 & {\n\t\treadonly representationKind: ContextRepresentationKindV2;\n\t\treadonly sourceHash: string;\n\t\treadonly representationFingerprint?: string;\n\t\treadonly compressorId?: string;\n\t},\n): string {\n\treturn `context-representation-exact:${sha256Canonical({\n\t\tbudgetBucket: input.budgetBucket,\n\t\tcompressorId: input.compressorId ?? NO_COMPRESSOR_ID,\n\t\tmodelId: input.modelId,\n\t\tnamespace: input.namespace,\n\t\tpolicyVersion: input.policyVersion,\n\t\tqueryIntentHash: input.queryIntentHash,\n\t\tredactionPolicyHash: input.redactionPolicyHash,\n\t\trepresentationFingerprint: input.representationFingerprint ?? \"none\",\n\t\trepresentationKind: input.representationKind,\n\t\tsafetyProfileHash: input.safetyProfileHash,\n\t\tsourceHash: input.sourceHash,\n\t\ttokenizerId: input.tokenizerId,\n\t})}`;\n}\n\nexport function buildContextBudgetMaterializedRepresentationCacheKeyV2(\n\tinput: ContextBudgetCacheKeyBaseV2 & {\n\t\treadonly representationKind: ContextRepresentationKindV2;\n\t\treadonly sourceHash: string;\n\t\treadonly compressorId?: string;\n\t\treadonly targetTokenBucket: number;\n\t},\n): string {\n\treturn `context-representation-materialized:${sha256Canonical({\n\t\tbudgetBucket: input.budgetBucket,\n\t\tcompressorId: input.compressorId ?? NO_COMPRESSOR_ID,\n\t\tcompressorPolicyHash: input.compressorPolicyHash ?? DEFAULT_MATERIALIZED_COMPRESSOR_POLICY_HASH_V2,\n\t\tmodelId: input.modelId,\n\t\tnamespace: input.namespace,\n\t\tpolicyVersion: input.policyVersion,\n\t\tqualityPolicyHash: input.qualityPolicyHash ?? DEFAULT_MATERIALIZED_QUALITY_POLICY_HASH_V2,\n\t\tqueryIntentCluster: input.queryIntentCluster ?? input.queryIntentHash,\n\t\tqueryIntentHash: input.queryIntentHash,\n\t\tredactionPolicyHash: input.redactionPolicyHash,\n\t\trepresentationKind: input.representationKind,\n\t\tsafetyProfileHash: input.safetyProfileHash,\n\t\tsourceHash: input.sourceHash,\n\t\ttargetTokenBucket: input.targetTokenBucket,\n\t\ttokenizerId: input.tokenizerId,\n\t})}`;\n}\n\nexport function computeContextBudgetRepresentationFingerprintV2(\n\tcandidate: ContextBudgetRepresentationFingerprintInputV2,\n): string {\n\treturn sha256Canonical({\n\t\tcompressorId: candidate.compressorId ?? NO_COMPRESSOR_ID,\n\t\testimatedTokens: candidate.estimatedTokens,\n\t\tfidelity: candidate.fidelity,\n\t\tkind: candidate.kind,\n\t\tsourceRef: fingerprintSourceRef(candidate.sourceRef),\n\t\tsummaryHash: candidate.summaryHash ?? null,\n\t\ttextHash: sha256Hex(candidate.text),\n\t});\n}\n\nexport function buildContextBudgetRepresentationCandidateKeyV2(\n\tkeyBase: ContextBudgetCacheKeyBaseV2,\n\tcandidate: ContextBudgetRepresentationFingerprintInputV2,\n\tsourceHash: string,\n): string {\n\treturn buildContextBudgetExactRepresentationCacheKeyV2({\n\t\t...keyBase,\n\t\tcompressorId: candidate.compressorId ?? NO_COMPRESSOR_ID,\n\t\trepresentationFingerprint: computeContextBudgetRepresentationFingerprintV2(candidate),\n\t\trepresentationKind: candidate.kind,\n\t\tsourceHash,\n\t});\n}\n\nexport function buildContextBudgetMaterializedRepresentationCandidateKeyV2(\n\tkeyBase: ContextBudgetCacheKeyBaseV2,\n\tcandidate: ContextBudgetRepresentationFingerprintInputV2,\n\tsourceHash: string,\n): string {\n\treturn buildContextBudgetMaterializedRepresentationCacheKeyV2({\n\t\t...keyBase,\n\t\tcompressorId: candidate.compressorId ?? NO_COMPRESSOR_ID,\n\t\trepresentationKind: candidate.kind,\n\t\tsourceHash,\n\t\ttargetTokenBucket: computeContextBudgetTargetTokenBucketV2(candidate.estimatedTokens),\n\t});\n}\n\nexport function computeContextBudgetTargetTokenBucketV2(tokens: number): number {\n\tif (!Number.isFinite(tokens) || tokens <= 0) {\n\t\treturn MATERIALIZED_TARGET_TOKEN_BUCKET_SIZE;\n\t}\n\treturn MATERIALIZED_TARGET_TOKEN_BUCKET_SIZE * Math.ceil(tokens / MATERIALIZED_TARGET_TOKEN_BUCKET_SIZE);\n}\n\nexport function computeContextBudgetOutputTextHashV2(text: string): string {\n\treturn sha256Hex(text);\n}\n\nexport function fingerprintSourceRef(sourceRef: ContextRepresentationCandidateV2[\"sourceRef\"]): unknown {\n\tif (!sourceRef) return null;\n\treturn {\n\t\tcontentHash: sourceRef.contentHash,\n\t\trange: sourceRef.range\n\t\t\t? {\n\t\t\t\t\tendLine: sourceRef.range.endLine,\n\t\t\t\t\tstartLine: sourceRef.range.startLine,\n\t\t\t\t}\n\t\t\t: null,\n\t\tretrievable: sourceRef.retrievable,\n\t\tsymbol: sourceRef.symbol ?? null,\n\t\turi: sourceRef.uri,\n\t};\n}\n"]}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { sha256Canonical, sha256Hex } from "./context-budget-v2-cache-hash.js";
|
|
2
|
+
const DEFAULT_CACHE_NAMESPACE = "context-budget-v2";
|
|
3
|
+
const DEFAULT_TOKENIZER_ID = "heuristic-v1";
|
|
4
|
+
const DEFAULT_REDACTION_POLICY_HASH = "none";
|
|
5
|
+
const DEFAULT_SAFETY_PROFILE_HASH = "default";
|
|
6
|
+
const NO_COMPRESSOR_ID = "none";
|
|
7
|
+
export const DEFAULT_MATERIALIZED_COMPRESSOR_POLICY_HASH_V2 = "context-budget-v2-default-compressor";
|
|
8
|
+
export const DEFAULT_MATERIALIZED_QUALITY_POLICY_HASH_V2 = "context-budget-v2-default-quality";
|
|
9
|
+
const MATERIALIZED_TARGET_TOKEN_BUCKET_SIZE = 100;
|
|
10
|
+
export function createContextBudgetCacheKeyBaseV2(input) {
|
|
11
|
+
const queryIntentHash = input.queryIntentHash ?? computeContextBudgetQueryIntentHashV2(input.query);
|
|
12
|
+
return {
|
|
13
|
+
namespace: input.namespace ?? DEFAULT_CACHE_NAMESPACE,
|
|
14
|
+
modelId: input.modelId,
|
|
15
|
+
tokenizerId: input.tokenizerId ?? DEFAULT_TOKENIZER_ID,
|
|
16
|
+
policyVersion: input.policyVersion,
|
|
17
|
+
queryIntentHash,
|
|
18
|
+
queryIntentCluster: input.queryIntentCluster ?? queryIntentHash,
|
|
19
|
+
budgetBucket: input.budgetBucket ?? "unknown",
|
|
20
|
+
redactionPolicyHash: input.redactionPolicyHash ?? DEFAULT_REDACTION_POLICY_HASH,
|
|
21
|
+
safetyProfileHash: input.safetyProfileHash ?? DEFAULT_SAFETY_PROFILE_HASH,
|
|
22
|
+
compressorPolicyHash: input.compressorPolicyHash ?? DEFAULT_MATERIALIZED_COMPRESSOR_POLICY_HASH_V2,
|
|
23
|
+
qualityPolicyHash: input.qualityPolicyHash ?? DEFAULT_MATERIALIZED_QUALITY_POLICY_HASH_V2,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export function computeContextBudgetQueryIntentHashV2(query) {
|
|
27
|
+
const normalized = (query ?? "")
|
|
28
|
+
.toLowerCase()
|
|
29
|
+
.split(/[\s,.;:!?()[\]{}"'`]+/u)
|
|
30
|
+
.map((term) => term.trim())
|
|
31
|
+
.filter((term) => term.length > 0)
|
|
32
|
+
.sort()
|
|
33
|
+
.join(" ");
|
|
34
|
+
return sha256Hex(normalized.length > 0 ? normalized : "none");
|
|
35
|
+
}
|
|
36
|
+
export function buildContextBudgetRepresentationCacheKeyV2(input) {
|
|
37
|
+
return buildContextBudgetExactRepresentationCacheKeyV2(input);
|
|
38
|
+
}
|
|
39
|
+
export function buildContextBudgetExactRepresentationCacheKeyV2(input) {
|
|
40
|
+
return `context-representation-exact:${sha256Canonical({
|
|
41
|
+
budgetBucket: input.budgetBucket,
|
|
42
|
+
compressorId: input.compressorId ?? NO_COMPRESSOR_ID,
|
|
43
|
+
modelId: input.modelId,
|
|
44
|
+
namespace: input.namespace,
|
|
45
|
+
policyVersion: input.policyVersion,
|
|
46
|
+
queryIntentHash: input.queryIntentHash,
|
|
47
|
+
redactionPolicyHash: input.redactionPolicyHash,
|
|
48
|
+
representationFingerprint: input.representationFingerprint ?? "none",
|
|
49
|
+
representationKind: input.representationKind,
|
|
50
|
+
safetyProfileHash: input.safetyProfileHash,
|
|
51
|
+
sourceHash: input.sourceHash,
|
|
52
|
+
tokenizerId: input.tokenizerId,
|
|
53
|
+
})}`;
|
|
54
|
+
}
|
|
55
|
+
export function buildContextBudgetMaterializedRepresentationCacheKeyV2(input) {
|
|
56
|
+
return `context-representation-materialized:${sha256Canonical({
|
|
57
|
+
budgetBucket: input.budgetBucket,
|
|
58
|
+
compressorId: input.compressorId ?? NO_COMPRESSOR_ID,
|
|
59
|
+
compressorPolicyHash: input.compressorPolicyHash ?? DEFAULT_MATERIALIZED_COMPRESSOR_POLICY_HASH_V2,
|
|
60
|
+
modelId: input.modelId,
|
|
61
|
+
namespace: input.namespace,
|
|
62
|
+
policyVersion: input.policyVersion,
|
|
63
|
+
qualityPolicyHash: input.qualityPolicyHash ?? DEFAULT_MATERIALIZED_QUALITY_POLICY_HASH_V2,
|
|
64
|
+
queryIntentCluster: input.queryIntentCluster ?? input.queryIntentHash,
|
|
65
|
+
queryIntentHash: input.queryIntentHash,
|
|
66
|
+
redactionPolicyHash: input.redactionPolicyHash,
|
|
67
|
+
representationKind: input.representationKind,
|
|
68
|
+
safetyProfileHash: input.safetyProfileHash,
|
|
69
|
+
sourceHash: input.sourceHash,
|
|
70
|
+
targetTokenBucket: input.targetTokenBucket,
|
|
71
|
+
tokenizerId: input.tokenizerId,
|
|
72
|
+
})}`;
|
|
73
|
+
}
|
|
74
|
+
export function computeContextBudgetRepresentationFingerprintV2(candidate) {
|
|
75
|
+
return sha256Canonical({
|
|
76
|
+
compressorId: candidate.compressorId ?? NO_COMPRESSOR_ID,
|
|
77
|
+
estimatedTokens: candidate.estimatedTokens,
|
|
78
|
+
fidelity: candidate.fidelity,
|
|
79
|
+
kind: candidate.kind,
|
|
80
|
+
sourceRef: fingerprintSourceRef(candidate.sourceRef),
|
|
81
|
+
summaryHash: candidate.summaryHash ?? null,
|
|
82
|
+
textHash: sha256Hex(candidate.text),
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
export function buildContextBudgetRepresentationCandidateKeyV2(keyBase, candidate, sourceHash) {
|
|
86
|
+
return buildContextBudgetExactRepresentationCacheKeyV2({
|
|
87
|
+
...keyBase,
|
|
88
|
+
compressorId: candidate.compressorId ?? NO_COMPRESSOR_ID,
|
|
89
|
+
representationFingerprint: computeContextBudgetRepresentationFingerprintV2(candidate),
|
|
90
|
+
representationKind: candidate.kind,
|
|
91
|
+
sourceHash,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
export function buildContextBudgetMaterializedRepresentationCandidateKeyV2(keyBase, candidate, sourceHash) {
|
|
95
|
+
return buildContextBudgetMaterializedRepresentationCacheKeyV2({
|
|
96
|
+
...keyBase,
|
|
97
|
+
compressorId: candidate.compressorId ?? NO_COMPRESSOR_ID,
|
|
98
|
+
representationKind: candidate.kind,
|
|
99
|
+
sourceHash,
|
|
100
|
+
targetTokenBucket: computeContextBudgetTargetTokenBucketV2(candidate.estimatedTokens),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
export function computeContextBudgetTargetTokenBucketV2(tokens) {
|
|
104
|
+
if (!Number.isFinite(tokens) || tokens <= 0) {
|
|
105
|
+
return MATERIALIZED_TARGET_TOKEN_BUCKET_SIZE;
|
|
106
|
+
}
|
|
107
|
+
return MATERIALIZED_TARGET_TOKEN_BUCKET_SIZE * Math.ceil(tokens / MATERIALIZED_TARGET_TOKEN_BUCKET_SIZE);
|
|
108
|
+
}
|
|
109
|
+
export function computeContextBudgetOutputTextHashV2(text) {
|
|
110
|
+
return sha256Hex(text);
|
|
111
|
+
}
|
|
112
|
+
export function fingerprintSourceRef(sourceRef) {
|
|
113
|
+
if (!sourceRef)
|
|
114
|
+
return null;
|
|
115
|
+
return {
|
|
116
|
+
contentHash: sourceRef.contentHash,
|
|
117
|
+
range: sourceRef.range
|
|
118
|
+
? {
|
|
119
|
+
endLine: sourceRef.range.endLine,
|
|
120
|
+
startLine: sourceRef.range.startLine,
|
|
121
|
+
}
|
|
122
|
+
: null,
|
|
123
|
+
retrievable: sourceRef.retrievable,
|
|
124
|
+
symbol: sourceRef.symbol ?? null,
|
|
125
|
+
uri: sourceRef.uri,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=context-budget-v2-cache-keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-budget-v2-cache-keys.js","sourceRoot":"","sources":["../../src/core/context-budget-v2-cache-keys.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ContextRepresentationCandidateV2, ContextRepresentationKindV2 } from \"./context-budget-headroom.ts\";\nimport { sha256Canonical, sha256Hex } from \"./context-budget-v2-cache-hash.ts\";\n\nconst DEFAULT_CACHE_NAMESPACE = \"context-budget-v2\";\nconst DEFAULT_TOKENIZER_ID = \"heuristic-v1\";\nconst DEFAULT_REDACTION_POLICY_HASH = \"none\";\nconst DEFAULT_SAFETY_PROFILE_HASH = \"default\";\nconst NO_COMPRESSOR_ID = \"none\";\nexport const DEFAULT_MATERIALIZED_COMPRESSOR_POLICY_HASH_V2 = \"context-budget-v2-default-compressor\";\nexport const DEFAULT_MATERIALIZED_QUALITY_POLICY_HASH_V2 = \"context-budget-v2-default-quality\";\nconst MATERIALIZED_TARGET_TOKEN_BUCKET_SIZE = 100;\n\ntype ContextBudgetRepresentationFingerprintInputV2 = Pick<\n\tContextRepresentationCandidateV2,\n\t\"compressorId\" | \"estimatedTokens\" | \"fidelity\" | \"kind\" | \"sourceRef\" | \"summaryHash\" | \"text\"\n>;\n\nexport interface ContextBudgetCacheKeyBaseV2 {\n\treadonly namespace: string;\n\treadonly modelId: string;\n\treadonly tokenizerId: string;\n\treadonly policyVersion: string;\n\treadonly queryIntentHash: string;\n\treadonly queryIntentCluster?: string;\n\treadonly budgetBucket: string;\n\treadonly redactionPolicyHash: string;\n\treadonly safetyProfileHash: string;\n\treadonly compressorPolicyHash?: string;\n\treadonly qualityPolicyHash?: string;\n}\n\nexport function createContextBudgetCacheKeyBaseV2(input: {\n\treadonly namespace?: string;\n\treadonly modelId: string;\n\treadonly tokenizerId?: string;\n\treadonly policyVersion: string;\n\treadonly query?: string;\n\treadonly queryIntentHash?: string;\n\treadonly queryIntentCluster?: string;\n\treadonly budgetBucket?: string;\n\treadonly redactionPolicyHash?: string;\n\treadonly safetyProfileHash?: string;\n\treadonly compressorPolicyHash?: string;\n\treadonly qualityPolicyHash?: string;\n}): ContextBudgetCacheKeyBaseV2 {\n\tconst queryIntentHash = input.queryIntentHash ?? computeContextBudgetQueryIntentHashV2(input.query);\n\treturn {\n\t\tnamespace: input.namespace ?? DEFAULT_CACHE_NAMESPACE,\n\t\tmodelId: input.modelId,\n\t\ttokenizerId: input.tokenizerId ?? DEFAULT_TOKENIZER_ID,\n\t\tpolicyVersion: input.policyVersion,\n\t\tqueryIntentHash,\n\t\tqueryIntentCluster: input.queryIntentCluster ?? queryIntentHash,\n\t\tbudgetBucket: input.budgetBucket ?? \"unknown\",\n\t\tredactionPolicyHash: input.redactionPolicyHash ?? DEFAULT_REDACTION_POLICY_HASH,\n\t\tsafetyProfileHash: input.safetyProfileHash ?? DEFAULT_SAFETY_PROFILE_HASH,\n\t\tcompressorPolicyHash: input.compressorPolicyHash ?? DEFAULT_MATERIALIZED_COMPRESSOR_POLICY_HASH_V2,\n\t\tqualityPolicyHash: input.qualityPolicyHash ?? DEFAULT_MATERIALIZED_QUALITY_POLICY_HASH_V2,\n\t};\n}\n\nexport function computeContextBudgetQueryIntentHashV2(query: string | undefined): string {\n\tconst normalized = (query ?? \"\")\n\t\t.toLowerCase()\n\t\t.split(/[\\s,.;:!?()[\\]{}\"'`]+/u)\n\t\t.map((term) => term.trim())\n\t\t.filter((term) => term.length > 0)\n\t\t.sort()\n\t\t.join(\" \");\n\treturn sha256Hex(normalized.length > 0 ? normalized : \"none\");\n}\n\nexport function buildContextBudgetRepresentationCacheKeyV2(\n\tinput: ContextBudgetCacheKeyBaseV2 & {\n\t\treadonly representationKind: ContextRepresentationKindV2;\n\t\treadonly sourceHash: string;\n\t\treadonly representationFingerprint?: string;\n\t\treadonly compressorId?: string;\n\t},\n): string {\n\treturn buildContextBudgetExactRepresentationCacheKeyV2(input);\n}\n\nexport function buildContextBudgetExactRepresentationCacheKeyV2(\n\tinput: ContextBudgetCacheKeyBaseV2 & {\n\t\treadonly representationKind: ContextRepresentationKindV2;\n\t\treadonly sourceHash: string;\n\t\treadonly representationFingerprint?: string;\n\t\treadonly compressorId?: string;\n\t},\n): string {\n\treturn `context-representation-exact:${sha256Canonical({\n\t\tbudgetBucket: input.budgetBucket,\n\t\tcompressorId: input.compressorId ?? NO_COMPRESSOR_ID,\n\t\tmodelId: input.modelId,\n\t\tnamespace: input.namespace,\n\t\tpolicyVersion: input.policyVersion,\n\t\tqueryIntentHash: input.queryIntentHash,\n\t\tredactionPolicyHash: input.redactionPolicyHash,\n\t\trepresentationFingerprint: input.representationFingerprint ?? \"none\",\n\t\trepresentationKind: input.representationKind,\n\t\tsafetyProfileHash: input.safetyProfileHash,\n\t\tsourceHash: input.sourceHash,\n\t\ttokenizerId: input.tokenizerId,\n\t})}`;\n}\n\nexport function buildContextBudgetMaterializedRepresentationCacheKeyV2(\n\tinput: ContextBudgetCacheKeyBaseV2 & {\n\t\treadonly representationKind: ContextRepresentationKindV2;\n\t\treadonly sourceHash: string;\n\t\treadonly compressorId?: string;\n\t\treadonly targetTokenBucket: number;\n\t},\n): string {\n\treturn `context-representation-materialized:${sha256Canonical({\n\t\tbudgetBucket: input.budgetBucket,\n\t\tcompressorId: input.compressorId ?? NO_COMPRESSOR_ID,\n\t\tcompressorPolicyHash: input.compressorPolicyHash ?? DEFAULT_MATERIALIZED_COMPRESSOR_POLICY_HASH_V2,\n\t\tmodelId: input.modelId,\n\t\tnamespace: input.namespace,\n\t\tpolicyVersion: input.policyVersion,\n\t\tqualityPolicyHash: input.qualityPolicyHash ?? DEFAULT_MATERIALIZED_QUALITY_POLICY_HASH_V2,\n\t\tqueryIntentCluster: input.queryIntentCluster ?? input.queryIntentHash,\n\t\tqueryIntentHash: input.queryIntentHash,\n\t\tredactionPolicyHash: input.redactionPolicyHash,\n\t\trepresentationKind: input.representationKind,\n\t\tsafetyProfileHash: input.safetyProfileHash,\n\t\tsourceHash: input.sourceHash,\n\t\ttargetTokenBucket: input.targetTokenBucket,\n\t\ttokenizerId: input.tokenizerId,\n\t})}`;\n}\n\nexport function computeContextBudgetRepresentationFingerprintV2(\n\tcandidate: ContextBudgetRepresentationFingerprintInputV2,\n): string {\n\treturn sha256Canonical({\n\t\tcompressorId: candidate.compressorId ?? NO_COMPRESSOR_ID,\n\t\testimatedTokens: candidate.estimatedTokens,\n\t\tfidelity: candidate.fidelity,\n\t\tkind: candidate.kind,\n\t\tsourceRef: fingerprintSourceRef(candidate.sourceRef),\n\t\tsummaryHash: candidate.summaryHash ?? null,\n\t\ttextHash: sha256Hex(candidate.text),\n\t});\n}\n\nexport function buildContextBudgetRepresentationCandidateKeyV2(\n\tkeyBase: ContextBudgetCacheKeyBaseV2,\n\tcandidate: ContextBudgetRepresentationFingerprintInputV2,\n\tsourceHash: string,\n): string {\n\treturn buildContextBudgetExactRepresentationCacheKeyV2({\n\t\t...keyBase,\n\t\tcompressorId: candidate.compressorId ?? NO_COMPRESSOR_ID,\n\t\trepresentationFingerprint: computeContextBudgetRepresentationFingerprintV2(candidate),\n\t\trepresentationKind: candidate.kind,\n\t\tsourceHash,\n\t});\n}\n\nexport function buildContextBudgetMaterializedRepresentationCandidateKeyV2(\n\tkeyBase: ContextBudgetCacheKeyBaseV2,\n\tcandidate: ContextBudgetRepresentationFingerprintInputV2,\n\tsourceHash: string,\n): string {\n\treturn buildContextBudgetMaterializedRepresentationCacheKeyV2({\n\t\t...keyBase,\n\t\tcompressorId: candidate.compressorId ?? NO_COMPRESSOR_ID,\n\t\trepresentationKind: candidate.kind,\n\t\tsourceHash,\n\t\ttargetTokenBucket: computeContextBudgetTargetTokenBucketV2(candidate.estimatedTokens),\n\t});\n}\n\nexport function computeContextBudgetTargetTokenBucketV2(tokens: number): number {\n\tif (!Number.isFinite(tokens) || tokens <= 0) {\n\t\treturn MATERIALIZED_TARGET_TOKEN_BUCKET_SIZE;\n\t}\n\treturn MATERIALIZED_TARGET_TOKEN_BUCKET_SIZE * Math.ceil(tokens / MATERIALIZED_TARGET_TOKEN_BUCKET_SIZE);\n}\n\nexport function computeContextBudgetOutputTextHashV2(text: string): string {\n\treturn sha256Hex(text);\n}\n\nexport function fingerprintSourceRef(sourceRef: ContextRepresentationCandidateV2[\"sourceRef\"]): unknown {\n\tif (!sourceRef) return null;\n\treturn {\n\t\tcontentHash: sourceRef.contentHash,\n\t\trange: sourceRef.range\n\t\t\t? {\n\t\t\t\t\tendLine: sourceRef.range.endLine,\n\t\t\t\t\tstartLine: sourceRef.range.startLine,\n\t\t\t\t}\n\t\t\t: null,\n\t\tretrievable: sourceRef.retrievable,\n\t\tsymbol: sourceRef.symbol ?? null,\n\t\turi: sourceRef.uri,\n\t};\n}\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ContextBudgetCacheProviderV2, ContextBudgetNegativeCacheEntryV2, ContextBudgetPlanCacheEntryV2, ContextBudgetPlanCacheReadV2, ContextBudgetRepresentationCacheEntryV2, ContextBudgetRepresentationCacheReadV2 } from "./context-budget-v2-types.ts";
|
|
2
|
+
export declare function createMemoryContextBudgetCacheProviderV2(): ContextBudgetCacheProviderV2;
|
|
3
|
+
export declare class MemoryContextBudgetCacheProviderV2 implements ContextBudgetCacheProviderV2 {
|
|
4
|
+
private readonly representations;
|
|
5
|
+
private readonly negatives;
|
|
6
|
+
private readonly plans;
|
|
7
|
+
readRepresentation(key: string): ContextBudgetRepresentationCacheReadV2 | undefined;
|
|
8
|
+
writeRepresentation(input: {
|
|
9
|
+
readonly key: string;
|
|
10
|
+
readonly entry: ContextBudgetRepresentationCacheEntryV2;
|
|
11
|
+
}): void;
|
|
12
|
+
readNegativeRepresentation(key: string): ContextBudgetNegativeCacheEntryV2 | undefined;
|
|
13
|
+
writeNegativeRepresentation(input: {
|
|
14
|
+
readonly key: string;
|
|
15
|
+
readonly reason: string;
|
|
16
|
+
}): void;
|
|
17
|
+
readPlan(key: string): ContextBudgetPlanCacheReadV2 | undefined;
|
|
18
|
+
writePlan(input: {
|
|
19
|
+
readonly key: string;
|
|
20
|
+
readonly entry: ContextBudgetPlanCacheEntryV2;
|
|
21
|
+
}): void;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=context-budget-v2-cache-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-budget-v2-cache-provider.d.ts","sourceRoot":"","sources":["../../src/core/context-budget-v2-cache-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,4BAA4B,EAC5B,iCAAiC,EACjC,6BAA6B,EAC7B,4BAA4B,EAC5B,uCAAuC,EACvC,sCAAsC,EACtC,MAAM,8BAA8B,CAAC;AAEtC,wBAAgB,wCAAwC,IAAI,4BAA4B,CAEvF;AAED,qBAAa,kCAAmC,YAAW,4BAA4B;IACtF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA8D;IAC9F,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwD;IAClF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoD;IAE1E,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,sCAAsC,GAAG,SAAS,CAGlF;IAED,mBAAmB,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,uCAAuC,CAAA;KAAE,GAAG,IAAI,CAElH;IAED,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,iCAAiC,GAAG,SAAS,CAErF;IAED,2BAA2B,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAE1F;IAED,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,4BAA4B,GAAG,SAAS,CAG9D;IAED,SAAS,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,6BAA6B,CAAA;KAAE,GAAG,IAAI,CAE9F;CACD","sourcesContent":["import type {\n\tContextBudgetCacheProviderV2,\n\tContextBudgetNegativeCacheEntryV2,\n\tContextBudgetPlanCacheEntryV2,\n\tContextBudgetPlanCacheReadV2,\n\tContextBudgetRepresentationCacheEntryV2,\n\tContextBudgetRepresentationCacheReadV2,\n} from \"./context-budget-v2-types.ts\";\n\nexport function createMemoryContextBudgetCacheProviderV2(): ContextBudgetCacheProviderV2 {\n\treturn new MemoryContextBudgetCacheProviderV2();\n}\n\nexport class MemoryContextBudgetCacheProviderV2 implements ContextBudgetCacheProviderV2 {\n\tprivate readonly representations = new Map<string, ContextBudgetRepresentationCacheEntryV2>();\n\tprivate readonly negatives = new Map<string, ContextBudgetNegativeCacheEntryV2>();\n\tprivate readonly plans = new Map<string, ContextBudgetPlanCacheEntryV2>();\n\n\treadRepresentation(key: string): ContextBudgetRepresentationCacheReadV2 | undefined {\n\t\tconst entry = this.representations.get(key);\n\t\treturn entry ? { entry, layer: \"turn\" } : undefined;\n\t}\n\n\twriteRepresentation(input: { readonly key: string; readonly entry: ContextBudgetRepresentationCacheEntryV2 }): void {\n\t\tthis.representations.set(input.key, input.entry);\n\t}\n\n\treadNegativeRepresentation(key: string): ContextBudgetNegativeCacheEntryV2 | undefined {\n\t\treturn this.negatives.get(key);\n\t}\n\n\twriteNegativeRepresentation(input: { readonly key: string; readonly reason: string }): void {\n\t\tthis.negatives.set(input.key, { reason: input.reason, layer: \"turn\" });\n\t}\n\n\treadPlan(key: string): ContextBudgetPlanCacheReadV2 | undefined {\n\t\tconst entry = this.plans.get(key);\n\t\treturn entry ? { entry, layer: \"turn\" } : undefined;\n\t}\n\n\twritePlan(input: { readonly key: string; readonly entry: ContextBudgetPlanCacheEntryV2 }): void {\n\t\tthis.plans.set(input.key, input.entry);\n\t}\n}\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export function createMemoryContextBudgetCacheProviderV2() {
|
|
2
|
+
return new MemoryContextBudgetCacheProviderV2();
|
|
3
|
+
}
|
|
4
|
+
export class MemoryContextBudgetCacheProviderV2 {
|
|
5
|
+
representations = new Map();
|
|
6
|
+
negatives = new Map();
|
|
7
|
+
plans = new Map();
|
|
8
|
+
readRepresentation(key) {
|
|
9
|
+
const entry = this.representations.get(key);
|
|
10
|
+
return entry ? { entry, layer: "turn" } : undefined;
|
|
11
|
+
}
|
|
12
|
+
writeRepresentation(input) {
|
|
13
|
+
this.representations.set(input.key, input.entry);
|
|
14
|
+
}
|
|
15
|
+
readNegativeRepresentation(key) {
|
|
16
|
+
return this.negatives.get(key);
|
|
17
|
+
}
|
|
18
|
+
writeNegativeRepresentation(input) {
|
|
19
|
+
this.negatives.set(input.key, { reason: input.reason, layer: "turn" });
|
|
20
|
+
}
|
|
21
|
+
readPlan(key) {
|
|
22
|
+
const entry = this.plans.get(key);
|
|
23
|
+
return entry ? { entry, layer: "turn" } : undefined;
|
|
24
|
+
}
|
|
25
|
+
writePlan(input) {
|
|
26
|
+
this.plans.set(input.key, input.entry);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=context-budget-v2-cache-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-budget-v2-cache-provider.js","sourceRoot":"","sources":["../../src/core/context-budget-v2-cache-provider.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,wCAAwC,GAAiC;IACxF,OAAO,IAAI,kCAAkC,EAAE,CAAC;AAAA,CAChD;AAED,MAAM,OAAO,kCAAkC;IAC7B,eAAe,GAAG,IAAI,GAAG,EAAmD,CAAC;IAC7E,SAAS,GAAG,IAAI,GAAG,EAA6C,CAAC;IACjE,KAAK,GAAG,IAAI,GAAG,EAAyC,CAAC;IAE1E,kBAAkB,CAAC,GAAW,EAAsD;QACnF,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5C,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAAA,CACpD;IAED,mBAAmB,CAAC,KAAwF,EAAQ;QACnH,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAAA,CACjD;IAED,0BAA0B,CAAC,GAAW,EAAiD;QACtF,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAAA,CAC/B;IAED,2BAA2B,CAAC,KAAwD,EAAQ;QAC3F,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAAA,CACvE;IAED,QAAQ,CAAC,GAAW,EAA4C;QAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAAA,CACpD;IAED,SAAS,CAAC,KAA8E,EAAQ;QAC/F,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAAA,CACvC;CACD","sourcesContent":["import type {\n\tContextBudgetCacheProviderV2,\n\tContextBudgetNegativeCacheEntryV2,\n\tContextBudgetPlanCacheEntryV2,\n\tContextBudgetPlanCacheReadV2,\n\tContextBudgetRepresentationCacheEntryV2,\n\tContextBudgetRepresentationCacheReadV2,\n} from \"./context-budget-v2-types.ts\";\n\nexport function createMemoryContextBudgetCacheProviderV2(): ContextBudgetCacheProviderV2 {\n\treturn new MemoryContextBudgetCacheProviderV2();\n}\n\nexport class MemoryContextBudgetCacheProviderV2 implements ContextBudgetCacheProviderV2 {\n\tprivate readonly representations = new Map<string, ContextBudgetRepresentationCacheEntryV2>();\n\tprivate readonly negatives = new Map<string, ContextBudgetNegativeCacheEntryV2>();\n\tprivate readonly plans = new Map<string, ContextBudgetPlanCacheEntryV2>();\n\n\treadRepresentation(key: string): ContextBudgetRepresentationCacheReadV2 | undefined {\n\t\tconst entry = this.representations.get(key);\n\t\treturn entry ? { entry, layer: \"turn\" } : undefined;\n\t}\n\n\twriteRepresentation(input: { readonly key: string; readonly entry: ContextBudgetRepresentationCacheEntryV2 }): void {\n\t\tthis.representations.set(input.key, input.entry);\n\t}\n\n\treadNegativeRepresentation(key: string): ContextBudgetNegativeCacheEntryV2 | undefined {\n\t\treturn this.negatives.get(key);\n\t}\n\n\twriteNegativeRepresentation(input: { readonly key: string; readonly reason: string }): void {\n\t\tthis.negatives.set(input.key, { reason: input.reason, layer: \"turn\" });\n\t}\n\n\treadPlan(key: string): ContextBudgetPlanCacheReadV2 | undefined {\n\t\tconst entry = this.plans.get(key);\n\t\treturn entry ? { entry, layer: \"turn\" } : undefined;\n\t}\n\n\twritePlan(input: { readonly key: string; readonly entry: ContextBudgetPlanCacheEntryV2 }): void {\n\t\tthis.plans.set(input.key, input.entry);\n\t}\n}\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ContextRepresentationKindV2 } from "./context-budget-headroom.ts";
|
|
2
|
+
import type { ContextBudgetCacheLayerV2, ContextBudgetRepresentationCacheKeyKindV2, PromptContextBudgetPlanV2, TokenCacheTelemetryV2 } from "./context-budget-v2-types.ts";
|
|
3
|
+
export interface MutableTokenCacheTelemetryV2 {
|
|
4
|
+
planCache: {
|
|
5
|
+
hit: boolean;
|
|
6
|
+
key: string;
|
|
7
|
+
layer?: ContextBudgetCacheLayerV2;
|
|
8
|
+
rejectedReason?: string;
|
|
9
|
+
};
|
|
10
|
+
representationCache: {
|
|
11
|
+
exactHits: number;
|
|
12
|
+
semanticHits: number;
|
|
13
|
+
pointerHits: number;
|
|
14
|
+
misses: number;
|
|
15
|
+
staleRejects: number;
|
|
16
|
+
poisonRejects: number;
|
|
17
|
+
negativeHits: number;
|
|
18
|
+
writes: number;
|
|
19
|
+
};
|
|
20
|
+
tokens: {
|
|
21
|
+
raw: number;
|
|
22
|
+
rendered: number;
|
|
23
|
+
savedByCache: number;
|
|
24
|
+
savedByCompression: number;
|
|
25
|
+
savedByOmission: number;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export declare function createMutableContextBudgetCacheTelemetryV2(planKey: string): MutableTokenCacheTelemetryV2;
|
|
29
|
+
export declare function finalizeContextBudgetCacheTelemetryV2(telemetry: MutableTokenCacheTelemetryV2, input: {
|
|
30
|
+
readonly rawTokens: number;
|
|
31
|
+
readonly usedTokens: number;
|
|
32
|
+
readonly omittedTokens: number;
|
|
33
|
+
}): TokenCacheTelemetryV2;
|
|
34
|
+
export declare function withCacheTelemetry(plan: PromptContextBudgetPlanV2, telemetry: MutableTokenCacheTelemetryV2): PromptContextBudgetPlanV2;
|
|
35
|
+
export declare function recordContextBudgetRepresentationCacheHitV2(telemetry: MutableTokenCacheTelemetryV2, kind: ContextRepresentationKindV2, keyKind?: ContextBudgetRepresentationCacheKeyKindV2): void;
|
|
36
|
+
//# sourceMappingURL=context-budget-v2-cache-telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-budget-v2-cache-telemetry.d.ts","sourceRoot":"","sources":["../../src/core/context-budget-v2-cache-telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAChF,OAAO,KAAK,EACX,yBAAyB,EACzB,yCAAyC,EACzC,yBAAyB,EACzB,qBAAqB,EACrB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,WAAW,4BAA4B;IAC5C,SAAS,EAAE;QACV,GAAG,EAAE,OAAO,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,CAAC,EAAE,yBAAyB,CAAC;QAClC,cAAc,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,mBAAmB,EAAE;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;KACf,CAAC;IACF,MAAM,EAAE;QACP,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,eAAe,EAAE,MAAM,CAAC;KACxB,CAAC;CACF;AAED,wBAAgB,0CAA0C,CAAC,OAAO,EAAE,MAAM,GAAG,4BAA4B,CAwBxG;AAED,wBAAgB,qCAAqC,CACpD,SAAS,EAAE,4BAA4B,EACvC,KAAK,EAAE;IACN,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAC/B,GACC,qBAAqB,CAYvB;AAED,wBAAgB,kBAAkB,CACjC,IAAI,EAAE,yBAAyB,EAC/B,SAAS,EAAE,4BAA4B,GACrC,yBAAyB,CAa3B;AAED,wBAAgB,2CAA2C,CAC1D,SAAS,EAAE,4BAA4B,EACvC,IAAI,EAAE,2BAA2B,EACjC,OAAO,GAAE,yCAAmD,GAC1D,IAAI,CAUN","sourcesContent":["import type { ContextRepresentationKindV2 } from \"./context-budget-headroom.ts\";\nimport type {\n\tContextBudgetCacheLayerV2,\n\tContextBudgetRepresentationCacheKeyKindV2,\n\tPromptContextBudgetPlanV2,\n\tTokenCacheTelemetryV2,\n} from \"./context-budget-v2-types.ts\";\n\nexport interface MutableTokenCacheTelemetryV2 {\n\tplanCache: {\n\t\thit: boolean;\n\t\tkey: string;\n\t\tlayer?: ContextBudgetCacheLayerV2;\n\t\trejectedReason?: string;\n\t};\n\trepresentationCache: {\n\t\texactHits: number;\n\t\tsemanticHits: number;\n\t\tpointerHits: number;\n\t\tmisses: number;\n\t\tstaleRejects: number;\n\t\tpoisonRejects: number;\n\t\tnegativeHits: number;\n\t\twrites: number;\n\t};\n\ttokens: {\n\t\traw: number;\n\t\trendered: number;\n\t\tsavedByCache: number;\n\t\tsavedByCompression: number;\n\t\tsavedByOmission: number;\n\t};\n}\n\nexport function createMutableContextBudgetCacheTelemetryV2(planKey: string): MutableTokenCacheTelemetryV2 {\n\treturn {\n\t\tplanCache: {\n\t\t\thit: false,\n\t\t\tkey: planKey,\n\t\t},\n\t\trepresentationCache: {\n\t\t\texactHits: 0,\n\t\t\tsemanticHits: 0,\n\t\t\tpointerHits: 0,\n\t\t\tmisses: 0,\n\t\t\tstaleRejects: 0,\n\t\t\tpoisonRejects: 0,\n\t\t\tnegativeHits: 0,\n\t\t\twrites: 0,\n\t\t},\n\t\ttokens: {\n\t\t\traw: 0,\n\t\t\trendered: 0,\n\t\t\tsavedByCache: 0,\n\t\t\tsavedByCompression: 0,\n\t\t\tsavedByOmission: 0,\n\t\t},\n\t};\n}\n\nexport function finalizeContextBudgetCacheTelemetryV2(\n\ttelemetry: MutableTokenCacheTelemetryV2,\n\tinput: {\n\t\treadonly rawTokens: number;\n\t\treadonly usedTokens: number;\n\t\treadonly omittedTokens: number;\n\t},\n): TokenCacheTelemetryV2 {\n\treturn {\n\t\tplanCache: { ...telemetry.planCache },\n\t\trepresentationCache: { ...telemetry.representationCache },\n\t\ttokens: {\n\t\t\traw: input.rawTokens,\n\t\t\trendered: input.usedTokens,\n\t\t\tsavedByCache: telemetry.tokens.savedByCache,\n\t\t\tsavedByCompression: Math.max(0, input.rawTokens - input.usedTokens - input.omittedTokens),\n\t\t\tsavedByOmission: input.omittedTokens,\n\t\t},\n\t};\n}\n\nexport function withCacheTelemetry(\n\tplan: PromptContextBudgetPlanV2,\n\ttelemetry: MutableTokenCacheTelemetryV2,\n): PromptContextBudgetPlanV2 {\n\tconst cache = finalizeContextBudgetCacheTelemetryV2(telemetry, {\n\t\tomittedTokens: plan.omittedTokens,\n\t\trawTokens: plan.rawTokens,\n\t\tusedTokens: plan.usedTokens,\n\t});\n\treturn {\n\t\t...plan,\n\t\tobservability: {\n\t\t\t...plan.observability,\n\t\t\tcache,\n\t\t},\n\t};\n}\n\nexport function recordContextBudgetRepresentationCacheHitV2(\n\ttelemetry: MutableTokenCacheTelemetryV2,\n\tkind: ContextRepresentationKindV2,\n\tkeyKind: ContextBudgetRepresentationCacheKeyKindV2 = \"exact\",\n): void {\n\tif (keyKind === \"materialized\") {\n\t\ttelemetry.representationCache.semanticHits += 1;\n\t\treturn;\n\t}\n\tif (kind === \"pointer\") {\n\t\ttelemetry.representationCache.pointerHits += 1;\n\t\treturn;\n\t}\n\ttelemetry.representationCache.exactHits += 1;\n}\n"]}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export function createMutableContextBudgetCacheTelemetryV2(planKey) {
|
|
2
|
+
return {
|
|
3
|
+
planCache: {
|
|
4
|
+
hit: false,
|
|
5
|
+
key: planKey,
|
|
6
|
+
},
|
|
7
|
+
representationCache: {
|
|
8
|
+
exactHits: 0,
|
|
9
|
+
semanticHits: 0,
|
|
10
|
+
pointerHits: 0,
|
|
11
|
+
misses: 0,
|
|
12
|
+
staleRejects: 0,
|
|
13
|
+
poisonRejects: 0,
|
|
14
|
+
negativeHits: 0,
|
|
15
|
+
writes: 0,
|
|
16
|
+
},
|
|
17
|
+
tokens: {
|
|
18
|
+
raw: 0,
|
|
19
|
+
rendered: 0,
|
|
20
|
+
savedByCache: 0,
|
|
21
|
+
savedByCompression: 0,
|
|
22
|
+
savedByOmission: 0,
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export function finalizeContextBudgetCacheTelemetryV2(telemetry, input) {
|
|
27
|
+
return {
|
|
28
|
+
planCache: { ...telemetry.planCache },
|
|
29
|
+
representationCache: { ...telemetry.representationCache },
|
|
30
|
+
tokens: {
|
|
31
|
+
raw: input.rawTokens,
|
|
32
|
+
rendered: input.usedTokens,
|
|
33
|
+
savedByCache: telemetry.tokens.savedByCache,
|
|
34
|
+
savedByCompression: Math.max(0, input.rawTokens - input.usedTokens - input.omittedTokens),
|
|
35
|
+
savedByOmission: input.omittedTokens,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export function withCacheTelemetry(plan, telemetry) {
|
|
40
|
+
const cache = finalizeContextBudgetCacheTelemetryV2(telemetry, {
|
|
41
|
+
omittedTokens: plan.omittedTokens,
|
|
42
|
+
rawTokens: plan.rawTokens,
|
|
43
|
+
usedTokens: plan.usedTokens,
|
|
44
|
+
});
|
|
45
|
+
return {
|
|
46
|
+
...plan,
|
|
47
|
+
observability: {
|
|
48
|
+
...plan.observability,
|
|
49
|
+
cache,
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export function recordContextBudgetRepresentationCacheHitV2(telemetry, kind, keyKind = "exact") {
|
|
54
|
+
if (keyKind === "materialized") {
|
|
55
|
+
telemetry.representationCache.semanticHits += 1;
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (kind === "pointer") {
|
|
59
|
+
telemetry.representationCache.pointerHits += 1;
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
telemetry.representationCache.exactHits += 1;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=context-budget-v2-cache-telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-budget-v2-cache-telemetry.js","sourceRoot":"","sources":["../../src/core/context-budget-v2-cache-telemetry.ts"],"names":[],"mappings":"AAkCA,MAAM,UAAU,0CAA0C,CAAC,OAAe,EAAgC;IACzG,OAAO;QACN,SAAS,EAAE;YACV,GAAG,EAAE,KAAK;YACV,GAAG,EAAE,OAAO;SACZ;QACD,mBAAmB,EAAE;YACpB,SAAS,EAAE,CAAC;YACZ,YAAY,EAAE,CAAC;YACf,WAAW,EAAE,CAAC;YACd,MAAM,EAAE,CAAC;YACT,YAAY,EAAE,CAAC;YACf,aAAa,EAAE,CAAC;YAChB,YAAY,EAAE,CAAC;YACf,MAAM,EAAE,CAAC;SACT;QACD,MAAM,EAAE;YACP,GAAG,EAAE,CAAC;YACN,QAAQ,EAAE,CAAC;YACX,YAAY,EAAE,CAAC;YACf,kBAAkB,EAAE,CAAC;YACrB,eAAe,EAAE,CAAC;SAClB;KACD,CAAC;AAAA,CACF;AAED,MAAM,UAAU,qCAAqC,CACpD,SAAuC,EACvC,KAIC,EACuB;IACxB,OAAO;QACN,SAAS,EAAE,EAAE,GAAG,SAAS,CAAC,SAAS,EAAE;QACrC,mBAAmB,EAAE,EAAE,GAAG,SAAS,CAAC,mBAAmB,EAAE;QACzD,MAAM,EAAE;YACP,GAAG,EAAE,KAAK,CAAC,SAAS;YACpB,QAAQ,EAAE,KAAK,CAAC,UAAU;YAC1B,YAAY,EAAE,SAAS,CAAC,MAAM,CAAC,YAAY;YAC3C,kBAAkB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC;YACzF,eAAe,EAAE,KAAK,CAAC,aAAa;SACpC;KACD,CAAC;AAAA,CACF;AAED,MAAM,UAAU,kBAAkB,CACjC,IAA+B,EAC/B,SAAuC,EACX;IAC5B,MAAM,KAAK,GAAG,qCAAqC,CAAC,SAAS,EAAE;QAC9D,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,UAAU,EAAE,IAAI,CAAC,UAAU;KAC3B,CAAC,CAAC;IACH,OAAO;QACN,GAAG,IAAI;QACP,aAAa,EAAE;YACd,GAAG,IAAI,CAAC,aAAa;YACrB,KAAK;SACL;KACD,CAAC;AAAA,CACF;AAED,MAAM,UAAU,2CAA2C,CAC1D,SAAuC,EACvC,IAAiC,EACjC,OAAO,GAA8C,OAAO,EACrD;IACP,IAAI,OAAO,KAAK,cAAc,EAAE,CAAC;QAChC,SAAS,CAAC,mBAAmB,CAAC,YAAY,IAAI,CAAC,CAAC;QAChD,OAAO;IACR,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACxB,SAAS,CAAC,mBAAmB,CAAC,WAAW,IAAI,CAAC,CAAC;QAC/C,OAAO;IACR,CAAC;IACD,SAAS,CAAC,mBAAmB,CAAC,SAAS,IAAI,CAAC,CAAC;AAAA,CAC7C","sourcesContent":["import type { ContextRepresentationKindV2 } from \"./context-budget-headroom.ts\";\nimport type {\n\tContextBudgetCacheLayerV2,\n\tContextBudgetRepresentationCacheKeyKindV2,\n\tPromptContextBudgetPlanV2,\n\tTokenCacheTelemetryV2,\n} from \"./context-budget-v2-types.ts\";\n\nexport interface MutableTokenCacheTelemetryV2 {\n\tplanCache: {\n\t\thit: boolean;\n\t\tkey: string;\n\t\tlayer?: ContextBudgetCacheLayerV2;\n\t\trejectedReason?: string;\n\t};\n\trepresentationCache: {\n\t\texactHits: number;\n\t\tsemanticHits: number;\n\t\tpointerHits: number;\n\t\tmisses: number;\n\t\tstaleRejects: number;\n\t\tpoisonRejects: number;\n\t\tnegativeHits: number;\n\t\twrites: number;\n\t};\n\ttokens: {\n\t\traw: number;\n\t\trendered: number;\n\t\tsavedByCache: number;\n\t\tsavedByCompression: number;\n\t\tsavedByOmission: number;\n\t};\n}\n\nexport function createMutableContextBudgetCacheTelemetryV2(planKey: string): MutableTokenCacheTelemetryV2 {\n\treturn {\n\t\tplanCache: {\n\t\t\thit: false,\n\t\t\tkey: planKey,\n\t\t},\n\t\trepresentationCache: {\n\t\t\texactHits: 0,\n\t\t\tsemanticHits: 0,\n\t\t\tpointerHits: 0,\n\t\t\tmisses: 0,\n\t\t\tstaleRejects: 0,\n\t\t\tpoisonRejects: 0,\n\t\t\tnegativeHits: 0,\n\t\t\twrites: 0,\n\t\t},\n\t\ttokens: {\n\t\t\traw: 0,\n\t\t\trendered: 0,\n\t\t\tsavedByCache: 0,\n\t\t\tsavedByCompression: 0,\n\t\t\tsavedByOmission: 0,\n\t\t},\n\t};\n}\n\nexport function finalizeContextBudgetCacheTelemetryV2(\n\ttelemetry: MutableTokenCacheTelemetryV2,\n\tinput: {\n\t\treadonly rawTokens: number;\n\t\treadonly usedTokens: number;\n\t\treadonly omittedTokens: number;\n\t},\n): TokenCacheTelemetryV2 {\n\treturn {\n\t\tplanCache: { ...telemetry.planCache },\n\t\trepresentationCache: { ...telemetry.representationCache },\n\t\ttokens: {\n\t\t\traw: input.rawTokens,\n\t\t\trendered: input.usedTokens,\n\t\t\tsavedByCache: telemetry.tokens.savedByCache,\n\t\t\tsavedByCompression: Math.max(0, input.rawTokens - input.usedTokens - input.omittedTokens),\n\t\t\tsavedByOmission: input.omittedTokens,\n\t\t},\n\t};\n}\n\nexport function withCacheTelemetry(\n\tplan: PromptContextBudgetPlanV2,\n\ttelemetry: MutableTokenCacheTelemetryV2,\n): PromptContextBudgetPlanV2 {\n\tconst cache = finalizeContextBudgetCacheTelemetryV2(telemetry, {\n\t\tomittedTokens: plan.omittedTokens,\n\t\trawTokens: plan.rawTokens,\n\t\tusedTokens: plan.usedTokens,\n\t});\n\treturn {\n\t\t...plan,\n\t\tobservability: {\n\t\t\t...plan.observability,\n\t\t\tcache,\n\t\t},\n\t};\n}\n\nexport function recordContextBudgetRepresentationCacheHitV2(\n\ttelemetry: MutableTokenCacheTelemetryV2,\n\tkind: ContextRepresentationKindV2,\n\tkeyKind: ContextBudgetRepresentationCacheKeyKindV2 = \"exact\",\n): void {\n\tif (keyKind === \"materialized\") {\n\t\ttelemetry.representationCache.semanticHits += 1;\n\t\treturn;\n\t}\n\tif (kind === \"pointer\") {\n\t\ttelemetry.representationCache.pointerHits += 1;\n\t\treturn;\n\t}\n\ttelemetry.representationCache.exactHits += 1;\n}\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ContextRepresentationCandidateV2 } from "./context-budget-headroom.ts";
|
|
2
|
+
import type { PlannedItemV2 } from "./context-budget-v2-scoring.ts";
|
|
3
|
+
import type { ContextBudgetPlanCacheEntryV2, ContextBudgetRepresentationCacheReadV2, ContextBudgetRepresentationCacheRejectReasonV2 } from "./context-budget-v2-types.ts";
|
|
4
|
+
interface ContextBudgetCacheValidationRuntimeV2 {
|
|
5
|
+
readonly keyBase: {
|
|
6
|
+
readonly modelId: string;
|
|
7
|
+
readonly policyVersion: string;
|
|
8
|
+
readonly tokenizerId: string;
|
|
9
|
+
readonly compressorPolicyHash?: string;
|
|
10
|
+
readonly qualityPolicyHash?: string;
|
|
11
|
+
};
|
|
12
|
+
readonly nowEpochMs: number;
|
|
13
|
+
readonly ttlMs: number;
|
|
14
|
+
}
|
|
15
|
+
export declare function validateContextBudgetPlanCacheEntryV2(input: {
|
|
16
|
+
readonly entry: ContextBudgetPlanCacheEntryV2;
|
|
17
|
+
readonly planned: readonly PlannedItemV2[];
|
|
18
|
+
readonly availableTokens: number;
|
|
19
|
+
readonly cache: ContextBudgetCacheValidationRuntimeV2;
|
|
20
|
+
}): string | undefined;
|
|
21
|
+
export declare function validateContextBudgetRepresentationCacheEntryV2(input: {
|
|
22
|
+
readonly cached: ContextBudgetRepresentationCacheReadV2;
|
|
23
|
+
readonly candidate: ContextRepresentationCandidateV2;
|
|
24
|
+
readonly cache: ContextBudgetCacheValidationRuntimeV2;
|
|
25
|
+
readonly sourceHash: string;
|
|
26
|
+
}): ContextBudgetRepresentationCacheRejectReasonV2 | undefined;
|
|
27
|
+
export declare function validateContextBudgetMaterializedRepresentationCacheEntryV2(input: {
|
|
28
|
+
readonly cached: ContextBudgetRepresentationCacheReadV2;
|
|
29
|
+
readonly candidate: ContextRepresentationCandidateV2;
|
|
30
|
+
readonly cache: ContextBudgetCacheValidationRuntimeV2;
|
|
31
|
+
readonly sourceHash: string;
|
|
32
|
+
}): ContextBudgetRepresentationCacheRejectReasonV2 | undefined;
|
|
33
|
+
export declare function sourceHashesByContextBudgetItemIdV2(planned: readonly PlannedItemV2[]): Record<string, string>;
|
|
34
|
+
export declare function isContextBudgetCacheEntryStaleV2(createdAtEpochMs: number | undefined, nowEpochMs: number, ttlMs: number): boolean;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=context-budget-v2-cache-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-budget-v2-cache-validation.d.ts","sourceRoot":"","sources":["../../src/core/context-budget-v2-cache-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,8BAA8B,CAAC;AAMrF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EACX,6BAA6B,EAC7B,sCAAsC,EACtC,8CAA8C,EAC9C,MAAM,8BAA8B,CAAC;AAEtC,UAAU,qCAAqC;IAC9C,QAAQ,CAAC,OAAO,EAAE;QACjB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;QACvC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;KACpC,CAAC;IACF,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,qCAAqC,CAAC,KAAK,EAAE;IAC5D,QAAQ,CAAC,KAAK,EAAE,6BAA6B,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,qCAAqC,CAAC;CACtD,GAAG,MAAM,GAAG,SAAS,CAarB;AAED,wBAAgB,+CAA+C,CAAC,KAAK,EAAE;IACtE,QAAQ,CAAC,MAAM,EAAE,sCAAsC,CAAC;IACxD,QAAQ,CAAC,SAAS,EAAE,gCAAgC,CAAC;IACrD,QAAQ,CAAC,KAAK,EAAE,qCAAqC,CAAC;IACtD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC5B,GAAG,8CAA8C,GAAG,SAAS,CAW7D;AAED,wBAAgB,2DAA2D,CAAC,KAAK,EAAE;IAClF,QAAQ,CAAC,MAAM,EAAE,sCAAsC,CAAC;IACxD,QAAQ,CAAC,SAAS,EAAE,gCAAgC,CAAC;IACrD,QAAQ,CAAC,KAAK,EAAE,qCAAqC,CAAC;IACtD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC5B,GAAG,8CAA8C,GAAG,SAAS,CA6B7D;AAqBD,wBAAgB,mCAAmC,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAM7G;AAED,wBAAgB,gCAAgC,CAC/C,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GACX,OAAO,CAGT","sourcesContent":["import type { ContextRepresentationCandidateV2 } from \"./context-budget-headroom.ts\";\nimport {\n\tcomputeContextBudgetOutputTextHashV2,\n\tcomputeContextBudgetRepresentationFingerprintV2,\n\tcomputeContextBudgetTargetTokenBucketV2,\n} from \"./context-budget-v2-cache-keys.ts\";\nimport type { PlannedItemV2 } from \"./context-budget-v2-scoring.ts\";\nimport type {\n\tContextBudgetPlanCacheEntryV2,\n\tContextBudgetRepresentationCacheReadV2,\n\tContextBudgetRepresentationCacheRejectReasonV2,\n} from \"./context-budget-v2-types.ts\";\n\ninterface ContextBudgetCacheValidationRuntimeV2 {\n\treadonly keyBase: {\n\t\treadonly modelId: string;\n\t\treadonly policyVersion: string;\n\t\treadonly tokenizerId: string;\n\t\treadonly compressorPolicyHash?: string;\n\t\treadonly qualityPolicyHash?: string;\n\t};\n\treadonly nowEpochMs: number;\n\treadonly ttlMs: number;\n}\n\nexport function validateContextBudgetPlanCacheEntryV2(input: {\n\treadonly entry: ContextBudgetPlanCacheEntryV2;\n\treadonly planned: readonly PlannedItemV2[];\n\treadonly availableTokens: number;\n\treadonly cache: ContextBudgetCacheValidationRuntimeV2;\n}): string | undefined {\n\tif (isContextBudgetCacheEntryStaleV2(input.entry.createdAtEpochMs, input.cache.nowEpochMs, input.cache.ttlMs)) {\n\t\treturn \"stale\";\n\t}\n\tif (input.entry.plan.selectedRepresentations.some((representation) => representation.cache?.hit === true)) {\n\t\treturn \"cache_dependency_unsafe\";\n\t}\n\tif (input.entry.plan.usedTokens > input.availableTokens) return \"budget_mismatch\";\n\tconst currentSourceHashes = sourceHashesByContextBudgetItemIdV2(input.planned);\n\tfor (const [itemId, sourceHash] of Object.entries(currentSourceHashes)) {\n\t\tif (input.entry.sourceHashes[itemId] !== sourceHash) return \"source_hash_mismatch\";\n\t}\n\treturn undefined;\n}\n\nexport function validateContextBudgetRepresentationCacheEntryV2(input: {\n\treadonly cached: ContextBudgetRepresentationCacheReadV2;\n\treadonly candidate: ContextRepresentationCandidateV2;\n\treadonly cache: ContextBudgetCacheValidationRuntimeV2;\n\treadonly sourceHash: string;\n}): ContextBudgetRepresentationCacheRejectReasonV2 | undefined {\n\tconst entry = input.cached.entry;\n\tif (entry.kind !== input.candidate.kind) return \"kind_mismatch\";\n\tif (entry.sourceHash !== input.sourceHash) return \"source_hash_mismatch\";\n\tif (entry.keyKind === \"materialized\") {\n\t\treturn validateContextBudgetMaterializedRepresentationCacheEntryV2(input);\n\t}\n\tif (entry.representationFingerprint !== computeContextBudgetRepresentationFingerprintV2(input.candidate)) {\n\t\treturn \"fingerprint_mismatch\";\n\t}\n\treturn validateSharedRepresentationCacheEntryV2(input);\n}\n\nexport function validateContextBudgetMaterializedRepresentationCacheEntryV2(input: {\n\treadonly cached: ContextBudgetRepresentationCacheReadV2;\n\treadonly candidate: ContextRepresentationCandidateV2;\n\treadonly cache: ContextBudgetCacheValidationRuntimeV2;\n\treadonly sourceHash: string;\n}): ContextBudgetRepresentationCacheRejectReasonV2 | undefined {\n\tconst entry = input.cached.entry;\n\tif (entry.kind !== input.candidate.kind) return \"kind_mismatch\";\n\tif (entry.sourceHash !== input.sourceHash) return \"source_hash_mismatch\";\n\tconst sharedRejection = validateSharedRepresentationCacheEntryV2(input);\n\tif (sharedRejection) return sharedRejection;\n\tif (\n\t\tentry.compressorPolicyHash !== undefined &&\n\t\tentry.compressorPolicyHash !== input.cache.keyBase.compressorPolicyHash\n\t) {\n\t\treturn \"policy_mismatch\";\n\t}\n\tif (entry.qualityPolicyHash !== undefined && entry.qualityPolicyHash !== input.cache.keyBase.qualityPolicyHash) {\n\t\treturn \"policy_mismatch\";\n\t}\n\tif (\n\t\tentry.targetTokenBucket !== undefined &&\n\t\tentry.targetTokenBucket !== computeContextBudgetTargetTokenBucketV2(input.candidate.estimatedTokens)\n\t) {\n\t\treturn \"token_invalid\";\n\t}\n\tif (entry.outputTextHash !== computeContextBudgetOutputTextHashV2(entry.text)) return \"poisoned\";\n\tconst verification = entry.verification;\n\tif (!verification) return \"poisoned\";\n\tif ((verification.queryCoverage ?? 0) < materializedCoverageFloor(input.candidate)) return \"poisoned\";\n\tif ((verification.sourceCoverage ?? 0) < materializedCoverageFloor(input.candidate)) return \"poisoned\";\n\tif ((verification.secretLeakScore ?? 1) > 0) return \"poisoned\";\n\tif ((verification.poisonScore ?? 1) > 0) return \"poisoned\";\n\treturn undefined;\n}\n\nfunction validateSharedRepresentationCacheEntryV2(input: {\n\treadonly cached: ContextBudgetRepresentationCacheReadV2;\n\treadonly cache: ContextBudgetCacheValidationRuntimeV2;\n}): ContextBudgetRepresentationCacheRejectReasonV2 | undefined {\n\tconst entry = input.cached.entry;\n\tif (entry.policyVersion !== input.cache.keyBase.policyVersion) return \"policy_mismatch\";\n\tif (entry.modelId !== input.cache.keyBase.modelId) return \"model_mismatch\";\n\tif (entry.tokenizerId !== input.cache.keyBase.tokenizerId) return \"tokenizer_mismatch\";\n\tif (!Number.isFinite(entry.estimatedTokens) || entry.estimatedTokens < 0) return \"token_invalid\";\n\tif (isContextBudgetCacheEntryStaleV2(entry.createdAtEpochMs, input.cache.nowEpochMs, input.cache.ttlMs))\n\t\treturn \"stale\";\n\treturn undefined;\n}\n\nfunction materializedCoverageFloor(candidate: ContextRepresentationCandidateV2): number {\n\tif (candidate.kind === \"headroom-compressed\") return 0.5;\n\treturn 0.75;\n}\n\nexport function sourceHashesByContextBudgetItemIdV2(planned: readonly PlannedItemV2[]): Record<string, string> {\n\tconst hashes: Record<string, string> = {};\n\tfor (const item of planned) {\n\t\thashes[item.item.id] = item.contentHash;\n\t}\n\treturn hashes;\n}\n\nexport function isContextBudgetCacheEntryStaleV2(\n\tcreatedAtEpochMs: number | undefined,\n\tnowEpochMs: number,\n\tttlMs: number,\n): boolean {\n\tif (createdAtEpochMs === undefined) return false;\n\treturn nowEpochMs - createdAtEpochMs > ttlMs;\n}\n"]}
|