@triedotdev/mcp 1.0.129 → 1.0.130

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.
@@ -0,0 +1,474 @@
1
+ import {
2
+ getTrieDirectory
3
+ } from "./chunk-45Y5TLQZ.js";
4
+
5
+ // src/storage/tiered-storage.ts
6
+ import { writeFile, mkdir } from "fs/promises";
7
+ import { join } from "path";
8
+ import { createHash } from "crypto";
9
+ import Database from "better-sqlite3";
10
+ var TieredStorage = class {
11
+ workDir;
12
+ hotCache = /* @__PURE__ */ new Map();
13
+ warmDb = null;
14
+ constructor(workDir) {
15
+ this.workDir = workDir;
16
+ }
17
+ /**
18
+ * Initialize storage directories and database
19
+ */
20
+ async initialize() {
21
+ const trieDir = getTrieDirectory(this.workDir);
22
+ await mkdir(join(trieDir, "hot"), { recursive: true });
23
+ await mkdir(join(trieDir, "warm"), { recursive: true });
24
+ await mkdir(join(trieDir, "cold"), { recursive: true });
25
+ const dbPath = join(trieDir, "warm", "decisions.db");
26
+ this.warmDb = new Database(dbPath);
27
+ this.warmDb.exec(`
28
+ CREATE TABLE IF NOT EXISTS decisions (
29
+ id TEXT PRIMARY KEY,
30
+ decision TEXT NOT NULL,
31
+ context TEXT NOT NULL,
32
+ reasoning TEXT,
33
+ timestamp TEXT NOT NULL,
34
+ who TEXT,
35
+ files TEXT NOT NULL, -- JSON array
36
+ tags TEXT NOT NULL, -- JSON array
37
+ expandedTags TEXT, -- JSON array (with synonyms)
38
+ relatedTo TEXT, -- JSON array
39
+ tradeoffs TEXT, -- JSON array
40
+ status TEXT NOT NULL,
41
+ supersededBy TEXT,
42
+ hash TEXT, -- SHA-256 fingerprint (first 16 hex chars)
43
+ dependencies TEXT, -- JSON array (npm packages, services)
44
+ codebaseArea TEXT, -- JSON array (frontend, backend, auth, etc.)
45
+ domain TEXT, -- JSON array (payments, compliance, etc.)
46
+ lastAccessed TEXT NOT NULL,
47
+ accessCount INTEGER DEFAULT 0
48
+ );
49
+
50
+ CREATE TABLE IF NOT EXISTS facts (
51
+ id TEXT PRIMARY KEY,
52
+ fact TEXT NOT NULL,
53
+ source TEXT NOT NULL,
54
+ timestamp TEXT NOT NULL,
55
+ tags TEXT NOT NULL, -- JSON array
56
+ expandedTags TEXT, -- JSON array (with synonyms)
57
+ relatedDecisions TEXT, -- JSON array
58
+ confidence REAL NOT NULL,
59
+ lastAccessed TEXT NOT NULL,
60
+ accessCount INTEGER DEFAULT 0
61
+ );
62
+
63
+ CREATE TABLE IF NOT EXISTS blockers (
64
+ id TEXT PRIMARY KEY,
65
+ blocker TEXT NOT NULL,
66
+ impact TEXT NOT NULL,
67
+ affectedAreas TEXT NOT NULL, -- JSON array
68
+ timestamp TEXT NOT NULL,
69
+ resolvedAt TEXT,
70
+ resolution TEXT,
71
+ tags TEXT NOT NULL, -- JSON array
72
+ expandedTags TEXT, -- JSON array (with synonyms)
73
+ lastAccessed TEXT NOT NULL,
74
+ accessCount INTEGER DEFAULT 0
75
+ );
76
+
77
+ CREATE TABLE IF NOT EXISTS questions (
78
+ id TEXT PRIMARY KEY,
79
+ question TEXT NOT NULL,
80
+ context TEXT NOT NULL,
81
+ timestamp TEXT NOT NULL,
82
+ answeredAt TEXT,
83
+ answer TEXT,
84
+ relatedDecisions TEXT, -- JSON array
85
+ tags TEXT NOT NULL, -- JSON array
86
+ expandedTags TEXT, -- JSON array (with synonyms)
87
+ lastAccessed TEXT NOT NULL,
88
+ accessCount INTEGER DEFAULT 0
89
+ );
90
+
91
+ CREATE TABLE IF NOT EXISTS nudges (
92
+ id TEXT PRIMARY KEY,
93
+ message TEXT NOT NULL,
94
+ severity TEXT NOT NULL, -- 'critical', 'high', 'warning', 'info'
95
+ file TEXT,
96
+ category TEXT, -- 'quality', 'security', 'performance', etc.
97
+ goalId TEXT, -- Related goal ID if this is a goal violation
98
+ timestamp TEXT NOT NULL,
99
+ resolved BOOLEAN NOT NULL DEFAULT 0,
100
+ resolvedAt TEXT,
101
+ resolution TEXT, -- How it was resolved: 'dismissed', 'fixed', 'auto-fixed'
102
+ dismissed BOOLEAN NOT NULL DEFAULT 0,
103
+ priority INTEGER DEFAULT 5, -- 1-10 priority score
104
+ suggestedAction TEXT,
105
+ relatedIssues TEXT, -- JSON array
106
+ metadata TEXT -- JSON object for additional data
107
+ );
108
+
109
+ CREATE INDEX IF NOT EXISTS idx_decisions_tags ON decisions(tags);
110
+ CREATE INDEX IF NOT EXISTS idx_decisions_expanded ON decisions(expandedTags);
111
+ CREATE INDEX IF NOT EXISTS idx_decisions_timestamp ON decisions(timestamp);
112
+ CREATE INDEX IF NOT EXISTS idx_decisions_status ON decisions(status);
113
+ CREATE INDEX IF NOT EXISTS idx_decisions_area ON decisions(codebaseArea);
114
+ CREATE INDEX IF NOT EXISTS idx_decisions_domain ON decisions(domain);
115
+ CREATE INDEX IF NOT EXISTS idx_facts_tags ON facts(tags);
116
+ CREATE INDEX IF NOT EXISTS idx_facts_expanded ON facts(expandedTags);
117
+ CREATE INDEX IF NOT EXISTS idx_blockers_impact ON blockers(impact);
118
+ CREATE INDEX IF NOT EXISTS idx_blockers_resolved ON blockers(resolvedAt);
119
+ CREATE INDEX IF NOT EXISTS idx_nudges_timestamp ON nudges(timestamp);
120
+ CREATE INDEX IF NOT EXISTS idx_nudges_resolved ON nudges(resolved);
121
+ CREATE INDEX IF NOT EXISTS idx_nudges_severity ON nudges(severity);
122
+ CREATE INDEX IF NOT EXISTS idx_nudges_file ON nudges(file);
123
+ `);
124
+ }
125
+ /**
126
+ * Store extracted signal with enriched metadata in warm storage
127
+ */
128
+ async storeSignal(signal, metadata) {
129
+ if (!this.warmDb) await this.initialize();
130
+ if (!this.warmDb) throw new Error("Database not initialized");
131
+ const now = (/* @__PURE__ */ new Date()).toISOString();
132
+ const decisionStmt = this.warmDb.prepare(`
133
+ INSERT OR REPLACE INTO decisions
134
+ (id, decision, context, reasoning, timestamp, who, files, tags, expandedTags, relatedTo, tradeoffs, status, supersededBy, hash, dependencies, codebaseArea, domain, lastAccessed, accessCount)
135
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0)
136
+ `);
137
+ for (const dec of signal.decisions) {
138
+ const hash = dec.hash || createHash("sha256").update(`${dec.decision}|${dec.context}|${dec.when}`).digest("hex").slice(0, 16);
139
+ decisionStmt.run(
140
+ dec.id,
141
+ dec.decision,
142
+ dec.context,
143
+ dec.reasoning || null,
144
+ dec.when,
145
+ dec.who || null,
146
+ JSON.stringify(dec.files),
147
+ JSON.stringify(dec.tags),
148
+ JSON.stringify(metadata?.expandedTags || []),
149
+ JSON.stringify(dec.relatedTo || []),
150
+ JSON.stringify(dec.tradeoffs || []),
151
+ dec.status,
152
+ dec.supersededBy || null,
153
+ hash,
154
+ JSON.stringify(metadata?.dependencies || []),
155
+ JSON.stringify(metadata?.codebaseArea || []),
156
+ JSON.stringify(metadata?.domain || []),
157
+ now
158
+ );
159
+ }
160
+ const factStmt = this.warmDb.prepare(`
161
+ INSERT OR REPLACE INTO facts
162
+ (id, fact, source, timestamp, tags, expandedTags, relatedDecisions, confidence, lastAccessed, accessCount)
163
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 0)
164
+ `);
165
+ for (const fact of signal.facts) {
166
+ factStmt.run(
167
+ fact.id,
168
+ fact.fact,
169
+ fact.source,
170
+ fact.when,
171
+ JSON.stringify(fact.tags),
172
+ JSON.stringify(metadata?.expandedTags || []),
173
+ JSON.stringify(fact.relatedDecisions || []),
174
+ fact.confidence,
175
+ now
176
+ );
177
+ }
178
+ const blockerStmt = this.warmDb.prepare(`
179
+ INSERT OR REPLACE INTO blockers
180
+ (id, blocker, impact, affectedAreas, timestamp, resolvedAt, resolution, tags, expandedTags, lastAccessed, accessCount)
181
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0)
182
+ `);
183
+ for (const blocker of signal.blockers) {
184
+ blockerStmt.run(
185
+ blocker.id,
186
+ blocker.blocker,
187
+ blocker.impact,
188
+ JSON.stringify(blocker.affectedAreas),
189
+ blocker.when,
190
+ blocker.resolvedAt || null,
191
+ blocker.resolution || null,
192
+ JSON.stringify(blocker.tags),
193
+ JSON.stringify(metadata?.expandedTags || []),
194
+ now
195
+ );
196
+ }
197
+ const questionStmt = this.warmDb.prepare(`
198
+ INSERT OR REPLACE INTO questions
199
+ (id, question, context, timestamp, answeredAt, answer, relatedDecisions, tags, expandedTags, lastAccessed, accessCount)
200
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0)
201
+ `);
202
+ for (const q of signal.questions) {
203
+ questionStmt.run(
204
+ q.id,
205
+ q.question,
206
+ q.context,
207
+ q.when,
208
+ q.answeredAt || null,
209
+ q.answer || null,
210
+ JSON.stringify(q.relatedDecisions || []),
211
+ JSON.stringify(q.tags),
212
+ JSON.stringify(metadata?.expandedTags || []),
213
+ now
214
+ );
215
+ }
216
+ }
217
+ /**
218
+ * Query decisions from warm storage with expanded tag matching
219
+ */
220
+ async queryDecisions(query) {
221
+ if (!this.warmDb) await this.initialize();
222
+ if (!this.warmDb) throw new Error("Database not initialized");
223
+ let sql = "SELECT * FROM decisions WHERE status = ?";
224
+ const params = ["active"];
225
+ if (query.tags && query.tags.length > 0) {
226
+ sql += " AND (" + query.tags.map(() => "(tags LIKE ? OR expandedTags LIKE ?)").join(" OR ") + ")";
227
+ for (const tag of query.tags) {
228
+ params.push(`%"${tag}"%`, `%"${tag}"%`);
229
+ }
230
+ }
231
+ if (query.filters?.codebaseArea) {
232
+ sql += " AND codebaseArea LIKE ?";
233
+ params.push(`%"${query.filters.codebaseArea}"%`);
234
+ }
235
+ if (query.filters?.domain) {
236
+ sql += " AND domain LIKE ?";
237
+ params.push(`%"${query.filters.domain}"%`);
238
+ }
239
+ if (query.timeWindow) {
240
+ if (query.timeWindow.start) {
241
+ sql += " AND timestamp >= ?";
242
+ params.push(query.timeWindow.start);
243
+ }
244
+ if (query.timeWindow.end) {
245
+ sql += " AND timestamp <= ?";
246
+ params.push(query.timeWindow.end);
247
+ }
248
+ }
249
+ sql += " ORDER BY timestamp DESC";
250
+ if (query.limit) {
251
+ sql += " LIMIT ?";
252
+ params.push(query.limit);
253
+ }
254
+ const rows = this.warmDb.prepare(sql).all(...params);
255
+ return rows.map((row) => ({
256
+ id: row.id,
257
+ decision: row.decision,
258
+ context: row.context,
259
+ reasoning: row.reasoning,
260
+ when: row.when,
261
+ who: row.who,
262
+ files: JSON.parse(row.files),
263
+ tags: JSON.parse(row.tags),
264
+ relatedTo: JSON.parse(row.relatedTo || "[]"),
265
+ tradeoffs: JSON.parse(row.tradeoffs || "[]"),
266
+ status: row.status,
267
+ supersededBy: row.supersededBy,
268
+ hash: row.hash || void 0
269
+ }));
270
+ }
271
+ /**
272
+ * Query blockers from warm storage with expanded tag matching
273
+ */
274
+ async queryBlockers(query) {
275
+ if (!this.warmDb) await this.initialize();
276
+ if (!this.warmDb) throw new Error("Database not initialized");
277
+ let sql = "SELECT * FROM blockers WHERE resolvedAt IS NULL";
278
+ const params = [];
279
+ if (query.tags && query.tags.length > 0) {
280
+ sql += " AND (" + query.tags.map(() => "(tags LIKE ? OR expandedTags LIKE ?)").join(" OR ") + ")";
281
+ for (const tag of query.tags) {
282
+ params.push(`%"${tag}"%`, `%"${tag}"%`);
283
+ }
284
+ }
285
+ sql += " ORDER BY CASE impact WHEN 'critical' THEN 1 WHEN 'high' THEN 2 WHEN 'medium' THEN 3 ELSE 4 END, timestamp DESC";
286
+ if (query.limit) {
287
+ sql += " LIMIT ?";
288
+ params.push(query.limit);
289
+ }
290
+ const rows = this.warmDb.prepare(sql).all(...params);
291
+ return rows.map((row) => ({
292
+ id: row.id,
293
+ blocker: row.blocker,
294
+ impact: row.impact,
295
+ affectedAreas: JSON.parse(row.affectedAreas),
296
+ when: row.when,
297
+ resolvedAt: row.resolvedAt,
298
+ resolution: row.resolution,
299
+ tags: JSON.parse(row.tags)
300
+ }));
301
+ }
302
+ /**
303
+ * Get hot cache item
304
+ */
305
+ getHot(key) {
306
+ return this.hotCache.get(key);
307
+ }
308
+ /**
309
+ * Set hot cache item
310
+ */
311
+ setHot(key, value) {
312
+ this.hotCache.set(key, value);
313
+ }
314
+ /**
315
+ * Clear hot cache
316
+ */
317
+ clearHot() {
318
+ this.hotCache.clear();
319
+ }
320
+ /**
321
+ * Store a nudge in warm storage
322
+ */
323
+ async storeNudge(nudge) {
324
+ if (!this.warmDb) await this.initialize();
325
+ if (!this.warmDb) throw new Error("Database not initialized");
326
+ const stmt = this.warmDb.prepare(`
327
+ INSERT OR REPLACE INTO nudges
328
+ (id, message, severity, file, category, goalId, timestamp, resolved, resolvedAt, resolution, dismissed, priority, suggestedAction, relatedIssues, metadata)
329
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
330
+ `);
331
+ stmt.run(
332
+ nudge.id,
333
+ nudge.message,
334
+ nudge.severity,
335
+ nudge.file || null,
336
+ nudge.category || null,
337
+ nudge.goalId || null,
338
+ nudge.timestamp,
339
+ nudge.resolved ? 1 : 0,
340
+ nudge.resolvedAt || null,
341
+ nudge.resolution || null,
342
+ nudge.dismissed ? 1 : 0,
343
+ nudge.priority,
344
+ nudge.suggestedAction || null,
345
+ JSON.stringify(nudge.relatedIssues || []),
346
+ JSON.stringify(nudge.metadata || {})
347
+ );
348
+ }
349
+ /**
350
+ * Query nudges from warm storage
351
+ */
352
+ async queryNudges(filters) {
353
+ if (!this.warmDb) await this.initialize();
354
+ if (!this.warmDb) throw new Error("Database not initialized");
355
+ let sql = "SELECT * FROM nudges WHERE 1=1";
356
+ const params = [];
357
+ if (filters?.resolved !== void 0) {
358
+ sql += " AND resolved = ?";
359
+ params.push(filters.resolved ? 1 : 0);
360
+ }
361
+ if (filters?.severity) {
362
+ sql += " AND severity = ?";
363
+ params.push(filters.severity);
364
+ }
365
+ if (filters?.file) {
366
+ sql += " AND file = ?";
367
+ params.push(filters.file);
368
+ }
369
+ if (filters?.category) {
370
+ sql += " AND category = ?";
371
+ params.push(filters.category);
372
+ }
373
+ if (filters?.goalId) {
374
+ sql += " AND goalId = ?";
375
+ params.push(filters.goalId);
376
+ }
377
+ sql += " ORDER BY timestamp DESC";
378
+ if (filters?.limit) {
379
+ sql += " LIMIT ?";
380
+ params.push(filters.limit);
381
+ }
382
+ const rows = this.warmDb.prepare(sql).all(...params);
383
+ return rows.map((row) => ({
384
+ id: row.id,
385
+ message: row.message,
386
+ severity: row.severity,
387
+ file: row.file || void 0,
388
+ category: row.category || void 0,
389
+ goalId: row.goalId || void 0,
390
+ timestamp: row.timestamp,
391
+ resolved: Boolean(row.resolved),
392
+ resolvedAt: row.resolvedAt || void 0,
393
+ resolution: row.resolution || void 0,
394
+ dismissed: Boolean(row.dismissed),
395
+ priority: row.priority,
396
+ suggestedAction: row.suggestedAction || void 0,
397
+ relatedIssues: JSON.parse(row.relatedIssues || "[]"),
398
+ metadata: JSON.parse(row.metadata || "{}")
399
+ }));
400
+ }
401
+ /**
402
+ * Mark a nudge as resolved
403
+ */
404
+ async resolveNudge(nudgeId, resolution) {
405
+ if (!this.warmDb) await this.initialize();
406
+ if (!this.warmDb) throw new Error("Database not initialized");
407
+ const now = (/* @__PURE__ */ new Date()).toISOString();
408
+ this.warmDb.prepare(`
409
+ UPDATE nudges
410
+ SET resolved = 1, resolvedAt = ?, resolution = ?, dismissed = ?
411
+ WHERE id = ?
412
+ `).run(now, resolution, resolution === "dismissed" ? 1 : 0, nudgeId);
413
+ }
414
+ /**
415
+ * Mark a nudge as dismissed
416
+ */
417
+ async dismissNudge(nudgeId) {
418
+ await this.resolveNudge(nudgeId, "dismissed");
419
+ }
420
+ /**
421
+ * Get unresolved nudges count
422
+ */
423
+ async getUnresolvedNudgesCount() {
424
+ if (!this.warmDb) await this.initialize();
425
+ if (!this.warmDb) throw new Error("Database not initialized");
426
+ const result = this.warmDb.prepare("SELECT COUNT(*) as count FROM nudges WHERE resolved = 0").get();
427
+ return result.count;
428
+ }
429
+ /**
430
+ * Archive old data to cold storage
431
+ */
432
+ async archiveToCold(olderThanDays = 90) {
433
+ if (!this.warmDb) await this.initialize();
434
+ if (!this.warmDb) throw new Error("Database not initialized");
435
+ const cutoffDate = /* @__PURE__ */ new Date();
436
+ cutoffDate.setDate(cutoffDate.getDate() - olderThanDays);
437
+ const cutoff = cutoffDate.toISOString();
438
+ const coldDir = join(getTrieDirectory(this.workDir), "cold");
439
+ const archivePath = join(coldDir, `archive-${Date.now()}.json`);
440
+ const decisions = this.warmDb.prepare("SELECT * FROM decisions WHERE timestamp < ? AND accessCount < 3").all(cutoff);
441
+ const facts = this.warmDb.prepare("SELECT * FROM facts WHERE timestamp < ? AND accessCount < 3").all(cutoff);
442
+ const blockers = this.warmDb.prepare("SELECT * FROM blockers WHERE timestamp < ? AND resolvedAt IS NOT NULL").all(cutoff);
443
+ const questions = this.warmDb.prepare("SELECT * FROM questions WHERE timestamp < ? AND answeredAt IS NOT NULL").all(cutoff);
444
+ const nudges = this.warmDb.prepare("SELECT * FROM nudges WHERE timestamp < ? AND resolved = 1").all(cutoff);
445
+ await writeFile(archivePath, JSON.stringify({ decisions, facts, blockers, questions, nudges }, null, 2));
446
+ this.warmDb.prepare("DELETE FROM decisions WHERE timestamp < ? AND accessCount < 3").run(cutoff);
447
+ this.warmDb.prepare("DELETE FROM facts WHERE timestamp < ? AND accessCount < 3").run(cutoff);
448
+ this.warmDb.prepare("DELETE FROM blockers WHERE timestamp < ? AND resolvedAt IS NOT NULL").run(cutoff);
449
+ this.warmDb.prepare("DELETE FROM questions WHERE timestamp < ? AND answeredAt IS NOT NULL").run(cutoff);
450
+ this.warmDb.prepare("DELETE FROM nudges WHERE timestamp < ? AND resolved = 1").run(cutoff);
451
+ }
452
+ /**
453
+ * Close database connection
454
+ */
455
+ close() {
456
+ if (this.warmDb) {
457
+ this.warmDb.close();
458
+ this.warmDb = null;
459
+ }
460
+ }
461
+ };
462
+ var storageInstances = /* @__PURE__ */ new Map();
463
+ function getStorage(workDir) {
464
+ if (!storageInstances.has(workDir)) {
465
+ storageInstances.set(workDir, new TieredStorage(workDir));
466
+ }
467
+ return storageInstances.get(workDir);
468
+ }
469
+
470
+ export {
471
+ TieredStorage,
472
+ getStorage
473
+ };
474
+ //# sourceMappingURL=chunk-Z4DN527J.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/storage/tiered-storage.ts"],"sourcesContent":["/**\n * Tiered Storage System\n * \n * Three-tier architecture for context management:\n * - HOT: In-memory, current session data\n * - WARM: SQLite DB, queryable decisions/facts/blockers\n * - COLD: Full history, indexed but not actively queried\n * \n * This prevents context pollution by keeping agents focused on\n * relevant signal rather than dumping everything into context.\n */\n\nimport { writeFile, mkdir } from 'fs/promises';\nimport { join } from 'path';\nimport { createHash } from 'node:crypto';\nimport Database from 'better-sqlite3';\nimport type {\n Decision,\n Blocker,\n ExtractedSignal,\n ContextQuery,\n Nudge,\n} from '../types/signal.js';\nimport { getTrieDirectory } from '../utils/workspace.js';\n\nexport class TieredStorage {\n private workDir: string;\n private hotCache: Map<string, any> = new Map();\n private warmDb: Database.Database | null = null;\n\n constructor(workDir: string) {\n this.workDir = workDir;\n }\n\n /**\n * Initialize storage directories and database\n */\n async initialize(): Promise<void> {\n const trieDir = getTrieDirectory(this.workDir);\n \n // Create directories\n await mkdir(join(trieDir, 'hot'), { recursive: true });\n await mkdir(join(trieDir, 'warm'), { recursive: true });\n await mkdir(join(trieDir, 'cold'), { recursive: true });\n\n // Initialize warm database\n const dbPath = join(trieDir, 'warm', 'decisions.db');\n this.warmDb = new Database(dbPath);\n \n // Create tables\n this.warmDb.exec(`\n CREATE TABLE IF NOT EXISTS decisions (\n id TEXT PRIMARY KEY,\n decision TEXT NOT NULL,\n context TEXT NOT NULL,\n reasoning TEXT,\n timestamp TEXT NOT NULL,\n who TEXT,\n files TEXT NOT NULL, -- JSON array\n tags TEXT NOT NULL, -- JSON array\n expandedTags TEXT, -- JSON array (with synonyms)\n relatedTo TEXT, -- JSON array\n tradeoffs TEXT, -- JSON array\n status TEXT NOT NULL,\n supersededBy TEXT,\n hash TEXT, -- SHA-256 fingerprint (first 16 hex chars)\n dependencies TEXT, -- JSON array (npm packages, services)\n codebaseArea TEXT, -- JSON array (frontend, backend, auth, etc.)\n domain TEXT, -- JSON array (payments, compliance, etc.)\n lastAccessed TEXT NOT NULL,\n accessCount INTEGER DEFAULT 0\n );\n\n CREATE TABLE IF NOT EXISTS facts (\n id TEXT PRIMARY KEY,\n fact TEXT NOT NULL,\n source TEXT NOT NULL,\n timestamp TEXT NOT NULL,\n tags TEXT NOT NULL, -- JSON array\n expandedTags TEXT, -- JSON array (with synonyms)\n relatedDecisions TEXT, -- JSON array\n confidence REAL NOT NULL,\n lastAccessed TEXT NOT NULL,\n accessCount INTEGER DEFAULT 0\n );\n\n CREATE TABLE IF NOT EXISTS blockers (\n id TEXT PRIMARY KEY,\n blocker TEXT NOT NULL,\n impact TEXT NOT NULL,\n affectedAreas TEXT NOT NULL, -- JSON array\n timestamp TEXT NOT NULL,\n resolvedAt TEXT,\n resolution TEXT,\n tags TEXT NOT NULL, -- JSON array\n expandedTags TEXT, -- JSON array (with synonyms)\n lastAccessed TEXT NOT NULL,\n accessCount INTEGER DEFAULT 0\n );\n\n CREATE TABLE IF NOT EXISTS questions (\n id TEXT PRIMARY KEY,\n question TEXT NOT NULL,\n context TEXT NOT NULL,\n timestamp TEXT NOT NULL,\n answeredAt TEXT,\n answer TEXT,\n relatedDecisions TEXT, -- JSON array\n tags TEXT NOT NULL, -- JSON array\n expandedTags TEXT, -- JSON array (with synonyms)\n lastAccessed TEXT NOT NULL,\n accessCount INTEGER DEFAULT 0\n );\n\n CREATE TABLE IF NOT EXISTS nudges (\n id TEXT PRIMARY KEY,\n message TEXT NOT NULL,\n severity TEXT NOT NULL, -- 'critical', 'high', 'warning', 'info'\n file TEXT,\n category TEXT, -- 'quality', 'security', 'performance', etc.\n goalId TEXT, -- Related goal ID if this is a goal violation\n timestamp TEXT NOT NULL,\n resolved BOOLEAN NOT NULL DEFAULT 0,\n resolvedAt TEXT,\n resolution TEXT, -- How it was resolved: 'dismissed', 'fixed', 'auto-fixed'\n dismissed BOOLEAN NOT NULL DEFAULT 0,\n priority INTEGER DEFAULT 5, -- 1-10 priority score\n suggestedAction TEXT,\n relatedIssues TEXT, -- JSON array\n metadata TEXT -- JSON object for additional data\n );\n\n CREATE INDEX IF NOT EXISTS idx_decisions_tags ON decisions(tags);\n CREATE INDEX IF NOT EXISTS idx_decisions_expanded ON decisions(expandedTags);\n CREATE INDEX IF NOT EXISTS idx_decisions_timestamp ON decisions(timestamp);\n CREATE INDEX IF NOT EXISTS idx_decisions_status ON decisions(status);\n CREATE INDEX IF NOT EXISTS idx_decisions_area ON decisions(codebaseArea);\n CREATE INDEX IF NOT EXISTS idx_decisions_domain ON decisions(domain);\n CREATE INDEX IF NOT EXISTS idx_facts_tags ON facts(tags);\n CREATE INDEX IF NOT EXISTS idx_facts_expanded ON facts(expandedTags);\n CREATE INDEX IF NOT EXISTS idx_blockers_impact ON blockers(impact);\n CREATE INDEX IF NOT EXISTS idx_blockers_resolved ON blockers(resolvedAt);\n CREATE INDEX IF NOT EXISTS idx_nudges_timestamp ON nudges(timestamp);\n CREATE INDEX IF NOT EXISTS idx_nudges_resolved ON nudges(resolved);\n CREATE INDEX IF NOT EXISTS idx_nudges_severity ON nudges(severity);\n CREATE INDEX IF NOT EXISTS idx_nudges_file ON nudges(file);\n `);\n }\n\n /**\n * Store extracted signal with enriched metadata in warm storage\n */\n async storeSignal(signal: ExtractedSignal, metadata?: {\n expandedTags?: string[];\n dependencies?: string[];\n codebaseArea?: string[];\n domain?: string[];\n }): Promise<void> {\n if (!this.warmDb) await this.initialize();\n if (!this.warmDb) throw new Error('Database not initialized');\n\n const now = new Date().toISOString();\n\n // Store decisions\n const decisionStmt = this.warmDb.prepare(`\n INSERT OR REPLACE INTO decisions \n (id, decision, context, reasoning, timestamp, who, files, tags, expandedTags, relatedTo, tradeoffs, status, supersededBy, hash, dependencies, codebaseArea, domain, lastAccessed, accessCount)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0)\n `);\n\n for (const dec of signal.decisions) {\n const hash = dec.hash || createHash('sha256')\n .update(`${dec.decision}|${dec.context}|${dec.when}`)\n .digest('hex')\n .slice(0, 16);\n decisionStmt.run(\n dec.id,\n dec.decision,\n dec.context,\n dec.reasoning || null,\n dec.when,\n dec.who || null,\n JSON.stringify(dec.files),\n JSON.stringify(dec.tags),\n JSON.stringify(metadata?.expandedTags || []),\n JSON.stringify(dec.relatedTo || []),\n JSON.stringify(dec.tradeoffs || []),\n dec.status,\n dec.supersededBy || null,\n hash,\n JSON.stringify(metadata?.dependencies || []),\n JSON.stringify(metadata?.codebaseArea || []),\n JSON.stringify(metadata?.domain || []),\n now\n );\n }\n\n // Store facts\n const factStmt = this.warmDb.prepare(`\n INSERT OR REPLACE INTO facts\n (id, fact, source, timestamp, tags, expandedTags, relatedDecisions, confidence, lastAccessed, accessCount)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 0)\n `);\n\n for (const fact of signal.facts) {\n factStmt.run(\n fact.id,\n fact.fact,\n fact.source,\n fact.when,\n JSON.stringify(fact.tags),\n JSON.stringify(metadata?.expandedTags || []),\n JSON.stringify(fact.relatedDecisions || []),\n fact.confidence,\n now\n );\n }\n\n // Store blockers\n const blockerStmt = this.warmDb.prepare(`\n INSERT OR REPLACE INTO blockers\n (id, blocker, impact, affectedAreas, timestamp, resolvedAt, resolution, tags, expandedTags, lastAccessed, accessCount)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0)\n `);\n\n for (const blocker of signal.blockers) {\n blockerStmt.run(\n blocker.id,\n blocker.blocker,\n blocker.impact,\n JSON.stringify(blocker.affectedAreas),\n blocker.when,\n blocker.resolvedAt || null,\n blocker.resolution || null,\n JSON.stringify(blocker.tags),\n JSON.stringify(metadata?.expandedTags || []),\n now\n );\n }\n\n // Store questions\n const questionStmt = this.warmDb.prepare(`\n INSERT OR REPLACE INTO questions\n (id, question, context, timestamp, answeredAt, answer, relatedDecisions, tags, expandedTags, lastAccessed, accessCount)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0)\n `);\n\n for (const q of signal.questions) {\n questionStmt.run(\n q.id,\n q.question,\n q.context,\n q.when,\n q.answeredAt || null,\n q.answer || null,\n JSON.stringify(q.relatedDecisions || []),\n JSON.stringify(q.tags),\n JSON.stringify(metadata?.expandedTags || []),\n now\n );\n }\n }\n\n /**\n * Query decisions from warm storage with expanded tag matching\n */\n async queryDecisions(query: ContextQuery): Promise<Decision[]> {\n if (!this.warmDb) await this.initialize();\n if (!this.warmDb) throw new Error('Database not initialized');\n\n let sql = 'SELECT * FROM decisions WHERE status = ?';\n const params: any[] = ['active'];\n\n // Add filters - search both tags and expandedTags for broader matching\n if (query.tags && query.tags.length > 0) {\n sql += ' AND (' + query.tags.map(() => '(tags LIKE ? OR expandedTags LIKE ?)').join(' OR ') + ')';\n for (const tag of query.tags) {\n params.push(`%\"${tag}\"%`, `%\"${tag}\"%`);\n }\n }\n\n // Filter by codebase area if specified\n if (query.filters?.codebaseArea) {\n sql += ' AND codebaseArea LIKE ?';\n params.push(`%\"${query.filters.codebaseArea}\"%`);\n }\n\n // Filter by domain if specified\n if (query.filters?.domain) {\n sql += ' AND domain LIKE ?';\n params.push(`%\"${query.filters.domain}\"%`);\n }\n\n if (query.timeWindow) {\n if (query.timeWindow.start) {\n sql += ' AND timestamp >= ?';\n params.push(query.timeWindow.start);\n }\n if (query.timeWindow.end) {\n sql += ' AND timestamp <= ?';\n params.push(query.timeWindow.end);\n }\n }\n\n sql += ' ORDER BY timestamp DESC';\n\n if (query.limit) {\n sql += ' LIMIT ?';\n params.push(query.limit);\n }\n\n const rows = this.warmDb.prepare(sql).all(...params) as any[];\n\n return rows.map(row => ({\n id: row.id,\n decision: row.decision,\n context: row.context,\n reasoning: row.reasoning,\n when: row.when,\n who: row.who,\n files: JSON.parse(row.files),\n tags: JSON.parse(row.tags),\n relatedTo: JSON.parse(row.relatedTo || '[]'),\n tradeoffs: JSON.parse(row.tradeoffs || '[]'),\n status: row.status,\n supersededBy: row.supersededBy,\n hash: row.hash || undefined,\n }));\n }\n\n /**\n * Query blockers from warm storage with expanded tag matching\n */\n async queryBlockers(query: ContextQuery): Promise<Blocker[]> {\n if (!this.warmDb) await this.initialize();\n if (!this.warmDb) throw new Error('Database not initialized');\n\n let sql = 'SELECT * FROM blockers WHERE resolvedAt IS NULL';\n const params: any[] = [];\n\n if (query.tags && query.tags.length > 0) {\n sql += ' AND (' + query.tags.map(() => '(tags LIKE ? OR expandedTags LIKE ?)').join(' OR ') + ')';\n for (const tag of query.tags) {\n params.push(`%\"${tag}\"%`, `%\"${tag}\"%`);\n }\n }\n\n sql += \" ORDER BY CASE impact WHEN 'critical' THEN 1 WHEN 'high' THEN 2 WHEN 'medium' THEN 3 ELSE 4 END, timestamp DESC\";\n\n if (query.limit) {\n sql += ' LIMIT ?';\n params.push(query.limit);\n }\n\n const rows = this.warmDb.prepare(sql).all(...params) as any[];\n\n return rows.map(row => ({\n id: row.id,\n blocker: row.blocker,\n impact: row.impact,\n affectedAreas: JSON.parse(row.affectedAreas),\n when: row.when,\n resolvedAt: row.resolvedAt,\n resolution: row.resolution,\n tags: JSON.parse(row.tags)\n }));\n }\n\n /**\n * Get hot cache item\n */\n getHot<T>(key: string): T | undefined {\n return this.hotCache.get(key);\n }\n\n /**\n * Set hot cache item\n */\n setHot<T>(key: string, value: T): void {\n this.hotCache.set(key, value);\n }\n\n /**\n * Clear hot cache\n */\n clearHot(): void {\n this.hotCache.clear();\n }\n\n /**\n * Store a nudge in warm storage\n */\n async storeNudge(nudge: Nudge): Promise<void> {\n if (!this.warmDb) await this.initialize();\n if (!this.warmDb) throw new Error('Database not initialized');\n\n const stmt = this.warmDb.prepare(`\n INSERT OR REPLACE INTO nudges\n (id, message, severity, file, category, goalId, timestamp, resolved, resolvedAt, resolution, dismissed, priority, suggestedAction, relatedIssues, metadata)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n nudge.id,\n nudge.message,\n nudge.severity,\n nudge.file || null,\n nudge.category || null,\n nudge.goalId || null,\n nudge.timestamp,\n nudge.resolved ? 1 : 0,\n nudge.resolvedAt || null,\n nudge.resolution || null,\n nudge.dismissed ? 1 : 0,\n nudge.priority,\n nudge.suggestedAction || null,\n JSON.stringify(nudge.relatedIssues || []),\n JSON.stringify(nudge.metadata || {})\n );\n }\n\n /**\n * Query nudges from warm storage\n */\n async queryNudges(filters?: {\n resolved?: boolean;\n severity?: string;\n file?: string;\n category?: string;\n goalId?: string;\n limit?: number;\n }): Promise<Nudge[]> {\n if (!this.warmDb) await this.initialize();\n if (!this.warmDb) throw new Error('Database not initialized');\n\n let sql = 'SELECT * FROM nudges WHERE 1=1';\n const params: any[] = [];\n\n if (filters?.resolved !== undefined) {\n sql += ' AND resolved = ?';\n params.push(filters.resolved ? 1 : 0);\n }\n\n if (filters?.severity) {\n sql += ' AND severity = ?';\n params.push(filters.severity);\n }\n\n if (filters?.file) {\n sql += ' AND file = ?';\n params.push(filters.file);\n }\n\n if (filters?.category) {\n sql += ' AND category = ?';\n params.push(filters.category);\n }\n\n if (filters?.goalId) {\n sql += ' AND goalId = ?';\n params.push(filters.goalId);\n }\n\n sql += ' ORDER BY timestamp DESC';\n\n if (filters?.limit) {\n sql += ' LIMIT ?';\n params.push(filters.limit);\n }\n\n const rows = this.warmDb.prepare(sql).all(...params) as any[];\n\n return rows.map(row => ({\n id: row.id,\n message: row.message,\n severity: row.severity,\n file: row.file || undefined,\n category: row.category || undefined,\n goalId: row.goalId || undefined,\n timestamp: row.timestamp,\n resolved: Boolean(row.resolved),\n resolvedAt: row.resolvedAt || undefined,\n resolution: row.resolution || undefined,\n dismissed: Boolean(row.dismissed),\n priority: row.priority,\n suggestedAction: row.suggestedAction || undefined,\n relatedIssues: JSON.parse(row.relatedIssues || '[]'),\n metadata: JSON.parse(row.metadata || '{}'),\n }));\n }\n\n /**\n * Mark a nudge as resolved\n */\n async resolveNudge(nudgeId: string, resolution: 'dismissed' | 'fixed' | 'auto-fixed'): Promise<void> {\n if (!this.warmDb) await this.initialize();\n if (!this.warmDb) throw new Error('Database not initialized');\n\n const now = new Date().toISOString();\n \n this.warmDb.prepare(`\n UPDATE nudges \n SET resolved = 1, resolvedAt = ?, resolution = ?, dismissed = ?\n WHERE id = ?\n `).run(now, resolution, resolution === 'dismissed' ? 1 : 0, nudgeId);\n }\n\n /**\n * Mark a nudge as dismissed\n */\n async dismissNudge(nudgeId: string): Promise<void> {\n await this.resolveNudge(nudgeId, 'dismissed');\n }\n\n /**\n * Get unresolved nudges count\n */\n async getUnresolvedNudgesCount(): Promise<number> {\n if (!this.warmDb) await this.initialize();\n if (!this.warmDb) throw new Error('Database not initialized');\n\n const result = this.warmDb.prepare('SELECT COUNT(*) as count FROM nudges WHERE resolved = 0').get() as { count: number };\n return result.count;\n }\n\n /**\n * Archive old data to cold storage\n */\n async archiveToCold(olderThanDays: number = 90): Promise<void> {\n if (!this.warmDb) await this.initialize();\n if (!this.warmDb) throw new Error('Database not initialized');\n\n const cutoffDate = new Date();\n cutoffDate.setDate(cutoffDate.getDate() - olderThanDays);\n const cutoff = cutoffDate.toISOString();\n\n // Export to cold storage\n const coldDir = join(getTrieDirectory(this.workDir), 'cold');\n const archivePath = join(coldDir, `archive-${Date.now()}.json`);\n\n const decisions = this.warmDb.prepare('SELECT * FROM decisions WHERE timestamp < ? AND accessCount < 3').all(cutoff);\n const facts = this.warmDb.prepare('SELECT * FROM facts WHERE timestamp < ? AND accessCount < 3').all(cutoff);\n const blockers = this.warmDb.prepare('SELECT * FROM blockers WHERE timestamp < ? AND resolvedAt IS NOT NULL').all(cutoff);\n const questions = this.warmDb.prepare('SELECT * FROM questions WHERE timestamp < ? AND answeredAt IS NOT NULL').all(cutoff);\n const nudges = this.warmDb.prepare('SELECT * FROM nudges WHERE timestamp < ? AND resolved = 1').all(cutoff);\n\n await writeFile(archivePath, JSON.stringify({ decisions, facts, blockers, questions, nudges }, null, 2));\n\n // Delete from warm storage\n this.warmDb.prepare('DELETE FROM decisions WHERE timestamp < ? AND accessCount < 3').run(cutoff);\n this.warmDb.prepare('DELETE FROM facts WHERE timestamp < ? AND accessCount < 3').run(cutoff);\n this.warmDb.prepare('DELETE FROM blockers WHERE timestamp < ? AND resolvedAt IS NOT NULL').run(cutoff);\n this.warmDb.prepare('DELETE FROM questions WHERE timestamp < ? AND answeredAt IS NOT NULL').run(cutoff);\n this.warmDb.prepare('DELETE FROM nudges WHERE timestamp < ? AND resolved = 1').run(cutoff);\n }\n\n /**\n * Close database connection\n */\n close(): void {\n if (this.warmDb) {\n this.warmDb.close();\n this.warmDb = null;\n }\n }\n}\n\n/**\n * Get storage instance for working directory\n */\nconst storageInstances = new Map<string, TieredStorage>();\n\nexport function getStorage(workDir: string): TieredStorage {\n if (!storageInstances.has(workDir)) {\n storageInstances.set(workDir, new TieredStorage(workDir));\n }\n return storageInstances.get(workDir)!;\n}\n"],"mappings":";;;;;AAYA,SAAS,WAAW,aAAa;AACjC,SAAS,YAAY;AACrB,SAAS,kBAAkB;AAC3B,OAAO,cAAc;AAUd,IAAM,gBAAN,MAAoB;AAAA,EACjB;AAAA,EACA,WAA6B,oBAAI,IAAI;AAAA,EACrC,SAAmC;AAAA,EAE3C,YAAY,SAAiB;AAC3B,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA4B;AAChC,UAAM,UAAU,iBAAiB,KAAK,OAAO;AAG7C,UAAM,MAAM,KAAK,SAAS,KAAK,GAAG,EAAE,WAAW,KAAK,CAAC;AACrD,UAAM,MAAM,KAAK,SAAS,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AACtD,UAAM,MAAM,KAAK,SAAS,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAGtD,UAAM,SAAS,KAAK,SAAS,QAAQ,cAAc;AACnD,SAAK,SAAS,IAAI,SAAS,MAAM;AAGjC,SAAK,OAAO,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAgGhB;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,QAAyB,UAKzB;AAChB,QAAI,CAAC,KAAK,OAAQ,OAAM,KAAK,WAAW;AACxC,QAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,0BAA0B;AAE5D,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAGnC,UAAM,eAAe,KAAK,OAAO,QAAQ;AAAA;AAAA;AAAA;AAAA,KAIxC;AAED,eAAW,OAAO,OAAO,WAAW;AAClC,YAAM,OAAO,IAAI,QAAQ,WAAW,QAAQ,EACzC,OAAO,GAAG,IAAI,QAAQ,IAAI,IAAI,OAAO,IAAI,IAAI,IAAI,EAAE,EACnD,OAAO,KAAK,EACZ,MAAM,GAAG,EAAE;AACd,mBAAa;AAAA,QACX,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI,aAAa;AAAA,QACjB,IAAI;AAAA,QACJ,IAAI,OAAO;AAAA,QACX,KAAK,UAAU,IAAI,KAAK;AAAA,QACxB,KAAK,UAAU,IAAI,IAAI;AAAA,QACvB,KAAK,UAAU,UAAU,gBAAgB,CAAC,CAAC;AAAA,QAC3C,KAAK,UAAU,IAAI,aAAa,CAAC,CAAC;AAAA,QAClC,KAAK,UAAU,IAAI,aAAa,CAAC,CAAC;AAAA,QAClC,IAAI;AAAA,QACJ,IAAI,gBAAgB;AAAA,QACpB;AAAA,QACA,KAAK,UAAU,UAAU,gBAAgB,CAAC,CAAC;AAAA,QAC3C,KAAK,UAAU,UAAU,gBAAgB,CAAC,CAAC;AAAA,QAC3C,KAAK,UAAU,UAAU,UAAU,CAAC,CAAC;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAGA,UAAM,WAAW,KAAK,OAAO,QAAQ;AAAA;AAAA;AAAA;AAAA,KAIpC;AAED,eAAW,QAAQ,OAAO,OAAO;AAC/B,eAAS;AAAA,QACP,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK,UAAU,KAAK,IAAI;AAAA,QACxB,KAAK,UAAU,UAAU,gBAAgB,CAAC,CAAC;AAAA,QAC3C,KAAK,UAAU,KAAK,oBAAoB,CAAC,CAAC;AAAA,QAC1C,KAAK;AAAA,QACL;AAAA,MACF;AAAA,IACF;AAGA,UAAM,cAAc,KAAK,OAAO,QAAQ;AAAA;AAAA;AAAA;AAAA,KAIvC;AAED,eAAW,WAAW,OAAO,UAAU;AACrC,kBAAY;AAAA,QACV,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,KAAK,UAAU,QAAQ,aAAa;AAAA,QACpC,QAAQ;AAAA,QACR,QAAQ,cAAc;AAAA,QACtB,QAAQ,cAAc;AAAA,QACtB,KAAK,UAAU,QAAQ,IAAI;AAAA,QAC3B,KAAK,UAAU,UAAU,gBAAgB,CAAC,CAAC;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAGA,UAAM,eAAe,KAAK,OAAO,QAAQ;AAAA;AAAA;AAAA;AAAA,KAIxC;AAED,eAAW,KAAK,OAAO,WAAW;AAChC,mBAAa;AAAA,QACX,EAAE;AAAA,QACF,EAAE;AAAA,QACF,EAAE;AAAA,QACF,EAAE;AAAA,QACF,EAAE,cAAc;AAAA,QAChB,EAAE,UAAU;AAAA,QACZ,KAAK,UAAU,EAAE,oBAAoB,CAAC,CAAC;AAAA,QACvC,KAAK,UAAU,EAAE,IAAI;AAAA,QACrB,KAAK,UAAU,UAAU,gBAAgB,CAAC,CAAC;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,OAA0C;AAC7D,QAAI,CAAC,KAAK,OAAQ,OAAM,KAAK,WAAW;AACxC,QAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,0BAA0B;AAE5D,QAAI,MAAM;AACV,UAAM,SAAgB,CAAC,QAAQ;AAG/B,QAAI,MAAM,QAAQ,MAAM,KAAK,SAAS,GAAG;AACvC,aAAO,WAAW,MAAM,KAAK,IAAI,MAAM,sCAAsC,EAAE,KAAK,MAAM,IAAI;AAC9F,iBAAW,OAAO,MAAM,MAAM;AAC5B,eAAO,KAAK,KAAK,GAAG,MAAM,KAAK,GAAG,IAAI;AAAA,MACxC;AAAA,IACF;AAGA,QAAI,MAAM,SAAS,cAAc;AAC/B,aAAO;AACP,aAAO,KAAK,KAAK,MAAM,QAAQ,YAAY,IAAI;AAAA,IACjD;AAGA,QAAI,MAAM,SAAS,QAAQ;AACzB,aAAO;AACP,aAAO,KAAK,KAAK,MAAM,QAAQ,MAAM,IAAI;AAAA,IAC3C;AAEA,QAAI,MAAM,YAAY;AACpB,UAAI,MAAM,WAAW,OAAO;AAC1B,eAAO;AACP,eAAO,KAAK,MAAM,WAAW,KAAK;AAAA,MACpC;AACA,UAAI,MAAM,WAAW,KAAK;AACxB,eAAO;AACP,eAAO,KAAK,MAAM,WAAW,GAAG;AAAA,MAClC;AAAA,IACF;AAEA,WAAO;AAEP,QAAI,MAAM,OAAO;AACf,aAAO;AACP,aAAO,KAAK,MAAM,KAAK;AAAA,IACzB;AAEA,UAAM,OAAO,KAAK,OAAO,QAAQ,GAAG,EAAE,IAAI,GAAG,MAAM;AAEnD,WAAO,KAAK,IAAI,UAAQ;AAAA,MACtB,IAAI,IAAI;AAAA,MACR,UAAU,IAAI;AAAA,MACd,SAAS,IAAI;AAAA,MACb,WAAW,IAAI;AAAA,MACf,MAAM,IAAI;AAAA,MACV,KAAK,IAAI;AAAA,MACT,OAAO,KAAK,MAAM,IAAI,KAAK;AAAA,MAC3B,MAAM,KAAK,MAAM,IAAI,IAAI;AAAA,MACzB,WAAW,KAAK,MAAM,IAAI,aAAa,IAAI;AAAA,MAC3C,WAAW,KAAK,MAAM,IAAI,aAAa,IAAI;AAAA,MAC3C,QAAQ,IAAI;AAAA,MACZ,cAAc,IAAI;AAAA,MAClB,MAAM,IAAI,QAAQ;AAAA,IACpB,EAAE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,OAAyC;AAC3D,QAAI,CAAC,KAAK,OAAQ,OAAM,KAAK,WAAW;AACxC,QAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,0BAA0B;AAE5D,QAAI,MAAM;AACV,UAAM,SAAgB,CAAC;AAEvB,QAAI,MAAM,QAAQ,MAAM,KAAK,SAAS,GAAG;AACvC,aAAO,WAAW,MAAM,KAAK,IAAI,MAAM,sCAAsC,EAAE,KAAK,MAAM,IAAI;AAC9F,iBAAW,OAAO,MAAM,MAAM;AAC5B,eAAO,KAAK,KAAK,GAAG,MAAM,KAAK,GAAG,IAAI;AAAA,MACxC;AAAA,IACF;AAEA,WAAO;AAEP,QAAI,MAAM,OAAO;AACf,aAAO;AACP,aAAO,KAAK,MAAM,KAAK;AAAA,IACzB;AAEA,UAAM,OAAO,KAAK,OAAO,QAAQ,GAAG,EAAE,IAAI,GAAG,MAAM;AAEnD,WAAO,KAAK,IAAI,UAAQ;AAAA,MACtB,IAAI,IAAI;AAAA,MACR,SAAS,IAAI;AAAA,MACb,QAAQ,IAAI;AAAA,MACZ,eAAe,KAAK,MAAM,IAAI,aAAa;AAAA,MAC3C,MAAM,IAAI;AAAA,MACV,YAAY,IAAI;AAAA,MAChB,YAAY,IAAI;AAAA,MAChB,MAAM,KAAK,MAAM,IAAI,IAAI;AAAA,IAC3B,EAAE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,OAAU,KAA4B;AACpC,WAAO,KAAK,SAAS,IAAI,GAAG;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAU,KAAa,OAAgB;AACrC,SAAK,SAAS,IAAI,KAAK,KAAK;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAiB;AACf,SAAK,SAAS,MAAM;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,OAA6B;AAC5C,QAAI,CAAC,KAAK,OAAQ,OAAM,KAAK,WAAW;AACxC,QAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,0BAA0B;AAE5D,UAAM,OAAO,KAAK,OAAO,QAAQ;AAAA;AAAA;AAAA;AAAA,KAIhC;AAED,SAAK;AAAA,MACH,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM,QAAQ;AAAA,MACd,MAAM,YAAY;AAAA,MAClB,MAAM,UAAU;AAAA,MAChB,MAAM;AAAA,MACN,MAAM,WAAW,IAAI;AAAA,MACrB,MAAM,cAAc;AAAA,MACpB,MAAM,cAAc;AAAA,MACpB,MAAM,YAAY,IAAI;AAAA,MACtB,MAAM;AAAA,MACN,MAAM,mBAAmB;AAAA,MACzB,KAAK,UAAU,MAAM,iBAAiB,CAAC,CAAC;AAAA,MACxC,KAAK,UAAU,MAAM,YAAY,CAAC,CAAC;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,SAOG;AACnB,QAAI,CAAC,KAAK,OAAQ,OAAM,KAAK,WAAW;AACxC,QAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,0BAA0B;AAE5D,QAAI,MAAM;AACV,UAAM,SAAgB,CAAC;AAEvB,QAAI,SAAS,aAAa,QAAW;AACnC,aAAO;AACP,aAAO,KAAK,QAAQ,WAAW,IAAI,CAAC;AAAA,IACtC;AAEA,QAAI,SAAS,UAAU;AACrB,aAAO;AACP,aAAO,KAAK,QAAQ,QAAQ;AAAA,IAC9B;AAEA,QAAI,SAAS,MAAM;AACjB,aAAO;AACP,aAAO,KAAK,QAAQ,IAAI;AAAA,IAC1B;AAEA,QAAI,SAAS,UAAU;AACrB,aAAO;AACP,aAAO,KAAK,QAAQ,QAAQ;AAAA,IAC9B;AAEA,QAAI,SAAS,QAAQ;AACnB,aAAO;AACP,aAAO,KAAK,QAAQ,MAAM;AAAA,IAC5B;AAEA,WAAO;AAEP,QAAI,SAAS,OAAO;AAClB,aAAO;AACP,aAAO,KAAK,QAAQ,KAAK;AAAA,IAC3B;AAEA,UAAM,OAAO,KAAK,OAAO,QAAQ,GAAG,EAAE,IAAI,GAAG,MAAM;AAEnD,WAAO,KAAK,IAAI,UAAQ;AAAA,MACtB,IAAI,IAAI;AAAA,MACR,SAAS,IAAI;AAAA,MACb,UAAU,IAAI;AAAA,MACd,MAAM,IAAI,QAAQ;AAAA,MAClB,UAAU,IAAI,YAAY;AAAA,MAC1B,QAAQ,IAAI,UAAU;AAAA,MACtB,WAAW,IAAI;AAAA,MACf,UAAU,QAAQ,IAAI,QAAQ;AAAA,MAC9B,YAAY,IAAI,cAAc;AAAA,MAC9B,YAAY,IAAI,cAAc;AAAA,MAC9B,WAAW,QAAQ,IAAI,SAAS;AAAA,MAChC,UAAU,IAAI;AAAA,MACd,iBAAiB,IAAI,mBAAmB;AAAA,MACxC,eAAe,KAAK,MAAM,IAAI,iBAAiB,IAAI;AAAA,MACnD,UAAU,KAAK,MAAM,IAAI,YAAY,IAAI;AAAA,IAC3C,EAAE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,SAAiB,YAAiE;AACnG,QAAI,CAAC,KAAK,OAAQ,OAAM,KAAK,WAAW;AACxC,QAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,0BAA0B;AAE5D,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAEnC,SAAK,OAAO,QAAQ;AAAA;AAAA;AAAA;AAAA,KAInB,EAAE,IAAI,KAAK,YAAY,eAAe,cAAc,IAAI,GAAG,OAAO;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,SAAgC;AACjD,UAAM,KAAK,aAAa,SAAS,WAAW;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,2BAA4C;AAChD,QAAI,CAAC,KAAK,OAAQ,OAAM,KAAK,WAAW;AACxC,QAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,0BAA0B;AAE5D,UAAM,SAAS,KAAK,OAAO,QAAQ,yDAAyD,EAAE,IAAI;AAClG,WAAO,OAAO;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,gBAAwB,IAAmB;AAC7D,QAAI,CAAC,KAAK,OAAQ,OAAM,KAAK,WAAW;AACxC,QAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,0BAA0B;AAE5D,UAAM,aAAa,oBAAI,KAAK;AAC5B,eAAW,QAAQ,WAAW,QAAQ,IAAI,aAAa;AACvD,UAAM,SAAS,WAAW,YAAY;AAGtC,UAAM,UAAU,KAAK,iBAAiB,KAAK,OAAO,GAAG,MAAM;AAC3D,UAAM,cAAc,KAAK,SAAS,WAAW,KAAK,IAAI,CAAC,OAAO;AAE9D,UAAM,YAAY,KAAK,OAAO,QAAQ,iEAAiE,EAAE,IAAI,MAAM;AACnH,UAAM,QAAQ,KAAK,OAAO,QAAQ,6DAA6D,EAAE,IAAI,MAAM;AAC3G,UAAM,WAAW,KAAK,OAAO,QAAQ,uEAAuE,EAAE,IAAI,MAAM;AACxH,UAAM,YAAY,KAAK,OAAO,QAAQ,wEAAwE,EAAE,IAAI,MAAM;AAC1H,UAAM,SAAS,KAAK,OAAO,QAAQ,2DAA2D,EAAE,IAAI,MAAM;AAE1G,UAAM,UAAU,aAAa,KAAK,UAAU,EAAE,WAAW,OAAO,UAAU,WAAW,OAAO,GAAG,MAAM,CAAC,CAAC;AAGvG,SAAK,OAAO,QAAQ,+DAA+D,EAAE,IAAI,MAAM;AAC/F,SAAK,OAAO,QAAQ,2DAA2D,EAAE,IAAI,MAAM;AAC3F,SAAK,OAAO,QAAQ,qEAAqE,EAAE,IAAI,MAAM;AACrG,SAAK,OAAO,QAAQ,sEAAsE,EAAE,IAAI,MAAM;AACtG,SAAK,OAAO,QAAQ,yDAAyD,EAAE,IAAI,MAAM;AAAA,EAC3F;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,QAAI,KAAK,QAAQ;AACf,WAAK,OAAO,MAAM;AAClB,WAAK,SAAS;AAAA,IAChB;AAAA,EACF;AACF;AAKA,IAAM,mBAAmB,oBAAI,IAA2B;AAEjD,SAAS,WAAW,SAAgC;AACzD,MAAI,CAAC,iBAAiB,IAAI,OAAO,GAAG;AAClC,qBAAiB,IAAI,SAAS,IAAI,cAAc,OAAO,CAAC;AAAA,EAC1D;AACA,SAAO,iBAAiB,IAAI,OAAO;AACrC;","names":[]}
package/dist/cli/main.js CHANGED
@@ -34,7 +34,10 @@ import {
34
34
  isTrieInitialized,
35
35
  perceiveCurrentChanges,
36
36
  reasonAboutChangesHumanReadable
37
- } from "../chunk-6LD7OPJL.js";
37
+ } from "../chunk-7TTVDHXO.js";
38
+ import {
39
+ IncidentIndex
40
+ } from "../chunk-WHIQAGB7.js";
38
41
  import "../chunk-ZV2K6M7T.js";
39
42
  import {
40
43
  GotchaPredictor,
@@ -43,7 +46,7 @@ import {
43
46
  listTrackedProjects,
44
47
  searchGlobalPatterns,
45
48
  updateGlobalMemoryMd
46
- } from "../chunk-A4EDTN6R.js";
49
+ } from "../chunk-WIMNGEY2.js";
47
50
  import "../chunk-WMI44VIC.js";
48
51
  import {
49
52
  getDailyLogs,
@@ -59,13 +62,11 @@ import {
59
62
  import "../chunk-WS6OA7H6.js";
60
63
  import "../chunk-F4NJ4CBP.js";
61
64
  import "../chunk-IXO4G4D3.js";
65
+ import "../chunk-6NLHFIYA.js";
66
+ import "../chunk-Z4DN527J.js";
62
67
  import {
63
68
  ContextGraph
64
69
  } from "../chunk-55CBWOEZ.js";
65
- import {
66
- IncidentIndex
67
- } from "../chunk-WHIQAGB7.js";
68
- import "../chunk-6NLHFIYA.js";
69
70
  import "../chunk-7Q6I2CB4.js";
70
71
  import "../chunk-43X6JBEM.js";
71
72
  import {