@animalabs/context-manager 0.5.3 → 0.5.5

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 (123) 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 +166 -0
  10. package/dist/src/adaptive/kv-control.d.ts.map +1 -0
  11. package/dist/src/adaptive/kv-control.js +434 -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/picker.d.ts +13 -0
  18. package/dist/src/adaptive/picker.d.ts.map +1 -1
  19. package/dist/src/adaptive/picker.js.map +1 -1
  20. package/dist/src/adaptive/render-offsets.d.ts +61 -0
  21. package/dist/src/adaptive/render-offsets.d.ts.map +1 -0
  22. package/dist/src/adaptive/render-offsets.js +88 -0
  23. package/dist/src/adaptive/render-offsets.js.map +1 -0
  24. package/dist/src/adaptive/strategies/kv-stable.d.ts +48 -0
  25. package/dist/src/adaptive/strategies/kv-stable.d.ts.map +1 -0
  26. package/dist/src/adaptive/strategies/kv-stable.js +153 -0
  27. package/dist/src/adaptive/strategies/kv-stable.js.map +1 -0
  28. package/dist/src/adaptive/summary-tree.d.ts +98 -0
  29. package/dist/src/adaptive/summary-tree.d.ts.map +1 -0
  30. package/dist/src/adaptive/summary-tree.js +214 -0
  31. package/dist/src/adaptive/summary-tree.js.map +1 -0
  32. package/dist/src/context-log.d.ts.map +1 -1
  33. package/dist/src/context-log.js +7 -2
  34. package/dist/src/context-log.js.map +1 -1
  35. package/dist/src/context-manager.d.ts +10 -5
  36. package/dist/src/context-manager.d.ts.map +1 -1
  37. package/dist/src/context-manager.js +9 -0
  38. package/dist/src/context-manager.js.map +1 -1
  39. package/dist/src/index.d.ts +1 -0
  40. package/dist/src/index.d.ts.map +1 -1
  41. package/dist/src/index.js +2 -0
  42. package/dist/src/index.js.map +1 -1
  43. package/dist/src/message-store.js +1 -1
  44. package/dist/src/message-store.js.map +1 -1
  45. package/dist/src/phase-channel.d.ts +13 -0
  46. package/dist/src/phase-channel.d.ts.map +1 -0
  47. package/dist/src/phase-channel.js +55 -0
  48. package/dist/src/phase-channel.js.map +1 -0
  49. package/dist/src/strategies/autobiographical.d.ts +107 -44
  50. package/dist/src/strategies/autobiographical.d.ts.map +1 -1
  51. package/dist/src/strategies/autobiographical.js +437 -230
  52. package/dist/src/strategies/autobiographical.js.map +1 -1
  53. package/dist/src/types/index.d.ts +1 -1
  54. package/dist/src/types/index.d.ts.map +1 -1
  55. package/dist/src/types/index.js.map +1 -1
  56. package/dist/src/types/strategy.d.ts +70 -7
  57. package/dist/src/types/strategy.d.ts.map +1 -1
  58. package/dist/src/types/strategy.js +2 -0
  59. package/dist/src/types/strategy.js.map +1 -1
  60. package/dist/test/adaptive/kv-cache-sim.test.d.ts +16 -0
  61. package/dist/test/adaptive/kv-cache-sim.test.d.ts.map +1 -0
  62. package/dist/test/adaptive/kv-cache-sim.test.js +173 -0
  63. package/dist/test/adaptive/kv-cache-sim.test.js.map +1 -0
  64. package/dist/test/adaptive/kv-control.test.d.ts +14 -0
  65. package/dist/test/adaptive/kv-control.test.d.ts.map +1 -0
  66. package/dist/test/adaptive/kv-control.test.js +130 -0
  67. package/dist/test/adaptive/kv-control.test.js.map +1 -0
  68. package/dist/test/adaptive/kv-replay.test.d.ts +15 -0
  69. package/dist/test/adaptive/kv-replay.test.d.ts.map +1 -0
  70. package/dist/test/adaptive/kv-replay.test.js +112 -0
  71. package/dist/test/adaptive/kv-replay.test.js.map +1 -0
  72. package/dist/test/adaptive/kv-stable-strategy.test.d.ts +10 -0
  73. package/dist/test/adaptive/kv-stable-strategy.test.d.ts.map +1 -0
  74. package/dist/test/adaptive/kv-stable-strategy.test.js +89 -0
  75. package/dist/test/adaptive/kv-stable-strategy.test.js.map +1 -0
  76. package/dist/test/adaptive/pin-at-level.test.d.ts +16 -0
  77. package/dist/test/adaptive/pin-at-level.test.d.ts.map +1 -0
  78. package/dist/test/adaptive/pin-at-level.test.js +133 -0
  79. package/dist/test/adaptive/pin-at-level.test.js.map +1 -0
  80. package/dist/test/adaptive/render-offsets.test.d.ts +11 -0
  81. package/dist/test/adaptive/render-offsets.test.d.ts.map +1 -0
  82. package/dist/test/adaptive/render-offsets.test.js +85 -0
  83. package/dist/test/adaptive/render-offsets.test.js.map +1 -0
  84. package/dist/test/adaptive/summary-tree.test.d.ts +5 -0
  85. package/dist/test/adaptive/summary-tree.test.d.ts.map +1 -0
  86. package/dist/test/adaptive/summary-tree.test.js +72 -0
  87. package/dist/test/adaptive/summary-tree.test.js.map +1 -0
  88. package/dist/test/image-strip-render-stats.test.d.ts +2 -0
  89. package/dist/test/image-strip-render-stats.test.d.ts.map +1 -0
  90. package/dist/test/image-strip-render-stats.test.js +130 -0
  91. package/dist/test/image-strip-render-stats.test.js.map +1 -0
  92. package/dist/test/image-stripping.test.d.ts +13 -0
  93. package/dist/test/image-stripping.test.d.ts.map +1 -0
  94. package/dist/test/image-stripping.test.js +104 -0
  95. package/dist/test/image-stripping.test.js.map +1 -0
  96. package/dist/test/pins.test.js +40 -0
  97. package/dist/test/pins.test.js.map +1 -1
  98. package/dist/test/render-stats.test.d.ts +2 -0
  99. package/dist/test/render-stats.test.d.ts.map +1 -0
  100. package/dist/test/render-stats.test.js +91 -0
  101. package/dist/test/render-stats.test.js.map +1 -0
  102. package/dist/test/speculation-cap.test.d.ts +9 -3
  103. package/dist/test/speculation-cap.test.d.ts.map +1 -1
  104. package/dist/test/speculation-cap.test.js +175 -3
  105. package/dist/test/speculation-cap.test.js.map +1 -1
  106. package/dist/tsconfig.tsbuildinfo +1 -1
  107. package/package.json +2 -2
  108. package/src/adaptive/index.ts +48 -0
  109. package/src/adaptive/kv-cache-sim.ts +0 -0
  110. package/src/adaptive/kv-control.ts +574 -0
  111. package/src/adaptive/kv-replay.ts +238 -0
  112. package/src/adaptive/picker.ts +13 -0
  113. package/src/adaptive/render-offsets.ts +116 -0
  114. package/src/adaptive/strategies/kv-stable.ts +161 -0
  115. package/src/adaptive/summary-tree.ts +252 -0
  116. package/src/context-log.ts +7 -2
  117. package/src/context-manager.ts +13 -2
  118. package/src/index.ts +3 -0
  119. package/src/message-store.ts +1 -1
  120. package/src/phase-channel.ts +57 -0
  121. package/src/strategies/autobiographical.ts +453 -282
  122. package/src/types/index.ts +1 -0
  123. package/src/types/strategy.ts +71 -3
