@triedotdev/mcp 1.0.169 → 1.0.171

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 (145) hide show
  1. package/README.md +62 -540
  2. package/dist/chunk-2YXOBNKW.js +619 -0
  3. package/dist/chunk-2YXOBNKW.js.map +1 -0
  4. package/dist/chunk-QR64Y5TI.js +363 -0
  5. package/dist/chunk-QR64Y5TI.js.map +1 -0
  6. package/dist/cli/main.d.ts +0 -15
  7. package/dist/cli/main.js +356 -3098
  8. package/dist/cli/main.js.map +1 -1
  9. package/dist/index.js +2 -34
  10. package/dist/index.js.map +1 -1
  11. package/dist/server/mcp-server.js +2 -34
  12. package/package.json +8 -31
  13. package/dist/autonomy-config-FSERX3O3.js +0 -30
  14. package/dist/autonomy-config-FSERX3O3.js.map +0 -1
  15. package/dist/chat-store-JNGNTDSN.js +0 -15
  16. package/dist/chat-store-JNGNTDSN.js.map +0 -1
  17. package/dist/chunk-2HF65EHQ.js +0 -311
  18. package/dist/chunk-2HF65EHQ.js.map +0 -1
  19. package/dist/chunk-3XR6WVAW.js +0 -4011
  20. package/dist/chunk-3XR6WVAW.js.map +0 -1
  21. package/dist/chunk-43X6JBEM.js +0 -36
  22. package/dist/chunk-43X6JBEM.js.map +0 -1
  23. package/dist/chunk-6NLHFIYA.js +0 -344
  24. package/dist/chunk-6NLHFIYA.js.map +0 -1
  25. package/dist/chunk-7IO4YUI3.js +0 -1827
  26. package/dist/chunk-7IO4YUI3.js.map +0 -1
  27. package/dist/chunk-AHD2CBQ7.js +0 -846
  28. package/dist/chunk-AHD2CBQ7.js.map +0 -1
  29. package/dist/chunk-BUTOP5EB.js +0 -931
  30. package/dist/chunk-BUTOP5EB.js.map +0 -1
  31. package/dist/chunk-DGUM43GV.js +0 -11
  32. package/dist/chunk-DGUM43GV.js.map +0 -1
  33. package/dist/chunk-EFWVF6TI.js +0 -267
  34. package/dist/chunk-EFWVF6TI.js.map +0 -1
  35. package/dist/chunk-F6WFNUAY.js +0 -216
  36. package/dist/chunk-F6WFNUAY.js.map +0 -1
  37. package/dist/chunk-FBNURWRY.js +0 -662
  38. package/dist/chunk-FBNURWRY.js.map +0 -1
  39. package/dist/chunk-FQ45QP5A.js +0 -361
  40. package/dist/chunk-FQ45QP5A.js.map +0 -1
  41. package/dist/chunk-FVRO5RN3.js +0 -1306
  42. package/dist/chunk-FVRO5RN3.js.map +0 -1
  43. package/dist/chunk-G2TGF6TR.js +0 -573
  44. package/dist/chunk-G2TGF6TR.js.map +0 -1
  45. package/dist/chunk-G3I7SZLW.js +0 -354
  46. package/dist/chunk-G3I7SZLW.js.map +0 -1
  47. package/dist/chunk-GTKYBOXL.js +0 -700
  48. package/dist/chunk-GTKYBOXL.js.map +0 -1
  49. package/dist/chunk-HVCDY3AK.js +0 -850
  50. package/dist/chunk-HVCDY3AK.js.map +0 -1
  51. package/dist/chunk-I2O5OYQT.js +0 -727
  52. package/dist/chunk-I2O5OYQT.js.map +0 -1
  53. package/dist/chunk-JVMBCWKS.js +0 -348
  54. package/dist/chunk-JVMBCWKS.js.map +0 -1
  55. package/dist/chunk-KCUOWRPX.js +0 -816
  56. package/dist/chunk-KCUOWRPX.js.map +0 -1
  57. package/dist/chunk-KDHN2ZQE.js +0 -313
  58. package/dist/chunk-KDHN2ZQE.js.map +0 -1
  59. package/dist/chunk-ME2OERF5.js +0 -345
  60. package/dist/chunk-ME2OERF5.js.map +0 -1
  61. package/dist/chunk-OBQ74FOU.js +0 -27
  62. package/dist/chunk-OBQ74FOU.js.map +0 -1
  63. package/dist/chunk-Q5EKA5YA.js +0 -254
  64. package/dist/chunk-Q5EKA5YA.js.map +0 -1
  65. package/dist/chunk-Q63FFI6D.js +0 -132
  66. package/dist/chunk-Q63FFI6D.js.map +0 -1
  67. package/dist/chunk-SASNMSB5.js +0 -12597
  68. package/dist/chunk-SASNMSB5.js.map +0 -1
  69. package/dist/chunk-T63OHG4Q.js +0 -440
  70. package/dist/chunk-T63OHG4Q.js.map +0 -1
  71. package/dist/chunk-TN5WEKWI.js +0 -173
  72. package/dist/chunk-TN5WEKWI.js.map +0 -1
  73. package/dist/chunk-VUL52BQL.js +0 -402
  74. package/dist/chunk-VUL52BQL.js.map +0 -1
  75. package/dist/chunk-VVITXIHN.js +0 -189
  76. package/dist/chunk-VVITXIHN.js.map +0 -1
  77. package/dist/chunk-WCN7S3EI.js +0 -14
  78. package/dist/chunk-WCN7S3EI.js.map +0 -1
  79. package/dist/chunk-XPZZFPBZ.js +0 -491
  80. package/dist/chunk-XPZZFPBZ.js.map +0 -1
  81. package/dist/chunk-ZJF5FTBX.js +0 -1396
  82. package/dist/chunk-ZJF5FTBX.js.map +0 -1
  83. package/dist/chunk-ZV2K6M7T.js +0 -74
  84. package/dist/chunk-ZV2K6M7T.js.map +0 -1
  85. package/dist/cli/create-agent.d.ts +0 -1
  86. package/dist/cli/create-agent.js +0 -1050
  87. package/dist/cli/create-agent.js.map +0 -1
  88. package/dist/cli/yolo-daemon.d.ts +0 -1
  89. package/dist/cli/yolo-daemon.js +0 -421
  90. package/dist/cli/yolo-daemon.js.map +0 -1
  91. package/dist/client-NJPZE5JT.js +0 -28
  92. package/dist/client-NJPZE5JT.js.map +0 -1
  93. package/dist/codebase-index-VAPF32XX.js +0 -12
  94. package/dist/codebase-index-VAPF32XX.js.map +0 -1
  95. package/dist/fast-analyzer-3GCCZMLK.js +0 -216
  96. package/dist/fast-analyzer-3GCCZMLK.js.map +0 -1
  97. package/dist/git-EO5SRFMN.js +0 -28
  98. package/dist/git-EO5SRFMN.js.map +0 -1
  99. package/dist/github-ingester-ZOKK6GRS.js +0 -11
  100. package/dist/github-ingester-ZOKK6GRS.js.map +0 -1
  101. package/dist/goal-manager-QUKX2W6C.js +0 -25
  102. package/dist/goal-manager-QUKX2W6C.js.map +0 -1
  103. package/dist/goal-validator-2SFSKKVU.js +0 -24
  104. package/dist/goal-validator-2SFSKKVU.js.map +0 -1
  105. package/dist/graph-B3NA4S7I.js +0 -10
  106. package/dist/graph-B3NA4S7I.js.map +0 -1
  107. package/dist/hypothesis-KCPBR652.js +0 -23
  108. package/dist/hypothesis-KCPBR652.js.map +0 -1
  109. package/dist/incident-index-EFNUSGWL.js +0 -11
  110. package/dist/incident-index-EFNUSGWL.js.map +0 -1
  111. package/dist/insight-store-EC4PLSAW.js +0 -22
  112. package/dist/insight-store-EC4PLSAW.js.map +0 -1
  113. package/dist/issue-store-YAXTNRRY.js +0 -36
  114. package/dist/issue-store-YAXTNRRY.js.map +0 -1
  115. package/dist/ledger-TWZTGDFA.js +0 -58
  116. package/dist/ledger-TWZTGDFA.js.map +0 -1
  117. package/dist/linear-ingester-XXPAZZRW.js +0 -11
  118. package/dist/linear-ingester-XXPAZZRW.js.map +0 -1
  119. package/dist/output-manager-RVJ37XKA.js +0 -13
  120. package/dist/output-manager-RVJ37XKA.js.map +0 -1
  121. package/dist/parse-goal-violation-SACGFG3C.js +0 -8
  122. package/dist/parse-goal-violation-SACGFG3C.js.map +0 -1
  123. package/dist/pattern-discovery-F7LU5K6E.js +0 -8
  124. package/dist/pattern-discovery-F7LU5K6E.js.map +0 -1
  125. package/dist/progress-SRQ2V3BP.js +0 -18
  126. package/dist/progress-SRQ2V3BP.js.map +0 -1
  127. package/dist/project-state-AHPA77SM.js +0 -28
  128. package/dist/project-state-AHPA77SM.js.map +0 -1
  129. package/dist/sync-M2FSWPBC.js +0 -12
  130. package/dist/sync-M2FSWPBC.js.map +0 -1
  131. package/dist/terminal-spawn-5YXDMUCF.js +0 -157
  132. package/dist/terminal-spawn-5YXDMUCF.js.map +0 -1
  133. package/dist/tiered-storage-DYNC5CQ6.js +0 -13
  134. package/dist/tiered-storage-DYNC5CQ6.js.map +0 -1
  135. package/dist/trie-agent-I3HAHY2G.js +0 -26
  136. package/dist/trie-agent-I3HAHY2G.js.map +0 -1
  137. package/dist/ui/chat.html +0 -1014
  138. package/dist/ui/goals.html +0 -967
  139. package/dist/ui/hypotheses.html +0 -1011
  140. package/dist/ui/ledger.html +0 -954
  141. package/dist/ui/nudges.html +0 -995
  142. package/dist/vibe-code-signatures-5ZULYP3D.js +0 -987
  143. package/dist/vibe-code-signatures-5ZULYP3D.js.map +0 -1
  144. package/dist/vulnerability-signatures-2URZSXAQ.js +0 -983
  145. package/dist/vulnerability-signatures-2URZSXAQ.js.map +0 -1
