@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,135 @@
1
+ import type { JsStore } from '@animalabs/chronicle';
2
+ import type { ContentBlock } from '@animalabs/membrane';
3
+ import type { MessageId, Sequence, MessageMetadata, StoredMessage, MessageStoreView, MessageQuery, MessageQueryResult } from './types/index.js';
4
+ /**
5
+ * Event emitted when the message store changes.
6
+ */
7
+ export type MessageStoreEvent = {
8
+ type: 'add';
9
+ message: StoredMessage;
10
+ } | {
11
+ type: 'edit';
12
+ messageId: MessageId;
13
+ oldContent: ContentBlock[];
14
+ newContent: ContentBlock[];
15
+ } | {
16
+ type: 'remove';
17
+ messageId: MessageId;
18
+ } | {
19
+ type: 'removeRange';
20
+ fromId: MessageId;
21
+ toId: MessageId;
22
+ };
23
+ /**
24
+ * Listener for message store events.
25
+ */
26
+ export type MessageStoreListener = (event: MessageStoreEvent) => void;
27
+ /**
28
+ * Options for token estimation.
29
+ */
30
+ export interface TokenEstimatorOptions {
31
+ /** Custom token estimator function */
32
+ estimator?: (text: string) => number;
33
+ }
34
+ /**
35
+ * Wrapper around Chronicle append_log state for message storage.
36
+ * Handles blob extraction and provides a clean interface for message operations.
37
+ */
38
+ export declare class MessageStore {
39
+ private store;
40
+ private blobManager;
41
+ private listeners;
42
+ private idToIndex;
43
+ private tokenEstimator;
44
+ private stateId;
45
+ constructor(store: JsStore, options?: TokenEstimatorOptions & {
46
+ /** Namespace for multi-agent support. Creates state ID: `{namespace}/messages` */
47
+ namespace?: string;
48
+ });
49
+ /**
50
+ * Register the message store state in Chronicle.
51
+ * Should be called once when setting up the store.
52
+ *
53
+ * @param store The Chronicle store
54
+ * @param namespace Optional namespace for multi-agent support
55
+ */
56
+ static register(store: JsStore, namespace?: string): void;
57
+ /**
58
+ * Add a listener for store events.
59
+ */
60
+ addListener(listener: MessageStoreListener): () => void;
61
+ private emit;
62
+ private rebuildIndex;
63
+ /**
64
+ * Append a new message to the store.
65
+ */
66
+ append(participant: string, content: ContentBlock[], metadata?: MessageMetadata, causedBy?: MessageId[]): StoredMessage;
67
+ /**
68
+ * Edit a message's content.
69
+ */
70
+ edit(messageId: MessageId, newContent: ContentBlock[]): void;
71
+ /**
72
+ * Remove a message from the store.
73
+ */
74
+ remove(messageId: MessageId): void;
75
+ /**
76
+ * Remove a range of messages from the store.
77
+ */
78
+ removeRange(fromId: MessageId, toId: MessageId): void;
79
+ /**
80
+ * Get a message by ID.
81
+ */
82
+ get(messageId: MessageId): StoredMessage | null;
83
+ /**
84
+ * Get a message as it was at a specific sequence (time travel).
85
+ */
86
+ getAt(messageId: MessageId, atSequence: Sequence): StoredMessage | null;
87
+ /**
88
+ * Get all messages.
89
+ */
90
+ getAll(): StoredMessage[];
91
+ /**
92
+ * Get messages from a specific index.
93
+ */
94
+ getFrom(index: number): StoredMessage[];
95
+ /**
96
+ * Get the last N messages.
97
+ */
98
+ getTail(count: number): StoredMessage[];
99
+ /**
100
+ * Get the total number of messages.
101
+ */
102
+ length(): number;
103
+ /**
104
+ * Estimate tokens for a message.
105
+ */
106
+ estimateTokens(message: StoredMessage): number;
107
+ private estimateBlockTokens;
108
+ /**
109
+ * Create a read-only view of the store for strategies.
110
+ */
111
+ createView(): MessageStoreView;
112
+ /**
113
+ * Query messages by filter criteria.
114
+ * Useful for finding messages from external sources, by participant, etc.
115
+ */
116
+ query(filter: MessageQuery): MessageQueryResult;
117
+ /**
118
+ * Find a message by external source and ID.
119
+ * Convenience method for common lookup pattern.
120
+ */
121
+ findByExternalId(source: string, externalId: string): StoredMessage | null;
122
+ /**
123
+ * Check if a message matches the query filter.
124
+ */
125
+ private matchesFilter;
126
+ /**
127
+ * Get a nested value from an object using dot notation.
128
+ * e.g., getNestedValue(obj, 'external.channelId')
129
+ */
130
+ private getNestedValue;
131
+ private getAllInternal;
132
+ private getInternal;
133
+ private internalToStored;
134
+ }
135
+ //# sourceMappingURL=message-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-store.d.ts","sourceRoot":"","sources":["../../src/message-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,372 @@
1
+ import { BlobManager } from './blob-manager.js';
2
+ const DEFAULT_MESSAGE_STATE_ID = 'messages';
3
+ /**
4
+ * Wrapper around Chronicle append_log state for message storage.
5
+ * Handles blob extraction and provides a clean interface for message operations.
6
+ */
7
+ export class MessageStore {
8
+ store;
9
+ blobManager;
10
+ listeners = new Set();
11
+ idToIndex = new Map();
12
+ tokenEstimator;
13
+ stateId;
14
+ constructor(store, options = {}) {
15
+ this.store = store;
16
+ this.stateId = options.namespace
17
+ ? `${options.namespace}/messages`
18
+ : DEFAULT_MESSAGE_STATE_ID;
19
+ this.blobManager = new BlobManager(store);
20
+ this.tokenEstimator = options.estimator ?? defaultTokenEstimator;
21
+ this.rebuildIndex();
22
+ }
23
+ /**
24
+ * Register the message store state in Chronicle.
25
+ * Should be called once when setting up the store.
26
+ *
27
+ * @param store The Chronicle store
28
+ * @param namespace Optional namespace for multi-agent support
29
+ */
30
+ static register(store, namespace) {
31
+ const stateId = namespace ? `${namespace}/messages` : DEFAULT_MESSAGE_STATE_ID;
32
+ store.registerState({
33
+ id: stateId,
34
+ strategy: 'append_log',
35
+ deltaSnapshotEvery: 50,
36
+ fullSnapshotEvery: 10,
37
+ });
38
+ }
39
+ /**
40
+ * Add a listener for store events.
41
+ */
42
+ addListener(listener) {
43
+ this.listeners.add(listener);
44
+ return () => this.listeners.delete(listener);
45
+ }
46
+ emit(event) {
47
+ for (const listener of this.listeners) {
48
+ listener(event);
49
+ }
50
+ }
51
+ rebuildIndex() {
52
+ this.idToIndex.clear();
53
+ const messages = this.getAllInternal();
54
+ for (let i = 0; i < messages.length; i++) {
55
+ this.idToIndex.set(messages[i].id, i);
56
+ }
57
+ }
58
+ /**
59
+ * Append a new message to the store.
60
+ */
61
+ append(participant, content, metadata, causedBy) {
62
+ // Extract blobs from content
63
+ const storedContent = this.blobManager.extractBlobs(content);
64
+ // Append to Chronicle first to get the record ID
65
+ const partialInternal = {
66
+ participant,
67
+ content: storedContent,
68
+ metadata,
69
+ timestamp: Date.now(),
70
+ causedBy,
71
+ };
72
+ const record = this.store.appendToStateJson(this.stateId, partialInternal);
73
+ const index = this.length() - 1;
74
+ // Now update the stored item to include the id (for rebuildIndex)
75
+ const fullInternal = {
76
+ id: record.id,
77
+ sequence: record.sequence,
78
+ ...partialInternal,
79
+ };
80
+ this.store.editStateItem(this.stateId, index, Buffer.from(JSON.stringify(fullInternal)));
81
+ // Build full message with ID and sequence from record
82
+ const message = {
83
+ id: record.id,
84
+ sequence: record.sequence,
85
+ participant,
86
+ content, // Original content with inline data
87
+ metadata,
88
+ timestamp: new Date(partialInternal.timestamp),
89
+ causedBy,
90
+ };
91
+ // Update index
92
+ this.idToIndex.set(message.id, index);
93
+ this.emit({ type: 'add', message });
94
+ return message;
95
+ }
96
+ /**
97
+ * Edit a message's content.
98
+ */
99
+ edit(messageId, newContent) {
100
+ const index = this.idToIndex.get(messageId);
101
+ if (index === undefined) {
102
+ throw new Error(`Message not found: ${messageId}`);
103
+ }
104
+ const oldMessage = this.getInternal(index);
105
+ if (!oldMessage) {
106
+ throw new Error(`Message not found at index: ${index}`);
107
+ }
108
+ const oldContent = this.blobManager.resolveBlobs(oldMessage.content);
109
+ const storedContent = this.blobManager.extractBlobs(newContent);
110
+ // Update the stored message
111
+ const updated = {
112
+ ...oldMessage,
113
+ content: storedContent,
114
+ };
115
+ this.store.editStateItem(this.stateId, index, Buffer.from(JSON.stringify(updated)));
116
+ this.emit({ type: 'edit', messageId, oldContent, newContent });
117
+ }
118
+ /**
119
+ * Remove a message from the store.
120
+ */
121
+ remove(messageId) {
122
+ const index = this.idToIndex.get(messageId);
123
+ if (index === undefined) {
124
+ throw new Error(`Message not found: ${messageId}`);
125
+ }
126
+ this.store.redactStateItems(this.stateId, index, index + 1);
127
+ this.rebuildIndex();
128
+ this.emit({ type: 'remove', messageId });
129
+ }
130
+ /**
131
+ * Remove a range of messages from the store.
132
+ */
133
+ removeRange(fromId, toId) {
134
+ const fromIndex = this.idToIndex.get(fromId);
135
+ const toIndex = this.idToIndex.get(toId);
136
+ if (fromIndex === undefined) {
137
+ throw new Error(`Message not found: ${fromId}`);
138
+ }
139
+ if (toIndex === undefined) {
140
+ throw new Error(`Message not found: ${toId}`);
141
+ }
142
+ this.store.redactStateItems(this.stateId, fromIndex, toIndex + 1);
143
+ this.rebuildIndex();
144
+ this.emit({ type: 'removeRange', fromId, toId });
145
+ }
146
+ /**
147
+ * Get a message by ID.
148
+ */
149
+ get(messageId) {
150
+ const index = this.idToIndex.get(messageId);
151
+ if (index === undefined) {
152
+ return null;
153
+ }
154
+ const internal = this.getInternal(index);
155
+ if (!internal) {
156
+ return null;
157
+ }
158
+ return this.internalToStored(internal, messageId, index);
159
+ }
160
+ /**
161
+ * Get a message as it was at a specific sequence (time travel).
162
+ */
163
+ getAt(messageId, atSequence) {
164
+ // Get historical state
165
+ const historicalState = this.store.getStateJsonAt(this.stateId, atSequence);
166
+ if (!historicalState || !Array.isArray(historicalState)) {
167
+ return null;
168
+ }
169
+ // Find the message in historical state
170
+ for (let i = 0; i < historicalState.length; i++) {
171
+ const internal = historicalState[i];
172
+ if (internal.id === messageId) {
173
+ return this.internalToStored(internal, messageId, i);
174
+ }
175
+ }
176
+ return null;
177
+ }
178
+ /**
179
+ * Get all messages.
180
+ */
181
+ getAll() {
182
+ const internals = this.getAllInternal();
183
+ return internals.map((internal, i) => this.internalToStored(internal, internal.id, i));
184
+ }
185
+ /**
186
+ * Get messages from a specific index.
187
+ */
188
+ getFrom(index) {
189
+ return this.getAll().slice(index);
190
+ }
191
+ /**
192
+ * Get the last N messages.
193
+ */
194
+ getTail(count) {
195
+ const all = this.getAll();
196
+ return all.slice(Math.max(0, all.length - count));
197
+ }
198
+ /**
199
+ * Get the total number of messages.
200
+ */
201
+ length() {
202
+ return this.store.getStateLen(this.stateId) ?? 0;
203
+ }
204
+ /**
205
+ * Estimate tokens for a message.
206
+ */
207
+ estimateTokens(message) {
208
+ let tokens = 0;
209
+ for (const block of message.content) {
210
+ tokens += this.estimateBlockTokens(block);
211
+ }
212
+ return tokens;
213
+ }
214
+ estimateBlockTokens(block) {
215
+ switch (block.type) {
216
+ case 'text':
217
+ return this.tokenEstimator(block.text);
218
+ case 'thinking':
219
+ return this.tokenEstimator(block.thinking);
220
+ case 'tool_use':
221
+ return this.tokenEstimator(JSON.stringify(block.input)) + 20; // overhead for name, id
222
+ case 'tool_result':
223
+ if (!block.content)
224
+ return 0;
225
+ if (typeof block.content === 'string') {
226
+ return this.tokenEstimator(block.content);
227
+ }
228
+ if (Array.isArray(block.content)) {
229
+ return block.content.reduce((sum, b) => sum + this.estimateBlockTokens(b), 0);
230
+ }
231
+ return 0;
232
+ case 'image':
233
+ return block.tokenEstimate ?? 1000; // Default estimate for images
234
+ case 'document':
235
+ case 'audio':
236
+ case 'video':
237
+ return 1000; // Default estimate for media
238
+ default:
239
+ return 0;
240
+ }
241
+ }
242
+ /**
243
+ * Create a read-only view of the store for strategies.
244
+ */
245
+ createView() {
246
+ return {
247
+ getAll: () => this.getAll(),
248
+ get: (id) => this.get(id),
249
+ getFrom: (index) => this.getFrom(index),
250
+ getTail: (count) => this.getTail(count),
251
+ length: () => this.length(),
252
+ estimateTokens: (msg) => this.estimateTokens(msg),
253
+ };
254
+ }
255
+ /**
256
+ * Query messages by filter criteria.
257
+ * Useful for finding messages from external sources, by participant, etc.
258
+ */
259
+ query(filter) {
260
+ let messages = this.getAll();
261
+ let totalCount = 0;
262
+ // Apply filters
263
+ const filtered = [];
264
+ for (const msg of messages) {
265
+ if (this.matchesFilter(msg, filter)) {
266
+ filtered.push(msg);
267
+ }
268
+ }
269
+ totalCount = filtered.length;
270
+ // Apply reverse if requested
271
+ let result = filter.reverse ? filtered.reverse() : filtered;
272
+ // Apply limit if specified
273
+ if (filter.limit !== undefined && filter.limit < result.length) {
274
+ result = result.slice(0, filter.limit);
275
+ }
276
+ return { messages: result, totalCount };
277
+ }
278
+ /**
279
+ * Find a message by external source and ID.
280
+ * Convenience method for common lookup pattern.
281
+ */
282
+ findByExternalId(source, externalId) {
283
+ const result = this.query({
284
+ source,
285
+ externalIds: [externalId],
286
+ limit: 1,
287
+ });
288
+ return result.messages[0] ?? null;
289
+ }
290
+ /**
291
+ * Check if a message matches the query filter.
292
+ */
293
+ matchesFilter(msg, filter) {
294
+ // Filter by source
295
+ if (filter.source !== undefined) {
296
+ const external = msg.metadata?.external;
297
+ if (external?.source !== filter.source) {
298
+ return false;
299
+ }
300
+ }
301
+ // Filter by external IDs
302
+ if (filter.externalIds !== undefined && filter.externalIds.length > 0) {
303
+ const external = msg.metadata?.external;
304
+ if (!external?.id || !filter.externalIds.includes(external.id)) {
305
+ return false;
306
+ }
307
+ }
308
+ // Filter by participant
309
+ if (filter.participant !== undefined) {
310
+ if (msg.participant !== filter.participant) {
311
+ return false;
312
+ }
313
+ }
314
+ // Filter by metadata fields
315
+ if (filter.metadata !== undefined) {
316
+ for (const [key, value] of Object.entries(filter.metadata)) {
317
+ const actual = this.getNestedValue(msg.metadata, key);
318
+ if (actual !== value) {
319
+ return false;
320
+ }
321
+ }
322
+ }
323
+ return true;
324
+ }
325
+ /**
326
+ * Get a nested value from an object using dot notation.
327
+ * e.g., getNestedValue(obj, 'external.channelId')
328
+ */
329
+ getNestedValue(obj, path) {
330
+ if (obj === undefined || obj === null) {
331
+ return undefined;
332
+ }
333
+ const parts = path.split('.');
334
+ let current = obj;
335
+ for (const part of parts) {
336
+ if (current === undefined || current === null || typeof current !== 'object') {
337
+ return undefined;
338
+ }
339
+ current = current[part];
340
+ }
341
+ return current;
342
+ }
343
+ getAllInternal() {
344
+ const state = this.store.getStateJson(this.stateId);
345
+ if (!state || !Array.isArray(state)) {
346
+ return [];
347
+ }
348
+ return state;
349
+ }
350
+ getInternal(index) {
351
+ const all = this.getAllInternal();
352
+ return all[index] ?? null;
353
+ }
354
+ internalToStored(internal, id, index) {
355
+ return {
356
+ id,
357
+ sequence: index, // Use index as sequence for now
358
+ participant: internal.participant,
359
+ content: this.blobManager.resolveBlobs(internal.content),
360
+ metadata: internal.metadata,
361
+ timestamp: new Date(internal.timestamp),
362
+ causedBy: internal.causedBy,
363
+ };
364
+ }
365
+ }
366
+ /**
367
+ * Default token estimator: chars / 4
368
+ */
369
+ function defaultTokenEstimator(text) {
370
+ return Math.ceil(text.length / 4);
371
+ }
372
+ //# sourceMappingURL=message-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-store.js","sourceRoot":"","sources":["../../src/message-store.ts"],"names":[],"mappings":"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"}