open-multi-agent-kit 0.94.1 → 0.95.1

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.
Files changed (126) hide show
  1. package/CHANGELOG.md +49 -1
  2. package/README.md +100 -647
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +11 -11
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/auth-storage.d.ts +27 -2
  7. package/dist/core/auth-storage.d.ts.map +1 -1
  8. package/dist/core/auth-storage.js +239 -56
  9. package/dist/core/auth-storage.js.map +1 -1
  10. package/dist/core/context-budget-v2-cache-invalidation.d.ts.map +1 -1
  11. package/dist/core/context-budget-v2-cache-invalidation.js +1 -1
  12. package/dist/core/context-budget-v2-cache-invalidation.js.map +1 -1
  13. package/dist/core/context-budget-v2-cache-provider.d.ts +5 -1
  14. package/dist/core/context-budget-v2-cache-provider.d.ts.map +1 -1
  15. package/dist/core/context-budget-v2-cache-provider.js +37 -7
  16. package/dist/core/context-budget-v2-cache-provider.js.map +1 -1
  17. package/dist/core/context-budget-v2-cache-telemetry.d.ts +1 -1
  18. package/dist/core/context-budget-v2-cache-telemetry.d.ts.map +1 -1
  19. package/dist/core/context-budget-v2-cache-telemetry.js +2 -1
  20. package/dist/core/context-budget-v2-cache-telemetry.js.map +1 -1
  21. package/dist/core/context-budget-v2-cache.d.ts.map +1 -1
  22. package/dist/core/context-budget-v2-cache.js +3 -0
  23. package/dist/core/context-budget-v2-cache.js.map +1 -1
  24. package/dist/core/context-budget-v2-plan-cache-keys.d.ts.map +1 -1
  25. package/dist/core/context-budget-v2-plan-cache-keys.js +39 -5
  26. package/dist/core/context-budget-v2-plan-cache-keys.js.map +1 -1
  27. package/dist/core/context-budget-v2-representation-cache.d.ts.map +1 -1
  28. package/dist/core/context-budget-v2-representation-cache.js +4 -3
  29. package/dist/core/context-budget-v2-representation-cache.js.map +1 -1
  30. package/dist/core/context-budget-v2-selection.d.ts.map +1 -1
  31. package/dist/core/context-budget-v2-selection.js +4 -0
  32. package/dist/core/context-budget-v2-selection.js.map +1 -1
  33. package/dist/core/context-budget-v2-types.d.ts +3 -0
  34. package/dist/core/context-budget-v2-types.d.ts.map +1 -1
  35. package/dist/core/context-budget-v2-types.js.map +1 -1
  36. package/dist/core/extensions/types.d.ts +2 -0
  37. package/dist/core/extensions/types.d.ts.map +1 -1
  38. package/dist/core/extensions/types.js.map +1 -1
  39. package/dist/core/github-repository.d.ts +3 -0
  40. package/dist/core/github-repository.d.ts.map +1 -0
  41. package/dist/core/github-repository.js +3 -0
  42. package/dist/core/github-repository.js.map +1 -0
  43. package/dist/core/headroom.d.ts.map +1 -1
  44. package/dist/core/headroom.js +7 -2
  45. package/dist/core/headroom.js.map +1 -1
  46. package/dist/core/model-registry.d.ts +3 -3
  47. package/dist/core/model-registry.d.ts.map +1 -1
  48. package/dist/core/model-registry.js +9 -8
  49. package/dist/core/model-registry.js.map +1 -1
  50. package/dist/core/provider-usage.d.ts +48 -0
  51. package/dist/core/provider-usage.d.ts.map +1 -0
  52. package/dist/core/provider-usage.js +780 -0
  53. package/dist/core/provider-usage.js.map +1 -0
  54. package/dist/core/sdk.d.ts.map +1 -1
  55. package/dist/core/sdk.js +10 -0
  56. package/dist/core/sdk.js.map +1 -1
  57. package/dist/core/session-termination.d.ts.map +1 -1
  58. package/dist/core/session-termination.js +8 -1
  59. package/dist/core/session-termination.js.map +1 -1
  60. package/dist/core/settings-manager.d.ts +1 -5
  61. package/dist/core/settings-manager.d.ts.map +1 -1
  62. package/dist/core/settings-manager.js +15 -17
  63. package/dist/core/settings-manager.js.map +1 -1
  64. package/dist/core/skills-catalog-cache.d.ts +1 -0
  65. package/dist/core/skills-catalog-cache.d.ts.map +1 -1
  66. package/dist/core/skills-catalog-cache.js +42 -11
  67. package/dist/core/skills-catalog-cache.js.map +1 -1
  68. package/dist/core/slash-commands.d.ts.map +1 -1
  69. package/dist/core/slash-commands.js +1 -4
  70. package/dist/core/slash-commands.js.map +1 -1
  71. package/dist/core/tools/read.d.ts +1 -1
  72. package/dist/core/tools/read.d.ts.map +1 -1
  73. package/dist/core/tools/read.js.map +1 -1
  74. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  75. package/dist/modes/interactive/components/footer.js.map +1 -1
  76. package/dist/modes/interactive/components/index.d.ts +1 -0
  77. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  78. package/dist/modes/interactive/components/index.js +1 -0
  79. package/dist/modes/interactive/components/index.js.map +1 -1
  80. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  81. package/dist/modes/interactive/components/model-selector.js +5 -3
  82. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  83. package/dist/modes/interactive/components/oauth-account-selector.d.ts +16 -0
  84. package/dist/modes/interactive/components/oauth-account-selector.d.ts.map +1 -0
  85. package/dist/modes/interactive/components/oauth-account-selector.js +61 -0
  86. package/dist/modes/interactive/components/oauth-account-selector.js.map +1 -0
  87. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  88. package/dist/modes/interactive/components/oauth-selector.js +25 -4
  89. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  90. package/dist/modes/interactive/components/status-sidebar.d.ts +21 -1
  91. package/dist/modes/interactive/components/status-sidebar.d.ts.map +1 -1
  92. package/dist/modes/interactive/components/status-sidebar.js +165 -6
  93. package/dist/modes/interactive/components/status-sidebar.js.map +1 -1
  94. package/dist/modes/interactive/interactive-mode.d.ts +1 -1
  95. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  96. package/dist/modes/interactive/interactive-mode.js +89 -60
  97. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  98. package/dist/utils/image-resize-core.d.ts.map +1 -1
  99. package/dist/utils/image-resize-core.js +2 -2
  100. package/dist/utils/image-resize-core.js.map +1 -1
  101. package/docs/development.md +3 -2
  102. package/docs/providers.md +19 -4
  103. package/docs/settings.md +9 -20
  104. package/docs/usage.md +10 -10
  105. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  106. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  107. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  108. package/examples/extensions/gondolin/package-lock.json +2 -2
  109. package/examples/extensions/gondolin/package.json +1 -1
  110. package/examples/extensions/sandbox/package-lock.json +2 -2
  111. package/examples/extensions/sandbox/package.json +1 -1
  112. package/examples/extensions/subagent/agents/planner.md +1 -1
  113. package/examples/extensions/subagent/agents/reviewer.md +1 -1
  114. package/examples/extensions/subagent/agents/scout.md +1 -1
  115. package/examples/extensions/with-deps/package-lock.json +2 -2
  116. package/examples/extensions/with-deps/package.json +1 -1
  117. package/npm-shrinkwrap.json +24 -24
  118. package/package.json +6 -6
  119. package/dist/core/context-budget-compressors.d.ts +0 -50
  120. package/dist/core/context-budget-compressors.d.ts.map +0 -1
  121. package/dist/core/context-budget-compressors.js +0 -166
  122. package/dist/core/context-budget-compressors.js.map +0 -1
  123. package/dist/core/github-star-nudge.d.ts +0 -15
  124. package/dist/core/github-star-nudge.d.ts.map +0 -1
  125. package/dist/core/github-star-nudge.js +0 -21
  126. package/dist/core/github-star-nudge.js.map +0 -1
@@ -1,4 +1,23 @@
1
1
  import { createContextCacheInvalidationSnapshot, } from "./context-budget-v2-cache-invalidation.js";
2
+ const DEFAULT_MAX_ENTRIES_PER_CACHE = 256;
3
+ function readLru(store, key) {
4
+ const entry = store.get(key);
5
+ if (entry === undefined)
6
+ return undefined;
7
+ store.delete(key);
8
+ store.set(key, entry);
9
+ return entry;
10
+ }
11
+ function writeLru(store, key, entry, maxEntries) {
12
+ store.delete(key);
13
+ store.set(key, entry);
14
+ while (store.size > maxEntries) {
15
+ const oldestKey = store.keys().next().value;
16
+ if (oldestKey === undefined)
17
+ return;
18
+ store.delete(oldestKey);
19
+ }
20
+ }
2
21
  export function createMemoryContextBudgetCacheProviderV2(layer = "turn") {
3
22
  return new MemoryContextBudgetCacheProviderV2(layer);
4
23
  }
@@ -7,9 +26,11 @@ export class MemoryContextBudgetCacheProviderV2 {
7
26
  negatives = new Map();
8
27
  plans = new Map();
9
28
  layer;
29
+ maxEntries;
10
30
  invalidationSnapshot;
11
- constructor(layer) {
31
+ constructor(layer, maxEntries = DEFAULT_MAX_ENTRIES_PER_CACHE) {
12
32
  this.layer = layer;
33
+ this.maxEntries = maxEntries;
13
34
  }
14
35
  getInvalidationSnapshot() {
15
36
  return this.invalidationSnapshot;
@@ -29,24 +50,33 @@ export class MemoryContextBudgetCacheProviderV2 {
29
50
  });
30
51
  }
31
52
  readRepresentation(key) {
32
- const entry = this.representations.get(key);
53
+ const entry = readLru(this.representations, key);
33
54
  return entry ? { entry, layer: this.layer } : undefined;
34
55
  }
35
56
  writeRepresentation(input) {
36
- this.representations.set(input.key, input.entry);
57
+ writeLru(this.representations, input.key, input.entry, this.maxEntries);
58
+ }
59
+ deleteRepresentation(key) {
60
+ this.representations.delete(key);
37
61
  }
38
62
  readNegativeRepresentation(key) {
39
- return this.negatives.get(key);
63
+ return readLru(this.negatives, key);
40
64
  }
41
65
  writeNegativeRepresentation(input) {
42
- this.negatives.set(input.key, { reason: input.reason, layer: this.layer });
66
+ writeLru(this.negatives, input.key, { reason: input.reason, createdAtEpochMs: Date.now(), layer: this.layer }, this.maxEntries);
67
+ }
68
+ deleteNegativeRepresentation(key) {
69
+ this.negatives.delete(key);
43
70
  }
44
71
  readPlan(key) {
45
- const entry = this.plans.get(key);
72
+ const entry = readLru(this.plans, key);
46
73
  return entry ? { entry, layer: this.layer } : undefined;
47
74
  }
48
75
  writePlan(input) {
49
- this.plans.set(input.key, input.entry);
76
+ writeLru(this.plans, input.key, input.entry, this.maxEntries);
77
+ }
78
+ deletePlan(key) {
79
+ this.plans.delete(key);
50
80
  }
51
81
  }
52
82
  //# sourceMappingURL=context-budget-v2-cache-provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context-budget-v2-cache-provider.js","sourceRoot":"","sources":["../../src/core/context-budget-v2-cache-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,sCAAsC,GACtC,MAAM,2CAA2C,CAAC;AAWnD,MAAM,UAAU,wCAAwC,CACvD,KAAK,GAA8B,MAAM,EACV;IAC/B,OAAO,IAAI,kCAAkC,CAAC,KAAK,CAAC,CAAC;AAAA,CACrD;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;IACzD,KAAK,CAA4B;IAC1C,oBAAoB,CAA+C;IAE3E,YAAY,KAAgC,EAAE;QAC7C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IAAA,CACnB;IAED,uBAAuB,GAAiD;QACvE,OAAO,IAAI,CAAC,oBAAoB,CAAC;IAAA,CACjC;IAED,uBAAuB,CAAC,QAA0C,EAAQ;QACzE,IAAI,CAAC,oBAAoB,GAAG,sCAAsC,CAAC;YAClE,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB;YACjD,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;YAC7C,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,gBAAgB,EAAE,QAAQ,CAAC,QAAQ,CAAC,gBAAgB;YACpD,qBAAqB,EAAE,QAAQ,CAAC,QAAQ,CAAC,qBAAqB;YAC9D,eAAe,EAAE,QAAQ,CAAC,QAAQ,CAAC,eAAe;YAClD,YAAY,EAAE,QAAQ,CAAC,QAAQ,CAAC,YAAY;YAC5C,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,QAAQ;SACpC,CAAC,CAAC;IAAA,CACH;IAED,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,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAAA,CACxD;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,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAAA,CAC3E;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,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAAA,CACxD;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 {\n\ttype ContextCacheInvalidationSnapshot,\n\tcreateContextCacheInvalidationSnapshot,\n} from \"./context-budget-v2-cache-invalidation.ts\";\nimport type {\n\tContextBudgetCacheLayerV2,\n\tContextBudgetCacheProviderV2,\n\tContextBudgetNegativeCacheEntryV2,\n\tContextBudgetPlanCacheEntryV2,\n\tContextBudgetPlanCacheReadV2,\n\tContextBudgetRepresentationCacheEntryV2,\n\tContextBudgetRepresentationCacheReadV2,\n} from \"./context-budget-v2-types.ts\";\n\nexport function createMemoryContextBudgetCacheProviderV2(\n\tlayer: ContextBudgetCacheLayerV2 = \"turn\",\n): ContextBudgetCacheProviderV2 {\n\treturn new MemoryContextBudgetCacheProviderV2(layer);\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\tprivate readonly layer: ContextBudgetCacheLayerV2;\n\tprivate invalidationSnapshot: ContextCacheInvalidationSnapshot | undefined;\n\n\tconstructor(layer: ContextBudgetCacheLayerV2) {\n\t\tthis.layer = layer;\n\t}\n\n\tgetInvalidationSnapshot(): ContextCacheInvalidationSnapshot | undefined {\n\t\treturn this.invalidationSnapshot;\n\t}\n\n\tsetInvalidationSnapshot(snapshot: ContextCacheInvalidationSnapshot): void {\n\t\tthis.invalidationSnapshot = createContextCacheInvalidationSnapshot({\n\t\t\tforkId: snapshot.forkId,\n\t\t\tworktreeFingerprint: snapshot.worktreeFingerprint,\n\t\t\tactiveModelId: snapshot.activeModelId,\n\t\t\tcompactionModelId: snapshot.compactionModelId,\n\t\t\tglobalEpoch: snapshot.globalEpoch,\n\t\t\ttranscriptRepair: snapshot.counters.transcriptRepair,\n\t\t\ttoolResultDisposition: snapshot.counters.toolResultDisposition,\n\t\t\tevidenceReceipt: snapshot.counters.evidenceReceipt,\n\t\t\tuserSteering: snapshot.counters.userSteering,\n\t\t\tsettings: snapshot.counters.settings,\n\t\t});\n\t}\n\n\treadRepresentation(key: string): ContextBudgetRepresentationCacheReadV2 | undefined {\n\t\tconst entry = this.representations.get(key);\n\t\treturn entry ? { entry, layer: this.layer } : 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: this.layer });\n\t}\n\n\treadPlan(key: string): ContextBudgetPlanCacheReadV2 | undefined {\n\t\tconst entry = this.plans.get(key);\n\t\treturn entry ? { entry, layer: this.layer } : 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"]}
