@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.
- package/dist/src/blob-manager.d.ts +37 -0
- package/dist/src/blob-manager.d.ts.map +1 -0
- package/dist/src/blob-manager.js +128 -0
- package/dist/src/blob-manager.js.map +1 -0
- package/dist/src/context-log.d.ts +99 -0
- package/dist/src/context-log.d.ts.map +1 -0
- package/dist/src/context-log.js +277 -0
- package/dist/src/context-log.js.map +1 -0
- package/dist/src/context-manager.d.ts +245 -0
- package/dist/src/context-manager.d.ts.map +1 -0
- package/dist/src/context-manager.js +553 -0
- package/dist/src/context-manager.js.map +1 -0
- package/dist/src/index.d.ts +12 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +12 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/message-store.d.ts +135 -0
- package/dist/src/message-store.d.ts.map +1 -0
- package/dist/src/message-store.js +372 -0
- package/dist/src/message-store.js.map +1 -0
- package/dist/src/strategies/autobiographical.d.ts +199 -0
- package/dist/src/strategies/autobiographical.d.ts.map +1 -0
- package/dist/src/strategies/autobiographical.js +1122 -0
- package/dist/src/strategies/autobiographical.js.map +1 -0
- package/dist/src/strategies/index.d.ts +3 -0
- package/dist/src/strategies/index.d.ts.map +1 -0
- package/dist/src/strategies/index.js +3 -0
- package/dist/src/strategies/index.js.map +1 -0
- package/dist/src/strategies/knowledge.d.ts +46 -0
- package/dist/src/strategies/knowledge.d.ts.map +1 -0
- package/dist/src/strategies/knowledge.js +270 -0
- package/dist/src/strategies/knowledge.js.map +1 -0
- package/dist/src/strategies/passthrough.d.ts +17 -0
- package/dist/src/strategies/passthrough.d.ts.map +1 -0
- package/dist/src/strategies/passthrough.js +69 -0
- package/dist/src/strategies/passthrough.js.map +1 -0
- package/dist/src/types/context.d.ts +108 -0
- package/dist/src/types/context.d.ts.map +1 -0
- package/dist/src/types/context.js +2 -0
- package/dist/src/types/context.js.map +1 -0
- package/dist/src/types/index.d.ts +5 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +2 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/types/message.d.ts +129 -0
- package/dist/src/types/message.d.ts.map +1 -0
- package/dist/src/types/message.js +2 -0
- package/dist/src/types/message.js.map +1 -0
- package/dist/src/types/strategy.d.ts +233 -0
- package/dist/src/types/strategy.d.ts.map +1 -0
- package/dist/src/types/strategy.js +32 -0
- package/dist/src/types/strategy.js.map +1 -0
- package/dist/test/autobiographical.test.d.ts +2 -0
- package/dist/test/autobiographical.test.d.ts.map +1 -0
- package/dist/test/autobiographical.test.js +46 -0
- package/dist/test/autobiographical.test.js.map +1 -0
- package/dist/test/head-window-reset.test.d.ts +17 -0
- package/dist/test/head-window-reset.test.d.ts.map +1 -0
- package/dist/test/head-window-reset.test.js +342 -0
- package/dist/test/head-window-reset.test.js.map +1 -0
- package/dist/test/integration.test.d.ts +2 -0
- package/dist/test/integration.test.d.ts.map +1 -0
- package/dist/test/integration.test.js +1341 -0
- package/dist/test/integration.test.js.map +1 -0
- package/dist/test/knowledge.test.d.ts +2 -0
- package/dist/test/knowledge.test.d.ts.map +1 -0
- package/dist/test/knowledge.test.js +617 -0
- package/dist/test/knowledge.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +48 -0
- package/src/blob-manager.ts +155 -0
- package/src/context-log.ts +342 -0
- package/src/context-manager.ts +726 -0
- package/src/index.ts +50 -0
- package/src/message-store.ts +479 -0
- package/src/strategies/autobiographical.ts +1355 -0
- package/src/strategies/index.ts +2 -0
- package/src/strategies/knowledge.ts +336 -0
- package/src/strategies/passthrough.ts +98 -0
- package/src/types/context.ts +119 -0
- package/src/types/index.ts +42 -0
- package/src/types/message.ts +140 -0
- 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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"}
|