mindgraph-core 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/embeddings/embedder-interface.d.ts +15 -0
- package/dist/embeddings/embedder-interface.d.ts.map +1 -0
- package/dist/embeddings/embedder-interface.js +2 -0
- package/dist/embeddings/embedder-interface.js.map +1 -0
- package/dist/embeddings/ollama-embedder.d.ts +21 -0
- package/dist/embeddings/ollama-embedder.d.ts.map +1 -0
- package/dist/embeddings/ollama-embedder.js +78 -0
- package/dist/embeddings/ollama-embedder.js.map +1 -0
- package/dist/embeddings/transformers-embedder.d.ts +20 -0
- package/dist/embeddings/transformers-embedder.d.ts.map +1 -0
- package/dist/embeddings/transformers-embedder.js +61 -0
- package/dist/embeddings/transformers-embedder.js.map +1 -0
- package/dist/extraction/anthropic-extractor.d.ts +17 -0
- package/dist/extraction/anthropic-extractor.d.ts.map +1 -0
- package/dist/extraction/anthropic-extractor.js +43 -0
- package/dist/extraction/anthropic-extractor.js.map +1 -0
- package/dist/extraction/basic-extractor.d.ts +17 -0
- package/dist/extraction/basic-extractor.d.ts.map +1 -0
- package/dist/extraction/basic-extractor.js +135 -0
- package/dist/extraction/basic-extractor.js.map +1 -0
- package/dist/extraction/confidence-gate.d.ts +7 -0
- package/dist/extraction/confidence-gate.d.ts.map +1 -0
- package/dist/extraction/confidence-gate.js +13 -0
- package/dist/extraction/confidence-gate.js.map +1 -0
- package/dist/extraction/contradiction-detector.d.ts +46 -0
- package/dist/extraction/contradiction-detector.d.ts.map +1 -0
- package/dist/extraction/contradiction-detector.js +205 -0
- package/dist/extraction/contradiction-detector.js.map +1 -0
- package/dist/extraction/entity-index.d.ts +31 -0
- package/dist/extraction/entity-index.d.ts.map +1 -0
- package/dist/extraction/entity-index.js +90 -0
- package/dist/extraction/entity-index.js.map +1 -0
- package/dist/extraction/entity-resolver.d.ts +28 -0
- package/dist/extraction/entity-resolver.d.ts.map +1 -0
- package/dist/extraction/entity-resolver.js +111 -0
- package/dist/extraction/entity-resolver.js.map +1 -0
- package/dist/extraction/extractor-interface.d.ts +51 -0
- package/dist/extraction/extractor-interface.d.ts.map +1 -0
- package/dist/extraction/extractor-interface.js +2 -0
- package/dist/extraction/extractor-interface.js.map +1 -0
- package/dist/extraction/llm-extractor.d.ts +21 -0
- package/dist/extraction/llm-extractor.d.ts.map +1 -0
- package/dist/extraction/llm-extractor.js +97 -0
- package/dist/extraction/llm-extractor.js.map +1 -0
- package/dist/extraction/ollama-extractor.d.ts +18 -0
- package/dist/extraction/ollama-extractor.d.ts.map +1 -0
- package/dist/extraction/ollama-extractor.js +50 -0
- package/dist/extraction/ollama-extractor.js.map +1 -0
- package/dist/extraction/open-loop-detector.d.ts +24 -0
- package/dist/extraction/open-loop-detector.d.ts.map +1 -0
- package/dist/extraction/open-loop-detector.js +187 -0
- package/dist/extraction/open-loop-detector.js.map +1 -0
- package/dist/extraction/openai-extractor.d.ts +20 -0
- package/dist/extraction/openai-extractor.d.ts.map +1 -0
- package/dist/extraction/openai-extractor.js +44 -0
- package/dist/extraction/openai-extractor.js.map +1 -0
- package/dist/extraction/prompts/entity-extraction.d.ts +2 -0
- package/dist/extraction/prompts/entity-extraction.d.ts.map +1 -0
- package/dist/extraction/prompts/entity-extraction.js +42 -0
- package/dist/extraction/prompts/entity-extraction.js.map +1 -0
- package/dist/extraction/prompts/proposition-extraction.d.ts +2 -0
- package/dist/extraction/prompts/proposition-extraction.d.ts.map +1 -0
- package/dist/extraction/prompts/proposition-extraction.js +39 -0
- package/dist/extraction/prompts/proposition-extraction.js.map +1 -0
- package/dist/extraction/prompts/thought-extraction.d.ts +2 -0
- package/dist/extraction/prompts/thought-extraction.d.ts.map +1 -0
- package/dist/extraction/prompts/thought-extraction.js +41 -0
- package/dist/extraction/prompts/thought-extraction.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/ingestion/chunk-id.d.ts +27 -0
- package/dist/ingestion/chunk-id.d.ts.map +1 -0
- package/dist/ingestion/chunk-id.js +45 -0
- package/dist/ingestion/chunk-id.js.map +1 -0
- package/dist/ingestion/chunker.d.ts +29 -0
- package/dist/ingestion/chunker.d.ts.map +1 -0
- package/dist/ingestion/chunker.js +182 -0
- package/dist/ingestion/chunker.js.map +1 -0
- package/dist/ingestion/hasher.d.ts +7 -0
- package/dist/ingestion/hasher.d.ts.map +1 -0
- package/dist/ingestion/hasher.js +18 -0
- package/dist/ingestion/hasher.js.map +1 -0
- package/dist/ingestion/pipeline.d.ts +58 -0
- package/dist/ingestion/pipeline.d.ts.map +1 -0
- package/dist/ingestion/pipeline.js +653 -0
- package/dist/ingestion/pipeline.js.map +1 -0
- package/dist/models/citation.d.ts +2 -0
- package/dist/models/citation.d.ts.map +1 -0
- package/dist/models/citation.js +2 -0
- package/dist/models/citation.js.map +1 -0
- package/dist/models/extraction-result.d.ts +2 -0
- package/dist/models/extraction-result.d.ts.map +1 -0
- package/dist/models/extraction-result.js +2 -0
- package/dist/models/extraction-result.js.map +1 -0
- package/dist/models/query-result.d.ts +2 -0
- package/dist/models/query-result.d.ts.map +1 -0
- package/dist/models/query-result.js +2 -0
- package/dist/models/query-result.js.map +1 -0
- package/dist/query/answer-builder.d.ts +15 -0
- package/dist/query/answer-builder.d.ts.map +1 -0
- package/dist/query/answer-builder.js +51 -0
- package/dist/query/answer-builder.js.map +1 -0
- package/dist/query/citation-builder.d.ts +19 -0
- package/dist/query/citation-builder.d.ts.map +1 -0
- package/dist/query/citation-builder.js +54 -0
- package/dist/query/citation-builder.js.map +1 -0
- package/dist/query/graph-data.d.ts +39 -0
- package/dist/query/graph-data.d.ts.map +1 -0
- package/dist/query/graph-data.js +115 -0
- package/dist/query/graph-data.js.map +1 -0
- package/dist/query/graph-search.d.ts +43 -0
- package/dist/query/graph-search.d.ts.map +1 -0
- package/dist/query/graph-search.js +315 -0
- package/dist/query/graph-search.js.map +1 -0
- package/dist/query/query-engine.d.ts +41 -0
- package/dist/query/query-engine.d.ts.map +1 -0
- package/dist/query/query-engine.js +178 -0
- package/dist/query/query-engine.js.map +1 -0
- package/dist/query/semantic-search.d.ts +26 -0
- package/dist/query/semantic-search.d.ts.map +1 -0
- package/dist/query/semantic-search.js +132 -0
- package/dist/query/semantic-search.js.map +1 -0
- package/dist/schema/edge-types.d.ts +95 -0
- package/dist/schema/edge-types.d.ts.map +1 -0
- package/dist/schema/edge-types.js +6 -0
- package/dist/schema/edge-types.js.map +1 -0
- package/dist/schema/node-types.d.ts +100 -0
- package/dist/schema/node-types.d.ts.map +1 -0
- package/dist/schema/node-types.js +6 -0
- package/dist/schema/node-types.js.map +1 -0
- package/dist/schema/types.d.ts +134 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +52 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/schema/validation.d.ts +6 -0
- package/dist/schema/validation.d.ts.map +1 -0
- package/dist/schema/validation.js +140 -0
- package/dist/schema/validation.js.map +1 -0
- package/dist/storage/export-import.d.ts +28 -0
- package/dist/storage/export-import.d.ts.map +1 -0
- package/dist/storage/export-import.js +189 -0
- package/dist/storage/export-import.js.map +1 -0
- package/dist/storage/memory/memory-adapter.d.ts +36 -0
- package/dist/storage/memory/memory-adapter.d.ts.map +1 -0
- package/dist/storage/memory/memory-adapter.js +231 -0
- package/dist/storage/memory/memory-adapter.js.map +1 -0
- package/dist/storage/sqlite/graph-traversal.d.ts +11 -0
- package/dist/storage/sqlite/graph-traversal.d.ts.map +1 -0
- package/dist/storage/sqlite/graph-traversal.js +79 -0
- package/dist/storage/sqlite/graph-traversal.js.map +1 -0
- package/dist/storage/sqlite/query-builder.d.ts +8 -0
- package/dist/storage/sqlite/query-builder.d.ts.map +1 -0
- package/dist/storage/sqlite/query-builder.js +55 -0
- package/dist/storage/sqlite/query-builder.js.map +1 -0
- package/dist/storage/sqlite/sqlite-adapter.d.ts +53 -0
- package/dist/storage/sqlite/sqlite-adapter.d.ts.map +1 -0
- package/dist/storage/sqlite/sqlite-adapter.js +497 -0
- package/dist/storage/sqlite/sqlite-adapter.js.map +1 -0
- package/dist/storage/storage-interface.d.ts +64 -0
- package/dist/storage/storage-interface.d.ts.map +1 -0
- package/dist/storage/storage-interface.js +2 -0
- package/dist/storage/storage-interface.js.map +1 -0
- package/dist/utils/retry-fetch.d.ts +20 -0
- package/dist/utils/retry-fetch.d.ts.map +1 -0
- package/dist/utils/retry-fetch.js +71 -0
- package/dist/utils/retry-fetch.js.map +1 -0
- package/package.json +28 -0
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
import initSqlJs from 'sql.js';
|
|
2
|
+
import { buildTraversalCTE } from './graph-traversal.js';
|
|
3
|
+
function cosineSimilarity(a, b) {
|
|
4
|
+
let dot = 0, normA = 0, normB = 0;
|
|
5
|
+
for (let i = 0; i < a.length; i++) {
|
|
6
|
+
dot += a[i] * b[i];
|
|
7
|
+
normA += a[i] * a[i];
|
|
8
|
+
normB += b[i] * b[i];
|
|
9
|
+
}
|
|
10
|
+
const denom = Math.sqrt(normA) * Math.sqrt(normB);
|
|
11
|
+
return denom === 0 ? 0 : dot / denom;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Run a sql.js query and return results as an array of row objects.
|
|
15
|
+
*/
|
|
16
|
+
function queryAll(db, sql, params = []) {
|
|
17
|
+
const stmt = db.prepare(sql);
|
|
18
|
+
stmt.bind(params);
|
|
19
|
+
const rows = [];
|
|
20
|
+
while (stmt.step()) {
|
|
21
|
+
rows.push(stmt.getAsObject());
|
|
22
|
+
}
|
|
23
|
+
stmt.free();
|
|
24
|
+
return rows;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Run a sql.js query and return the first result row, or null.
|
|
28
|
+
*/
|
|
29
|
+
function queryOne(db, sql, params = []) {
|
|
30
|
+
const stmt = db.prepare(sql);
|
|
31
|
+
stmt.bind(params);
|
|
32
|
+
let row = null;
|
|
33
|
+
if (stmt.step()) {
|
|
34
|
+
row = stmt.getAsObject();
|
|
35
|
+
}
|
|
36
|
+
stmt.free();
|
|
37
|
+
return row;
|
|
38
|
+
}
|
|
39
|
+
// ─── Migrations (inline, no file reads) ────────────────────────────
|
|
40
|
+
const MIGRATION_001 = `
|
|
41
|
+
CREATE TABLE IF NOT EXISTS nodes (
|
|
42
|
+
id TEXT PRIMARY KEY,
|
|
43
|
+
node_type TEXT NOT NULL,
|
|
44
|
+
data TEXT NOT NULL DEFAULT '{}',
|
|
45
|
+
created_at TEXT NOT NULL,
|
|
46
|
+
updated_at TEXT NOT NULL
|
|
47
|
+
);
|
|
48
|
+
CREATE INDEX IF NOT EXISTS idx_nodes_type ON nodes(node_type);
|
|
49
|
+
CREATE INDEX IF NOT EXISTS idx_nodes_updated ON nodes(updated_at);
|
|
50
|
+
|
|
51
|
+
CREATE TABLE IF NOT EXISTS edges (
|
|
52
|
+
id TEXT PRIMARY KEY,
|
|
53
|
+
source_id TEXT NOT NULL,
|
|
54
|
+
target_id TEXT NOT NULL,
|
|
55
|
+
rel_type TEXT NOT NULL,
|
|
56
|
+
data TEXT NOT NULL DEFAULT '{}',
|
|
57
|
+
created_at TEXT NOT NULL,
|
|
58
|
+
FOREIGN KEY (source_id) REFERENCES nodes(id) ON DELETE CASCADE,
|
|
59
|
+
FOREIGN KEY (target_id) REFERENCES nodes(id) ON DELETE CASCADE
|
|
60
|
+
);
|
|
61
|
+
CREATE INDEX IF NOT EXISTS idx_edges_source ON edges(source_id);
|
|
62
|
+
CREATE INDEX IF NOT EXISTS idx_edges_target ON edges(target_id);
|
|
63
|
+
CREATE INDEX IF NOT EXISTS idx_edges_rel_type ON edges(rel_type);
|
|
64
|
+
CREATE INDEX IF NOT EXISTS idx_edges_source_rel ON edges(source_id, rel_type);
|
|
65
|
+
CREATE INDEX IF NOT EXISTS idx_edges_target_rel ON edges(target_id, rel_type);
|
|
66
|
+
|
|
67
|
+
CREATE TABLE IF NOT EXISTS embeddings (
|
|
68
|
+
chunk_id TEXT PRIMARY KEY,
|
|
69
|
+
vector BLOB NOT NULL,
|
|
70
|
+
model_id TEXT NOT NULL,
|
|
71
|
+
dimensions INTEGER NOT NULL,
|
|
72
|
+
created_at TEXT NOT NULL,
|
|
73
|
+
FOREIGN KEY (chunk_id) REFERENCES nodes(id) ON DELETE CASCADE
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS chunks_fts USING fts4(chunk_id, text, tokenize=porter);
|
|
77
|
+
|
|
78
|
+
CREATE TABLE IF NOT EXISTS schema_migrations (
|
|
79
|
+
version INTEGER PRIMARY KEY,
|
|
80
|
+
applied_at TEXT NOT NULL
|
|
81
|
+
);
|
|
82
|
+
INSERT OR IGNORE INTO schema_migrations (version, applied_at) VALUES (1, datetime('now'));
|
|
83
|
+
`;
|
|
84
|
+
const MIGRATION_002 = `
|
|
85
|
+
CREATE INDEX IF NOT EXISTS idx_edges_believes
|
|
86
|
+
ON edges(source_id, rel_type) WHERE rel_type = 'BELIEVES';
|
|
87
|
+
CREATE INDEX IF NOT EXISTS idx_edges_contradicts
|
|
88
|
+
ON edges(source_id, rel_type) WHERE rel_type = 'CONTRADICTS';
|
|
89
|
+
CREATE INDEX IF NOT EXISTS idx_edges_derived_from
|
|
90
|
+
ON edges(target_id, rel_type) WHERE rel_type = 'DERIVED_FROM';
|
|
91
|
+
CREATE INDEX IF NOT EXISTS idx_edges_about
|
|
92
|
+
ON edges(source_id, rel_type) WHERE rel_type = 'ABOUT';
|
|
93
|
+
INSERT OR IGNORE INTO schema_migrations (version, applied_at) VALUES (2, datetime('now'));
|
|
94
|
+
`;
|
|
95
|
+
const MIGRATION_003 = `
|
|
96
|
+
CREATE TABLE IF NOT EXISTS meta (key TEXT PRIMARY KEY, value TEXT NOT NULL);
|
|
97
|
+
INSERT OR REPLACE INTO meta (key, value) VALUES ('schemaVersion', '3');
|
|
98
|
+
INSERT OR REPLACE INTO meta (key, value) VALUES ('createdAt', datetime('now'));
|
|
99
|
+
INSERT OR REPLACE INTO meta (key, value) VALUES ('lastMigrationAt', datetime('now'));
|
|
100
|
+
CREATE INDEX IF NOT EXISTS idx_edges_endorses
|
|
101
|
+
ON edges(source_id, rel_type) WHERE rel_type = 'ENDORSES';
|
|
102
|
+
INSERT OR IGNORE INTO schema_migrations (version, applied_at) VALUES (3, datetime('now'));
|
|
103
|
+
`;
|
|
104
|
+
class FilePersistence {
|
|
105
|
+
constructor(path) {
|
|
106
|
+
this.path = path;
|
|
107
|
+
}
|
|
108
|
+
async load() {
|
|
109
|
+
try {
|
|
110
|
+
// Dynamic import — only used in Node.js / Electron
|
|
111
|
+
const { readFileSync } = await import('fs');
|
|
112
|
+
const buf = readFileSync(this.path);
|
|
113
|
+
return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return null; // file doesn't exist yet
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async save(data) {
|
|
120
|
+
const { writeFileSync, mkdirSync, renameSync, openSync, fsyncSync, closeSync } = await import('fs');
|
|
121
|
+
const { dirname } = await import('path');
|
|
122
|
+
try {
|
|
123
|
+
mkdirSync(dirname(this.path), { recursive: true });
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
// ignore
|
|
127
|
+
}
|
|
128
|
+
// Atomic write: write-to-tmp → fsync → rename
|
|
129
|
+
const tmpPath = this.path + '.tmp';
|
|
130
|
+
writeFileSync(tmpPath, data);
|
|
131
|
+
// fsync to ensure data is flushed to disk
|
|
132
|
+
const fd = openSync(tmpPath, 'r');
|
|
133
|
+
fsyncSync(fd);
|
|
134
|
+
closeSync(fd);
|
|
135
|
+
// Atomic rename
|
|
136
|
+
renameSync(tmpPath, this.path);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// ─── SqliteAdapter (sql.js) ────────────────────────────────────────
|
|
140
|
+
export class SqliteAdapter {
|
|
141
|
+
constructor(dbPath) {
|
|
142
|
+
this.db = null;
|
|
143
|
+
this.saveTimer = null;
|
|
144
|
+
this.dirty = false;
|
|
145
|
+
this.saveDebounceMs = 1000;
|
|
146
|
+
this.persistence = new FilePersistence(dbPath);
|
|
147
|
+
}
|
|
148
|
+
async initialize() {
|
|
149
|
+
const SQL = await initSqlJs();
|
|
150
|
+
// Try to load existing database
|
|
151
|
+
const existing = await this.persistence.load();
|
|
152
|
+
this.db = existing ? new SQL.Database(existing) : new SQL.Database();
|
|
153
|
+
// Pragmas (no WAL — sql.js is in-memory)
|
|
154
|
+
this.db.run('PRAGMA foreign_keys = ON;');
|
|
155
|
+
await this.runMigrations();
|
|
156
|
+
}
|
|
157
|
+
async close() {
|
|
158
|
+
if (this.saveTimer) {
|
|
159
|
+
clearTimeout(this.saveTimer);
|
|
160
|
+
this.saveTimer = null;
|
|
161
|
+
}
|
|
162
|
+
await this.persist();
|
|
163
|
+
this.db?.close();
|
|
164
|
+
this.db = null;
|
|
165
|
+
}
|
|
166
|
+
getDb() {
|
|
167
|
+
if (!this.db)
|
|
168
|
+
throw new Error('Database not initialized. Call initialize() first.');
|
|
169
|
+
return this.db;
|
|
170
|
+
}
|
|
171
|
+
/** Write the in-memory database to disk. */
|
|
172
|
+
async persist() {
|
|
173
|
+
if (!this.dirty || !this.db)
|
|
174
|
+
return;
|
|
175
|
+
const data = this.db.export();
|
|
176
|
+
await this.persistence.save(data);
|
|
177
|
+
this.dirty = false;
|
|
178
|
+
}
|
|
179
|
+
/** Mark the database as changed and schedule a debounced save. */
|
|
180
|
+
markDirty() {
|
|
181
|
+
this.dirty = true;
|
|
182
|
+
if (this.saveTimer)
|
|
183
|
+
clearTimeout(this.saveTimer);
|
|
184
|
+
this.saveTimer = setTimeout(() => {
|
|
185
|
+
this.persist();
|
|
186
|
+
}, this.saveDebounceMs);
|
|
187
|
+
}
|
|
188
|
+
async runMigrations() {
|
|
189
|
+
const db = this.getDb();
|
|
190
|
+
const hasMigrationsTable = queryOne(db, "SELECT name FROM sqlite_master WHERE type='table' AND name='schema_migrations'");
|
|
191
|
+
let currentVersion = 0;
|
|
192
|
+
if (hasMigrationsTable) {
|
|
193
|
+
const row = queryOne(db, 'SELECT MAX(version) as version FROM schema_migrations');
|
|
194
|
+
currentVersion = row?.version ?? 0;
|
|
195
|
+
}
|
|
196
|
+
if (currentVersion < 1) {
|
|
197
|
+
db.exec(MIGRATION_001);
|
|
198
|
+
}
|
|
199
|
+
if (currentVersion < 2) {
|
|
200
|
+
db.exec(MIGRATION_002);
|
|
201
|
+
}
|
|
202
|
+
if (currentVersion < 3) {
|
|
203
|
+
db.exec(MIGRATION_003);
|
|
204
|
+
}
|
|
205
|
+
this.markDirty();
|
|
206
|
+
}
|
|
207
|
+
// ─── Node CRUD ───────────────────────────────────────────────────
|
|
208
|
+
async upsertNode(node) {
|
|
209
|
+
const db = this.getDb();
|
|
210
|
+
db.run(`INSERT INTO nodes (id, node_type, data, created_at, updated_at)
|
|
211
|
+
VALUES (?, ?, ?, ?, ?)
|
|
212
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
213
|
+
node_type = excluded.node_type,
|
|
214
|
+
data = excluded.data,
|
|
215
|
+
updated_at = excluded.updated_at`, [node.id, node.nodeType, JSON.stringify(node.data), node.createdAt, node.updatedAt]);
|
|
216
|
+
this.markDirty();
|
|
217
|
+
}
|
|
218
|
+
async getNode(id) {
|
|
219
|
+
const row = queryOne(this.getDb(), 'SELECT * FROM nodes WHERE id = ?', [id]);
|
|
220
|
+
return row ? this.rowToNode(row) : null;
|
|
221
|
+
}
|
|
222
|
+
async queryNodes(query) {
|
|
223
|
+
const db = this.getDb();
|
|
224
|
+
// Build query (simplified — no json_extract, filter in TS)
|
|
225
|
+
let sql = 'SELECT * FROM nodes';
|
|
226
|
+
const params = [];
|
|
227
|
+
const conditions = [];
|
|
228
|
+
if (query.nodeType) {
|
|
229
|
+
conditions.push('node_type = ?');
|
|
230
|
+
params.push(query.nodeType);
|
|
231
|
+
}
|
|
232
|
+
if (conditions.length > 0) {
|
|
233
|
+
sql += ' WHERE ' + conditions.join(' AND ');
|
|
234
|
+
}
|
|
235
|
+
sql += ' ORDER BY updated_at DESC';
|
|
236
|
+
if (query.limit) {
|
|
237
|
+
sql += ' LIMIT ?';
|
|
238
|
+
params.push(query.limit);
|
|
239
|
+
}
|
|
240
|
+
if (query.offset) {
|
|
241
|
+
sql += ' OFFSET ?';
|
|
242
|
+
params.push(query.offset);
|
|
243
|
+
}
|
|
244
|
+
let rows = queryAll(db, sql, params).map((r) => this.rowToNode(r));
|
|
245
|
+
// Apply JSON field filters in TypeScript
|
|
246
|
+
if (query.where) {
|
|
247
|
+
rows = rows.filter((node) => {
|
|
248
|
+
for (const [key, value] of Object.entries(query.where)) {
|
|
249
|
+
if (node.data[key] !== value)
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
return true;
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
return rows;
|
|
256
|
+
}
|
|
257
|
+
async deleteNode(id) {
|
|
258
|
+
this.getDb().run('DELETE FROM nodes WHERE id = ?', [id]);
|
|
259
|
+
this.markDirty();
|
|
260
|
+
}
|
|
261
|
+
async deleteNodesByData(nodeType, field, value) {
|
|
262
|
+
// Fetch, filter in TS, delete by ID
|
|
263
|
+
const candidates = queryAll(this.getDb(), 'SELECT id, data FROM nodes WHERE node_type = ?', [nodeType]);
|
|
264
|
+
let count = 0;
|
|
265
|
+
for (const row of candidates) {
|
|
266
|
+
const data = JSON.parse(row.data);
|
|
267
|
+
if (data[field] === value) {
|
|
268
|
+
this.getDb().run('DELETE FROM nodes WHERE id = ?', [row.id]);
|
|
269
|
+
count++;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
if (count > 0)
|
|
273
|
+
this.markDirty();
|
|
274
|
+
return count;
|
|
275
|
+
}
|
|
276
|
+
// ─── Edge CRUD ───────────────────────────────────────────────────
|
|
277
|
+
async upsertEdge(edge) {
|
|
278
|
+
this.getDb().run(`INSERT INTO edges (id, source_id, target_id, rel_type, data, created_at)
|
|
279
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
280
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
281
|
+
source_id = excluded.source_id,
|
|
282
|
+
target_id = excluded.target_id,
|
|
283
|
+
rel_type = excluded.rel_type,
|
|
284
|
+
data = excluded.data`, [edge.id, edge.sourceId, edge.targetId, edge.relType, JSON.stringify(edge.data), edge.createdAt]);
|
|
285
|
+
this.markDirty();
|
|
286
|
+
}
|
|
287
|
+
async getEdge(id) {
|
|
288
|
+
const row = queryOne(this.getDb(), 'SELECT * FROM edges WHERE id = ?', [id]);
|
|
289
|
+
return row ? this.rowToEdge(row) : null;
|
|
290
|
+
}
|
|
291
|
+
async queryEdges(query) {
|
|
292
|
+
const conditions = [];
|
|
293
|
+
const params = [];
|
|
294
|
+
if (query.sourceId) {
|
|
295
|
+
conditions.push('source_id = ?');
|
|
296
|
+
params.push(query.sourceId);
|
|
297
|
+
}
|
|
298
|
+
if (query.targetId) {
|
|
299
|
+
conditions.push('target_id = ?');
|
|
300
|
+
params.push(query.targetId);
|
|
301
|
+
}
|
|
302
|
+
if (query.relType) {
|
|
303
|
+
conditions.push('rel_type = ?');
|
|
304
|
+
params.push(query.relType);
|
|
305
|
+
}
|
|
306
|
+
let sql = 'SELECT * FROM edges';
|
|
307
|
+
if (conditions.length > 0)
|
|
308
|
+
sql += ' WHERE ' + conditions.join(' AND ');
|
|
309
|
+
sql += ' ORDER BY created_at DESC';
|
|
310
|
+
if (query.limit) {
|
|
311
|
+
sql += ' LIMIT ?';
|
|
312
|
+
params.push(query.limit);
|
|
313
|
+
}
|
|
314
|
+
return queryAll(this.getDb(), sql, params).map((r) => this.rowToEdge(r));
|
|
315
|
+
}
|
|
316
|
+
async deleteEdge(id) {
|
|
317
|
+
this.getDb().run('DELETE FROM edges WHERE id = ?', [id]);
|
|
318
|
+
this.markDirty();
|
|
319
|
+
}
|
|
320
|
+
async deleteEdgesByNode(nodeId) {
|
|
321
|
+
const db = this.getDb();
|
|
322
|
+
const before = queryOne(db, 'SELECT COUNT(*) as c FROM edges WHERE source_id = ? OR target_id = ?', [nodeId, nodeId]);
|
|
323
|
+
db.run('DELETE FROM edges WHERE source_id = ? OR target_id = ?', [nodeId, nodeId]);
|
|
324
|
+
const count = before?.c ?? 0;
|
|
325
|
+
if (count > 0)
|
|
326
|
+
this.markDirty();
|
|
327
|
+
return count;
|
|
328
|
+
}
|
|
329
|
+
// ─── Graph traversal ────────────────────────────────────────────
|
|
330
|
+
async traverse(options) {
|
|
331
|
+
const { sql, params } = buildTraversalCTE(options);
|
|
332
|
+
return queryAll(this.getDb(), sql, params).map((r) => this.rowToNode(r));
|
|
333
|
+
}
|
|
334
|
+
// ─── Embeddings ──────────────────────────────────────────────────
|
|
335
|
+
async upsertEmbedding(record) {
|
|
336
|
+
const vectorBytes = new Uint8Array(record.vector.buffer, record.vector.byteOffset, record.vector.byteLength);
|
|
337
|
+
this.getDb().run(`INSERT INTO embeddings (chunk_id, vector, model_id, dimensions, created_at)
|
|
338
|
+
VALUES (?, ?, ?, ?, ?)
|
|
339
|
+
ON CONFLICT(chunk_id) DO UPDATE SET
|
|
340
|
+
vector = excluded.vector,
|
|
341
|
+
model_id = excluded.model_id,
|
|
342
|
+
dimensions = excluded.dimensions`, [record.chunkId, vectorBytes, record.modelId, record.dimensions, record.createdAt]);
|
|
343
|
+
this.markDirty();
|
|
344
|
+
}
|
|
345
|
+
async getEmbedding(chunkId) {
|
|
346
|
+
const row = queryOne(this.getDb(), 'SELECT * FROM embeddings WHERE chunk_id = ?', [chunkId]);
|
|
347
|
+
if (!row)
|
|
348
|
+
return null;
|
|
349
|
+
const bytes = new Uint8Array(row.vector);
|
|
350
|
+
const dims = row.dimensions;
|
|
351
|
+
const vector = new Float32Array(bytes.buffer, bytes.byteOffset, dims);
|
|
352
|
+
return {
|
|
353
|
+
chunkId: row.chunk_id,
|
|
354
|
+
vector,
|
|
355
|
+
modelId: row.model_id,
|
|
356
|
+
dimensions: dims,
|
|
357
|
+
createdAt: row.created_at,
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
async similaritySearch(query) {
|
|
361
|
+
let sql = 'SELECT * FROM embeddings';
|
|
362
|
+
const params = [];
|
|
363
|
+
if (query.modelId) {
|
|
364
|
+
sql += ' WHERE model_id = ?';
|
|
365
|
+
params.push(query.modelId);
|
|
366
|
+
}
|
|
367
|
+
const rows = queryAll(this.getDb(), sql, params);
|
|
368
|
+
const scored = [];
|
|
369
|
+
for (const row of rows) {
|
|
370
|
+
const bytes = new Uint8Array(row.vector);
|
|
371
|
+
const dims = row.dimensions;
|
|
372
|
+
const vec = new Float32Array(bytes.buffer, bytes.byteOffset, dims);
|
|
373
|
+
const score = cosineSimilarity(query.vector, vec);
|
|
374
|
+
if (!query.threshold || score >= query.threshold) {
|
|
375
|
+
scored.push({ chunkId: row.chunk_id, score });
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
scored.sort((a, b) => b.score - a.score);
|
|
379
|
+
const topK = scored.slice(0, query.topK);
|
|
380
|
+
const results = [];
|
|
381
|
+
for (const item of topK) {
|
|
382
|
+
const node = await this.getNode(item.chunkId);
|
|
383
|
+
if (node) {
|
|
384
|
+
results.push({
|
|
385
|
+
chunkId: item.chunkId,
|
|
386
|
+
nodeId: item.chunkId,
|
|
387
|
+
score: item.score,
|
|
388
|
+
text: node.data.text ?? '',
|
|
389
|
+
notePath: node.data.notePath ?? '',
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
return results;
|
|
394
|
+
}
|
|
395
|
+
async deleteEmbedding(chunkId) {
|
|
396
|
+
this.getDb().run('DELETE FROM embeddings WHERE chunk_id = ?', [chunkId]);
|
|
397
|
+
this.markDirty();
|
|
398
|
+
}
|
|
399
|
+
// ─── Full-text search (FTS4) ─────────────────────────────────────
|
|
400
|
+
async fullTextSearch(query) {
|
|
401
|
+
const limit = query.limit ?? 20;
|
|
402
|
+
const rows = queryAll(this.getDb(), `SELECT chunk_id, text FROM chunks_fts WHERE chunks_fts MATCH ? LIMIT ?`, [query.query, limit]);
|
|
403
|
+
const results = [];
|
|
404
|
+
for (const row of rows) {
|
|
405
|
+
const node = await this.getNode(row.chunk_id);
|
|
406
|
+
results.push({
|
|
407
|
+
chunkId: row.chunk_id,
|
|
408
|
+
nodeId: row.chunk_id,
|
|
409
|
+
score: 1.0,
|
|
410
|
+
text: row.text,
|
|
411
|
+
notePath: node ? node.data.notePath ?? '' : '',
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
return results;
|
|
415
|
+
}
|
|
416
|
+
async upsertFTSEntry(chunkId, text) {
|
|
417
|
+
const db = this.getDb();
|
|
418
|
+
db.run('DELETE FROM chunks_fts WHERE chunk_id = ?', [chunkId]);
|
|
419
|
+
db.run('INSERT INTO chunks_fts (chunk_id, text) VALUES (?, ?)', [chunkId, text]);
|
|
420
|
+
this.markDirty();
|
|
421
|
+
}
|
|
422
|
+
async deleteFTSEntry(chunkId) {
|
|
423
|
+
this.getDb().run('DELETE FROM chunks_fts WHERE chunk_id = ?', [chunkId]);
|
|
424
|
+
this.markDirty();
|
|
425
|
+
}
|
|
426
|
+
// ─── Bulk operations ─────────────────────────────────────────────
|
|
427
|
+
async transaction(fn) {
|
|
428
|
+
const db = this.getDb();
|
|
429
|
+
db.run('BEGIN TRANSACTION');
|
|
430
|
+
try {
|
|
431
|
+
const result = await fn();
|
|
432
|
+
db.run('COMMIT');
|
|
433
|
+
this.markDirty();
|
|
434
|
+
return result;
|
|
435
|
+
}
|
|
436
|
+
catch (err) {
|
|
437
|
+
db.run('ROLLBACK');
|
|
438
|
+
throw err;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
// ─── Schema version ────────────────────────────────────────────
|
|
442
|
+
getSchemaVersion() {
|
|
443
|
+
const db = this.getDb();
|
|
444
|
+
const row = queryOne(db, "SELECT value FROM meta WHERE key = 'schemaVersion'");
|
|
445
|
+
return row ? Number(row.value) : 0;
|
|
446
|
+
}
|
|
447
|
+
getMetaValue(key) {
|
|
448
|
+
const db = this.getDb();
|
|
449
|
+
const row = queryOne(db, 'SELECT value FROM meta WHERE key = ?', [key]);
|
|
450
|
+
return row ? String(row.value) : null;
|
|
451
|
+
}
|
|
452
|
+
setMetaValue(key, value) {
|
|
453
|
+
this.getDb().run('INSERT OR REPLACE INTO meta (key, value) VALUES (?, ?)', [key, value]);
|
|
454
|
+
this.markDirty();
|
|
455
|
+
}
|
|
456
|
+
// ─── Integrity ─────────────────────────────────────────────────
|
|
457
|
+
async checkIntegrity() {
|
|
458
|
+
const db = this.getDb();
|
|
459
|
+
const row = queryOne(db, 'PRAGMA integrity_check');
|
|
460
|
+
const result = row ? String(Object.values(row)[0]) : 'unknown';
|
|
461
|
+
return { ok: result === 'ok', details: result };
|
|
462
|
+
}
|
|
463
|
+
// ─── Stats ───────────────────────────────────────────────────────
|
|
464
|
+
async getStats() {
|
|
465
|
+
const db = this.getDb();
|
|
466
|
+
const nodeCount = queryOne(db, 'SELECT COUNT(*) as c FROM nodes')?.c ?? 0;
|
|
467
|
+
const edgeCount = queryOne(db, 'SELECT COUNT(*) as c FROM edges')?.c ?? 0;
|
|
468
|
+
const embeddingCount = queryOne(db, 'SELECT COUNT(*) as c FROM embeddings')?.c ?? 0;
|
|
469
|
+
const typeRows = queryAll(db, 'SELECT node_type, COUNT(*) as c FROM nodes GROUP BY node_type');
|
|
470
|
+
const nodeCountByType = {};
|
|
471
|
+
for (const row of typeRows) {
|
|
472
|
+
nodeCountByType[row.node_type] = row.c;
|
|
473
|
+
}
|
|
474
|
+
return { nodeCount, edgeCount, embeddingCount, nodeCountByType };
|
|
475
|
+
}
|
|
476
|
+
// ─── Row mapping ─────────────────────────────────────────────────
|
|
477
|
+
rowToNode(row) {
|
|
478
|
+
return {
|
|
479
|
+
id: row.id,
|
|
480
|
+
nodeType: row.node_type,
|
|
481
|
+
data: JSON.parse(row.data),
|
|
482
|
+
createdAt: row.created_at,
|
|
483
|
+
updatedAt: row.updated_at ?? row.created_at,
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
rowToEdge(row) {
|
|
487
|
+
return {
|
|
488
|
+
id: row.id,
|
|
489
|
+
sourceId: row.source_id,
|
|
490
|
+
targetId: row.target_id,
|
|
491
|
+
relType: row.rel_type,
|
|
492
|
+
data: JSON.parse(row.data),
|
|
493
|
+
createdAt: row.created_at,
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
//# sourceMappingURL=sqlite-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-adapter.js","sourceRoot":"","sources":["../../../src/storage/sqlite/sqlite-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { GraphNode, GraphEdge, EmbeddingRecord, SearchResult, NodeType, RelType } from '../schema/types.js';
|
|
2
|
+
export interface NodeQuery {
|
|
3
|
+
nodeType?: NodeType;
|
|
4
|
+
where?: Record<string, unknown>;
|
|
5
|
+
limit?: number;
|
|
6
|
+
offset?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface EdgeQuery {
|
|
9
|
+
sourceId?: string;
|
|
10
|
+
targetId?: string;
|
|
11
|
+
relType?: RelType;
|
|
12
|
+
limit?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface TraversalOptions {
|
|
15
|
+
startNodeId: string;
|
|
16
|
+
relTypes?: RelType[];
|
|
17
|
+
direction?: 'outbound' | 'inbound' | 'both';
|
|
18
|
+
maxDepth?: number;
|
|
19
|
+
nodeTypeFilter?: NodeType[];
|
|
20
|
+
}
|
|
21
|
+
export interface SimilarityQuery {
|
|
22
|
+
vector: Float32Array;
|
|
23
|
+
topK: number;
|
|
24
|
+
threshold?: number;
|
|
25
|
+
modelId?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface FullTextQuery {
|
|
28
|
+
query: string;
|
|
29
|
+
limit?: number;
|
|
30
|
+
}
|
|
31
|
+
export interface StorageAdapter {
|
|
32
|
+
initialize(): Promise<void>;
|
|
33
|
+
close(): Promise<void>;
|
|
34
|
+
upsertNode(node: GraphNode): Promise<void>;
|
|
35
|
+
getNode(id: string): Promise<GraphNode | null>;
|
|
36
|
+
queryNodes(query: NodeQuery): Promise<GraphNode[]>;
|
|
37
|
+
deleteNode(id: string): Promise<void>;
|
|
38
|
+
deleteNodesByData(nodeType: NodeType, field: string, value: unknown): Promise<number>;
|
|
39
|
+
upsertEdge(edge: GraphEdge): Promise<void>;
|
|
40
|
+
getEdge(id: string): Promise<GraphEdge | null>;
|
|
41
|
+
queryEdges(query: EdgeQuery): Promise<GraphEdge[]>;
|
|
42
|
+
deleteEdge(id: string): Promise<void>;
|
|
43
|
+
deleteEdgesByNode(nodeId: string): Promise<number>;
|
|
44
|
+
traverse(options: TraversalOptions): Promise<GraphNode[]>;
|
|
45
|
+
upsertEmbedding(record: EmbeddingRecord): Promise<void>;
|
|
46
|
+
getEmbedding(chunkId: string): Promise<EmbeddingRecord | null>;
|
|
47
|
+
similaritySearch(query: SimilarityQuery): Promise<SearchResult[]>;
|
|
48
|
+
deleteEmbedding(chunkId: string): Promise<void>;
|
|
49
|
+
fullTextSearch(query: FullTextQuery): Promise<SearchResult[]>;
|
|
50
|
+
upsertFTSEntry(chunkId: string, text: string): Promise<void>;
|
|
51
|
+
deleteFTSEntry(chunkId: string): Promise<void>;
|
|
52
|
+
transaction<T>(fn: () => Promise<T>): Promise<T>;
|
|
53
|
+
checkIntegrity?(): Promise<{
|
|
54
|
+
ok: boolean;
|
|
55
|
+
details: string;
|
|
56
|
+
}>;
|
|
57
|
+
getStats(): Promise<{
|
|
58
|
+
nodeCount: number;
|
|
59
|
+
edgeCount: number;
|
|
60
|
+
embeddingCount: number;
|
|
61
|
+
nodeCountByType: Record<string, number>;
|
|
62
|
+
}>;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=storage-interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-interface.d.ts","sourceRoot":"","sources":["../../src/storage/storage-interface.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-interface.js","sourceRoot":"","sources":["../../src/storage/storage-interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface RetryFetchOptions {
|
|
2
|
+
maxRetries?: number;
|
|
3
|
+
baseDelayMs?: number;
|
|
4
|
+
timeoutMs?: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Structured error for non-retryable HTTP responses (4xx except 429).
|
|
8
|
+
* Exposes status and response body for programmatic handling.
|
|
9
|
+
*/
|
|
10
|
+
export declare class FetchError extends Error {
|
|
11
|
+
readonly status: number;
|
|
12
|
+
readonly body: string;
|
|
13
|
+
constructor(status: number, body: string);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Wraps fetch() with exponential backoff retry for 429/5xx and network errors.
|
|
17
|
+
* 4xx errors (except 429) fail immediately.
|
|
18
|
+
*/
|
|
19
|
+
export declare function retryFetch(url: string, init: RequestInit, options?: RetryFetchOptions): Promise<Response>;
|
|
20
|
+
//# sourceMappingURL=retry-fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-fetch.d.ts","sourceRoot":"","sources":["../../src/utils/retry-fetch.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBACV,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAMzC;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,QAAQ,CAAC,CAuDnB"}
|