monomind 1.18.13 → 1.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/core/researcher.md +29 -24
- package/.claude/agents/github/code-review-swarm.md +1 -1
- package/.claude/agents/github/github-modes.md +1 -1
- package/.claude/agents/github/issue-tracker.md +1 -1
- package/.claude/agents/github/multi-repo-swarm.md +1 -1
- package/.claude/agents/github/pr-manager.md +1 -1
- package/.claude/agents/github/project-board-sync.md +1 -1
- package/.claude/agents/github/release-manager.md +1 -1
- package/.claude/agents/github/repo-architect.md +1 -1
- package/.claude/agents/github/swarm-issue.md +1 -1
- package/.claude/agents/github/swarm-pr.md +1 -1
- package/.claude/agents/github/sync-coordinator.md +1 -1
- package/.claude/agents/github/workflow-automation.md +1 -1
- package/.claude/agents/goal/goal-planner.md +1 -1
- package/.claude/agents/specialized/specialized-workflow-architect.md +11 -14
- package/.claude/agents/testing/production-validator.md +8 -7
- package/.claude/agents/testing/testing-evidence-collector.md +3 -1
- package/.claude/commands/mastermind/_repeat.md +22 -3
- package/.claude/commands/mastermind/architect.md +1 -1
- package/.claude/commands/mastermind/autodev.md +1 -1
- package/.claude/commands/mastermind/build.md +1 -1
- package/.claude/commands/mastermind/code-review.md +5 -5
- package/.claude/commands/mastermind/debug.md +1 -1
- package/.claude/commands/mastermind/help.md +2 -2
- package/.claude/commands/mastermind/idea.md +1 -1
- package/.claude/commands/mastermind/improve.md +1 -1
- package/.claude/commands/mastermind/okf-export.md +14 -0
- package/.claude/commands/mastermind/okf-import.md +15 -0
- package/.claude/commands/mastermind/plan.md +1 -1
- package/.claude/commands/mastermind/research.md +1 -1
- package/.claude/commands/mastermind/review.md +12 -1
- package/.claude/commands/mastermind/runorg.md +1 -1
- package/.claude/commands/mastermind/taskdev.md +1 -1
- package/.claude/commands/mastermind/tdd.md +1 -1
- package/.claude/commands/mastermind/verify.md +1 -1
- package/.claude/helpers/graphify-freshen.cjs +16 -20
- package/.claude/helpers/handlers/agent-start-handler.cjs +11 -36
- package/.claude/helpers/handlers/capture-handler.cjs +110 -0
- package/.claude/helpers/handlers/route-handler.cjs +180 -256
- package/.claude/helpers/handlers/session-handler.cjs +139 -142
- package/.claude/helpers/handlers/session-restore-handler.cjs +15 -10
- package/.claude/helpers/handlers/task-handler.cjs +8 -155
- package/.claude/helpers/hook-handler.cjs +89 -5
- package/.claude/helpers/intelligence.cjs +164 -15
- package/.claude/helpers/learning-service.mjs +1 -0
- package/.claude/helpers/mastermind-activate.cjs +33 -51
- package/.claude/helpers/monolean-activate.cjs +13 -3
- package/.claude/helpers/monolean-propagate.cjs +7 -3
- package/.claude/helpers/router.cjs +47 -9
- package/.claude/helpers/utils/monograph.cjs +37 -20
- package/.claude/settings.json +0 -20
- package/.claude/skills/mastermind-skills/_repeat.md +29 -4
- package/.claude/skills/mastermind-skills/architect.md +5 -6
- package/.claude/skills/mastermind-skills/autodev.md +8 -5
- package/.claude/skills/mastermind-skills/review.md +25 -11
- package/.claude/skills/mastermind-skills/techport.md +37 -3
- package/.claude/skills/monodesign/document.md +9 -6
- package/.claude/skills/monodesign/extract.md +1 -1
- package/.claude/skills/monodesign/reference/document.md +1 -1
- package/.claude/skills/monodesign/reference/live.md +1 -1
- package/.claude/skills/monolean/SKILL.md +1 -1
- package/package.json +1 -1
- package/packages/@monomind/cli/.claude/agents/core/researcher.md +29 -24
- package/packages/@monomind/cli/.claude/agents/github/code-review-swarm.md +1 -1
- package/packages/@monomind/cli/.claude/agents/github/github-modes.md +1 -1
- package/packages/@monomind/cli/.claude/agents/github/issue-tracker.md +1 -1
- package/packages/@monomind/cli/.claude/agents/github/multi-repo-swarm.md +1 -1
- package/packages/@monomind/cli/.claude/agents/github/pr-manager.md +1 -1
- package/packages/@monomind/cli/.claude/agents/github/project-board-sync.md +1 -1
- package/packages/@monomind/cli/.claude/agents/github/release-manager.md +1 -1
- package/packages/@monomind/cli/.claude/agents/github/repo-architect.md +1 -1
- package/packages/@monomind/cli/.claude/agents/github/swarm-issue.md +1 -1
- package/packages/@monomind/cli/.claude/agents/github/swarm-pr.md +1 -1
- package/packages/@monomind/cli/.claude/agents/github/sync-coordinator.md +1 -1
- package/packages/@monomind/cli/.claude/agents/github/workflow-automation.md +1 -1
- package/packages/@monomind/cli/.claude/agents/goal/goal-planner.md +1 -1
- package/packages/@monomind/cli/.claude/agents/specialized/specialized-workflow-architect.md +11 -14
- package/packages/@monomind/cli/.claude/agents/testing/production-validator.md +8 -7
- package/packages/@monomind/cli/.claude/agents/testing/testing-evidence-collector.md +3 -1
- package/packages/@monomind/cli/.claude/commands/mastermind/_repeat.md +22 -3
- package/packages/@monomind/cli/.claude/commands/mastermind/architect.md +1 -1
- package/packages/@monomind/cli/.claude/commands/mastermind/autodev.md +1 -1
- package/packages/@monomind/cli/.claude/commands/mastermind/build.md +1 -1
- package/packages/@monomind/cli/.claude/commands/mastermind/code-review.md +5 -5
- package/packages/@monomind/cli/.claude/commands/mastermind/debug.md +1 -1
- package/packages/@monomind/cli/.claude/commands/mastermind/help.md +2 -2
- package/packages/@monomind/cli/.claude/commands/mastermind/idea.md +1 -1
- package/packages/@monomind/cli/.claude/commands/mastermind/improve.md +1 -1
- package/packages/@monomind/cli/.claude/commands/mastermind/okf-export.md +14 -0
- package/packages/@monomind/cli/.claude/commands/mastermind/okf-import.md +15 -0
- package/packages/@monomind/cli/.claude/commands/mastermind/plan.md +1 -1
- package/packages/@monomind/cli/.claude/commands/mastermind/research.md +1 -1
- package/packages/@monomind/cli/.claude/commands/mastermind/review.md +12 -1
- package/packages/@monomind/cli/.claude/commands/mastermind/runorg.md +1 -1
- package/packages/@monomind/cli/.claude/commands/mastermind/taskdev.md +1 -1
- package/packages/@monomind/cli/.claude/commands/mastermind/tdd.md +1 -1
- package/packages/@monomind/cli/.claude/commands/mastermind/verify.md +1 -1
- package/packages/@monomind/cli/.claude/helpers/graphify-freshen.cjs +16 -20
- package/packages/@monomind/cli/.claude/helpers/handlers/agent-start-handler.cjs +11 -36
- package/packages/@monomind/cli/.claude/helpers/handlers/capture-handler.cjs +110 -0
- package/packages/@monomind/cli/.claude/helpers/handlers/route-handler.cjs +180 -256
- package/packages/@monomind/cli/.claude/helpers/handlers/session-handler.cjs +139 -142
- package/packages/@monomind/cli/.claude/helpers/handlers/session-restore-handler.cjs +15 -10
- package/packages/@monomind/cli/.claude/helpers/handlers/task-handler.cjs +8 -155
- package/packages/@monomind/cli/.claude/helpers/hook-handler.cjs +89 -5
- package/packages/@monomind/cli/.claude/helpers/intelligence.cjs +164 -15
- package/packages/@monomind/cli/.claude/helpers/learning-service.mjs +1 -0
- package/packages/@monomind/cli/.claude/helpers/mastermind-activate.cjs +33 -51
- package/packages/@monomind/cli/.claude/helpers/monolean-activate.cjs +13 -3
- package/packages/@monomind/cli/.claude/helpers/monolean-propagate.cjs +7 -3
- package/packages/@monomind/cli/.claude/helpers/router.cjs +47 -9
- package/packages/@monomind/cli/.claude/helpers/utils/monograph.cjs +37 -20
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/_repeat.md +29 -4
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/architect.md +5 -6
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/autodev.md +8 -5
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/review.md +25 -11
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/techport.md +37 -3
- package/packages/@monomind/cli/.claude/skills/monodesign/document.md +9 -6
- package/packages/@monomind/cli/.claude/skills/monodesign/extract.md +1 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/reference/document.md +1 -1
- package/packages/@monomind/cli/.claude/skills/monodesign/reference/live.md +1 -1
- package/packages/@monomind/cli/.claude/skills/monolean/SKILL.md +1 -1
- package/packages/@monomind/cli/bin/mcp-server.js +11 -1
- package/packages/@monomind/cli/dist/src/commands/agent-ops.d.ts +1 -2
- package/packages/@monomind/cli/dist/src/commands/agent-ops.js +1 -59
- package/packages/@monomind/cli/dist/src/commands/agent.js +2 -3
- package/packages/@monomind/cli/dist/src/commands/analyze-diff.js +1 -1
- package/packages/@monomind/cli/dist/src/commands/browse-action.js +94 -2
- package/packages/@monomind/cli/dist/src/commands/completions.js +11 -56
- package/packages/@monomind/cli/dist/src/commands/doctor-project-checks.d.ts +1 -1
- package/packages/@monomind/cli/dist/src/commands/doctor-project-checks.js +1 -1
- package/packages/@monomind/cli/dist/src/commands/hive-mind-helpers.js +2 -2
- package/packages/@monomind/cli/dist/src/commands/hive-mind-ops.d.ts +1 -3
- package/packages/@monomind/cli/dist/src/commands/hive-mind-ops.js +2 -116
- package/packages/@monomind/cli/dist/src/commands/hive-mind.js +2 -5
- package/packages/@monomind/cli/dist/src/commands/hooks-coverage-commands.js +8 -7
- package/packages/@monomind/cli/dist/src/commands/hooks-coverage-gaps.js +1 -1
- package/packages/@monomind/cli/dist/src/commands/hooks-coverage-routing.js +2 -2
- package/packages/@monomind/cli/dist/src/commands/hooks-extended-commands.d.ts +0 -3
- package/packages/@monomind/cli/dist/src/commands/hooks-extended-commands.js +0 -307
- package/packages/@monomind/cli/dist/src/commands/hooks.js +1 -12
- package/packages/@monomind/cli/dist/src/commands/index.d.ts +3 -51
- package/packages/@monomind/cli/dist/src/commands/index.js +36 -184
- package/packages/@monomind/cli/dist/src/commands/init-wizard.js +2 -4
- package/packages/@monomind/cli/dist/src/commands/mcp.js +32 -4
- package/packages/@monomind/cli/dist/src/commands/memory-admin.d.ts +1 -2
- package/packages/@monomind/cli/dist/src/commands/memory-admin.js +1 -118
- package/packages/@monomind/cli/dist/src/commands/memory-transfer.d.ts +1 -2
- package/packages/@monomind/cli/dist/src/commands/memory-transfer.js +5 -171
- package/packages/@monomind/cli/dist/src/commands/memory.js +3 -6
- package/packages/@monomind/cli/dist/src/commands/neural-core.d.ts +3 -1
- package/packages/@monomind/cli/dist/src/commands/neural-core.js +145 -6
- package/packages/@monomind/cli/dist/src/commands/neural-optimize.js +4 -4
- package/packages/@monomind/cli/dist/src/commands/neural-registry.d.ts +1 -1
- package/packages/@monomind/cli/dist/src/commands/neural-registry.js +4 -4
- package/packages/@monomind/cli/dist/src/commands/neural.d.ts +1 -1
- package/packages/@monomind/cli/dist/src/commands/neural.js +6 -6
- package/packages/@monomind/cli/dist/src/commands/performance.js +68 -58
- package/packages/@monomind/cli/dist/src/commands/providers.js +2 -131
- package/packages/@monomind/cli/dist/src/commands/security-misc.d.ts +0 -1
- package/packages/@monomind/cli/dist/src/commands/security-misc.js +69 -45
- package/packages/@monomind/cli/dist/src/commands/security.js +2 -4
- package/packages/@monomind/cli/dist/src/commands/session.js +1 -285
- package/packages/@monomind/cli/dist/src/commands/start.js +2 -41
- package/packages/@monomind/cli/dist/src/commands/status.js +18 -29
- package/packages/@monomind/cli/dist/src/commands/swarm.js +1 -1
- package/packages/@monomind/cli/dist/src/commands/task.js +2 -49
- package/packages/@monomind/cli/dist/src/commands/workflow.js +2 -104
- package/packages/@monomind/cli/dist/src/index.js +7 -0
- package/packages/@monomind/cli/dist/src/init/executor.js +3 -14
- package/packages/@monomind/cli/dist/src/init/helpers-generator.js +2 -22
- package/packages/@monomind/cli/dist/src/init/settings-generator.js +0 -1
- package/packages/@monomind/cli/dist/src/init/types.d.ts +1 -3
- package/packages/@monomind/cli/dist/src/init/types.js +0 -2
- package/packages/@monomind/cli/dist/src/mcp-client.js +0 -6
- package/packages/@monomind/cli/dist/src/mcp-server.js +16 -0
- package/packages/@monomind/cli/dist/src/mcp-tools/agent-tools.js +0 -17
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence/causal-infer.d.ts +5 -5
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence/causal-infer.js +32 -46
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence/consensus-verify.d.ts +2 -3
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence/consensus-verify.js +22 -20
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence/memory-gate.d.ts +3 -2
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence/memory-gate.js +32 -19
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence/quantum-topology.d.ts +4 -4
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence/quantum-topology.js +11 -17
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence/spectral-analyze.d.ts +2 -3
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence/spectral-analyze.js +51 -32
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence/types.d.ts +5 -9
- package/packages/@monomind/cli/dist/src/mcp-tools/guidance-tools.js +2 -2
- package/packages/@monomind/cli/dist/src/mcp-tools/hive-mind-tools.js +25 -3
- package/packages/@monomind/cli/dist/src/mcp-tools/hooks-routing.d.ts +0 -3
- package/packages/@monomind/cli/dist/src/mcp-tools/hooks-routing.js +45 -159
- package/packages/@monomind/cli/dist/src/mcp-tools/hooks-tools.js +1 -4
- package/packages/@monomind/cli/dist/src/mcp-tools/index.d.ts +0 -2
- package/packages/@monomind/cli/dist/src/mcp-tools/index.js +0 -3
- package/packages/@monomind/cli/dist/src/mcp-tools/memory-tools.js +24 -0
- package/packages/@monomind/cli/dist/src/mcp-tools/monograph-tools.js +452 -7
- package/packages/@monomind/cli/dist/src/mcp-tools/neural-tools.d.ts +4 -10
- package/packages/@monomind/cli/dist/src/mcp-tools/neural-tools.js +28 -54
- package/packages/@monomind/cli/dist/src/mcp-tools/performance-tools.js +5 -17
- package/packages/@monomind/cli/dist/src/mcp-tools/quality/coverage-analysis/prioritize-gaps.js +2 -2
- package/packages/@monomind/cli/dist/src/mcp-tools/quality/security-compliance/detect-secrets.d.ts +4 -4
- package/packages/@monomind/cli/dist/src/mcp-tools/quality-tools.d.ts +7 -2
- package/packages/@monomind/cli/dist/src/mcp-tools/quality-tools.js +7 -257
- package/packages/@monomind/cli/dist/src/memory/intelligence.d.ts +7 -8
- package/packages/@monomind/cli/dist/src/memory/intelligence.js +15 -16
- package/packages/@monomind/cli/dist/src/memory/memory-bridge.d.ts +1 -0
- package/packages/@monomind/cli/dist/src/memory/memory-bridge.js +37 -0
- package/packages/@monomind/cli/dist/src/services/worker-daemon.d.ts +3 -21
- package/packages/@monomind/cli/dist/src/services/worker-daemon.js +13 -80
- package/packages/@monomind/cli/dist/src/suggest.js +0 -5
- package/packages/@monomind/cli/package.json +1 -1
- package/packages/@monomind/guidance/README.md +49 -1153
- package/packages/@monomind/guidance/package.json +1 -74
- package/.claude/helpers/auto-memory-hook.mjs +0 -503
- package/packages/@monomind/cli/.claude/helpers/auto-memory-hook.mjs +0 -503
- package/packages/@monomind/cli/dist/src/commands/deployment.d.ts +0 -10
- package/packages/@monomind/cli/dist/src/commands/deployment.js +0 -706
|
@@ -52,6 +52,16 @@ module.exports = {
|
|
|
52
52
|
|
|
53
53
|
if (intelligence && intelligence.getContext) {
|
|
54
54
|
try {
|
|
55
|
+
// Bootstrap intelligence from monograph on first prompt if store is sparse
|
|
56
|
+
if (intelligence.bootstrapFromDb) {
|
|
57
|
+
try {
|
|
58
|
+
var bDb = hCtx._openMonographDb();
|
|
59
|
+
if (bDb) {
|
|
60
|
+
var bootstrapped = intelligence.bootstrapFromDb(bDb);
|
|
61
|
+
if (bootstrapped > 0) console.log('[INTELLIGENCE] Bootstrapped ' + bootstrapped + ' hub nodes from knowledge graph');
|
|
62
|
+
}
|
|
63
|
+
} catch (e) { /* non-fatal */ }
|
|
64
|
+
}
|
|
55
65
|
const ctx = intelligence.getContext(prompt);
|
|
56
66
|
if (ctx) console.log(ctx);
|
|
57
67
|
} catch (e) { /* non-fatal */ }
|
|
@@ -60,284 +70,116 @@ module.exports = {
|
|
|
60
70
|
const routeFn = router.routeTaskSemantic || router.routeTask;
|
|
61
71
|
var result = await Promise.resolve(routeFn(prompt));
|
|
62
72
|
|
|
63
|
-
//
|
|
64
|
-
// non-dev specialist (marketing slugs etc) but monograph has a strong
|
|
65
|
-
// graph match for the prompt, derive the agent from the top file's
|
|
66
|
-
// label instead. Stops "improve the system" → China E-Commerce.
|
|
73
|
+
// ── Agent success pattern lookup ──────────────────────────
|
|
67
74
|
try {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
75
|
+
var patternDb = hCtx._openMonographDb();
|
|
76
|
+
if (patternDb) {
|
|
77
|
+
var cutoff = Date.now() - 30 * 86400000;
|
|
78
|
+
var patterns = patternDb.prepare(
|
|
79
|
+
'SELECT agent_type, COUNT(*) as total, SUM(CASE WHEN success=1 THEN 1 ELSE 0 END) as wins FROM agent_interactions WHERE timestamp > @cutoff GROUP BY agent_type HAVING total >= 3'
|
|
80
|
+
).all({ cutoff: cutoff });
|
|
81
|
+
if (patterns.length > 0) {
|
|
82
|
+
var patternMap = {};
|
|
83
|
+
for (var pi = 0; pi < patterns.length; pi++) {
|
|
84
|
+
patternMap[patterns[pi].agent_type] = {
|
|
85
|
+
total: patterns[pi].total,
|
|
86
|
+
successRate: Math.round(patterns[pi].wins / patterns[pi].total * 100)
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
var routedAgent = result.agent || 'coder';
|
|
90
|
+
var routedPattern = patternMap[routedAgent];
|
|
91
|
+
// Find if there's a clearly better agent
|
|
92
|
+
if (routedPattern && routedPattern.successRate < 50) {
|
|
93
|
+
var best = patterns.reduce(function(a, b) { return (b.wins/b.total) > (a.wins/a.total) ? b : a; });
|
|
94
|
+
if (best.wins / best.total > 0.8 && best.agent_type !== routedAgent) {
|
|
95
|
+
console.log('[AGENT_PATTERN] Historical: ' + best.agent_type + ' (' + Math.round(best.wins/best.total*100) + '% success, n=' + best.total + ') outperforms ' + routedAgent + ' (' + routedPattern.successRate + '%)');
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
result.historicalPattern = patternMap;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
} catch (e) { /* non-fatal — agent_interactions table may not exist */ }
|
|
80
102
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
var
|
|
85
|
-
|
|
86
|
-
(
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
var
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
var topDeg = topGraph.deg || 0;
|
|
107
|
-
var graphConf = topDeg > 30 ? 0.80 : (topDeg > 10 ? 0.75 : 0.70);
|
|
108
|
-
result = Object.assign({}, result, {
|
|
109
|
-
agent: agent,
|
|
110
|
-
agentSlug: agent,
|
|
111
|
-
confidence: graphConf,
|
|
112
|
-
reason: 'Graph fallback: top file ' + (topGraph.name || '').substring(0, 30) + ' [' + topGraph.label + '] deg=' + topDeg,
|
|
113
|
-
specificAgents: [],
|
|
114
|
-
extrasMatches: [],
|
|
115
|
-
});
|
|
103
|
+
// ── Routing feedback accuracy check ──────────────────────
|
|
104
|
+
try {
|
|
105
|
+
var rfPath = path.join(CWD, '.monomind', 'routing-feedback.jsonl');
|
|
106
|
+
var MAX_RF = 256 * 1024;
|
|
107
|
+
if (fs.existsSync(rfPath) && fs.statSync(rfPath).size <= MAX_RF) {
|
|
108
|
+
var rfLines = fs.readFileSync(rfPath, 'utf-8').trim().split('\n').filter(Boolean);
|
|
109
|
+
// Check last 50 entries for this agent's feedback
|
|
110
|
+
var routedAgent = result.agent || 'coder';
|
|
111
|
+
var recentRf = rfLines.slice(-50);
|
|
112
|
+
var agentFeedback = [];
|
|
113
|
+
for (var ri = 0; ri < recentRf.length; ri++) {
|
|
114
|
+
try {
|
|
115
|
+
var rfEntry = JSON.parse(recentRf[ri]);
|
|
116
|
+
if (rfEntry.suggestedAgent === routedAgent) {
|
|
117
|
+
agentFeedback.push(rfEntry.intelligenceFeedback);
|
|
118
|
+
}
|
|
119
|
+
} catch (e) {}
|
|
120
|
+
}
|
|
121
|
+
if (agentFeedback.length >= 3) {
|
|
122
|
+
var successes = agentFeedback.filter(function(f) { return f === true; }).length;
|
|
123
|
+
var accuracy = Math.round(successes / agentFeedback.length * 100);
|
|
124
|
+
if (accuracy < 60) {
|
|
125
|
+
console.log('[ROUTING] Warning: ' + routedAgent + ' routing accuracy ' + accuracy + '% over last ' + agentFeedback.length + ' sessions');
|
|
126
|
+
}
|
|
127
|
+
result.routingAccuracy = accuracy;
|
|
116
128
|
}
|
|
117
129
|
}
|
|
118
|
-
} catch (e) {}
|
|
130
|
+
} catch (e) { /* non-fatal */ }
|
|
131
|
+
|
|
132
|
+
// monolean: graph-fallback override removed — it compensated for bad agent
|
|
133
|
+
// recommendations that are no longer injected into context. The statusline
|
|
134
|
+
// just shows the keyword router's pick; no need for 50 lines of overrides.
|
|
119
135
|
|
|
120
136
|
var output = [];
|
|
121
|
-
// Skip the noisy "[INFO] Routing task: ..." prefix — it repeats the user's
|
|
122
|
-
// own words back and adds token overhead without helping Claude.
|
|
123
|
-
// Routing panel strategy:
|
|
124
|
-
// conf >= 0.90 → show primary recommendation (router is confident, trust it)
|
|
125
|
-
// conf < 0.90 → show category picker so Claude uses its own context to
|
|
126
|
-
// pick the right agent category + agent from a menu.
|
|
127
|
-
// Specific-agent panel is suppressed (category menu replaces it).
|
|
128
137
|
var conf = result.confidence != null ? result.confidence : 0;
|
|
129
|
-
var promptShort = (prompt || '').trim().length < 60;
|
|
130
|
-
var lowConf = conf < 0.70;
|
|
131
|
-
var suppressPanel = lowConf && promptShort;
|
|
132
|
-
|
|
133
|
-
// Agent category menu — shown when conf < 0.90 so Claude picks with context.
|
|
134
|
-
var AGENT_CATEGORIES = [
|
|
135
|
-
{ label: 'CORE', agents: 'coder · reviewer · tester · planner · researcher' },
|
|
136
|
-
{ label: 'BACKEND', agents: 'backend-dev · Backend Architect · DB Optimizer' },
|
|
137
|
-
{ label: 'FRONTEND', agents: 'Frontend Developer · mobile-dev' },
|
|
138
|
-
{ label: 'ARCH', agents: 'Software Architect · system-architect' },
|
|
139
|
-
{ label: 'SECURITY', agents: 'Security Engineer · security-architect' },
|
|
140
|
-
{ label: 'AI/ML', agents: 'AI Engineer · ml-developer · Data Engineer' },
|
|
141
|
-
{ label: 'DEVOPS', agents: 'DevOps Automator · SRE · cicd-engineer' },
|
|
142
|
-
{ label: 'DOCS', agents: 'Technical Writer · api-docs' },
|
|
143
|
-
{ divider: 'Non-Coding Agents' },
|
|
144
|
-
{ label: 'PRODUCT', agents: 'Product Manager · Launch Strategist · CRO Spec.' },
|
|
145
|
-
{ label: 'MARKETING', agents: 'Content Creator · SEO Specialist · Growth Hacker' },
|
|
146
|
-
{ label: 'SOCIAL', agents: 'TikTok · LinkedIn · Twitter · Instagram Strat.' },
|
|
147
|
-
{ label: 'SALES', agents: 'Deal Strategist · Sales Coach · Outbound Strat.' },
|
|
148
|
-
{ label: 'BUSINESS', agents: 'Finance Tracker · Legal Compliance · Analytics' },
|
|
149
|
-
{ label: 'DESIGN', agents: 'Monodesign (UI/UX · brand · CSS · animation)' },
|
|
150
|
-
];
|
|
151
|
-
|
|
152
|
-
if (conf >= 0.90) {
|
|
153
|
-
output.push('+------------- monomind | Primary Recommendation --------------+');
|
|
154
|
-
output.push('| Agent: ' + (result.agent || 'unknown').substring(0, 54).padEnd(54) + '|');
|
|
155
|
-
output.push('| Confidence: ' + ((result.confidence != null ? (result.confidence * 100).toFixed(1) : '?') + '%').padEnd(49) + '|');
|
|
156
|
-
output.push('| Reason: ' + (result.reason || '').substring(0, 53).padEnd(53) + '|');
|
|
157
|
-
output.push('+--------------------------------------------------------------+');
|
|
158
|
-
} else if (!suppressPanel) {
|
|
159
|
-
output.push('+------- monomind | Agent Category Picker ---------------------+');
|
|
160
|
-
output.push('| ' + ('Conf: ' + (conf * 100).toFixed(0) + '% — router uncertain. YOU choose using context.').padEnd(60) + ' |');
|
|
161
|
-
output.push('+--------------------------------------------------------------+');
|
|
162
|
-
AGENT_CATEGORIES.forEach(function(cat) {
|
|
163
|
-
if (cat.divider) {
|
|
164
|
-
var d = '- ' + cat.divider + ' ';
|
|
165
|
-
output.push('|' + d.padEnd(31, '-') + ''.padEnd(31, '-') + '|');
|
|
166
|
-
} else {
|
|
167
|
-
output.push('| ' + cat.label.padEnd(10) + cat.agents.substring(0, 50).padEnd(50) + ' |');
|
|
168
|
-
}
|
|
169
|
-
});
|
|
170
|
-
output.push('+--------------------------------------------------------------+');
|
|
171
|
-
output.push('| INSTRUCTION: Read your conversation context. Identify the |');
|
|
172
|
-
output.push('| best-fit category above, then pick one agent from it and |');
|
|
173
|
-
output.push('| spawn it via Task({ subagent_type: "name" }). If no agent |');
|
|
174
|
-
output.push('| fits the task, skip and proceed directly. Do this now. |');
|
|
175
|
-
output.push('+--------------------------------------------------------------+');
|
|
176
|
-
}
|
|
177
138
|
|
|
178
139
|
// ── Persist routing result for statusline display ─────────────
|
|
179
140
|
try {
|
|
180
141
|
var routeDir = path.join(CWD, '.monomind');
|
|
181
142
|
fs.mkdirSync(routeDir, { recursive: true });
|
|
182
|
-
// When confidence < 90% and the router picked a non-dev agent without
|
|
183
|
-
// a graph override, don't persist the wrong specialist — show "AI" instead.
|
|
184
|
-
var confForPersist = result.confidence != null ? result.confidence : 0;
|
|
185
|
-
var devAgentsForPersist = /^(coder|tester|reviewer|planner|researcher|system-architect|backend-dev|backend-architect|mobile-dev|ml-developer|cicd-engineer|api-docs|code-analyzer|production-validator|Technical Writer|Software Architect|Frontend Developer|AI Engineer|Data Engineer|Security Engineer|DevOps Automator|SRE)$/i;
|
|
186
|
-
var persistedIsNonDev = !devAgentsForPersist.test(String(result.agent || '').trim());
|
|
187
|
-
var resolvedAgent = result.agent;
|
|
188
|
-
var resolvedFromExtras = false;
|
|
189
|
-
if (!resolvedAgent || resolvedAgent === 'extras') {
|
|
190
|
-
var topExtra = result.extrasMatches && result.extrasMatches[0];
|
|
191
|
-
resolvedAgent = topExtra ? topExtra.name : 'Specialist Agent';
|
|
192
|
-
resolvedFromExtras = true;
|
|
193
|
-
}
|
|
194
|
-
// If router was uncertain (< 90%) and picked a non-dev specialist,
|
|
195
|
-
// show "AI selecting" in statusline rather than the wrong agent.
|
|
196
|
-
// Exception: when agent was explicitly 'extras' and we resolved from extrasMatches,
|
|
197
|
-
// trust that resolution — the domain specialist was explicitly matched.
|
|
198
|
-
if (!resolvedFromExtras && confForPersist < 0.90 && persistedIsNonDev && !String(result.reason || '').startsWith('Graph fallback')) {
|
|
199
|
-
resolvedAgent = 'AI selecting';
|
|
200
|
-
}
|
|
201
|
-
var routePayload = {
|
|
202
|
-
agent: resolvedAgent,
|
|
203
|
-
agentSlug: result.agentSlug || null,
|
|
204
|
-
confidence: result.confidence,
|
|
205
|
-
reason: result.reason,
|
|
206
|
-
semanticRouting: result.semanticRouting || false,
|
|
207
|
-
llmRouting: result.llmRouting || false,
|
|
208
|
-
updatedAt: new Date().toISOString(),
|
|
209
|
-
};
|
|
210
|
-
if (result.extrasMatches && result.extrasMatches.length > 0) {
|
|
211
|
-
routePayload.extrasMatches = result.extrasMatches.map(function(e) {
|
|
212
|
-
return { name: e.name, slug: e.slug, category: e.category };
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
143
|
fs.writeFileSync(
|
|
216
144
|
path.join(routeDir, 'last-route.json'),
|
|
217
|
-
JSON.stringify(
|
|
145
|
+
JSON.stringify({
|
|
146
|
+
agent: result.agent || 'coder',
|
|
147
|
+
agentSlug: result.agentSlug || null,
|
|
148
|
+
confidence: result.confidence,
|
|
149
|
+
reason: result.reason,
|
|
150
|
+
prompt: (prompt || '').slice(0, 500),
|
|
151
|
+
historicalPattern: result.historicalPattern || null,
|
|
152
|
+
updatedAt: new Date().toISOString(),
|
|
153
|
+
}),
|
|
218
154
|
'utf-8'
|
|
219
155
|
);
|
|
220
156
|
} catch (e) { /* non-fatal */ }
|
|
221
157
|
|
|
222
|
-
// ──
|
|
158
|
+
// ── Skill auto-activation (the one thing the hook does better than Claude) ──
|
|
223
159
|
var matches = result.skillMatches || [];
|
|
224
160
|
if (matches.length > 0) {
|
|
225
|
-
// Check for high-confidence auto-invoke: if top skill scored >= 3 keyword
|
|
226
|
-
// hits and is the dominant match, auto-invoke instead of just suggesting
|
|
227
161
|
var topMatch = matches[0];
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
autoInvoke = true;
|
|
234
|
-
}
|
|
162
|
+
// Auto-activate when one skill clearly dominates:
|
|
163
|
+
// - score >= 2 with at most 2 matches (strong multi-keyword signal), or
|
|
164
|
+
// - single match with score >= 2 and low agent confidence (skill is better fit)
|
|
165
|
+
var autoInvoke = (topMatch && topMatch.score >= 2 && matches.length <= 2) ||
|
|
166
|
+
(topMatch && topMatch.score >= 2 && matches.length === 1 && conf < 0.7);
|
|
235
167
|
|
|
236
168
|
if (autoInvoke) {
|
|
237
|
-
output.push('');
|
|
238
|
-
output.push('
|
|
239
|
-
output.push('
|
|
240
|
-
output.push('| INSTRUCTION: Invoke ' + topMatch.invoke.substring(0, 41).padEnd(41) + '|');
|
|
241
|
-
output.push('| BEFORE responding. This skill matched with very high |');
|
|
242
|
-
output.push('| confidence — do not skip it. |');
|
|
243
|
-
output.push('+==============================================================+');
|
|
169
|
+
output.push('+======== SKILL AUTO-ACTIVATED ========+');
|
|
170
|
+
output.push('| ' + topMatch.invoke.padEnd(36) + ' |');
|
|
171
|
+
output.push('+======================================+');
|
|
244
172
|
} else {
|
|
245
|
-
output.push('');
|
|
246
|
-
if ((result.confidence ?? 0) < 0.8) {
|
|
247
|
-
output.push('+----------- Skill Suggestions (pick one if relevant) ---------+');
|
|
248
|
-
output.push('| No strong primary match — here are the best skill candidates |');
|
|
249
|
-
} else {
|
|
250
|
-
output.push('+----------- Matching Skills (invoke via Skill tool) ----------+');
|
|
251
|
-
}
|
|
173
|
+
output.push('+----------- Matching Skills (invoke via Skill tool) ----------+');
|
|
252
174
|
matches.forEach(function(m, i) {
|
|
253
|
-
|
|
254
|
-
var desc = (m.description || '').substring(0, 30);
|
|
255
|
-
var line = '| ' + label.substring(0, 30).padEnd(30) + desc.padEnd(30) + ' |';
|
|
256
|
-
output.push(line);
|
|
175
|
+
output.push('| ' + (i + 1) + '. ' + m.skill.padEnd(28) + (m.description || '').substring(0, 30).padEnd(30) + ' |');
|
|
257
176
|
output.push('| invoke: ' + m.invoke.substring(0, 51).padEnd(51) + '|');
|
|
258
177
|
});
|
|
259
178
|
output.push('+--------------------------------------------------------------+');
|
|
260
|
-
if ((result.confidence ?? 0) < 0.8) {
|
|
261
|
-
output.push('| To use a skill: call Skill("skill-name") before responding. |');
|
|
262
|
-
output.push('+--------------------------------------------------------------+');
|
|
263
|
-
}
|
|
264
179
|
}
|
|
265
180
|
}
|
|
266
181
|
|
|
267
|
-
|
|
268
|
-
// Skip entirely on suppressed (low-confidence + short) prompts.
|
|
269
|
-
var specificAgents = result.specificAgents || [];
|
|
270
|
-
if (specificAgents.length > 0 && !suppressPanel && conf >= 0.90) {
|
|
271
|
-
output.push('');
|
|
272
|
-
var saHdr = '------- Specific Agents (' + specificAgents.length + ' available) ';
|
|
273
|
-
output.push('+' + saHdr + '-'.repeat(Math.max(1, 62 - saHdr.length)) + '+');
|
|
274
|
-
specificAgents.forEach(function(a, i) {
|
|
275
|
-
var label = (i + 1) + '. ' + a.label;
|
|
276
|
-
var note = (a.note || '').substring(0, 26);
|
|
277
|
-
output.push('| ' + label.substring(0, 33).padEnd(33) + note.padEnd(27) + ' |');
|
|
278
|
-
if (a.slug) {
|
|
279
|
-
output.push('| slug: ' + a.slug.substring(0, 52).padEnd(52) + ' |');
|
|
280
|
-
}
|
|
281
|
-
});
|
|
282
|
-
output.push('+--------------------------------------------------------------+');
|
|
283
|
-
output.push('| Use: Task({ subagent_type: "<slug>" }) or /specialagent |');
|
|
284
|
-
output.push('+--------------------------------------------------------------+');
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
// ── Specialist agents (non-dev domain) — only shown when specificAgents panel wasn't shown ──
|
|
288
|
-
var extras = result.extrasMatches || [];
|
|
289
|
-
var specificAgentsShown = (result.specificAgents || []).length > 0 && conf >= 0.90;
|
|
290
|
-
if (extras.length > 0 && !specificAgentsShown && !suppressPanel) {
|
|
291
|
-
output.push('');
|
|
292
|
-
var spHdr = '------- Specialist Agents (' + extras.length + ' matched) ';
|
|
293
|
-
output.push('+' + spHdr + '-'.repeat(Math.max(1, 62 - spHdr.length)) + '+');
|
|
294
|
-
extras.slice(0, 5).forEach(function(e, i) {
|
|
295
|
-
var label = (i + 1) + '. ' + e.name;
|
|
296
|
-
var cat = '[' + e.category + ']';
|
|
297
|
-
output.push('| ' + label.substring(0, 44).padEnd(44) + cat.substring(0, 16).padEnd(16) + ' |');
|
|
298
|
-
output.push('| slug: ' + e.slug.substring(0, 52).padEnd(52) + ' |');
|
|
299
|
-
});
|
|
300
|
-
output.push('+--------------------------------------------------------------+');
|
|
301
|
-
output.push('| Use: Task({ subagent_type: "<slug>" }) or /specialagent |');
|
|
302
|
-
output.push('+--------------------------------------------------------------+');
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
// ── MicroAgent Trigger Scan (Task 32) ──────────────────────────────
|
|
306
|
-
try {
|
|
307
|
-
var triggerResult = hCtx.scanMicroAgentTriggers(typeof prompt === 'string' ? prompt : '');
|
|
308
|
-
if (triggerResult.matches.length > 0) {
|
|
309
|
-
output.push('');
|
|
310
|
-
if (triggerResult.takeoverAgent) {
|
|
311
|
-
var tAgent = triggerResult.takeoverAgent;
|
|
312
|
-
var tKw = triggerResult.matches[0].matchedText;
|
|
313
|
-
output.push('+============= MicroAgent TAKEOVER Detected ===================+');
|
|
314
|
-
output.push('| Specialist: ' + tAgent.substring(0, 49).padEnd(49) + '|');
|
|
315
|
-
output.push('| Keyword: ' + ('"' + tKw + '"').substring(0, 49).padEnd(49) + '|');
|
|
316
|
-
output.push('| Recommended: use this specialist instead of primary agent. |');
|
|
317
|
-
output.push('+==============================================================+');
|
|
318
|
-
} else {
|
|
319
|
-
output.push('+------- MicroAgent Specialists Triggered ---------------------+');
|
|
320
|
-
triggerResult.matches.forEach(function(m) {
|
|
321
|
-
var slug = m.agentSlug.substring(0, 37).padEnd(37);
|
|
322
|
-
var kw = ('(match: "' + m.matchedText + '")').substring(0, 21).padEnd(21);
|
|
323
|
-
output.push('| + ' + slug + kw + ' |');
|
|
324
|
-
});
|
|
325
|
-
output.push('+--------------------------------------------------------------+');
|
|
326
|
-
}
|
|
327
|
-
// Persist trigger matches alongside route result
|
|
328
|
-
try {
|
|
329
|
-
var routeFile = path.join(CWD, '.monomind', 'last-route.json');
|
|
330
|
-
var routeSt = fs.statSync(routeFile);
|
|
331
|
-
if (routeSt.size <= 1024 * 1024) {
|
|
332
|
-
var existing = JSON.parse(fs.readFileSync(routeFile, 'utf-8'));
|
|
333
|
-
existing.microAgents = { injectAgents: triggerResult.injectAgents || [], takeoverAgent: triggerResult.takeoverAgent || null };
|
|
334
|
-
fs.writeFileSync(routeFile, JSON.stringify(existing), 'utf-8');
|
|
335
|
-
}
|
|
336
|
-
} catch (e) {}
|
|
337
|
-
}
|
|
338
|
-
} catch (e) { /* non-fatal */ }
|
|
339
|
-
|
|
340
|
-
console.log(output.join('\n'));
|
|
182
|
+
if (output.length > 0) console.log(output.join('\n'));
|
|
341
183
|
|
|
342
184
|
// Record any decision markers in this prompt (auto-ADR pipeline).
|
|
343
185
|
try { hCtx._recordDecisionMarkers(prompt); } catch (e) {}
|
|
@@ -357,21 +199,103 @@ module.exports = {
|
|
|
357
199
|
}
|
|
358
200
|
} catch (e) {}
|
|
359
201
|
|
|
202
|
+
// ── Surface daemon metrics warnings (hook latency, token spikes) ──
|
|
203
|
+
try {
|
|
204
|
+
var metricsDir = path.join(CWD, '.monomind', 'metrics');
|
|
205
|
+
// Hook latency warnings
|
|
206
|
+
var latencyFile = path.join(metricsDir, 'hook-latency.json');
|
|
207
|
+
if (fs.existsSync(latencyFile) && fs.statSync(latencyFile).size < 32768) {
|
|
208
|
+
var latencyData = JSON.parse(fs.readFileSync(latencyFile, 'utf-8'));
|
|
209
|
+
if (latencyData && latencyData.avgMs > 500) {
|
|
210
|
+
console.log('[PERF] Hook latency avg ' + Math.round(latencyData.avgMs) + 'ms (target <500ms). Slowest: ' + (latencyData.slowest || 'unknown'));
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// Token usage check — surface only when spend is high
|
|
214
|
+
var tokenFile = path.join(metricsDir, 'token-summary.json');
|
|
215
|
+
if (fs.existsSync(tokenFile) && fs.statSync(tokenFile).size < 32768) {
|
|
216
|
+
var tokenData = JSON.parse(fs.readFileSync(tokenFile, 'utf-8'));
|
|
217
|
+
if (tokenData && tokenData.todayCost > 50) {
|
|
218
|
+
console.log('[COST] Today: $' + (tokenData.todayCost || 0).toFixed(2) + ' (' + (tokenData.todayCalls || 0) + ' calls)');
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
// Security audit findings
|
|
222
|
+
var secAuditFile = path.join(metricsDir, 'security-audit.json');
|
|
223
|
+
if (fs.existsSync(secAuditFile) && fs.statSync(secAuditFile).size < 32768) {
|
|
224
|
+
var secData = JSON.parse(fs.readFileSync(secAuditFile, 'utf-8'));
|
|
225
|
+
if (secData && secData.findings && secData.findings.length > 0) {
|
|
226
|
+
console.log('[SECURITY] ' + secData.findings.length + ' findings from background scan. Review .monomind/metrics/security-audit.json');
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
// Codebase map hotspots
|
|
230
|
+
var mapFile = path.join(metricsDir, 'codebase-map.json');
|
|
231
|
+
if (fs.existsSync(mapFile) && fs.statSync(mapFile).size < 32768) {
|
|
232
|
+
var mapData = JSON.parse(fs.readFileSync(mapFile, 'utf-8'));
|
|
233
|
+
if (mapData && mapData.hotspots && mapData.hotspots.length > 0) {
|
|
234
|
+
console.log('[CODEBASE] ' + mapData.hotspots.length + ' hotspots detected. Top: ' + (mapData.hotspots[0].file || mapData.hotspots[0].name || 'unknown'));
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
} catch (e) { /* non-fatal */ }
|
|
238
|
+
|
|
239
|
+
// ── Memory: surface relevant past session context ──────────
|
|
240
|
+
try {
|
|
241
|
+
var epFile = path.join(CWD, '.monomind', 'episodic', 'episodes.jsonl');
|
|
242
|
+
var MAX_EP = 256 * 1024;
|
|
243
|
+
if (fs.existsSync(epFile) && fs.statSync(epFile).size <= MAX_EP) {
|
|
244
|
+
var epRaw = fs.readFileSync(epFile, 'utf-8').trim().split('\n').filter(Boolean);
|
|
245
|
+
if (epRaw.length > 0) {
|
|
246
|
+
// Simple keyword matching against episode summaries
|
|
247
|
+
var promptLower = (prompt || '').toLowerCase();
|
|
248
|
+
var promptTokens = promptLower.match(/[a-z][a-z0-9_-]{2,}/g) || [];
|
|
249
|
+
if (promptTokens.length > 0) {
|
|
250
|
+
var matches = [];
|
|
251
|
+
// Only search last 200 episodes
|
|
252
|
+
var searchEps = epRaw.slice(-200);
|
|
253
|
+
for (var ei = 0; ei < searchEps.length; ei++) {
|
|
254
|
+
try {
|
|
255
|
+
var ep = JSON.parse(searchEps[ei]);
|
|
256
|
+
var sumLower = (ep.summary || '').toLowerCase();
|
|
257
|
+
// Skip if from current session
|
|
258
|
+
var currentSessId = process.env.CLAUDE_SESSION_ID || '';
|
|
259
|
+
if (ep.sessionId === currentSessId) continue;
|
|
260
|
+
// Count keyword overlap
|
|
261
|
+
var hits = 0;
|
|
262
|
+
for (var ti = 0; ti < promptTokens.length; ti++) {
|
|
263
|
+
if (sumLower.includes(promptTokens[ti])) hits++;
|
|
264
|
+
}
|
|
265
|
+
var relevance = promptTokens.length > 0 ? hits / promptTokens.length : 0;
|
|
266
|
+
if (relevance >= 0.3 && hits >= 2) {
|
|
267
|
+
matches.push({ summary: (ep.summary || '').slice(0, 120), relevance: relevance, ts: ep.endedAt || 0 });
|
|
268
|
+
}
|
|
269
|
+
} catch (e) {}
|
|
270
|
+
}
|
|
271
|
+
// Show top 2 most relevant matches
|
|
272
|
+
if (matches.length > 0) {
|
|
273
|
+
matches.sort(function(a, b) { return b.relevance - a.relevance; });
|
|
274
|
+
var topMatches = matches.slice(0, 2);
|
|
275
|
+
var memLines = ['[MEMORY] Relevant past sessions:'];
|
|
276
|
+
for (var mi = 0; mi < topMatches.length; mi++) {
|
|
277
|
+
var ago = topMatches[mi].ts ? Math.round((Date.now() - topMatches[mi].ts) / 3600000) + 'h ago' : '';
|
|
278
|
+
memLines.push(' ' + topMatches[mi].summary.replace(/\n/g, ' ').trim() + (ago ? ' (' + ago + ')' : ''));
|
|
279
|
+
}
|
|
280
|
+
console.log(memLines.join('\n'));
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
} catch (e) { /* non-fatal */ }
|
|
286
|
+
|
|
360
287
|
// Inject monograph hint for complex tasks.
|
|
361
288
|
// Source of truth is .monomind/monograph.db (SQLite). Legacy stats.json
|
|
362
289
|
// is no longer written by the build, so it is checked only as a fallback.
|
|
363
290
|
try {
|
|
364
|
-
var monographDb = path.join(CWD, '.monomind', 'monograph.db');
|
|
365
291
|
var legacyStats = path.join(CWD, '.monomind', 'graph', 'stats.json');
|
|
366
292
|
var nodeCount = 0;
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
} catch (e) { /* ignore — fall back to legacy */ }
|
|
374
|
-
}
|
|
293
|
+
try {
|
|
294
|
+
var hintDb = hCtx._openMonographDb();
|
|
295
|
+
if (hintDb) {
|
|
296
|
+
nodeCount = hintDb.prepare('SELECT COUNT(*) AS c FROM nodes').get().c;
|
|
297
|
+
}
|
|
298
|
+
} catch (e) { /* ignore — fall back to legacy */ }
|
|
375
299
|
if (nodeCount === 0 && fs.existsSync(legacyStats)) {
|
|
376
300
|
try {
|
|
377
301
|
var legacyStatsSt = fs.statSync(legacyStats);
|