@cogitator-ai/memory 0.11.0 → 0.11.2
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/README.md +9 -2
- package/dist/adapters/index.d.ts +10 -2
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/mongodb.d.ts +6 -0
- package/dist/adapters/mongodb.d.ts.map +1 -1
- package/dist/adapters/mongodb.js +61 -38
- package/dist/adapters/mongodb.js.map +1 -1
- package/dist/adapters/pgvector.d.ts +46 -0
- package/dist/adapters/pgvector.d.ts.map +1 -0
- package/dist/adapters/pgvector.js +55 -0
- package/dist/adapters/pgvector.js.map +1 -0
- package/dist/adapters/postgres.d.ts +3 -0
- package/dist/adapters/postgres.d.ts.map +1 -1
- package/dist/adapters/postgres.js +75 -34
- package/dist/adapters/postgres.js.map +1 -1
- package/dist/adapters/qdrant.d.ts +1 -0
- package/dist/adapters/qdrant.d.ts.map +1 -1
- package/dist/adapters/qdrant.js +33 -40
- package/dist/adapters/qdrant.js.map +1 -1
- package/dist/adapters/redis.js +1 -1
- package/dist/adapters/redis.js.map +1 -1
- package/dist/adapters/sqlite-driver.d.ts +11 -0
- package/dist/adapters/sqlite-driver.d.ts.map +1 -0
- package/dist/adapters/sqlite-driver.js +2 -0
- package/dist/adapters/sqlite-driver.js.map +1 -0
- package/dist/adapters/sqlite.d.ts.map +1 -1
- package/dist/adapters/sqlite.js +1 -2
- package/dist/adapters/sqlite.js.map +1 -1
- package/dist/context-builder.d.ts +5 -0
- package/dist/context-builder.d.ts.map +1 -1
- package/dist/context-builder.js +10 -11
- package/dist/context-builder.js.map +1 -1
- package/dist/core-facts.d.ts +5 -0
- package/dist/core-facts.d.ts.map +1 -1
- package/dist/core-facts.js +1 -2
- package/dist/core-facts.js.map +1 -1
- package/dist/embedding/openai.d.ts +5 -0
- package/dist/embedding/openai.d.ts.map +1 -1
- package/dist/embedding/openai.js +24 -4
- package/dist/embedding/openai.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/knowledge-graph/graph-adapter.d.ts.map +1 -1
- package/dist/knowledge-graph/graph-adapter.js +7 -5
- package/dist/knowledge-graph/graph-adapter.js.map +1 -1
- package/dist/knowledge-graph/sqlite-graph-adapter.d.ts.map +1 -1
- package/dist/knowledge-graph/sqlite-graph-adapter.js +2 -4
- package/dist/knowledge-graph/sqlite-graph-adapter.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -137,6 +137,8 @@ const memory = new PostgresAdapter({
|
|
|
137
137
|
await memory.connect();
|
|
138
138
|
```
|
|
139
139
|
|
|
140
|
+
On `connect()` the adapter creates its tables and an HNSW cosine index on the embeddings, which works from the first row on (no training data needed). An `ivfflat` index left by an earlier version is replaced on the first connect after upgrading, see the [adapters docs](https://cogitator.app/docs/memory/adapters) for building the new index ahead of time on a large table. `search()` raises `hnsw.ef_search` to the requested limit and, on pgvector 0.8+, uses iterative scans, so large limits and filters still get every matching row. Messages, tool calls, tool results and metadata are stored as `jsonb`.
|
|
141
|
+
|
|
140
142
|
### SQLite Adapter
|
|
141
143
|
|
|
142
144
|
```typescript
|
|
@@ -165,6 +167,8 @@ const memory = new MongoDBAdapter({
|
|
|
165
167
|
await memory.connect();
|
|
166
168
|
```
|
|
167
169
|
|
|
170
|
+
Threads and entries live in the `<collectionPrefix>threads` and `<collectionPrefix>entries` collections (prefix `memory_` by default), indexed on `agentId` and `(threadId, createdAt)`. Fields left `undefined` are omitted from the stored documents, not stored as `null`. A failed `connect()` leaves the adapter disconnected, so a later `connect()` retries.
|
|
171
|
+
|
|
168
172
|
### Qdrant Adapter (Embedding)
|
|
169
173
|
|
|
170
174
|
```typescript
|
|
@@ -210,6 +214,7 @@ const qdrant = await createEmbeddingAdapter({
|
|
|
210
214
|
});
|
|
211
215
|
|
|
212
216
|
await postgres.connect(); // the factories create adapters; connect them before use
|
|
217
|
+
await qdrant.connect(); // typed as ConnectableEmbeddingAdapter, no cast needed
|
|
213
218
|
```
|
|
214
219
|
|
|
215
220
|
`createMemoryAdapter` loads the adapter's driver lazily, so only the drivers you use need to be installed.
|
|
@@ -311,7 +316,7 @@ interface ContextBuilderConfig {
|
|
|
311
316
|
|
|
312
317
|
Strategies:
|
|
313
318
|
|
|
314
|
-
- `recent` - newest messages that fit into the token budget
|
|
319
|
+
- `recent` - the newest messages that fit into the token budget, as one unbroken run: the window stops at the first message that does not fit, so a reply never appears without the message it answers
|
|
315
320
|
- `relevant` - messages ranked by embedding similarity to `currentInput` (requires `embeddingService`; falls back to `recent` without input), returned in chronological order
|
|
316
321
|
- `hybrid` - always keeps the latest messages and fills the remaining budget with the most relevant older ones
|
|
317
322
|
|
|
@@ -500,7 +505,7 @@ import { OpenAIEmbeddingService, createEmbeddingService } from '@cogitator-ai/me
|
|
|
500
505
|
const embeddings = new OpenAIEmbeddingService({
|
|
501
506
|
apiKey: process.env.OPENAI_API_KEY!,
|
|
502
507
|
model: 'text-embedding-3-small', // default
|
|
503
|
-
dimensions: 512, // optional, text-embedding-3
|
|
508
|
+
dimensions: 512, // optional, sent to text-embedding-3 models (gateway ids like openai/text-embedding-3-small too)
|
|
504
509
|
});
|
|
505
510
|
|
|
506
511
|
// or through the factory
|
|
@@ -514,6 +519,8 @@ const vector = await embeddings.embed('Hello, world!');
|
|
|
514
519
|
const vectors = await embeddings.embedBatch(['Hello', 'World']);
|
|
515
520
|
```
|
|
516
521
|
|
|
522
|
+
For other models `dimensions` declares the size they return. When a response holds vectors of another size than the configured `dimensions`, `embed()` and `embedBatch()` throw instead of handing them to a store sized for it.
|
|
523
|
+
|
|
517
524
|
### Ollama Embeddings
|
|
518
525
|
|
|
519
526
|
```typescript
|
package/dist/adapters/index.d.ts
CHANGED
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Memory adapter exports and factory
|
|
3
3
|
*/
|
|
4
|
-
import type { MemoryAdapter, EmbeddingAdapter, InMemoryAdapterConfig, RedisAdapterConfig, PostgresAdapterConfig, SQLiteAdapterConfig, MongoDBAdapterConfig, QdrantAdapterConfig } from '@cogitator-ai/types';
|
|
4
|
+
import type { MemoryAdapter, MemoryResult, EmbeddingAdapter, InMemoryAdapterConfig, RedisAdapterConfig, PostgresAdapterConfig, SQLiteAdapterConfig, MongoDBAdapterConfig, QdrantAdapterConfig } from '@cogitator-ai/types';
|
|
5
5
|
export { BaseMemoryAdapter } from './base.js';
|
|
6
6
|
export { InMemoryAdapter } from './memory.js';
|
|
7
7
|
export type MemoryAdapterConfigUnion = InMemoryAdapterConfig | RedisAdapterConfig | PostgresAdapterConfig | SQLiteAdapterConfig | MongoDBAdapterConfig;
|
|
8
8
|
export type EmbeddingAdapterConfigUnion = QdrantAdapterConfig;
|
|
9
|
+
/**
|
|
10
|
+
* An embedding store that talks to a server, as `createEmbeddingAdapter` returns it: call
|
|
11
|
+
* `connect()` before the first operation and `disconnect()` when done.
|
|
12
|
+
*/
|
|
13
|
+
export interface ConnectableEmbeddingAdapter extends EmbeddingAdapter {
|
|
14
|
+
connect(): Promise<MemoryResult<void>>;
|
|
15
|
+
disconnect(): Promise<MemoryResult<void>>;
|
|
16
|
+
}
|
|
9
17
|
export declare function createMemoryAdapter(config: MemoryAdapterConfigUnion): Promise<MemoryAdapter>;
|
|
10
|
-
export declare function createEmbeddingAdapter(config: EmbeddingAdapterConfigUnion): Promise<
|
|
18
|
+
export declare function createEmbeddingAdapter(config: EmbeddingAdapterConfigUnion): Promise<ConnectableEmbeddingAdapter>;
|
|
11
19
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,MAAM,wBAAwB,GAChC,qBAAqB,GACrB,kBAAkB,GAClB,qBAAqB,GACrB,mBAAmB,GACnB,oBAAoB,CAAC;AAEzB,MAAM,MAAM,2BAA2B,GAAG,mBAAmB,CAAC;AAE9D,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,aAAa,CAAC,CAgCxB;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,2BAA2B,GAClC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,MAAM,wBAAwB,GAChC,qBAAqB,GACrB,kBAAkB,GAClB,qBAAqB,GACrB,mBAAmB,GACnB,oBAAoB,CAAC;AAEzB,MAAM,MAAM,2BAA2B,GAAG,mBAAmB,CAAC;AAE9D;;;GAGG;AACH,MAAM,WAAW,2BAA4B,SAAQ,gBAAgB;IACnE,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,UAAU,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;CAC3C;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,aAAa,CAAC,CAgCxB;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,2BAA2B,GAClC,OAAO,CAAC,2BAA2B,CAAC,CAOtC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAoB3C,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAgC;IAEhC,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,QAAQ;YACX,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;QAErC,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;YACjD,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QAED,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;YACvD,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;YACnD,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QAED,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;YACrD,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,UAAU,GAAU,MAAM,CAAC;YACjC,MAAM,IAAI,KAAK,CACb,4BAA6B,UAAuC,CAAC,QAAQ,EAAE,CAChF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAmC;IAEnC,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;YACnD,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -4,13 +4,19 @@ export declare class MongoDBAdapter extends BaseMemoryAdapter {
|
|
|
4
4
|
readonly provider: MemoryProvider;
|
|
5
5
|
private client;
|
|
6
6
|
private db;
|
|
7
|
+
private connecting;
|
|
7
8
|
private uri;
|
|
8
9
|
private database;
|
|
9
10
|
private prefix;
|
|
10
11
|
constructor(config: MongoDBAdapterConfig);
|
|
11
12
|
private get threads();
|
|
12
13
|
private get entries();
|
|
14
|
+
/**
|
|
15
|
+
* Opens the client and builds the indexes. Concurrent calls share one attempt, and a failed
|
|
16
|
+
* attempt closes its client and leaves the adapter disconnected, so the next call tries again.
|
|
17
|
+
*/
|
|
13
18
|
connect(): Promise<MemoryResult<void>>;
|
|
19
|
+
private open;
|
|
14
20
|
disconnect(): Promise<MemoryResult<void>>;
|
|
15
21
|
createThread(agentId: string, metadata?: Record<string, unknown>, threadId?: string): Promise<MemoryResult<Thread>>;
|
|
16
22
|
getThread(threadId: string): Promise<MemoryResult<Thread | null>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongodb.d.ts","sourceRoot":"","sources":["../../src/adapters/mongodb.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,WAAW,EACX,kBAAkB,EAClB,YAAY,
|
|
1
|
+
{"version":3,"file":"mongodb.d.ts","sourceRoot":"","sources":["../../src/adapters/mongodb.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,WAAW,EACX,kBAAkB,EAClB,YAAY,EAEZ,oBAAoB,EACpB,cAAc,EAGf,MAAM,qBAAqB,CAAC;AAS7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAyF3C,qBAAa,cAAe,SAAQ,iBAAiB;IACnD,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAa;IAE9C,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,EAAE,CAA8B;IACxC,OAAO,CAAC,UAAU,CAA4C;IAC9D,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,oBAAoB;IAOxC,OAAO,KAAK,OAAO,GAGlB;IAED,OAAO,KAAK,OAAO,GAGlB;IAED;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAQ9B,IAAI;IA2BZ,UAAU,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAgBzC,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACtC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAyB1B,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAmBjE,YAAY,CAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAwB1B,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAY3D,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IA0B1F,UAAU,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;IAyB7E,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAWpE,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAWzD,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;CAUjE"}
|
package/dist/adapters/mongodb.js
CHANGED
|
@@ -1,8 +1,38 @@
|
|
|
1
1
|
import { BaseMemoryAdapter } from './base.js';
|
|
2
|
+
function readMessage({ name, toolCallId, ...message }) {
|
|
3
|
+
return {
|
|
4
|
+
...message,
|
|
5
|
+
...(name != null && { name }),
|
|
6
|
+
...(toolCallId != null && { toolCallId }),
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
function readToolCall({ thoughtSignature, replay, ...call }) {
|
|
10
|
+
return {
|
|
11
|
+
...call,
|
|
12
|
+
...(thoughtSignature != null && { thoughtSignature }),
|
|
13
|
+
...(replay != null && { replay }),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function readToolResult({ error, ...result }) {
|
|
17
|
+
return { ...result, ...(error != null && { error }) };
|
|
18
|
+
}
|
|
19
|
+
function readEntry(doc, withToolCalls) {
|
|
20
|
+
return {
|
|
21
|
+
id: doc._id,
|
|
22
|
+
threadId: doc.threadId,
|
|
23
|
+
message: readMessage(doc.message),
|
|
24
|
+
toolCalls: withToolCalls ? doc.toolCalls?.map(readToolCall) : undefined,
|
|
25
|
+
toolResults: withToolCalls ? doc.toolResults?.map(readToolResult) : undefined,
|
|
26
|
+
tokenCount: doc.tokenCount,
|
|
27
|
+
createdAt: doc.createdAt,
|
|
28
|
+
metadata: doc.metadata ?? undefined,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
2
31
|
export class MongoDBAdapter extends BaseMemoryAdapter {
|
|
3
32
|
provider = 'mongodb';
|
|
4
33
|
client = null;
|
|
5
34
|
db = null;
|
|
35
|
+
connecting = null;
|
|
6
36
|
uri;
|
|
7
37
|
database;
|
|
8
38
|
prefix;
|
|
@@ -22,30 +52,47 @@ export class MongoDBAdapter extends BaseMemoryAdapter {
|
|
|
22
52
|
throw new Error('Not connected');
|
|
23
53
|
return this.db.collection(`${this.prefix}entries`);
|
|
24
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Opens the client and builds the indexes. Concurrent calls share one attempt, and a failed
|
|
57
|
+
* attempt closes its client and leaves the adapter disconnected, so the next call tries again.
|
|
58
|
+
*/
|
|
25
59
|
async connect() {
|
|
26
60
|
if (this.client)
|
|
27
61
|
return this.success(undefined);
|
|
62
|
+
this.connecting ??= this.open().finally(() => {
|
|
63
|
+
this.connecting = null;
|
|
64
|
+
});
|
|
65
|
+
return this.connecting;
|
|
66
|
+
}
|
|
67
|
+
async open() {
|
|
28
68
|
let MongoClient;
|
|
29
69
|
try {
|
|
30
|
-
|
|
31
|
-
MongoClient = mongodb.MongoClient;
|
|
70
|
+
({ MongoClient } = await import('mongodb'));
|
|
32
71
|
}
|
|
33
72
|
catch {
|
|
34
73
|
return this.failure('mongodb not installed. Run: pnpm add mongodb');
|
|
35
74
|
}
|
|
75
|
+
let client;
|
|
36
76
|
try {
|
|
37
|
-
|
|
38
|
-
await
|
|
39
|
-
|
|
40
|
-
await this.threads.createIndex({ agentId: 1 });
|
|
41
|
-
await
|
|
77
|
+
client = new MongoClient(this.uri, { ignoreUndefined: true });
|
|
78
|
+
await client.connect();
|
|
79
|
+
const db = client.db(this.database);
|
|
80
|
+
await db.collection(`${this.prefix}threads`).createIndex({ agentId: 1 });
|
|
81
|
+
await db
|
|
82
|
+
.collection(`${this.prefix}entries`)
|
|
83
|
+
.createIndex({ threadId: 1, createdAt: 1 });
|
|
84
|
+
this.client = client;
|
|
85
|
+
this.db = db;
|
|
42
86
|
return this.success(undefined);
|
|
43
87
|
}
|
|
44
88
|
catch (err) {
|
|
89
|
+
await client?.close().catch(() => undefined);
|
|
45
90
|
return this.failure(err.message);
|
|
46
91
|
}
|
|
47
92
|
}
|
|
48
93
|
async disconnect() {
|
|
94
|
+
if (this.connecting)
|
|
95
|
+
await this.connecting;
|
|
49
96
|
if (this.client) {
|
|
50
97
|
try {
|
|
51
98
|
await this.client.close();
|
|
@@ -162,34 +209,21 @@ export class MongoDBAdapter extends BaseMemoryAdapter {
|
|
|
162
209
|
if (!this.db)
|
|
163
210
|
return this.failure('Not connected');
|
|
164
211
|
try {
|
|
165
|
-
const filter = { threadId: options.threadId };
|
|
212
|
+
const filter = { threadId: { $eq: options.threadId } };
|
|
166
213
|
if (options.before || options.after) {
|
|
167
|
-
|
|
214
|
+
const createdAt = {};
|
|
168
215
|
if (options.before)
|
|
169
|
-
|
|
216
|
+
createdAt.$lt = options.before;
|
|
170
217
|
if (options.after)
|
|
171
|
-
|
|
218
|
+
createdAt.$gt = options.after;
|
|
219
|
+
filter.createdAt = createdAt;
|
|
172
220
|
}
|
|
173
221
|
let cursor = this.entries.find(filter).sort({ createdAt: -1 });
|
|
174
222
|
if (options.limit)
|
|
175
223
|
cursor = cursor.limit(options.limit);
|
|
176
224
|
const docs = await cursor.toArray();
|
|
177
225
|
docs.reverse();
|
|
178
|
-
|
|
179
|
-
id: doc._id,
|
|
180
|
-
threadId: doc.threadId,
|
|
181
|
-
message: doc.message,
|
|
182
|
-
toolCalls: options.includeToolCalls
|
|
183
|
-
? doc.toolCalls
|
|
184
|
-
: undefined,
|
|
185
|
-
toolResults: options.includeToolCalls
|
|
186
|
-
? doc.toolResults
|
|
187
|
-
: undefined,
|
|
188
|
-
tokenCount: doc.tokenCount,
|
|
189
|
-
createdAt: doc.createdAt,
|
|
190
|
-
metadata: doc.metadata,
|
|
191
|
-
}));
|
|
192
|
-
return this.success(entries);
|
|
226
|
+
return this.success(docs.map((doc) => readEntry(doc, options.includeToolCalls === true)));
|
|
193
227
|
}
|
|
194
228
|
catch (err) {
|
|
195
229
|
return this.failure(err.message);
|
|
@@ -200,18 +234,7 @@ export class MongoDBAdapter extends BaseMemoryAdapter {
|
|
|
200
234
|
return this.failure('Not connected');
|
|
201
235
|
try {
|
|
202
236
|
const doc = await this.entries.findOne({ _id: entryId });
|
|
203
|
-
|
|
204
|
-
return this.success(null);
|
|
205
|
-
return this.success({
|
|
206
|
-
id: doc._id,
|
|
207
|
-
threadId: doc.threadId,
|
|
208
|
-
message: doc.message,
|
|
209
|
-
toolCalls: doc.toolCalls,
|
|
210
|
-
toolResults: doc.toolResults,
|
|
211
|
-
tokenCount: doc.tokenCount,
|
|
212
|
-
createdAt: doc.createdAt,
|
|
213
|
-
metadata: doc.metadata,
|
|
214
|
-
});
|
|
237
|
+
return this.success(doc ? readEntry(doc, true) : null);
|
|
215
238
|
}
|
|
216
239
|
catch (err) {
|
|
217
240
|
return this.failure(err.message);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongodb.js","sourceRoot":"","sources":["../../src/adapters/mongodb.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mongodb.js","sourceRoot":"","sources":["../../src/adapters/mongodb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pgvector helpers shared by the Postgres adapters: the vector index they build and the settings
|
|
3
|
+
* a nearest-neighbour query runs with.
|
|
4
|
+
*/
|
|
5
|
+
export interface SqlQueryable {
|
|
6
|
+
query(text: string, values?: unknown[]): Promise<{
|
|
7
|
+
rows: Record<string, unknown>[];
|
|
8
|
+
}>;
|
|
9
|
+
}
|
|
10
|
+
export interface HnswIndexTarget {
|
|
11
|
+
schema: string;
|
|
12
|
+
table: string;
|
|
13
|
+
column: string;
|
|
14
|
+
index: string;
|
|
15
|
+
}
|
|
16
|
+
/** What the installed pgvector lets a search tune on its HNSW index. */
|
|
17
|
+
export interface VectorSearchTuning {
|
|
18
|
+
/** pgvector 0.8 and later keep scanning the index until enough rows pass the filters. */
|
|
19
|
+
iterativeScan: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Makes sure `target.index` is an HNSW cosine index. HNSW needs no training rows, so unlike IVFFlat
|
|
23
|
+
* it can be built on the still empty table at connect time and keeps full recall as rows arrive.
|
|
24
|
+
* An index of the same name with another access method, such as the IVFFlat index earlier versions
|
|
25
|
+
* built, is dropped and rebuilt. An HNSW index that already exists is left alone, so it can be
|
|
26
|
+
* built ahead of a deploy with `CREATE INDEX CONCURRENTLY`.
|
|
27
|
+
*/
|
|
28
|
+
export declare function ensureHnswCosineIndex(db: SqlQueryable, target: HnswIndexTarget): Promise<void>;
|
|
29
|
+
/** Reads the installed pgvector version and what it supports. */
|
|
30
|
+
export declare function detectVectorSearchTuning(db: SqlQueryable): Promise<VectorSearchTuning>;
|
|
31
|
+
/**
|
|
32
|
+
* How one nearest-neighbour search runs on an HNSW index. The index returns at most
|
|
33
|
+
* `hnsw.ef_search` candidates (40 by default), so a larger limit would be cut short, and rows a
|
|
34
|
+
* filter rejects would be missing from the result. `sql` grows the candidate list with the limit
|
|
35
|
+
* for the current transaction and, where pgvector supports it, keeps the scan going in strict
|
|
36
|
+
* distance order until enough rows pass. `candidates` is how many rows to fetch, at least as many
|
|
37
|
+
* as the index computes anyway: taking all of them and ordering equally distant rows by id makes
|
|
38
|
+
* the result independent of whether Postgres plans the index or an exact scan, so a small limit
|
|
39
|
+
* returns a prefix of a large one.
|
|
40
|
+
*/
|
|
41
|
+
export declare function hnswSearchSettings(limit: number, tuning: VectorSearchTuning): {
|
|
42
|
+
sql: string;
|
|
43
|
+
params: unknown[];
|
|
44
|
+
candidates: number;
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=pgvector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pgvector.d.ts","sourceRoot":"","sources":["../../src/adapters/pgvector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;KAAE,CAAC,CAAC;CACvF;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wEAAwE;AACxE,MAAM,WAAW,kBAAkB;IACjC,yFAAyF;IACzF,aAAa,EAAE,OAAO,CAAC;CACxB;AAKD;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,YAAY,EAChB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,IAAI,CAAC,CAcf;AAED,iEAAiE;AACjE,wBAAsB,wBAAwB,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAM5F;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,kBAAkB,GACzB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAUxD"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pgvector helpers shared by the Postgres adapters: the vector index they build and the settings
|
|
3
|
+
* a nearest-neighbour query runs with.
|
|
4
|
+
*/
|
|
5
|
+
const DEFAULT_EF_SEARCH = 40;
|
|
6
|
+
const MAX_EF_SEARCH = 1000;
|
|
7
|
+
/**
|
|
8
|
+
* Makes sure `target.index` is an HNSW cosine index. HNSW needs no training rows, so unlike IVFFlat
|
|
9
|
+
* it can be built on the still empty table at connect time and keeps full recall as rows arrive.
|
|
10
|
+
* An index of the same name with another access method, such as the IVFFlat index earlier versions
|
|
11
|
+
* built, is dropped and rebuilt. An HNSW index that already exists is left alone, so it can be
|
|
12
|
+
* built ahead of a deploy with `CREATE INDEX CONCURRENTLY`.
|
|
13
|
+
*/
|
|
14
|
+
export async function ensureHnswCosineIndex(db, target) {
|
|
15
|
+
const { schema, table, column, index } = target;
|
|
16
|
+
const existing = await db.query('SELECT indexdef FROM pg_indexes WHERE schemaname = lower($1) AND indexname = lower($2)', [schema, index]);
|
|
17
|
+
const definition = existing.rows[0]?.indexdef;
|
|
18
|
+
if (typeof definition === 'string') {
|
|
19
|
+
if (/\busing hnsw\b/i.test(definition))
|
|
20
|
+
return;
|
|
21
|
+
await db.query(`DROP INDEX IF EXISTS ${schema}.${index}`);
|
|
22
|
+
}
|
|
23
|
+
await db.query(`CREATE INDEX IF NOT EXISTS ${index} ON ${schema}.${table} USING hnsw (${column} vector_cosine_ops)`);
|
|
24
|
+
}
|
|
25
|
+
/** Reads the installed pgvector version and what it supports. */
|
|
26
|
+
export async function detectVectorSearchTuning(db) {
|
|
27
|
+
const result = await db.query("SELECT extversion FROM pg_extension WHERE extname = 'vector'");
|
|
28
|
+
const version = result.rows[0]?.extversion;
|
|
29
|
+
if (typeof version !== 'string')
|
|
30
|
+
return { iterativeScan: false };
|
|
31
|
+
const [major = 0, minor = 0] = version.split('.').map((part) => Number.parseInt(part, 10));
|
|
32
|
+
return { iterativeScan: major > 0 || minor >= 8 };
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* How one nearest-neighbour search runs on an HNSW index. The index returns at most
|
|
36
|
+
* `hnsw.ef_search` candidates (40 by default), so a larger limit would be cut short, and rows a
|
|
37
|
+
* filter rejects would be missing from the result. `sql` grows the candidate list with the limit
|
|
38
|
+
* for the current transaction and, where pgvector supports it, keeps the scan going in strict
|
|
39
|
+
* distance order until enough rows pass. `candidates` is how many rows to fetch, at least as many
|
|
40
|
+
* as the index computes anyway: taking all of them and ordering equally distant rows by id makes
|
|
41
|
+
* the result independent of whether Postgres plans the index or an exact scan, so a small limit
|
|
42
|
+
* returns a prefix of a large one.
|
|
43
|
+
*/
|
|
44
|
+
export function hnswSearchSettings(limit, tuning) {
|
|
45
|
+
const efSearch = Math.min(MAX_EF_SEARCH, Math.max(DEFAULT_EF_SEARCH, Math.ceil(limit)));
|
|
46
|
+
const iterative = tuning.iterativeScan
|
|
47
|
+
? ", set_config('hnsw.iterative_scan', 'strict_order', true)"
|
|
48
|
+
: '';
|
|
49
|
+
return {
|
|
50
|
+
sql: `SELECT set_config('hnsw.ef_search', $1, true)${iterative}`,
|
|
51
|
+
params: [String(efSearch)],
|
|
52
|
+
candidates: Math.max(efSearch, Math.ceil(limit)),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=pgvector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pgvector.js","sourceRoot":"","sources":["../../src/adapters/pgvector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,EAAgB,EAChB,MAAuB;IAEvB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IAChD,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,KAAK,CAC7B,wFAAwF,EACxF,CAAC,MAAM,EAAE,KAAK,CAAC,CAChB,CAAC;IACF,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC;IAC9C,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE,OAAO;QAC/C,MAAM,EAAE,CAAC,KAAK,CAAC,wBAAwB,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,EAAE,CAAC,KAAK,CACZ,8BAA8B,KAAK,OAAO,MAAM,IAAI,KAAK,gBAAgB,MAAM,qBAAqB,CACrG,CAAC;AACJ,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,EAAgB;IAC7D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAC9F,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC;IAC3C,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IACjE,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3F,OAAO,EAAE,aAAa,EAAE,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;AACpD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAa,EACb,MAA0B;IAE1B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACxF,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa;QACpC,CAAC,CAAC,2DAA2D;QAC7D,CAAC,CAAC,EAAE,CAAC;IACP,OAAO;QACL,GAAG,EAAE,gDAAgD,SAAS,EAAE;QAChE,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1B,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KACjD,CAAC;AACJ,CAAC"}
|
|
@@ -14,6 +14,7 @@ export declare class PostgresAdapter extends BaseMemoryAdapter implements FactAd
|
|
|
14
14
|
private config;
|
|
15
15
|
private schema;
|
|
16
16
|
private vectorDimensions;
|
|
17
|
+
private vectorTuning;
|
|
17
18
|
constructor(config: PostgresAdapterConfig);
|
|
18
19
|
connect(): Promise<MemoryResult<void>>;
|
|
19
20
|
private initSchema;
|
|
@@ -44,6 +45,8 @@ export declare class PostgresAdapter extends BaseMemoryAdapter implements FactAd
|
|
|
44
45
|
* `metadata.threadId`, and a user filter also lets through embeddings of no user.
|
|
45
46
|
*/
|
|
46
47
|
private embeddingFilterClause;
|
|
48
|
+
/** Runs `work` on one pooled connection inside a transaction, so `SET LOCAL` style settings apply to it only. */
|
|
49
|
+
private inTransaction;
|
|
47
50
|
private rowToThread;
|
|
48
51
|
setVectorDimensions(dimensions: number): void;
|
|
49
52
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/adapters/postgres.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,MAAM,EACN,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,qBAAqB,EACrB,cAAc,EACd,IAAI,EACJ,SAAS,EACT,qBAAqB,EACrB,WAAW,EACX,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EAEpB,YAAY,EACb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/adapters/postgres.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,MAAM,EACN,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,qBAAqB,EACrB,cAAc,EACd,IAAI,EACJ,SAAS,EACT,qBAAqB,EACrB,WAAW,EACX,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EAEpB,YAAY,EACb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAuB3C,qBAAa,eACX,SAAQ,iBACR,YAAW,WAAW,EAAE,gBAAgB,EAAE,oBAAoB;IAE9D,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAc;IAE/C,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,gBAAgB,CAAO;IAC/B,OAAO,CAAC,YAAY,CAAgD;gBAExD,MAAM,EAAE,qBAAqB;IAYnC,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAuB9B,UAAU;IAiGlB,UAAU,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAYzC,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACtC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAuB1B,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAejE,YAAY,CAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAsB1B,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAU3D,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IA6B1F,UAAU,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;IAiD7E,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IA2BpE,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAUzD,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAU1D,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IA8BxF,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;IAqC3E,UAAU,CACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,UAAU,GAAG,WAAW,CAAC,CAAC,GAC7F,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IA2DxB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAUvD,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;IA+B1E,YAAY,CAChB,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,GAAG,WAAW,CAAC,GAC7C,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IA8B7B,MAAM,CACV,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,YAAY,CAAC,CAAC,SAAS,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC,CAAC;IA6DrD,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAUjE,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAY7D,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,CAAC;IA0CzF;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IA0B7B,iHAAiH;YACnG,aAAa;IAqB3B,OAAO,CAAC,WAAW;IAUnB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;CAS9C"}
|