@monoes/monomindcli 1.10.7 → 1.10.9

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.
@@ -25,6 +25,103 @@ function _requireMonograph() {
25
25
  return null;
26
26
  }
27
27
 
28
+ // ── Monograph LLM-context helpers ──────────────────────────────────────────────
29
+ // Used by route (pre-resolve), pre-search (Grep/Glob redirect), and post-read
30
+ // (neighbor footer). All calls are best-effort; failures are silent.
31
+
32
+ function _openMonographDb() {
33
+ try {
34
+ var dbPath = path.join(CWD, '.monomind', 'monograph.db');
35
+ if (!fs.existsSync(dbPath)) return null;
36
+ var mod = _requireMonograph();
37
+ if (!mod || !mod.openDb) return null;
38
+ return mod.openDb(dbPath);
39
+ } catch (e) { return null; }
40
+ }
41
+
42
+ function getMonographSuggestions(taskText, limit) {
43
+ if (!taskText || typeof taskText !== "string") return [];
44
+ var db = _openMonographDb();
45
+ if (!db) return [];
46
+ try {
47
+ var words = String(taskText).toLowerCase().match(/[a-z][a-z0-9_-]{3,}/g) || [];
48
+ var stop = { "this":1,"that":1,"with":1,"from":1,"have":1,"into":1,"their":1,"what":1,"when":1,"where":1,"which":1,"should":1,"would":1,"could":1,"make":1,"just":1,"also":1,"them":1,"they":1,"will":1,"been":1,"were":1,"because":1,"about":1,"does":1,"work":1 };
49
+ var uniq = {};
50
+ for (var i = 0; i < words.length; i++) if (!stop[words[i]]) uniq[words[i]] = 1;
51
+ var keys = Object.keys(uniq).slice(0, 8);
52
+ if (keys.length === 0) return [];
53
+
54
+ var ftsQuery = keys.map(function(k){ return '"' + k.replace(/"/g, "") + '"'; }).join(" OR ");
55
+ var lim = Math.max(1, limit || 5);
56
+ var rows = [];
57
+ try {
58
+ rows = db.prepare(
59
+ "SELECT n.id, n.name, n.label, n.file_path AS file, " +
60
+ "(SELECT COUNT(*) FROM edges WHERE source_id=n.id OR target_id=n.id) AS deg " +
61
+ "FROM nodes_fts f JOIN nodes n ON f.rowid = n.rowid " +
62
+ "WHERE nodes_fts MATCH ? AND n.file_path IS NOT NULL AND n.file_path != '' " +
63
+ "AND n.label NOT IN ('Concept') " +
64
+ "ORDER BY deg DESC LIMIT ?"
65
+ ).all(ftsQuery, lim);
66
+ } catch (e) {
67
+ var likeFrag = keys.map(function(){ return "lower(n.name) LIKE ?"; }).join(" OR ");
68
+ var likeArgs = keys.map(function(k){ return "%" + k + "%"; });
69
+ var stmt = db.prepare(
70
+ "SELECT n.id, n.name, n.label, n.file_path AS file, " +
71
+ "(SELECT COUNT(*) FROM edges WHERE source_id=n.id OR target_id=n.id) AS deg " +
72
+ "FROM nodes n WHERE (" + likeFrag + ") AND n.file_path IS NOT NULL AND n.file_path != '' " +
73
+ "AND n.label NOT IN ('Concept') " +
74
+ "ORDER BY deg DESC LIMIT ?"
75
+ );
76
+ rows = stmt.all.apply(stmt, likeArgs.concat([lim]));
77
+ }
78
+ return rows || [];
79
+ } catch (e) { return []; }
80
+ finally { try { db.close(); } catch (_) {} }
81
+ }
82
+
83
+ function getMonographNeighbors(filePath) {
84
+ if (!filePath) return null;
85
+ var db = _openMonographDb();
86
+ if (!db) return null;
87
+ try {
88
+ var rel = filePath;
89
+ if (filePath.indexOf(CWD) === 0) rel = filePath.slice(CWD.length + 1);
90
+ var node = db.prepare(
91
+ "SELECT id, name FROM nodes WHERE label='File' AND (file_path=? OR file_path=? OR name=? OR name=?) LIMIT 1"
92
+ ).get(filePath, rel, filePath, rel);
93
+ if (!node) return null;
94
+
95
+ var imports = db.prepare(
96
+ "SELECT DISTINCT n.name FROM edges e JOIN nodes n ON e.target_id = n.id " +
97
+ "WHERE e.source_id=? AND e.relation IN ('IMPORTS','CALLS','DEPENDS_ON','CONTAINS','DEFINES') " +
98
+ "AND n.file_path IS NOT NULL AND n.file_path != '' LIMIT 6"
99
+ ).all(node.id).map(function(r){ return r.name; });
100
+ var importedBy = db.prepare(
101
+ "SELECT DISTINCT n.name FROM edges e JOIN nodes n ON e.source_id = n.id " +
102
+ "WHERE e.target_id=? AND e.relation IN ('IMPORTS','CALLS','DEPENDS_ON','CONTAINS','DEFINES') " +
103
+ "AND n.file_path IS NOT NULL AND n.file_path != '' LIMIT 6"
104
+ ).all(node.id).map(function(r){ return r.name; });
105
+
106
+ return { imports: imports, importedBy: importedBy };
107
+ } catch (e) { return null; }
108
+ finally { try { db.close(); } catch (_) {} }
109
+ }
110
+
111
+ function _recordGraphTelemetry(event) {
112
+ try {
113
+ var metricsDir = path.join(CWD, ".monomind", "metrics");
114
+ var f = path.join(metricsDir, "graph-usage.json");
115
+ fs.mkdirSync(metricsDir, { recursive: true });
116
+ var d = {};
117
+ try { d = JSON.parse(fs.readFileSync(f, "utf-8")); } catch (e) {}
118
+ if (typeof d !== "object" || d === null) d = {};
119
+ d[event] = (d[event] || 0) + 1;
120
+ d.lastUpdated = Date.now();
121
+ fs.writeFileSync(f, JSON.stringify(d));
122
+ } catch (e) { /* non-fatal */ }
123
+ }
124
+
28
125
  function safeRequire(modulePath) {
29
126
  try {
30
127
  if (fs.existsSync(modulePath)) {
@@ -296,57 +393,82 @@ function _autoIndexKnowledge(knowledgeDir) {
296
393
  } catch (e) {}
297
394
  }
298
395
 
299
- // Inject monograph graph summary as a knowledge chunk
396
+ // Inject monograph graph summary as a knowledge chunk.
397
+ // Reads from .monomind/monograph.db (SQLite, source of truth) and falls
398
+ // back to the legacy .monomind/graph/{stats,graph}.json pair only when
399
+ // present (older installs).
300
400
  try {
301
- var statsPath = path.join(CWD, '.monomind', 'graph', 'stats.json');
302
- var graphPath = path.join(CWD, '.monomind', 'graph', 'graph.json');
303
- if (fs.existsSync(statsPath) && fs.existsSync(graphPath)) {
304
- var stats = JSON.parse(fs.readFileSync(statsPath, 'utf-8'));
305
- var graphStat = fs.statSync(graphPath);
306
- // Only read graph if under 10MB
307
- if (graphStat.size < 10 * 1024 * 1024) {
308
- var graph = JSON.parse(fs.readFileSync(graphPath, 'utf-8'));
309
- var rawNodes = Array.isArray(graph.nodes) ? graph.nodes : [];
310
- var rawEdges = Array.isArray(graph.edges) ? graph.edges : (Array.isArray(graph.links) ? graph.links : []);
311
- // Top 15 nodes by degree (god nodes)
312
- var degree = {};
313
- rawNodes.forEach(function(n) { degree[n.id] = 0; });
314
- rawEdges.forEach(function(e) {
315
- if (degree[e.source] !== undefined) degree[e.source]++;
316
- if (degree[e.target] !== undefined) degree[e.target]++;
317
- });
318
- var topNodes = rawNodes
319
- .filter(function(n) { return n.sourceFile && n.sourceFile !== ''; })
320
- .sort(function(a, b) { return (degree[b.id] || 0) - (degree[a.id] || 0); })
321
- .slice(0, 15);
322
- // Community summary group by type
323
- var typeCounts = {};
324
- rawNodes.forEach(function(n) { var t = n.type || n.label || 'unknown'; typeCounts[t] = (typeCounts[t] || 0) + 1; });
325
- var topTypes = Object.entries(typeCounts).sort(function(a,b){return b[1]-a[1];}).slice(0,8).map(function(e){return e[0]+':'+e[1];}).join(', ');
326
- var builtDate = stats.builtAt ? new Date(stats.builtAt).toISOString().slice(0,10) : 'unknown';
327
- var summaryText = [
328
- 'MONOGRAPH KNOWLEDGE GRAPH SUMMARY',
329
- 'Built: ' + builtDate + ' | Nodes: ' + (stats.nodes || rawNodes.length) + ' | Edges: ' + (stats.edges || rawEdges.length) + ' | Files: ' + (stats.files || 0),
330
- '',
331
- 'TOP GOD NODES (highest connectivity):',
332
- topNodes.map(function(n) {
333
- return ' ' + (n.name || n.id) + ' [' + (n.type || n.label || '?') + '] — ' + (n.sourceFile || '') + ' (degree: ' + (degree[n.id] || 0) + ')';
334
- }).join('\n'),
335
- '',
336
- 'NODE TYPE DISTRIBUTION: ' + topTypes,
337
- '',
338
- 'Use mcp__monomind__monograph_suggest to find files relevant to your task.',
339
- 'Use mcp__monomind__monograph_query to search for symbols.',
340
- 'Use mcp__monomind__monograph_god_nodes for architecture overview.',
341
- ].join('\n');
342
- var chunkId = crypto.createHash('md5').update('monograph-graph-summary').digest('hex').slice(0, 16);
343
- newLines.push(JSON.stringify({
344
- chunkId: chunkId,
345
- namespace: 'knowledge:shared',
346
- text: summaryText,
347
- metadata: { label: 'monograph-graph-summary', builtAt: stats.builtAt }
348
- }));
349
- }
401
+ var mgDbPath2 = path.join(CWD, '.monomind', 'monograph.db');
402
+ var legacyStats2 = path.join(CWD, '.monomind', 'graph', 'stats.json');
403
+ var legacyGraph2 = path.join(CWD, '.monomind', 'graph', 'graph.json');
404
+
405
+ var summaryText = null;
406
+ var summaryMeta = {};
407
+
408
+ if (fs.existsSync(mgDbPath2)) {
409
+ try {
410
+ var mgMod2 = _requireMonograph();
411
+ if (mgMod2 && mgMod2.openDb) {
412
+ var sumDb = mgMod2.openDb(mgDbPath2);
413
+ try {
414
+ var nodeC = sumDb.prepare('SELECT COUNT(*) AS c FROM nodes').get().c;
415
+ var edgeC = sumDb.prepare('SELECT COUNT(*) AS c FROM edges').get().c;
416
+ var topNodes2 = sumDb.prepare(
417
+ 'SELECT n.name, n.label, n.file_path, ' +
418
+ '(SELECT COUNT(*) FROM edges WHERE source_id=n.id OR target_id=n.id) AS deg ' +
419
+ 'FROM nodes n WHERE n.file_path IS NOT NULL AND n.file_path != "" ORDER BY deg DESC LIMIT 15'
420
+ ).all();
421
+ var typeRows = sumDb.prepare(
422
+ 'SELECT label, COUNT(*) AS c FROM nodes GROUP BY label ORDER BY c DESC LIMIT 8'
423
+ ).all();
424
+ var typeStr = typeRows.map(function(r) { return r.label + ':' + r.c; }).join(', ');
425
+ summaryText = [
426
+ 'MONOGRAPH KNOWLEDGE GRAPH SUMMARY',
427
+ 'Source: monograph.db | Nodes: ' + nodeC + ' | Edges: ' + edgeC,
428
+ '',
429
+ 'TOP GOD NODES (highest connectivity start exploration here):',
430
+ topNodes2.map(function(n) {
431
+ return ' ' + n.name + ' [' + n.label + '] — ' + (n.file_path || '') + ' (degree: ' + n.deg + ')';
432
+ }).join('\n'),
433
+ '',
434
+ 'NODE TYPE DISTRIBUTION: ' + typeStr,
435
+ '',
436
+ 'Before grepping or globbing, prefer:',
437
+ ' mcp__monomind__monograph_suggest({ task: "<your task>" }) — ranked relevant files',
438
+ ' mcp__monomind__monograph_query({ q: "<symbol|keyword>" }) BM25 search with file:line',
439
+ ' mcp__monomind__monograph_impact({ name: "<file>" }) upstream + downstream blast radius',
440
+ ].join('\n');
441
+ summaryMeta = { label: 'monograph-graph-summary', source: 'monograph.db', nodes: nodeC, edges: edgeC };
442
+ } finally {
443
+ try { sumDb.close(); } catch (_) {}
444
+ }
445
+ }
446
+ } catch (e) { /* fall through to legacy */ }
447
+ }
448
+
449
+ if (!summaryText && fs.existsSync(legacyStats2) && fs.existsSync(legacyGraph2)) {
450
+ try {
451
+ var lStats = JSON.parse(fs.readFileSync(legacyStats2, 'utf-8'));
452
+ var lGraphStat = fs.statSync(legacyGraph2);
453
+ if (lGraphStat.size < 10 * 1024 * 1024) {
454
+ var lGraph = JSON.parse(fs.readFileSync(legacyGraph2, 'utf-8'));
455
+ var lNodes = Array.isArray(lGraph.nodes) ? lGraph.nodes : [];
456
+ summaryText = 'MONOGRAPH KNOWLEDGE GRAPH SUMMARY (legacy JSON)\n' +
457
+ 'Nodes: ' + (lStats.nodes || lNodes.length) + ' | Edges: ' + (lStats.edges || 0) + '\n' +
458
+ 'Use mcp__monomind__monograph_suggest to find files relevant to your task.';
459
+ summaryMeta = { label: 'monograph-graph-summary', source: 'legacy-json', builtAt: lStats.builtAt };
460
+ }
461
+ } catch (e) { /* ignore */ }
462
+ }
463
+
464
+ if (summaryText) {
465
+ var chunkId = crypto.createHash('md5').update('monograph-graph-summary').digest('hex').slice(0, 16);
466
+ newLines.push(JSON.stringify({
467
+ chunkId: chunkId,
468
+ namespace: 'knowledge:shared',
469
+ text: summaryText,
470
+ metadata: summaryMeta
471
+ }));
350
472
  }
351
473
  } catch (e) { /* graph not available yet, skip */ }
352
474
 
@@ -639,13 +761,47 @@ const handlers = {
639
761
 
640
762
  console.log(output.join('\n'));
641
763
 
642
- // Inject monograph hint for complex tasks
764
+ // Inject monograph hint for complex tasks.
765
+ // Source of truth is .monomind/monograph.db (SQLite). Legacy stats.json
766
+ // is no longer written by the build, so it is checked only as a fallback.
643
767
  try {
644
- var graphStatsPath = path.join(CWD, '.monomind', 'graph', 'stats.json');
645
- if (fs.existsSync(graphStatsPath)) {
646
- var gStats = JSON.parse(fs.readFileSync(graphStatsPath, 'utf-8'));
647
- if (gStats.nodes > 100) {
648
- console.log('\n[MONOGRAPH] ' + gStats.nodes + ' nodes indexed. For this task, call mcp__monomind__monograph_suggest first.');
768
+ var monographDb = path.join(CWD, '.monomind', 'monograph.db');
769
+ var legacyStats = path.join(CWD, '.monomind', 'graph', 'stats.json');
770
+ var nodeCount = 0;
771
+ if (fs.existsSync(monographDb)) {
772
+ try {
773
+ var mgMod = _requireMonograph();
774
+ if (mgMod && mgMod.openDb) {
775
+ var hintDb = mgMod.openDb(monographDb);
776
+ try {
777
+ nodeCount = hintDb.prepare('SELECT COUNT(*) AS c FROM nodes').get().c;
778
+ } finally {
779
+ try { hintDb.close(); } catch (_) {}
780
+ }
781
+ }
782
+ } catch (e) { /* ignore — fall back to legacy */ }
783
+ }
784
+ if (nodeCount === 0 && fs.existsSync(legacyStats)) {
785
+ try {
786
+ var gStats = JSON.parse(fs.readFileSync(legacyStats, 'utf-8'));
787
+ nodeCount = gStats.nodes || 0;
788
+ } catch (e) { /* ignore */ }
789
+ }
790
+ if (nodeCount > 100) {
791
+ // Pre-resolve top-5 relevant files for the user's prompt — the LLM
792
+ // sees the answer inline instead of being told to call a tool.
793
+ var suggestions = getMonographSuggestions(prompt, 5);
794
+ if (suggestions.length > 0) {
795
+ console.log('\n[MONOGRAPH] ' + nodeCount + ' nodes indexed. Top files for this task (pre-resolved from graph):');
796
+ for (var si = 0; si < suggestions.length; si++) {
797
+ var s = suggestions[si];
798
+ console.log(' · ' + s.name + ' [' + s.label + '] — ' + (s.file || '') + ' (deg ' + s.deg + ')');
799
+ }
800
+ console.log(' Use mcp__monomind__monograph_query / monograph_impact for deeper drill-down.');
801
+ _recordGraphTelemetry('preresolve_hit');
802
+ } else {
803
+ console.log('\n[MONOGRAPH] ' + nodeCount + ' nodes indexed. Call mcp__monomind__monograph_suggest first to find relevant files without grepping.');
804
+ _recordGraphTelemetry('preresolve_miss');
649
805
  }
650
806
  }
651
807
  } catch(e) {}
@@ -743,6 +899,52 @@ const handlers = {
743
899
  console.log('[OK] Command validated');
744
900
  },
745
901
 
902
+ // Intercept Grep/Glob: run monograph_query on the same pattern first and
903
+ // surface graph hits so the LLM can read file:line directly without paying
904
+ // for a full Grep scan when the graph already knows the answer.
905
+ 'pre-search': () => {
906
+ try {
907
+ _recordGraphTelemetry(toolName === 'Grep' ? 'grep_call' : 'glob_call');
908
+ var pattern = toolInput.pattern || toolInput.path || '';
909
+ if (typeof pattern !== 'string' || pattern.length < 3) return;
910
+ var clean = pattern.replace(/[\\^$.*+?()\[\]{}|]/g, ' ').trim();
911
+ if (clean.length < 3) return;
912
+ var suggestions = getMonographSuggestions(clean, 5);
913
+ if (suggestions.length === 0) return;
914
+ console.log('[MONOGRAPH_HIT] Graph already knows ' + suggestions.length + ' file(s) matching "' + clean.slice(0, 40) + '":');
915
+ for (var i = 0; i < suggestions.length; i++) {
916
+ var s = suggestions[i];
917
+ console.log(' · ' + s.name + ' [' + s.label + '] — ' + (s.file || '') + ' (deg ' + s.deg + ')');
918
+ }
919
+ console.log(' Prefer mcp__monomind__monograph_query for symbol lookup (file:line, no scan).');
920
+ } catch (e) { /* non-fatal */ }
921
+ },
922
+
923
+ // After Read: append a graph neighbor footer so the LLM gets free
924
+ // architectural context — what imports this file and what it imports.
925
+ 'post-read': () => {
926
+ try {
927
+ var filePath = toolInput.file_path || toolInput.path || '';
928
+ if (!filePath || typeof filePath !== 'string') return;
929
+ var n = getMonographNeighbors(filePath);
930
+ if (!n) return;
931
+ var parts = [];
932
+ if (n.importedBy.length > 0) parts.push('imported-by: ' + n.importedBy.slice(0, 4).join(', '));
933
+ if (n.imports.length > 0) parts.push('imports: ' + n.imports.slice(0, 4).join(', '));
934
+ if (parts.length === 0) return;
935
+ console.log('[MONOGRAPH_NEIGHBORS] ' + parts.join(' · '));
936
+ } catch (e) { /* non-fatal */ }
937
+ },
938
+
939
+ // PostToolUse for monograph_* — increment graph usage counter for telemetry.
940
+ 'post-graph-tool': () => {
941
+ try {
942
+ if (toolName && toolName.indexOf('monograph_') !== -1) {
943
+ _recordGraphTelemetry('monograph_call');
944
+ }
945
+ } catch (e) {}
946
+ },
947
+
746
948
  'post-edit': async () => {
747
949
  if (session && session.metric) {
748
950
  try { session.metric('edits'); } catch (e) { /* no active session */ }
@@ -953,9 +1155,12 @@ const handlers = {
953
1155
  var mgNodeCount = mgDb.prepare('SELECT COUNT(*) AS c FROM nodes').get().c;
954
1156
  var mgEdgeCount = mgDb.prepare('SELECT COUNT(*) AS c FROM edges').get().c;
955
1157
  var mgGodNodes = mgDb.prepare(
956
- 'SELECT n.name, n.label, n.file_path, ' +
957
- '(SELECT COUNT(*) FROM edges WHERE source_id=n.id OR target_id=n.id) AS deg ' +
958
- 'FROM nodes n ORDER BY deg DESC LIMIT 12'
1158
+ "SELECT n.name, n.label, n.file_path, " +
1159
+ "(SELECT COUNT(*) FROM edges WHERE source_id=n.id OR target_id=n.id) AS deg " +
1160
+ "FROM nodes n " +
1161
+ "WHERE n.label NOT IN ('Concept') " +
1162
+ "AND n.file_path IS NOT NULL AND n.file_path != '' " +
1163
+ "ORDER BY deg DESC LIMIT 12"
959
1164
  ).all();
960
1165
  if (mgGodNodes.length > 0) {
961
1166
  var mgGodStr = mgGodNodes.slice(0, 8).map(function(n) {
@@ -696,6 +696,24 @@ function getGraphifyStats() {
696
696
  return { nodes: 0, edges: 0, exists: false };
697
697
  }
698
698
 
699
+ // Graph usage telemetry — ratio of monograph_* tool calls vs Grep/Glob
700
+ function getGraphUsage() {
701
+ const usagePath = path.join(CWD, '.monomind', 'metrics', 'graph-usage.json');
702
+ try {
703
+ if (!fs.existsSync(usagePath)) return null;
704
+ const d = JSON.parse(fs.readFileSync(usagePath, 'utf-8'));
705
+ const monograph = d.monograph_call || 0;
706
+ const search = (d.grep_call || 0) + (d.glob_call || 0);
707
+ const total = monograph + search;
708
+ if (total === 0) return null;
709
+ return {
710
+ monograph,
711
+ search,
712
+ pct: Math.round((monograph / total) * 100),
713
+ };
714
+ } catch { return null; }
715
+ }
716
+
699
717
  // Graph freshness — compare graph build time against most recent commit
700
718
  // Returns: { commitsBehind, stale } where stale = >5 commits or never built
701
719
  function getGraphFreshness() {
@@ -1239,7 +1257,15 @@ function generateDashboard() {
1239
1257
  loopStr = `${x.slate}🔄 no active loops${x.reset}`;
1240
1258
  }
1241
1259
 
1242
- lines.push(`${x.purple}🤖 AGENT${x.reset} ${agentStr} ${DIV} ${loopStr}`);
1260
+ // Graph usage ratio — show only when there's data
1261
+ const usage = getGraphUsage();
1262
+ let usageStr = '';
1263
+ if (usage) {
1264
+ const col = usage.pct >= 40 ? x.green : usage.pct >= 15 ? x.gold : x.coral;
1265
+ usageStr = ` ${DIV} ${col}📊 graph ${usage.pct}%${x.reset}${x.slate} · grep ${100 - usage.pct}%${x.reset}`;
1266
+ }
1267
+
1268
+ lines.push(`${x.purple}🤖 AGENT${x.reset} ${agentStr} ${DIV} ${loopStr}${usageStr}`);
1243
1269
  lines.push(SEP);
1244
1270
 
1245
1271
  // ── Row 2: Graph freshness + Pending HIL ─────────────────────
@@ -1 +1 @@
1
- {"version":3,"file":"settings-generator.d.ts","sourceRoot":"","sources":["../../../src/init/settings-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAA6B,MAAM,YAAY,CAAC;AAGzE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAmJ7D;AA+RD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAGjE"}
1
+ {"version":3,"file":"settings-generator.d.ts","sourceRoot":"","sources":["../../../src/init/settings-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAA6B,MAAM,YAAY,CAAC;AAGzE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAmJ7D;AAgUD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAGjE"}
@@ -233,6 +233,17 @@ function generateHooksConfig(config, graphify = true) {
233
233
  },
234
234
  ],
235
235
  },
236
+ // Grep/Glob → monograph_query intercept (saves tokens vs full scan)
237
+ {
238
+ matcher: 'Grep|Glob',
239
+ hooks: [
240
+ {
241
+ type: 'command',
242
+ command: hookHandlerCmd('pre-search'),
243
+ timeout: 4000,
244
+ },
245
+ ],
246
+ },
236
247
  ];
237
248
  }
238
249
  // PostToolUse — record edits and commands for session metrics / learning
@@ -258,6 +269,28 @@ function generateHooksConfig(config, graphify = true) {
258
269
  },
259
270
  ],
260
271
  },
272
+ // Read → graph neighbor footer
273
+ {
274
+ matcher: 'Read',
275
+ hooks: [
276
+ {
277
+ type: 'command',
278
+ command: hookHandlerCmd('post-read'),
279
+ timeout: 4000,
280
+ },
281
+ ],
282
+ },
283
+ // monograph_* tool calls → telemetry counter
284
+ {
285
+ matcher: 'mcp__monomind__monograph_.*',
286
+ hooks: [
287
+ {
288
+ type: 'command',
289
+ command: hookHandlerCmd('post-graph-tool'),
290
+ timeout: 2000,
291
+ },
292
+ ],
293
+ },
261
294
  ];
262
295
  }
263
296
  // UserPromptSubmit — intelligent task routing
@@ -1 +1 @@
1
- {"version":3,"file":"settings-generator.js","sourceRoot":"","sources":["../../../src/init/settings-generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"settings-generator.js","sourceRoot":"","sources":["../../../src/init/settings-generator.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"statusline-generator.d.ts","sourceRoot":"","sources":["../../../src/init/statusline-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAonCrE;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CA8BnE"}
1
+ {"version":3,"file":"statusline-generator.d.ts","sourceRoot":"","sources":["../../../src/init/statusline-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CA0oCrE;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CA8BnE"}
@@ -828,6 +828,20 @@ function getTriggerStats() {
828
828
  } catch { return { triggers: 0, agents: 0 }; }
829
829
  }
830
830
 
831
+ // Graph usage telemetry — ratio of monograph_* tool calls vs Grep/Glob
832
+ function getGraphUsage() {
833
+ const usagePath = path.join(CWD, '.monomind', 'metrics', 'graph-usage.json');
834
+ try {
835
+ if (!fs.existsSync(usagePath)) return null;
836
+ const d = JSON.parse(fs.readFileSync(usagePath, 'utf-8'));
837
+ const monograph = d.monograph_call || 0;
838
+ const search = (d.grep_call || 0) + (d.glob_call || 0);
839
+ const total = monograph + search;
840
+ if (total === 0) return null;
841
+ return { monograph: monograph, search: search, pct: Math.round((monograph / total) * 100) };
842
+ } catch { return null; }
843
+ }
844
+
831
845
  // Graph freshness — compare last build time vs commits since
832
846
  function getGraphFreshness() {
833
847
  const lockPath = path.join(CWD, '.monomind', 'graph', '.rebuild-lock');
@@ -1070,7 +1084,15 @@ function generateDashboard() {
1070
1084
  loopStr = \`\${x.slate}🔄 no active loops\${x.reset}\`;
1071
1085
  }
1072
1086
 
1073
- lines.push(\`\${x.purple}🤖 AGENT\${x.reset} \${agentStr} \${DIV} \${loopStr}\`);
1087
+ // Graph usage ratio — show only when there's data
1088
+ const usage = getGraphUsage();
1089
+ let usageStr = '';
1090
+ if (usage) {
1091
+ const col = usage.pct >= 40 ? x.green : usage.pct >= 15 ? x.gold : x.coral;
1092
+ usageStr = \` \${DIV} \${col}📊 graph \${usage.pct}%\${x.reset}\${x.slate} · grep \${100 - usage.pct}%\${x.reset}\`;
1093
+ }
1094
+
1095
+ lines.push(\`\${x.purple}🤖 AGENT\${x.reset} \${agentStr} \${DIV} \${loopStr}\${usageStr}\`);
1074
1096
  lines.push(SEP);
1075
1097
 
1076
1098
  // ── Row 2: Graph freshness + Pending HIL ─────────────────────
@@ -1 +1 @@
1
- {"version":3,"file":"statusline-generator.js","sourceRoot":"","sources":["../../../src/init/statusline-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH;;;;;;;;;GASG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAoB;IAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;IAC5C,OAAO;;;;;;;;;;;;;;;;;;;;;;;eAuBM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0lCvB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAoB;IACzD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAChC,OAAO,sCAAsC,CAAC;IAChD,CAAC;IAED,OAAO;;;;;;;;;;;;;;;;;;;;;;;;CAwBR,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"statusline-generator.js","sourceRoot":"","sources":["../../../src/init/statusline-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH;;;;;;;;;GASG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAoB;IAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;IAC5C,OAAO;;;;;;;;;;;;;;;;;;;;;;;eAuBM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgnCvB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAoB;IACzD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAChC,OAAO,sCAAsC,CAAC;IAChD,CAAC;IAED,OAAO;;;;;;;;;;;;;;;;;;;;;;;;CAwBR,CAAC;AACF,CAAC"}