@yugenlab/vaayu 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.
Files changed (41) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +365 -0
  3. package/chunks/chunk-E5A3SCDJ.js +246 -0
  4. package/chunks/chunk-G5VYCA6O.js +69 -0
  5. package/chunks/chunk-H76V36OF.js +1029 -0
  6. package/chunks/chunk-HAPVUJ6A.js +238 -0
  7. package/chunks/chunk-IEKAYVA3.js +137 -0
  8. package/chunks/chunk-IGKYKEKT.js +43 -0
  9. package/chunks/chunk-IIET2K6D.js +7728 -0
  10. package/chunks/chunk-ITIVYGUG.js +347 -0
  11. package/chunks/chunk-JAWZ7ANC.js +208 -0
  12. package/chunks/chunk-JZU37VQ5.js +714 -0
  13. package/chunks/chunk-KC6NRZ7U.js +198 -0
  14. package/chunks/chunk-KDRROLVN.js +433 -0
  15. package/chunks/chunk-L7JICQBW.js +1006 -0
  16. package/chunks/chunk-MINFB5LT.js +1479 -0
  17. package/chunks/chunk-MJ74G5RB.js +5816 -0
  18. package/chunks/chunk-S4TBVCL2.js +2158 -0
  19. package/chunks/chunk-SMVJRPAH.js +2753 -0
  20. package/chunks/chunk-U6OLJ36B.js +438 -0
  21. package/chunks/chunk-URGEODS5.js +752 -0
  22. package/chunks/chunk-YSU3BWV6.js +123 -0
  23. package/chunks/consolidation-indexer-TOTTDZXW.js +21 -0
  24. package/chunks/day-consolidation-NKO63HZQ.js +24 -0
  25. package/chunks/graphrag-ZI2FSU7S.js +13 -0
  26. package/chunks/hierarchical-temporal-search-ZD46UMKR.js +8 -0
  27. package/chunks/hybrid-search-ZVLZVGFS.js +19 -0
  28. package/chunks/memory-store-KNJPMBLQ.js +17 -0
  29. package/chunks/periodic-consolidation-BPKOZDGB.js +10 -0
  30. package/chunks/postgres-3ZXBYTPC.js +8 -0
  31. package/chunks/recall-GMVHWQWW.js +20 -0
  32. package/chunks/search-7HZETVMZ.js +18 -0
  33. package/chunks/session-store-XKPGKXUS.js +44 -0
  34. package/chunks/sqlite-JPF5TICX.js +152 -0
  35. package/chunks/src-6GVZTUH6.js +12 -0
  36. package/chunks/src-QAXOD5SB.js +273 -0
  37. package/chunks/suncalc-NOHGYHDU.js +186 -0
  38. package/chunks/tree-RSHKDTCR.js +10 -0
  39. package/gateway.js +61944 -0
  40. package/package.json +51 -0
  41. package/pair-cli.js +133 -0
