@animalabs/context-manager 0.5.2 → 0.5.4

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 (110) hide show
  1. package/dist/src/adaptive/index.d.ts +6 -0
  2. package/dist/src/adaptive/index.d.ts.map +1 -1
  3. package/dist/src/adaptive/index.js +8 -0
  4. package/dist/src/adaptive/index.js.map +1 -1
  5. package/dist/src/adaptive/kv-cache-sim.d.ts +128 -0
  6. package/dist/src/adaptive/kv-cache-sim.d.ts.map +1 -0
  7. package/dist/src/adaptive/kv-cache-sim.js +0 -0
  8. package/dist/src/adaptive/kv-cache-sim.js.map +1 -0
  9. package/dist/src/adaptive/kv-control.d.ts +152 -0
  10. package/dist/src/adaptive/kv-control.d.ts.map +1 -0
  11. package/dist/src/adaptive/kv-control.js +368 -0
  12. package/dist/src/adaptive/kv-control.js.map +1 -0
  13. package/dist/src/adaptive/kv-replay.d.ts +76 -0
  14. package/dist/src/adaptive/kv-replay.d.ts.map +1 -0
  15. package/dist/src/adaptive/kv-replay.js +175 -0
  16. package/dist/src/adaptive/kv-replay.js.map +1 -0
  17. package/dist/src/adaptive/render-offsets.d.ts +61 -0
  18. package/dist/src/adaptive/render-offsets.d.ts.map +1 -0
  19. package/dist/src/adaptive/render-offsets.js +88 -0
  20. package/dist/src/adaptive/render-offsets.js.map +1 -0
  21. package/dist/src/adaptive/strategies/kv-stable.d.ts +48 -0
  22. package/dist/src/adaptive/strategies/kv-stable.d.ts.map +1 -0
  23. package/dist/src/adaptive/strategies/kv-stable.js +102 -0
  24. package/dist/src/adaptive/strategies/kv-stable.js.map +1 -0
  25. package/dist/src/adaptive/summary-tree.d.ts +98 -0
  26. package/dist/src/adaptive/summary-tree.d.ts.map +1 -0
  27. package/dist/src/adaptive/summary-tree.js +214 -0
  28. package/dist/src/adaptive/summary-tree.js.map +1 -0
  29. package/dist/src/context-log.d.ts.map +1 -1
  30. package/dist/src/context-log.js +7 -2
  31. package/dist/src/context-log.js.map +1 -1
  32. package/dist/src/index.d.ts +1 -1
  33. package/dist/src/index.d.ts.map +1 -1
  34. package/dist/src/index.js +1 -1
  35. package/dist/src/index.js.map +1 -1
  36. package/dist/src/message-store.js +1 -1
  37. package/dist/src/message-store.js.map +1 -1
  38. package/dist/src/normalize-tool-messages.d.ts +33 -0
  39. package/dist/src/normalize-tool-messages.d.ts.map +1 -1
  40. package/dist/src/normalize-tool-messages.js +59 -0
  41. package/dist/src/normalize-tool-messages.js.map +1 -1
  42. package/dist/src/strategies/autobiographical.d.ts +101 -39
  43. package/dist/src/strategies/autobiographical.d.ts.map +1 -1
  44. package/dist/src/strategies/autobiographical.js +398 -222
  45. package/dist/src/strategies/autobiographical.js.map +1 -1
  46. package/dist/src/types/strategy.d.ts +40 -1
  47. package/dist/src/types/strategy.d.ts.map +1 -1
  48. package/dist/src/types/strategy.js +2 -0
  49. package/dist/src/types/strategy.js.map +1 -1
  50. package/dist/test/adaptive/kv-cache-sim.test.d.ts +16 -0
  51. package/dist/test/adaptive/kv-cache-sim.test.d.ts.map +1 -0
  52. package/dist/test/adaptive/kv-cache-sim.test.js +173 -0
  53. package/dist/test/adaptive/kv-cache-sim.test.js.map +1 -0
  54. package/dist/test/adaptive/kv-control.test.d.ts +14 -0
  55. package/dist/test/adaptive/kv-control.test.d.ts.map +1 -0
  56. package/dist/test/adaptive/kv-control.test.js +130 -0
  57. package/dist/test/adaptive/kv-control.test.js.map +1 -0
  58. package/dist/test/adaptive/kv-replay.test.d.ts +15 -0
  59. package/dist/test/adaptive/kv-replay.test.d.ts.map +1 -0
  60. package/dist/test/adaptive/kv-replay.test.js +112 -0
  61. package/dist/test/adaptive/kv-replay.test.js.map +1 -0
  62. package/dist/test/adaptive/kv-stable-strategy.test.d.ts +10 -0
  63. package/dist/test/adaptive/kv-stable-strategy.test.d.ts.map +1 -0
  64. package/dist/test/adaptive/kv-stable-strategy.test.js +89 -0
  65. package/dist/test/adaptive/kv-stable-strategy.test.js.map +1 -0
  66. package/dist/test/adaptive/render-offsets.test.d.ts +11 -0
  67. package/dist/test/adaptive/render-offsets.test.d.ts.map +1 -0
  68. package/dist/test/adaptive/render-offsets.test.js +85 -0
  69. package/dist/test/adaptive/render-offsets.test.js.map +1 -0
  70. package/dist/test/adaptive/summary-tree.test.d.ts +5 -0
  71. package/dist/test/adaptive/summary-tree.test.d.ts.map +1 -0
  72. package/dist/test/adaptive/summary-tree.test.js +72 -0
  73. package/dist/test/adaptive/summary-tree.test.js.map +1 -0
  74. package/dist/test/chunker-tool-boundary.test.d.ts +12 -0
  75. package/dist/test/chunker-tool-boundary.test.d.ts.map +1 -0
  76. package/dist/test/chunker-tool-boundary.test.js +89 -0
  77. package/dist/test/chunker-tool-boundary.test.js.map +1 -0
  78. package/dist/test/compression-shape-invariants.test.d.ts +22 -0
  79. package/dist/test/compression-shape-invariants.test.d.ts.map +1 -0
  80. package/dist/test/compression-shape-invariants.test.js +312 -0
  81. package/dist/test/compression-shape-invariants.test.js.map +1 -0
  82. package/dist/test/image-strip-render-stats.test.d.ts +2 -0
  83. package/dist/test/image-strip-render-stats.test.d.ts.map +1 -0
  84. package/dist/test/image-strip-render-stats.test.js +130 -0
  85. package/dist/test/image-strip-render-stats.test.js.map +1 -0
  86. package/dist/test/image-stripping.test.d.ts +13 -0
  87. package/dist/test/image-stripping.test.d.ts.map +1 -0
  88. package/dist/test/image-stripping.test.js +104 -0
  89. package/dist/test/image-stripping.test.js.map +1 -0
  90. package/dist/test/normalize-tool-messages.test.js +61 -1
  91. package/dist/test/normalize-tool-messages.test.js.map +1 -1
  92. package/dist/test/render-stats.test.d.ts +2 -0
  93. package/dist/test/render-stats.test.d.ts.map +1 -0
  94. package/dist/test/render-stats.test.js +91 -0
  95. package/dist/test/render-stats.test.js.map +1 -0
  96. package/dist/tsconfig.tsbuildinfo +1 -1
  97. package/package.json +2 -2
  98. package/src/adaptive/index.ts +48 -0
  99. package/src/adaptive/kv-cache-sim.ts +0 -0
  100. package/src/adaptive/kv-control.ts +497 -0
  101. package/src/adaptive/kv-replay.ts +238 -0
  102. package/src/adaptive/render-offsets.ts +116 -0
  103. package/src/adaptive/strategies/kv-stable.ts +123 -0
  104. package/src/adaptive/summary-tree.ts +252 -0
  105. package/src/context-log.ts +7 -2
  106. package/src/index.ts +1 -1
  107. package/src/message-store.ts +1 -1
  108. package/src/normalize-tool-messages.ts +61 -0
  109. package/src/strategies/autobiographical.ts +414 -271
  110. package/src/types/strategy.ts +40 -1
