@xfabric/memory 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/chunking/index.d.ts +3 -0
- package/dist/chunking/index.d.ts.map +1 -0
- package/dist/chunking/index.js +3 -0
- package/dist/chunking/index.js.map +1 -0
- package/dist/chunking/markdown.d.ts +13 -0
- package/dist/chunking/markdown.d.ts.map +1 -0
- package/dist/chunking/markdown.js +106 -0
- package/dist/chunking/markdown.js.map +1 -0
- package/dist/chunking/session.d.ts +24 -0
- package/dist/chunking/session.d.ts.map +1 -0
- package/dist/chunking/session.js +173 -0
- package/dist/chunking/session.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/memory-manager.d.ts +189 -0
- package/dist/memory-manager.d.ts.map +1 -0
- package/dist/memory-manager.js +1055 -0
- package/dist/memory-manager.js.map +1 -0
- package/dist/providers/gemini.d.ts +6 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +73 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/index.d.ts +20 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +102 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/local.d.ts +14 -0
- package/dist/providers/local.d.ts.map +1 -0
- package/dist/providers/local.js +73 -0
- package/dist/providers/local.js.map +1 -0
- package/dist/providers/openai.d.ts +6 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +48 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/types.d.ts +62 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/search/fts.d.ts +11 -0
- package/dist/search/fts.d.ts.map +1 -0
- package/dist/search/fts.js +50 -0
- package/dist/search/fts.js.map +1 -0
- package/dist/search/hybrid.d.ts +16 -0
- package/dist/search/hybrid.d.ts.map +1 -0
- package/dist/search/hybrid.js +83 -0
- package/dist/search/hybrid.js.map +1 -0
- package/dist/search/index.d.ts +4 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +4 -0
- package/dist/search/index.js.map +1 -0
- package/dist/search/vector.d.ts +25 -0
- package/dist/search/vector.d.ts.map +1 -0
- package/dist/search/vector.js +152 -0
- package/dist/search/vector.js.map +1 -0
- package/dist/storage/index.d.ts +4 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +4 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/schema.d.ts +24 -0
- package/dist/storage/schema.d.ts.map +1 -0
- package/dist/storage/schema.js +175 -0
- package/dist/storage/schema.js.map +1 -0
- package/dist/storage/sqlite-vec.d.ts +22 -0
- package/dist/storage/sqlite-vec.d.ts.map +1 -0
- package/dist/storage/sqlite-vec.js +85 -0
- package/dist/storage/sqlite-vec.js.map +1 -0
- package/dist/storage/sqlite.d.ts +206 -0
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +352 -0
- package/dist/storage/sqlite.js.map +1 -0
- package/dist/sync/index.d.ts +4 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +4 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/minimatch.d.ts +6 -0
- package/dist/sync/minimatch.d.ts.map +1 -0
- package/dist/sync/minimatch.js +60 -0
- package/dist/sync/minimatch.js.map +1 -0
- package/dist/sync/session-monitor.d.ts +50 -0
- package/dist/sync/session-monitor.d.ts.map +1 -0
- package/dist/sync/session-monitor.js +126 -0
- package/dist/sync/session-monitor.js.map +1 -0
- package/dist/sync/watcher.d.ts +44 -0
- package/dist/sync/watcher.d.ts.map +1 -0
- package/dist/sync/watcher.js +110 -0
- package/dist/sync/watcher.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +3 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/memory-get.d.ts +32 -0
- package/dist/tools/memory-get.d.ts.map +1 -0
- package/dist/tools/memory-get.js +53 -0
- package/dist/tools/memory-get.js.map +1 -0
- package/dist/tools/memory-search.d.ts +32 -0
- package/dist/tools/memory-search.d.ts.map +1 -0
- package/dist/tools/memory-search.js +56 -0
- package/dist/tools/memory-search.js.map +1 -0
- package/dist/types.d.ts +350 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +15 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/concurrency.d.ts +25 -0
- package/dist/utils/concurrency.d.ts.map +1 -0
- package/dist/utils/concurrency.js +59 -0
- package/dist/utils/concurrency.js.map +1 -0
- package/dist/utils/hash.d.ts +9 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +16 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/retry.d.ts +22 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +48 -0
- package/dist/utils/retry.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
import { type SchemaStatus } from "./schema.js";
|
|
3
|
+
export type StorageOptions = {
|
|
4
|
+
/** Path to SQLite database file, or ":memory:" for in-memory */
|
|
5
|
+
path: string;
|
|
6
|
+
/** Enable WAL mode for better concurrent performance */
|
|
7
|
+
wal?: boolean;
|
|
8
|
+
};
|
|
9
|
+
export type CreateDatabaseResult = {
|
|
10
|
+
db: Database.Database;
|
|
11
|
+
schemaStatus: SchemaStatus;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Create and initialize a SQLite database connection
|
|
15
|
+
*/
|
|
16
|
+
export declare function createDatabase(options: StorageOptions): CreateDatabaseResult;
|
|
17
|
+
/**
|
|
18
|
+
* Storage wrapper for memory index operations
|
|
19
|
+
*/
|
|
20
|
+
export declare class MemoryStorage {
|
|
21
|
+
private db;
|
|
22
|
+
private _schemaStatus;
|
|
23
|
+
private _path;
|
|
24
|
+
constructor(options: StorageOptions);
|
|
25
|
+
/**
|
|
26
|
+
* Get the underlying database connection
|
|
27
|
+
*/
|
|
28
|
+
get database(): Database.Database;
|
|
29
|
+
/**
|
|
30
|
+
* Get the schema status
|
|
31
|
+
*/
|
|
32
|
+
get schemaStatus(): SchemaStatus;
|
|
33
|
+
/**
|
|
34
|
+
* Get the database file path
|
|
35
|
+
*/
|
|
36
|
+
get path(): string;
|
|
37
|
+
/**
|
|
38
|
+
* Get the database file size in bytes
|
|
39
|
+
*/
|
|
40
|
+
getSizeBytes(): number;
|
|
41
|
+
/**
|
|
42
|
+
* Close the database connection
|
|
43
|
+
*/
|
|
44
|
+
close(): void;
|
|
45
|
+
/**
|
|
46
|
+
* Execute a function within a transaction
|
|
47
|
+
* Automatically commits on success, rolls back on error
|
|
48
|
+
*/
|
|
49
|
+
transaction<T>(fn: () => T): T;
|
|
50
|
+
/**
|
|
51
|
+
* Execute a function within an immediate transaction (write lock)
|
|
52
|
+
*/
|
|
53
|
+
writeTransaction<T>(fn: () => T): T;
|
|
54
|
+
/**
|
|
55
|
+
* Get a meta value
|
|
56
|
+
*/
|
|
57
|
+
getMeta(key: string): string | undefined;
|
|
58
|
+
/**
|
|
59
|
+
* Set a meta value
|
|
60
|
+
*/
|
|
61
|
+
setMeta(key: string, value: string): void;
|
|
62
|
+
/**
|
|
63
|
+
* Get file entry by path
|
|
64
|
+
*/
|
|
65
|
+
getFile(path: string): {
|
|
66
|
+
path: string;
|
|
67
|
+
source: string;
|
|
68
|
+
hash: string;
|
|
69
|
+
mtime: number;
|
|
70
|
+
size: number;
|
|
71
|
+
} | undefined;
|
|
72
|
+
/**
|
|
73
|
+
* Upsert file entry
|
|
74
|
+
*/
|
|
75
|
+
upsertFile(file: {
|
|
76
|
+
path: string;
|
|
77
|
+
source: string;
|
|
78
|
+
hash: string;
|
|
79
|
+
mtime: number;
|
|
80
|
+
size: number;
|
|
81
|
+
}): void;
|
|
82
|
+
/**
|
|
83
|
+
* Delete file entry
|
|
84
|
+
*/
|
|
85
|
+
deleteFile(path: string): void;
|
|
86
|
+
/**
|
|
87
|
+
* Get all files
|
|
88
|
+
*/
|
|
89
|
+
getAllFiles(): {
|
|
90
|
+
path: string;
|
|
91
|
+
source: string;
|
|
92
|
+
hash: string;
|
|
93
|
+
mtime: number;
|
|
94
|
+
size: number;
|
|
95
|
+
}[];
|
|
96
|
+
/**
|
|
97
|
+
* Upsert chunk with FTS sync
|
|
98
|
+
*/
|
|
99
|
+
upsertChunk(chunk: {
|
|
100
|
+
id: string;
|
|
101
|
+
path: string;
|
|
102
|
+
source: string;
|
|
103
|
+
startLine: number;
|
|
104
|
+
endLine: number;
|
|
105
|
+
hash: string;
|
|
106
|
+
model: string;
|
|
107
|
+
text: string;
|
|
108
|
+
embedding: number[];
|
|
109
|
+
updatedAt: number;
|
|
110
|
+
}): void;
|
|
111
|
+
/**
|
|
112
|
+
* Delete chunks by path
|
|
113
|
+
*/
|
|
114
|
+
deleteChunksByPath(path: string): void;
|
|
115
|
+
/**
|
|
116
|
+
* Get all chunks
|
|
117
|
+
*/
|
|
118
|
+
getAllChunks(): {
|
|
119
|
+
id: string;
|
|
120
|
+
path: string;
|
|
121
|
+
source: string;
|
|
122
|
+
startLine: number;
|
|
123
|
+
endLine: number;
|
|
124
|
+
hash: string;
|
|
125
|
+
model: string;
|
|
126
|
+
text: string;
|
|
127
|
+
embedding: number[];
|
|
128
|
+
updatedAt: number;
|
|
129
|
+
}[];
|
|
130
|
+
/**
|
|
131
|
+
* Get cached embedding
|
|
132
|
+
*/
|
|
133
|
+
getCachedEmbedding(provider: string, model: string, providerKey: string, hash: string): number[] | undefined;
|
|
134
|
+
/**
|
|
135
|
+
* Cache embedding
|
|
136
|
+
*/
|
|
137
|
+
cacheEmbedding(provider: string, model: string, providerKey: string, hash: string, embedding: number[]): void;
|
|
138
|
+
/**
|
|
139
|
+
* Clear old cache entries
|
|
140
|
+
*/
|
|
141
|
+
clearOldCache(maxAgeMs: number): number;
|
|
142
|
+
/**
|
|
143
|
+
* Get file/chunk counts by source
|
|
144
|
+
*/
|
|
145
|
+
getSourceCounts(): {
|
|
146
|
+
source: string;
|
|
147
|
+
files: number;
|
|
148
|
+
chunks: number;
|
|
149
|
+
}[];
|
|
150
|
+
/**
|
|
151
|
+
* Delete all chunks and files by source
|
|
152
|
+
*/
|
|
153
|
+
deleteBySource(source: string): {
|
|
154
|
+
files: number;
|
|
155
|
+
chunks: number;
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* Upsert multiple chunks in a transaction (more efficient for batch operations)
|
|
159
|
+
*/
|
|
160
|
+
upsertChunksBatch(chunks: Array<{
|
|
161
|
+
id: string;
|
|
162
|
+
path: string;
|
|
163
|
+
source: string;
|
|
164
|
+
startLine: number;
|
|
165
|
+
endLine: number;
|
|
166
|
+
hash: string;
|
|
167
|
+
model: string;
|
|
168
|
+
text: string;
|
|
169
|
+
embedding: number[];
|
|
170
|
+
updatedAt: number;
|
|
171
|
+
sessionId?: string;
|
|
172
|
+
role?: string;
|
|
173
|
+
byteOffset?: number;
|
|
174
|
+
}>): void;
|
|
175
|
+
/**
|
|
176
|
+
* Get files by source
|
|
177
|
+
*/
|
|
178
|
+
getFilesBySource(source: string): {
|
|
179
|
+
path: string;
|
|
180
|
+
source: string;
|
|
181
|
+
hash: string;
|
|
182
|
+
mtime: number;
|
|
183
|
+
size: number;
|
|
184
|
+
byteOffset: number;
|
|
185
|
+
}[];
|
|
186
|
+
/**
|
|
187
|
+
* Update file byte offset (for session delta tracking)
|
|
188
|
+
*/
|
|
189
|
+
updateFileByteOffset(path: string, byteOffset: number): void;
|
|
190
|
+
/**
|
|
191
|
+
* Get chunks by source with optional pagination
|
|
192
|
+
*/
|
|
193
|
+
getChunksBySource(source: string, options?: {
|
|
194
|
+
limit?: number;
|
|
195
|
+
offset?: number;
|
|
196
|
+
}): {
|
|
197
|
+
id: string;
|
|
198
|
+
path: string;
|
|
199
|
+
source: string;
|
|
200
|
+
startLine: number;
|
|
201
|
+
endLine: number;
|
|
202
|
+
text: string;
|
|
203
|
+
embedding: number[];
|
|
204
|
+
}[];
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=sqlite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/storage/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,cAAc,GAAG;IAC3B,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,YAAY,EAAE,YAAY,CAAC;CAC5B,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,oBAAoB,CA6C5E;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,KAAK,CAAS;gBAEV,OAAO,EAAE,cAAc;IAOnC;;OAEG;IACH,IAAI,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAEhC;IAED;;OAEG;IACH,IAAI,YAAY,IAAI,YAAY,CAE/B;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,YAAY,IAAI,MAAM;IAWtB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;;OAGG;IACH,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;IAK9B;;OAEG;IACH,gBAAgB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;IAKnC;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAOxC;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIzC;;OAEG;IACH,OAAO,CACL,IAAI,EAAE,MAAM,GACX;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;IAM1F;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE;QACf,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,IAAI;IASR;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI9B;;OAEG;IACH,WAAW,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE;IAU5F;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI;IAmCR;;OAEG;IACH,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAatC;;OAEG;IACH,YAAY,IAAI;QACd,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;KACnB,EAAE;IA4BH;;OAEG;IACH,kBAAkB,CAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GACX,MAAM,EAAE,GAAG,SAAS;IAWvB;;OAEG;IACH,cAAc,CACZ,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EAAE,GAClB,IAAI;IAUP;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAQvC;;OAEG;IACH,eAAe,IAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE;IAoBtE;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IA8BjE;;OAEG;IACH,iBAAiB,CACf,MAAM,EAAE,KAAK,CAAC;QACZ,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC,GACD,IAAI;IAoDP;;OAEG;IACH,gBAAgB,CACd,MAAM,EAAE,MAAM,GACb;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE;IAsBpG;;OAEG;IACH,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAM5D;;OAEG;IACH,iBAAiB,CACf,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO,GAChD;QACD,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,EAAE;CA+BJ"}
|
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { mkdirSync, statSync } from "node:fs";
|
|
4
|
+
import { ensureMemoryIndexSchema, getSchemaVersion, migrateSchema, SCHEMA_VERSION, } from "./schema.js";
|
|
5
|
+
/**
|
|
6
|
+
* Create and initialize a SQLite database connection
|
|
7
|
+
*/
|
|
8
|
+
export function createDatabase(options) {
|
|
9
|
+
const { path, wal = true } = options;
|
|
10
|
+
// Ensure directory exists for file-based DBs
|
|
11
|
+
if (path !== ":memory:") {
|
|
12
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
13
|
+
}
|
|
14
|
+
const db = new Database(path);
|
|
15
|
+
// Enable WAL mode for better performance
|
|
16
|
+
if (wal && path !== ":memory:") {
|
|
17
|
+
db.pragma("journal_mode = WAL");
|
|
18
|
+
}
|
|
19
|
+
// Performance optimizations
|
|
20
|
+
db.pragma("synchronous = NORMAL");
|
|
21
|
+
db.pragma("cache_size = -64000"); // 64MB cache
|
|
22
|
+
db.pragma("temp_store = MEMORY");
|
|
23
|
+
// Check and apply schema
|
|
24
|
+
const currentVersion = getSchemaVersion(db);
|
|
25
|
+
let schemaStatus;
|
|
26
|
+
if (currentVersion === 0) {
|
|
27
|
+
// Fresh database - create full schema
|
|
28
|
+
schemaStatus = ensureMemoryIndexSchema(db);
|
|
29
|
+
}
|
|
30
|
+
else if (currentVersion < SCHEMA_VERSION) {
|
|
31
|
+
// Existing database - migrate
|
|
32
|
+
schemaStatus = migrateSchema(db, currentVersion);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
// Schema up to date - just check FTS
|
|
36
|
+
schemaStatus = {
|
|
37
|
+
version: currentVersion,
|
|
38
|
+
ftsAvailable: false,
|
|
39
|
+
};
|
|
40
|
+
try {
|
|
41
|
+
db.prepare("SELECT 1 FROM chunks_fts LIMIT 0").run();
|
|
42
|
+
schemaStatus.ftsAvailable = true;
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
schemaStatus.ftsError = err instanceof Error ? err.message : String(err);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return { db, schemaStatus };
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Storage wrapper for memory index operations
|
|
52
|
+
*/
|
|
53
|
+
export class MemoryStorage {
|
|
54
|
+
db;
|
|
55
|
+
_schemaStatus;
|
|
56
|
+
_path;
|
|
57
|
+
constructor(options) {
|
|
58
|
+
this._path = options.path;
|
|
59
|
+
const result = createDatabase(options);
|
|
60
|
+
this.db = result.db;
|
|
61
|
+
this._schemaStatus = result.schemaStatus;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get the underlying database connection
|
|
65
|
+
*/
|
|
66
|
+
get database() {
|
|
67
|
+
return this.db;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Get the schema status
|
|
71
|
+
*/
|
|
72
|
+
get schemaStatus() {
|
|
73
|
+
return this._schemaStatus;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get the database file path
|
|
77
|
+
*/
|
|
78
|
+
get path() {
|
|
79
|
+
return this._path;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get the database file size in bytes
|
|
83
|
+
*/
|
|
84
|
+
getSizeBytes() {
|
|
85
|
+
if (this._path === ":memory:") {
|
|
86
|
+
return 0;
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
return statSync(this._path).size;
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return 0;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Close the database connection
|
|
97
|
+
*/
|
|
98
|
+
close() {
|
|
99
|
+
this.db.close();
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Execute a function within a transaction
|
|
103
|
+
* Automatically commits on success, rolls back on error
|
|
104
|
+
*/
|
|
105
|
+
transaction(fn) {
|
|
106
|
+
const txn = this.db.transaction(fn);
|
|
107
|
+
return txn();
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Execute a function within an immediate transaction (write lock)
|
|
111
|
+
*/
|
|
112
|
+
writeTransaction(fn) {
|
|
113
|
+
const txn = this.db.transaction(fn);
|
|
114
|
+
return txn.immediate();
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get a meta value
|
|
118
|
+
*/
|
|
119
|
+
getMeta(key) {
|
|
120
|
+
const row = this.db.prepare("SELECT value FROM meta WHERE key = ?").get(key);
|
|
121
|
+
return row?.value;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Set a meta value
|
|
125
|
+
*/
|
|
126
|
+
setMeta(key, value) {
|
|
127
|
+
this.db.prepare("INSERT OR REPLACE INTO meta (key, value) VALUES (?, ?)").run(key, value);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Get file entry by path
|
|
131
|
+
*/
|
|
132
|
+
getFile(path) {
|
|
133
|
+
return this.db.prepare("SELECT * FROM files WHERE path = ?").get(path);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Upsert file entry
|
|
137
|
+
*/
|
|
138
|
+
upsertFile(file) {
|
|
139
|
+
this.db
|
|
140
|
+
.prepare(`INSERT OR REPLACE INTO files (path, source, hash, mtime, size)
|
|
141
|
+
VALUES (?, ?, ?, ?, ?)`)
|
|
142
|
+
.run(file.path, file.source, file.hash, file.mtime, file.size);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Delete file entry
|
|
146
|
+
*/
|
|
147
|
+
deleteFile(path) {
|
|
148
|
+
this.db.prepare("DELETE FROM files WHERE path = ?").run(path);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Get all files
|
|
152
|
+
*/
|
|
153
|
+
getAllFiles() {
|
|
154
|
+
return this.db.prepare("SELECT * FROM files").all();
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Upsert chunk with FTS sync
|
|
158
|
+
*/
|
|
159
|
+
upsertChunk(chunk) {
|
|
160
|
+
const embeddingJson = JSON.stringify(chunk.embedding);
|
|
161
|
+
// Delete existing from FTS if exists
|
|
162
|
+
this.db.prepare("DELETE FROM chunks_fts WHERE id = ?").run(chunk.id);
|
|
163
|
+
// Upsert chunk
|
|
164
|
+
this.db
|
|
165
|
+
.prepare(`INSERT OR REPLACE INTO chunks
|
|
166
|
+
(id, path, source, start_line, end_line, hash, model, text, embedding, updated_at)
|
|
167
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
168
|
+
.run(chunk.id, chunk.path, chunk.source, chunk.startLine, chunk.endLine, chunk.hash, chunk.model, chunk.text, embeddingJson, chunk.updatedAt);
|
|
169
|
+
// Insert into FTS
|
|
170
|
+
this.db
|
|
171
|
+
.prepare(`INSERT INTO chunks_fts (text, id, path, source, model, start_line, end_line)
|
|
172
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`)
|
|
173
|
+
.run(chunk.text, chunk.id, chunk.path, chunk.source, chunk.model, chunk.startLine, chunk.endLine);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Delete chunks by path
|
|
177
|
+
*/
|
|
178
|
+
deleteChunksByPath(path) {
|
|
179
|
+
// Get chunk IDs first
|
|
180
|
+
const chunks = this.db.prepare("SELECT id FROM chunks WHERE path = ?").all(path);
|
|
181
|
+
for (const chunk of chunks) {
|
|
182
|
+
this.db.prepare("DELETE FROM chunks_fts WHERE id = ?").run(chunk.id);
|
|
183
|
+
}
|
|
184
|
+
this.db.prepare("DELETE FROM chunks WHERE path = ?").run(path);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Get all chunks
|
|
188
|
+
*/
|
|
189
|
+
getAllChunks() {
|
|
190
|
+
const rows = this.db.prepare("SELECT * FROM chunks").all();
|
|
191
|
+
return rows.map((row) => ({
|
|
192
|
+
id: row.id,
|
|
193
|
+
path: row.path,
|
|
194
|
+
source: row.source,
|
|
195
|
+
startLine: row.start_line,
|
|
196
|
+
endLine: row.end_line,
|
|
197
|
+
hash: row.hash,
|
|
198
|
+
model: row.model,
|
|
199
|
+
text: row.text,
|
|
200
|
+
embedding: JSON.parse(row.embedding),
|
|
201
|
+
updatedAt: row.updated_at,
|
|
202
|
+
}));
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Get cached embedding
|
|
206
|
+
*/
|
|
207
|
+
getCachedEmbedding(provider, model, providerKey, hash) {
|
|
208
|
+
const row = this.db
|
|
209
|
+
.prepare(`SELECT embedding FROM embedding_cache
|
|
210
|
+
WHERE provider = ? AND model = ? AND provider_key = ? AND hash = ?`)
|
|
211
|
+
.get(provider, model, providerKey, hash);
|
|
212
|
+
return row ? JSON.parse(row.embedding) : undefined;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Cache embedding
|
|
216
|
+
*/
|
|
217
|
+
cacheEmbedding(provider, model, providerKey, hash, embedding) {
|
|
218
|
+
this.db
|
|
219
|
+
.prepare(`INSERT OR REPLACE INTO embedding_cache
|
|
220
|
+
(provider, model, provider_key, hash, embedding, dims, updated_at)
|
|
221
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`)
|
|
222
|
+
.run(provider, model, providerKey, hash, JSON.stringify(embedding), embedding.length, Date.now());
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Clear old cache entries
|
|
226
|
+
*/
|
|
227
|
+
clearOldCache(maxAgeMs) {
|
|
228
|
+
const cutoff = Date.now() - maxAgeMs;
|
|
229
|
+
const result = this.db
|
|
230
|
+
.prepare("DELETE FROM embedding_cache WHERE updated_at < ?")
|
|
231
|
+
.run(cutoff);
|
|
232
|
+
return result.changes;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Get file/chunk counts by source
|
|
236
|
+
*/
|
|
237
|
+
getSourceCounts() {
|
|
238
|
+
const files = this.db
|
|
239
|
+
.prepare("SELECT source, COUNT(*) as count FROM files GROUP BY source")
|
|
240
|
+
.all();
|
|
241
|
+
const chunks = this.db
|
|
242
|
+
.prepare("SELECT source, COUNT(*) as count FROM chunks GROUP BY source")
|
|
243
|
+
.all();
|
|
244
|
+
const fileMap = new Map(files.map((f) => [f.source, f.count]));
|
|
245
|
+
const chunkMap = new Map(chunks.map((c) => [c.source, c.count]));
|
|
246
|
+
const sources = new Set([...fileMap.keys(), ...chunkMap.keys()]);
|
|
247
|
+
return Array.from(sources).map((source) => ({
|
|
248
|
+
source,
|
|
249
|
+
files: fileMap.get(source) ?? 0,
|
|
250
|
+
chunks: chunkMap.get(source) ?? 0,
|
|
251
|
+
}));
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Delete all chunks and files by source
|
|
255
|
+
*/
|
|
256
|
+
deleteBySource(source) {
|
|
257
|
+
return this.writeTransaction(() => {
|
|
258
|
+
// Get chunk IDs to delete from FTS
|
|
259
|
+
const chunks = this.db
|
|
260
|
+
.prepare("SELECT id FROM chunks WHERE source = ?")
|
|
261
|
+
.all(source);
|
|
262
|
+
// Delete from FTS
|
|
263
|
+
const deleteFts = this.db.prepare("DELETE FROM chunks_fts WHERE id = ?");
|
|
264
|
+
for (const chunk of chunks) {
|
|
265
|
+
deleteFts.run(chunk.id);
|
|
266
|
+
}
|
|
267
|
+
// Delete chunks
|
|
268
|
+
const chunkResult = this.db
|
|
269
|
+
.prepare("DELETE FROM chunks WHERE source = ?")
|
|
270
|
+
.run(source);
|
|
271
|
+
// Delete files
|
|
272
|
+
const fileResult = this.db
|
|
273
|
+
.prepare("DELETE FROM files WHERE source = ?")
|
|
274
|
+
.run(source);
|
|
275
|
+
return {
|
|
276
|
+
files: fileResult.changes,
|
|
277
|
+
chunks: chunkResult.changes,
|
|
278
|
+
};
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Upsert multiple chunks in a transaction (more efficient for batch operations)
|
|
283
|
+
*/
|
|
284
|
+
upsertChunksBatch(chunks) {
|
|
285
|
+
if (chunks.length === 0)
|
|
286
|
+
return;
|
|
287
|
+
this.writeTransaction(() => {
|
|
288
|
+
const deleteFts = this.db.prepare("DELETE FROM chunks_fts WHERE id = ?");
|
|
289
|
+
const insertChunk = this.db.prepare(`INSERT OR REPLACE INTO chunks
|
|
290
|
+
(id, path, source, start_line, end_line, hash, model, text, embedding, updated_at, session_id, role, byte_offset)
|
|
291
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
292
|
+
const insertFts = this.db.prepare(`INSERT INTO chunks_fts (text, id, path, source, model, start_line, end_line)
|
|
293
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`);
|
|
294
|
+
for (const chunk of chunks) {
|
|
295
|
+
const embeddingJson = JSON.stringify(chunk.embedding);
|
|
296
|
+
// Delete existing from FTS
|
|
297
|
+
deleteFts.run(chunk.id);
|
|
298
|
+
// Insert chunk
|
|
299
|
+
insertChunk.run(chunk.id, chunk.path, chunk.source, chunk.startLine, chunk.endLine, chunk.hash, chunk.model, chunk.text, embeddingJson, chunk.updatedAt, chunk.sessionId ?? null, chunk.role ?? null, chunk.byteOffset ?? 0);
|
|
300
|
+
// Insert into FTS
|
|
301
|
+
insertFts.run(chunk.text, chunk.id, chunk.path, chunk.source, chunk.model, chunk.startLine, chunk.endLine);
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Get files by source
|
|
307
|
+
*/
|
|
308
|
+
getFilesBySource(source) {
|
|
309
|
+
const rows = this.db
|
|
310
|
+
.prepare("SELECT path, source, hash, mtime, size, byte_offset FROM files WHERE source = ?")
|
|
311
|
+
.all(source);
|
|
312
|
+
return rows.map((row) => ({
|
|
313
|
+
path: row.path,
|
|
314
|
+
source: row.source,
|
|
315
|
+
hash: row.hash,
|
|
316
|
+
mtime: row.mtime,
|
|
317
|
+
size: row.size,
|
|
318
|
+
byteOffset: row.byte_offset ?? 0,
|
|
319
|
+
}));
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Update file byte offset (for session delta tracking)
|
|
323
|
+
*/
|
|
324
|
+
updateFileByteOffset(path, byteOffset) {
|
|
325
|
+
this.db
|
|
326
|
+
.prepare("UPDATE files SET byte_offset = ? WHERE path = ?")
|
|
327
|
+
.run(byteOffset, path);
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Get chunks by source with optional pagination
|
|
331
|
+
*/
|
|
332
|
+
getChunksBySource(source, options = {}) {
|
|
333
|
+
const { limit, offset = 0 } = options;
|
|
334
|
+
let sql = "SELECT id, path, source, start_line, end_line, text, embedding FROM chunks WHERE source = ?";
|
|
335
|
+
const params = [source];
|
|
336
|
+
if (limit !== undefined) {
|
|
337
|
+
sql += " LIMIT ? OFFSET ?";
|
|
338
|
+
params.push(limit, offset);
|
|
339
|
+
}
|
|
340
|
+
const rows = this.db.prepare(sql).all(...params);
|
|
341
|
+
return rows.map((row) => ({
|
|
342
|
+
id: row.id,
|
|
343
|
+
path: row.path,
|
|
344
|
+
source: row.source,
|
|
345
|
+
startLine: row.start_line,
|
|
346
|
+
endLine: row.end_line,
|
|
347
|
+
text: row.text,
|
|
348
|
+
embedding: JSON.parse(row.embedding),
|
|
349
|
+
}));
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/storage/sqlite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA2B,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,cAAc,EAA8B,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minimatch.d.ts","sourceRoot":"","sources":["../../src/sync/minimatch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAQhE"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple glob pattern matching for file paths
|
|
3
|
+
* Supports: *, **, ?
|
|
4
|
+
*/
|
|
5
|
+
export function minimatch(path, pattern) {
|
|
6
|
+
// Normalize path separators
|
|
7
|
+
const normalizedPath = path.replace(/\\/g, "/");
|
|
8
|
+
const normalizedPattern = pattern.replace(/\\/g, "/");
|
|
9
|
+
// Convert glob pattern to regex
|
|
10
|
+
const regexPattern = globToRegex(normalizedPattern);
|
|
11
|
+
return regexPattern.test(normalizedPath);
|
|
12
|
+
}
|
|
13
|
+
function globToRegex(pattern) {
|
|
14
|
+
let regex = "";
|
|
15
|
+
let i = 0;
|
|
16
|
+
while (i < pattern.length) {
|
|
17
|
+
const char = pattern[i];
|
|
18
|
+
if (char === "*") {
|
|
19
|
+
if (pattern[i + 1] === "*") {
|
|
20
|
+
// ** matches any path segments
|
|
21
|
+
if (pattern[i + 2] === "/") {
|
|
22
|
+
regex += "(?:.*/)?";
|
|
23
|
+
i += 3;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
regex += ".*";
|
|
27
|
+
i += 2;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// * matches anything except /
|
|
32
|
+
regex += "[^/]*";
|
|
33
|
+
i++;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
else if (char === "?") {
|
|
37
|
+
// ? matches any single character except /
|
|
38
|
+
regex += "[^/]";
|
|
39
|
+
i++;
|
|
40
|
+
}
|
|
41
|
+
else if (char === ".") {
|
|
42
|
+
regex += "\\.";
|
|
43
|
+
i++;
|
|
44
|
+
}
|
|
45
|
+
else if (char === "/") {
|
|
46
|
+
regex += "/";
|
|
47
|
+
i++;
|
|
48
|
+
}
|
|
49
|
+
else if ("[{(".includes(char)) {
|
|
50
|
+
regex += "\\" + char;
|
|
51
|
+
i++;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
regex += char;
|
|
55
|
+
i++;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return new RegExp("^" + regex + "$");
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=minimatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minimatch.js","sourceRoot":"","sources":["../../src/sync/minimatch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,OAAe;IACrD,4BAA4B;IAC5B,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAChD,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAEtD,gCAAgC;IAChC,MAAM,YAAY,GAAG,WAAW,CAAC,iBAAiB,CAAC,CAAC;IACpD,OAAO,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,WAAW,CAAC,OAAe;IAClC,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAExB,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC3B,+BAA+B;gBAC/B,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBAC3B,KAAK,IAAI,UAAU,CAAC;oBACpB,CAAC,IAAI,CAAC,CAAC;gBACT,CAAC;qBAAM,CAAC;oBACN,KAAK,IAAI,IAAI,CAAC;oBACd,CAAC,IAAI,CAAC,CAAC;gBACT,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,8BAA8B;gBAC9B,KAAK,IAAI,OAAO,CAAC;gBACjB,CAAC,EAAE,CAAC;YACN,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACxB,0CAA0C;YAC1C,KAAK,IAAI,MAAM,CAAC;YAChB,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACxB,KAAK,IAAI,KAAK,CAAC;YACf,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACxB,KAAK,IAAI,GAAG,CAAC;YACb,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC;YACrB,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,CAAC;YACN,KAAK,IAAI,IAAI,CAAC;YACd,CAAC,EAAE,CAAC;QACN,CAAC;IACH,CAAC;IAED,OAAO,IAAI,MAAM,CAAC,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC;AACvC,CAAC"}
|