@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.
- package/LICENSE +21 -0
- package/README.md +365 -0
- package/chunks/chunk-E5A3SCDJ.js +246 -0
- package/chunks/chunk-G5VYCA6O.js +69 -0
- package/chunks/chunk-H76V36OF.js +1029 -0
- package/chunks/chunk-HAPVUJ6A.js +238 -0
- package/chunks/chunk-IEKAYVA3.js +137 -0
- package/chunks/chunk-IGKYKEKT.js +43 -0
- package/chunks/chunk-IIET2K6D.js +7728 -0
- package/chunks/chunk-ITIVYGUG.js +347 -0
- package/chunks/chunk-JAWZ7ANC.js +208 -0
- package/chunks/chunk-JZU37VQ5.js +714 -0
- package/chunks/chunk-KC6NRZ7U.js +198 -0
- package/chunks/chunk-KDRROLVN.js +433 -0
- package/chunks/chunk-L7JICQBW.js +1006 -0
- package/chunks/chunk-MINFB5LT.js +1479 -0
- package/chunks/chunk-MJ74G5RB.js +5816 -0
- package/chunks/chunk-S4TBVCL2.js +2158 -0
- package/chunks/chunk-SMVJRPAH.js +2753 -0
- package/chunks/chunk-U6OLJ36B.js +438 -0
- package/chunks/chunk-URGEODS5.js +752 -0
- package/chunks/chunk-YSU3BWV6.js +123 -0
- package/chunks/consolidation-indexer-TOTTDZXW.js +21 -0
- package/chunks/day-consolidation-NKO63HZQ.js +24 -0
- package/chunks/graphrag-ZI2FSU7S.js +13 -0
- package/chunks/hierarchical-temporal-search-ZD46UMKR.js +8 -0
- package/chunks/hybrid-search-ZVLZVGFS.js +19 -0
- package/chunks/memory-store-KNJPMBLQ.js +17 -0
- package/chunks/periodic-consolidation-BPKOZDGB.js +10 -0
- package/chunks/postgres-3ZXBYTPC.js +8 -0
- package/chunks/recall-GMVHWQWW.js +20 -0
- package/chunks/search-7HZETVMZ.js +18 -0
- package/chunks/session-store-XKPGKXUS.js +44 -0
- package/chunks/sqlite-JPF5TICX.js +152 -0
- package/chunks/src-6GVZTUH6.js +12 -0
- package/chunks/src-QAXOD5SB.js +273 -0
- package/chunks/suncalc-NOHGYHDU.js +186 -0
- package/chunks/tree-RSHKDTCR.js +10 -0
- package/gateway.js +61944 -0
- package/package.json +51 -0
- 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
|