@@ -0,0 +1,438 @@
1
+ import {
2
+ getChitraguptaHome
3
+ } from "./chunk-KC6NRZ7U.js";
4
+
5
+ // ../chitragupta/packages/smriti/src/db/database.ts
6
+ import Database from "better-sqlite3";
7
+ import fs from "fs";
8
+ import path from "path";
9
+ var DEFAULT_PRAGMAS = {
10
+ journal_mode: "WAL",
11
+ synchronous: "NORMAL",
12
+ // Safe with WAL — fsync on checkpoint only
13
+ cache_size: -64e3,
14
+ // 64MB cache (negative = KB)
15
+ foreign_keys: 1,
16
+ busy_timeout: 5e3,
17
+ // 5s wait on lock contention
18
+ temp_store: "MEMORY",
19
+ mmap_size: 268435456
20
+ // 256MB mmap for read performance
21
+ };
22
+ var DatabaseManager = class _DatabaseManager {
23
+ static _instance = null;
24
+ _databases = /* @__PURE__ */ new Map();
25
+ _dbDir;
26
+ _closed = false;
27
+ constructor(dbDir) {
28
+ this._dbDir = dbDir ?? getChitraguptaHome();
29
+ fs.mkdirSync(this._dbDir, { recursive: true });
30
+ }
31
+ /**
32
+ * Get or create the singleton instance.
33
+ * @param dbDir - Override the database directory (useful for testing).
34
+ */
35
+ static instance(dbDir) {
36
+ if (!_DatabaseManager._instance || _DatabaseManager._instance._closed) {
37
+ _DatabaseManager._instance = new _DatabaseManager(dbDir);
38
+ }
39
+ return _DatabaseManager._instance;
40
+ }
41
+ /**
42
+ * Reset the singleton (for testing). Closes all open databases.
43
+ */
44
+ static reset() {
45
+ if (_DatabaseManager._instance) {
46
+ _DatabaseManager._instance.closeAll();
47
+ _DatabaseManager._instance = null;
48
+ }
49
+ }
50
+ /**
51
+ * Get a database connection by name. Opens it on first access.
52
+ */
53
+ get(name) {
54
+ if (this._closed) {
55
+ throw new Error("DatabaseManager has been closed");
56
+ }
57
+ let db = this._databases.get(name);
58
+ if (!db) {
59
+ db = this._open(name);
60
+ this._databases.set(name, db);
61
+ }
62
+ return db;
63
+ }
64
+ /**
65
+ * Get the file path for a database.
66
+ */
67
+ getPath(name) {
68
+ return path.join(this._dbDir, `${name}.db`);
69
+ }
70
+ /**
71
+ * Close all open database connections.
72
+ */
73
+ closeAll() {
74
+ for (const [name, db] of this._databases) {
75
+ try {
76
+ db.close();
77
+ } catch {
78
+ }
79
+ this._databases.delete(name);
80
+ }
81
+ this._closed = true;
82
+ }
83
+ /**
84
+ * Close a specific database connection.
85
+ */
86
+ close(name) {
87
+ const db = this._databases.get(name);
88
+ if (db) {
89
+ db.close();
90
+ this._databases.delete(name);
91
+ }
92
+ }
93
+ /**
94
+ * Run VACUUM on a database to reclaim space.
95
+ * Should be called during deep sleep / yearly archival.
96
+ */
97
+ vacuum(name) {
98
+ this.get(name).exec("VACUUM");
99
+ }
100
+ /**
101
+ * Check database integrity.
102
+ */
103
+ integrityCheck(name) {
104
+ const result = this.get(name).pragma("integrity_check");
105
+ return result[0]?.integrity_check ?? "unknown";
106
+ }
107
+ /**
108
+ * Open a database file and apply pragmas.
109
+ */
110
+ _open(name) {
111
+ const dbPath = this.getPath(name);
112
+ const db = new Database(dbPath);
113
+ for (const [key, value] of Object.entries(DEFAULT_PRAGMAS)) {
114
+ db.pragma(`${key} = ${value}`);
115
+ }
116
+ return db;
117
+ }
118
+ };
119
+
120
+ // ../chitragupta/packages/smriti/src/db/schema.ts
121
+ var AGENT_SCHEMA_VERSION = 3;
122
+ var GRAPH_SCHEMA_VERSION = 1;
123
+ var VECTORS_SCHEMA_VERSION = 1;
124
+ function initAllSchemas(dbm) {
125
+ initAgentSchema(dbm);
126
+ initGraphSchema(dbm);
127
+ initVectorsSchema(dbm);
128
+ }
129
+ function initAgentSchema(dbm) {
130
+ const db = dbm.get("agent");
131
+ const currentVersion = getSchemaVersion(db, "agent");
132
+ if (currentVersion >= AGENT_SCHEMA_VERSION) return;
133
+ db.exec(`
134
+ -- \u2500\u2500\u2500 Sessions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
135
+ CREATE TABLE IF NOT EXISTS sessions (
136
+ id TEXT PRIMARY KEY,
137
+ project TEXT NOT NULL,
138
+ title TEXT NOT NULL DEFAULT 'New Session',
139
+ created_at INTEGER NOT NULL, -- Unix epoch ms
140
+ updated_at INTEGER NOT NULL,
141
+ turn_count INTEGER NOT NULL DEFAULT 0,
142
+ model TEXT,
143
+ agent TEXT DEFAULT 'chitragupta',
144
+ cost REAL DEFAULT 0,
145
+ tokens INTEGER DEFAULT 0,
146
+ tags TEXT, -- JSON array
147
+ file_path TEXT NOT NULL, -- Relative path to .md file
148
+ parent_id TEXT, -- For branching
149
+ branch TEXT
150
+ );
151
+
152
+ CREATE INDEX IF NOT EXISTS idx_sessions_project ON sessions(project);
153
+ CREATE INDEX IF NOT EXISTS idx_sessions_updated ON sessions(updated_at DESC);
154
+ CREATE INDEX IF NOT EXISTS idx_sessions_created ON sessions(created_at DESC);
155
+
156
+ -- \u2500\u2500\u2500 Turns \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
157
+ CREATE TABLE IF NOT EXISTS turns (
158
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
159
+ session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
160
+ turn_number INTEGER NOT NULL,
161
+ role TEXT NOT NULL CHECK(role IN ('user', 'assistant')),
162
+ content TEXT NOT NULL,
163
+ agent TEXT,
164
+ model TEXT,
165
+ tool_calls TEXT, -- JSON array of tool calls
166
+ created_at INTEGER NOT NULL, -- Unix epoch ms
167
+ UNIQUE(session_id, turn_number)
168
+ );
169
+
170
+ CREATE INDEX IF NOT EXISTS idx_turns_session ON turns(session_id);
171
+ CREATE INDEX IF NOT EXISTS idx_turns_created ON turns(created_at DESC);
172
+
173
+ -- \u2500\u2500\u2500 FTS5 Full-Text Search on turns \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
174
+ CREATE VIRTUAL TABLE IF NOT EXISTS turns_fts USING fts5(
175
+ content,
176
+ content_rowid='id',
177
+ tokenize='porter unicode61'
178
+ );
179
+
180
+ -- \u2500\u2500\u2500 Consolidation Rules (Samskaara patterns) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
181
+ CREATE TABLE IF NOT EXISTS consolidation_rules (
182
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
183
+ category TEXT NOT NULL, -- 'preference', 'decision', 'pattern', 'fact', 'correction'
184
+ rule_text TEXT NOT NULL,
185
+ confidence REAL NOT NULL DEFAULT 0.5,
186
+ source_sessions TEXT, -- JSON array of session IDs
187
+ created_at INTEGER NOT NULL,
188
+ updated_at INTEGER NOT NULL,
189
+ hit_count INTEGER DEFAULT 1,
190
+ project TEXT -- NULL = global
191
+ );
192
+
193
+ CREATE INDEX IF NOT EXISTS idx_rules_category ON consolidation_rules(category);
194
+ CREATE INDEX IF NOT EXISTS idx_rules_project ON consolidation_rules(project);
195
+
196
+ -- \u2500\u2500\u2500 Vasanas (crystallized behavioral tendencies) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
197
+ CREATE TABLE IF NOT EXISTS vasanas (
198
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
199
+ name TEXT NOT NULL,
200
+ description TEXT NOT NULL,
201
+ valence TEXT NOT NULL CHECK(valence IN ('positive', 'negative', 'neutral')),
202
+ strength REAL NOT NULL DEFAULT 0.5, -- 0-1
203
+ stability REAL NOT NULL DEFAULT 0.0, -- BOCPD stability score
204
+ source_samskaras TEXT, -- JSON array of rule IDs that crystallized into this
205
+ project TEXT, -- NULL = global (cross-project)
206
+ created_at INTEGER NOT NULL,
207
+ updated_at INTEGER NOT NULL,
208
+ last_activated INTEGER, -- Last time this vasana influenced behavior
209
+ activation_count INTEGER DEFAULT 0
210
+ );
211
+
212
+ CREATE INDEX IF NOT EXISTS idx_vasanas_project ON vasanas(project);
213
+ CREATE INDEX IF NOT EXISTS idx_vasanas_strength ON vasanas(strength DESC);
214
+
215
+ -- \u2500\u2500\u2500 Kartavyas (auto-executable tasks) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
216
+ CREATE TABLE IF NOT EXISTS kartavyas (
217
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
218
+ name TEXT NOT NULL,
219
+ description TEXT NOT NULL,
220
+ trigger_type TEXT NOT NULL CHECK(trigger_type IN ('cron', 'event', 'threshold')),
221
+ trigger_config TEXT NOT NULL, -- JSON: cron expression, event name, or threshold config
222
+ vasana_id INTEGER REFERENCES vasanas(id),
223
+ status TEXT NOT NULL DEFAULT 'proposed' CHECK(status IN ('proposed', 'approved', 'active', 'paused', 'retired')),
224
+ last_run INTEGER,
225
+ run_count INTEGER DEFAULT 0,
226
+ success_count INTEGER DEFAULT 0,
227
+ failure_count INTEGER DEFAULT 0,
228
+ created_at INTEGER NOT NULL,
229
+ updated_at INTEGER NOT NULL
230
+ );
231
+
232
+ CREATE INDEX IF NOT EXISTS idx_kartavyas_status ON kartavyas(status);
233
+ `);
234
+ if (currentVersion < 2) {
235
+ db.exec(`
236
+ -- \u2500\u2500\u2500 Samskaras (behavioral impressions / detected patterns) \u2500\u2500\u2500\u2500\u2500\u2500
237
+ CREATE TABLE IF NOT EXISTS samskaras (
238
+ id TEXT PRIMARY KEY, -- FNV-1a hash of pattern_type + content
239
+ session_id TEXT NOT NULL,
240
+ pattern_type TEXT NOT NULL CHECK(pattern_type IN (
241
+ 'tool-sequence', 'preference', 'decision', 'correction', 'convention'
242
+ )),
243
+ pattern_content TEXT NOT NULL,
244
+ observation_count INTEGER NOT NULL DEFAULT 1,
245
+ confidence REAL NOT NULL DEFAULT 0.5,
246
+ pramana_type TEXT, -- 'pratyaksha', 'anumana', 'shabda', 'upamana', 'arthapatti', 'anupalabdhi'
247
+ project TEXT, -- NULL = global
248
+ created_at INTEGER NOT NULL,
249
+ updated_at INTEGER NOT NULL
250
+ );
251
+
252
+ CREATE INDEX IF NOT EXISTS idx_samskaras_session ON samskaras(session_id);
253
+ CREATE INDEX IF NOT EXISTS idx_samskaras_type ON samskaras(pattern_type);
254
+ CREATE INDEX IF NOT EXISTS idx_samskaras_confidence ON samskaras(confidence DESC);
255
+ CREATE INDEX IF NOT EXISTS idx_samskaras_project ON samskaras(project);
256
+
257
+ -- \u2500\u2500\u2500 Vidhis (procedural memory \u2014 learned tool sequences) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
258
+ CREATE TABLE IF NOT EXISTS vidhis (
259
+ id TEXT PRIMARY KEY, -- FNV-1a hash
260
+ project TEXT NOT NULL,
261
+ name TEXT NOT NULL,
262
+ learned_from TEXT NOT NULL, -- JSON array of session IDs
263
+ confidence REAL NOT NULL DEFAULT 0.5,
264
+ steps TEXT NOT NULL, -- JSON array of VidhiStep
265
+ triggers TEXT NOT NULL, -- JSON array of trigger phrases
266
+ success_rate REAL DEFAULT 0.0,
267
+ success_count INTEGER DEFAULT 0,
268
+ failure_count INTEGER DEFAULT 0,
269
+ parameter_schema TEXT, -- JSON object of ParamDef
270
+ created_at INTEGER NOT NULL,
271
+ updated_at INTEGER NOT NULL
272
+ );
273
+
274
+ CREATE INDEX IF NOT EXISTS idx_vidhis_project ON vidhis(project);
275
+ CREATE INDEX IF NOT EXISTS idx_vidhis_name ON vidhis(project, name);
276
+ CREATE INDEX IF NOT EXISTS idx_vidhis_success ON vidhis(success_rate DESC);
277
+
278
+ -- \u2500\u2500\u2500 Nidra State (singleton \u2014 sleep cycle state machine) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
279
+ CREATE TABLE IF NOT EXISTS nidra_state (
280
+ id INTEGER PRIMARY KEY CHECK(id = 1), -- Singleton row
281
+ current_state TEXT NOT NULL DEFAULT 'LISTENING'
282
+ CHECK(current_state IN ('LISTENING', 'DREAMING', 'DEEP_SLEEP')),
283
+ last_state_change INTEGER NOT NULL,
284
+ last_heartbeat INTEGER NOT NULL,
285
+ last_consolidation_start INTEGER,
286
+ last_consolidation_end INTEGER,
287
+ consolidation_phase TEXT, -- Current Svapna phase if DREAMING
288
+ consolidation_progress REAL DEFAULT 0.0, -- [0, 1]
289
+ updated_at INTEGER NOT NULL
290
+ );
291
+
292
+ -- Seed singleton row
293
+ INSERT OR IGNORE INTO nidra_state (id, current_state, last_state_change, last_heartbeat, updated_at)
294
+ VALUES (1, 'LISTENING', ${Date.now()}, ${Date.now()}, ${Date.now()});
295
+
296
+ -- \u2500\u2500\u2500 Consolidation Log (dream cycle & cron audit trail) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
297
+ CREATE TABLE IF NOT EXISTS consolidation_log (
298
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
299
+ project TEXT NOT NULL,
300
+ cycle_type TEXT NOT NULL CHECK(cycle_type IN ('svapna', 'monthly', 'yearly')),
301
+ cycle_id TEXT, -- e.g. 'svapna-2026-02-09T14:30:00Z'
302
+ phase TEXT, -- REPLAY, RECOMBINE, CRYSTALLIZE, PROCEDURALIZE, COMPRESS
303
+ phase_duration_ms INTEGER,
304
+ vasanas_created INTEGER DEFAULT 0,
305
+ vidhis_created INTEGER DEFAULT 0,
306
+ samskaras_processed INTEGER DEFAULT 0,
307
+ sessions_processed INTEGER DEFAULT 0,
308
+ status TEXT NOT NULL DEFAULT 'running'
309
+ CHECK(status IN ('running', 'success', 'failed', 'partial')),
310
+ error_message TEXT,
311
+ created_at INTEGER NOT NULL
312
+ );
313
+
314
+ CREATE INDEX IF NOT EXISTS idx_conslog_project ON consolidation_log(project);
315
+ CREATE INDEX IF NOT EXISTS idx_conslog_type ON consolidation_log(cycle_type);
316
+ CREATE INDEX IF NOT EXISTS idx_conslog_created ON consolidation_log(created_at DESC);
317
+
318
+ -- \u2500\u2500\u2500 Pratyabhijna Context (session identity snapshots) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
319
+ CREATE TABLE IF NOT EXISTS pratyabhijna_context (
320
+ session_id TEXT PRIMARY KEY,
321
+ project TEXT NOT NULL,
322
+ identity_summary TEXT, -- The self-recognition text
323
+ global_vasanas TEXT, -- JSON array of top global vasanas loaded
324
+ project_vasanas TEXT, -- JSON array of top project vasanas loaded
325
+ active_samskaras TEXT, -- JSON array of active samskaras
326
+ cross_project_insights TEXT, -- JSON array
327
+ tool_mastery TEXT, -- JSON object of tool \u2192 mastery score
328
+ warmup_ms REAL, -- How long pratyabhijna took
329
+ created_at INTEGER NOT NULL
330
+ );
331
+
332
+ CREATE INDEX IF NOT EXISTS idx_pratyabhijna_project ON pratyabhijna_context(project);
333
+ `);
334
+ }
335
+ if (currentVersion < 3) {
336
+ db.exec(`
337
+ -- Add metadata column for storing external system fields (e.g. Vaayu session data)
338
+ ALTER TABLE sessions ADD COLUMN metadata TEXT;
339
+ `);
340
+ }
341
+ setSchemaVersion(db, "agent", AGENT_SCHEMA_VERSION);
342
+ }
343
+ function initGraphSchema(dbm) {
344
+ const db = dbm.get("graph");
345
+ const currentVersion = getSchemaVersion(db, "graph");
346
+ if (currentVersion >= GRAPH_SCHEMA_VERSION) return;
347
+ db.exec(`
348
+ -- \u2500\u2500\u2500 Nodes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
349
+ CREATE TABLE IF NOT EXISTS nodes (
350
+ id TEXT PRIMARY KEY,
351
+ type TEXT NOT NULL, -- 'session', 'memory', 'concept', 'file', 'decision', 'entity'
352
+ label TEXT NOT NULL,
353
+ content TEXT NOT NULL DEFAULT '',
354
+ metadata TEXT, -- JSON
355
+ created_at INTEGER NOT NULL,
356
+ updated_at INTEGER NOT NULL
357
+ );
358
+
359
+ CREATE INDEX IF NOT EXISTS idx_nodes_type ON nodes(type);
360
+
361
+ -- \u2500\u2500\u2500 Edges \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
362
+ CREATE TABLE IF NOT EXISTS edges (
363
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
364
+ source TEXT NOT NULL REFERENCES nodes(id),
365
+ target TEXT NOT NULL REFERENCES nodes(id),
366
+ relationship TEXT NOT NULL,
367
+ weight REAL NOT NULL DEFAULT 1.0,
368
+ pramana TEXT, -- Epistemology type: 'pratyaksha', 'anumana', 'shabda', 'upamana', 'arthapatti', 'anupalabdhi'
369
+ viveka TEXT, -- Grounding: 'grounded', 'inferred', 'uncertain'
370
+ valid_from INTEGER, -- Bi-temporal: when relationship became true (epoch ms)
371
+ valid_until INTEGER, -- When relationship ended (NULL = still valid)
372
+ recorded_at INTEGER NOT NULL, -- When edge was recorded
373
+ superseded_at INTEGER, -- When superseded by newer version (NULL = current)
374
+ UNIQUE(source, target, relationship, recorded_at)
375
+ );
376
+
377
+ CREATE INDEX IF NOT EXISTS idx_edges_source ON edges(source);
378
+ CREATE INDEX IF NOT EXISTS idx_edges_target ON edges(target);
379
+ CREATE INDEX IF NOT EXISTS idx_edges_relationship ON edges(relationship);
380
+
381
+ -- \u2500\u2500\u2500 PageRank \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
382
+ CREATE TABLE IF NOT EXISTS pagerank (
383
+ node_id TEXT PRIMARY KEY REFERENCES nodes(id),
384
+ score REAL NOT NULL DEFAULT 0.0,
385
+ updated_at INTEGER NOT NULL
386
+ );
387
+ `);
388
+ setSchemaVersion(db, "graph", GRAPH_SCHEMA_VERSION);
389
+ }
390
+ function initVectorsSchema(dbm) {
391
+ const db = dbm.get("vectors");
392
+ const currentVersion = getSchemaVersion(db, "vectors");
393
+ if (currentVersion >= VECTORS_SCHEMA_VERSION) return;
394
+ db.exec(`
395
+ -- \u2500\u2500\u2500 Embeddings \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
396
+ CREATE TABLE IF NOT EXISTS embeddings (
397
+ id TEXT PRIMARY KEY,
398
+ vector BLOB NOT NULL, -- Float32Array as binary blob
399
+ text TEXT NOT NULL, -- Source text that was embedded
400
+ source_type TEXT NOT NULL, -- 'turn', 'session', 'memory', 'consolidated'
401
+ source_id TEXT NOT NULL, -- ID of the source document
402
+ dimensions INTEGER NOT NULL, -- Vector dimensionality (e.g. 1536)
403
+ metadata TEXT, -- JSON
404
+ created_at INTEGER NOT NULL
405
+ );
406
+
407
+ CREATE INDEX IF NOT EXISTS idx_embeddings_source ON embeddings(source_type, source_id);
408
+ `);
409
+ setSchemaVersion(db, "vectors", VECTORS_SCHEMA_VERSION);
410
+ }
411
+ function ensureVersionTable(db) {
412
+ db.exec(`
413
+ CREATE TABLE IF NOT EXISTS _schema_versions (
414
+ name TEXT PRIMARY KEY,
415
+ version INTEGER NOT NULL DEFAULT 0
416
+ )
417
+ `);
418
+ }
419
+ function getSchemaVersion(db, name) {
420
+ ensureVersionTable(db);
421
+ const row = db.prepare("SELECT version FROM _schema_versions WHERE name = ?").get(name);
422
+ return row?.version ?? 0;
423
+ }
424
+ function setSchemaVersion(db, name, version) {
425
+ ensureVersionTable(db);
426
+ db.prepare(
427
+ "INSERT OR REPLACE INTO _schema_versions (name, version) VALUES (?, ?)"
428
+ ).run(name, version);
429
+ }
430
+
431
+ export {
432
+ DatabaseManager,
433
+ initAllSchemas,
434
+ initAgentSchema,
435
+ initGraphSchema,
436
+ initVectorsSchema
437
+ };
438
+ //# sourceMappingURL=chunk-U6OLJ36B.js.map