stellar-memory 0.5.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/LICENSE +21 -0
- package/README.md +362 -0
- package/dist/api/routes/analytics.d.ts +15 -0
- package/dist/api/routes/analytics.js +131 -0
- package/dist/api/routes/analytics.js.map +1 -0
- package/dist/api/routes/conflicts.d.ts +12 -0
- package/dist/api/routes/conflicts.js +67 -0
- package/dist/api/routes/conflicts.js.map +1 -0
- package/dist/api/routes/consolidation.d.ts +11 -0
- package/dist/api/routes/consolidation.js +63 -0
- package/dist/api/routes/consolidation.js.map +1 -0
- package/dist/api/routes/constellation.d.ts +4 -0
- package/dist/api/routes/constellation.js +84 -0
- package/dist/api/routes/constellation.js.map +1 -0
- package/dist/api/routes/memories.d.ts +4 -0
- package/dist/api/routes/memories.js +219 -0
- package/dist/api/routes/memories.js.map +1 -0
- package/dist/api/routes/observations.d.ts +10 -0
- package/dist/api/routes/observations.js +42 -0
- package/dist/api/routes/observations.js.map +1 -0
- package/dist/api/routes/orbit.d.ts +4 -0
- package/dist/api/routes/orbit.js +71 -0
- package/dist/api/routes/orbit.js.map +1 -0
- package/dist/api/routes/projects.d.ts +15 -0
- package/dist/api/routes/projects.js +121 -0
- package/dist/api/routes/projects.js.map +1 -0
- package/dist/api/routes/scan.d.ts +4 -0
- package/dist/api/routes/scan.js +403 -0
- package/dist/api/routes/scan.js.map +1 -0
- package/dist/api/routes/sun.d.ts +4 -0
- package/dist/api/routes/sun.js +43 -0
- package/dist/api/routes/sun.js.map +1 -0
- package/dist/api/routes/system.d.ts +4 -0
- package/dist/api/routes/system.js +70 -0
- package/dist/api/routes/system.js.map +1 -0
- package/dist/api/routes/temporal.d.ts +13 -0
- package/dist/api/routes/temporal.js +82 -0
- package/dist/api/routes/temporal.js.map +1 -0
- package/dist/api/server.d.ts +2 -0
- package/dist/api/server.js +99 -0
- package/dist/api/server.js.map +1 -0
- package/dist/api/websocket.d.ts +53 -0
- package/dist/api/websocket.js +168 -0
- package/dist/api/websocket.js.map +1 -0
- package/dist/cli/index.d.ts +12 -0
- package/dist/cli/index.js +35 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +10 -0
- package/dist/cli/init.js +163 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/engine/analytics.d.ts +93 -0
- package/dist/engine/analytics.js +437 -0
- package/dist/engine/analytics.js.map +1 -0
- package/dist/engine/conflict.d.ts +54 -0
- package/dist/engine/conflict.js +322 -0
- package/dist/engine/conflict.js.map +1 -0
- package/dist/engine/consolidation.d.ts +83 -0
- package/dist/engine/consolidation.js +368 -0
- package/dist/engine/consolidation.js.map +1 -0
- package/dist/engine/constellation.d.ts +66 -0
- package/dist/engine/constellation.js +382 -0
- package/dist/engine/constellation.js.map +1 -0
- package/dist/engine/corona.d.ts +53 -0
- package/dist/engine/corona.js +181 -0
- package/dist/engine/corona.js.map +1 -0
- package/dist/engine/embedding.d.ts +44 -0
- package/dist/engine/embedding.js +168 -0
- package/dist/engine/embedding.js.map +1 -0
- package/dist/engine/gravity.d.ts +63 -0
- package/dist/engine/gravity.js +121 -0
- package/dist/engine/gravity.js.map +1 -0
- package/dist/engine/multiproject.d.ts +75 -0
- package/dist/engine/multiproject.js +241 -0
- package/dist/engine/multiproject.js.map +1 -0
- package/dist/engine/observation.d.ts +82 -0
- package/dist/engine/observation.js +357 -0
- package/dist/engine/observation.js.map +1 -0
- package/dist/engine/orbit.d.ts +91 -0
- package/dist/engine/orbit.js +249 -0
- package/dist/engine/orbit.js.map +1 -0
- package/dist/engine/planet.d.ts +64 -0
- package/dist/engine/planet.js +432 -0
- package/dist/engine/planet.js.map +1 -0
- package/dist/engine/procedural.d.ts +71 -0
- package/dist/engine/procedural.js +259 -0
- package/dist/engine/procedural.js.map +1 -0
- package/dist/engine/quality.d.ts +48 -0
- package/dist/engine/quality.js +245 -0
- package/dist/engine/quality.js.map +1 -0
- package/dist/engine/repository.d.ts +79 -0
- package/dist/engine/repository.js +13 -0
- package/dist/engine/repository.js.map +1 -0
- package/dist/engine/sun.d.ts +61 -0
- package/dist/engine/sun.js +240 -0
- package/dist/engine/sun.js.map +1 -0
- package/dist/engine/temporal.d.ts +67 -0
- package/dist/engine/temporal.js +283 -0
- package/dist/engine/temporal.js.map +1 -0
- package/dist/engine/types.d.ts +179 -0
- package/dist/engine/types.js +27 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/connector-registry.d.ts +20 -0
- package/dist/mcp/connector-registry.js +35 -0
- package/dist/mcp/connector-registry.js.map +1 -0
- package/dist/mcp/server.d.ts +13 -0
- package/dist/mcp/server.js +242 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/daemon-tool.d.ts +16 -0
- package/dist/mcp/tools/daemon-tool.js +58 -0
- package/dist/mcp/tools/daemon-tool.js.map +1 -0
- package/dist/mcp/tools/ingestion-tools.d.ts +20 -0
- package/dist/mcp/tools/ingestion-tools.js +34 -0
- package/dist/mcp/tools/ingestion-tools.js.map +1 -0
- package/dist/mcp/tools/memory-tools.d.ts +122 -0
- package/dist/mcp/tools/memory-tools.js +1037 -0
- package/dist/mcp/tools/memory-tools.js.map +1 -0
- package/dist/scanner/cloud/github.d.ts +34 -0
- package/dist/scanner/cloud/github.js +260 -0
- package/dist/scanner/cloud/github.js.map +1 -0
- package/dist/scanner/cloud/google-drive.d.ts +30 -0
- package/dist/scanner/cloud/google-drive.js +289 -0
- package/dist/scanner/cloud/google-drive.js.map +1 -0
- package/dist/scanner/cloud/notion.d.ts +33 -0
- package/dist/scanner/cloud/notion.js +231 -0
- package/dist/scanner/cloud/notion.js.map +1 -0
- package/dist/scanner/cloud/slack.d.ts +38 -0
- package/dist/scanner/cloud/slack.js +282 -0
- package/dist/scanner/cloud/slack.js.map +1 -0
- package/dist/scanner/cloud/types.d.ts +73 -0
- package/dist/scanner/cloud/types.js +9 -0
- package/dist/scanner/cloud/types.js.map +1 -0
- package/dist/scanner/index.d.ts +35 -0
- package/dist/scanner/index.js +420 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/local/filesystem.d.ts +33 -0
- package/dist/scanner/local/filesystem.js +203 -0
- package/dist/scanner/local/filesystem.js.map +1 -0
- package/dist/scanner/local/git.d.ts +24 -0
- package/dist/scanner/local/git.js +161 -0
- package/dist/scanner/local/git.js.map +1 -0
- package/dist/scanner/local/parsers/code.d.ts +3 -0
- package/dist/scanner/local/parsers/code.js +127 -0
- package/dist/scanner/local/parsers/code.js.map +1 -0
- package/dist/scanner/local/parsers/index.d.ts +11 -0
- package/dist/scanner/local/parsers/index.js +24 -0
- package/dist/scanner/local/parsers/index.js.map +1 -0
- package/dist/scanner/local/parsers/json-parser.d.ts +3 -0
- package/dist/scanner/local/parsers/json-parser.js +117 -0
- package/dist/scanner/local/parsers/json-parser.js.map +1 -0
- package/dist/scanner/local/parsers/markdown.d.ts +3 -0
- package/dist/scanner/local/parsers/markdown.js +120 -0
- package/dist/scanner/local/parsers/markdown.js.map +1 -0
- package/dist/scanner/local/parsers/text.d.ts +3 -0
- package/dist/scanner/local/parsers/text.js +41 -0
- package/dist/scanner/local/parsers/text.js.map +1 -0
- package/dist/scanner/metadata-scanner.d.ts +67 -0
- package/dist/scanner/metadata-scanner.js +356 -0
- package/dist/scanner/metadata-scanner.js.map +1 -0
- package/dist/scanner/types.d.ts +47 -0
- package/dist/scanner/types.js +19 -0
- package/dist/scanner/types.js.map +1 -0
- package/dist/service/daemon.d.ts +23 -0
- package/dist/service/daemon.js +105 -0
- package/dist/service/daemon.js.map +1 -0
- package/dist/service/scheduler.d.ts +73 -0
- package/dist/service/scheduler.js +281 -0
- package/dist/service/scheduler.js.map +1 -0
- package/dist/storage/database.d.ts +10 -0
- package/dist/storage/database.js +265 -0
- package/dist/storage/database.js.map +1 -0
- package/dist/storage/queries.d.ts +85 -0
- package/dist/storage/queries.js +865 -0
- package/dist/storage/queries.js.map +1 -0
- package/dist/storage/sqlite-repository.d.ts +32 -0
- package/dist/storage/sqlite-repository.js +68 -0
- package/dist/storage/sqlite-repository.js.map +1 -0
- package/dist/storage/vec.d.ts +62 -0
- package/dist/storage/vec.js +111 -0
- package/dist/storage/vec.js.map +1 -0
- package/dist/utils/config.d.ts +5 -0
- package/dist/utils/config.js +60 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/logger.d.ts +36 -0
- package/dist/utils/logger.js +86 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/time.d.ts +21 -0
- package/dist/utils/time.js +42 -0
- package/dist/utils/time.js.map +1 -0
- package/dist/utils/tokenizer.d.ts +13 -0
- package/dist/utils/tokenizer.js +46 -0
- package/dist/utils/tokenizer.js.map +1 -0
- package/package.json +77 -0
- package/scripts/check-node.mjs +36 -0
- package/scripts/setup.mjs +157 -0
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
2
|
+
import { loadVecExtension, VEC_DDL } from './vec.js';
|
|
3
|
+
// Singleton instance
|
|
4
|
+
let _db = null;
|
|
5
|
+
const DDL = `
|
|
6
|
+
-- Core memories table
|
|
7
|
+
CREATE TABLE IF NOT EXISTS memories (
|
|
8
|
+
id TEXT PRIMARY KEY,
|
|
9
|
+
project TEXT NOT NULL DEFAULT 'default',
|
|
10
|
+
content TEXT NOT NULL,
|
|
11
|
+
summary TEXT NOT NULL,
|
|
12
|
+
type TEXT NOT NULL DEFAULT 'observation',
|
|
13
|
+
tags TEXT DEFAULT '[]',
|
|
14
|
+
distance REAL NOT NULL DEFAULT 5.0,
|
|
15
|
+
importance REAL NOT NULL DEFAULT 0.5,
|
|
16
|
+
velocity REAL NOT NULL DEFAULT 0.0,
|
|
17
|
+
impact REAL NOT NULL DEFAULT 0.5,
|
|
18
|
+
access_count INTEGER NOT NULL DEFAULT 0,
|
|
19
|
+
last_accessed_at TEXT,
|
|
20
|
+
metadata TEXT DEFAULT '{}',
|
|
21
|
+
source TEXT DEFAULT 'manual',
|
|
22
|
+
source_path TEXT,
|
|
23
|
+
source_hash TEXT,
|
|
24
|
+
content_hash TEXT,
|
|
25
|
+
valid_from TEXT,
|
|
26
|
+
valid_until TEXT,
|
|
27
|
+
superseded_by TEXT,
|
|
28
|
+
consolidated_into TEXT,
|
|
29
|
+
quality_score REAL DEFAULT 0.5,
|
|
30
|
+
is_universal INTEGER DEFAULT 0,
|
|
31
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
32
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
33
|
+
deleted_at TEXT
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
-- Data sources table: tracks directories registered for scanning
|
|
37
|
+
CREATE TABLE IF NOT EXISTS data_sources (
|
|
38
|
+
id TEXT PRIMARY KEY,
|
|
39
|
+
path TEXT NOT NULL,
|
|
40
|
+
type TEXT NOT NULL DEFAULT 'local',
|
|
41
|
+
status TEXT NOT NULL DEFAULT 'active',
|
|
42
|
+
last_scanned_at TEXT,
|
|
43
|
+
file_count INTEGER DEFAULT 0,
|
|
44
|
+
total_size INTEGER DEFAULT 0,
|
|
45
|
+
config TEXT DEFAULT '{}',
|
|
46
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
47
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
-- Index for deduplication lookup
|
|
51
|
+
CREATE INDEX IF NOT EXISTS idx_memories_source_path
|
|
52
|
+
ON memories(source_path)
|
|
53
|
+
WHERE source_path IS NOT NULL;
|
|
54
|
+
|
|
55
|
+
-- Index for content-hash deduplication
|
|
56
|
+
CREATE INDEX IF NOT EXISTS idx_memories_content_hash
|
|
57
|
+
ON memories(project, content_hash)
|
|
58
|
+
WHERE content_hash IS NOT NULL;
|
|
59
|
+
|
|
60
|
+
-- Sun state — one row per project, acts as the "star" context
|
|
61
|
+
CREATE TABLE IF NOT EXISTS sun_state (
|
|
62
|
+
project TEXT PRIMARY KEY,
|
|
63
|
+
content TEXT NOT NULL DEFAULT '',
|
|
64
|
+
current_work TEXT DEFAULT '',
|
|
65
|
+
recent_decisions TEXT DEFAULT '[]',
|
|
66
|
+
next_steps TEXT DEFAULT '[]',
|
|
67
|
+
active_errors TEXT DEFAULT '[]',
|
|
68
|
+
project_context TEXT DEFAULT '',
|
|
69
|
+
token_count INTEGER NOT NULL DEFAULT 0,
|
|
70
|
+
last_commit_at TEXT,
|
|
71
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
-- Audit log of orbital position changes
|
|
75
|
+
CREATE TABLE IF NOT EXISTS orbit_log (
|
|
76
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
77
|
+
memory_id TEXT NOT NULL,
|
|
78
|
+
project TEXT NOT NULL,
|
|
79
|
+
old_distance REAL NOT NULL,
|
|
80
|
+
new_distance REAL NOT NULL,
|
|
81
|
+
old_importance REAL NOT NULL,
|
|
82
|
+
new_importance REAL NOT NULL,
|
|
83
|
+
trigger TEXT NOT NULL,
|
|
84
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
-- FTS5 virtual table for full-text search
|
|
88
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(
|
|
89
|
+
content, summary, tags,
|
|
90
|
+
content='memories', content_rowid='rowid'
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
-- Keep FTS index in sync with the memories table
|
|
94
|
+
CREATE TRIGGER IF NOT EXISTS memories_ai AFTER INSERT ON memories BEGIN
|
|
95
|
+
INSERT INTO memories_fts(rowid, content, summary, tags)
|
|
96
|
+
VALUES (new.rowid, new.content, new.summary, new.tags);
|
|
97
|
+
END;
|
|
98
|
+
|
|
99
|
+
CREATE TRIGGER IF NOT EXISTS memories_ad AFTER DELETE ON memories BEGIN
|
|
100
|
+
INSERT INTO memories_fts(memories_fts, rowid, content, summary, tags)
|
|
101
|
+
VALUES ('delete', old.rowid, old.content, old.summary, old.tags);
|
|
102
|
+
END;
|
|
103
|
+
|
|
104
|
+
CREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON memories BEGIN
|
|
105
|
+
INSERT INTO memories_fts(memories_fts, rowid, content, summary, tags)
|
|
106
|
+
VALUES ('delete', old.rowid, old.content, old.summary, old.tags);
|
|
107
|
+
INSERT INTO memories_fts(rowid, content, summary, tags)
|
|
108
|
+
VALUES (new.rowid, new.content, new.summary, new.tags);
|
|
109
|
+
END;
|
|
110
|
+
|
|
111
|
+
-- Indexes for common access patterns
|
|
112
|
+
CREATE INDEX IF NOT EXISTS idx_memories_project
|
|
113
|
+
ON memories(project);
|
|
114
|
+
|
|
115
|
+
CREATE INDEX IF NOT EXISTS idx_memories_project_distance
|
|
116
|
+
ON memories(project, distance);
|
|
117
|
+
|
|
118
|
+
CREATE INDEX IF NOT EXISTS idx_memories_project_importance
|
|
119
|
+
ON memories(project, importance DESC);
|
|
120
|
+
|
|
121
|
+
CREATE INDEX IF NOT EXISTS idx_memories_deleted
|
|
122
|
+
ON memories(deleted_at);
|
|
123
|
+
|
|
124
|
+
CREATE INDEX IF NOT EXISTS idx_memories_project_created
|
|
125
|
+
ON memories(project, created_at);
|
|
126
|
+
|
|
127
|
+
-- Knowledge Graph: Constellation edges
|
|
128
|
+
CREATE TABLE IF NOT EXISTS constellation_edges (
|
|
129
|
+
id TEXT PRIMARY KEY,
|
|
130
|
+
source_id TEXT NOT NULL REFERENCES memories(id),
|
|
131
|
+
target_id TEXT NOT NULL REFERENCES memories(id),
|
|
132
|
+
relation TEXT NOT NULL DEFAULT 'related_to',
|
|
133
|
+
weight REAL NOT NULL DEFAULT 0.5,
|
|
134
|
+
project TEXT NOT NULL DEFAULT 'default',
|
|
135
|
+
metadata TEXT DEFAULT '{}',
|
|
136
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
137
|
+
UNIQUE(source_id, target_id, relation)
|
|
138
|
+
);
|
|
139
|
+
CREATE INDEX IF NOT EXISTS idx_constellation_source ON constellation_edges(source_id);
|
|
140
|
+
CREATE INDEX IF NOT EXISTS idx_constellation_target ON constellation_edges(target_id);
|
|
141
|
+
CREATE INDEX IF NOT EXISTS idx_constellation_project ON constellation_edges(project);
|
|
142
|
+
|
|
143
|
+
-- Conflict Detection
|
|
144
|
+
CREATE TABLE IF NOT EXISTS memory_conflicts (
|
|
145
|
+
id TEXT PRIMARY KEY,
|
|
146
|
+
memory_id TEXT NOT NULL REFERENCES memories(id),
|
|
147
|
+
conflicting_memory_id TEXT NOT NULL REFERENCES memories(id),
|
|
148
|
+
severity TEXT NOT NULL DEFAULT 'medium',
|
|
149
|
+
description TEXT NOT NULL,
|
|
150
|
+
status TEXT NOT NULL DEFAULT 'open',
|
|
151
|
+
resolution TEXT,
|
|
152
|
+
project TEXT NOT NULL DEFAULT 'default',
|
|
153
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
154
|
+
resolved_at TEXT
|
|
155
|
+
);
|
|
156
|
+
CREATE INDEX IF NOT EXISTS idx_conflicts_project ON memory_conflicts(project);
|
|
157
|
+
CREATE INDEX IF NOT EXISTS idx_conflicts_status ON memory_conflicts(status);
|
|
158
|
+
|
|
159
|
+
-- Observation Log
|
|
160
|
+
CREATE TABLE IF NOT EXISTS observation_log (
|
|
161
|
+
id TEXT PRIMARY KEY,
|
|
162
|
+
content TEXT NOT NULL,
|
|
163
|
+
extracted_memories TEXT DEFAULT '[]',
|
|
164
|
+
source TEXT NOT NULL DEFAULT 'conversation',
|
|
165
|
+
project TEXT NOT NULL DEFAULT 'default',
|
|
166
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
167
|
+
);
|
|
168
|
+
CREATE INDEX IF NOT EXISTS idx_observations_project ON observation_log(project);
|
|
169
|
+
`;
|
|
170
|
+
// Migrate existing databases that lack newer columns.
|
|
171
|
+
// Each entry: [column_name, column_definition]
|
|
172
|
+
const MIGRATIONS = [
|
|
173
|
+
['source', "TEXT DEFAULT 'manual'"],
|
|
174
|
+
['source_path', 'TEXT'],
|
|
175
|
+
['source_hash', 'TEXT'],
|
|
176
|
+
['content_hash', 'TEXT'],
|
|
177
|
+
['valid_from', 'TEXT'],
|
|
178
|
+
['valid_until', 'TEXT'],
|
|
179
|
+
['superseded_by', 'TEXT'],
|
|
180
|
+
['consolidated_into', 'TEXT'],
|
|
181
|
+
['quality_score', 'REAL DEFAULT 0.5'],
|
|
182
|
+
['is_universal', 'INTEGER DEFAULT 0'],
|
|
183
|
+
];
|
|
184
|
+
function migrateMemoriesTable(db) {
|
|
185
|
+
const cols = db.prepare('PRAGMA table_info(memories)').all();
|
|
186
|
+
const existing = new Set(cols.map((c) => c.name));
|
|
187
|
+
for (const [col, def] of MIGRATIONS) {
|
|
188
|
+
if (!existing.has(col)) {
|
|
189
|
+
db.exec(`ALTER TABLE memories ADD COLUMN ${col} ${def};`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
export function initDatabase(dbPath) {
|
|
194
|
+
// allowExtension is required for sqlite-vec to load its native module.
|
|
195
|
+
const db = new DatabaseSync(dbPath, { allowExtension: true });
|
|
196
|
+
// Enable WAL mode for better concurrent read performance
|
|
197
|
+
db.exec('PRAGMA journal_mode = WAL;');
|
|
198
|
+
db.exec('PRAGMA foreign_keys = ON;');
|
|
199
|
+
db.exec('PRAGMA synchronous = NORMAL;');
|
|
200
|
+
// Load sqlite-vec extension (must be before DDL that references vec0)
|
|
201
|
+
try {
|
|
202
|
+
loadVecExtension(db);
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
// Non-fatal: vec extension may be unavailable in some test environments.
|
|
206
|
+
// Vector search will fall back to FTS5-only mode.
|
|
207
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
208
|
+
process.stderr.write(`[stellar-memory] sqlite-vec not available: ${msg}\n`);
|
|
209
|
+
}
|
|
210
|
+
// Create all tables, triggers, and indexes
|
|
211
|
+
db.exec(DDL);
|
|
212
|
+
// Migrate existing tables that predate newer columns
|
|
213
|
+
try {
|
|
214
|
+
migrateMemoriesTable(db);
|
|
215
|
+
}
|
|
216
|
+
catch { /* ignore migration errors */ }
|
|
217
|
+
// Create vector tables (separated so they run after the extension loads)
|
|
218
|
+
try {
|
|
219
|
+
db.exec(VEC_DDL);
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
// vec0 tables require the extension; skip silently if it wasn't loaded.
|
|
223
|
+
}
|
|
224
|
+
_db = db;
|
|
225
|
+
return db;
|
|
226
|
+
}
|
|
227
|
+
export function getDatabase() {
|
|
228
|
+
if (!_db) {
|
|
229
|
+
throw new Error('Database not initialized. Call initDatabase(dbPath) before using getDatabase().');
|
|
230
|
+
}
|
|
231
|
+
return _db;
|
|
232
|
+
}
|
|
233
|
+
// ---------------------------------------------------------------------------
|
|
234
|
+
// Transaction helper
|
|
235
|
+
// ---------------------------------------------------------------------------
|
|
236
|
+
/**
|
|
237
|
+
* Run `fn` inside a SQLite transaction.
|
|
238
|
+
* Commits on success, rolls back and re-throws on any error.
|
|
239
|
+
*/
|
|
240
|
+
export function withTransaction(fn) {
|
|
241
|
+
const db = getDatabase();
|
|
242
|
+
db.exec('BEGIN');
|
|
243
|
+
try {
|
|
244
|
+
const result = fn();
|
|
245
|
+
db.exec('COMMIT');
|
|
246
|
+
return result;
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
db.exec('ROLLBACK');
|
|
250
|
+
throw err;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// Allow tests to reset the singleton (e.g., open an in-memory DB)
|
|
254
|
+
export function resetDatabase() {
|
|
255
|
+
if (_db) {
|
|
256
|
+
try {
|
|
257
|
+
_db.close();
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
// Ignore close errors during reset
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
_db = null;
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { Memory, OrbitZone, OrbitChange, SunState, ConstellationEdge, MemoryConflict, MemoryAnalytics, ObservationEntry } from '../engine/types.js';
|
|
2
|
+
import type { DataSource } from '../scanner/types.js';
|
|
3
|
+
export declare function insertMemory(memory: Partial<Memory>): Memory;
|
|
4
|
+
export declare function getMemoryById(id: string): Memory | null;
|
|
5
|
+
export declare function getMemoryByIds(ids: string[]): Memory[];
|
|
6
|
+
export declare function getMemoriesByProject(project: string, includeDeleted?: boolean): Memory[];
|
|
7
|
+
/**
|
|
8
|
+
* Get memories created within the last `hoursAgo` hours for a project.
|
|
9
|
+
* Used by auto-commit on shutdown to summarize the current session.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getRecentMemories(project: string, hoursAgo?: number): Memory[];
|
|
12
|
+
export declare function getMemoriesInZone(project: string, zone: OrbitZone): Memory[];
|
|
13
|
+
export declare function updateMemoryOrbit(id: string, distance: number, importance: number, velocity: number): void;
|
|
14
|
+
export declare function updateMemoryAccess(id: string): void;
|
|
15
|
+
export declare function softDeleteMemory(id: string): void;
|
|
16
|
+
export declare function searchMemories(project: string, query: string, limit?: number): Memory[];
|
|
17
|
+
export declare function searchMemoriesInRange(project: string, query: string, minDistance: number, maxDistance: number, limit: number): Memory[];
|
|
18
|
+
export declare function getNearestMemories(project: string, limit: number): Memory[];
|
|
19
|
+
export declare function getSunState(project: string): SunState | null;
|
|
20
|
+
export declare function upsertSunState(state: Partial<SunState> & {
|
|
21
|
+
project: string;
|
|
22
|
+
}): void;
|
|
23
|
+
export declare function insertOrbitLog(change: OrbitChange): void;
|
|
24
|
+
export declare function cleanupOrbitLog(retentionDays?: number): number;
|
|
25
|
+
/**
|
|
26
|
+
* Check whether a memory already exists for the given source_path + source_hash.
|
|
27
|
+
* Returns true if an identical (path, hash) pair is already stored and not deleted.
|
|
28
|
+
*/
|
|
29
|
+
export declare function memoryExistsForSource(sourcePath: string, sourceHash: string): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Find a memory by source_path (regardless of hash). Used to update stale entries.
|
|
32
|
+
*/
|
|
33
|
+
export declare function getMemoryBySourcePath(sourcePath: string): Memory | null;
|
|
34
|
+
/**
|
|
35
|
+
* Find a non-deleted memory in the given project that has the same content hash.
|
|
36
|
+
* Used by createMemory() for content-level deduplication.
|
|
37
|
+
*/
|
|
38
|
+
export declare function getMemoryByContentHash(project: string, contentHash: string): Memory | null;
|
|
39
|
+
export declare function insertDataSource(ds: Omit<DataSource, 'created_at' | 'updated_at'>): DataSource;
|
|
40
|
+
export declare function updateDataSource(id: string, patch: Partial<Pick<DataSource, 'status' | 'last_scanned_at' | 'file_count' | 'total_size' | 'config'>>): void;
|
|
41
|
+
export declare function getAllDataSources(): DataSource[];
|
|
42
|
+
export declare function getDataSourceByPath(path: string): DataSource | null;
|
|
43
|
+
export declare function createEdge(edge: ConstellationEdge): void;
|
|
44
|
+
export declare function getEdges(memoryId: string, project: string): ConstellationEdge[];
|
|
45
|
+
export declare function getConstellation(memoryId: string, project: string, depth?: number): {
|
|
46
|
+
nodes: Memory[];
|
|
47
|
+
edges: ConstellationEdge[];
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Get all constellation neighbors for a batch of memory IDs.
|
|
51
|
+
* Returns a map from memory ID → set of neighbor IDs.
|
|
52
|
+
*/
|
|
53
|
+
export declare function getEdgesForBatch(memoryIds: string[], project: string): Map<string, Set<string>>;
|
|
54
|
+
export declare function deleteEdge(id: string): void;
|
|
55
|
+
export declare function createConflict(conflict: MemoryConflict): void;
|
|
56
|
+
export declare function getConflicts(project: string, status?: string): MemoryConflict[];
|
|
57
|
+
export declare function getConflictsForMemory(memoryId: string): MemoryConflict[];
|
|
58
|
+
export declare function resolveConflict(id: string, resolution: string): void;
|
|
59
|
+
export declare function createObservation(entry: ObservationEntry): void;
|
|
60
|
+
export declare function getObservations(project: string, limit?: number): ObservationEntry[];
|
|
61
|
+
export declare function getMemoriesAtTime(project: string, timestamp: string): Memory[];
|
|
62
|
+
export declare function supersedMemory(memoryId: string, newMemoryId: string): void;
|
|
63
|
+
export declare function getSupersessionChain(memoryId: string): Memory[];
|
|
64
|
+
export declare function consolidateMemories(sourceIds: string[], targetId: string): void;
|
|
65
|
+
export declare function getConsolidationHistory(memoryId: string): Memory[];
|
|
66
|
+
export declare function getUniversalMemories(limit?: number): Memory[];
|
|
67
|
+
export declare function setUniversal(memoryId: string, isUniversal: boolean): void;
|
|
68
|
+
export declare function listProjects(): Array<{
|
|
69
|
+
project: string;
|
|
70
|
+
count: number;
|
|
71
|
+
}>;
|
|
72
|
+
export declare function updateQualityScore(memoryId: string, score: number): void;
|
|
73
|
+
export declare function getMemoriesByQuality(project: string, minScore?: number, maxScore?: number): Memory[];
|
|
74
|
+
export declare function getTopTags(project: string, limit?: number): Array<{
|
|
75
|
+
tag: string;
|
|
76
|
+
count: number;
|
|
77
|
+
}>;
|
|
78
|
+
export declare function getActivityTimeline(project: string, days?: number): Array<{
|
|
79
|
+
date: string;
|
|
80
|
+
created: number;
|
|
81
|
+
accessed: number;
|
|
82
|
+
}>;
|
|
83
|
+
export declare function getRecallSuccessRate(project: string): number;
|
|
84
|
+
export declare function getAnalytics(project: string): MemoryAnalytics;
|
|
85
|
+
//# sourceMappingURL=queries.d.ts.map
|