@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.
- package/dist/src/adaptive/index.d.ts +6 -0
- package/dist/src/adaptive/index.d.ts.map +1 -1
- package/dist/src/adaptive/index.js +8 -0
- package/dist/src/adaptive/index.js.map +1 -1
- package/dist/src/adaptive/kv-cache-sim.d.ts +128 -0
- package/dist/src/adaptive/kv-cache-sim.d.ts.map +1 -0
- package/dist/src/adaptive/kv-cache-sim.js +0 -0
- package/dist/src/adaptive/kv-cache-sim.js.map +1 -0
- package/dist/src/adaptive/kv-control.d.ts +166 -0
- package/dist/src/adaptive/kv-control.d.ts.map +1 -0
- package/dist/src/adaptive/kv-control.js +434 -0
- package/dist/src/adaptive/kv-control.js.map +1 -0
- package/dist/src/adaptive/kv-replay.d.ts +76 -0
- package/dist/src/adaptive/kv-replay.d.ts.map +1 -0
- package/dist/src/adaptive/kv-replay.js +175 -0
- package/dist/src/adaptive/kv-replay.js.map +1 -0
- package/dist/src/adaptive/picker.d.ts +13 -0
- package/dist/src/adaptive/picker.d.ts.map +1 -1
- package/dist/src/adaptive/picker.js.map +1 -1
- package/dist/src/adaptive/render-offsets.d.ts +61 -0
- package/dist/src/adaptive/render-offsets.d.ts.map +1 -0
- package/dist/src/adaptive/render-offsets.js +88 -0
- package/dist/src/adaptive/render-offsets.js.map +1 -0
- package/dist/src/adaptive/strategies/kv-stable.d.ts +48 -0
- package/dist/src/adaptive/strategies/kv-stable.d.ts.map +1 -0
- package/dist/src/adaptive/strategies/kv-stable.js +153 -0
- package/dist/src/adaptive/strategies/kv-stable.js.map +1 -0
- package/dist/src/adaptive/summary-tree.d.ts +98 -0
- package/dist/src/adaptive/summary-tree.d.ts.map +1 -0
- package/dist/src/adaptive/summary-tree.js +214 -0
- package/dist/src/adaptive/summary-tree.js.map +1 -0
- package/dist/src/context-log.d.ts.map +1 -1
- package/dist/src/context-log.js +7 -2
- package/dist/src/context-log.js.map +1 -1
- package/dist/src/context-manager.d.ts +10 -5
- package/dist/src/context-manager.d.ts.map +1 -1
- package/dist/src/context-manager.js +9 -0
- package/dist/src/context-manager.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/message-store.js +1 -1
- package/dist/src/message-store.js.map +1 -1
- package/dist/src/phase-channel.d.ts +13 -0
- package/dist/src/phase-channel.d.ts.map +1 -0
- package/dist/src/phase-channel.js +55 -0
- package/dist/src/phase-channel.js.map +1 -0
- package/dist/src/strategies/autobiographical.d.ts +107 -44
- package/dist/src/strategies/autobiographical.d.ts.map +1 -1
- package/dist/src/strategies/autobiographical.js +437 -230
- package/dist/src/strategies/autobiographical.js.map +1 -1
- package/dist/src/types/index.d.ts +1 -1
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/types/index.js.map +1 -1
- package/dist/src/types/strategy.d.ts +70 -7
- package/dist/src/types/strategy.d.ts.map +1 -1
- package/dist/src/types/strategy.js +2 -0
- package/dist/src/types/strategy.js.map +1 -1
- package/dist/test/adaptive/kv-cache-sim.test.d.ts +16 -0
- package/dist/test/adaptive/kv-cache-sim.test.d.ts.map +1 -0
- package/dist/test/adaptive/kv-cache-sim.test.js +173 -0
- package/dist/test/adaptive/kv-cache-sim.test.js.map +1 -0
- package/dist/test/adaptive/kv-control.test.d.ts +14 -0
- package/dist/test/adaptive/kv-control.test.d.ts.map +1 -0
- package/dist/test/adaptive/kv-control.test.js +130 -0
- package/dist/test/adaptive/kv-control.test.js.map +1 -0
- package/dist/test/adaptive/kv-replay.test.d.ts +15 -0
- package/dist/test/adaptive/kv-replay.test.d.ts.map +1 -0
- package/dist/test/adaptive/kv-replay.test.js +112 -0
- package/dist/test/adaptive/kv-replay.test.js.map +1 -0
- package/dist/test/adaptive/kv-stable-strategy.test.d.ts +10 -0
- package/dist/test/adaptive/kv-stable-strategy.test.d.ts.map +1 -0
- package/dist/test/adaptive/kv-stable-strategy.test.js +89 -0
- package/dist/test/adaptive/kv-stable-strategy.test.js.map +1 -0
- package/dist/test/adaptive/pin-at-level.test.d.ts +16 -0
- package/dist/test/adaptive/pin-at-level.test.d.ts.map +1 -0
- package/dist/test/adaptive/pin-at-level.test.js +133 -0
- package/dist/test/adaptive/pin-at-level.test.js.map +1 -0
- package/dist/test/adaptive/render-offsets.test.d.ts +11 -0
- package/dist/test/adaptive/render-offsets.test.d.ts.map +1 -0
- package/dist/test/adaptive/render-offsets.test.js +85 -0
- package/dist/test/adaptive/render-offsets.test.js.map +1 -0
- package/dist/test/adaptive/summary-tree.test.d.ts +5 -0
- package/dist/test/adaptive/summary-tree.test.d.ts.map +1 -0
- package/dist/test/adaptive/summary-tree.test.js +72 -0
- package/dist/test/adaptive/summary-tree.test.js.map +1 -0
- package/dist/test/image-strip-render-stats.test.d.ts +2 -0
- package/dist/test/image-strip-render-stats.test.d.ts.map +1 -0
- package/dist/test/image-strip-render-stats.test.js +130 -0
- package/dist/test/image-strip-render-stats.test.js.map +1 -0
- package/dist/test/image-stripping.test.d.ts +13 -0
- package/dist/test/image-stripping.test.d.ts.map +1 -0
- package/dist/test/image-stripping.test.js +104 -0
- package/dist/test/image-stripping.test.js.map +1 -0
- package/dist/test/pins.test.js +40 -0
- package/dist/test/pins.test.js.map +1 -1
- package/dist/test/render-stats.test.d.ts +2 -0
- package/dist/test/render-stats.test.d.ts.map +1 -0
- package/dist/test/render-stats.test.js +91 -0
- package/dist/test/render-stats.test.js.map +1 -0
- package/dist/test/speculation-cap.test.d.ts +9 -3
- package/dist/test/speculation-cap.test.d.ts.map +1 -1
- package/dist/test/speculation-cap.test.js +175 -3
- package/dist/test/speculation-cap.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/adaptive/index.ts +48 -0
- package/src/adaptive/kv-cache-sim.ts +0 -0
- package/src/adaptive/kv-control.ts +574 -0
- package/src/adaptive/kv-replay.ts +238 -0
- package/src/adaptive/picker.ts +13 -0
- package/src/adaptive/render-offsets.ts +116 -0
- package/src/adaptive/strategies/kv-stable.ts +161 -0
- package/src/adaptive/summary-tree.ts +252 -0
- package/src/context-log.ts +7 -2
- package/src/context-manager.ts +13 -2
- package/src/index.ts +3 -0
- package/src/message-store.ts +1 -1
- package/src/phase-channel.ts +57 -0
- package/src/strategies/autobiographical.ts +453 -282
- package/src/types/index.ts +1 -0
- package/src/types/strategy.ts +71 -3
package/src/types/index.ts
CHANGED
package/src/types/strategy.ts
CHANGED
|
@@ -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?:
|
|
190
|
-
markDocument(messageId: string, opts?:
|
|
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
|
};
|