shieldcortex 2.19.3 → 2.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/README.md +14 -10
  2. package/dashboard/.next/standalone/dashboard/.next/BUILD_ID +1 -1
  3. package/dashboard/.next/standalone/dashboard/.next/build-manifest.json +2 -2
  4. package/dashboard/.next/standalone/dashboard/.next/prerender-manifest.json +3 -3
  5. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.html +2 -2
  6. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.rsc +1 -1
  7. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  10. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  11. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  13. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.html +1 -1
  14. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.rsc +2 -2
  15. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  16. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  17. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  18. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  19. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  20. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  21. package/dashboard/.next/standalone/dashboard/.next/server/app/index.html +1 -1
  22. package/dashboard/.next/standalone/dashboard/.next/server/app/index.rsc +3 -3
  23. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  24. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_full.segment.rsc +3 -3
  25. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_head.segment.rsc +1 -1
  26. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_index.segment.rsc +2 -2
  27. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  28. package/dashboard/.next/standalone/dashboard/.next/server/app/page/react-loadable-manifest.json +3 -3
  29. package/dashboard/.next/standalone/dashboard/.next/server/app/page_client-reference-manifest.js +1 -1
  30. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_25b1b286._.js +1 -1
  31. package/dashboard/.next/standalone/dashboard/.next/server/pages/404.html +1 -1
  32. package/dashboard/.next/standalone/dashboard/.next/server/pages/500.html +2 -2
  33. package/dashboard/.next/standalone/dashboard/.next/server/server-reference-manifest.js +1 -1
  34. package/dashboard/.next/standalone/dashboard/.next/server/server-reference-manifest.json +1 -1
  35. package/dashboard/.next/standalone/dashboard/.next/static/chunks/26118d592a545e00.js +3 -0
  36. package/dashboard/.next/standalone/dashboard/.next/static/chunks/6a6ccfb7834de00a.js +9 -0
  37. package/dashboard/.next/standalone/dashboard/.next/static/chunks/6b11a7d29e9abffd.js +1 -0
  38. package/dashboard/.next/standalone/dashboard/.next/static/chunks/ab13d81ce0e121f2.css +3 -0
  39. package/dashboard/.next/standalone/dashboard/.next/static/chunks/cf05262adfab5818.js +1 -0
  40. package/dist/api/visualization-server.d.ts.map +1 -1
  41. package/dist/api/visualization-server.js +218 -3
  42. package/dist/api/visualization-server.js.map +1 -1
  43. package/dist/cli/doctor.d.ts +6 -0
  44. package/dist/cli/doctor.d.ts.map +1 -0
  45. package/dist/cli/doctor.js +469 -0
  46. package/dist/cli/doctor.js.map +1 -0
  47. package/dist/database/init.d.ts +8 -0
  48. package/dist/database/init.d.ts.map +1 -1
  49. package/dist/database/init.js +208 -4
  50. package/dist/database/init.js.map +1 -1
  51. package/dist/events/webhooks.d.ts +21 -0
  52. package/dist/events/webhooks.d.ts.map +1 -0
  53. package/dist/events/webhooks.js +61 -0
  54. package/dist/events/webhooks.js.map +1 -0
  55. package/dist/graph/backfill.d.ts +6 -2
  56. package/dist/graph/backfill.d.ts.map +1 -1
  57. package/dist/graph/backfill.js +32 -4
  58. package/dist/graph/backfill.js.map +1 -1
  59. package/dist/graph/extract.d.ts.map +1 -1
  60. package/dist/graph/extract.js +105 -37
  61. package/dist/graph/extract.js.map +1 -1
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +8 -5
  64. package/dist/index.js.map +1 -1
  65. package/dist/memory/consolidate.d.ts +23 -0
  66. package/dist/memory/consolidate.d.ts.map +1 -1
  67. package/dist/memory/consolidate.js +239 -2
  68. package/dist/memory/consolidate.js.map +1 -1
  69. package/dist/memory/decay.d.ts.map +1 -1
  70. package/dist/memory/decay.js +9 -0
  71. package/dist/memory/decay.js.map +1 -1
  72. package/dist/memory/embedding-cache.d.ts +21 -0
  73. package/dist/memory/embedding-cache.d.ts.map +1 -0
  74. package/dist/memory/embedding-cache.js +92 -0
  75. package/dist/memory/embedding-cache.js.map +1 -0
  76. package/dist/memory/embedding.d.ts +37 -0
  77. package/dist/memory/embedding.d.ts.map +1 -0
  78. package/dist/memory/embedding.js +86 -0
  79. package/dist/memory/embedding.js.map +1 -0
  80. package/dist/memory/expiry.d.ts +26 -0
  81. package/dist/memory/expiry.d.ts.map +1 -0
  82. package/dist/memory/expiry.js +109 -0
  83. package/dist/memory/expiry.js.map +1 -0
  84. package/dist/memory/store.d.ts +14 -0
  85. package/dist/memory/store.d.ts.map +1 -1
  86. package/dist/memory/store.js +82 -0
  87. package/dist/memory/store.js.map +1 -1
  88. package/dist/memory/types.d.ts +1 -0
  89. package/dist/memory/types.d.ts.map +1 -1
  90. package/dist/memory/types.js.map +1 -1
  91. package/dist/tools/recall.d.ts.map +1 -1
  92. package/dist/tools/recall.js +25 -1
  93. package/dist/tools/recall.js.map +1 -1
  94. package/dist/tools/remember.d.ts +2 -2
  95. package/package.json +1 -1
  96. package/dashboard/.next/standalone/dashboard/.next/static/chunks/7d04c140073d99aa.js +0 -9
  97. package/dashboard/.next/standalone/dashboard/.next/static/chunks/94d1921c4f61a608.css +0 -3
  98. package/dashboard/.next/standalone/dashboard/.next/static/chunks/a3989d0e6629bcf8.js +0 -3
  99. package/dashboard/.next/standalone/dashboard/.next/static/chunks/cac330f9511d34e5.js +0 -1
  100. package/dashboard/.next/standalone/dashboard/.next/static/chunks/fc2dbf641aad1448.js +0 -1
  101. /package/dashboard/.next/standalone/dashboard/.next/static/{x5pEZRSDizF1dS-qqTezT → aFo1BShJENvQZgqpWRJaw}/_buildManifest.js +0 -0
  102. /package/dashboard/.next/standalone/dashboard/.next/static/{x5pEZRSDizF1dS-qqTezT → aFo1BShJENvQZgqpWRJaw}/_clientMiddlewareManifest.json +0 -0
  103. /package/dashboard/.next/standalone/dashboard/.next/static/{x5pEZRSDizF1dS-qqTezT → aFo1BShJENvQZgqpWRJaw}/_ssgManifest.js +0 -0
