@animalabs/context-manager 0.1.0

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 (83) hide show
  1. package/dist/src/blob-manager.d.ts +37 -0
  2. package/dist/src/blob-manager.d.ts.map +1 -0
  3. package/dist/src/blob-manager.js +128 -0
  4. package/dist/src/blob-manager.js.map +1 -0
  5. package/dist/src/context-log.d.ts +99 -0
  6. package/dist/src/context-log.d.ts.map +1 -0
  7. package/dist/src/context-log.js +277 -0
  8. package/dist/src/context-log.js.map +1 -0
  9. package/dist/src/context-manager.d.ts +245 -0
  10. package/dist/src/context-manager.d.ts.map +1 -0
  11. package/dist/src/context-manager.js +553 -0
  12. package/dist/src/context-manager.js.map +1 -0
  13. package/dist/src/index.d.ts +12 -0
  14. package/dist/src/index.d.ts.map +1 -0
  15. package/dist/src/index.js +12 -0
  16. package/dist/src/index.js.map +1 -0
  17. package/dist/src/message-store.d.ts +135 -0
  18. package/dist/src/message-store.d.ts.map +1 -0
  19. package/dist/src/message-store.js +372 -0
  20. package/dist/src/message-store.js.map +1 -0
  21. package/dist/src/strategies/autobiographical.d.ts +199 -0
  22. package/dist/src/strategies/autobiographical.d.ts.map +1 -0
  23. package/dist/src/strategies/autobiographical.js +1122 -0
  24. package/dist/src/strategies/autobiographical.js.map +1 -0
  25. package/dist/src/strategies/index.d.ts +3 -0
  26. package/dist/src/strategies/index.d.ts.map +1 -0
  27. package/dist/src/strategies/index.js +3 -0
  28. package/dist/src/strategies/index.js.map +1 -0
  29. package/dist/src/strategies/knowledge.d.ts +46 -0
  30. package/dist/src/strategies/knowledge.d.ts.map +1 -0
  31. package/dist/src/strategies/knowledge.js +270 -0
  32. package/dist/src/strategies/knowledge.js.map +1 -0
  33. package/dist/src/strategies/passthrough.d.ts +17 -0
  34. package/dist/src/strategies/passthrough.d.ts.map +1 -0
  35. package/dist/src/strategies/passthrough.js +69 -0
  36. package/dist/src/strategies/passthrough.js.map +1 -0
  37. package/dist/src/types/context.d.ts +108 -0
  38. package/dist/src/types/context.d.ts.map +1 -0
  39. package/dist/src/types/context.js +2 -0
  40. package/dist/src/types/context.js.map +1 -0
  41. package/dist/src/types/index.d.ts +5 -0
  42. package/dist/src/types/index.d.ts.map +1 -0
  43. package/dist/src/types/index.js +2 -0
  44. package/dist/src/types/index.js.map +1 -0
  45. package/dist/src/types/message.d.ts +129 -0
  46. package/dist/src/types/message.d.ts.map +1 -0
  47. package/dist/src/types/message.js +2 -0
  48. package/dist/src/types/message.js.map +1 -0
  49. package/dist/src/types/strategy.d.ts +233 -0
  50. package/dist/src/types/strategy.d.ts.map +1 -0
  51. package/dist/src/types/strategy.js +32 -0
  52. package/dist/src/types/strategy.js.map +1 -0
  53. package/dist/test/autobiographical.test.d.ts +2 -0
  54. package/dist/test/autobiographical.test.d.ts.map +1 -0
  55. package/dist/test/autobiographical.test.js +46 -0
  56. package/dist/test/autobiographical.test.js.map +1 -0
  57. package/dist/test/head-window-reset.test.d.ts +17 -0
  58. package/dist/test/head-window-reset.test.d.ts.map +1 -0
  59. package/dist/test/head-window-reset.test.js +342 -0
  60. package/dist/test/head-window-reset.test.js.map +1 -0
  61. package/dist/test/integration.test.d.ts +2 -0
  62. package/dist/test/integration.test.d.ts.map +1 -0
  63. package/dist/test/integration.test.js +1341 -0
  64. package/dist/test/integration.test.js.map +1 -0
  65. package/dist/test/knowledge.test.d.ts +2 -0
  66. package/dist/test/knowledge.test.d.ts.map +1 -0
  67. package/dist/test/knowledge.test.js +617 -0
  68. package/dist/test/knowledge.test.js.map +1 -0
  69. package/dist/tsconfig.tsbuildinfo +1 -0
  70. package/package.json +48 -0
  71. package/src/blob-manager.ts +155 -0
  72. package/src/context-log.ts +342 -0
  73. package/src/context-manager.ts +726 -0
  74. package/src/index.ts +50 -0
  75. package/src/message-store.ts +479 -0
  76. package/src/strategies/autobiographical.ts +1355 -0
  77. package/src/strategies/index.ts +2 -0
  78. package/src/strategies/knowledge.ts +336 -0
  79. package/src/strategies/passthrough.ts +98 -0
  80. package/src/types/context.ts +119 -0
  81. package/src/types/index.ts +42 -0
  82. package/src/types/message.ts +140 -0
  83. package/src/types/strategy.ts +282 -0