1
+ {"version":3,"file":"context-budget-v2-cache-provider.js","sourceRoot":"","sources":["../../src/core/context-budget-v2-cache-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype ContextCacheInvalidationSnapshot,\n\tcreateContextCacheInvalidationSnapshot,\n} from \"./context-budget-v2-cache-invalidation.ts\";\nimport type {\n\tContextBudgetCacheLayerV2,\n\tContextBudgetCacheProviderV2,\n\tContextBudgetNegativeCacheEntryV2,\n\tContextBudgetPlanCacheEntryV2,\n\tContextBudgetPlanCacheReadV2,\n\tContextBudgetRepresentationCacheEntryV2,\n\tContextBudgetRepresentationCacheReadV2,\n} from \"./context-budget-v2-types.ts\";\n\nconst DEFAULT_MAX_ENTRIES_PER_CACHE = 256;\n\nfunction readLru<T>(store: Map<string, T>, key: string): T | undefined {\n\tconst entry = store.get(key);\n\tif (entry === undefined) return undefined;\n\tstore.delete(key);\n\tstore.set(key, entry);\n\treturn entry;\n}\n\nfunction writeLru<T>(store: Map<string, T>, key: string, entry: T, maxEntries: number): void {\n\tstore.delete(key);\n\tstore.set(key, entry);\n\twhile (store.size > maxEntries) {\n\t\tconst oldestKey = store.keys().next().value;\n\t\tif (oldestKey === undefined) return;\n\t\tstore.delete(oldestKey);\n\t}\n}\n\nexport function createMemoryContextBudgetCacheProviderV2(\n\tlayer: ContextBudgetCacheLayerV2 = \"turn\",\n): ContextBudgetCacheProviderV2 {\n\treturn new MemoryContextBudgetCacheProviderV2(layer);\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\tprivate readonly layer: ContextBudgetCacheLayerV2;\n\tprivate readonly maxEntries: number;\n\tprivate invalidationSnapshot: ContextCacheInvalidationSnapshot | undefined;\n\n\tconstructor(layer: ContextBudgetCacheLayerV2, maxEntries = DEFAULT_MAX_ENTRIES_PER_CACHE) {\n\t\tthis.layer = layer;\n\t\tthis.maxEntries = maxEntries;\n\t}\n\n\tgetInvalidationSnapshot(): ContextCacheInvalidationSnapshot | undefined {\n\t\treturn this.invalidationSnapshot;\n\t}\n\n\tsetInvalidationSnapshot(snapshot: ContextCacheInvalidationSnapshot): void {\n\t\tthis.invalidationSnapshot = createContextCacheInvalidationSnapshot({\n\t\t\tforkId: snapshot.forkId,\n\t\t\tworktreeFingerprint: snapshot.worktreeFingerprint,\n\t\t\tactiveModelId: snapshot.activeModelId,\n\t\t\tcompactionModelId: snapshot.compactionModelId,\n\t\t\tglobalEpoch: snapshot.globalEpoch,\n\t\t\ttranscriptRepair: snapshot.counters.transcriptRepair,\n\t\t\ttoolResultDisposition: snapshot.counters.toolResultDisposition,\n\t\t\tevidenceReceipt: snapshot.counters.evidenceReceipt,\n\t\t\tuserSteering: snapshot.counters.userSteering,\n\t\t\tsettings: snapshot.counters.settings,\n\t\t});\n\t}\n\n\treadRepresentation(key: string): ContextBudgetRepresentationCacheReadV2 | undefined {\n\t\tconst entry = readLru(this.representations, key);\n\t\treturn entry ? { entry, layer: this.layer } : undefined;\n\t}\n\n\twriteRepresentation(input: { readonly key: string; readonly entry: ContextBudgetRepresentationCacheEntryV2 }): void {\n\t\twriteLru(this.representations, input.key, input.entry, this.maxEntries);\n\t}\n\n\tdeleteRepresentation(key: string): void {\n\t\tthis.representations.delete(key);\n\t}\n\n\treadNegativeRepresentation(key: string): ContextBudgetNegativeCacheEntryV2 | undefined {\n\t\treturn readLru(this.negatives, key);\n\t}\n\n\twriteNegativeRepresentation(input: { readonly key: string; readonly reason: string }): void {\n\t\twriteLru(\n\t\t\tthis.negatives,\n\t\t\tinput.key,\n\t\t\t{ reason: input.reason, createdAtEpochMs: Date.now(), layer: this.layer },\n\t\t\tthis.maxEntries,\n\t\t);\n\t}\n\n\tdeleteNegativeRepresentation(key: string): void {\n\t\tthis.negatives.delete(key);\n\t}\n\n\treadPlan(key: string): ContextBudgetPlanCacheReadV2 | undefined {\n\t\tconst entry = readLru(this.plans, key);\n\t\treturn entry ? { entry, layer: this.layer } : undefined;\n\t}\n\n\twritePlan(input: { readonly key: string; readonly entry: ContextBudgetPlanCacheEntryV2 }): void {\n\t\twriteLru(this.plans, input.key, input.entry, this.maxEntries);\n\t}\n\n\tdeletePlan(key: string): void {\n\t\tthis.plans.delete(key);\n\t}\n}\n"]}
@@ -32,5 +32,5 @@ export declare function finalizeContextBudgetCacheTelemetryV2(telemetry: Mutable
32
32
  readonly omittedTokens: number;
33
33
  }): TokenCacheTelemetryV2;
34
34
  export declare function withCacheTelemetry(plan: PromptContextBudgetPlanV2, telemetry: MutableTokenCacheTelemetryV2): PromptContextBudgetPlanV2;
35
- export declare function recordContextBudgetRepresentationCacheHitV2(telemetry: MutableTokenCacheTelemetryV2, kind: ContextRepresentationKindV2, keyKind?: ContextBudgetRepresentationCacheKeyKindV2): void;
35
+ export declare function recordContextBudgetRepresentationCacheHitV2(telemetry: MutableTokenCacheTelemetryV2, kind: ContextRepresentationKindV2, keyKind?: ContextBudgetRepresentationCacheKeyKindV2, savedTokens?: number): void;
36
36
  //# sourceMappingURL=context-budget-v2-cache-telemetry.d.ts.map
@@ -1 +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"]}
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,EAC5D,WAAW,SAAI,GACb,IAAI,CAWN","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\tsavedTokens = 0,\n): void {\n\ttelemetry.tokens.savedByCache += Math.max(0, Math.floor(savedTokens));\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"]}
@@ -50,7 +50,8 @@ export function withCacheTelemetry(plan, telemetry) {
50
50
  },
51
51
  };
52
52
  }