@@ -38,6 +38,7 @@ export type {
38
38
  KnowledgeConfig,
39
39
  ResettableStrategy,
40
40
  ProtectedRange,
41
+ PinLevelOptions,
41
42
  SearchQuery,
42
43
  SearchResult,
43
44
  SearchableStrategy,
@@ -186,8 +186,8 @@ export function isResettableStrategy(s: ContextStrategy): s is ResettableStrateg
186
186
  * original chronological position. Implemented by AutobiographicalStrategy.
187
187
  */
188
188
  export interface PinnableStrategy extends ContextStrategy {
189
- pinRange(firstMessageId: string, lastMessageId: string, opts?: { name?: string }): string;
190
- markDocument(messageId: string, opts?: { name?: string }): string;
189
+ pinRange(firstMessageId: string, lastMessageId: string, opts?: PinLevelOptions): string;
190
+ markDocument(messageId: string, opts?: PinLevelOptions): string;
191
191
  unpin(pinId: string): boolean;
192
192
  listPins(): ReadonlyArray<ProtectedRange>;
193
193
  }
@@ -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
@@ -559,6 +596,35 @@ export interface ProtectedRange {
559
596
  name?: string;
560
597
  /** Creation timestamp (ms since epoch). */
561
598
  created: number;
599
+ /**
600
+ * Pin-AT-level-k (V2 dynamic pins, `docs/best-fit-frontier-resolution.md` §7).
601
+ * Fix the covered chunks to render at EXACTLY this fold level (0 = raw): the
602
+ * frontier cut passes through the L_k node — neither folded deeper nor
603
+ * un-folded shallower. When set, this range is NOT a classic force-raw pin.
604
+ * Takes precedence over `maxLevel`. Omitted → not a fixed-level pin.
605
+ *
606
+ * Honored only by the KV-stable controller (`foldingStrategy: 'kv-stable'`);
607
+ * other strategies fall back to treating the range as raw (a safe superset).
608
+ */
609
+ level?: number;
610
+ /**
611
+ * Pin-max-level (V2 dynamic pins): the covered chunks may fold no DEEPER than
612
+ * this level — raw..L_k allowed, deeper forbidden — a hard cap honored even
613
+ * under the window-pressure emergency. `maxLevel: 0` ≡ classic pin-raw.
614
+ * Ignored when `level` is set. Omitted → this pin imposes no depth cap.
615
+ *
616
+ * Honored only by the KV-stable controller; see `level`.
617
+ */
618
+ maxLevel?: number;
619
+ }
620
+
621
+ /** Optional fold-depth bounds for a V2 dynamic pin (see `ProtectedRange`). */
622
+ export interface PinLevelOptions {
623
+ name?: string;
624
+ /** Pin AT exactly this level (0 = raw). Fixes the cut through the L_k node. */
625
+ level?: number;
626
+ /** Fold no deeper than this level (hard cap; `0` ≡ classic pin-raw). */
627
+ maxLevel?: number;
562
628
  }
563
629
 
564
630
  /**
@@ -623,6 +689,8 @@ Write naturally, as recollection of what you experienced.`,
623
689
  summaryContextLabel: 'What do you remember from earlier?',
624
690
  summaryParticipant: 'Claude',
625
691
  maxMessageTokens: 0,
692
+ maxLiveImages: 6,
693
+ imageStripDepthTokens: 30000,
626
694
  positionedRecallPairs: true,
627
695
  recallHeaderTemplate: '[Recall {id}]',
628
696
  };