@@ -1,931 +0,0 @@
1
- import {
2
- Trie
3
- } from "./chunk-6NLHFIYA.js";
4
- import {
5
- getTrieDirectory
6
- } from "./chunk-VVITXIHN.js";
7
-
8
- // src/storage/tiered-storage.ts
9
- import { writeFile, mkdir } from "fs/promises";
10
- import { join } from "path";
11
- import { createHash } from "crypto";
12
- import Database from "better-sqlite3";
13
-
14
- // src/trie/ledger-trie.ts
15
- var LedgerTrie = class {
16
- tagTrie;
17
- fileTrie;
18
- agentTrie;
19
- constructor() {
20
- this.tagTrie = new Trie();
21
- this.fileTrie = new Trie();
22
- this.agentTrie = new Trie();
23
- }
24
- /**
25
- * Index a tag from governance/blocker/fact
26
- */
27
- indexTag(tag) {
28
- const normalized = tag.toLowerCase().trim();
29
- if (!normalized) return;
30
- const existing = this.tagTrie.search(normalized);
31
- if (existing.found && existing.value) {
32
- existing.value.occurrences++;
33
- existing.value.lastSeen = (/* @__PURE__ */ new Date()).toISOString();
34
- this.tagTrie.insert(normalized, existing.value);
35
- } else {
36
- this.tagTrie.insert(normalized, {
37
- type: "tag",
38
- value: normalized,
39
- occurrences: 1,
40
- lastSeen: (/* @__PURE__ */ new Date()).toISOString()
41
- });
42
- }
43
- }
44
- /**
45
- * Index a file path from governance
46
- */
47
- indexFile(filePath) {
48
- const normalized = filePath.trim();
49
- if (!normalized) return;
50
- const existing = this.fileTrie.search(normalized);
51
- if (existing.found && existing.value) {
52
- existing.value.occurrences++;
53
- existing.value.lastSeen = (/* @__PURE__ */ new Date()).toISOString();
54
- this.fileTrie.insert(normalized, existing.value);
55
- } else {
56
- this.fileTrie.insert(normalized, {
57
- type: "file",
58
- value: normalized,
59
- occurrences: 1,
60
- lastSeen: (/* @__PURE__ */ new Date()).toISOString()
61
- });
62
- }
63
- }
64
- /**
65
- * Index an agent name from ledger entries
66
- */
67
- indexAgent(agentName) {
68
- const normalized = agentName.toLowerCase().trim();
69
- if (!normalized) return;
70
- const existing = this.agentTrie.search(normalized);
71
- if (existing.found && existing.value) {
72
- existing.value.occurrences++;
73
- existing.value.lastSeen = (/* @__PURE__ */ new Date()).toISOString();
74
- this.agentTrie.insert(normalized, existing.value);
75
- } else {
76
- this.agentTrie.insert(normalized, {
77
- type: "agent",
78
- value: normalized,
79
- occurrences: 1,
80
- lastSeen: (/* @__PURE__ */ new Date()).toISOString()
81
- });
82
- }
83
- }
84
- /**
85
- * Get all tags starting with prefix
86
- */
87
- searchTags(prefix) {
88
- const normalized = prefix.toLowerCase().trim();
89
- const results = this.tagTrie.getWithPrefix(normalized);
90
- return results.map((r) => r.value).filter(Boolean).sort((a, b) => b.occurrences - a.occurrences);
91
- }
92
- /**
93
- * Get all files starting with path prefix
94
- */
95
- searchFiles(pathPrefix) {
96
- const normalized = pathPrefix.trim();
97
- const results = this.fileTrie.getWithPrefix(normalized);
98
- return results.map((r) => r.value).filter(Boolean).sort((a, b) => b.occurrences - a.occurrences);
99
- }
100
- /**
101
- * Get all agents starting with prefix
102
- */
103
- searchAgents(prefix) {
104
- const normalized = prefix.toLowerCase().trim();
105
- const results = this.agentTrie.getWithPrefix(normalized);
106
- return results.map((r) => r.value).filter(Boolean).sort((a, b) => b.occurrences - a.occurrences);
107
- }
108
- /**
109
- * Get autocomplete suggestions for tags
110
- */
111
- autocomplete(type, prefix, limit = 10) {
112
- let results;
113
- switch (type) {
114
- case "tag":
115
- results = this.searchTags(prefix);
116
- break;
117
- case "file":
118
- results = this.searchFiles(prefix);
119
- break;
120
- case "agent":
121
- results = this.searchAgents(prefix);
122
- break;
123
- }
124
- return results.slice(0, limit).map((r) => r.value);
125
- }
126
- /**
127
- * Check if a tag exists
128
- */
129
- hasTag(tag) {
130
- return this.tagTrie.search(tag.toLowerCase().trim()).found;
131
- }
132
- /**
133
- * Check if a file path exists
134
- */
135
- hasFile(filePath) {
136
- return this.fileTrie.search(filePath.trim()).found;
137
- }
138
- /**
139
- * Get stats
140
- */
141
- getStats() {
142
- return {
143
- tags: this.tagTrie.getSize(),
144
- files: this.fileTrie.getSize(),
145
- agents: this.agentTrie.getSize()
146
- };
147
- }
148
- /**
149
- * Clear all indices
150
- */
151
- clear() {
152
- this.tagTrie.clear();
153
- this.fileTrie.clear();
154
- this.agentTrie.clear();
155
- }
156
- };
157
- var ledgerTrieInstance = null;
158
- function getLedgerTrie() {
159
- if (!ledgerTrieInstance) {
160
- ledgerTrieInstance = new LedgerTrie();
161
- }
162
- return ledgerTrieInstance;
163
- }
164
-
165
- // src/storage/tiered-storage.ts
166
- var TieredStorage = class {
167
- workDir;
168
- hotCache = /* @__PURE__ */ new Map();
169
- warmDb = null;
170
- constructor(workDir) {
171
- this.workDir = workDir;
172
- }
173
- /**
174
- * Initialize storage directories and database
175
- */
176
- async initialize() {
177
- const trieDir = getTrieDirectory(this.workDir);
178
- await mkdir(join(trieDir, "hot"), { recursive: true });
179
- await mkdir(join(trieDir, "warm"), { recursive: true });
180
- await mkdir(join(trieDir, "cold"), { recursive: true });
181
- const dbPath = join(trieDir, "warm", "governance.db");
182
- this.warmDb = new Database(dbPath);
183
- this.warmDb.exec(`
184
- CREATE TABLE IF NOT EXISTS governance (
185
- id TEXT PRIMARY KEY,
186
- decision TEXT NOT NULL,
187
- context TEXT NOT NULL,
188
- reasoning TEXT,
189
- timestamp TEXT NOT NULL,
190
- who TEXT,
191
- files TEXT NOT NULL, -- JSON array
192
- tags TEXT NOT NULL, -- JSON array
193
- expandedTags TEXT, -- JSON array (with synonyms)
194
- relatedTo TEXT, -- JSON array
195
- tradeoffs TEXT, -- JSON array
196
- status TEXT NOT NULL,
197
- supersededBy TEXT,
198
- hash TEXT, -- SHA-256 fingerprint (first 16 hex chars)
199
- dependencies TEXT, -- JSON array (npm packages, services)
200
- codebaseArea TEXT, -- JSON array (frontend, backend, auth, etc.)
201
- domain TEXT, -- JSON array (payments, compliance, etc.)
202
- lastAccessed TEXT NOT NULL,
203
- accessCount INTEGER DEFAULT 0
204
- );
205
-
206
- CREATE TABLE IF NOT EXISTS facts (
207
- id TEXT PRIMARY KEY,
208
- fact TEXT NOT NULL,
209
- source TEXT NOT NULL,
210
- timestamp TEXT NOT NULL,
211
- tags TEXT NOT NULL, -- JSON array
212
- expandedTags TEXT, -- JSON array (with synonyms)
213
- relatedGovernance TEXT, -- JSON array
214
- confidence REAL NOT NULL,
215
- lastAccessed TEXT NOT NULL,
216
- accessCount INTEGER DEFAULT 0
217
- );
218
-
219
- CREATE TABLE IF NOT EXISTS blockers (
220
- id TEXT PRIMARY KEY,
221
- blocker TEXT NOT NULL,
222
- impact TEXT NOT NULL,
223
- affectedAreas TEXT NOT NULL, -- JSON array
224
- timestamp TEXT NOT NULL,
225
- resolvedAt TEXT,
226
- resolution TEXT,
227
- tags TEXT NOT NULL, -- JSON array
228
- expandedTags TEXT, -- JSON array (with synonyms)
229
- lastAccessed TEXT NOT NULL,
230
- accessCount INTEGER DEFAULT 0
231
- );
232
-
233
- CREATE TABLE IF NOT EXISTS questions (
234
- id TEXT PRIMARY KEY,
235
- question TEXT NOT NULL,
236
- context TEXT NOT NULL,
237
- timestamp TEXT NOT NULL,
238
- answeredAt TEXT,
239
- answer TEXT,
240
- relatedGovernance TEXT, -- JSON array
241
- tags TEXT NOT NULL, -- JSON array
242
- expandedTags TEXT, -- JSON array (with synonyms)
243
- lastAccessed TEXT NOT NULL,
244
- accessCount INTEGER DEFAULT 0
245
- );
246
-
247
- CREATE TABLE IF NOT EXISTS nudges (
248
- id TEXT PRIMARY KEY,
249
- message TEXT NOT NULL,
250
- severity TEXT NOT NULL, -- 'critical', 'high', 'warning', 'info'
251
- file TEXT,
252
- category TEXT, -- 'quality', 'security', 'performance', etc.
253
- goalId TEXT, -- Related goal ID if this is a goal violation
254
- timestamp TEXT NOT NULL,
255
- resolved BOOLEAN NOT NULL DEFAULT 0,
256
- resolvedAt TEXT,
257
- resolution TEXT, -- How it was resolved: 'dismissed', 'fixed', 'auto-fixed'
258
- dismissed BOOLEAN NOT NULL DEFAULT 0,
259
- priority INTEGER DEFAULT 5, -- 1-10 priority score
260
- suggestedAction TEXT,
261
- relatedIssues TEXT, -- JSON array
262
- metadata TEXT -- JSON object for additional data
263
- );
264
-
265
- CREATE TABLE IF NOT EXISTS gotchas (
266
- id TEXT PRIMARY KEY,
267
- message TEXT NOT NULL,
268
- confidence REAL NOT NULL, -- 0-1 confidence score
269
- riskLevel TEXT NOT NULL, -- 'low', 'medium', 'high', 'critical'
270
- recommendation TEXT NOT NULL,
271
- file TEXT,
272
- timestamp TEXT NOT NULL,
273
- precedentId TEXT, -- ID of related historical incident/governance record
274
- tags TEXT NOT NULL, -- JSON array
275
- evidence TEXT NOT NULL, -- JSON object with pastIncidents, matchingPatterns, relatedTickets
276
- resolved BOOLEAN NOT NULL DEFAULT 0,
277
- resolvedAt TEXT,
278
- resolution TEXT -- 'confirmed', 'false-positive', 'dismissed'
279
- );
280
-
281
- CREATE INDEX IF NOT EXISTS idx_governance_tags ON governance(tags);
282
- CREATE INDEX IF NOT EXISTS idx_governance_expanded ON governance(expandedTags);
283
- CREATE INDEX IF NOT EXISTS idx_governance_timestamp ON governance(timestamp);
284
- CREATE INDEX IF NOT EXISTS idx_governance_status ON governance(status);
285
- CREATE INDEX IF NOT EXISTS idx_governance_area ON governance(codebaseArea);
286
- CREATE INDEX IF NOT EXISTS idx_governance_domain ON governance(domain);
287
- CREATE INDEX IF NOT EXISTS idx_facts_tags ON facts(tags);
288
- CREATE INDEX IF NOT EXISTS idx_facts_expanded ON facts(expandedTags);
289
- CREATE INDEX IF NOT EXISTS idx_blockers_impact ON blockers(impact);
290
- CREATE INDEX IF NOT EXISTS idx_blockers_resolved ON blockers(resolvedAt);
291
- CREATE INDEX IF NOT EXISTS idx_nudges_timestamp ON nudges(timestamp);
292
- CREATE INDEX IF NOT EXISTS idx_nudges_resolved ON nudges(resolved);
293
- CREATE INDEX IF NOT EXISTS idx_nudges_severity ON nudges(severity);
294
- CREATE INDEX IF NOT EXISTS idx_nudges_file ON nudges(file);
295
- CREATE INDEX IF NOT EXISTS idx_gotchas_timestamp ON gotchas(timestamp);
296
- CREATE INDEX IF NOT EXISTS idx_gotchas_resolved ON gotchas(resolved);
297
- CREATE INDEX IF NOT EXISTS idx_gotchas_riskLevel ON gotchas(riskLevel);
298
- CREATE INDEX IF NOT EXISTS idx_gotchas_file ON gotchas(file);
299
- CREATE INDEX IF NOT EXISTS idx_gotchas_tags ON gotchas(tags);
300
- `);
301
- }
302
- /**
303
- * Store extracted signal with enriched metadata in warm storage
304
- */
305
- async storeSignal(signal, metadata) {
306
- if (!this.warmDb) await this.initialize();
307
- if (!this.warmDb) throw new Error("Database not initialized");
308
- const now = (/* @__PURE__ */ new Date()).toISOString();
309
- const totalSignals = signal.governance.length + signal.facts.length + signal.blockers.length + signal.questions.length;
310
- if (totalSignals > 0) {
311
- console.debug(`[Storage] Storing ${totalSignals} signals: ${signal.governance.length}g, ${signal.facts.length}f, ${signal.blockers.length}b, ${signal.questions.length}q`);
312
- }
313
- const governanceStmt = this.warmDb.prepare(`
314
- INSERT OR REPLACE INTO governance
315
- (id, decision, context, reasoning, timestamp, who, files, tags, expandedTags, relatedTo, tradeoffs, status, supersededBy, hash, dependencies, codebaseArea, domain, lastAccessed, accessCount)
316
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0)
317
- `);
318
- const governanceRecords = signal.governance;
319
- const ledgerTrie = getLedgerTrie();
320
- for (const gov of governanceRecords) {
321
- const hash = gov.hash || createHash("sha256").update(`${gov.decision}|${gov.context}|${gov.when}`).digest("hex").slice(0, 16);
322
- governanceStmt.run(
323
- gov.id,
324
- gov.decision,
325
- gov.context,
326
- gov.reasoning || null,
327
- gov.when,
328
- gov.who || null,
329
- JSON.stringify(gov.files),
330
- JSON.stringify(gov.tags),
331
- JSON.stringify(metadata?.expandedTags || []),
332
- JSON.stringify(gov.relatedTo || []),
333
- JSON.stringify(gov.tradeoffs || []),
334
- gov.status,
335
- gov.supersededBy || null,
336
- hash,
337
- JSON.stringify(metadata?.dependencies || []),
338
- JSON.stringify(metadata?.codebaseArea || []),
339
- JSON.stringify(metadata?.domain || []),
340
- now
341
- );
342
- for (const tag of gov.tags) {
343
- ledgerTrie.indexTag(tag);
344
- }
345
- for (const file of gov.files) {
346
- ledgerTrie.indexFile(file);
347
- }
348
- }
349
- const factStmt = this.warmDb.prepare(`
350
- INSERT OR REPLACE INTO facts
351
- (id, fact, source, timestamp, tags, expandedTags, relatedGovernance, confidence, lastAccessed, accessCount)
352
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 0)
353
- `);
354
- for (const fact of signal.facts) {
355
- factStmt.run(
356
- fact.id,
357
- fact.fact,
358
- fact.source,
359
- fact.when,
360
- JSON.stringify(fact.tags),
361
- JSON.stringify(metadata?.expandedTags || []),
362
- JSON.stringify(fact.relatedGovernance || []),
363
- fact.confidence,
364
- now
365
- );
366
- }
367
- const blockerStmt = this.warmDb.prepare(`
368
- INSERT OR REPLACE INTO blockers
369
- (id, blocker, impact, affectedAreas, timestamp, resolvedAt, resolution, tags, expandedTags, lastAccessed, accessCount)
370
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0)
371
- `);
372
- for (const blocker of signal.blockers) {
373
- blockerStmt.run(
374
- blocker.id,
375
- blocker.blocker,
376
- blocker.impact,
377
- JSON.stringify(blocker.affectedAreas),
378
- blocker.when,
379
- blocker.resolvedAt || null,
380
- blocker.resolution || null,
381
- JSON.stringify(blocker.tags),
382
- JSON.stringify(metadata?.expandedTags || []),
383
- now
384
- );
385
- for (const tag of blocker.tags) {
386
- ledgerTrie.indexTag(tag);
387
- }
388
- }
389
- const questionStmt = this.warmDb.prepare(`
390
- INSERT OR REPLACE INTO questions
391
- (id, question, context, timestamp, answeredAt, answer, relatedGovernance, tags, expandedTags, lastAccessed, accessCount)
392
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0)
393
- `);
394
- for (const q of signal.questions) {
395
- questionStmt.run(
396
- q.id,
397
- q.question,
398
- q.context,
399
- q.when,
400
- q.answeredAt || null,
401
- q.answer || null,
402
- JSON.stringify(q.relatedGovernance || []),
403
- JSON.stringify(q.tags),
404
- JSON.stringify(metadata?.expandedTags || []),
405
- now
406
- );
407
- }
408
- if (signal.gotchas && signal.gotchas.length > 0) {
409
- const gotchaStmt = this.warmDb.prepare(`
410
- INSERT OR REPLACE INTO gotchas
411
- (id, message, confidence, riskLevel, recommendation, file, timestamp, precedentId, tags, evidence, resolved, resolvedAt, resolution)
412
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
413
- `);
414
- for (const g of signal.gotchas) {
415
- gotchaStmt.run(
416
- g.id,
417
- g.message,
418
- g.confidence,
419
- g.riskLevel,
420
- g.recommendation,
421
- g.file || null,
422
- g.timestamp,
423
- g.precedentId || null,
424
- JSON.stringify(g.tags || []),
425
- JSON.stringify(g.evidence || { pastIncidents: [], matchingPatterns: [], relatedTickets: [] }),
426
- g.resolved ? 1 : 0,
427
- g.resolvedAt || null,
428
- g.resolution || null
429
- );
430
- }
431
- }
432
- const storedCount = signal.governance.length + signal.facts.length + signal.blockers.length + signal.questions.length + (signal.gotchas?.length || 0);
433
- if (storedCount > 0) {
434
- console.debug(`[Storage] \u2713 Successfully stored ${storedCount} signals to governance.db`);
435
- }
436
- }
437
- /**
438
- * Query governance records from warm storage with expanded tag matching
439
- */
440
- async queryGovernance(query) {
441
- if (!this.warmDb) await this.initialize();
442
- if (!this.warmDb) throw new Error("Database not initialized");
443
- let sql = "SELECT * FROM governance WHERE status = ?";
444
- const params = ["active"];
445
- if (query.tags && query.tags.length > 0) {
446
- sql += " AND (" + query.tags.map(() => "(tags LIKE ? OR expandedTags LIKE ?)").join(" OR ") + ")";
447
- for (const tag of query.tags) {
448
- params.push(`%"${tag}"%`, `%"${tag}"%`);
449
- }
450
- }
451
- if (query.filters?.codebaseArea) {
452
- sql += " AND codebaseArea LIKE ?";
453
- params.push(`%"${query.filters.codebaseArea}"%`);
454
- }
455
- if (query.filters?.domain) {
456
- sql += " AND domain LIKE ?";
457
- params.push(`%"${query.filters.domain}"%`);
458
- }
459
- if (query.timeWindow) {
460
- if (query.timeWindow.start) {
461
- sql += " AND timestamp >= ?";
462
- params.push(query.timeWindow.start);
463
- }
464
- if (query.timeWindow.end) {
465
- sql += " AND timestamp <= ?";
466
- params.push(query.timeWindow.end);
467
- }
468
- }
469
- sql += " ORDER BY timestamp DESC";
470
- if (query.limit) {
471
- sql += " LIMIT ?";
472
- params.push(query.limit);
473
- }
474
- const rows = this.warmDb.prepare(sql).all(...params);
475
- return rows.map((row) => ({
476
- id: row.id,
477
- decision: row.decision,
478
- context: row.context,
479
- reasoning: row.reasoning,
480
- when: row.timestamp || row.when,
481
- who: row.who,
482
- files: JSON.parse(row.files),
483
- tags: JSON.parse(row.tags),
484
- relatedTo: JSON.parse(row.relatedTo || "[]"),
485
- tradeoffs: JSON.parse(row.tradeoffs || "[]"),
486
- status: row.status,
487
- supersededBy: row.supersededBy,
488
- hash: row.hash || void 0
489
- }));
490
- }
491
- /**
492
- * Query facts from warm storage (for Learned Signals display)
493
- */
494
- async queryFacts(query = {}) {
495
- if (!this.warmDb) await this.initialize();
496
- if (!this.warmDb) throw new Error("Database not initialized");
497
- const limit = query.limit ?? 20;
498
- const rows = this.warmDb.prepare("SELECT * FROM facts ORDER BY timestamp DESC LIMIT ?").all(limit);
499
- return rows.map((row) => ({
500
- id: row.id,
501
- fact: row.fact,
502
- source: row.source,
503
- when: row.timestamp || row.when,
504
- tags: JSON.parse(row.tags || "[]"),
505
- confidence: row.confidence ?? 0.8
506
- }));
507
- }
508
- /**
509
- * Query blockers from warm storage with expanded tag matching
510
- */
511
- async queryBlockers(query) {
512
- if (!this.warmDb) await this.initialize();
513
- if (!this.warmDb) throw new Error("Database not initialized");
514
- let sql = "SELECT * FROM blockers WHERE resolvedAt IS NULL";
515
- const params = [];
516
- if (query.tags && query.tags.length > 0) {
517
- sql += " AND (" + query.tags.map(() => "(tags LIKE ? OR expandedTags LIKE ?)").join(" OR ") + ")";
518
- for (const tag of query.tags) {
519
- params.push(`%"${tag}"%`, `%"${tag}"%`);
520
- }
521
- }
522
- sql += " ORDER BY CASE impact WHEN 'critical' THEN 1 WHEN 'high' THEN 2 WHEN 'medium' THEN 3 ELSE 4 END, timestamp DESC";
523
- if (query.limit) {
524
- sql += " LIMIT ?";
525
- params.push(query.limit);
526
- }
527
- const rows = this.warmDb.prepare(sql).all(...params);
528
- return rows.map((row) => ({
529
- id: row.id,
530
- blocker: row.blocker,
531
- impact: row.impact,
532
- affectedAreas: JSON.parse(row.affectedAreas),
533
- when: row.when,
534
- resolvedAt: row.resolvedAt,
535
- resolution: row.resolution,
536
- tags: JSON.parse(row.tags)
537
- }));
538
- }
539
- /**
540
- * Get hot cache item
541
- */
542
- getHot(key) {
543
- return this.hotCache.get(key);
544
- }
545
- /**
546
- * Set hot cache item
547
- */
548
- setHot(key, value) {
549
- this.hotCache.set(key, value);
550
- }
551
- /**
552
- * Clear hot cache
553
- */
554
- clearHot() {
555
- this.hotCache.clear();
556
- }
557
- /**
558
- * Store a nudge in warm storage
559
- */
560
- async storeNudge(nudge) {
561
- if (!this.warmDb) await this.initialize();
562
- if (!this.warmDb) throw new Error("Database not initialized");
563
- const stmt = this.warmDb.prepare(`
564
- INSERT OR REPLACE INTO nudges
565
- (id, message, severity, file, category, goalId, timestamp, resolved, resolvedAt, resolution, dismissed, priority, suggestedAction, relatedIssues, metadata)
566
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
567
- `);
568
- stmt.run(
569
- nudge.id,
570
- nudge.message,
571
- nudge.severity,
572
- nudge.file || null,
573
- nudge.category || null,
574
- nudge.goalId || null,
575
- nudge.timestamp,
576
- nudge.resolved ? 1 : 0,
577
- nudge.resolvedAt || null,
578
- nudge.resolution || null,
579
- nudge.dismissed ? 1 : 0,
580
- nudge.priority,
581
- nudge.suggestedAction || null,
582
- JSON.stringify(nudge.relatedIssues || []),
583
- JSON.stringify(nudge.metadata || {})
584
- );
585
- }
586
- /**
587
- * Query nudges from warm storage
588
- */
589
- async queryNudges(filters) {
590
- if (!this.warmDb) await this.initialize();
591
- if (!this.warmDb) throw new Error("Database not initialized");
592
- let sql = "SELECT * FROM nudges WHERE 1=1";
593
- const params = [];
594
- if (filters?.resolved !== void 0) {
595
- sql += " AND resolved = ?";
596
- params.push(filters.resolved ? 1 : 0);
597
- }
598
- if (filters?.severity) {
599
- sql += " AND severity = ?";
600
- params.push(filters.severity);
601
- }
602
- if (filters?.file) {
603
- sql += " AND file = ?";
604
- params.push(filters.file);
605
- }
606
- if (filters?.category) {
607
- sql += " AND category = ?";
608
- params.push(filters.category);
609
- }
610
- if (filters?.goalId) {
611
- sql += " AND goalId = ?";
612
- params.push(filters.goalId);
613
- }
614
- sql += " ORDER BY timestamp DESC";
615
- if (filters?.limit) {
616
- sql += " LIMIT ?";
617
- params.push(filters.limit);
618
- }
619
- const rows = this.warmDb.prepare(sql).all(...params);
620
- return rows.map((row) => ({
621
- id: row.id,
622
- message: row.message,
623
- severity: row.severity,
624
- file: row.file || void 0,
625
- category: row.category || void 0,
626
- goalId: row.goalId || void 0,
627
- timestamp: row.timestamp,
628
- resolved: Boolean(row.resolved),
629
- resolvedAt: row.resolvedAt || void 0,
630
- resolution: row.resolution || void 0,
631
- dismissed: Boolean(row.dismissed),
632
- priority: row.priority,
633
- suggestedAction: row.suggestedAction || void 0,
634
- relatedIssues: JSON.parse(row.relatedIssues || "[]"),
635
- metadata: JSON.parse(row.metadata || "{}")
636
- }));
637
- }
638
- /**
639
- * Mark a nudge as resolved
640
- */
641
- async resolveNudge(nudgeId, resolution) {
642
- if (!this.warmDb) await this.initialize();
643
- if (!this.warmDb) throw new Error("Database not initialized");
644
- const now = (/* @__PURE__ */ new Date()).toISOString();
645
- this.warmDb.prepare(`
646
- UPDATE nudges
647
- SET resolved = 1, resolvedAt = ?, resolution = ?, dismissed = ?
648
- WHERE id = ?
649
- `).run(now, resolution, resolution === "dismissed" ? 1 : 0, nudgeId);
650
- }
651
- /**
652
- * Mark a nudge as dismissed
653
- */
654
- async dismissNudge(nudgeId) {
655
- await this.resolveNudge(nudgeId, "dismissed");
656
- }
657
- /**
658
- * Mark a nudge as fixed (automatically called when issues are resolved)
659
- */
660
- async markNudgeFixed(nudgeId) {
661
- await this.resolveNudge(nudgeId, "fixed");
662
- }
663
- /**
664
- * Clear all nudges (mark all as resolved)
665
- */
666
- async clearAllNudges() {
667
- if (!this.warmDb) await this.initialize();
668
- if (!this.warmDb) throw new Error("Database not initialized");
669
- const now = (/* @__PURE__ */ new Date()).toISOString();
670
- this.warmDb.prepare(`
671
- UPDATE nudges
672
- SET resolved = 1, resolvedAt = ?, resolution = 'dismissed'
673
- WHERE resolved = 0
674
- `).run(now);
675
- }
676
- /**
677
- * Resolve nudges for a goal violation that was fixed in a specific file.
678
- * Called when a file is rescanned and no longer has violations for that goal.
679
- */
680
- async resolveNudgesForGoalViolation(file, goalDescription, _workDir) {
681
- if (!this.warmDb) await this.initialize();
682
- if (!this.warmDb) throw new Error("Database not initialized");
683
- const goalPattern = `%Goal "${goalDescription.replace(/"/g, '""')}"%`;
684
- const fileAlt = file.replace(/\\/g, "/");
685
- const rows = this.warmDb.prepare(`
686
- SELECT id FROM nudges
687
- WHERE resolved = 0
688
- AND (file = ? OR file = ?)
689
- AND message LIKE ?
690
- `).all(file, fileAlt, goalPattern);
691
- const now = (/* @__PURE__ */ new Date()).toISOString();
692
- let resolved = 0;
693
- for (const row of rows) {
694
- this.warmDb.prepare(`
695
- UPDATE nudges SET resolved = 1, resolvedAt = ?, resolution = 'auto-fixed'
696
- WHERE id = ?
697
- `).run(now, row.id);
698
- resolved++;
699
- }
700
- return resolved;
701
- }
702
- /**
703
- * Resolve all nudges for a specific goal (used when goal is achieved or deleted)
704
- */
705
- async resolveNudgesForGoal(goalDescription) {
706
- if (!this.warmDb) await this.initialize();
707
- if (!this.warmDb) throw new Error("Database not initialized");
708
- const goalPattern = `%Goal "${goalDescription.replace(/"/g, '""')}"%`;
709
- const now = (/* @__PURE__ */ new Date()).toISOString();
710
- const result = this.warmDb.prepare(`
711
- UPDATE nudges
712
- SET resolved = 1, resolvedAt = ?, resolution = 'goal-achieved'
713
- WHERE resolved = 0 AND message LIKE ?
714
- `).run(now, goalPattern);
715
- return result.changes;
716
- }
717
- /**
718
- * Resolve nudges for files that no longer exist
719
- */
720
- async resolveNudgesForMissingFiles() {
721
- if (!this.warmDb) await this.initialize();
722
- if (!this.warmDb) throw new Error("Database not initialized");
723
- const { existsSync } = await import("fs");
724
- const rows = this.warmDb.prepare(`
725
- SELECT id, file FROM nudges WHERE resolved = 0 AND file IS NOT NULL
726
- `).all();
727
- const now = (/* @__PURE__ */ new Date()).toISOString();
728
- let resolved = 0;
729
- for (const row of rows) {
730
- if (row.file && !existsSync(row.file)) {
731
- this.warmDb.prepare(`
732
- UPDATE nudges SET resolved = 1, resolvedAt = ?, resolution = 'file-deleted'
733
- WHERE id = ?
734
- `).run(now, row.id);
735
- resolved++;
736
- }
737
- }
738
- return resolved;
739
- }
740
- /**
741
- * Resolve nudges matching a pattern in the message (for type error clearing, etc.)
742
- */
743
- async resolveNudgesByPattern(messagePattern, resolution = "auto-fixed") {
744
- if (!this.warmDb) await this.initialize();
745
- if (!this.warmDb) throw new Error("Database not initialized");
746
- const now = (/* @__PURE__ */ new Date()).toISOString();
747
- const result = this.warmDb.prepare(`
748
- UPDATE nudges
749
- SET resolved = 1, resolvedAt = ?, resolution = ?
750
- WHERE resolved = 0 AND message LIKE ?
751
- `).run(now, resolution, `%${messagePattern}%`);
752
- return result.changes;
753
- }
754
- /**
755
- * Auto-resolve nudges that match fixed issues
756
- * Called after a scan to mark nudges as fixed if their related issues are resolved
757
- */
758
- async autoResolveFixedNudges(resolvedIssueIds) {
759
- if (!this.warmDb) await this.initialize();
760
- if (!this.warmDb) throw new Error("Database not initialized");
761
- if (resolvedIssueIds.length === 0) return 0;
762
- const now = (/* @__PURE__ */ new Date()).toISOString();
763
- let resolved = 0;
764
- for (const issueId of resolvedIssueIds) {
765
- const result = this.warmDb.prepare(`
766
- UPDATE nudges
767
- SET resolved = 1, resolvedAt = ?, resolution = 'auto-fixed'
768
- WHERE resolved = 0
769
- AND (
770
- relatedIssues LIKE ?
771
- OR id = ?
772
- )
773
- `).run(now, `%"${issueId}"%`, issueId);
774
- resolved += result.changes;
775
- }
776
- return resolved;
777
- }
778
- /**
779
- * Store a gotcha in warm storage
780
- */
781
- async storeGotcha(gotcha) {
782
- if (!this.warmDb) await this.initialize();
783
- if (!this.warmDb) throw new Error("Database not initialized");
784
- const stmt = this.warmDb.prepare(`
785
- INSERT OR REPLACE INTO gotchas
786
- (id, message, confidence, riskLevel, recommendation, file, timestamp, precedentId, tags, evidence, resolved, resolvedAt, resolution)
787
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
788
- `);
789
- stmt.run(
790
- gotcha.id,
791
- gotcha.message,
792
- gotcha.confidence,
793
- gotcha.riskLevel,
794
- gotcha.recommendation,
795
- gotcha.file || null,
796
- gotcha.timestamp,
797
- gotcha.precedentId || null,
798
- JSON.stringify(gotcha.tags || []),
799
- JSON.stringify(gotcha.evidence || { pastIncidents: [], matchingPatterns: [], relatedTickets: [] }),
800
- gotcha.resolved ? 1 : 0,
801
- gotcha.resolvedAt || null,
802
- gotcha.resolution || null
803
- );
804
- }
805
- /**
806
- * Query gotchas from warm storage
807
- */
808
- async queryGotchas(filters) {
809
- if (!this.warmDb) await this.initialize();
810
- if (!this.warmDb) throw new Error("Database not initialized");
811
- let sql = "SELECT * FROM gotchas WHERE 1=1";
812
- const params = [];
813
- if (filters?.resolved !== void 0) {
814
- sql += " AND resolved = ?";
815
- params.push(filters.resolved ? 1 : 0);
816
- }
817
- if (filters?.riskLevel) {
818
- sql += " AND riskLevel = ?";
819
- params.push(filters.riskLevel);
820
- }
821
- if (filters?.file) {
822
- sql += " AND file = ?";
823
- params.push(filters.file);
824
- }
825
- sql += " ORDER BY timestamp DESC";
826
- if (filters?.limit) {
827
- sql += " LIMIT ?";
828
- params.push(filters.limit);
829
- }
830
- const rows = this.warmDb.prepare(sql).all(...params);
831
- return rows.map((row) => ({
832
- id: row.id,
833
- message: row.message,
834
- confidence: row.confidence,
835
- riskLevel: row.riskLevel,
836
- recommendation: row.recommendation,
837
- file: row.file || void 0,
838
- timestamp: row.timestamp,
839
- precedentId: row.precedentId || void 0,
840
- tags: JSON.parse(row.tags || "[]"),
841
- evidence: JSON.parse(row.evidence || '{"pastIncidents":[],"matchingPatterns":[],"relatedTickets":[]}'),
842
- resolved: Boolean(row.resolved),
843
- resolvedAt: row.resolvedAt || void 0,
844
- resolution: row.resolution || void 0
845
- }));
846
- }
847
- /**
848
- * Get unresolved nudges count
849
- */
850
- async getUnresolvedNudgesCount() {
851
- if (!this.warmDb) await this.initialize();
852
- if (!this.warmDb) throw new Error("Database not initialized");
853
- const result = this.warmDb.prepare("SELECT COUNT(*) as count FROM nudges WHERE resolved = 0").get();
854
- return result.count;
855
- }
856
- /**
857
- * Archive old data to cold storage
858
- */
859
- async archiveToCold(olderThanDays = 90) {
860
- if (!this.warmDb) await this.initialize();
861
- if (!this.warmDb) throw new Error("Database not initialized");
862
- const cutoffDate = /* @__PURE__ */ new Date();
863
- cutoffDate.setDate(cutoffDate.getDate() - olderThanDays);
864
- const cutoff = cutoffDate.toISOString();
865
- const coldDir = join(getTrieDirectory(this.workDir), "cold");
866
- const archivePath = join(coldDir, `archive-${Date.now()}.json`);
867
- const governance = this.warmDb.prepare("SELECT * FROM governance WHERE timestamp < ? AND accessCount < 3").all(cutoff);
868
- const facts = this.warmDb.prepare("SELECT * FROM facts WHERE timestamp < ? AND accessCount < 3").all(cutoff);
869
- const blockers = this.warmDb.prepare("SELECT * FROM blockers WHERE timestamp < ? AND resolvedAt IS NOT NULL").all(cutoff);
870
- const questions = this.warmDb.prepare("SELECT * FROM questions WHERE timestamp < ? AND answeredAt IS NOT NULL").all(cutoff);
871
- const nudges = this.warmDb.prepare("SELECT * FROM nudges WHERE timestamp < ? AND resolved = 1").all(cutoff);
872
- const gotchas = this.warmDb.prepare("SELECT * FROM gotchas WHERE timestamp < ? AND resolved = 1").all(cutoff);
873
- await writeFile(archivePath, JSON.stringify({ governance, facts, blockers, questions, nudges, gotchas }, null, 2));
874
- this.warmDb.prepare("DELETE FROM governance WHERE timestamp < ? AND accessCount < 3").run(cutoff);
875
- this.warmDb.prepare("DELETE FROM facts WHERE timestamp < ? AND accessCount < 3").run(cutoff);
876
- this.warmDb.prepare("DELETE FROM blockers WHERE timestamp < ? AND resolvedAt IS NOT NULL").run(cutoff);
877
- this.warmDb.prepare("DELETE FROM questions WHERE timestamp < ? AND answeredAt IS NOT NULL").run(cutoff);
878
- this.warmDb.prepare("DELETE FROM nudges WHERE timestamp < ? AND resolved = 1").run(cutoff);
879
- this.warmDb.prepare("DELETE FROM gotchas WHERE timestamp < ? AND resolved = 1").run(cutoff);
880
- }
881
- /**
882
- * Close database connection
883
- */
884
- close() {
885
- if (this.warmDb) {
886
- this.warmDb.close();
887
- this.warmDb = null;
888
- }
889
- }
890
- /**
891
- * Autocomplete tags from ledger trie
892
- */
893
- autocompleteTag(prefix, limit = 10) {
894
- const ledgerTrie = getLedgerTrie();
895
- return ledgerTrie.autocomplete("tag", prefix, limit);
896
- }
897
- /**
898
- * Autocomplete file paths from ledger trie
899
- */
900
- autocompleteFile(pathPrefix, limit = 10) {
901
- const ledgerTrie = getLedgerTrie();
902
- return ledgerTrie.autocomplete("file", pathPrefix, limit);
903
- }
904
- /**
905
- * Autocomplete agent names from ledger trie
906
- */
907
- autocompleteAgent(prefix, limit = 10) {
908
- const ledgerTrie = getLedgerTrie();
909
- return ledgerTrie.autocomplete("agent", prefix, limit);
910
- }
911
- /**
912
- * Get ledger trie statistics
913
- */
914
- getTrieStats() {
915
- const ledgerTrie = getLedgerTrie();
916
- return ledgerTrie.getStats();
917
- }
918
- };
919
- var storageInstances = /* @__PURE__ */ new Map();
920
- function getStorage(workDir) {
921
- if (!storageInstances.has(workDir)) {
922
- storageInstances.set(workDir, new TieredStorage(workDir));
923
- }
924
- return storageInstances.get(workDir);
925
- }
926
-
927
- export {
928
- TieredStorage,
929
- getStorage
930
- };
931
- //# sourceMappingURL=chunk-BUTOP5EB.js.map