53
- export function recordContextBudgetRepresentationCacheHitV2(telemetry, kind, keyKind = "exact") {
53
+ export function recordContextBudgetRepresentationCacheHitV2(telemetry, kind, keyKind = "exact", savedTokens = 0) {
54
+ telemetry.tokens.savedByCache += Math.max(0, Math.floor(savedTokens));
54
55
  if (keyKind === "materialized") {
55
56
  telemetry.representationCache.semanticHits += 1;
56
57
  return;
@@ -1 +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"]}
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,EAC5D,WAAW,GAAG,CAAC,EACR;IACP,SAAS,CAAC,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IACtE,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\tsavedTokens = 0,\n): void {\n\ttelemetry.tokens.savedByCache += Math.max(0, Math.floor(savedTokens));\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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"context-budget-v2-cache.d.ts","sourceRoot":"","sources":["../../src/core/context-budget-v2-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AACrF,OAAO,EAEN,KAAK,4BAA4B,EAEjC,MAAM,wCAAwC,CAAC;AAKhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EAAE,4BAA4B,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAE5G,OAAO,EACN,+CAA+C,EAC/C,sDAAsD,EACtD,0DAA0D,EAC1D,0CAA0C,EAC1C,KAAK,2BAA2B,EAChC,oCAAoC,EACpC,qCAAqC,EACrC,+CAA+C,EAC/C,uCAAuC,EACvC,iCAAiC,EACjC,8CAA8C,EAC9C,2CAA2C,GAC3C,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,wCAAwC,EAAE,MAAM,uCAAuC,CAAC;AACjG,OAAO,EACN,qCAAqC,EACrC,KAAK,4BAA4B,EACjC,kBAAkB,GAClB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,gCAAgC,EAAE,MAAM,wCAAwC,CAAC;AAC1F,OAAO,EACN,0BAA0B,EAC1B,gCAAgC,EAChC,0BAA0B,GAC1B,MAAM,6CAA6C,CAAC;AAIrD,MAAM,WAAW,6BAA6B;IAC7C,QAAQ,CAAC,QAAQ,CAAC,EAAE,4BAA4B,CAAC;IACjD,QAAQ,CAAC,OAAO,EAAE,2BAA2B,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,4BAA4B,CAAC;CACjD;AAED,wBAAgB,mCAAmC,CAAC,KAAK,EAAE;IAC1D,QAAQ,CAAC,QAAQ,CAAC,EAAE,4BAA4B,CAAC;IACjD,QAAQ,CAAC,OAAO,EAAE,2BAA2B,CAAC;IAC9C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,6BAA6B,CAQhC;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC3C,QAAQ,CAAC,KAAK,EAAE,6BAA6B,CAAC;IAC9C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CACjC,GAAG,yBAAyB,GAAG,SAAS,CAgBxC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACvC,QAAQ,CAAC,KAAK,EAAE,6BAA6B,CAAC;IAC9C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;CAC3C,GAAG,IAAI,CAWP","sourcesContent":["import type { ContextBudgetCacheKeyBaseV2 } from \"./context-budget-v2-cache-keys.ts\";\nimport {\n\tcreateMutableContextBudgetCacheTelemetryV2,\n\ttype MutableTokenCacheTelemetryV2,\n\twithCacheTelemetry,\n} from \"./context-budget-v2-cache-telemetry.ts\";\nimport {\n\tsourceHashesByContextBudgetItemIdV2,\n\tvalidateContextBudgetPlanCacheEntryV2,\n} from \"./context-budget-v2-cache-validation.ts\";\nimport type { PlannedItemV2 } from \"./context-budget-v2-scoring.ts\";\nimport type { ContextBudgetCacheProviderV2, PromptContextBudgetPlanV2 } from \"./context-budget-v2-types.ts\";\n\nexport {\n\tbuildContextBudgetExactRepresentationCacheKeyV2,\n\tbuildContextBudgetMaterializedRepresentationCacheKeyV2,\n\tbuildContextBudgetMaterializedRepresentationCandidateKeyV2,\n\tbuildContextBudgetRepresentationCacheKeyV2,\n\ttype ContextBudgetCacheKeyBaseV2,\n\tcomputeContextBudgetOutputTextHashV2,\n\tcomputeContextBudgetQueryIntentHashV2,\n\tcomputeContextBudgetRepresentationFingerprintV2,\n\tcomputeContextBudgetTargetTokenBucketV2,\n\tcreateContextBudgetCacheKeyBaseV2,\n\tDEFAULT_MATERIALIZED_COMPRESSOR_POLICY_HASH_V2,\n\tDEFAULT_MATERIALIZED_QUALITY_POLICY_HASH_V2,\n} from \"./context-budget-v2-cache-keys.ts\";\nexport { createMemoryContextBudgetCacheProviderV2 } from \"./context-budget-v2-cache-provider.ts\";\nexport {\n\tfinalizeContextBudgetCacheTelemetryV2,\n\ttype MutableTokenCacheTelemetryV2,\n\twithCacheTelemetry,\n} from \"./context-budget-v2-cache-telemetry.ts\";\nexport { buildContextBudgetPlanCacheKeyV2 } from \"./context-budget-v2-plan-cache-keys.ts\";\nexport {\n\tapplyRepresentationCacheV2,\n\tisMaterializableRepresentationV2,\n\twriteRepresentationCacheV2,\n} from \"./context-budget-v2-representation-cache.ts\";\n\nconst DEFAULT_CACHE_TTL_MS = 5 * 60 * 1000;\n\nexport interface ContextBudgetSelectionCacheV2 {\n\treadonly provider?: ContextBudgetCacheProviderV2;\n\treadonly keyBase: ContextBudgetCacheKeyBaseV2;\n\treadonly nowEpochMs: number;\n\treadonly ttlMs: number;\n\treadonly telemetry: MutableTokenCacheTelemetryV2;\n}\n\nexport function createContextBudgetSelectionCacheV2(input: {\n\treadonly provider?: ContextBudgetCacheProviderV2;\n\treadonly keyBase: ContextBudgetCacheKeyBaseV2;\n\treadonly planCacheKey: string;\n\treadonly nowEpochMs?: number;\n\treadonly ttlMs?: number;\n}): ContextBudgetSelectionCacheV2 {\n\treturn {\n\t\tprovider: input.provider,\n\t\tkeyBase: input.keyBase,\n\t\tnowEpochMs: input.nowEpochMs ?? Date.now(),\n\t\tttlMs: input.ttlMs ?? DEFAULT_CACHE_TTL_MS,\n\t\ttelemetry: createMutableContextBudgetCacheTelemetryV2(input.planCacheKey),\n\t};\n}\n\nexport function readValidPlanCacheV2(input: {\n\treadonly cache: ContextBudgetSelectionCacheV2;\n\treadonly key: string;\n\treadonly planned: readonly PlannedItemV2[];\n\treadonly availableTokens: number;\n}): PromptContextBudgetPlanV2 | undefined {\n\tconst read = input.cache.provider?.readPlan(input.key);\n\tif (!read) return undefined;\n\tconst rejection = validateContextBudgetPlanCacheEntryV2({\n\t\tavailableTokens: input.availableTokens,\n\t\tcache: input.cache,\n\t\tentry: read.entry,\n\t\tplanned: input.planned,\n\t});\n\tif (rejection) {\n\t\tinput.cache.telemetry.planCache.rejectedReason = rejection;\n\t\treturn undefined;\n\t}\n\tinput.cache.telemetry.planCache.hit = true;\n\tinput.cache.telemetry.planCache.layer = read.layer;\n\treturn withCacheTelemetry(read.entry.plan, input.cache.telemetry);\n}\n\nexport function writePlanCacheV2(input: {\n\treadonly cache: ContextBudgetSelectionCacheV2;\n\treadonly key: string;\n\treadonly plan: PromptContextBudgetPlanV2;\n\treadonly planned: readonly PlannedItemV2[];\n}): void {\n\tif (!input.cache.provider || input.plan.emergency) return;\n\tif (input.plan.selectedRepresentations.some((representation) => representation.cache?.hit === true)) return;\n\tinput.cache.provider.writePlan({\n\t\tkey: input.key,\n\t\tentry: {\n\t\t\tcreatedAtEpochMs: input.cache.nowEpochMs,\n\t\t\tplan: input.plan,\n\t\t\tsourceHashes: sourceHashesByContextBudgetItemIdV2(input.planned),\n\t\t},\n\t});\n}\n"]}
1
+ {"version":3,"file":"context-budget-v2-cache.d.ts","sourceRoot":"","sources":["../../src/core/context-budget-v2-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AACrF,OAAO,EAEN,KAAK,4BAA4B,EAEjC,MAAM,wCAAwC,CAAC;AAKhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EAAE,4BAA4B,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAE5G,OAAO,EACN,+CAA+C,EAC/C,sDAAsD,EACtD,0DAA0D,EAC1D,0CAA0C,EAC1C,KAAK,2BAA2B,EAChC,oCAAoC,EACpC,qCAAqC,EACrC,+CAA+C,EAC/C,uCAAuC,EACvC,iCAAiC,EACjC,8CAA8C,EAC9C,2CAA2C,GAC3C,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,wCAAwC,EAAE,MAAM,uCAAuC,CAAC;AACjG,OAAO,EACN,qCAAqC,EACrC,KAAK,4BAA4B,EACjC,kBAAkB,GAClB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,gCAAgC,EAAE,MAAM,wCAAwC,CAAC;AAC1F,OAAO,EACN,0BAA0B,EAC1B,gCAAgC,EAChC,0BAA0B,GAC1B,MAAM,6CAA6C,CAAC;AAIrD,MAAM,WAAW,6BAA6B;IAC7C,QAAQ,CAAC,QAAQ,CAAC,EAAE,4BAA4B,CAAC;IACjD,QAAQ,CAAC,OAAO,EAAE,2BAA2B,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,4BAA4B,CAAC;CACjD;AAED,wBAAgB,mCAAmC,CAAC,KAAK,EAAE;IAC1D,QAAQ,CAAC,QAAQ,CAAC,EAAE,4BAA4B,CAAC;IACjD,QAAQ,CAAC,OAAO,EAAE,2BAA2B,CAAC;IAC9C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,6BAA6B,CAQhC;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC3C,QAAQ,CAAC,KAAK,EAAE,6BAA6B,CAAC;IAC9C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CACjC,GAAG,yBAAyB,GAAG,SAAS,CAkBxC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACvC,QAAQ,CAAC,KAAK,EAAE,6BAA6B,CAAC;IAC9C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;CAC3C,GAAG,IAAI,CAWP","sourcesContent":["import type { ContextBudgetCacheKeyBaseV2 } from \"./context-budget-v2-cache-keys.ts\";\nimport {\n\tcreateMutableContextBudgetCacheTelemetryV2,\n\ttype MutableTokenCacheTelemetryV2,\n\twithCacheTelemetry,\n} from \"./context-budget-v2-cache-telemetry.ts\";\nimport {\n\tsourceHashesByContextBudgetItemIdV2,\n\tvalidateContextBudgetPlanCacheEntryV2,\n} from \"./context-budget-v2-cache-validation.ts\";\nimport type { PlannedItemV2 } from \"./context-budget-v2-scoring.ts\";\nimport type { ContextBudgetCacheProviderV2, PromptContextBudgetPlanV2 } from \"./context-budget-v2-types.ts\";\n\nexport {\n\tbuildContextBudgetExactRepresentationCacheKeyV2,\n\tbuildContextBudgetMaterializedRepresentationCacheKeyV2,\n\tbuildContextBudgetMaterializedRepresentationCandidateKeyV2,\n\tbuildContextBudgetRepresentationCacheKeyV2,\n\ttype ContextBudgetCacheKeyBaseV2,\n\tcomputeContextBudgetOutputTextHashV2,\n\tcomputeContextBudgetQueryIntentHashV2,\n\tcomputeContextBudgetRepresentationFingerprintV2,\n\tcomputeContextBudgetTargetTokenBucketV2,\n\tcreateContextBudgetCacheKeyBaseV2,\n\tDEFAULT_MATERIALIZED_COMPRESSOR_POLICY_HASH_V2,\n\tDEFAULT_MATERIALIZED_QUALITY_POLICY_HASH_V2,\n} from \"./context-budget-v2-cache-keys.ts\";\nexport { createMemoryContextBudgetCacheProviderV2 } from \"./context-budget-v2-cache-provider.ts\";\nexport {\n\tfinalizeContextBudgetCacheTelemetryV2,\n\ttype MutableTokenCacheTelemetryV2,\n\twithCacheTelemetry,\n} from \"./context-budget-v2-cache-telemetry.ts\";\nexport { buildContextBudgetPlanCacheKeyV2 } from \"./context-budget-v2-plan-cache-keys.ts\";\nexport {\n\tapplyRepresentationCacheV2,\n\tisMaterializableRepresentationV2,\n\twriteRepresentationCacheV2,\n} from \"./context-budget-v2-representation-cache.ts\";\n\nconst DEFAULT_CACHE_TTL_MS = 5 * 60 * 1000;\n\nexport interface ContextBudgetSelectionCacheV2 {\n\treadonly provider?: ContextBudgetCacheProviderV2;\n\treadonly keyBase: ContextBudgetCacheKeyBaseV2;\n\treadonly nowEpochMs: number;\n\treadonly ttlMs: number;\n\treadonly telemetry: MutableTokenCacheTelemetryV2;\n}\n\nexport function createContextBudgetSelectionCacheV2(input: {\n\treadonly provider?: ContextBudgetCacheProviderV2;\n\treadonly keyBase: ContextBudgetCacheKeyBaseV2;\n\treadonly planCacheKey: string;\n\treadonly nowEpochMs?: number;\n\treadonly ttlMs?: number;\n}): ContextBudgetSelectionCacheV2 {\n\treturn {\n\t\tprovider: input.provider,\n\t\tkeyBase: input.keyBase,\n\t\tnowEpochMs: input.nowEpochMs ?? Date.now(),\n\t\tttlMs: input.ttlMs ?? DEFAULT_CACHE_TTL_MS,\n\t\ttelemetry: createMutableContextBudgetCacheTelemetryV2(input.planCacheKey),\n\t};\n}\n\nexport function readValidPlanCacheV2(input: {\n\treadonly cache: ContextBudgetSelectionCacheV2;\n\treadonly key: string;\n\treadonly planned: readonly PlannedItemV2[];\n\treadonly availableTokens: number;\n}): PromptContextBudgetPlanV2 | undefined {\n\tconst read = input.cache.provider?.readPlan(input.key);\n\tif (!read) return undefined;\n\tconst rejection = validateContextBudgetPlanCacheEntryV2({\n\t\tavailableTokens: input.availableTokens,\n\t\tcache: input.cache,\n\t\tentry: read.entry,\n\t\tplanned: input.planned,\n\t});\n\tif (rejection) {\n\t\tinput.cache.telemetry.planCache.rejectedReason = rejection;\n\t\tif (rejection === \"stale\") input.cache.provider?.deletePlan?.(input.key);\n\t\treturn undefined;\n\t}\n\tinput.cache.telemetry.planCache.hit = true;\n\tinput.cache.telemetry.planCache.layer = read.layer;\n\tinput.cache.telemetry.tokens.savedByCache = read.entry.plan.rawTokens;\n\treturn withCacheTelemetry(read.entry.plan, input.cache.telemetry);\n}\n\nexport function writePlanCacheV2(input: {\n\treadonly cache: ContextBudgetSelectionCacheV2;\n\treadonly key: string;\n\treadonly plan: PromptContextBudgetPlanV2;\n\treadonly planned: readonly PlannedItemV2[];\n}): void {\n\tif (!input.cache.provider || input.plan.emergency) return;\n\tif (input.plan.selectedRepresentations.some((representation) => representation.cache?.hit === true)) return;\n\tinput.cache.provider.writePlan({\n\t\tkey: input.key,\n\t\tentry: {\n\t\t\tcreatedAtEpochMs: input.cache.nowEpochMs,\n\t\t\tplan: input.plan,\n\t\t\tsourceHashes: sourceHashesByContextBudgetItemIdV2(input.planned),\n\t\t},\n\t});\n}\n"]}
@@ -27,10 +27,13 @@ export function readValidPlanCacheV2(input) {
27
27
  });
28
28
  if (rejection) {
29
29
  input.cache.telemetry.planCache.rejectedReason = rejection;
30
+ if (rejection === "stale")
31
+ input.cache.provider?.deletePlan?.(input.key);
30
32
  return undefined;
31
33
  }
32
34
  input.cache.telemetry.planCache.hit = true;
33
35
  input.cache.telemetry.planCache.layer = read.layer;
36
+ input.cache.telemetry.tokens.savedByCache = read.entry.plan.rawTokens;
34
37
  return withCacheTelemetry(read.entry.plan, input.cache.telemetry);
35
38
  }
36
39
  export function writePlanCacheV2(input) {
@@ -1 +1 @@
1
- {"version":3,"file":"context-budget-v2-cache.js","sourceRoot":"","sources":["../../src/core/context-budget-v2-cache.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ContextBudgetCacheKeyBaseV2 } from \"./context-budget-v2-cache-keys.ts\";\nimport {\n\tcreateMutableContextBudgetCacheTelemetryV2,\n\ttype MutableTokenCacheTelemetryV2,\n\twithCacheTelemetry,\n} from \"./context-budget-v2-cache-telemetry.ts\";\nimport {\n\tsourceHashesByContextBudgetItemIdV2,\n\tvalidateContextBudgetPlanCacheEntryV2,\n} from \"./context-budget-v2-cache-validation.ts\";\nimport type { PlannedItemV2 } from \"./context-budget-v2-scoring.ts\";\nimport type { ContextBudgetCacheProviderV2, PromptContextBudgetPlanV2 } from \"./context-budget-v2-types.ts\";\n\nexport {\n\tbuildContextBudgetExactRepresentationCacheKeyV2,\n\tbuildContextBudgetMaterializedRepresentationCacheKeyV2,\n\tbuildContextBudgetMaterializedRepresentationCandidateKeyV2,\n\tbuildContextBudgetRepresentationCacheKeyV2,\n\ttype ContextBudgetCacheKeyBaseV2,\n\tcomputeContextBudgetOutputTextHashV2,\n\tcomputeContextBudgetQueryIntentHashV2,\n\tcomputeContextBudgetRepresentationFingerprintV2,\n\tcomputeContextBudgetTargetTokenBucketV2,\n\tcreateContextBudgetCacheKeyBaseV2,\n\tDEFAULT_MATERIALIZED_COMPRESSOR_POLICY_HASH_V2,\n\tDEFAULT_MATERIALIZED_QUALITY_POLICY_HASH_V2,\n} from \"./context-budget-v2-cache-keys.ts\";\nexport { createMemoryContextBudgetCacheProviderV2 } from \"./context-budget-v2-cache-provider.ts\";\nexport {\n\tfinalizeContextBudgetCacheTelemetryV2,\n\ttype MutableTokenCacheTelemetryV2,\n\twithCacheTelemetry,\n} from \"./context-budget-v2-cache-telemetry.ts\";\nexport { buildContextBudgetPlanCacheKeyV2 } from \"./context-budget-v2-plan-cache-keys.ts\";\nexport {\n\tapplyRepresentationCacheV2,\n\tisMaterializableRepresentationV2,\n\twriteRepresentationCacheV2,\n} from \"./context-budget-v2-representation-cache.ts\";\n\nconst DEFAULT_CACHE_TTL_MS = 5 * 60 * 1000;\n\nexport interface ContextBudgetSelectionCacheV2 {\n\treadonly provider?: ContextBudgetCacheProviderV2;\n\treadonly keyBase: ContextBudgetCacheKeyBaseV2;\n\treadonly nowEpochMs: number;\n\treadonly ttlMs: number;\n\treadonly telemetry: MutableTokenCacheTelemetryV2;\n}\n\nexport function createContextBudgetSelectionCacheV2(input: {\n\treadonly provider?: ContextBudgetCacheProviderV2;\n\treadonly keyBase: ContextBudgetCacheKeyBaseV2;\n\treadonly planCacheKey: string;\n\treadonly nowEpochMs?: number;\n\treadonly ttlMs?: number;\n}): ContextBudgetSelectionCacheV2 {\n\treturn {\n\t\tprovider: input.provider,\n\t\tkeyBase: input.keyBase,\n\t\tnowEpochMs: input.nowEpochMs ?? Date.now(),\n\t\tttlMs: input.ttlMs ?? DEFAULT_CACHE_TTL_MS,\n\t\ttelemetry: createMutableContextBudgetCacheTelemetryV2(input.planCacheKey),\n\t};\n}\n\nexport function readValidPlanCacheV2(input: {\n\treadonly cache: ContextBudgetSelectionCacheV2;\n\treadonly key: string;\n\treadonly planned: readonly PlannedItemV2[];\n\treadonly availableTokens: number;\n}): PromptContextBudgetPlanV2 | undefined {\n\tconst read = input.cache.provider?.readPlan(input.key);\n\tif (!read) return undefined;\n\tconst rejection = validateContextBudgetPlanCacheEntryV2({\n\t\tavailableTokens: input.availableTokens,\n\t\tcache: input.cache,\n\t\tentry: read.entry,\n\t\tplanned: input.planned,\n\t});\n\tif (rejection) {\n\t\tinput.cache.telemetry.planCache.rejectedReason = rejection;\n\t\treturn undefined;\n\t}\n\tinput.cache.telemetry.planCache.hit = true;\n\tinput.cache.telemetry.planCache.layer = read.layer;\n\treturn withCacheTelemetry(read.entry.plan, input.cache.telemetry);\n}\n\nexport function writePlanCacheV2(input: {\n\treadonly cache: ContextBudgetSelectionCacheV2;\n\treadonly key: string;\n\treadonly plan: PromptContextBudgetPlanV2;\n\treadonly planned: readonly PlannedItemV2[];\n}): void {\n\tif (!input.cache.provider || input.plan.emergency) return;\n\tif (input.plan.selectedRepresentations.some((representation) => representation.cache?.hit === true)) return;\n\tinput.cache.provider.writePlan({\n\t\tkey: input.key,\n\t\tentry: {\n\t\t\tcreatedAtEpochMs: input.cache.nowEpochMs,\n\t\t\tplan: input.plan,\n\t\t\tsourceHashes: sourceHashesByContextBudgetItemIdV2(input.planned),\n\t\t},\n\t});\n}\n"]}
1
+ {"version":3,"file":"context-budget-v2-cache.js","sourceRoot":"","sources":["../../src/core/context-budget-v2-cache.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ContextBudgetCacheKeyBaseV2 } from \"./context-budget-v2-cache-keys.ts\";\nimport {\n\tcreateMutableContextBudgetCacheTelemetryV2,\n\ttype MutableTokenCacheTelemetryV2,\n\twithCacheTelemetry,\n} from \"./context-budget-v2-cache-telemetry.ts\";\nimport {\n\tsourceHashesByContextBudgetItemIdV2,\n\tvalidateContextBudgetPlanCacheEntryV2,\n} from \"./context-budget-v2-cache-validation.ts\";\nimport type { PlannedItemV2 } from \"./context-budget-v2-scoring.ts\";\nimport type { ContextBudgetCacheProviderV2, PromptContextBudgetPlanV2 } from \"./context-budget-v2-types.ts\";\n\nexport {\n\tbuildContextBudgetExactRepresentationCacheKeyV2,\n\tbuildContextBudgetMaterializedRepresentationCacheKeyV2,\n\tbuildContextBudgetMaterializedRepresentationCandidateKeyV2,\n\tbuildContextBudgetRepresentationCacheKeyV2,\n\ttype ContextBudgetCacheKeyBaseV2,\n\tcomputeContextBudgetOutputTextHashV2,\n\tcomputeContextBudgetQueryIntentHashV2,\n\tcomputeContextBudgetRepresentationFingerprintV2,\n\tcomputeContextBudgetTargetTokenBucketV2,\n\tcreateContextBudgetCacheKeyBaseV2,\n\tDEFAULT_MATERIALIZED_COMPRESSOR_POLICY_HASH_V2,\n\tDEFAULT_MATERIALIZED_QUALITY_POLICY_HASH_V2,\n} from \"./context-budget-v2-cache-keys.ts\";\nexport { createMemoryContextBudgetCacheProviderV2 } from \"./context-budget-v2-cache-provider.ts\";\nexport {\n\tfinalizeContextBudgetCacheTelemetryV2,\n\ttype MutableTokenCacheTelemetryV2,\n\twithCacheTelemetry,\n} from \"./context-budget-v2-cache-telemetry.ts\";\nexport { buildContextBudgetPlanCacheKeyV2 } from \"./context-budget-v2-plan-cache-keys.ts\";\nexport {\n\tapplyRepresentationCacheV2,\n\tisMaterializableRepresentationV2,\n\twriteRepresentationCacheV2,\n} from \"./context-budget-v2-representation-cache.ts\";\n\nconst DEFAULT_CACHE_TTL_MS = 5 * 60 * 1000;\n\nexport interface ContextBudgetSelectionCacheV2 {\n\treadonly provider?: ContextBudgetCacheProviderV2;\n\treadonly keyBase: ContextBudgetCacheKeyBaseV2;\n\treadonly nowEpochMs: number;\n\treadonly ttlMs: number;\n\treadonly telemetry: MutableTokenCacheTelemetryV2;\n}\n\nexport function createContextBudgetSelectionCacheV2(input: {\n\treadonly provider?: ContextBudgetCacheProviderV2;\n\treadonly keyBase: ContextBudgetCacheKeyBaseV2;\n\treadonly planCacheKey: string;\n\treadonly nowEpochMs?: number;\n\treadonly ttlMs?: number;\n}): ContextBudgetSelectionCacheV2 {\n\treturn {\n\t\tprovider: input.provider,\n\t\tkeyBase: input.keyBase,\n\t\tnowEpochMs: input.nowEpochMs ?? Date.now(),\n\t\tttlMs: input.ttlMs ?? DEFAULT_CACHE_TTL_MS,\n\t\ttelemetry: createMutableContextBudgetCacheTelemetryV2(input.planCacheKey),\n\t};\n}\n\nexport function readValidPlanCacheV2(input: {\n\treadonly cache: ContextBudgetSelectionCacheV2;\n\treadonly key: string;\n\treadonly planned: readonly PlannedItemV2[];\n\treadonly availableTokens: number;\n}): PromptContextBudgetPlanV2 | undefined {\n\tconst read = input.cache.provider?.readPlan(input.key);\n\tif (!read) return undefined;\n\tconst rejection = validateContextBudgetPlanCacheEntryV2({\n\t\tavailableTokens: input.availableTokens,\n\t\tcache: input.cache,\n\t\tentry: read.entry,\n\t\tplanned: input.planned,\n\t});\n\tif (rejection) {\n\t\tinput.cache.telemetry.planCache.rejectedReason = rejection;\n\t\tif (rejection === \"stale\") input.cache.provider?.deletePlan?.(input.key);\n\t\treturn undefined;\n\t}\n\tinput.cache.telemetry.planCache.hit = true;\n\tinput.cache.telemetry.planCache.layer = read.layer;\n\tinput.cache.telemetry.tokens.savedByCache = read.entry.plan.rawTokens;\n\treturn withCacheTelemetry(read.entry.plan, input.cache.telemetry);\n}\n\nexport function writePlanCacheV2(input: {\n\treadonly cache: ContextBudgetSelectionCacheV2;\n\treadonly key: string;\n\treadonly plan: PromptContextBudgetPlanV2;\n\treadonly planned: readonly PlannedItemV2[];\n}): void {\n\tif (!input.cache.provider || input.plan.emergency) return;\n\tif (input.plan.selectedRepresentations.some((representation) => representation.cache?.hit === true)) return;\n\tinput.cache.provider.writePlan({\n\t\tkey: input.key,\n\t\tentry: {\n\t\t\tcreatedAtEpochMs: input.cache.nowEpochMs,\n\t\t\tplan: input.plan,\n\t\t\tsourceHashes: sourceHashesByContextBudgetItemIdV2(input.planned),\n\t\t},\n\t});\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"context-budget-v2-plan-cache-keys.d.ts","sourceRoot":"","sources":["../../src/core/context-budget-v2-plan-cache-keys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAE5E,OAAO,EACN,KAAK,2BAA2B,EAGhC,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAEvE,wBAAgB,gCAAgC,CAAC,KAAK,EAAE;IACvD,QAAQ,CAAC,OAAO,EAAE,2BAA2B,CAAC;IAC9C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAClE,QAAQ,CAAC,aAAa,EAAE,uBAAuB,CAAC;CAChD,GAAG,MAAM,CA8CT","sourcesContent":["import type { HeadroomQualityPolicyV2 } from \"./context-budget-headroom.ts\";\nimport { sha256Canonical } from \"./context-budget-v2-cache-hash.ts\";\nimport {\n\ttype ContextBudgetCacheKeyBaseV2,\n\tcomputeContextBudgetRepresentationFingerprintV2,\n\tfingerprintSourceRef,\n} from \"./context-budget-v2-cache-keys.ts\";\nimport type { PlannedItemV2 } from \"./context-budget-v2-scoring.ts\";\nimport type { TierBudgetPolicyV2 } from \"./context-budget-v2-types.ts\";\n\nexport function buildContextBudgetPlanCacheKeyV2(input: {\n\treadonly keyBase: ContextBudgetCacheKeyBaseV2;\n\treadonly promptHash?: string;\n\treadonly maxTokens: number;\n\treadonly responseReserveTokens: number;\n\treadonly safetyMarginTokens: number;\n\treadonly availableTokens: number;\n\treadonly planned: readonly PlannedItemV2[];\n\treadonly tierPolicy: Readonly<Record<string, TierBudgetPolicyV2>>;\n\treadonly qualityPolicy: HeadroomQualityPolicyV2;\n}): string {\n\treturn `context-plan:${sha256Canonical({\n\t\tavailableTokens: input.availableTokens,\n\t\tbudgetBucket: input.keyBase.budgetBucket,\n\t\titems: input.planned\n\t\t\t.map((planned) => ({\n\t\t\t\tageTurns: planned.item.ageTurns ?? null,\n\t\t\t\tbaseScore: planned.baseScore,\n\t\t\t\teffectiveScore: planned.effectiveScore,\n\t\t\t\tevidenceKind: planned.item.evidenceKind ?? null,\n\t\t\t\tevidenceValue: planned.item.evidenceValue ?? null,\n\t\t\t\tid: planned.item.id,\n\t\t\t\tpinReason: planned.item.pinReason ?? null,\n\t\t\t\tpriority: planned.item.priority,\n\t\t\t\trecency: planned.item.recency ?? null,\n\t\t\t\tredundancyKey: planned.item.redundancyKey ?? null,\n\t\t\t\tredundancyPenalty: planned.redundancyPenalty,\n\t\t\t\trelevance: planned.item.relevance ?? null,\n\t\t\t\trepresentations: (planned.item.representations ?? [])\n\t\t\t\t\t.map((candidate) => ({\n\t\t\t\t\t\tfingerprint: computeContextBudgetRepresentationFingerprintV2(candidate),\n\t\t\t\t\t\tkind: candidate.kind,\n\t\t\t\t\t}))\n\t\t\t\t\t.sort((a, b) => a.kind.localeCompare(b.kind) || a.fingerprint.localeCompare(b.fingerprint)),\n\t\t\t\trequired: planned.item.required === true,\n\t\t\t\tsourceRef: fingerprintSourceRef(planned.item.sourceRef),\n\t\t\t\tsourceHash: planned.contentHash,\n\t\t\t\ttier: planned.item.tier,\n\t\t\t\ttokenEstimate: planned.item.tokenEstimate ?? null,\n\t\t\t}))\n\t\t\t.sort((a, b) => a.id.localeCompare(b.id)),\n\t\tmaxTokens: input.maxTokens,\n\t\tinvalidationSnapshotHash: input.keyBase.invalidationSnapshotHash ?? \"none\",\n\t\tmodelId: input.keyBase.modelId,\n\t\tnamespace: input.keyBase.namespace,\n\t\tpolicyVersion: input.keyBase.policyVersion,\n\t\tpromptHash: input.promptHash ?? null,\n\t\tqueryIntentHash: input.keyBase.queryIntentHash,\n\t\tredactionPolicyHash: input.keyBase.redactionPolicyHash,\n\t\tresponseReserveTokens: input.responseReserveTokens,\n\t\tsafetyMarginTokens: input.safetyMarginTokens,\n\t\tsafetyProfileHash: input.keyBase.safetyProfileHash,\n\t\ttierPolicy: input.tierPolicy,\n\t\tqualityPolicy: input.qualityPolicy,\n\t\ttokenizerId: input.keyBase.tokenizerId,\n\t})}`;\n}\n"]}
1
+ {"version":3,"file":"context-budget-v2-plan-cache-keys.d.ts","sourceRoot":"","sources":["../../src/core/context-budget-v2-plan-cache-keys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAE5E,OAAO,EACN,KAAK,2BAA2B,EAGhC,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAkCvE,wBAAgB,gCAAgC,CAAC,KAAK,EAAE;IACvD,QAAQ,CAAC,OAAO,EAAE,2BAA2B,CAAC;IAC9C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAClE,QAAQ,CAAC,aAAa,EAAE,uBAAuB,CAAC;CAChD,GAAG,MAAM,CA8CT","sourcesContent":["import type { HeadroomQualityPolicyV2 } from \"./context-budget-headroom.ts\";\nimport { sha256Canonical } from \"./context-budget-v2-cache-hash.ts\";\nimport {\n\ttype ContextBudgetCacheKeyBaseV2,\n\tcomputeContextBudgetRepresentationFingerprintV2,\n\tfingerprintSourceRef,\n} from \"./context-budget-v2-cache-keys.ts\";\nimport type { PlannedItemV2 } from \"./context-budget-v2-scoring.ts\";\nimport type { TierBudgetPolicyV2 } from \"./context-budget-v2-types.ts\";\n\n/**\n * Cache-key-only quantization for signals that legitimately drift every turn.\n *\n * `ageTurns`, `baseScore`, `effectiveScore`, `redundancyPenalty`, and an explicit `recency`\n * override are recomputed from scratch on every planning pass (recency decays continuously via\n * `deriveRecency()`'s `exp(-ageTurns / halfLife)`), so hashing their raw values means the plan\n * cache key changes on *every single turn* even when the resulting selection would be identical\n * -- the cache can structurally never hit past the first call in a session. Bucketing/rounding\n * them here does not touch actual selection logic (compareOptionalForSelection, tier allocation,\n * etc. still read the full-precision fields off `planned` directly); it only changes what counts\n * as \"the same plan\" for cache-lookup purposes. `ageTurns` buckets are log2-spaced so a bucket\n * boundary corresponds to roughly one additional recency half-life having elapsed -- the point\n * at which the decayed score has plausibly moved enough to change ranking/selection -- rather\n * than an arbitrary fixed window.\n */\nfunction bucketAgeTurnsForCacheKeyV2(ageTurns: number | null | undefined): number | null {\n\tif (ageTurns === null || ageTurns === undefined || !Number.isFinite(ageTurns)) return null;\n\tif (ageTurns <= 0) return 0;\n\treturn Math.floor(Math.log2(ageTurns + 1));\n}\n\nfunction roundScoreForCacheKeyV2(score: number | null | undefined): number | null {\n\tif (score === null || score === undefined || Number.isNaN(score)) return null;\n\tif (!Number.isFinite(score)) return score; // preserve +/-Infinity (hard-pinned items)\n\treturn Math.round(score);\n}\n\nfunction roundUnitIntervalForCacheKeyV2(value: number | null | undefined): number | null {\n\tif (value === null || value === undefined || !Number.isFinite(value)) return null;\n\treturn Math.round(value * 10) / 10;\n}\n\nexport function buildContextBudgetPlanCacheKeyV2(input: {\n\treadonly keyBase: ContextBudgetCacheKeyBaseV2;\n\treadonly promptHash?: string;\n\treadonly maxTokens: number;\n\treadonly responseReserveTokens: number;\n\treadonly safetyMarginTokens: number;\n\treadonly availableTokens: number;\n\treadonly planned: readonly PlannedItemV2[];\n\treadonly tierPolicy: Readonly<Record<string, TierBudgetPolicyV2>>;\n\treadonly qualityPolicy: HeadroomQualityPolicyV2;\n}): string {\n\treturn `context-plan:${sha256Canonical({\n\t\tavailableTokens: input.availableTokens,\n\t\tbudgetBucket: input.keyBase.budgetBucket,\n\t\titems: input.planned\n\t\t\t.map((planned) => ({\n\t\t\t\tageTurns: bucketAgeTurnsForCacheKeyV2(planned.item.ageTurns),\n\t\t\t\tbaseScore: roundScoreForCacheKeyV2(planned.baseScore),\n\t\t\t\teffectiveScore: roundScoreForCacheKeyV2(planned.effectiveScore),\n\t\t\t\tevidenceKind: planned.item.evidenceKind ?? null,\n\t\t\t\tevidenceValue: planned.item.evidenceValue ?? null,\n\t\t\t\tid: planned.item.id,\n\t\t\t\tpinReason: planned.item.pinReason ?? null,\n\t\t\t\tpriority: planned.item.priority,\n\t\t\t\trecency: roundUnitIntervalForCacheKeyV2(planned.item.recency),\n\t\t\t\tredundancyKey: planned.item.redundancyKey ?? null,\n\t\t\t\tredundancyPenalty: roundScoreForCacheKeyV2(planned.redundancyPenalty),\n\t\t\t\trelevance: planned.item.relevance ?? null,\n\t\t\t\trepresentations: (planned.item.representations ?? [])\n\t\t\t\t\t.map((candidate) => ({\n\t\t\t\t\t\tfingerprint: computeContextBudgetRepresentationFingerprintV2(candidate),\n\t\t\t\t\t\tkind: candidate.kind,\n\t\t\t\t\t}))\n\t\t\t\t\t.sort((a, b) => a.kind.localeCompare(b.kind) || a.fingerprint.localeCompare(b.fingerprint)),\n\t\t\t\trequired: planned.item.required === true,\n\t\t\t\tsourceRef: fingerprintSourceRef(planned.item.sourceRef),\n\t\t\t\tsourceHash: planned.contentHash,\n\t\t\t\ttier: planned.item.tier,\n\t\t\t\ttokenEstimate: planned.item.tokenEstimate ?? null,\n\t\t\t}))\n\t\t\t.sort((a, b) => a.id.localeCompare(b.id)),\n\t\tmaxTokens: input.maxTokens,\n\t\tinvalidationSnapshotHash: input.keyBase.invalidationSnapshotHash ?? \"none\",\n\t\tmodelId: input.keyBase.modelId,\n\t\tnamespace: input.keyBase.namespace,\n\t\tpolicyVersion: input.keyBase.policyVersion,\n\t\tpromptHash: input.promptHash ?? null,\n\t\tqueryIntentHash: input.keyBase.queryIntentHash,\n\t\tredactionPolicyHash: input.keyBase.redactionPolicyHash,\n\t\tresponseReserveTokens: input.responseReserveTokens,\n\t\tsafetyMarginTokens: input.safetyMarginTokens,\n\t\tsafetyProfileHash: input.keyBase.safetyProfileHash,\n\t\ttierPolicy: input.tierPolicy,\n\t\tqualityPolicy: input.qualityPolicy,\n\t\ttokenizerId: input.keyBase.tokenizerId,\n\t})}`;\n}\n"]}
@@ -1,22 +1,56 @@
1
1
  import { sha256Canonical } from "./context-budget-v2-cache-hash.js";
2
2
  import { computeContextBudgetRepresentationFingerprintV2, fingerprintSourceRef, } from "./context-budget-v2-cache-keys.js";
3
+ /**
4
+ * Cache-key-only quantization for signals that legitimately drift every turn.
5
+ *
6
+ * `ageTurns`, `baseScore`, `effectiveScore`, `redundancyPenalty`, and an explicit `recency`
7
+ * override are recomputed from scratch on every planning pass (recency decays continuously via
8
+ * `deriveRecency()`'s `exp(-ageTurns / halfLife)`), so hashing their raw values means the plan
9
+ * cache key changes on *every single turn* even when the resulting selection would be identical
10
+ * -- the cache can structurally never hit past the first call in a session. Bucketing/rounding
11
+ * them here does not touch actual selection logic (compareOptionalForSelection, tier allocation,
12
+ * etc. still read the full-precision fields off `planned` directly); it only changes what counts
13
+ * as "the same plan" for cache-lookup purposes. `ageTurns` buckets are log2-spaced so a bucket
14
+ * boundary corresponds to roughly one additional recency half-life having elapsed -- the point
15
+ * at which the decayed score has plausibly moved enough to change ranking/selection -- rather
16
+ * than an arbitrary fixed window.
17
+ */
18
+ function bucketAgeTurnsForCacheKeyV2(ageTurns) {
19
+ if (ageTurns === null || ageTurns === undefined || !Number.isFinite(ageTurns))
20
+ return null;
21
+ if (ageTurns <= 0)
22
+ return 0;
23
+ return Math.floor(Math.log2(ageTurns + 1));
24
+ }
25
+ function roundScoreForCacheKeyV2(score) {
26
+ if (score === null || score === undefined || Number.isNaN(score))
27
+ return null;
28
+ if (!Number.isFinite(score))
29
+ return score; // preserve +/-Infinity (hard-pinned items)
30
+ return Math.round(score);
31
+ }
32
+ function roundUnitIntervalForCacheKeyV2(value) {
33
+ if (value === null || value === undefined || !Number.isFinite(value))
34
+ return null;
35
+ return Math.round(value * 10) / 10;
36
+ }
3
37
  export function buildContextBudgetPlanCacheKeyV2(input) {
4
38
  return `context-plan:${sha256Canonical({
5
39
  availableTokens: input.availableTokens,
6
40
  budgetBucket: input.keyBase.budgetBucket,
7
41
  items: input.planned
8
42
  .map((planned) => ({
9
- ageTurns: planned.item.ageTurns ?? null,
10
- baseScore: planned.baseScore,
11
- effectiveScore: planned.effectiveScore,
43
+ ageTurns: bucketAgeTurnsForCacheKeyV2(planned.item.ageTurns),
44
+ baseScore: roundScoreForCacheKeyV2(planned.baseScore),
45
+ effectiveScore: roundScoreForCacheKeyV2(planned.effectiveScore),
12
46
  evidenceKind: planned.item.evidenceKind ?? null,
13
47
  evidenceValue: planned.item.evidenceValue ?? null,
14
48
  id: planned.item.id,
15
49
  pinReason: planned.item.pinReason ?? null,
16
50
  priority: planned.item.priority,
17
- recency: planned.item.recency ?? null,
51
+ recency: roundUnitIntervalForCacheKeyV2(planned.item.recency),
18
52
  redundancyKey: planned.item.redundancyKey ?? null,
19
- redundancyPenalty: planned.redundancyPenalty,
53
+ redundancyPenalty: roundScoreForCacheKeyV2(planned.redundancyPenalty),
20
54
  relevance: planned.item.relevance ?? null,
21
55
  representations: (planned.item.representations ?? [])
22
56
  .map((candidate) => ({
@@ -1 +1 @@
1
- {"version":3,"file":"context-budget-v2-plan-cache-keys.js","sourceRoot":"","sources":["../../src/core/context-budget-v2-plan-cache-keys.ts"],"names":[],"mappings":"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","sourcesContent":["import type { HeadroomQualityPolicyV2 } from \"./context-budget-headroom.ts\";\nimport { sha256Canonical } from \"./context-budget-v2-cache-hash.ts\";\nimport {\n\ttype ContextBudgetCacheKeyBaseV2,\n\tcomputeContextBudgetRepresentationFingerprintV2,\n\tfingerprintSourceRef,\n} from \"./context-budget-v2-cache-keys.ts\";\nimport type { PlannedItemV2 } from \"./context-budget-v2-scoring.ts\";\nimport type { TierBudgetPolicyV2 } from \"./context-budget-v2-types.ts\";\n\nexport function buildContextBudgetPlanCacheKeyV2(input: {\n\treadonly keyBase: ContextBudgetCacheKeyBaseV2;\n\treadonly promptHash?: string;\n\treadonly maxTokens: number;\n\treadonly responseReserveTokens: number;\n\treadonly safetyMarginTokens: number;\n\treadonly availableTokens: number;\n\treadonly planned: readonly PlannedItemV2[];\n\treadonly tierPolicy: Readonly<Record<string, TierBudgetPolicyV2>>;\n\treadonly qualityPolicy: HeadroomQualityPolicyV2;\n}): string {\n\treturn `context-plan:${sha256Canonical({\n\t\tavailableTokens: input.availableTokens,\n\t\tbudgetBucket: input.keyBase.budgetBucket,\n\t\titems: input.planned\n\t\t\t.map((planned) => ({\n\t\t\t\tageTurns: planned.item.ageTurns ?? null,\n\t\t\t\tbaseScore: planned.baseScore,\n\t\t\t\teffectiveScore: planned.effectiveScore,\n\t\t\t\tevidenceKind: planned.item.evidenceKind ?? null,\n\t\t\t\tevidenceValue: planned.item.evidenceValue ?? null,\n\t\t\t\tid: planned.item.id,\n\t\t\t\tpinReason: planned.item.pinReason ?? null,\n\t\t\t\tpriority: planned.item.priority,\n\t\t\t\trecency: planned.item.recency ?? null,\n\t\t\t\tredundancyKey: planned.item.redundancyKey ?? null,\n\t\t\t\tredundancyPenalty: planned.redundancyPenalty,\n\t\t\t\trelevance: planned.item.relevance ?? null,\n\t\t\t\trepresentations: (planned.item.representations ?? [])\n\t\t\t\t\t.map((candidate) => ({\n\t\t\t\t\t\tfingerprint: computeContextBudgetRepresentationFingerprintV2(candidate),\n\t\t\t\t\t\tkind: candidate.kind,\n\t\t\t\t\t}))\n\t\t\t\t\t.sort((a, b) => a.kind.localeCompare(b.kind) || a.fingerprint.localeCompare(b.fingerprint)),\n\t\t\t\trequired: planned.item.required === true,\n\t\t\t\tsourceRef: fingerprintSourceRef(planned.item.sourceRef),\n\t\t\t\tsourceHash: planned.contentHash,\n\t\t\t\ttier: planned.item.tier,\n\t\t\t\ttokenEstimate: planned.item.tokenEstimate ?? null,\n\t\t\t}))\n\t\t\t.sort((a, b) => a.id.localeCompare(b.id)),\n\t\tmaxTokens: input.maxTokens,\n\t\tinvalidationSnapshotHash: input.keyBase.invalidationSnapshotHash ?? \"none\",\n\t\tmodelId: input.keyBase.modelId,\n\t\tnamespace: input.keyBase.namespace,\n\t\tpolicyVersion: input.keyBase.policyVersion,\n\t\tpromptHash: input.promptHash ?? null,\n\t\tqueryIntentHash: input.keyBase.queryIntentHash,\n\t\tredactionPolicyHash: input.keyBase.redactionPolicyHash,\n\t\tresponseReserveTokens: input.responseReserveTokens,\n\t\tsafetyMarginTokens: input.safetyMarginTokens,\n\t\tsafetyProfileHash: input.keyBase.safetyProfileHash,\n\t\ttierPolicy: input.tierPolicy,\n\t\tqualityPolicy: input.qualityPolicy,\n\t\ttokenizerId: input.keyBase.tokenizerId,\n\t})}`;\n}\n"]}
1
+ {"version":3,"file":"context-budget-v2-plan-cache-keys.js","sourceRoot":"","sources":["../../src/core/context-budget-v2-plan-cache-keys.ts"],"names":[],"mappings":"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","sourcesContent":["import type { HeadroomQualityPolicyV2 } from \"./context-budget-headroom.ts\";\nimport { sha256Canonical } from \"./context-budget-v2-cache-hash.ts\";\nimport {\n\ttype ContextBudgetCacheKeyBaseV2,\n\tcomputeContextBudgetRepresentationFingerprintV2,\n\tfingerprintSourceRef,\n} from \"./context-budget-v2-cache-keys.ts\";\nimport type { PlannedItemV2 } from \"./context-budget-v2-scoring.ts\";\nimport type { TierBudgetPolicyV2 } from \"./context-budget-v2-types.ts\";\n\n/**\n * Cache-key-only quantization for signals that legitimately drift every turn.\n *\n * `ageTurns`, `baseScore`, `effectiveScore`, `redundancyPenalty`, and an explicit `recency`\n * override are recomputed from scratch on every planning pass (recency decays continuously via\n * `deriveRecency()`'s `exp(-ageTurns / halfLife)`), so hashing their raw values means the plan\n * cache key changes on *every single turn* even when the resulting selection would be identical\n * -- the cache can structurally never hit past the first call in a session. Bucketing/rounding\n * them here does not touch actual selection logic (compareOptionalForSelection, tier allocation,\n * etc. still read the full-precision fields off `planned` directly); it only changes what counts\n * as \"the same plan\" for cache-lookup purposes. `ageTurns` buckets are log2-spaced so a bucket\n * boundary corresponds to roughly one additional recency half-life having elapsed -- the point\n * at which the decayed score has plausibly moved enough to change ranking/selection -- rather\n * than an arbitrary fixed window.\n */\nfunction bucketAgeTurnsForCacheKeyV2(ageTurns: number | null | undefined): number | null {\n\tif (ageTurns === null || ageTurns === undefined || !Number.isFinite(ageTurns)) return null;\n\tif (ageTurns <= 0) return 0;\n\treturn Math.floor(Math.log2(ageTurns + 1));\n}\n\nfunction roundScoreForCacheKeyV2(score: number | null | undefined): number | null {\n\tif (score === null || score === undefined || Number.isNaN(score)) return null;\n\tif (!Number.isFinite(score)) return score; // preserve +/-Infinity (hard-pinned items)\n\treturn Math.round(score);\n}\n\nfunction roundUnitIntervalForCacheKeyV2(value: number | null | undefined): number | null {\n\tif (value === null || value === undefined || !Number.isFinite(value)) return null;\n\treturn Math.round(value * 10) / 10;\n}\n\nexport function buildContextBudgetPlanCacheKeyV2(input: {\n\treadonly keyBase: ContextBudgetCacheKeyBaseV2;\n\treadonly promptHash?: string;\n\treadonly maxTokens: number;\n\treadonly responseReserveTokens: number;\n\treadonly safetyMarginTokens: number;\n\treadonly availableTokens: number;\n\treadonly planned: readonly PlannedItemV2[];\n\treadonly tierPolicy: Readonly<Record<string, TierBudgetPolicyV2>>;\n\treadonly qualityPolicy: HeadroomQualityPolicyV2;\n}): string {\n\treturn `context-plan:${sha256Canonical({\n\t\tavailableTokens: input.availableTokens,\n\t\tbudgetBucket: input.keyBase.budgetBucket,\n\t\titems: input.planned\n\t\t\t.map((planned) => ({\n\t\t\t\tageTurns: bucketAgeTurnsForCacheKeyV2(planned.item.ageTurns),\n\t\t\t\tbaseScore: roundScoreForCacheKeyV2(planned.baseScore),\n\t\t\t\teffectiveScore: roundScoreForCacheKeyV2(planned.effectiveScore),\n\t\t\t\tevidenceKind: planned.item.evidenceKind ?? null,\n\t\t\t\tevidenceValue: planned.item.evidenceValue ?? null,\n\t\t\t\tid: planned.item.id,\n\t\t\t\tpinReason: planned.item.pinReason ?? null,\n\t\t\t\tpriority: planned.item.priority,\n\t\t\t\trecency: roundUnitIntervalForCacheKeyV2(planned.item.recency),\n\t\t\t\tredundancyKey: planned.item.redundancyKey ?? null,\n\t\t\t\tredundancyPenalty: roundScoreForCacheKeyV2(planned.redundancyPenalty),\n\t\t\t\trelevance: planned.item.relevance ?? null,\n\t\t\t\trepresentations: (planned.item.representations ?? [])\n\t\t\t\t\t.map((candidate) => ({\n\t\t\t\t\t\tfingerprint: computeContextBudgetRepresentationFingerprintV2(candidate),\n\t\t\t\t\t\tkind: candidate.kind,\n\t\t\t\t\t}))\n\t\t\t\t\t.sort((a, b) => a.kind.localeCompare(b.kind) || a.fingerprint.localeCompare(b.fingerprint)),\n\t\t\t\trequired: planned.item.required === true,\n\t\t\t\tsourceRef: fingerprintSourceRef(planned.item.sourceRef),\n\t\t\t\tsourceHash: planned.contentHash,\n\t\t\t\ttier: planned.item.tier,\n\t\t\t\ttokenEstimate: planned.item.tokenEstimate ?? null,\n\t\t\t}))\n\t\t\t.sort((a, b) => a.id.localeCompare(b.id)),\n\t\tmaxTokens: input.maxTokens,\n\t\tinvalidationSnapshotHash: input.keyBase.invalidationSnapshotHash ?? \"none\",\n\t\tmodelId: input.keyBase.modelId,\n\t\tnamespace: input.keyBase.namespace,\n\t\tpolicyVersion: input.keyBase.policyVersion,\n\t\tpromptHash: input.promptHash ?? null,\n\t\tqueryIntentHash: input.keyBase.queryIntentHash,\n\t\tredactionPolicyHash: input.keyBase.redactionPolicyHash,\n\t\tresponseReserveTokens: input.responseReserveTokens,\n\t\tsafetyMarginTokens: input.safetyMarginTokens,\n\t\tsafetyProfileHash: input.keyBase.safetyProfileHash,\n\t\ttierPolicy: input.tierPolicy,\n\t\tqualityPolicy: input.qualityPolicy,\n\t\ttokenizerId: input.keyBase.tokenizerId,\n\t})}`;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"context-budget-v2-representation-cache.d.ts","sourceRoot":"","sources":["../../src/core/context-budget-v2-representation-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAGN,KAAK,2BAA2B,EAIhC,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAC;AAM3F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAEjF,UAAU,yCAAyC;IAClD,QAAQ,CAAC,QAAQ,CAAC,EAAE,4BAA4B,CAAC;IACjD,QAAQ,CAAC,OAAO,EAAE,2BAA2B,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,4BAA4B,CAAC;CACjD;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IACjD,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,SAAS,gCAAgC,EAAE,CAAC;IACjE,QAAQ,CAAC,KAAK,EAAE,yCAAyC,CAAC;IAC1D,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CACvC,GAAG,SAAS,gCAAgC,EAAE,CAgE9C;AA6CD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IACjD,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,gCAAgC,CAAC;IACpD,QAAQ,CAAC,KAAK,EAAE,yCAAyC,CAAC;IAC1D,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CACvC,GAAG,IAAI,CAiEP;AAED,wBAAgB,gCAAgC,CAAC,SAAS,EAAE,gCAAgC,GAAG,OAAO,CAErG","sourcesContent":["import type { ContextRepresentationCandidateV2 } from \"./context-budget-headroom.ts\";\nimport {\n\tbuildContextBudgetMaterializedRepresentationCandidateKeyV2,\n\tbuildContextBudgetRepresentationCandidateKeyV2,\n\ttype ContextBudgetCacheKeyBaseV2,\n\tcomputeContextBudgetOutputTextHashV2,\n\tcomputeContextBudgetRepresentationFingerprintV2,\n\tcomputeContextBudgetTargetTokenBucketV2,\n} from \"./context-budget-v2-cache-keys.ts\";\nimport type { MutableTokenCacheTelemetryV2 } from \"./context-budget-v2-cache-telemetry.ts\";\nimport { recordContextBudgetRepresentationCacheHitV2 } from \"./context-budget-v2-cache-telemetry.ts\";\nimport {\n\tvalidateContextBudgetMaterializedRepresentationCacheEntryV2,\n\tvalidateContextBudgetRepresentationCacheEntryV2,\n} from \"./context-budget-v2-cache-validation.ts\";\nimport type { PlannedItemV2 } from \"./context-budget-v2-scoring.ts\";\nimport type { ContextBudgetCacheProviderV2 } from \"./context-budget-v2-types.ts\";\n\ninterface ContextBudgetRepresentationCacheRuntimeV2 {\n\treadonly provider?: ContextBudgetCacheProviderV2;\n\treadonly keyBase: ContextBudgetCacheKeyBaseV2;\n\treadonly nowEpochMs: number;\n\treadonly ttlMs: number;\n\treadonly telemetry: MutableTokenCacheTelemetryV2;\n}\n\nexport function applyRepresentationCacheV2(input: {\n\treadonly planned: PlannedItemV2;\n\treadonly candidates: readonly ContextRepresentationCandidateV2[];\n\treadonly cache: ContextBudgetRepresentationCacheRuntimeV2;\n\treadonly materializedEnabled?: boolean;\n}): readonly ContextRepresentationCandidateV2[] {\n\tconst provider = input.cache.provider;\n\tif (!provider) return input.candidates;\n\tconst sourceHash = input.planned.contentHash;\n\tconst resolved: ContextRepresentationCandidateV2[] = [];\n\tfor (const candidate of input.candidates) {\n\t\tif (candidate.kind === \"omit\") {\n\t\t\tresolved.push(candidate);\n\t\t\tcontinue;\n\t\t}\n\t\tconst exactKey = buildContextBudgetRepresentationCandidateKeyV2(input.cache.keyBase, candidate, sourceHash);\n\t\tconst negative = provider.readNegativeRepresentation(exactKey);\n\t\tif (negative) {\n\t\t\tinput.cache.telemetry.representationCache.negativeHits += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tconst cached = provider.readRepresentation(exactKey);\n\t\tif (!cached) {\n\t\t\tconst materialized = readMaterializedRepresentationCacheV2({\n\t\t\t\tcache: input.cache,\n\t\t\t\tcandidate,\n\t\t\t\tmaterializedEnabled: input.materializedEnabled === true,\n\t\t\t\tprovider,\n\t\t\t\tsourceHash,\n\t\t\t});\n\t\t\tif (materialized) {\n\t\t\t\tresolved.push(materialized);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tinput.cache.telemetry.representationCache.misses += 1;\n\t\t\tresolved.push({ ...candidate, cache: { hit: false, key: exactKey, keyKind: \"exact\" } });\n\t\t\tcontinue;\n\t\t}\n\t\tconst rejection = validateContextBudgetRepresentationCacheEntryV2({\n\t\t\tcache: input.cache,\n\t\t\tcached,\n\t\t\tcandidate,\n\t\t\tsourceHash,\n\t\t});\n\t\tif (rejection) {\n\t\t\trecordRepresentationReject(input.cache.telemetry, rejection);\n\t\t\tresolved.push({\n\t\t\t\t...candidate,\n\t\t\t\tcache: { hit: false, key: exactKey, keyKind: \"exact\", rejectedReason: rejection },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\trecordContextBudgetRepresentationCacheHitV2(\n\t\t\tinput.cache.telemetry,\n\t\t\tcached.entry.kind,\n\t\t\tcached.entry.keyKind ?? \"exact\",\n\t\t);\n\t\tresolved.push({\n\t\t\t...candidate,\n\t\t\tcache: { hit: true, key: exactKey, keyKind: cached.entry.keyKind ?? \"exact\", layer: cached.layer },\n\t\t\tcompressorId: cached.entry.compressorId,\n\t\t\testimatedTokens: cached.entry.estimatedTokens,\n\t\t\tfidelity: cached.entry.fidelity,\n\t\t\tsourceRef: cached.entry.sourceRef ?? candidate.sourceRef,\n\t\t\tsummaryHash: cached.entry.summaryHash,\n\t\t\ttext: cached.entry.text,\n\t\t});\n\t}\n\treturn resolved;\n}\n\nfunction readMaterializedRepresentationCacheV2(input: {\n\treadonly cache: ContextBudgetRepresentationCacheRuntimeV2;\n\treadonly candidate: ContextRepresentationCandidateV2;\n\treadonly materializedEnabled: boolean;\n\treadonly provider: ContextBudgetCacheProviderV2;\n\treadonly sourceHash: string;\n}): ContextRepresentationCandidateV2 | undefined {\n\tif (!input.materializedEnabled || !isMaterializableRepresentationV2(input.candidate)) return undefined;\n\tconst key = buildContextBudgetMaterializedRepresentationCandidateKeyV2(\n\t\tinput.cache.keyBase,\n\t\tinput.candidate,\n\t\tinput.sourceHash,\n\t);\n\tconst negative = input.provider.readNegativeRepresentation(key);\n\tif (negative) {\n\t\tinput.cache.telemetry.representationCache.negativeHits += 1;\n\t\treturn undefined;\n\t}\n\tconst cached = input.provider.readRepresentation(key);\n\tif (!cached) return undefined;\n\tconst rejection = validateContextBudgetMaterializedRepresentationCacheEntryV2({\n\t\tcache: input.cache,\n\t\tcached,\n\t\tcandidate: input.candidate,\n\t\tsourceHash: input.sourceHash,\n\t});\n\tif (rejection) {\n\t\trecordRepresentationReject(input.cache.telemetry, rejection);\n\t\treturn { ...input.candidate, cache: { hit: false, key, keyKind: \"materialized\", rejectedReason: rejection } };\n\t}\n\trecordContextBudgetRepresentationCacheHitV2(input.cache.telemetry, cached.entry.kind, \"materialized\");\n\treturn {\n\t\t...input.candidate,\n\t\tcache: { hit: true, key, keyKind: \"materialized\", layer: cached.layer },\n\t\tcompressorId: cached.entry.compressorId,\n\t\testimatedTokens: cached.entry.estimatedTokens,\n\t\tfidelity: cached.entry.fidelity,\n\t\tsourceRef: cached.entry.sourceRef ?? input.candidate.sourceRef,\n\t\tsummaryHash: cached.entry.summaryHash,\n\t\ttext: cached.entry.text,\n\t};\n}\n\nexport function writeRepresentationCacheV2(input: {\n\treadonly planned: PlannedItemV2;\n\treadonly selected: ContextRepresentationCandidateV2;\n\treadonly cache: ContextBudgetRepresentationCacheRuntimeV2;\n\treadonly materializedEnabled?: boolean;\n}): void {\n\tif (!input.cache.provider || input.selected.kind === \"omit\" || input.selected.cache?.hit === true) return;\n\tconst sourceHash = input.planned.contentHash;\n\tconst exactKey =\n\t\tinput.selected.cache?.keyKind === \"exact\" && input.selected.cache.key !== undefined\n\t\t\t? input.selected.cache.key\n\t\t\t: buildContextBudgetRepresentationCandidateKeyV2(input.cache.keyBase, input.selected, sourceHash);\n\tinput.cache.provider.writeRepresentation({\n\t\tkey: exactKey,\n\t\tentry: {\n\t\t\tcompressorId: input.selected.compressorId,\n\t\t\tcreatedAtEpochMs: input.cache.nowEpochMs,\n\t\t\testimatedTokens: input.selected.estimatedTokens,\n\t\t\tfidelity: input.selected.fidelity,\n\t\t\tkeyKind: \"exact\",\n\t\t\tkind: input.selected.kind,\n\t\t\tmodelId: input.cache.keyBase.modelId,\n\t\t\tpolicyVersion: input.cache.keyBase.policyVersion,\n\t\t\trepresentationFingerprint: computeContextBudgetRepresentationFingerprintV2(input.selected),\n\t\t\tsourceHash,\n\t\t\tsourceRef: input.selected.sourceRef,\n\t\t\tsummaryHash: input.selected.summaryHash,\n\t\t\ttext: input.selected.text,\n\t\t\ttokenizerId: input.cache.keyBase.tokenizerId,\n\t\t},\n\t});\n\tinput.cache.telemetry.representationCache.writes += 1;\n\tif (input.materializedEnabled === true && isMaterializableRepresentationV2(input.selected)) {\n\t\tinput.cache.provider.writeRepresentation({\n\t\t\tkey: buildContextBudgetMaterializedRepresentationCandidateKeyV2(\n\t\t\t\tinput.cache.keyBase,\n\t\t\t\tinput.selected,\n\t\t\t\tsourceHash,\n\t\t\t),\n\t\t\tentry: {\n\t\t\t\tcompressorId: input.selected.compressorId,\n\t\t\t\tcompressorPolicyHash: input.cache.keyBase.compressorPolicyHash,\n\t\t\t\tcreatedAtEpochMs: input.cache.nowEpochMs,\n\t\t\t\testimatedTokens: input.selected.estimatedTokens,\n\t\t\t\tfidelity: input.selected.fidelity,\n\t\t\t\tkeyKind: \"materialized\",\n\t\t\t\tkind: input.selected.kind,\n\t\t\t\tmodelId: input.cache.keyBase.modelId,\n\t\t\t\toutputTextHash: computeContextBudgetOutputTextHashV2(input.selected.text),\n\t\t\t\tpolicyVersion: input.cache.keyBase.policyVersion,\n\t\t\t\tqualityPolicyHash: input.cache.keyBase.qualityPolicyHash,\n\t\t\t\tqueryIntentCluster: input.cache.keyBase.queryIntentCluster,\n\t\t\t\trepresentationFingerprint: computeContextBudgetRepresentationFingerprintV2(input.selected),\n\t\t\t\tsourceHash,\n\t\t\t\tsourceRef: input.selected.sourceRef,\n\t\t\t\tsummaryHash: input.selected.summaryHash,\n\t\t\t\ttargetTokenBucket: computeContextBudgetTargetTokenBucketV2(input.selected.estimatedTokens),\n\t\t\t\ttext: input.selected.text,\n\t\t\t\ttokenizerId: input.cache.keyBase.tokenizerId,\n\t\t\t\tverification: {\n\t\t\t\t\tpoisonScore: 0,\n\t\t\t\t\tqueryCoverage: 1,\n\t\t\t\t\tsecretLeakScore: 0,\n\t\t\t\t\tsourceCoverage: 1,\n\t\t\t\t\tvalidatorVersion: \"context-budget-v2-heuristic\",\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t\tinput.cache.telemetry.representationCache.writes += 1;\n\t}\n}\n\nexport function isMaterializableRepresentationV2(candidate: ContextRepresentationCandidateV2): boolean {\n\treturn candidate.kind === \"summary\" || candidate.kind === \"headroom-compressed\";\n}\n\nfunction recordRepresentationReject(telemetry: MutableTokenCacheTelemetryV2, rejection: string): void {\n\tif (rejection === \"stale\") {\n\t\ttelemetry.representationCache.staleRejects += 1;\n\t} else {\n\t\ttelemetry.representationCache.poisonRejects += 1;\n\t}\n}\n"]}
1
+ {"version":3,"file":"context-budget-v2-representation-cache.d.ts","sourceRoot":"","sources":["../../src/core/context-budget-v2-representation-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAGN,KAAK,2BAA2B,EAIhC,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAC;AAK3F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAEjF,UAAU,yCAAyC;IAClD,QAAQ,CAAC,QAAQ,CAAC,EAAE,4BAA4B,CAAC;IACjD,QAAQ,CAAC,OAAO,EAAE,2BAA2B,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,4BAA4B,CAAC;CACjD;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IACjD,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,SAAS,gCAAgC,EAAE,CAAC;IACjE,QAAQ,CAAC,KAAK,EAAE,yCAAyC,CAAC;IAC1D,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CACvC,GAAG,SAAS,gCAAgC,EAAE,CA4D9C;AA6CD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IACjD,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,gCAAgC,CAAC;IACpD,QAAQ,CAAC,KAAK,EAAE,yCAAyC,CAAC;IAC1D,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CACvC,GAAG,IAAI,CAiEP;AAED,wBAAgB,gCAAgC,CAAC,SAAS,EAAE,gCAAgC,GAAG,OAAO,CAErG","sourcesContent":["import type { ContextRepresentationCandidateV2 } from \"./context-budget-headroom.ts\";\nimport {\n\tbuildContextBudgetMaterializedRepresentationCandidateKeyV2,\n\tbuildContextBudgetRepresentationCandidateKeyV2,\n\ttype ContextBudgetCacheKeyBaseV2,\n\tcomputeContextBudgetOutputTextHashV2,\n\tcomputeContextBudgetRepresentationFingerprintV2,\n\tcomputeContextBudgetTargetTokenBucketV2,\n} from \"./context-budget-v2-cache-keys.ts\";\nimport type { MutableTokenCacheTelemetryV2 } from \"./context-budget-v2-cache-telemetry.ts\";\nimport {\n\tvalidateContextBudgetMaterializedRepresentationCacheEntryV2,\n\tvalidateContextBudgetRepresentationCacheEntryV2,\n} from \"./context-budget-v2-cache-validation.ts\";\nimport type { PlannedItemV2 } from \"./context-budget-v2-scoring.ts\";\nimport type { ContextBudgetCacheProviderV2 } from \"./context-budget-v2-types.ts\";\n\ninterface ContextBudgetRepresentationCacheRuntimeV2 {\n\treadonly provider?: ContextBudgetCacheProviderV2;\n\treadonly keyBase: ContextBudgetCacheKeyBaseV2;\n\treadonly nowEpochMs: number;\n\treadonly ttlMs: number;\n\treadonly telemetry: MutableTokenCacheTelemetryV2;\n}\n\nexport function applyRepresentationCacheV2(input: {\n\treadonly planned: PlannedItemV2;\n\treadonly candidates: readonly ContextRepresentationCandidateV2[];\n\treadonly cache: ContextBudgetRepresentationCacheRuntimeV2;\n\treadonly materializedEnabled?: boolean;\n}): readonly ContextRepresentationCandidateV2[] {\n\tconst provider = input.cache.provider;\n\tif (!provider) return input.candidates;\n\tconst sourceHash = input.planned.contentHash;\n\tconst resolved: ContextRepresentationCandidateV2[] = [];\n\tfor (const candidate of input.candidates) {\n\t\tif (candidate.kind === \"omit\") {\n\t\t\tresolved.push(candidate);\n\t\t\tcontinue;\n\t\t}\n\t\tconst exactKey = buildContextBudgetRepresentationCandidateKeyV2(input.cache.keyBase, candidate, sourceHash);\n\t\tconst negative = provider.readNegativeRepresentation(exactKey);\n\t\tif (negative) {\n\t\t\tinput.cache.telemetry.representationCache.negativeHits += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tconst cached = provider.readRepresentation(exactKey);\n\t\tif (!cached) {\n\t\t\tconst materialized = readMaterializedRepresentationCacheV2({\n\t\t\t\tcache: input.cache,\n\t\t\t\tcandidate,\n\t\t\t\tmaterializedEnabled: input.materializedEnabled === true,\n\t\t\t\tprovider,\n\t\t\t\tsourceHash,\n\t\t\t});\n\t\t\tif (materialized) {\n\t\t\t\tresolved.push(materialized);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tinput.cache.telemetry.representationCache.misses += 1;\n\t\t\tresolved.push({ ...candidate, cache: { hit: false, key: exactKey, keyKind: \"exact\" } });\n\t\t\tcontinue;\n\t\t}\n\t\tconst rejection = validateContextBudgetRepresentationCacheEntryV2({\n\t\t\tcache: input.cache,\n\t\t\tcached,\n\t\t\tcandidate,\n\t\t\tsourceHash,\n\t\t});\n\t\tif (rejection) {\n\t\t\trecordRepresentationReject(input.cache.telemetry, rejection);\n\t\t\tif (rejection === \"stale\") provider.deleteRepresentation?.(exactKey);\n\t\t\tresolved.push({\n\t\t\t\t...candidate,\n\t\t\t\tcache: { hit: false, key: exactKey, keyKind: \"exact\", rejectedReason: rejection },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tresolved.push({\n\t\t\t...candidate,\n\t\t\tcache: { hit: true, key: exactKey, keyKind: cached.entry.keyKind ?? \"exact\", layer: cached.layer },\n\t\t\tcompressorId: cached.entry.compressorId,\n\t\t\testimatedTokens: cached.entry.estimatedTokens,\n\t\t\tfidelity: cached.entry.fidelity,\n\t\t\tsourceRef: cached.entry.sourceRef ?? candidate.sourceRef,\n\t\t\tsummaryHash: cached.entry.summaryHash,\n\t\t\ttext: cached.entry.text,\n\t\t});\n\t}\n\treturn resolved;\n}\n\nfunction readMaterializedRepresentationCacheV2(input: {\n\treadonly cache: ContextBudgetRepresentationCacheRuntimeV2;\n\treadonly candidate: ContextRepresentationCandidateV2;\n\treadonly materializedEnabled: boolean;\n\treadonly provider: ContextBudgetCacheProviderV2;\n\treadonly sourceHash: string;\n}): ContextRepresentationCandidateV2 | undefined {\n\tif (!input.materializedEnabled || !isMaterializableRepresentationV2(input.candidate)) return undefined;\n\tconst key = buildContextBudgetMaterializedRepresentationCandidateKeyV2(\n\t\tinput.cache.keyBase,\n\t\tinput.candidate,\n\t\tinput.sourceHash,\n\t);\n\tconst negative = input.provider.readNegativeRepresentation(key);\n\tif (negative) {\n\t\tinput.cache.telemetry.representationCache.negativeHits += 1;\n\t\treturn undefined;\n\t}\n\tconst cached = input.provider.readRepresentation(key);\n\tif (!cached) return undefined;\n\tconst rejection = validateContextBudgetMaterializedRepresentationCacheEntryV2({\n\t\tcache: input.cache,\n\t\tcached,\n\t\tcandidate: input.candidate,\n\t\tsourceHash: input.sourceHash,\n\t});\n\tif (rejection) {\n\t\trecordRepresentationReject(input.cache.telemetry, rejection);\n\t\tif (rejection === \"stale\") input.provider.deleteRepresentation?.(key);\n\t\treturn { ...input.candidate, cache: { hit: false, key, keyKind: \"materialized\", rejectedReason: rejection } };\n\t}\n\treturn {\n\t\t...input.candidate,\n\t\tcache: { hit: true, key, keyKind: \"materialized\", layer: cached.layer },\n\t\tcompressorId: cached.entry.compressorId,\n\t\testimatedTokens: cached.entry.estimatedTokens,\n\t\tfidelity: cached.entry.fidelity,\n\t\tsourceRef: cached.entry.sourceRef ?? input.candidate.sourceRef,\n\t\tsummaryHash: cached.entry.summaryHash,\n\t\ttext: cached.entry.text,\n\t};\n}\n\nexport function writeRepresentationCacheV2(input: {\n\treadonly planned: PlannedItemV2;\n\treadonly selected: ContextRepresentationCandidateV2;\n\treadonly cache: ContextBudgetRepresentationCacheRuntimeV2;\n\treadonly materializedEnabled?: boolean;\n}): void {\n\tif (!input.cache.provider || input.selected.kind === \"omit\" || input.selected.cache?.hit === true) return;\n\tconst sourceHash = input.planned.contentHash;\n\tconst exactKey =\n\t\tinput.selected.cache?.keyKind === \"exact\" && input.selected.cache.key !== undefined\n\t\t\t? input.selected.cache.key\n\t\t\t: buildContextBudgetRepresentationCandidateKeyV2(input.cache.keyBase, input.selected, sourceHash);\n\tinput.cache.provider.writeRepresentation({\n\t\tkey: exactKey,\n\t\tentry: {\n\t\t\tcompressorId: input.selected.compressorId,\n\t\t\tcreatedAtEpochMs: input.cache.nowEpochMs,\n\t\t\testimatedTokens: input.selected.estimatedTokens,\n\t\t\tfidelity: input.selected.fidelity,\n\t\t\tkeyKind: \"exact\",\n\t\t\tkind: input.selected.kind,\n\t\t\tmodelId: input.cache.keyBase.modelId,\n\t\t\tpolicyVersion: input.cache.keyBase.policyVersion,\n\t\t\trepresentationFingerprint: computeContextBudgetRepresentationFingerprintV2(input.selected),\n\t\t\tsourceHash,\n\t\t\tsourceRef: input.selected.sourceRef,\n\t\t\tsummaryHash: input.selected.summaryHash,\n\t\t\ttext: input.selected.text,\n\t\t\ttokenizerId: input.cache.keyBase.tokenizerId,\n\t\t},\n\t});\n\tinput.cache.telemetry.representationCache.writes += 1;\n\tif (input.materializedEnabled === true && isMaterializableRepresentationV2(input.selected)) {\n\t\tinput.cache.provider.writeRepresentation({\n\t\t\tkey: buildContextBudgetMaterializedRepresentationCandidateKeyV2(\n\t\t\t\tinput.cache.keyBase,\n\t\t\t\tinput.selected,\n\t\t\t\tsourceHash,\n\t\t\t),\n\t\t\tentry: {\n\t\t\t\tcompressorId: input.selected.compressorId,\n\t\t\t\tcompressorPolicyHash: input.cache.keyBase.compressorPolicyHash,\n\t\t\t\tcreatedAtEpochMs: input.cache.nowEpochMs,\n\t\t\t\testimatedTokens: input.selected.estimatedTokens,\n\t\t\t\tfidelity: input.selected.fidelity,\n\t\t\t\tkeyKind: \"materialized\",\n\t\t\t\tkind: input.selected.kind,\n\t\t\t\tmodelId: input.cache.keyBase.modelId,\n\t\t\t\toutputTextHash: computeContextBudgetOutputTextHashV2(input.selected.text),\n\t\t\t\tpolicyVersion: input.cache.keyBase.policyVersion,\n\t\t\t\tqualityPolicyHash: input.cache.keyBase.qualityPolicyHash,\n\t\t\t\tqueryIntentCluster: input.cache.keyBase.queryIntentCluster,\n\t\t\t\trepresentationFingerprint: computeContextBudgetRepresentationFingerprintV2(input.selected),\n\t\t\t\tsourceHash,\n\t\t\t\tsourceRef: input.selected.sourceRef,\n\t\t\t\tsummaryHash: input.selected.summaryHash,\n\t\t\t\ttargetTokenBucket: computeContextBudgetTargetTokenBucketV2(input.selected.estimatedTokens),\n\t\t\t\ttext: input.selected.text,\n\t\t\t\ttokenizerId: input.cache.keyBase.tokenizerId,\n\t\t\t\tverification: {\n\t\t\t\t\tpoisonScore: 0,\n\t\t\t\t\tqueryCoverage: 1,\n\t\t\t\t\tsecretLeakScore: 0,\n\t\t\t\t\tsourceCoverage: 1,\n\t\t\t\t\tvalidatorVersion: \"context-budget-v2-heuristic\",\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t\tinput.cache.telemetry.representationCache.writes += 1;\n\t}\n}\n\nexport function isMaterializableRepresentationV2(candidate: ContextRepresentationCandidateV2): boolean {\n\treturn candidate.kind === \"summary\" || candidate.kind === \"headroom-compressed\";\n}\n\nfunction recordRepresentationReject(telemetry: MutableTokenCacheTelemetryV2, rejection: string): void {\n\tif (rejection === \"stale\") {\n\t\ttelemetry.representationCache.staleRejects += 1;\n\t} else {\n\t\ttelemetry.representationCache.poisonRejects += 1;\n\t}\n}\n"]}
@@ -1,5 +1,4 @@
1
1
  import { buildContextBudgetMaterializedRepresentationCandidateKeyV2, buildContextBudgetRepresentationCandidateKeyV2, computeContextBudgetOutputTextHashV2, computeContextBudgetRepresentationFingerprintV2, computeContextBudgetTargetTokenBucketV2, } from "./context-budget-v2-cache-keys.js";
2
- import { recordContextBudgetRepresentationCacheHitV2 } from "./context-budget-v2-cache-telemetry.js";
3
2
  import { validateContextBudgetMaterializedRepresentationCacheEntryV2, validateContextBudgetRepresentationCacheEntryV2, } from "./context-budget-v2-cache-validation.js";
4
3
  export function applyRepresentationCacheV2(input) {
5
4
  const provider = input.cache.provider;
@@ -43,13 +42,14 @@ export function applyRepresentationCacheV2(input) {
43
42
  });
44
43
  if (rejection) {
45
44
  recordRepresentationReject(input.cache.telemetry, rejection);
45
+ if (rejection === "stale")
46
+ provider.deleteRepresentation?.(exactKey);
46
47
  resolved.push({
47
48
  ...candidate,
48
49
  cache: { hit: false, key: exactKey, keyKind: "exact", rejectedReason: rejection },
49
50
  });
50
51
  continue;
51
52
  }
52
- recordContextBudgetRepresentationCacheHitV2(input.cache.telemetry, cached.entry.kind, cached.entry.keyKind ?? "exact");
53
53
  resolved.push({
54
54
  ...candidate,
55
55
  cache: { hit: true, key: exactKey, keyKind: cached.entry.keyKind ?? "exact", layer: cached.layer },
@@ -83,9 +83,10 @@ function readMaterializedRepresentationCacheV2(input) {
83
83
  });
84
84
  if (rejection) {
85
85
  recordRepresentationReject(input.cache.telemetry, rejection);
86
+ if (rejection === "stale")
87
+ input.provider.deleteRepresentation?.(key);
86
88
  return { ...input.candidate, cache: { hit: false, key, keyKind: "materialized", rejectedReason: rejection } };
87
89
  }
88
- recordContextBudgetRepresentationCacheHitV2(input.cache.telemetry, cached.entry.kind, "materialized");
89
90
  return {
90
91
  ...input.candidate,
91
92
  cache: { hit: true, key, keyKind: "materialized", layer: cached.layer },
@@ -1 +1 @@
1
- {"version":3,"file":"context-budget-v2-representation-cache.js","sourceRoot":"","sources":["../../src/core/context-budget-v2-representation-cache.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ContextRepresentationCandidateV2 } from \"./context-budget-headroom.ts\";\nimport {\n\tbuildContextBudgetMaterializedRepresentationCandidateKeyV2,\n\tbuildContextBudgetRepresentationCandidateKeyV2,\n\ttype ContextBudgetCacheKeyBaseV2,\n\tcomputeContextBudgetOutputTextHashV2,\n\tcomputeContextBudgetRepresentationFingerprintV2,\n\tcomputeContextBudgetTargetTokenBucketV2,\n} from \"./context-budget-v2-cache-keys.ts\";\nimport type { MutableTokenCacheTelemetryV2 } from \"./context-budget-v2-cache-telemetry.ts\";\nimport { recordContextBudgetRepresentationCacheHitV2 } from \"./context-budget-v2-cache-telemetry.ts\";\nimport {\n\tvalidateContextBudgetMaterializedRepresentationCacheEntryV2,\n\tvalidateContextBudgetRepresentationCacheEntryV2,\n} from \"./context-budget-v2-cache-validation.ts\";\nimport type { PlannedItemV2 } from \"./context-budget-v2-scoring.ts\";\nimport type { ContextBudgetCacheProviderV2 } from \"./context-budget-v2-types.ts\";\n\ninterface ContextBudgetRepresentationCacheRuntimeV2 {\n\treadonly provider?: ContextBudgetCacheProviderV2;\n\treadonly keyBase: ContextBudgetCacheKeyBaseV2;\n\treadonly nowEpochMs: number;\n\treadonly ttlMs: number;\n\treadonly telemetry: MutableTokenCacheTelemetryV2;\n}\n\nexport function applyRepresentationCacheV2(input: {\n\treadonly planned: PlannedItemV2;\n\treadonly candidates: readonly ContextRepresentationCandidateV2[];\n\treadonly cache: ContextBudgetRepresentationCacheRuntimeV2;\n\treadonly materializedEnabled?: boolean;\n}): readonly ContextRepresentationCandidateV2[] {\n\tconst provider = input.cache.provider;\n\tif (!provider) return input.candidates;\n\tconst sourceHash = input.planned.contentHash;\n\tconst resolved: ContextRepresentationCandidateV2[] = [];\n\tfor (const candidate of input.candidates) {\n\t\tif (candidate.kind === \"omit\") {\n\t\t\tresolved.push(candidate);\n\t\t\tcontinue;\n\t\t}\n\t\tconst exactKey = buildContextBudgetRepresentationCandidateKeyV2(input.cache.keyBase, candidate, sourceHash);\n\t\tconst negative = provider.readNegativeRepresentation(exactKey);\n\t\tif (negative) {\n\t\t\tinput.cache.telemetry.representationCache.negativeHits += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tconst cached = provider.readRepresentation(exactKey);\n\t\tif (!cached) {\n\t\t\tconst materialized = readMaterializedRepresentationCacheV2({\n\t\t\t\tcache: input.cache,\n\t\t\t\tcandidate,\n\t\t\t\tmaterializedEnabled: input.materializedEnabled === true,\n\t\t\t\tprovider,\n\t\t\t\tsourceHash,\n\t\t\t});\n\t\t\tif (materialized) {\n\t\t\t\tresolved.push(materialized);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tinput.cache.telemetry.representationCache.misses += 1;\n\t\t\tresolved.push({ ...candidate, cache: { hit: false, key: exactKey, keyKind: \"exact\" } });\n\t\t\tcontinue;\n\t\t}\n\t\tconst rejection = validateContextBudgetRepresentationCacheEntryV2({\n\t\t\tcache: input.cache,\n\t\t\tcached,\n\t\t\tcandidate,\n\t\t\tsourceHash,\n\t\t});\n\t\tif (rejection) {\n\t\t\trecordRepresentationReject(input.cache.telemetry, rejection);\n\t\t\tresolved.push({\n\t\t\t\t...candidate,\n\t\t\t\tcache: { hit: false, key: exactKey, keyKind: \"exact\", rejectedReason: rejection },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\trecordContextBudgetRepresentationCacheHitV2(\n\t\t\tinput.cache.telemetry,\n\t\t\tcached.entry.kind,\n\t\t\tcached.entry.keyKind ?? \"exact\",\n\t\t);\n\t\tresolved.push({\n\t\t\t...candidate,\n\t\t\tcache: { hit: true, key: exactKey, keyKind: cached.entry.keyKind ?? \"exact\", layer: cached.layer },\n\t\t\tcompressorId: cached.entry.compressorId,\n\t\t\testimatedTokens: cached.entry.estimatedTokens,\n\t\t\tfidelity: cached.entry.fidelity,\n\t\t\tsourceRef: cached.entry.sourceRef ?? candidate.sourceRef,\n\t\t\tsummaryHash: cached.entry.summaryHash,\n\t\t\ttext: cached.entry.text,\n\t\t});\n\t}\n\treturn resolved;\n}\n\nfunction readMaterializedRepresentationCacheV2(input: {\n\treadonly cache: ContextBudgetRepresentationCacheRuntimeV2;\n\treadonly candidate: ContextRepresentationCandidateV2;\n\treadonly materializedEnabled: boolean;\n\treadonly provider: ContextBudgetCacheProviderV2;\n\treadonly sourceHash: string;\n}): ContextRepresentationCandidateV2 | undefined {\n\tif (!input.materializedEnabled || !isMaterializableRepresentationV2(input.candidate)) return undefined;\n\tconst key = buildContextBudgetMaterializedRepresentationCandidateKeyV2(\n\t\tinput.cache.keyBase,\n\t\tinput.candidate,\n\t\tinput.sourceHash,\n\t);\n\tconst negative = input.provider.readNegativeRepresentation(key);\n\tif (negative) {\n\t\tinput.cache.telemetry.representationCache.negativeHits += 1;\n\t\treturn undefined;\n\t}\n\tconst cached = input.provider.readRepresentation(key);\n\tif (!cached) return undefined;\n\tconst rejection = validateContextBudgetMaterializedRepresentationCacheEntryV2({\n\t\tcache: input.cache,\n\t\tcached,\n\t\tcandidate: input.candidate,\n\t\tsourceHash: input.sourceHash,\n\t});\n\tif (rejection) {\n\t\trecordRepresentationReject(input.cache.telemetry, rejection);\n\t\treturn { ...input.candidate, cache: { hit: false, key, keyKind: \"materialized\", rejectedReason: rejection } };\n\t}\n\trecordContextBudgetRepresentationCacheHitV2(input.cache.telemetry, cached.entry.kind, \"materialized\");\n\treturn {\n\t\t...input.candidate,\n\t\tcache: { hit: true, key, keyKind: \"materialized\", layer: cached.layer },\n\t\tcompressorId: cached.entry.compressorId,\n\t\testimatedTokens: cached.entry.estimatedTokens,\n\t\tfidelity: cached.entry.fidelity,\n\t\tsourceRef: cached.entry.sourceRef ?? input.candidate.sourceRef,\n\t\tsummaryHash: cached.entry.summaryHash,\n\t\ttext: cached.entry.text,\n\t};\n}\n\nexport function writeRepresentationCacheV2(input: {\n\treadonly planned: PlannedItemV2;\n\treadonly selected: ContextRepresentationCandidateV2;\n\treadonly cache: ContextBudgetRepresentationCacheRuntimeV2;\n\treadonly materializedEnabled?: boolean;\n}): void {\n\tif (!input.cache.provider || input.selected.kind === \"omit\" || input.selected.cache?.hit === true) return;\n\tconst sourceHash = input.planned.contentHash;\n\tconst exactKey =\n\t\tinput.selected.cache?.keyKind === \"exact\" && input.selected.cache.key !== undefined\n\t\t\t? input.selected.cache.key\n\t\t\t: buildContextBudgetRepresentationCandidateKeyV2(input.cache.keyBase, input.selected, sourceHash);\n\tinput.cache.provider.writeRepresentation({\n\t\tkey: exactKey,\n\t\tentry: {\n\t\t\tcompressorId: input.selected.compressorId,\n\t\t\tcreatedAtEpochMs: input.cache.nowEpochMs,\n\t\t\testimatedTokens: input.selected.estimatedTokens,\n\t\t\tfidelity: input.selected.fidelity,\n\t\t\tkeyKind: \"exact\",\n\t\t\tkind: input.selected.kind,\n\t\t\tmodelId: input.cache.keyBase.modelId,\n\t\t\tpolicyVersion: input.cache.keyBase.policyVersion,\n\t\t\trepresentationFingerprint: computeContextBudgetRepresentationFingerprintV2(input.selected),\n\t\t\tsourceHash,\n\t\t\tsourceRef: input.selected.sourceRef,\n\t\t\tsummaryHash: input.selected.summaryHash,\n\t\t\ttext: input.selected.text,\n\t\t\ttokenizerId: input.cache.keyBase.tokenizerId,\n\t\t},\n\t});\n\tinput.cache.telemetry.representationCache.writes += 1;\n\tif (input.materializedEnabled === true && isMaterializableRepresentationV2(input.selected)) {\n\t\tinput.cache.provider.writeRepresentation({\n\t\t\tkey: buildContextBudgetMaterializedRepresentationCandidateKeyV2(\n\t\t\t\tinput.cache.keyBase,\n\t\t\t\tinput.selected,\n\t\t\t\tsourceHash,\n\t\t\t),\n\t\t\tentry: {\n\t\t\t\tcompressorId: input.selected.compressorId,\n\t\t\t\tcompressorPolicyHash: input.cache.keyBase.compressorPolicyHash,\n\t\t\t\tcreatedAtEpochMs: input.cache.nowEpochMs,\n\t\t\t\testimatedTokens: input.selected.estimatedTokens,\n\t\t\t\tfidelity: input.selected.fidelity,\n\t\t\t\tkeyKind: \"materialized\",\n\t\t\t\tkind: input.selected.kind,\n\t\t\t\tmodelId: input.cache.keyBase.modelId,\n\t\t\t\toutputTextHash: computeContextBudgetOutputTextHashV2(input.selected.text),\n\t\t\t\tpolicyVersion: input.cache.keyBase.policyVersion,\n\t\t\t\tqualityPolicyHash: input.cache.keyBase.qualityPolicyHash,\n\t\t\t\tqueryIntentCluster: input.cache.keyBase.queryIntentCluster,\n\t\t\t\trepresentationFingerprint: computeContextBudgetRepresentationFingerprintV2(input.selected),\n\t\t\t\tsourceHash,\n\t\t\t\tsourceRef: input.selected.sourceRef,\n\t\t\t\tsummaryHash: input.selected.summaryHash,\n\t\t\t\ttargetTokenBucket: computeContextBudgetTargetTokenBucketV2(input.selected.estimatedTokens),\n\t\t\t\ttext: input.selected.text,\n\t\t\t\ttokenizerId: input.cache.keyBase.tokenizerId,\n\t\t\t\tverification: {\n\t\t\t\t\tpoisonScore: 0,\n\t\t\t\t\tqueryCoverage: 1,\n\t\t\t\t\tsecretLeakScore: 0,\n\t\t\t\t\tsourceCoverage: 1,\n\t\t\t\t\tvalidatorVersion: \"context-budget-v2-heuristic\",\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t\tinput.cache.telemetry.representationCache.writes += 1;\n\t}\n}\n\nexport function isMaterializableRepresentationV2(candidate: ContextRepresentationCandidateV2): boolean {\n\treturn candidate.kind === \"summary\" || candidate.kind === \"headroom-compressed\";\n}\n\nfunction recordRepresentationReject(telemetry: MutableTokenCacheTelemetryV2, rejection: string): void {\n\tif (rejection === \"stale\") {\n\t\ttelemetry.representationCache.staleRejects += 1;\n\t} else {\n\t\ttelemetry.representationCache.poisonRejects += 1;\n\t}\n}\n"]}
1
+ {"version":3,"file":"context-budget-v2-representation-cache.js","sourceRoot":"","sources":["../../src/core/context-budget-v2-representation-cache.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ContextRepresentationCandidateV2 } from \"./context-budget-headroom.ts\";\nimport {\n\tbuildContextBudgetMaterializedRepresentationCandidateKeyV2,\n\tbuildContextBudgetRepresentationCandidateKeyV2,\n\ttype ContextBudgetCacheKeyBaseV2,\n\tcomputeContextBudgetOutputTextHashV2,\n\tcomputeContextBudgetRepresentationFingerprintV2,\n\tcomputeContextBudgetTargetTokenBucketV2,\n} from \"./context-budget-v2-cache-keys.ts\";\nimport type { MutableTokenCacheTelemetryV2 } from \"./context-budget-v2-cache-telemetry.ts\";\nimport {\n\tvalidateContextBudgetMaterializedRepresentationCacheEntryV2,\n\tvalidateContextBudgetRepresentationCacheEntryV2,\n} from \"./context-budget-v2-cache-validation.ts\";\nimport type { PlannedItemV2 } from \"./context-budget-v2-scoring.ts\";\nimport type { ContextBudgetCacheProviderV2 } from \"./context-budget-v2-types.ts\";\n\ninterface ContextBudgetRepresentationCacheRuntimeV2 {\n\treadonly provider?: ContextBudgetCacheProviderV2;\n\treadonly keyBase: ContextBudgetCacheKeyBaseV2;\n\treadonly nowEpochMs: number;\n\treadonly ttlMs: number;\n\treadonly telemetry: MutableTokenCacheTelemetryV2;\n}\n\nexport function applyRepresentationCacheV2(input: {\n\treadonly planned: PlannedItemV2;\n\treadonly candidates: readonly ContextRepresentationCandidateV2[];\n\treadonly cache: ContextBudgetRepresentationCacheRuntimeV2;\n\treadonly materializedEnabled?: boolean;\n}): readonly ContextRepresentationCandidateV2[] {\n\tconst provider = input.cache.provider;\n\tif (!provider) return input.candidates;\n\tconst sourceHash = input.planned.contentHash;\n\tconst resolved: ContextRepresentationCandidateV2[] = [];\n\tfor (const candidate of input.candidates) {\n\t\tif (candidate.kind === \"omit\") {\n\t\t\tresolved.push(candidate);\n\t\t\tcontinue;\n\t\t}\n\t\tconst exactKey = buildContextBudgetRepresentationCandidateKeyV2(input.cache.keyBase, candidate, sourceHash);\n\t\tconst negative = provider.readNegativeRepresentation(exactKey);\n\t\tif (negative) {\n\t\t\tinput.cache.telemetry.representationCache.negativeHits += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tconst cached = provider.readRepresentation(exactKey);\n\t\tif (!cached) {\n\t\t\tconst materialized = readMaterializedRepresentationCacheV2({\n\t\t\t\tcache: input.cache,\n\t\t\t\tcandidate,\n\t\t\t\tmaterializedEnabled: input.materializedEnabled === true,\n\t\t\t\tprovider,\n\t\t\t\tsourceHash,\n\t\t\t});\n\t\t\tif (materialized) {\n\t\t\t\tresolved.push(materialized);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tinput.cache.telemetry.representationCache.misses += 1;\n\t\t\tresolved.push({ ...candidate, cache: { hit: false, key: exactKey, keyKind: \"exact\" } });\n\t\t\tcontinue;\n\t\t}\n\t\tconst rejection = validateContextBudgetRepresentationCacheEntryV2({\n\t\t\tcache: input.cache,\n\t\t\tcached,\n\t\t\tcandidate,\n\t\t\tsourceHash,\n\t\t});\n\t\tif (rejection) {\n\t\t\trecordRepresentationReject(input.cache.telemetry, rejection);\n\t\t\tif (rejection === \"stale\") provider.deleteRepresentation?.(exactKey);\n\t\t\tresolved.push({\n\t\t\t\t...candidate,\n\t\t\t\tcache: { hit: false, key: exactKey, keyKind: \"exact\", rejectedReason: rejection },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tresolved.push({\n\t\t\t...candidate,\n\t\t\tcache: { hit: true, key: exactKey, keyKind: cached.entry.keyKind ?? \"exact\", layer: cached.layer },\n\t\t\tcompressorId: cached.entry.compressorId,\n\t\t\testimatedTokens: cached.entry.estimatedTokens,\n\t\t\tfidelity: cached.entry.fidelity,\n\t\t\tsourceRef: cached.entry.sourceRef ?? candidate.sourceRef,\n\t\t\tsummaryHash: cached.entry.summaryHash,\n\t\t\ttext: cached.entry.text,\n\t\t});\n\t}\n\treturn resolved;\n}\n\nfunction readMaterializedRepresentationCacheV2(input: {\n\treadonly cache: ContextBudgetRepresentationCacheRuntimeV2;\n\treadonly candidate: ContextRepresentationCandidateV2;\n\treadonly materializedEnabled: boolean;\n\treadonly provider: ContextBudgetCacheProviderV2;\n\treadonly sourceHash: string;\n}): ContextRepresentationCandidateV2 | undefined {\n\tif (!input.materializedEnabled || !isMaterializableRepresentationV2(input.candidate)) return undefined;\n\tconst key = buildContextBudgetMaterializedRepresentationCandidateKeyV2(\n\t\tinput.cache.keyBase,\n\t\tinput.candidate,\n\t\tinput.sourceHash,\n\t);\n\tconst negative = input.provider.readNegativeRepresentation(key);\n\tif (negative) {\n\t\tinput.cache.telemetry.representationCache.negativeHits += 1;\n\t\treturn undefined;\n\t}\n\tconst cached = input.provider.readRepresentation(key);\n\tif (!cached) return undefined;\n\tconst rejection = validateContextBudgetMaterializedRepresentationCacheEntryV2({\n\t\tcache: input.cache,\n\t\tcached,\n\t\tcandidate: input.candidate,\n\t\tsourceHash: input.sourceHash,\n\t});\n\tif (rejection) {\n\t\trecordRepresentationReject(input.cache.telemetry, rejection);\n\t\tif (rejection === \"stale\") input.provider.deleteRepresentation?.(key);\n\t\treturn { ...input.candidate, cache: { hit: false, key, keyKind: \"materialized\", rejectedReason: rejection } };\n\t}\n\treturn {\n\t\t...input.candidate,\n\t\tcache: { hit: true, key, keyKind: \"materialized\", layer: cached.layer },\n\t\tcompressorId: cached.entry.compressorId,\n\t\testimatedTokens: cached.entry.estimatedTokens,\n\t\tfidelity: cached.entry.fidelity,\n\t\tsourceRef: cached.entry.sourceRef ?? input.candidate.sourceRef,\n\t\tsummaryHash: cached.entry.summaryHash,\n\t\ttext: cached.entry.text,\n\t};\n}\n\nexport function writeRepresentationCacheV2(input: {\n\treadonly planned: PlannedItemV2;\n\treadonly selected: ContextRepresentationCandidateV2;\n\treadonly cache: ContextBudgetRepresentationCacheRuntimeV2;\n\treadonly materializedEnabled?: boolean;\n}): void {\n\tif (!input.cache.provider || input.selected.kind === \"omit\" || input.selected.cache?.hit === true) return;\n\tconst sourceHash = input.planned.contentHash;\n\tconst exactKey =\n\t\tinput.selected.cache?.keyKind === \"exact\" && input.selected.cache.key !== undefined\n\t\t\t? input.selected.cache.key\n\t\t\t: buildContextBudgetRepresentationCandidateKeyV2(input.cache.keyBase, input.selected, sourceHash);\n\tinput.cache.provider.writeRepresentation({\n\t\tkey: exactKey,\n\t\tentry: {\n\t\t\tcompressorId: input.selected.compressorId,\n\t\t\tcreatedAtEpochMs: input.cache.nowEpochMs,\n\t\t\testimatedTokens: input.selected.estimatedTokens,\n\t\t\tfidelity: input.selected.fidelity,\n\t\t\tkeyKind: \"exact\",\n\t\t\tkind: input.selected.kind,\n\t\t\tmodelId: input.cache.keyBase.modelId,\n\t\t\tpolicyVersion: input.cache.keyBase.policyVersion,\n\t\t\trepresentationFingerprint: computeContextBudgetRepresentationFingerprintV2(input.selected),\n\t\t\tsourceHash,\n\t\t\tsourceRef: input.selected.sourceRef,\n\t\t\tsummaryHash: input.selected.summaryHash,\n\t\t\ttext: input.selected.text,\n\t\t\ttokenizerId: input.cache.keyBase.tokenizerId,\n\t\t},\n\t});\n\tinput.cache.telemetry.representationCache.writes += 1;\n\tif (input.materializedEnabled === true && isMaterializableRepresentationV2(input.selected)) {\n\t\tinput.cache.provider.writeRepresentation({\n\t\t\tkey: buildContextBudgetMaterializedRepresentationCandidateKeyV2(\n\t\t\t\tinput.cache.keyBase,\n\t\t\t\tinput.selected,\n\t\t\t\tsourceHash,\n\t\t\t),\n\t\t\tentry: {\n\t\t\t\tcompressorId: input.selected.compressorId,\n\t\t\t\tcompressorPolicyHash: input.cache.keyBase.compressorPolicyHash,\n\t\t\t\tcreatedAtEpochMs: input.cache.nowEpochMs,\n\t\t\t\testimatedTokens: input.selected.estimatedTokens,\n\t\t\t\tfidelity: input.selected.fidelity,\n\t\t\t\tkeyKind: \"materialized\",\n\t\t\t\tkind: input.selected.kind,\n\t\t\t\tmodelId: input.cache.keyBase.modelId,\n\t\t\t\toutputTextHash: computeContextBudgetOutputTextHashV2(input.selected.text),\n\t\t\t\tpolicyVersion: input.cache.keyBase.policyVersion,\n\t\t\t\tqualityPolicyHash: input.cache.keyBase.qualityPolicyHash,\n\t\t\t\tqueryIntentCluster: input.cache.keyBase.queryIntentCluster,\n\t\t\t\trepresentationFingerprint: computeContextBudgetRepresentationFingerprintV2(input.selected),\n\t\t\t\tsourceHash,\n\t\t\t\tsourceRef: input.selected.sourceRef,\n\t\t\t\tsummaryHash: input.selected.summaryHash,\n\t\t\t\ttargetTokenBucket: computeContextBudgetTargetTokenBucketV2(input.selected.estimatedTokens),\n\t\t\t\ttext: input.selected.text,\n\t\t\t\ttokenizerId: input.cache.keyBase.tokenizerId,\n\t\t\t\tverification: {\n\t\t\t\t\tpoisonScore: 0,\n\t\t\t\t\tqueryCoverage: 1,\n\t\t\t\t\tsecretLeakScore: 0,\n\t\t\t\t\tsourceCoverage: 1,\n\t\t\t\t\tvalidatorVersion: \"context-budget-v2-heuristic\",\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t\tinput.cache.telemetry.representationCache.writes += 1;\n\t}\n}\n\nexport function isMaterializableRepresentationV2(candidate: ContextRepresentationCandidateV2): boolean {\n\treturn candidate.kind === \"summary\" || candidate.kind === \"headroom-compressed\";\n}\n\nfunction recordRepresentationReject(telemetry: MutableTokenCacheTelemetryV2, rejection: string): void {\n\tif (rejection === \"stale\") {\n\t\ttelemetry.representationCache.staleRejects += 1;\n\t} else {\n\t\ttelemetry.representationCache.poisonRejects += 1;\n\t}\n}\n"]}