monomind 2.7.4 → 2.7.5
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/package.json +1 -1
- package/packages/@monomind/cli/bin/cli.js +17 -1
- package/packages/@monomind/cli/dist/src/commands/doctor-project-checks.d.ts +3 -0
- package/packages/@monomind/cli/dist/src/commands/doctor-project-checks.js +81 -8
- package/packages/@monomind/cli/dist/src/commands/doctor.js +16 -2
- package/packages/@monomind/cli/dist/src/commands/memory-crud.js +15 -5
- package/packages/@monomind/cli/dist/src/commands/security-misc.js +7 -2
- package/packages/@monomind/cli/dist/src/init/helpers-generator.js +5 -0
- package/packages/@monomind/cli/dist/src/mcp-client.js +0 -2
- package/packages/@monomind/cli/dist/src/mcp-tools/agent-tools.js +1 -1
- package/packages/@monomind/cli/dist/src/mcp-tools/embeddings-tools.d.ts +2 -0
- package/packages/@monomind/cli/dist/src/mcp-tools/embeddings-tools.js +11 -1
- package/packages/@monomind/cli/dist/src/mcp-tools/guidance-tools.js +17 -17
- package/packages/@monomind/cli/dist/src/mcp-tools/hive-mind-tools.d.ts +2 -0
- package/packages/@monomind/cli/dist/src/mcp-tools/hive-mind-tools.js +14 -2
- package/packages/@monomind/cli/dist/src/mcp-tools/index.d.ts +0 -1
- package/packages/@monomind/cli/dist/src/mcp-tools/index.js +0 -1
- package/packages/@monomind/cli/dist/src/mcp-tools/monograph-tools.js +1 -2
- package/packages/@monomind/cli/dist/src/mcp-tools/neural-tools.js +1 -1
- package/packages/@monomind/cli/dist/src/mcp-tools/swarm-tools.js +2 -2
- package/packages/@monomind/cli/dist/src/mcp-tools/transfer-tools.d.ts +2 -0
- package/packages/@monomind/cli/dist/src/mcp-tools/transfer-tools.js +11 -1
- package/packages/@monomind/cli/dist/src/ui/dashboard.html +44 -618
- package/packages/@monomind/cli/dist/src/ui/server.mjs +0 -275
- package/packages/@monomind/cli/dist/src/utils/cosine-similarity.d.ts +2 -2
- package/packages/@monomind/cli/dist/src/utils/cosine-similarity.js +2 -2
- package/packages/@monomind/cli/package.json +1 -1
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence/causal-infer.d.ts +0 -15
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence/causal-infer.js +0 -333
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence/coherence-check.d.ts +0 -15
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence/coherence-check.js +0 -188
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence/consensus-verify.d.ts +0 -14
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence/consensus-verify.js +0 -305
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence/memory-gate.d.ts +0 -16
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence/memory-gate.js +0 -279
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence/quantum-topology.d.ts +0 -15
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence/quantum-topology.js +0 -400
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence/spectral-analyze.d.ts +0 -14
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence/spectral-analyze.js +0 -312
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence/types.d.ts +0 -430
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence/types.js +0 -144
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence-tools.d.ts +0 -9
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence-tools.js +0 -25
- package/packages/@monomind/cli/dist/src/mcp-tools/daa-tools.d.ts +0 -13
- package/packages/@monomind/cli/dist/src/mcp-tools/daa-tools.js +0 -553
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "monomind",
|
|
3
|
-
"version": "2.7.
|
|
3
|
+
"version": "2.7.5",
|
|
4
4
|
"description": "Open-source CLI extension for Claude Code. Adds an MCP server with a codebase knowledge graph, persistent memory, multi-agent coordination, and reusable slash commands. MIT licensed, runs locally, no data leaves your machine.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -287,7 +287,23 @@ if (isMCPMode) {
|
|
|
287
287
|
const isDaemonChild = cliArgs.includes('--foreground-worker-internal');
|
|
288
288
|
cli.run().then(() => {
|
|
289
289
|
if (!isDaemonChild) {
|
|
290
|
-
process.exit(
|
|
290
|
+
// Prefer a natural exit over process.exit(). Any command that touched
|
|
291
|
+
// embeddings has onnxruntime-node's thread pool loaded in-process (via
|
|
292
|
+
// memory-bridge -> @huggingface/transformers), and forcing exit out from
|
|
293
|
+
// under it aborts the process:
|
|
294
|
+
// libc++abi: terminating due to uncaught exception of type
|
|
295
|
+
// std::__1::system_error: mutex lock failed: Invalid argument
|
|
296
|
+
// — an exit code of 134 on `doctor`, `memory store`, `memory search`,
|
|
297
|
+
// etc., despite the command itself having succeeded. Disposing the
|
|
298
|
+
// pipeline first does NOT help; only letting the loop drain does.
|
|
299
|
+
//
|
|
300
|
+
// So: publish the exit code and let node exit on its own once the loop
|
|
301
|
+
// empties. The unref'd timer below still fires if something lingers
|
|
302
|
+
// (it does not itself hold the process open), preserving the original
|
|
303
|
+
// guarantee that the CLI never hangs forever on a stray handle.
|
|
304
|
+
process.exitCode = process.exitCode ?? 0;
|
|
305
|
+
const FORCE_EXIT_MS = 5000;
|
|
306
|
+
setTimeout(() => process.exit(process.exitCode ?? 0), FORCE_EXIT_MS).unref();
|
|
291
307
|
}
|
|
292
308
|
// Daemon child: let the event loop stay alive on its own ref'd interval.
|
|
293
309
|
}).catch((error) => {
|
|
@@ -23,6 +23,9 @@ export declare function fixStaleHelpers(): Promise<boolean>;
|
|
|
23
23
|
export declare function checkHelpersFresh(): Promise<HealthCheck>;
|
|
24
24
|
export declare function checkMonoesIntegration(): Promise<HealthCheck>;
|
|
25
25
|
export declare function checkGitignoreCoverage(): Promise<HealthCheck>;
|
|
26
|
+
/** Creates or appends the missing gitignore entries. Returns true if it wrote.
|
|
27
|
+
* Append-only and idempotent: never rewrites lines the user already has. */
|
|
28
|
+
export declare function fixGitignoreCoverage(): Promise<boolean>;
|
|
26
29
|
export declare function checkAgentRegistry(): Promise<HealthCheck>;
|
|
27
30
|
export declare function checkGuidanceGates(): Promise<HealthCheck>;
|
|
28
31
|
/**
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Doctor — project/monomind health checks
|
|
3
3
|
* Config, memory, API keys, MCP, monograph, helpers, routing, gates, gitignore, worker metrics
|
|
4
4
|
*/
|
|
5
|
-
import { existsSync, readFileSync, readdirSync, statSync, mkdirSync, copyFileSync } from 'fs';
|
|
5
|
+
import { existsSync, readFileSync, readdirSync, statSync, mkdirSync, copyFileSync, writeFileSync, appendFileSync } from 'fs';
|
|
6
6
|
import { join, dirname } from 'path';
|
|
7
7
|
import { fileURLToPath } from 'url';
|
|
8
8
|
import { execSync } from 'child_process';
|
|
@@ -476,24 +476,97 @@ const REQUIRED_GITIGNORE_PATTERNS = [
|
|
|
476
476
|
{ pattern: '.hive-mind/', reason: 'hive-mind state with session info' },
|
|
477
477
|
{ pattern: '.swarm/', reason: 'swarm state files' },
|
|
478
478
|
];
|
|
479
|
+
/** Strip the parts that don't change what a pattern matches, so `**/.monomind/`,
|
|
480
|
+
* `.monomind/` and `.monomind` all compare equal. A gitignore pattern with no
|
|
481
|
+
* leading slash already matches at every depth, so `**/` is redundant. */
|
|
482
|
+
function normalizeGitignorePattern(p) {
|
|
483
|
+
return p.replace(/^\/+/, '').replace(/^\*\*\//, '').replace(/\/+$/, '');
|
|
484
|
+
}
|
|
485
|
+
/** True when ignoring `line` already protects everything `required` covers.
|
|
486
|
+
* Beyond exact matches this understands directory containment: a repo with a
|
|
487
|
+
* blanket `.monomind/` is fully covered for `.monomind/sessions/`,
|
|
488
|
+
* `.monomind/*.json` and friends, and should not be nagged to add each one. */
|
|
489
|
+
function gitignoreLineCovers(line, required) {
|
|
490
|
+
const l = normalizeGitignorePattern(line);
|
|
491
|
+
const r = normalizeGitignorePattern(required);
|
|
492
|
+
if (!l)
|
|
493
|
+
return false;
|
|
494
|
+
if (l === r)
|
|
495
|
+
return true;
|
|
496
|
+
// A bare directory entry covers every path beneath it, but only when the
|
|
497
|
+
// entry itself is literal — `.monomind/*.json` must not be treated as an
|
|
498
|
+
// ancestor of `.monomind/sessions`.
|
|
499
|
+
return !l.includes('*') && r.startsWith(`${l}/`);
|
|
500
|
+
}
|
|
479
501
|
export async function checkGitignoreCoverage() {
|
|
480
502
|
const gitignorePath = join(process.cwd(), '.gitignore');
|
|
481
503
|
if (!existsSync(gitignorePath)) {
|
|
482
|
-
|
|
504
|
+
// The old hint was `echo ".monomind/\n**/.monomind/" >> .gitignore`, which
|
|
505
|
+
// writes a literal backslash-n (sh/bash echo does not interpret escapes
|
|
506
|
+
// without -e) — one junk line matching nothing. `--fix` now writes the file
|
|
507
|
+
// directly, so point at that rather than at a command to copy-paste.
|
|
508
|
+
return { name: 'Gitignore Coverage', status: 'warn', message: 'No .gitignore found — all monomind runtime paths are unprotected', fix: 'monomind doctor --fix (creates .gitignore covering .monomind/ and secrets)' };
|
|
483
509
|
}
|
|
484
510
|
if (statSync(gitignorePath).size > MAX_DOCTOR_GITIGNORE_BYTES) {
|
|
485
511
|
return { name: 'Gitignore Coverage', status: 'warn', message: '.gitignore too large to parse' };
|
|
486
512
|
}
|
|
487
513
|
const lines = readFileSync(gitignorePath, 'utf-8').split('\n').map(l => l.trim()).filter(l => l && !l.startsWith('#'));
|
|
488
|
-
const missing = REQUIRED_GITIGNORE_PATTERNS.filter(({ pattern }) =>
|
|
489
|
-
const base = pattern.replace(/\*\*\//g, '').replace(/\*/g, '');
|
|
490
|
-
return !lines.some(l => l === pattern || l === pattern.replace(/\/$/, '') ||
|
|
491
|
-
(l.includes('**') && base && l.replace(/\*\*\//g, '').replace(/\*/g, '') === base));
|
|
492
|
-
});
|
|
514
|
+
const missing = REQUIRED_GITIGNORE_PATTERNS.filter(({ pattern }) => !lines.some(l => gitignoreLineCovers(l, pattern)));
|
|
493
515
|
if (missing.length === 0)
|
|
494
516
|
return { name: 'Gitignore Coverage', status: 'pass', message: 'All monomind runtime paths are gitignored' };
|
|
495
517
|
const missingList = missing.map(m => m.pattern).join(', ');
|
|
496
|
-
return { name: 'Gitignore Coverage', status: 'warn', message: `${missing.length} runtime path(s) not in .gitignore: ${missingList}`, fix:
|
|
518
|
+
return { name: 'Gitignore Coverage', status: 'warn', message: `${missing.length} runtime path(s) not in .gitignore: ${missingList}`, fix: 'monomind doctor --fix (appends the missing entries)' };
|
|
519
|
+
}
|
|
520
|
+
/** Patterns written by `doctor --fix` when there is no .gitignore at all.
|
|
521
|
+
* Covers monomind runtime state plus the standard secrets files, since a repo
|
|
522
|
+
* with no .gitignore has nothing protecting those either. */
|
|
523
|
+
const GITIGNORE_FIX_PATTERNS = [
|
|
524
|
+
'# monomind runtime state',
|
|
525
|
+
'.monomind/',
|
|
526
|
+
'**/.monomind/',
|
|
527
|
+
'.hive-mind/',
|
|
528
|
+
'.swarm/',
|
|
529
|
+
'**/.claude-flow/',
|
|
530
|
+
'data/sessions/',
|
|
531
|
+
'data/mastermind-*.json',
|
|
532
|
+
'data/mastermind-*.jsonl',
|
|
533
|
+
'',
|
|
534
|
+
'# secrets / local env',
|
|
535
|
+
'.env',
|
|
536
|
+
'.env.*',
|
|
537
|
+
'!.env.example',
|
|
538
|
+
'*.pem',
|
|
539
|
+
'*.key',
|
|
540
|
+
'',
|
|
541
|
+
'# dependencies / build output',
|
|
542
|
+
'node_modules/',
|
|
543
|
+
'dist/',
|
|
544
|
+
];
|
|
545
|
+
/** Creates or appends the missing gitignore entries. Returns true if it wrote.
|
|
546
|
+
* Append-only and idempotent: never rewrites lines the user already has. */
|
|
547
|
+
export async function fixGitignoreCoverage() {
|
|
548
|
+
const gitignorePath = join(process.cwd(), '.gitignore');
|
|
549
|
+
try {
|
|
550
|
+
if (!existsSync(gitignorePath)) {
|
|
551
|
+
writeFileSync(gitignorePath, GITIGNORE_FIX_PATTERNS.join('\n') + '\n', 'utf-8');
|
|
552
|
+
return true;
|
|
553
|
+
}
|
|
554
|
+
if (statSync(gitignorePath).size > MAX_DOCTOR_GITIGNORE_BYTES)
|
|
555
|
+
return false;
|
|
556
|
+
const existing = readFileSync(gitignorePath, 'utf-8');
|
|
557
|
+
const lines = existing.split('\n').map(l => l.trim()).filter(l => l && !l.startsWith('#'));
|
|
558
|
+
const missing = REQUIRED_GITIGNORE_PATTERNS
|
|
559
|
+
.map(m => m.pattern)
|
|
560
|
+
.filter(pattern => !lines.some(l => gitignoreLineCovers(l, pattern)));
|
|
561
|
+
if (missing.length === 0)
|
|
562
|
+
return false;
|
|
563
|
+
const prefix = existing.endsWith('\n') || existing === '' ? '' : '\n';
|
|
564
|
+
appendFileSync(gitignorePath, `${prefix}\n# monomind runtime state\n${missing.join('\n')}\n`, 'utf-8');
|
|
565
|
+
return true;
|
|
566
|
+
}
|
|
567
|
+
catch {
|
|
568
|
+
return false;
|
|
569
|
+
}
|
|
497
570
|
}
|
|
498
571
|
export async function checkAgentRegistry() {
|
|
499
572
|
try {
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import * as path from 'path';
|
|
8
8
|
import { output } from '../output.js';
|
|
9
9
|
import { checkNodeVersion, checkNpmVersion, checkGit, checkGitRepo, checkDiskSpace, checkBuildTools, checkVersionFreshness, checkClaudeCode, installClaudeCode, } from './doctor-env-checks.js';
|
|
10
|
-
import { checkConfigFile, checkMemoryDatabase, checkApiKeys, checkMcpServers, checkMonograph, checkMonographFreshness, checkMonoesMemory, checkHelpersFresh, fixStaleHelpers, checkMonoesIntegration, checkGuidanceGates, checkGitignoreCoverage, checkAgentRegistry, checkMemoryProficiency, checkMetricsFreshness, checkSecurityAuditFindings, checkSecondBrainModel, checkMemoryKnowledgeGraph, } from './doctor-project-checks.js';
|
|
10
|
+
import { checkConfigFile, checkMemoryDatabase, checkApiKeys, checkMcpServers, checkMonograph, checkMonographFreshness, checkMonoesMemory, checkHelpersFresh, fixStaleHelpers, checkMonoesIntegration, checkGuidanceGates, checkGitignoreCoverage, fixGitignoreCoverage, checkAgentRegistry, checkMemoryProficiency, checkMetricsFreshness, checkSecurityAuditFindings, checkSecondBrainModel, checkMemoryKnowledgeGraph, } from './doctor-project-checks.js';
|
|
11
11
|
import { checkMonoesTools, fixMonoesTools } from './doctor-monoes-checks.js';
|
|
12
12
|
function formatCheck(check) {
|
|
13
13
|
const icon = check.status === 'pass' ? output.success('✓') :
|
|
@@ -19,7 +19,7 @@ export const doctorCommand = {
|
|
|
19
19
|
name: 'doctor',
|
|
20
20
|
description: 'System diagnostics and health checks',
|
|
21
21
|
options: [
|
|
22
|
-
{ name: 'fix', short: 'f', description: 'Apply local fixes (helper files, monoes tool shims) and show fix commands for the rest', type: 'boolean', default: false },
|
|
22
|
+
{ name: 'fix', short: 'f', description: 'Apply local fixes (helper files, monoes tool shims, .gitignore entries) and show fix commands for the rest', type: 'boolean', default: false },
|
|
23
23
|
{ name: 'install', short: 'i', description: 'Auto-install missing dependencies (Claude Code CLI)', type: 'boolean', default: false },
|
|
24
24
|
{
|
|
25
25
|
name: 'component', short: 'c',
|
|
@@ -160,6 +160,20 @@ export const doctorCommand = {
|
|
|
160
160
|
output.writeln(formatCheck(newCheck));
|
|
161
161
|
}
|
|
162
162
|
}
|
|
163
|
+
const gitignoreResult = results.find(r => r.name === 'Gitignore Coverage');
|
|
164
|
+
if (gitignoreResult && gitignoreResult.status !== 'pass') {
|
|
165
|
+
if (await fixGitignoreCoverage()) {
|
|
166
|
+
const newCheck = await checkGitignoreCoverage();
|
|
167
|
+
const idx = results.findIndex(r => r.name === 'Gitignore Coverage');
|
|
168
|
+
if (idx !== -1) {
|
|
169
|
+
results[idx] = newCheck;
|
|
170
|
+
const fixIdx = fixes.findIndex(f => f.startsWith('Gitignore Coverage:'));
|
|
171
|
+
if (fixIdx !== -1 && newCheck.status === 'pass')
|
|
172
|
+
fixes.splice(fixIdx, 1);
|
|
173
|
+
}
|
|
174
|
+
output.writeln(formatCheck(newCheck));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
163
177
|
const helpersResult = results.find(r => r.name === 'Helper Files');
|
|
164
178
|
if (helpersResult && helpersResult.status !== 'pass') {
|
|
165
179
|
if (await fixStaleHelpers()) {
|
|
@@ -241,7 +241,7 @@ export const searchCommand = {
|
|
|
241
241
|
},
|
|
242
242
|
{
|
|
243
243
|
name: 'build-hnsw',
|
|
244
|
-
description: 'Build/rebuild pure-JS HNSW index
|
|
244
|
+
description: 'Build/rebuild the pure-JS HNSW fallback index. Only used when the SQLite bridge is unavailable (e.g. better-sqlite3 native binary failed to load) — has no effect on the search that follows when the bridge is active, which is the common case',
|
|
245
245
|
type: 'boolean',
|
|
246
246
|
default: false
|
|
247
247
|
}
|
|
@@ -249,7 +249,7 @@ export const searchCommand = {
|
|
|
249
249
|
examples: [
|
|
250
250
|
{ command: 'monomind memory search -q "authentication patterns"', description: 'Semantic search' },
|
|
251
251
|
{ command: 'monomind memory search -q "JWT" -t keyword', description: 'Keyword search' },
|
|
252
|
-
{ command: 'monomind memory search -q "test" --build-hnsw', description: 'Build HNSW index
|
|
252
|
+
{ command: 'monomind memory search -q "test" --build-hnsw', description: 'Build the sql.js-fallback HNSW index (no-op unless the SQLite bridge is down)' }
|
|
253
253
|
],
|
|
254
254
|
action: async (ctx) => {
|
|
255
255
|
const query = ctx.flags.query || ctx.args[0];
|
|
@@ -262,9 +262,14 @@ export const searchCommand = {
|
|
|
262
262
|
output.printError('Query is required. Use --query or -q');
|
|
263
263
|
return { success: false, exitCode: 1 };
|
|
264
264
|
}
|
|
265
|
-
// Build/rebuild HNSW index if requested
|
|
265
|
+
// Build/rebuild the sql.js-fallback HNSW index if requested. This index is only
|
|
266
|
+
// consulted when the SQLite bridge is unavailable — check that first so the
|
|
267
|
+
// message reflects what will actually happen in the search below, not what
|
|
268
|
+
// would happen if this were the only backend.
|
|
266
269
|
if (buildHnsw) {
|
|
267
|
-
|
|
270
|
+
const { isBridgeAvailable } = await import('../memory/memory-bridge.js');
|
|
271
|
+
const bridgeUp = await isBridgeAvailable().catch(() => false);
|
|
272
|
+
output.printInfo('Building HNSW fallback index...');
|
|
268
273
|
try {
|
|
269
274
|
const { getHNSWIndex, getHNSWStatus } = await import('../memory/memory-initializer.js');
|
|
270
275
|
const startTime = Date.now();
|
|
@@ -274,7 +279,12 @@ export const searchCommand = {
|
|
|
274
279
|
const status = getHNSWStatus();
|
|
275
280
|
output.printSuccess(`HNSW index built (${status.entryCount} vectors, ${buildTime}ms)`);
|
|
276
281
|
output.writeln(output.dim(` Dimensions: ${status.dimensions}, Metric: cosine`));
|
|
277
|
-
|
|
282
|
+
if (bridgeUp) {
|
|
283
|
+
output.writeln(output.dim(' Note: the SQLite bridge is active, so the search below uses its brute-force cosine search, not this index. This index only kicks in if the bridge becomes unavailable.'));
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
output.writeln(output.dim(' SQLite bridge is unavailable — the search below will use this index (O(log n) vs O(n) linear scan).'));
|
|
287
|
+
}
|
|
278
288
|
}
|
|
279
289
|
else {
|
|
280
290
|
output.printWarning('HNSW index not available');
|
|
@@ -9,15 +9,20 @@ export const auditCommand = {
|
|
|
9
9
|
name: 'audit',
|
|
10
10
|
description: 'Security audit logging and compliance',
|
|
11
11
|
options: [
|
|
12
|
-
{ name: 'action', short: 'a', type: 'string', description: 'Action:
|
|
12
|
+
{ name: 'action', short: 'a', type: 'string', description: 'Action: list (only supported value — log/export/clear are not implemented)', default: 'list' },
|
|
13
13
|
{ name: 'limit', short: 'l', type: 'number', description: 'Number of entries to show', default: '20' },
|
|
14
14
|
{ name: 'filter', short: 'f', type: 'string', description: 'Filter by event type' },
|
|
15
15
|
],
|
|
16
16
|
examples: [
|
|
17
17
|
{ command: 'monomind security audit --action list', description: 'List audit logs' },
|
|
18
|
-
{ command: 'monomind security audit -a export', description: 'Export audit trail' },
|
|
19
18
|
],
|
|
20
19
|
action: async (ctx) => {
|
|
20
|
+
const requestedAction = ctx.flags.action || 'list';
|
|
21
|
+
if (requestedAction !== 'list') {
|
|
22
|
+
output.writeln();
|
|
23
|
+
output.writeln(output.error(`security audit --action ${requestedAction} is not implemented — only "list" is supported.`));
|
|
24
|
+
return { success: false, message: `Unsupported action: ${requestedAction}`, exitCode: 1 };
|
|
25
|
+
}
|
|
21
26
|
output.writeln();
|
|
22
27
|
output.writeln(output.bold('Security Audit Log'));
|
|
23
28
|
output.writeln(output.dim('─'.repeat(60)));
|
|
@@ -1283,6 +1283,11 @@ export const HELPER_FILES = {
|
|
|
1283
1283
|
'statusline.cjs': { forceSync: true, doctorTracked: true },
|
|
1284
1284
|
'graphify-freshen.cjs': { forceSync: true, doctorTracked: true },
|
|
1285
1285
|
'router.cjs': { forceSync: true, doctorTracked: true, generate: generateAgentRouter },
|
|
1286
|
+
// Regenerates skill-registry.json (which router.cjs's matchSkills reads) from
|
|
1287
|
+
// the live .claude/commands + .claude/skills trees. No fallback generator:
|
|
1288
|
+
// if it can't be copied there is nothing to regenerate the registry with, and
|
|
1289
|
+
// router.cjs degrades to its built-in FALLBACK_SKILLS rather than breaking.
|
|
1290
|
+
'build-skill-registry.cjs': { forceSync: true, doctorTracked: true },
|
|
1286
1291
|
'memory.cjs': { generate: generateMemoryHelper },
|
|
1287
1292
|
'session.cjs': { generate: generateSessionManager },
|
|
1288
1293
|
'pre-commit': { generate: generatePreCommitHook },
|
|
@@ -41,7 +41,6 @@ const CATEGORY_LOADERS = {
|
|
|
41
41
|
neural: async () => (await import('./mcp-tools/neural-tools.js')).neuralTools,
|
|
42
42
|
performance: async () => (await import('./mcp-tools/performance-tools.js')).performanceTools,
|
|
43
43
|
github: async () => (await import('./mcp-tools/github-tools.js')).githubTools,
|
|
44
|
-
daa: async () => (await import('./mcp-tools/daa-tools.js')).daaTools,
|
|
45
44
|
browser: async () => (await import('./mcp-tools/browser-tools.js')).browserTools,
|
|
46
45
|
guidance: async () => (await import('./mcp-tools/guidance-tools.js')).guidanceTools,
|
|
47
46
|
autopilot: async () => (await import('./mcp-tools/autopilot-tools.js')).autopilotTools,
|
|
@@ -49,7 +48,6 @@ const CATEGORY_LOADERS = {
|
|
|
49
48
|
graphify: async () => (await import('./mcp-tools/graphify-tools.js')).graphifyTools,
|
|
50
49
|
coverage: async () => (await import('./monovector/coverage-tools.js')).coverageRouterTools,
|
|
51
50
|
quality: async () => (await import('./mcp-tools/quality-tools.js')).qualityTools,
|
|
52
|
-
coherence: async () => (await import('./mcp-tools/coherence-tools.js')).coherenceTools,
|
|
53
51
|
knowledge: async () => (await import('./mcp-tools/knowledge-tools.js')).knowledgeTools,
|
|
54
52
|
// system-tools.ts also exports tools with mcp_ and config_ prefixes
|
|
55
53
|
mcp: async () => (await import('./mcp-tools/system-tools.js')).systemTools,
|
|
@@ -121,7 +121,7 @@ async function determineAgentModel(agentType, config, task) {
|
|
|
121
121
|
export const agentTools = [
|
|
122
122
|
{
|
|
123
123
|
name: 'agent_spawn',
|
|
124
|
-
description: '
|
|
124
|
+
description: 'Register a new agent record (type, model preference, status) in the persistent agent store. This creates a database entry, not a running agent — use Claude Code\'s Task tool to actually execute work.',
|
|
125
125
|
category: 'agent',
|
|
126
126
|
inputSchema: {
|
|
127
127
|
type: 'object',
|
|
@@ -5,5 +5,7 @@
|
|
|
5
5
|
* Implements ADR-024: Embeddings MCP Tools
|
|
6
6
|
*/
|
|
7
7
|
import type { MCPTool } from './types.js';
|
|
8
|
+
/** Ungated — internal/test use only. MCP clients get `embeddingsTools` below. */
|
|
9
|
+
export declare const allEmbeddingsTools: MCPTool[];
|
|
8
10
|
export declare const embeddingsTools: MCPTool[];
|
|
9
11
|
//# sourceMappingURL=embeddings-tools.d.ts.map
|
|
@@ -128,7 +128,8 @@ function poincareDistance(a, b, curvature) {
|
|
|
128
128
|
const delta = 2 * diffSq / (denom + 1e-15);
|
|
129
129
|
return (1 / Math.sqrt(c)) * Math.acosh(1 + delta);
|
|
130
130
|
}
|
|
131
|
-
|
|
131
|
+
/** Ungated — internal/test use only. MCP clients get `embeddingsTools` below. */
|
|
132
|
+
export const allEmbeddingsTools = [
|
|
132
133
|
{
|
|
133
134
|
name: 'embeddings_init',
|
|
134
135
|
description: 'Initialize the ONNX embedding subsystem with hyperbolic support',
|
|
@@ -845,4 +846,13 @@ export const embeddingsTools = [
|
|
|
845
846
|
},
|
|
846
847
|
},
|
|
847
848
|
];
|
|
849
|
+
// embeddings_neural's `init` action persists a config blob (sona/flashAttention/
|
|
850
|
+
// ewcPlusPlus/etc.) with no implementing code anywhere for those flags — gated
|
|
851
|
+
// behind MONOMIND_MCP_SPECULATIVE=1. The other 6 tools in this file
|
|
852
|
+
// (embeddings_init/generate/compare/search/hyperbolic/status) do real work
|
|
853
|
+
// and stay visible by default.
|
|
854
|
+
const SPECULATIVE = process.env['MONOMIND_MCP_SPECULATIVE'] === '1';
|
|
855
|
+
export const embeddingsTools = SPECULATIVE
|
|
856
|
+
? allEmbeddingsTools
|
|
857
|
+
: allEmbeddingsTools.filter(t => t.name !== 'embeddings_neural');
|
|
848
858
|
//# sourceMappingURL=embeddings-tools.js.map
|
|
@@ -70,7 +70,7 @@ const CAPABILITY_CATALOG = {
|
|
|
70
70
|
description: 'Multi-agent coordination with topology-aware communication and consensus.',
|
|
71
71
|
tools: ['swarm_init', 'swarm_status', 'swarm_spawn', 'swarm_terminate', 'swarm_topology', 'swarm_metrics'],
|
|
72
72
|
commands: ['swarm init', 'swarm status', 'swarm spawn', 'swarm terminate'],
|
|
73
|
-
agents: ['
|
|
73
|
+
agents: ['mesh-coordinator', 'queen-coordinator', 'collective-intelligence-coordinator'],
|
|
74
74
|
skills: ['swarm-orchestration', 'swarm-advanced', 'monomind-swarm'],
|
|
75
75
|
whenToUse: 'When a task requires multiple agents working together (3+ files, features, refactoring).',
|
|
76
76
|
},
|
|
@@ -79,8 +79,8 @@ const CAPABILITY_CATALOG = {
|
|
|
79
79
|
description: 'Persistent memory with ANN vector search, SQLite storage, and embeddings.',
|
|
80
80
|
tools: ['memory_store', 'memory_retrieve', 'memory_search', 'memory_list', 'memory_delete', 'memory_init', 'memory_export', 'memory_import', 'memory_stats', 'memory_compact', 'memory_namespace'],
|
|
81
81
|
commands: ['memory store', 'memory retrieve', 'memory search', 'memory list', 'memory delete', 'memory init'],
|
|
82
|
-
agents: ['swarm-memory-manager'
|
|
83
|
-
skills: ['
|
|
82
|
+
agents: ['swarm-memory-manager'],
|
|
83
|
+
skills: ['memory-advanced', 'memory-vector-search', 'memory-patterns', 'memory-learning'],
|
|
84
84
|
whenToUse: 'When you need to persist, search, or retrieve knowledge across sessions.',
|
|
85
85
|
},
|
|
86
86
|
'intelligence-learning': {
|
|
@@ -88,7 +88,7 @@ const CAPABILITY_CATALOG = {
|
|
|
88
88
|
description: 'Pattern storage and cosine-similarity search (SONA/ReasoningBank) backed by real embeddings.',
|
|
89
89
|
tools: ['neural_train', 'neural_predict', 'neural_status', 'neural_patterns', 'neural_optimize'],
|
|
90
90
|
commands: [],
|
|
91
|
-
agents: [
|
|
91
|
+
agents: [],
|
|
92
92
|
skills: ['reasoningbank-intelligence', 'memory-reasoningbank'],
|
|
93
93
|
whenToUse: 'When optimizing agent routing, training patterns from outcomes, or adaptive learning.',
|
|
94
94
|
},
|
|
@@ -112,7 +112,7 @@ const CAPABILITY_CATALOG = {
|
|
|
112
112
|
description: 'Queen-led Byzantine fault-tolerant distributed consensus with multiple strategies.',
|
|
113
113
|
tools: ['hive_mind_init', 'hive_mind_status', 'hive_mind_propose', 'hive_mind_vote', 'hive_mind_consensus', 'hive_mind_metrics'],
|
|
114
114
|
commands: ['hive-mind init', 'hive-mind status', 'hive-mind consensus', 'hive-mind sessions', 'hive-mind spawn', 'hive-mind stop'],
|
|
115
|
-
agents: ['
|
|
115
|
+
agents: ['crdt-synchronizer', 'quorum-manager'],
|
|
116
116
|
skills: ['hive-mind-advanced'],
|
|
117
117
|
whenToUse: 'When multiple agents need to reach agreement on decisions using BFT, Raft, or CRDT.',
|
|
118
118
|
},
|
|
@@ -121,8 +121,8 @@ const CAPABILITY_CATALOG = {
|
|
|
121
121
|
description: 'Security scanning, CVE remediation, input validation, claims-based authorization.',
|
|
122
122
|
tools: ['security_scan', 'security_audit', 'security_cve', 'security_threats', 'security_validate', 'security_report', 'claims_check', 'claims_grant', 'claims_revoke', 'claims_list'],
|
|
123
123
|
commands: ['security scan', 'security audit', 'security cve', 'security threats', 'claims check', 'claims grant'],
|
|
124
|
-
agents: ['
|
|
125
|
-
skills: [
|
|
124
|
+
agents: ['security-manager'],
|
|
125
|
+
skills: [],
|
|
126
126
|
whenToUse: 'When auditing code for vulnerabilities, managing permissions, or security reviews.',
|
|
127
127
|
},
|
|
128
128
|
'performance': {
|
|
@@ -130,8 +130,8 @@ const CAPABILITY_CATALOG = {
|
|
|
130
130
|
description: 'Benchmarking, profiling, metrics collection, and optimization recommendations.',
|
|
131
131
|
tools: ['performance_benchmark', 'performance_profile', 'performance_metrics', 'performance_optimize', 'performance_report'],
|
|
132
132
|
commands: ['performance benchmark', 'performance profile', 'performance metrics', 'performance optimize', 'performance report'],
|
|
133
|
-
agents: [
|
|
134
|
-
skills: ['
|
|
133
|
+
agents: [],
|
|
134
|
+
skills: ['performance-analysis'],
|
|
135
135
|
whenToUse: 'When measuring, profiling, or optimizing system performance.',
|
|
136
136
|
},
|
|
137
137
|
'github-integration': {
|
|
@@ -139,7 +139,7 @@ const CAPABILITY_CATALOG = {
|
|
|
139
139
|
description: 'PR management, code review, issue tracking, release automation, multi-repo coordination.',
|
|
140
140
|
tools: ['github_pr_manage', 'github_code_review', 'github_issue_track', 'github_repo_analyze', 'github_sync_coord', 'github_metrics'],
|
|
141
141
|
commands: [],
|
|
142
|
-
agents: ['pr-manager', 'code-review-swarm', 'issue-tracker', 'release-manager', 'repo-architect', 'workflow-automation', 'multi-repo-swarm', 'project-board-sync', 'swarm-pr', 'swarm-issue', 'sync-coordinator', 'github-modes'
|
|
142
|
+
agents: ['pr-manager', 'code-review-swarm', 'issue-tracker', 'release-manager', 'repo-architect', 'workflow-automation', 'multi-repo-swarm', 'project-board-sync', 'swarm-pr', 'swarm-issue', 'sync-coordinator', 'github-modes'],
|
|
143
143
|
skills: ['github-release-management', 'github-workflow-automation', 'github-code-review', 'github-project-management', 'github-multi-repo'],
|
|
144
144
|
whenToUse: 'When working with GitHub repos, PRs, issues, releases, or CI/CD pipelines.',
|
|
145
145
|
},
|
|
@@ -166,7 +166,7 @@ const CAPABILITY_CATALOG = {
|
|
|
166
166
|
description: 'AST analysis, diff classification, coverage routing, dependency graph analysis.',
|
|
167
167
|
tools: ['analyze_diff', 'analyze_coverage', 'analyze_graph'],
|
|
168
168
|
commands: [],
|
|
169
|
-
agents: [
|
|
169
|
+
agents: [],
|
|
170
170
|
skills: ['verification-quality'],
|
|
171
171
|
whenToUse: 'When analyzing code quality, diffs, coverage gaps, or dependency graphs.',
|
|
172
172
|
},
|
|
@@ -208,7 +208,7 @@ const WORKFLOW_TEMPLATES = {
|
|
|
208
208
|
},
|
|
209
209
|
refactor: {
|
|
210
210
|
steps: ['Analyze code structure', 'Plan refactor approach', 'Implement changes', 'Verify no regressions'],
|
|
211
|
-
agents: ['
|
|
211
|
+
agents: ['coder', 'reviewer'],
|
|
212
212
|
topology: 'hierarchical',
|
|
213
213
|
},
|
|
214
214
|
testing: {
|
|
@@ -218,17 +218,17 @@ const WORKFLOW_TEMPLATES = {
|
|
|
218
218
|
},
|
|
219
219
|
security: {
|
|
220
220
|
steps: ['Run security scan', 'Triage findings', 'Fix vulnerabilities', 'Verify remediations'],
|
|
221
|
-
agents: ['
|
|
221
|
+
agents: ['security-manager', 'coder', 'reviewer'],
|
|
222
222
|
topology: 'hierarchical',
|
|
223
223
|
},
|
|
224
224
|
performance: {
|
|
225
225
|
steps: ['Run benchmarks', 'Profile bottlenecks', 'Implement optimizations', 'Re-benchmark'],
|
|
226
|
-
agents: ['
|
|
226
|
+
agents: ['coder'],
|
|
227
227
|
topology: 'hierarchical',
|
|
228
228
|
},
|
|
229
229
|
memory: {
|
|
230
230
|
steps: ['Initialize memory store', 'Store/retrieve patterns', 'Search with HNSW', 'Compact and optimize'],
|
|
231
|
-
agents: ['
|
|
231
|
+
agents: ['swarm-memory-manager'],
|
|
232
232
|
topology: 'hierarchical',
|
|
233
233
|
},
|
|
234
234
|
'github-pr': {
|
|
@@ -243,12 +243,12 @@ const WORKFLOW_TEMPLATES = {
|
|
|
243
243
|
},
|
|
244
244
|
swarm: {
|
|
245
245
|
steps: ['Initialize swarm topology', 'Spawn specialized agents', 'Coordinate via memory', 'Collect and synthesize results'],
|
|
246
|
-
agents: ['
|
|
246
|
+
agents: ['mesh-coordinator', 'coder', 'tester', 'reviewer'],
|
|
247
247
|
topology: 'hierarchical',
|
|
248
248
|
},
|
|
249
249
|
learning: {
|
|
250
250
|
steps: ['Pretrain on codebase', 'Record trajectories', 'Compute rewards', 'Distill learning', 'Consolidate (EWC++)'],
|
|
251
|
-
agents: [
|
|
251
|
+
agents: [],
|
|
252
252
|
topology: 'hierarchical',
|
|
253
253
|
},
|
|
254
254
|
automation: {
|
|
@@ -11,5 +11,7 @@
|
|
|
11
11
|
* The names are kept for CLI/API compatibility.
|
|
12
12
|
*/
|
|
13
13
|
import { type MCPTool } from './types.js';
|
|
14
|
+
/** Ungated — internal/test use only. MCP clients get `hiveMindTools` below. */
|
|
15
|
+
export declare const allHiveMindTools: MCPTool[];
|
|
14
16
|
export declare const hiveMindTools: MCPTool[];
|
|
15
17
|
//# sourceMappingURL=hive-mind-tools.d.ts.map
|
|
@@ -194,7 +194,14 @@ function saveAgentStore(store) {
|
|
|
194
194
|
writeAgentStore(tmp, JSON.stringify(store, null, 2), 'utf-8');
|
|
195
195
|
renameSync(tmp, dest);
|
|
196
196
|
}
|
|
197
|
-
|
|
197
|
+
// Every hive-mind_* tool operates on a single JSON state file in one process —
|
|
198
|
+
// "consensus"/"spawn"/"broadcast" etc. are vote-threshold bookkeeping and
|
|
199
|
+
// record-keeping, not real distributed coordination (see CLAUDE.md's Hive-Mind
|
|
200
|
+
// Consensus section and hive-mind_consensus's own description). Only status/join
|
|
201
|
+
// are legitimate no-drama primitives (read state / register into it) and stay
|
|
202
|
+
// visible by default; everything else is gated behind MONOMIND_MCP_SPECULATIVE=1.
|
|
203
|
+
/** Ungated — internal/test use only. MCP clients get `hiveMindTools` below. */
|
|
204
|
+
export const allHiveMindTools = [
|
|
198
205
|
{
|
|
199
206
|
name: 'hive-mind_spawn',
|
|
200
207
|
description: 'Spawn workers and automatically join them to the hive-mind (combines agent/spawn + hive-mind/join)',
|
|
@@ -536,7 +543,7 @@ export const hiveMindTools = [
|
|
|
536
543
|
},
|
|
537
544
|
{
|
|
538
545
|
name: 'hive-mind_consensus',
|
|
539
|
-
description: 'Propose or vote on consensus
|
|
546
|
+
description: 'Propose or vote on a threshold-based decision, single-process only. "bft"/"raft"/"quorum" are vote-count thresholds (2f+1 / majority / configurable preset) over one JSON state file — NOT real distributed consensus protocols (no leader election, log replication, or network model). Names kept for CLI/API compatibility.',
|
|
540
547
|
category: 'hive-mind',
|
|
541
548
|
inputSchema: {
|
|
542
549
|
type: 'object',
|
|
@@ -1222,4 +1229,9 @@ export const hiveMindTools = [
|
|
|
1222
1229
|
},
|
|
1223
1230
|
},
|
|
1224
1231
|
];
|
|
1232
|
+
const SPECULATIVE = process.env['MONOMIND_MCP_SPECULATIVE'] === '1';
|
|
1233
|
+
const CORE_HIVE_MIND_NAMES = new Set(['hive-mind_status', 'hive-mind_join']);
|
|
1234
|
+
export const hiveMindTools = SPECULATIVE
|
|
1235
|
+
? allHiveMindTools
|
|
1236
|
+
: allHiveMindTools.filter(t => CORE_HIVE_MIND_NAMES.has(t.name));
|
|
1225
1237
|
//# sourceMappingURL=hive-mind-tools.js.map
|
|
@@ -26,7 +26,6 @@ export { autopilotTools } from './autopilot-tools.js';
|
|
|
26
26
|
export { graphifyTools } from './graphify-tools.js';
|
|
27
27
|
export { monographTools } from './monograph-tools.js';
|
|
28
28
|
export { terminalTools } from './terminal-tools.js';
|
|
29
|
-
export { daaTools } from './daa-tools.js';
|
|
30
29
|
export { browserTools } from './browser-tools.js';
|
|
31
30
|
export { knowledgeTools } from './knowledge-tools.js';
|
|
32
31
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -26,7 +26,6 @@ export { autopilotTools } from './autopilot-tools.js';
|
|
|
26
26
|
export { graphifyTools } from './graphify-tools.js';
|
|
27
27
|
export { monographTools } from './monograph-tools.js';
|
|
28
28
|
export { terminalTools } from './terminal-tools.js';
|
|
29
|
-
export { daaTools } from './daa-tools.js';
|
|
30
29
|
export { browserTools } from './browser-tools.js';
|
|
31
30
|
export { knowledgeTools } from './knowledge-tools.js';
|
|
32
31
|
//# sourceMappingURL=index.js.map
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { join, resolve, sep } from 'path';
|
|
8
8
|
import { execSync } from 'child_process';
|
|
9
|
-
import { statSync } from 'fs';
|
|
9
|
+
import { statSync, readdirSync, existsSync } from 'fs';
|
|
10
10
|
import { randomUUID } from 'crypto';
|
|
11
11
|
import { getProjectCwd } from './types.js';
|
|
12
12
|
let _cachedDbPath;
|
|
@@ -2108,7 +2108,6 @@ const monographDeadCodeTool = {
|
|
|
2108
2108
|
},
|
|
2109
2109
|
};
|
|
2110
2110
|
function findStaleDist(repoPath) {
|
|
2111
|
-
const { readdirSync, existsSync } = require('fs');
|
|
2112
2111
|
const distSrc = join(repoPath, 'dist', 'src');
|
|
2113
2112
|
const src = join(repoPath, 'src');
|
|
2114
2113
|
// Scan a single package for stale dist artifacts
|
|
@@ -201,7 +201,7 @@ export const neuralTools = [
|
|
|
201
201
|
},
|
|
202
202
|
{
|
|
203
203
|
name: 'neural_patterns',
|
|
204
|
-
description: '
|
|
204
|
+
description: 'List, inspect, or delete entries in the stored pattern set (CRUD over the embedding-backed pattern store — no model or network involved)',
|
|
205
205
|
category: 'neural',
|
|
206
206
|
inputSchema: {
|
|
207
207
|
type: 'object',
|
|
@@ -56,7 +56,7 @@ const VALID_TOPOLOGIES = new Set([
|
|
|
56
56
|
export const swarmTools = [
|
|
57
57
|
{
|
|
58
58
|
name: 'swarm_init',
|
|
59
|
-
description: '
|
|
59
|
+
description: 'Record a swarm topology/strategy in persistent state. This writes a JSON state file — it does not start any process, thread, or agent. Actual concurrent work only happens when the caller separately dispatches subagents with Claude Code\'s Task tool.',
|
|
60
60
|
category: 'swarm',
|
|
61
61
|
inputSchema: {
|
|
62
62
|
type: 'object',
|
|
@@ -193,7 +193,7 @@ export const swarmTools = [
|
|
|
193
193
|
},
|
|
194
194
|
{
|
|
195
195
|
name: 'swarm_scale',
|
|
196
|
-
description: '
|
|
196
|
+
description: 'Adjust the number of agent records in a swarm\'s persistent state to a target count. Adds or removes bookkeeping entries only — no process is started or stopped.',
|
|
197
197
|
category: 'swarm',
|
|
198
198
|
inputSchema: {
|
|
199
199
|
type: 'object',
|
|
@@ -9,6 +9,8 @@ import type { MCPTool } from './types.js';
|
|
|
9
9
|
/**
|
|
10
10
|
* Transfer MCP tools for pattern export, import, anonymization, and sharing
|
|
11
11
|
*/
|
|
12
|
+
/** Ungated — internal/test use only. MCP clients get `transferTools` below. */
|
|
13
|
+
export declare const allTransferTools: MCPTool[];
|
|
12
14
|
export declare const transferTools: MCPTool[];
|
|
13
15
|
export default transferTools;
|
|
14
16
|
//# sourceMappingURL=transfer-tools.d.ts.map
|
|
@@ -37,7 +37,8 @@ async function getPatternStore() {
|
|
|
37
37
|
/**
|
|
38
38
|
* Transfer MCP tools for pattern export, import, anonymization, and sharing
|
|
39
39
|
*/
|
|
40
|
-
|
|
40
|
+
/** Ungated — internal/test use only. MCP clients get `transferTools` below. */
|
|
41
|
+
export const allTransferTools = [
|
|
41
42
|
// ═══════════════════════════════════════════════════════════════
|
|
42
43
|
// ANONYMIZATION TOOLS
|
|
43
44
|
// ═══════════════════════════════════════════════════════════════
|
|
@@ -275,5 +276,14 @@ export const transferTools = [
|
|
|
275
276
|
},
|
|
276
277
|
},
|
|
277
278
|
];
|
|
279
|
+
// The IPFS pattern-registry tools (ipfs-resolve, store-*) have zero test
|
|
280
|
+
// coverage and no evidence of production use — gated behind
|
|
281
|
+
// MONOMIND_MCP_SPECULATIVE=1. transfer_detect-pii is an unrelated, real PII
|
|
282
|
+
// scanner bundled in this file and stays visible by default.
|
|
283
|
+
const SPECULATIVE = process.env['MONOMIND_MCP_SPECULATIVE'] === '1';
|
|
284
|
+
const CORE_TRANSFER_NAMES = new Set(['transfer_detect-pii']);
|
|
285
|
+
export const transferTools = SPECULATIVE
|
|
286
|
+
? allTransferTools
|
|
287
|
+
: allTransferTools.filter(t => CORE_TRANSFER_NAMES.has(t.name));
|
|
278
288
|
export default transferTools;
|
|
279
289
|
//# sourceMappingURL=transfer-tools.js.map
|