@@ -0,0 +1,199 @@
1
+ import type { ContentBlock } from '@animalabs/membrane';
2
+ import { NativeFormatter } from '@animalabs/membrane';
3
+ import type { ResettableStrategy, StrategyContext, ReadinessState, MessageStoreView, ContextLogView, TokenBudget, ContextEntry, StoredMessage, AutobiographicalConfig, SummaryLevel, SummaryEntry } from '../types/index.js';
4
+ /**
5
+ * Chunk of messages to be compressed.
6
+ */
7
+ export interface Chunk {
8
+ /** Index in the chunk list */
9
+ index: number;
10
+ /** Starting index in the compressible message array (inclusive).
11
+ * Note: this is an index into getCompressibleMessages(), not store.getAll(). */
12
+ startIndex: number;
13
+ /** Ending index in the compressible message array (exclusive).
14
+ * Note: this is an index into getCompressibleMessages(), not store.getAll(). */
15
+ endIndex: number;
16
+ /** Messages in this chunk */
17
+ messages: StoredMessage[];
18
+ /** Estimated token count */
19
+ tokens: number;
20
+ /** Whether this chunk has been compressed */
21
+ compressed: boolean;
22
+ /** The diary entry if compressed (legacy mode) */
23
+ diary?: string;
24
+ /** ID of the L1 SummaryEntry (hierarchical mode) */
25
+ summaryId?: string;
26
+ /** Phase type tag (set by KnowledgeStrategy for semantic chunking) */
27
+ phaseType?: string;
28
+ }
29
+ /**
30
+ * Autobiographical chunking strategy.
31
+ * Compresses old conversation chunks into summaries in the model's own words.
32
+ * Recent context stays untouched.
33
+ *
34
+ * When `hierarchical` is enabled, uses a 3-level compression pyramid:
35
+ * L1 (raw→summary) → L2 (merge N L1s) → L3 (merge N L2s)
36
+ * with anti-redundancy filtering and budget carryover.
37
+ */
38
+ export declare class AutobiographicalStrategy implements ResettableStrategy {
39
+ readonly name: string;
40
+ get maxMessageTokens(): number;
41
+ protected config: AutobiographicalConfig;
42
+ protected chunks: Chunk[];
43
+ protected pendingCompression: Promise<void> | null;
44
+ protected compressionQueue: number[];
45
+ protected _compressionCount: number;
46
+ protected summaries: SummaryEntry[];
47
+ protected summaryIdCounter: number;
48
+ protected mergeQueue: Array<{
49
+ level: SummaryLevel;
50
+ sourceIds: string[];
51
+ }>;
52
+ protected nativeFormatter: NativeFormatter;
53
+ /** Message ID from which the head window starts. null = start from message 0. */
54
+ protected headWindowStartId: string | null;
55
+ /** Cached result of getHeadWindowStartIndex to avoid repeated linear scans. */
56
+ private _cachedHeadStartIndex;
57
+ constructor(config?: Partial<AutobiographicalConfig>);
58
+ initialize(ctx: StrategyContext): Promise<void>;
59
+ checkReadiness(): ReadinessState;
60
+ onNewMessage(message: StoredMessage, ctx: StrategyContext): Promise<void>;
61
+ tick(ctx: StrategyContext): Promise<void>;
62
+ select(store: MessageStoreView, log: ContextLogView, budget: TokenBudget): ContextEntry[];
63
+ /**
64
+ * Get summary statistics for observability.
65
+ */
66
+ getStats(): {
67
+ chunksTotal: number;
68
+ chunksCompressed: number;
69
+ compressionCount: number;
70
+ l1: number;
71
+ l2: number;
72
+ l3: number;
73
+ pendingMerges: number;
74
+ };
75
+ protected selectLegacy(store: MessageStoreView, _log: ContextLogView, budget: TokenBudget): ContextEntry[];
76
+ protected compressChunkLegacy(chunk: Chunk, ctx: StrategyContext): Promise<void>;
77
+ protected buildPriorContextLegacy(chunk: Chunk, ctx: StrategyContext): Array<{
78
+ participant: string;
79
+ content: ContentBlock[];
80
+ }>;
81
+ /**
82
+ * Anti-redundancy filter: get summaries to show, excluding those whose
83
+ * children are all already visible at a lower level.
84
+ *
85
+ * Matches moltbot's gradient exclusion algorithm (worker.ts:293-447).
86
+ */
87
+ protected getAntiRedundantSummaries(excludeMessageIds?: Set<string>): {
88
+ shownL1: SummaryEntry[];
89
+ shownL2: SummaryEntry[];
90
+ shownL3: SummaryEntry[];
91
+ };
92
+ /**
93
+ * Compress a raw message chunk into an L1 summary using self-voice framing.
94
+ * No system prompt — framing via message structure only.
95
+ */
96
+ protected compressChunkHierarchical(chunk: Chunk, ctx: StrategyContext): Promise<void>;
97
+ /**
98
+ * Check if unmerged summary counts exceed the merge threshold.
99
+ * Enqueues merge operations if so.
100
+ */
101
+ protected checkMergeThreshold(): void;
102
+ /**
103
+ * Merge N summaries at one level into a single summary at the next level.
104
+ * Uses self-voice consolidation prompt.
105
+ */
106
+ protected executeMerge(targetLevel: SummaryLevel, sourceIds: string[], ctx: StrategyContext): Promise<void>;
107
+ /**
108
+ * Select context entries using hierarchical compression with budget carryover.
109
+ * Matches moltbot's budget waterfall: L3 → L2 → L1 with unused budget flowing down.
110
+ */
111
+ protected selectHierarchical(store: MessageStoreView, budget: TokenBudget): ContextEntry[];
112
+ /**
113
+ * Build the compression instruction for an L1 chunk.
114
+ * Override in subclasses for phase-aware prompts.
115
+ */
116
+ protected getCompressionInstruction(chunk: Chunk, targetTokens: number): string;
117
+ /**
118
+ * Build the merge instruction for combining summaries into a higher level.
119
+ * Override in subclasses for domain-specific merge prompts.
120
+ */
121
+ protected getMergeInstruction(targetLevel: SummaryLevel, sources: SummaryEntry[], targetTokens: number): string;
122
+ /**
123
+ * Select L1 summaries within a budget. Returns selected summaries and tokens used.
124
+ * Override in subclasses for asymmetric budget allocation (e.g., cap research, prioritize synthesis).
125
+ */
126
+ protected selectL1Summaries(shownL1: SummaryEntry[], budget: number, maxTokens: number): {
127
+ selected: SummaryEntry[];
128
+ tokensUsed: number;
129
+ };
130
+ /**
131
+ * Reset the head window to start from a new message ID.
132
+ * Old head window messages become compressible on the next chunk rebuild.
133
+ */
134
+ resetHeadWindow(newStartId: string | null): void;
135
+ /**
136
+ * Generate a transition summary from the current head window + top summaries.
137
+ * Used when `/newtopic` is called without explicit context.
138
+ */
139
+ generateTransitionSummary(ctx: StrategyContext): Promise<string>;
140
+ /**
141
+ * Check if a message is a topic transition marker.
142
+ */
143
+ protected isTopicTransitionMessage(message: StoredMessage): boolean;
144
+ /**
145
+ * Extract plain text from content blocks.
146
+ */
147
+ protected extractText(content: ContentBlock[]): string;
148
+ /**
149
+ * Get messages in the compressible zone: outside both head window and recent window.
150
+ * Returns messages from [0, headStart) ∪ [headEnd, recentStart).
151
+ */
152
+ protected getCompressibleMessages(store: MessageStoreView): StoredMessage[];
153
+ /**
154
+ * Rebuild chunk boundaries based on current messages.
155
+ */
156
+ protected rebuildChunks(store: MessageStoreView): void;
157
+ protected createChunk(index: number, startIndex: number, endIndex: number, messages: StoredMessage[], tokens: number, existingCompressed: Map<string, Chunk>): Chunk;
158
+ protected chunkKey(chunk: Chunk): string;
159
+ protected getRecentWindowStart(store: MessageStoreView): number;
160
+ /**
161
+ * Index of the first message in the head window.
162
+ * When headWindowStartId is set, the head window starts from that message
163
+ * instead of message 0 — old messages before it become compressible.
164
+ */
165
+ protected getHeadWindowStartIndex(store: MessageStoreView): number;
166
+ /**
167
+ * Index of the first message AFTER the head window.
168
+ * Messages [headStart, headEnd) are preserved verbatim.
169
+ */
170
+ protected getHeadWindowEnd(store: MessageStoreView): number;
171
+ protected hasToolUse(message: StoredMessage): boolean;
172
+ protected hasToolResult(message: StoredMessage): boolean;
173
+ /**
174
+ * Remove trailing entries that contain tool_use without a following tool_result.
175
+ * This prevents orphaned tool_use blocks when a budget break cuts between
176
+ * a tool_use message and its tool_result response.
177
+ */
178
+ private trimOrphanedToolUse;
179
+ protected isChunkOldEnough(chunk: Chunk): boolean;
180
+ protected formatChunkForCompression(chunk: Chunk): string;
181
+ /**
182
+ * Collapse consecutive messages from the same participant into single messages.
183
+ * Required because Claude API rejects consecutive same-role messages.
184
+ */
185
+ protected collapseConsecutiveMessages(messages: Array<{
186
+ participant: string;
187
+ content: ContentBlock[];
188
+ }>): Array<{
189
+ participant: string;
190
+ content: ContentBlock[];
191
+ }>;
192
+ protected estimateTextOnlyTokens(msg: StoredMessage): number;
193
+ protected estimateTokens(content: ContentBlock[]): number;
194
+ /**
195
+ * Truncate a message's content blocks to fit within maxMessageTokens.
196
+ */
197
+ protected truncateContent(content: ContentBlock[], maxTokens: number): ContentBlock[];
198
+ }
199
+ //# sourceMappingURL=autobiographical.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autobiographical.d.ts","sourceRoot":"","sources":["../../../src/strategies/autobiographical.ts"],"names":[],"mappings":"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"}