@@ -258,12 +258,25 @@ export function isSearchableStrategy(s: ContextStrategy): s is SearchableStrateg
258
258
  export interface RenderStats {
259
259
  head: { messages: number; tokens: number };
260
260
  tail: { messages: number; tokens: number };
261
+ /**
262
+ * Raw (L0) messages the renderer kept verbatim in the MIDDLE region — i.e.
263
+ * neither head nor tail. Under adaptive resolution the picker routinely keeps
264
+ * older messages raw at a resolution gradient; these are real context tokens
265
+ * that the head/tail/summary buckets don't capture. (Empty for a pure
266
+ * hierarchical render with no pinned/uncompressed-middle messages.)
267
+ */
268
+ middleRaw: { messages: number; tokens: number };
261
269
  summaries: {
262
270
  l1: { count: number; tokens: number };
263
271
  l2: { count: number; tokens: number };
264
272
  l3: { count: number; tokens: number };
265
273
  };
266
274
  pending: { chunks: number; merges: number };
275
+ /**
276
+ * Sum across all buckets — the actual rendered context size. A summary is a
277
+ * Q/A pair, so it counts as 2 messages here.
278
+ */
279
+ total: { messages: number; tokens: number };
267
280
  }
268
281
 
269
282
  /**
@@ -316,6 +329,19 @@ export interface AutobiographicalConfig {
316
329
  * this limit have their text/tool_result content truncated. 0 = no limit. */