@@ -0,0 +1,469 @@
1
+ /**
2
+ * ShieldCortex Doctor — Installation health checker.
3
+ * Runs diagnostics and reports issues with actionable fixes.
4
+ */
5
+ import fs from 'fs';
6
+ import path from 'path';
7
+ import os from 'os';
8
+ import { createRequire } from 'module';
9
+ const require = createRequire(import.meta.url);
10
+ const pkg = require('../../package.json');
11
+ // ANSI colour codes
12
+ const bold = '\x1b[1m';
13
+ const reset = '\x1b[0m';
14
+ const green = '\x1b[32m';
15
+ const yellow = '\x1b[33m';
16
+ const red = '\x1b[31m';
17
+ const cyan = '\x1b[36m';
18
+ const dim = '\x1b[2m';
19
+ function icon(status) {
20
+ switch (status) {
21
+ case 'pass': return `${green}\u2705${reset}`;
22
+ case 'warn': return `${yellow}\u26A0\uFE0F ${reset}`;
23
+ case 'fail': return `${red}\u274C${reset}`;
24
+ case 'info': return `${cyan}\u2139\uFE0F ${reset}`;
25
+ }
26
+ }
27
+ function formatBytes(bytes) {
28
+ if (bytes < 1024)
29
+ return `${bytes} B`;
30
+ if (bytes < 1024 * 1024)
31
+ return `${(bytes / 1024).toFixed(1)} KB`;
32
+ if (bytes < 1024 * 1024 * 1024)
33
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
34
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;
35
+ }
36
+ function getShieldCortexDir() {
37
+ return path.join(os.homedir(), '.shieldcortex');
38
+ }
39
+ function getDbPath() {
40
+ const newPath = path.join(getShieldCortexDir(), 'memories.db');
41
+ const legacyPath = path.join(os.homedir(), '.claude-memory', 'memories.db');
42
+ if (fs.existsSync(newPath))
43
+ return newPath;
44
+ if (fs.existsSync(legacyPath))
45
+ return legacyPath;
46
+ return newPath; // default expected path
47
+ }
48
+ // ── Check 1: Database health ──────────────────────────────
49
+ async function checkDatabase() {
50
+ const dbPath = getDbPath();
51
+ if (!fs.existsSync(dbPath)) {
52
+ return {
53
+ label: 'Database',
54
+ status: 'fail',
55
+ message: 'not found',
56
+ fix: 'Start the MCP server or run `shieldcortex setup` to initialise the database',
57
+ };
58
+ }
59
+ try {
60
+ const Database = require('better-sqlite3');
61
+ const db = new Database(dbPath, { readonly: true });
62
+ try {
63
+ const result = db.pragma('integrity_check');
64
+ const integrity = Array.isArray(result) ? result[0]?.integrity_check : result;
65
+ const stat = fs.statSync(dbPath);
66
+ const size = formatBytes(stat.size);
67
+ // Check WAL file
68
+ const walPath = dbPath + '-wal';
69
+ let walInfo = '';
70
+ if (fs.existsSync(walPath)) {
71
+ const walStat = fs.statSync(walPath);
72
+ walInfo = `, WAL ${formatBytes(walStat.size)}`;
73
+ }
74
+ if (integrity === 'ok') {
75
+ return { label: 'Database', status: 'pass', message: `healthy (${size}${walInfo})` };
76
+ }
77
+ else {
78
+ return {
79
+ label: 'Database',
80
+ status: 'fail',
81
+ message: `corrupt — integrity check returned: ${integrity}`,
82
+ fix: 'Back up and delete `~/.shieldcortex/memories.db`, then restart the MCP server',
83
+ };
84
+ }
85
+ }
86
+ finally {
87
+ db.close();
88
+ }
89
+ }
90
+ catch (err) {
91
+ const msg = err instanceof Error ? err.message : String(err);
92
+ return {
93
+ label: 'Database',
94
+ status: 'fail',
95
+ message: `cannot open — ${msg}`,
96
+ fix: 'Run `npm rebuild better-sqlite3` if you changed Node versions',
97
+ };
98
+ }
99
+ }
100
+ // ── Check 2: Schema version ──────────────────────────────
101
+ async function checkSchema() {
102
+ const dbPath = getDbPath();
103
+ if (!fs.existsSync(dbPath)) {
104
+ return { label: 'Schema', status: 'warn', message: 'skipped (no database)' };
105
+ }
106
+ try {
107
+ const Database = require('better-sqlite3');
108
+ const db = new Database(dbPath, { readonly: true });
109
+ try {
110
+ const columns = db.pragma('table_info(memories)');
111
+ const columnNames = new Set(columns.map((c) => c.name));
112
+ const required = ['decayed_score', 'graph_extraction_version', 'sensitivity'];
113
+ const missing = required.filter(col => !columnNames.has(col));
114
+ if (missing.length === 0) {
115
+ return { label: 'Schema', status: 'pass', message: 'up to date' };
116
+ }
117
+ else {
118
+ return {
119
+ label: 'Schema',
120
+ status: 'warn',
121
+ message: `missing columns: ${missing.join(', ')}`,
122
+ fix: 'Restart the MCP server to auto-migrate',
123
+ };
124
+ }
125
+ }
126
+ finally {
127
+ db.close();
128
+ }
129
+ }
130
+ catch (err) {
131
+ const msg = err instanceof Error ? err.message : String(err);
132
+ return { label: 'Schema', status: 'warn', message: `check failed — ${msg}` };
133
+ }
134
+ }
135
+ // ── Check 3: Memory stats ─────────────────────────────────
136
+ async function checkMemoryStats() {
137
+ const dbPath = getDbPath();
138
+ if (!fs.existsSync(dbPath)) {
139
+ return { label: 'Memories', status: 'warn', message: 'skipped (no database)' };
140
+ }
141
+ try {
142
+ const Database = require('better-sqlite3');
143
+ const db = new Database(dbPath, { readonly: true });
144
+ try {
145
+ const total = db.prepare('SELECT COUNT(*) as count FROM memories').get().count;
146
+ const stm = db.prepare("SELECT COUNT(*) as count FROM memories WHERE type = 'short_term'").get().count;
147
+ const ltm = db.prepare("SELECT COUNT(*) as count FROM memories WHERE type = 'long_term'").get().count;
148
+ const STM_LIMIT = 100;
149
+ const LTM_LIMIT = 1000;
150
+ let status = 'pass';
151
+ let warnings = [];
152
+ if (stm >= STM_LIMIT * 0.9) {
153
+ status = 'warn';
154
+ warnings.push(`${stm}/${STM_LIMIT} STM — consolidation needed`);
155
+ }
156
+ if (ltm >= LTM_LIMIT * 0.9) {
157
+ status = 'warn';
158
+ warnings.push(`${ltm}/${LTM_LIMIT} LTM — approaching limit`);
159
+ }
160
+ const message = warnings.length > 0
161
+ ? `${total} total (${stm} STM, ${ltm} LTM) — ${warnings.join('; ')}`
162
+ : `${total} total (${stm} STM, ${ltm} LTM)`;
163
+ return { label: 'Memories', status, message };
164
+ }
165
+ finally {
166
+ db.close();
167
+ }
168
+ }
169
+ catch (err) {
170
+ const msg = err instanceof Error ? err.message : String(err);
171
+ return { label: 'Memories', status: 'warn', message: `check failed — ${msg}` };
172
+ }
173
+ }
174
+ // ── Check 4: Hook installation ────────────────────────────
175
+ async function checkHooks() {
176
+ const settingsPath = path.join(os.homedir(), '.claude', 'settings.json');
177
+ if (!fs.existsSync(settingsPath)) {
178
+ return {
179
+ label: 'Hooks',
180
+ status: 'warn',
181
+ message: 'settings.json not found',
182
+ fix: 'Run `npx shieldcortex install` to configure hooks',
183
+ };
184
+ }
185
+ try {
186
+ const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));
187
+ const hooks = settings.hooks || {};
188
+ const hookNames = ['SessionStart', 'PreCompact', 'SessionEnd'];
189
+ let installed = 0;
190
+ const missing = [];
191
+ for (const name of hookNames) {
192
+ const hookConfig = hooks[name];
193
+ if (hookConfig) {
194
+ // Check if the hook command/script exists
195
+ const commands = Array.isArray(hookConfig)
196
+ ? hookConfig.map((h) => h.command).filter(Boolean)
197
+ : hookConfig.command ? [hookConfig.command] : [];
198
+ const hasShieldCortex = commands.some((cmd) => cmd.includes('shieldcortex'));
199
+ if (hasShieldCortex) {
200
+ installed++;
201
+ }
202
+ else {
203
+ missing.push(name);
204
+ }
205
+ }
206
+ else {
207
+ missing.push(name);
208
+ }
209
+ }
210
+ if (installed === hookNames.length) {
211
+ return { label: 'Hooks', status: 'pass', message: `${installed}/${hookNames.length} installed` };
212
+ }
213
+ else {
214
+ return {
215
+ label: 'Hooks',
216
+ status: 'warn',
217
+ message: `${installed}/${hookNames.length} installed — missing: ${missing.join(', ')}`,
218
+ fix: 'Run `npx shieldcortex install` to configure hooks',
219
+ };
220
+ }
221
+ }
222
+ catch (err) {
223
+ const msg = err instanceof Error ? err.message : String(err);
224
+ return { label: 'Hooks', status: 'warn', message: `check failed — ${msg}` };
225
+ }
226
+ }
227
+ // ── Check 5: Process check ────────────────────────────────
228
+ async function checkProcesses() {
229
+ const results = [];
230
+ // Check API server on port 3001
231
+ try {
232
+ const controller = new AbortController();
233
+ const timeout = setTimeout(() => controller.abort(), 2000);
234
+ const response = await fetch('http://localhost:3001/api/health', { signal: controller.signal });
235
+ clearTimeout(timeout);
236
+ if (response.ok) {
237
+ results.push({ label: 'API server', status: 'pass', message: 'running (port 3001)' });
238
+ }
239
+ else {
240
+ results.push({
241
+ label: 'API server',
242
+ status: 'warn',
243
+ message: `responding but unhealthy (status ${response.status})`,
244
+ fix: 'Restart with `shieldcortex dashboard`',
245
+ });
246
+ }
247
+ }
248
+ catch {
249
+ results.push({
250
+ label: 'API server',
251
+ status: 'warn',
252
+ message: 'not running',
253
+ fix: 'Run `shieldcortex dashboard` to start the API server',
254
+ });
255
+ }
256
+ // Check dashboard on port 3030
257
+ try {
258
+ const controller = new AbortController();
259
+ const timeout = setTimeout(() => controller.abort(), 2000);
260
+ const response = await fetch('http://localhost:3030/', { signal: controller.signal });
261
+ clearTimeout(timeout);
262
+ if (response.ok || response.status === 304) {
263
+ results.push({ label: 'Dashboard', status: 'pass', message: 'running (port 3030)' });
264
+ }
265
+ else {
266
+ results.push({
267
+ label: 'Dashboard',
268
+ status: 'warn',
269
+ message: `responding but returned status ${response.status}`,
270
+ fix: 'Restart with `shieldcortex dashboard`',
271
+ });
272
+ }
273
+ }
274
+ catch {
275
+ results.push({
276
+ label: 'Dashboard',
277
+ status: 'warn',
278
+ message: 'not running',
279
+ fix: 'Run `shieldcortex dashboard` to start the dashboard',
280
+ });
281
+ }
282
+ return results;
283
+ }
284
+ // ── Check 6: Disk usage ───────────────────────────────────
285
+ async function checkDiskUsage() {
286
+ const scDir = getShieldCortexDir();
287
+ if (!fs.existsSync(scDir)) {
288
+ return { label: 'Disk', status: 'pass', message: '0 B / 100 MB limit (directory not yet created)' };
289
+ }
290
+ try {
291
+ let totalSize = 0;
292
+ function walkDir(dir) {
293
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
294
+ for (const entry of entries) {
295
+ const fullPath = path.join(dir, entry.name);
296
+ try {
297
+ if (entry.isDirectory()) {
298
+ walkDir(fullPath);
299
+ }
300
+ else if (entry.isFile()) {
301
+ totalSize += fs.statSync(fullPath).size;
302
+ }
303
+ }
304
+ catch {
305
+ // Skip inaccessible files
306
+ }
307
+ }
308
+ }
309
+ walkDir(scDir);
310
+ const limit = 100 * 1024 * 1024; // 100 MB
311
+ const pct = (totalSize / limit) * 100;
312
+ const sizeStr = `${formatBytes(totalSize)} / 100 MB limit`;
313
+ if (pct >= 95) {
314
+ return { label: 'Disk', status: 'fail', message: `${sizeStr} — at limit!`, fix: 'Run consolidation or delete old memories' };
315
+ }
316
+ else if (pct >= 80) {
317
+ return { label: 'Disk', status: 'warn', message: `${sizeStr} — approaching limit`, fix: 'Consider running consolidation to free space' };
318
+ }
319
+ else {
320
+ return { label: 'Disk', status: 'pass', message: sizeStr };
321
+ }
322
+ }
323
+ catch (err) {
324
+ const msg = err instanceof Error ? err.message : String(err);
325
+ return { label: 'Disk', status: 'warn', message: `check failed — ${msg}` };
326
+ }
327
+ }
328
+ // ── Check 7: Lock file ───────────────────────────────────
329
+ async function checkLockFile() {
330
+ const scDir = getShieldCortexDir();
331
+ if (!fs.existsSync(scDir)) {
332
+ return { label: 'Lock', status: 'pass', message: 'clean' };
333
+ }
334
+ try {
335
+ const lockFiles = [];
336
+ const entries = fs.readdirSync(scDir);
337
+ for (const entry of entries) {
338
+ if (entry.endsWith('.lock')) {
339
+ lockFiles.push(entry);
340
+ }
341
+ }
342
+ if (lockFiles.length === 0) {
343
+ return { label: 'Lock', status: 'pass', message: 'clean' };
344
+ }
345
+ // Check if lock files are stale (older than 1 hour)
346
+ const stale = [];
347
+ const active = [];
348
+ const oneHourAgo = Date.now() - 60 * 60 * 1000;
349
+ for (const lockFile of lockFiles) {
350
+ const lockPath = path.join(scDir, lockFile);
351
+ const stat = fs.statSync(lockPath);
352
+ if (stat.mtimeMs < oneHourAgo) {
353
+ stale.push(lockFile);
354
+ }
355
+ else {
356
+ active.push(lockFile);
357
+ }
358
+ }
359
+ if (stale.length > 0) {
360
+ return {
361
+ label: 'Lock',
362
+ status: 'warn',
363
+ message: `stale lock file found: ${stale.join(', ')}`,
364
+ fix: `Remove ${stale.map(f => `\`~/.shieldcortex/${f}\``).join(', ')}`,
365
+ };
366
+ }
367
+ return { label: 'Lock', status: 'pass', message: `clean (${active.length} active lock${active.length !== 1 ? 's' : ''})` };
368
+ }
369
+ catch (err) {
370
+ const msg = err instanceof Error ? err.message : String(err);
371
+ return { label: 'Lock', status: 'warn', message: `check failed — ${msg}` };
372
+ }
373
+ }
374
+ // ── Check 8: Model cache ─────────────────────────────────
375
+ async function checkModelCache() {
376
+ const cacheDir = path.join(os.homedir(), '.cache', 'shieldcortex', 'models', 'Xenova', 'all-MiniLM-L6-v2');
377
+ if (!fs.existsSync(cacheDir)) {
378
+ return {
379
+ label: 'Embeddings',
380
+ status: 'info',
381
+ message: 'model not cached — will download on first recall',
382
+ };
383
+ }
384
+ try {
385
+ let totalSize = 0;
386
+ const entries = fs.readdirSync(cacheDir);
387
+ for (const entry of entries) {
388
+ const fullPath = path.join(cacheDir, entry);
389
+ try {
390
+ const stat = fs.statSync(fullPath);
391
+ if (stat.isFile())
392
+ totalSize += stat.size;
393
+ }
394
+ catch {
395
+ // Skip
396
+ }
397
+ }
398
+ return {
399
+ label: 'Embeddings',
400
+ status: 'pass',
401
+ message: `model cached (${formatBytes(totalSize)})`,
402
+ };
403
+ }
404
+ catch (err) {
405
+ const msg = err instanceof Error ? err.message : String(err);
406
+ return { label: 'Embeddings', status: 'warn', message: `check failed — ${msg}` };
407
+ }
408
+ }
409
+ // ── Main runner ───────────────────────────────────────────
410
+ export async function runDoctor() {
411
+ console.log(`\n${bold}ShieldCortex Doctor${reset} v${pkg.version}\n`);
412
+ const results = [];
413
+ // Run checks sequentially (some depend on DB access)
414
+ const checks = [
415
+ checkDatabase,
416
+ checkSchema,
417
+ checkMemoryStats,
418
+ checkHooks,
419
+ checkProcesses,
420
+ checkDiskUsage,
421
+ checkLockFile,
422
+ checkModelCache,
423
+ ];
424
+ for (const check of checks) {
425
+ try {
426
+ const result = await check();
427
+ if (Array.isArray(result)) {
428
+ results.push(...result);
429
+ }
430
+ else {
431
+ results.push(result);
432
+ }
433
+ }
434
+ catch (err) {
435
+ const msg = err instanceof Error ? err.message : String(err);
436
+ results.push({ label: 'Unknown', status: 'fail', message: `check crashed — ${msg}` });
437
+ }
438
+ }
439
+ // Print results
440
+ for (const r of results) {
441
+ console.log(` ${icon(r.status)} ${bold}${r.label}:${reset} ${r.message}`);
442
+ }
443
+ // Summary
444
+ const passed = results.filter(r => r.status === 'pass').length;
445
+ const warnings = results.filter(r => r.status === 'warn').length;
446
+ const failures = results.filter(r => r.status === 'fail').length;
447
+ const infos = results.filter(r => r.status === 'info').length;
448
+ const total = results.length;
449
+ console.log('');
450
+ const parts = [];
451
+ parts.push(`${passed}/${total} checks passed`);
452
+ if (warnings > 0)
453
+ parts.push(`${yellow}${warnings} warning${warnings !== 1 ? 's' : ''}${reset}`);
454
+ if (failures > 0)
455
+ parts.push(`${red}${failures} failure${failures !== 1 ? 's' : ''}${reset}`);
456
+ if (infos > 0)
457
+ parts.push(`${infos} info`);
458
+ console.log(` ${parts.join(', ')}`);
459
+ // Suggested fixes
460
+ const fixes = results.filter(r => r.fix);
461
+ if (fixes.length > 0) {
462
+ console.log(`\n ${bold}Suggested fixes:${reset}`);
463
+ for (const f of fixes) {
464
+ console.log(` ${dim}\u2192${reset} ${f.fix}`);
465
+ }
466
+ }
467
+ console.log('');
468
+ }
469
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,14 @@ export declare function isDatabaseInitialized(): boolean;
20
20
  * Close the database connection with proper cleanup
21
21
  */
22
22
  export declare function closeDatabase(): void;
23
+ /**
24
+ * Repair or verify database health.
25
+ * Intended for `shieldcortex doctor` CLI command.
26
+ */
27
+ export declare function repairDatabase(): {
28
+ status: 'ok' | 'repaired' | 'recreated';
29
+ message: string;
30
+ };
23
31
  /**
24
32
  * Manually checkpoint the WAL file (call periodically for long-running processes)
25
33
  */
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/database/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AA4CtC;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAyD/D;AA4QD;;GAEG;AACH,wBAAgB,WAAW,IAAI,QAAQ,CAAC,QAAQ,CAK/C;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAsBpC;AAyBD;;GAEG;AACH,wBAAgB,aAAa,IAAI;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAO1E;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,iBAAiB,IAAI,gBAAgB,CAkCpD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAwPD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAGjD;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAW1D"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/database/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAuItC;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAgG/D;AAiRD;;GAEG;AACH,wBAAgB,WAAW,IAAI,QAAQ,CAAC,QAAQ,CAK/C;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAsBpC;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI;IAAE,MAAM,EAAE,IAAI,GAAG,UAAU,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAyE7F;AAyBD;;GAEG;AACH,wBAAgB,aAAa,IAAI;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAO1E;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,iBAAiB,IAAI,gBAAgB,CAkCpD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAyPD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAGjD;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAW1D"}