317
330
  maxMessageTokens: number;
318
331
 
332
+ // --- Live image policy ---
333
+
334
+ /** Maximum number of images kept "live" (sent as real image blocks) in the
335
+ * compiled context. Counted newest-first across the whole window; images
336
+ * beyond this many are replaced with a text placeholder. 0 = unlimited.
337
+ * A hard ceiling for dense bursts that pack many images into the live window. */
338
+ maxLiveImages?: number;
339
+ /** Token depth from the newest message beyond which images are stripped to a
340
+ * text placeholder, even though the surrounding text stays verbatim. Measured
341
+ * the same way as recentWindowTokens (cumulative tokens walked from the tail).
342
+ * Typically much shallower than recentWindowTokens. 0 = never strip by depth. */
343
+ imageStripDepthTokens?: number;
344
+
319
345
  // Legacy aliases (deprecated, use summary* instead)
320
346
  /** @deprecated Use summarySystemPrompt */
321
347
  diarySystemPrompt?: string;
@@ -453,9 +479,20 @@ export interface AutobiographicalConfig {
453
479
  * Folding strategy name when adaptiveResolution is on. One of:
454
480
  * 'flat-profile' (default) — level-equalizing
455
481
  * 'oldest-first' — chronological
482
+ * 'kv-stable' — the KV-stable context controller: minimizes real prefix
483
+ * churn directly (flat zone + per-turn reach cap; no λ). Built per-compile
484
+ * from the live PickerInputs. See docs/kv-stable-context-control.md.
456
485
  * Custom strategies can be plugged in by the host application.
457
486
  */
458
- foldingStrategy?: 'flat-profile' | 'oldest-first';
487
+ foldingStrategy?: 'flat-profile' | 'oldest-first' | 'kv-stable';
488
+
489
+ /**
490
+ * Per-turn divergence reach (tokens) for `foldingStrategy: 'kv-stable'` — the
491
+ * structural KV-perturbation cap P. Smaller = gentler per-turn cache churn but
492
+ * less efficient compression; exceeded only to stay under the hard budget.
493
+ * Default: unbounded within the budget.
494
+ */
495
+ kvStableReachTokens?: number;
459
496
 
460
497
  /**
461
498
  * Slack ratio (hysteresis) for the picker. The picker folds until total
@@ -623,6 +660,8 @@ Write naturally, as recollection of what you experienced.`,
623
660
  summaryContextLabel: 'What do you remember from earlier?',
624
661
  summaryParticipant: 'Claude',
625
662
  maxMessageTokens: 0,
663
+ maxLiveImages: 6,
664
+ imageStripDepthTokens: 30000,
626
665
  positionedRecallPairs: true,
627
666
  recallHeaderTemplate: '[Recall {id}]',
628
667
  };