nodebench-mcp 2.70.0 → 3.0.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/README.md +95 -41
- package/dist/agents/alertRouter.d.ts +38 -0
- package/dist/agents/alertRouter.js +151 -0
- package/dist/agents/alertRouter.js.map +1 -0
- package/dist/agents/entityMemory.d.ts +40 -0
- package/dist/agents/entityMemory.js +64 -0
- package/dist/agents/entityMemory.js.map +1 -0
- package/dist/agents/subAgents.d.ts +35 -0
- package/dist/agents/subAgents.js +62 -0
- package/dist/agents/subAgents.js.map +1 -0
- package/dist/benchmarks/benchmarkRunner.js +14 -0
- package/dist/benchmarks/benchmarkRunner.js.map +1 -1
- package/dist/benchmarks/chainEval.js +107 -0
- package/dist/benchmarks/chainEval.js.map +1 -1
- package/dist/benchmarks/llmJudgeEval.js +85 -0
- package/dist/benchmarks/llmJudgeEval.js.map +1 -1
- package/dist/benchmarks/searchQualityEval.js +118 -5
- package/dist/benchmarks/searchQualityEval.js.map +1 -1
- package/dist/cli/search.d.ts +13 -0
- package/dist/cli/search.js +130 -0
- package/dist/cli/search.js.map +1 -0
- package/dist/db.d.ts +6 -2
- package/dist/db.js +470 -3
- package/dist/db.js.map +1 -1
- package/dist/index.js +349 -64
- package/dist/index.js.map +1 -1
- package/dist/profiler/behaviorStore.d.ts +97 -0
- package/dist/profiler/behaviorStore.js +276 -0
- package/dist/profiler/behaviorStore.js.map +1 -0
- package/dist/profiler/eventCollector.d.ts +119 -0
- package/dist/profiler/eventCollector.js +267 -0
- package/dist/profiler/eventCollector.js.map +1 -0
- package/dist/profiler/index.d.ts +15 -0
- package/dist/profiler/index.js +16 -0
- package/dist/profiler/index.js.map +1 -0
- package/dist/profiler/mcpProxy.d.ts +49 -0
- package/dist/profiler/mcpProxy.js +123 -0
- package/dist/profiler/mcpProxy.js.map +1 -0
- package/dist/profiler/modelRouter.d.ts +30 -0
- package/dist/profiler/modelRouter.js +99 -0
- package/dist/profiler/modelRouter.js.map +1 -0
- package/dist/profiler/otelReceiver.d.ts +17 -0
- package/dist/profiler/otelReceiver.js +62 -0
- package/dist/profiler/otelReceiver.js.map +1 -0
- package/dist/profiler/proofEngine.d.ts +41 -0
- package/dist/profiler/proofEngine.js +93 -0
- package/dist/profiler/proofEngine.js.map +1 -0
- package/dist/profiler/workflowTemplates.d.ts +41 -0
- package/dist/profiler/workflowTemplates.js +95 -0
- package/dist/profiler/workflowTemplates.js.map +1 -0
- package/dist/providers/localMemoryProvider.js +3 -2
- package/dist/providers/localMemoryProvider.js.map +1 -1
- package/dist/runtimeConfig.d.ts +11 -0
- package/dist/runtimeConfig.js +27 -0
- package/dist/runtimeConfig.js.map +1 -0
- package/dist/security/auditLog.js +8 -3
- package/dist/security/auditLog.js.map +1 -1
- package/dist/subconscious/blocks.d.ts +43 -0
- package/dist/subconscious/blocks.js +158 -0
- package/dist/subconscious/blocks.js.map +1 -0
- package/dist/subconscious/classifier.d.ts +22 -0
- package/dist/subconscious/classifier.js +118 -0
- package/dist/subconscious/classifier.js.map +1 -0
- package/dist/subconscious/graphEngine.d.ts +65 -0
- package/dist/subconscious/graphEngine.js +234 -0
- package/dist/subconscious/graphEngine.js.map +1 -0
- package/dist/subconscious/index.d.ts +19 -0
- package/dist/subconscious/index.js +20 -0
- package/dist/subconscious/index.js.map +1 -0
- package/dist/subconscious/tools.d.ts +5 -0
- package/dist/subconscious/tools.js +255 -0
- package/dist/subconscious/tools.js.map +1 -0
- package/dist/subconscious/whisperPolicy.d.ts +20 -0
- package/dist/subconscious/whisperPolicy.js +171 -0
- package/dist/subconscious/whisperPolicy.js.map +1 -0
- package/dist/sweep/engine.d.ts +27 -0
- package/dist/sweep/engine.js +244 -0
- package/dist/sweep/engine.js.map +1 -0
- package/dist/sweep/index.d.ts +9 -0
- package/dist/sweep/index.js +8 -0
- package/dist/sweep/index.js.map +1 -0
- package/dist/sweep/sources/github_trending.d.ts +6 -0
- package/dist/sweep/sources/github_trending.js +37 -0
- package/dist/sweep/sources/github_trending.js.map +1 -0
- package/dist/sweep/sources/hackernews.d.ts +7 -0
- package/dist/sweep/sources/hackernews.js +57 -0
- package/dist/sweep/sources/hackernews.js.map +1 -0
- package/dist/sweep/sources/openbb_finance.d.ts +9 -0
- package/dist/sweep/sources/openbb_finance.js +46 -0
- package/dist/sweep/sources/openbb_finance.js.map +1 -0
- package/dist/sweep/sources/producthunt.d.ts +6 -0
- package/dist/sweep/sources/producthunt.js +41 -0
- package/dist/sweep/sources/producthunt.js.map +1 -0
- package/dist/sweep/sources/web_signals.d.ts +7 -0
- package/dist/sweep/sources/web_signals.js +63 -0
- package/dist/sweep/sources/web_signals.js.map +1 -0
- package/dist/sweep/sources/yahoo_finance.d.ts +6 -0
- package/dist/sweep/sources/yahoo_finance.js +47 -0
- package/dist/sweep/sources/yahoo_finance.js.map +1 -0
- package/dist/sweep/types.d.ts +50 -0
- package/dist/sweep/types.js +9 -0
- package/dist/sweep/types.js.map +1 -0
- package/dist/sync/founderEpisodeStore.d.ts +98 -0
- package/dist/sync/founderEpisodeStore.js +230 -0
- package/dist/sync/founderEpisodeStore.js.map +1 -0
- package/dist/sync/hyperloopArchive.d.ts +51 -0
- package/dist/sync/hyperloopArchive.js +153 -0
- package/dist/sync/hyperloopArchive.js.map +1 -0
- package/dist/sync/hyperloopEval.d.ts +123 -0
- package/dist/sync/hyperloopEval.js +389 -0
- package/dist/sync/hyperloopEval.js.map +1 -0
- package/dist/sync/hyperloopEval.test.d.ts +4 -0
- package/dist/sync/hyperloopEval.test.js +60 -0
- package/dist/sync/hyperloopEval.test.js.map +1 -0
- package/dist/sync/protocol.d.ts +172 -0
- package/dist/sync/protocol.js +9 -0
- package/dist/sync/protocol.js.map +1 -0
- package/dist/sync/sessionMemory.d.ts +47 -0
- package/dist/sync/sessionMemory.js +138 -0
- package/dist/sync/sessionMemory.js.map +1 -0
- package/dist/sync/store.d.ts +384 -0
- package/dist/sync/store.js +1435 -0
- package/dist/sync/store.js.map +1 -0
- package/dist/sync/store.test.d.ts +4 -0
- package/dist/sync/store.test.js +43 -0
- package/dist/sync/store.test.js.map +1 -0
- package/dist/sync/syncBridgeClient.d.ts +30 -0
- package/dist/sync/syncBridgeClient.js +172 -0
- package/dist/sync/syncBridgeClient.js.map +1 -0
- package/dist/tools/autonomousDeliveryTools.d.ts +2 -0
- package/dist/tools/autonomousDeliveryTools.js +1104 -0
- package/dist/tools/autonomousDeliveryTools.js.map +1 -0
- package/dist/tools/claudeCodeIngestTools.d.ts +10 -0
- package/dist/tools/claudeCodeIngestTools.js +347 -0
- package/dist/tools/claudeCodeIngestTools.js.map +1 -0
- package/dist/tools/coreWorkflowTools.d.ts +2 -0
- package/dist/tools/coreWorkflowTools.js +488 -0
- package/dist/tools/coreWorkflowTools.js.map +1 -0
- package/dist/tools/deltaTools.d.ts +15 -0
- package/dist/tools/deltaTools.js +1522 -0
- package/dist/tools/deltaTools.js.map +1 -0
- package/dist/tools/entityLookupTools.d.ts +14 -0
- package/dist/tools/entityLookupTools.js +159 -0
- package/dist/tools/entityLookupTools.js.map +1 -0
- package/dist/tools/entityTemporalTools.d.ts +12 -0
- package/dist/tools/entityTemporalTools.js +330 -0
- package/dist/tools/entityTemporalTools.js.map +1 -0
- package/dist/tools/founderLocalPipeline.d.ts +215 -0
- package/dist/tools/founderLocalPipeline.js +1516 -2
- package/dist/tools/founderLocalPipeline.js.map +1 -1
- package/dist/tools/founderOperatingModel.d.ts +120 -0
- package/dist/tools/founderOperatingModel.js +469 -0
- package/dist/tools/founderOperatingModel.js.map +1 -0
- package/dist/tools/founderOperatingModelTools.d.ts +2 -0
- package/dist/tools/founderOperatingModelTools.js +169 -0
- package/dist/tools/founderOperatingModelTools.js.map +1 -0
- package/dist/tools/founderStrategicOpsTools.d.ts +2 -0
- package/dist/tools/founderStrategicOpsTools.js +1310 -0
- package/dist/tools/founderStrategicOpsTools.js.map +1 -0
- package/dist/tools/graphifyTools.d.ts +19 -0
- package/dist/tools/graphifyTools.js +375 -0
- package/dist/tools/graphifyTools.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/monteCarloTools.d.ts +16 -0
- package/dist/tools/monteCarloTools.js +225 -0
- package/dist/tools/monteCarloTools.js.map +1 -0
- package/dist/tools/packetCompilerTools.d.ts +12 -0
- package/dist/tools/packetCompilerTools.js +322 -0
- package/dist/tools/packetCompilerTools.js.map +1 -0
- package/dist/tools/planSynthesisTools.d.ts +15 -0
- package/dist/tools/planSynthesisTools.js +455 -0
- package/dist/tools/planSynthesisTools.js.map +1 -0
- package/dist/tools/profilerTools.d.ts +20 -0
- package/dist/tools/profilerTools.js +364 -0
- package/dist/tools/profilerTools.js.map +1 -0
- package/dist/tools/savingsTools.d.ts +11 -0
- package/dist/tools/savingsTools.js +155 -0
- package/dist/tools/savingsTools.js.map +1 -0
- package/dist/tools/scenarioCompilerTools.d.ts +14 -0
- package/dist/tools/scenarioCompilerTools.js +290 -0
- package/dist/tools/scenarioCompilerTools.js.map +1 -0
- package/dist/tools/sharedContextTools.d.ts +2 -0
- package/dist/tools/sharedContextTools.js +423 -0
- package/dist/tools/sharedContextTools.js.map +1 -0
- package/dist/tools/sitemapTools.d.ts +15 -0
- package/dist/tools/sitemapTools.js +560 -0
- package/dist/tools/sitemapTools.js.map +1 -0
- package/dist/tools/sweepTools.d.ts +9 -0
- package/dist/tools/sweepTools.js +112 -0
- package/dist/tools/sweepTools.js.map +1 -0
- package/dist/tools/syncBridgeTools.d.ts +2 -0
- package/dist/tools/syncBridgeTools.js +258 -0
- package/dist/tools/syncBridgeTools.js.map +1 -0
- package/dist/tools/toolRegistry.js +1216 -49
- package/dist/tools/toolRegistry.js.map +1 -1
- package/dist/tools/workspaceTools.d.ts +19 -0
- package/dist/tools/workspaceTools.js +762 -0
- package/dist/tools/workspaceTools.js.map +1 -0
- package/dist/toolsetRegistry.js +88 -2
- package/dist/toolsetRegistry.js.map +1 -1
- package/package.json +36 -36
- package/rules/nodebench-agentic-reliability.md +32 -0
- package/rules/nodebench-analyst-diagnostic.md +25 -0
- package/rules/nodebench-auto-qa.md +31 -0
- package/rules/nodebench-completion-traceability.md +22 -0
- package/rules/nodebench-flywheel-continuous.md +25 -0
- package/rules/nodebench-pre-release-review.md +24 -0
- package/rules/nodebench-qa-dogfood.md +26 -0
- package/rules/nodebench-scenario-testing.md +30 -0
- package/rules/nodebench-self-direction.md +23 -0
- package/rules/nodebench-self-judge-loop.md +24 -0
- package/scripts/install.sh +215 -0
package/dist/index.js
CHANGED
|
@@ -33,6 +33,7 @@ import { initObservability, startWatchdog, stopWatchdog } from "./tools/observab
|
|
|
33
33
|
import { createMetaTools } from "./tools/metaTools.js";
|
|
34
34
|
import { createProgressiveDiscoveryTools } from "./tools/progressiveDiscoveryTools.js";
|
|
35
35
|
import { getQuickRef, ALL_REGISTRY_ENTRIES, TOOL_REGISTRY, getToolComplexity, getToolAnnotations, toolNameToTitle, _setDbAccessor, hybridSearch, WORKFLOW_CHAINS } from "./tools/toolRegistry.js";
|
|
36
|
+
import { getRequestedPreset, resolveRuntimeFlags } from "./runtimeConfig.js";
|
|
36
37
|
// TOON format — ~40% token savings on tool responses
|
|
37
38
|
import { encode as toonEncode } from "@toon-format/toon";
|
|
38
39
|
// Embedding provider — neural semantic search
|
|
@@ -40,7 +41,6 @@ import { initEmbeddingIndex } from "./tools/embeddingProvider.js";
|
|
|
40
41
|
// ── CLI argument parsing ──────────────────────────────────────────────
|
|
41
42
|
const cliArgs = process.argv.slice(2);
|
|
42
43
|
const useToon = !cliArgs.includes("--no-toon");
|
|
43
|
-
const useEmbedding = !cliArgs.includes("--no-embedding");
|
|
44
44
|
const useSmartPreset = cliArgs.includes("--smart-preset");
|
|
45
45
|
const showStats = cliArgs.includes("--stats");
|
|
46
46
|
const exportStats = cliArgs.includes("--export-stats");
|
|
@@ -51,25 +51,34 @@ const statusFlag = cliArgs.includes("--status");
|
|
|
51
51
|
const diagnoseFlag = cliArgs.includes("--diagnose");
|
|
52
52
|
const autoPresetFlag = cliArgs.includes("--auto-preset");
|
|
53
53
|
const syncConfigsFlag = cliArgs.includes("--sync-configs");
|
|
54
|
-
const
|
|
54
|
+
const requestedPreset = getRequestedPreset(cliArgs);
|
|
55
|
+
const runtimeFlags = resolveRuntimeFlags(cliArgs, requestedPreset);
|
|
56
|
+
const useEmbedding = runtimeFlags.enableEmbedding;
|
|
57
|
+
const useEngine = runtimeFlags.enableEngine;
|
|
58
|
+
const useProfile = runtimeFlags.enableProfiling;
|
|
55
59
|
const engineSecret = (() => {
|
|
56
60
|
const idx = cliArgs.indexOf("--engine-secret");
|
|
57
61
|
return idx >= 0 && idx + 1 < cliArgs.length ? cliArgs[idx + 1] : process.env.ENGINE_SECRET;
|
|
58
62
|
})();
|
|
59
63
|
export { TOOLSET_MAP };
|
|
60
|
-
// Starter:
|
|
61
|
-
|
|
62
|
-
const STARTER_TOOLSETS = ["deep_sim"];
|
|
64
|
+
// Starter/default: v3 core workflow facade only. Discovery/meta/dynamic tools are added separately.
|
|
65
|
+
const STARTER_TOOLSETS = ["core_workflow"];
|
|
63
66
|
// Core: the original default. ~81 tools across 15 domains.
|
|
64
|
-
const CORE_TOOLSETS = ["verification", "eval", "quality_gate", "learning", "flywheel", "recon", "security", "boilerplate", "skill_update", "context_sandbox", "observability", "execution_trace", "mission_harness", "deep_sim", "founder"];
|
|
67
|
+
const CORE_TOOLSETS = ["verification", "eval", "quality_gate", "learning", "flywheel", "autonomous_delivery", "sync_bridge", "shared_context", "recon", "security", "boilerplate", "skill_update", "context_sandbox", "observability", "execution_trace", "mission_harness", "deep_sim", "founder", "scenario_compiler", "packet_compiler", "entity_temporal"];
|
|
68
|
+
// Power: extended research + founder intelligence without admin/debug-only runtime surfaces.
|
|
69
|
+
const POWER_TOOLSETS = ["core_workflow", "deep_sim", "founder", "recon", "web", "shared_context", "sync_bridge", "session_memory", "entity_lookup", "delta", "site_map"];
|
|
70
|
+
// Admin: profiling, debugging, observability, dashboards, and eval harness domains.
|
|
71
|
+
const ADMIN_TOOLSETS = ["core_workflow", "observability", "profiler", "local_dashboard", "benchmark", "longitudinal_benchmark", "dogfood_judge", "execution_trace", "qa_orchestration", "mission_harness", "quality_gate", "eval", "verification"];
|
|
65
72
|
const PRESETS = {
|
|
66
|
-
// DEFAULT:
|
|
73
|
+
// DEFAULT: v3 core workflow facade. Progressive discovery expands into power/admin domains only when needed.
|
|
67
74
|
default: STARTER_TOOLSETS,
|
|
68
75
|
starter: STARTER_TOOLSETS,
|
|
76
|
+
power: POWER_TOOLSETS,
|
|
77
|
+
admin: ADMIN_TOOLSETS,
|
|
69
78
|
// Core AI Flywheel — everything from the old default
|
|
70
79
|
core: CORE_TOOLSETS,
|
|
71
|
-
// Themed presets — bridge between
|
|
72
|
-
web_dev: [...CORE_TOOLSETS, "ui_capture", "vision", "web", "seo", "git_workflow", "architect", "ui_ux_dive", "ui_ux_dive_v2", "mcp_bridge", "qa_orchestration", "visual_qa", "design_governance", "web_scraping"],
|
|
80
|
+
// Themed presets — bridge between the core workflow surface and full-domain coverage
|
|
81
|
+
web_dev: [...CORE_TOOLSETS, "ui_capture", "vision", "web", "seo", "git_workflow", "architect", "ui_ux_dive", "ui_ux_dive_v2", "mcp_bridge", "qa_orchestration", "visual_qa", "design_governance", "web_scraping", "site_map", "savings"],
|
|
73
82
|
research: [...CORE_TOOLSETS, "web", "llm", "rss", "email", "docs", "research_optimizer", "web_scraping", "temporal_intelligence", "deep_sim"],
|
|
74
83
|
data: [...CORE_TOOLSETS, "local_file", "llm", "web", "research_optimizer", "web_scraping", "temporal_intelligence"],
|
|
75
84
|
devops: [...CORE_TOOLSETS, "git_workflow", "session_memory", "benchmark", "pattern"],
|
|
@@ -77,22 +86,29 @@ const PRESETS = {
|
|
|
77
86
|
academic: [...CORE_TOOLSETS, "research_writing", "llm", "web", "local_file"],
|
|
78
87
|
multi_agent: [...CORE_TOOLSETS, "parallel", "self_eval", "session_memory", "pattern", "toon", "qa_orchestration", "agent_traverse", "engine_context", "research_optimizer", "web_scraping", "deep_sim"],
|
|
79
88
|
content: [...CORE_TOOLSETS, "llm", "critter", "email", "rss", "platform", "architect", "local_dashboard", "engine_context", "thompson_protocol"],
|
|
80
|
-
// ── Persona presets (
|
|
81
|
-
// Founder: decision intelligence + company tracking + session memory + local dashboard
|
|
82
|
-
founder: ["deep_sim", "founder", "learning", "local_dashboard"],
|
|
89
|
+
// ── Persona presets (kept for compatibility, but no longer the default entry point) ──
|
|
90
|
+
// Founder: decision intelligence + company tracking + session memory + local dashboard
|
|
91
|
+
founder: ["deep_sim", "founder", "learning", "local_dashboard", "autonomous_delivery", "sync_bridge", "shared_context", "site_map", "savings", "profiler", "sweep", "monte_carlo"],
|
|
83
92
|
// Banker/analyst: decision intelligence + company profiling + web research + recon (~39 tools)
|
|
84
|
-
banker: ["deep_sim", "founder", "web", "recon"],
|
|
85
|
-
// Operator: decision intelligence + company tracking + causal memory + action tracing
|
|
86
|
-
operator: ["deep_sim", "founder", "causal_memory"],
|
|
93
|
+
banker: ["deep_sim", "founder", "web", "recon", "autonomous_delivery", "sync_bridge", "shared_context", "profiler"],
|
|
94
|
+
// Operator: decision intelligence + company tracking + causal memory + action tracing
|
|
95
|
+
operator: ["deep_sim", "founder", "causal_memory", "autonomous_delivery", "sync_bridge", "shared_context", "profiler"],
|
|
87
96
|
// Researcher: decision intelligence + web + recon + session memory (~32 tools)
|
|
88
|
-
researcher: ["deep_sim", "web", "recon", "learning"],
|
|
97
|
+
researcher: ["deep_sim", "web", "recon", "learning", "autonomous_delivery", "sync_bridge", "shared_context", "profiler"],
|
|
89
98
|
// Cursor IDE has a hard 40-tool limit across ALL MCP servers.
|
|
90
99
|
cursor: ["deep_sim", "quality_gate", "learning", "session_memory", "web", "toon"],
|
|
100
|
+
// Hackathon: founder + web intelligence + entity enrichment + shared context
|
|
101
|
+
// Pairs with retention.sh for QA. Install: claude mcp add nodebench -- npx -y nodebench-mcp --preset=hackathon
|
|
102
|
+
hackathon: ["deep_sim", "founder", "learning", "web", "entity_enrichment", "autonomous_delivery", "sync_bridge", "shared_context", "recon", "local_dashboard", "delta", "profiler", "sweep", "monte_carlo"],
|
|
103
|
+
// Delta: full operating-intelligence preset — all delta.* packet tools + watchlist + entity intel
|
|
104
|
+
delta: ["deep_sim", "founder", "learning", "web", "entity_enrichment", "autonomous_delivery", "sync_bridge", "shared_context", "recon", "local_dashboard", "quality_gate", "execution_trace", "delta"],
|
|
91
105
|
full: ALL_DOMAIN_KEYS,
|
|
92
106
|
};
|
|
93
107
|
const PRESET_DESCRIPTIONS = {
|
|
94
|
-
default: "
|
|
95
|
-
starter: "
|
|
108
|
+
default: "Default v3 surface — 7 workflow tools plus discovery/meta helpers. Fast boot, one artifact-shaped workflow.",
|
|
109
|
+
starter: "Default v3 surface — 7 workflow tools plus discovery/meta helpers. Fast boot, one artifact-shaped workflow.",
|
|
110
|
+
power: "Extended workflow preset — founder + recon + web + packets without admin-only runtime surfaces.",
|
|
111
|
+
admin: "Admin/runtime preset — profiling, observability, dashboards, eval, and debug lanes.",
|
|
96
112
|
core: "Core AI Flywheel (~81 tools) — verification, eval, quality gates, learning, recon, mission harness",
|
|
97
113
|
web_dev: "Web projects — adds visual QA, SEO audit, git workflow, code architecture",
|
|
98
114
|
research: "Research workflows — adds web search, LLM calls, RSS feeds, email, docs",
|
|
@@ -102,24 +118,26 @@ const PRESET_DESCRIPTIONS = {
|
|
|
102
118
|
academic: "Academic papers — adds polish, review, translate, logic check, data analysis",
|
|
103
119
|
multi_agent: "Multi-agent teams — adds task locking, messaging, roles, oracle testing, frontend traversal",
|
|
104
120
|
content: "Content & publishing — adds LLM, accountability, email, RSS, platform queue",
|
|
105
|
-
founder: "Founder
|
|
121
|
+
founder: "Founder decision preset — company tracking, decision intelligence, shared context, local dashboard",
|
|
106
122
|
banker: "Banker/Analyst (~39 tools) — decision intelligence, company profiling, web research, recon",
|
|
107
|
-
operator: "Operator
|
|
123
|
+
operator: "Operator — decision intelligence, company tracking, causal memory, action tracing",
|
|
108
124
|
researcher: "Researcher (~32 tools) — decision intelligence, web search, recon, session memory",
|
|
109
125
|
cursor: "Cursor IDE (28 tools) — decision intelligence, quality gates, session memory, web, TOON encoding. Leaves 12 slots for other MCP servers.",
|
|
110
|
-
|
|
126
|
+
hackathon: "Hackathon — decision intelligence + entity intel + web research + team coordination. Pairs with retention.sh for QA.",
|
|
127
|
+
delta: "Delta (~65 tools) — full operating-intelligence preset. Entity intel, decision memos, watchlists, agent handoff, execution traces.",
|
|
128
|
+
full: "Everything — all domains for maximum coverage",
|
|
111
129
|
};
|
|
112
130
|
async function parseToolsets() {
|
|
113
131
|
if (cliArgs.includes("--help")) {
|
|
114
132
|
const lines = [
|
|
115
|
-
"nodebench-mcp v2.
|
|
133
|
+
"nodebench-mcp v2.70.0 — Development Methodology MCP Server",
|
|
116
134
|
"",
|
|
117
135
|
"Usage: nodebench-mcp [options]",
|
|
118
136
|
"",
|
|
119
137
|
"Options:",
|
|
120
138
|
" --toolsets <list> Comma-separated toolsets to enable (default: default)",
|
|
121
139
|
" --exclude <list> Comma-separated toolsets to exclude",
|
|
122
|
-
" --preset <name> Use a preset: default or full",
|
|
140
|
+
" --preset <name> Use a preset: default, power, admin, or full",
|
|
123
141
|
" --smart-preset Generate smart preset recommendation based on project type and usage history",
|
|
124
142
|
" --auto-preset Detect project type from package.json/pyproject.toml and recommend a preset",
|
|
125
143
|
" --stats Show usage statistics for current project",
|
|
@@ -127,8 +145,13 @@ async function parseToolsets() {
|
|
|
127
145
|
" --reset-stats Clear all usage analytics data",
|
|
128
146
|
" --list-presets List all available presets with descriptions",
|
|
129
147
|
" --dynamic Enable dynamic toolset loading (Search+Load pattern from arxiv 2509.20386)",
|
|
148
|
+
" --embedding Enable semantic embedding index on the default preset",
|
|
130
149
|
" --no-toon Disable TOON encoding (TOON is on by default for ~40% token savings)",
|
|
131
|
-
" --no-embedding Disable neural embedding search
|
|
150
|
+
" --no-embedding Disable neural embedding search",
|
|
151
|
+
" --profile Enable profiling proxy — logs every tool call with cost/latency",
|
|
152
|
+
" --admin Enable admin runtime surfaces (dashboards + watchdog)",
|
|
153
|
+
" --dashboards Start local dashboards explicitly",
|
|
154
|
+
" --watchdog Start observability watchdog explicitly",
|
|
132
155
|
" --engine Start headless API engine server on port 6276",
|
|
133
156
|
" --engine-secret <s> Require Bearer token for engine API (or set ENGINE_SECRET env var)",
|
|
134
157
|
" --explain <tool> Show plain-English explanation of a tool and exit",
|
|
@@ -147,12 +170,14 @@ async function parseToolsets() {
|
|
|
147
170
|
}),
|
|
148
171
|
"",
|
|
149
172
|
"Examples:",
|
|
150
|
-
" npx nodebench-mcp # Default
|
|
173
|
+
" npx nodebench-mcp # Default v3 core workflow surface",
|
|
174
|
+
" npx nodebench-mcp --preset power # Extended founder/research surface",
|
|
175
|
+
" npx nodebench-mcp --preset admin # Profiling, observability, dashboards",
|
|
151
176
|
" npx nodebench-mcp --preset web_dev # Web development (+ vision, SEO, git)",
|
|
152
177
|
" npx nodebench-mcp --preset research # Research workflows (+ web, LLM, RSS, email)",
|
|
153
178
|
" npx nodebench-mcp --preset data # Data analysis (+ local file parsing, LLM)",
|
|
154
179
|
" npx nodebench-mcp --preset academic # Academic writing (+ paper tools, LLM)",
|
|
155
|
-
" npx nodebench-mcp --preset full # All
|
|
180
|
+
" npx nodebench-mcp --preset full # All available domains",
|
|
156
181
|
" npx nodebench-mcp --smart-preset # Get AI-powered preset recommendation",
|
|
157
182
|
" npx nodebench-mcp --stats # Show usage statistics",
|
|
158
183
|
" npx nodebench-mcp --toolsets verification,eval,recon",
|
|
@@ -195,7 +220,7 @@ async function parseToolsets() {
|
|
|
195
220
|
const domainsToLoad = ALL_DOMAIN_KEYS.filter((k) => !excluded.has(k));
|
|
196
221
|
return loadToolsets(domainsToLoad);
|
|
197
222
|
}
|
|
198
|
-
// Default to
|
|
223
|
+
// Default to the v3 core workflow facade
|
|
199
224
|
return loadToolsets(PRESETS.default);
|
|
200
225
|
}
|
|
201
226
|
// ── Analytics CLI flag handling ─────────────────────────────────────────
|
|
@@ -454,9 +479,11 @@ if (autoPresetFlag) {
|
|
|
454
479
|
signals.push("academic: LaTeX files found");
|
|
455
480
|
recommended = "academic";
|
|
456
481
|
}
|
|
457
|
-
// Output — load
|
|
458
|
-
await loadToolsets(ALL_DOMAIN_KEYS);
|
|
482
|
+
// Output — only load the recommended preset to keep auto-preset fast
|
|
459
483
|
const presetToolsets = PRESETS[recommended];
|
|
484
|
+
if (presetToolsets) {
|
|
485
|
+
await loadToolsets(presetToolsets);
|
|
486
|
+
}
|
|
460
487
|
const toolCount = presetToolsets
|
|
461
488
|
? presetToolsets.reduce((s, k) => s + (TOOLSET_MAP[k]?.length ?? 0), 0) + 12
|
|
462
489
|
: 0;
|
|
@@ -493,20 +520,22 @@ if (healthFlag) {
|
|
|
493
520
|
const lines = [];
|
|
494
521
|
lines.push(`${B}NodeBench MCP v2.30.0 — Health Check${X}`);
|
|
495
522
|
lines.push("");
|
|
496
|
-
// 1. Tool count + preset — load
|
|
497
|
-
|
|
498
|
-
const presetIdx2 = cliArgs.indexOf("--preset");
|
|
499
|
-
const activePreset = presetIdx2 !== -1 && cliArgs[presetIdx2 + 1] ? cliArgs[presetIdx2 + 1] : "default";
|
|
500
|
-
const domainCount = Object.keys(TOOLSET_MAP).length;
|
|
501
|
-
const totalTools = Object.values(TOOLSET_MAP).reduce((s, v) => s + v.length, 0);
|
|
523
|
+
// 1. Tool count + preset — load only the active preset for a fast health path
|
|
524
|
+
const activePreset = requestedPreset;
|
|
502
525
|
const presetToolsets = PRESETS[activePreset];
|
|
526
|
+
if (presetToolsets) {
|
|
527
|
+
await loadToolsets(presetToolsets);
|
|
528
|
+
}
|
|
503
529
|
const presetToolCount = presetToolsets
|
|
504
530
|
? presetToolsets.reduce((s, k) => s + (TOOLSET_MAP[k]?.length ?? 0), 0) + 12
|
|
505
|
-
:
|
|
506
|
-
lines.push(`${C}Tools${X} ${presetToolCount}
|
|
531
|
+
: 12;
|
|
532
|
+
lines.push(`${C}Tools${X} ${presetToolCount} visible (preset: ${activePreset}) | ${ALL_DOMAIN_KEYS.length} domains available`);
|
|
507
533
|
// 2. TOON + Embedding
|
|
508
534
|
lines.push(`${C}TOON${X} ${useToon ? ok : `${warn} disabled (--no-toon)`}`);
|
|
509
|
-
lines.push(`${C}Embedding${X} ${useEmbedding ? ok : `${warn} disabled
|
|
535
|
+
lines.push(`${C}Embedding${X} ${useEmbedding ? ok : `${warn} disabled on default hot path`}`);
|
|
536
|
+
lines.push(`${C}Runtime${X} ${runtimeFlags.enableDashboards || runtimeFlags.enableWatchdog
|
|
537
|
+
? `${ok} admin surfaces enabled`
|
|
538
|
+
: `${warn} core-only (pass --admin, --dashboards, or --watchdog to enable admin runtime)`}`);
|
|
510
539
|
// 3. Database
|
|
511
540
|
const os = await import("node:os");
|
|
512
541
|
const path = await import("node:path");
|
|
@@ -592,6 +621,43 @@ if (healthFlag) {
|
|
|
592
621
|
catch { /* not running */ }
|
|
593
622
|
lines.push(` ${reachable ? ok : `${Y}--${X}`} ${name.padEnd(22)} :${port}${reachable ? "" : " (not running)"}`);
|
|
594
623
|
}
|
|
624
|
+
// 9. Version check (npm registry)
|
|
625
|
+
lines.push("");
|
|
626
|
+
lines.push(`${B}Version${X}`);
|
|
627
|
+
const { createRequire: cr2 } = await import("node:module");
|
|
628
|
+
const _req2 = cr2(import.meta.url);
|
|
629
|
+
let currentVersion = "2.70.0";
|
|
630
|
+
try {
|
|
631
|
+
const pkgPath = _req2.resolve("../package.json");
|
|
632
|
+
const pkgJson = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
|
|
633
|
+
currentVersion = pkgJson.version || currentVersion;
|
|
634
|
+
}
|
|
635
|
+
catch { /* fallback to hardcoded */ }
|
|
636
|
+
let latestVersion = "";
|
|
637
|
+
try {
|
|
638
|
+
const controller = new AbortController();
|
|
639
|
+
const timeout = setTimeout(() => controller.abort(), 3000);
|
|
640
|
+
const res = await fetch("https://registry.npmjs.org/nodebench-mcp/latest", {
|
|
641
|
+
signal: controller.signal,
|
|
642
|
+
headers: { Accept: "application/json" },
|
|
643
|
+
});
|
|
644
|
+
clearTimeout(timeout);
|
|
645
|
+
if (res.ok) {
|
|
646
|
+
const data = await res.json();
|
|
647
|
+
latestVersion = data.version || "";
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
catch { /* offline or timeout */ }
|
|
651
|
+
if (latestVersion && latestVersion !== currentVersion) {
|
|
652
|
+
lines.push(` ${Y}UPDATE${X} ${currentVersion} → ${G}${latestVersion}${X}`);
|
|
653
|
+
lines.push(` Run: ${C}npm install -g nodebench-mcp@latest${X}`);
|
|
654
|
+
}
|
|
655
|
+
else if (latestVersion) {
|
|
656
|
+
lines.push(` ${ok} v${currentVersion} (up to date)`);
|
|
657
|
+
}
|
|
658
|
+
else {
|
|
659
|
+
lines.push(` ${ok} v${currentVersion} (registry check skipped — offline?)`);
|
|
660
|
+
}
|
|
595
661
|
// Summary
|
|
596
662
|
lines.push("");
|
|
597
663
|
const allEnvSet = envChecks.filter(([k]) => !!process.env[k]).length;
|
|
@@ -930,9 +996,52 @@ if (syncConfigsFlag) {
|
|
|
930
996
|
else {
|
|
931
997
|
lines.push(` env: ${Y}(none set)${X}`);
|
|
932
998
|
}
|
|
999
|
+
// ── Copy rules to ~/.claude/rules/ ──────────────────────────────────
|
|
1000
|
+
lines.push("");
|
|
1001
|
+
lines.push(`${B}Rules${X}`);
|
|
1002
|
+
const claudeRulesDir = path.join(os.homedir(), ".claude", "rules");
|
|
1003
|
+
if (!fs.existsSync(claudeRulesDir)) {
|
|
1004
|
+
fs.mkdirSync(claudeRulesDir, { recursive: true });
|
|
1005
|
+
}
|
|
1006
|
+
// Find rules directory relative to this file
|
|
1007
|
+
const thisDir = path.dirname(new URL(import.meta.url).pathname.replace(/^\/([A-Z]:)/, "$1"));
|
|
1008
|
+
const rulesSearchPaths = [
|
|
1009
|
+
path.resolve(thisDir, "..", "rules"), // dist/../rules (installed package)
|
|
1010
|
+
path.resolve(thisDir, "..", "..", "rules"), // src/../../rules (dev mode)
|
|
1011
|
+
];
|
|
1012
|
+
let rulesDir = "";
|
|
1013
|
+
for (const p of rulesSearchPaths) {
|
|
1014
|
+
if (fs.existsSync(p)) {
|
|
1015
|
+
rulesDir = p;
|
|
1016
|
+
break;
|
|
1017
|
+
}
|
|
1018
|
+
}
|
|
1019
|
+
let rulesInstalled = 0;
|
|
1020
|
+
if (rulesDir) {
|
|
1021
|
+
const ruleFiles = fs.readdirSync(rulesDir).filter((f) => f.startsWith("nodebench-") && f.endsWith(".md"));
|
|
1022
|
+
for (const file of ruleFiles) {
|
|
1023
|
+
const src = path.join(rulesDir, file);
|
|
1024
|
+
const dest = path.join(claudeRulesDir, file);
|
|
1025
|
+
// Don't overwrite if user's version is newer
|
|
1026
|
+
if (fs.existsSync(dest)) {
|
|
1027
|
+
const srcStat = fs.statSync(src);
|
|
1028
|
+
const destStat = fs.statSync(dest);
|
|
1029
|
+
if (destStat.mtimeMs > srcStat.mtimeMs) {
|
|
1030
|
+
lines.push(` ${Y}SKIP${X} ${file} (user version is newer)`);
|
|
1031
|
+
continue;
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
fs.copyFileSync(src, dest);
|
|
1035
|
+
rulesInstalled++;
|
|
1036
|
+
}
|
|
1037
|
+
lines.push(` ${G}OK${X} Installed ${rulesInstalled} rules to ${claudeRulesDir}`);
|
|
1038
|
+
}
|
|
1039
|
+
else {
|
|
1040
|
+
lines.push(` ${Y}WARN${X} Rules directory not found — rules not copied`);
|
|
1041
|
+
}
|
|
933
1042
|
lines.push("");
|
|
934
1043
|
const successCount = results.filter(r => r.action !== "failed").length;
|
|
935
|
-
lines.push(`${B}Written to ${successCount}/${results.length}
|
|
1044
|
+
lines.push(`${B}Written to ${successCount}/${results.length} IDE configs | ${rulesInstalled} rules installed${X}`);
|
|
936
1045
|
console.log(lines.join("\n"));
|
|
937
1046
|
process.exit(0);
|
|
938
1047
|
}
|
|
@@ -981,6 +1090,109 @@ if (cliArgs.length === 0 || (subCmd === undefined && !cliArgs.includes("--stdio"
|
|
|
981
1090
|
console.log(welcome.join("\n"));
|
|
982
1091
|
process.exit(0);
|
|
983
1092
|
}
|
|
1093
|
+
// ── Delta subcommands (run-and-exit, banking-convention verbs) ────────
|
|
1094
|
+
const DELTA_VERBS = ["brief", "diligence", "handoff", "watch", "memo", "scan", "compare", "review", "retain", "packets", "dogfood"];
|
|
1095
|
+
if (subCmd && DELTA_VERBS.includes(subCmd)) {
|
|
1096
|
+
const { createDeltaTools } = await import("./tools/deltaTools.js");
|
|
1097
|
+
const deltaTools = createDeltaTools();
|
|
1098
|
+
const toolName = subCmd === "packets" ? "delta_packets"
|
|
1099
|
+
: subCmd === "watch" ? "delta_watch"
|
|
1100
|
+
: subCmd === "dogfood" ? "delta_self_dogfood"
|
|
1101
|
+
: `delta_${subCmd}`;
|
|
1102
|
+
const tool = deltaTools.find((t) => t.name === toolName);
|
|
1103
|
+
if (!tool) {
|
|
1104
|
+
console.error(`Unknown delta command: ${subCmd}`);
|
|
1105
|
+
process.exit(1);
|
|
1106
|
+
}
|
|
1107
|
+
// Parse remaining args as JSON or key=value pairs
|
|
1108
|
+
const rawToolArgs = cliArgs.filter((a) => a !== subCmd && !a.startsWith("--"));
|
|
1109
|
+
const argStr = rawToolArgs.join(" ");
|
|
1110
|
+
const parseCliScalar = (value) => {
|
|
1111
|
+
if (value === "true")
|
|
1112
|
+
return true;
|
|
1113
|
+
if (value === "false")
|
|
1114
|
+
return false;
|
|
1115
|
+
if (/^-?\d+(\.\d+)?$/.test(value))
|
|
1116
|
+
return Number(value);
|
|
1117
|
+
if ((value.startsWith("{") && value.endsWith("}")) || (value.startsWith("[") && value.endsWith("]"))) {
|
|
1118
|
+
try {
|
|
1119
|
+
return JSON.parse(value);
|
|
1120
|
+
}
|
|
1121
|
+
catch {
|
|
1122
|
+
return value;
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
return value;
|
|
1126
|
+
};
|
|
1127
|
+
let toolArgs = {};
|
|
1128
|
+
if (argStr) {
|
|
1129
|
+
try {
|
|
1130
|
+
toolArgs = JSON.parse(argStr);
|
|
1131
|
+
}
|
|
1132
|
+
catch {
|
|
1133
|
+
if (rawToolArgs.length === 1) {
|
|
1134
|
+
try {
|
|
1135
|
+
toolArgs = JSON.parse(rawToolArgs[0]);
|
|
1136
|
+
}
|
|
1137
|
+
catch {
|
|
1138
|
+
toolArgs = {};
|
|
1139
|
+
}
|
|
1140
|
+
}
|
|
1141
|
+
// Check for key=value pairs first, collect remaining as positional
|
|
1142
|
+
const kvParts = [];
|
|
1143
|
+
const positionalParts = [];
|
|
1144
|
+
for (const part of rawToolArgs) {
|
|
1145
|
+
const eqIdx = part.indexOf("=");
|
|
1146
|
+
if (eqIdx > 0) {
|
|
1147
|
+
toolArgs[part.slice(0, eqIdx)] = parseCliScalar(part.slice(eqIdx + 1));
|
|
1148
|
+
kvParts.push(part);
|
|
1149
|
+
}
|
|
1150
|
+
else {
|
|
1151
|
+
positionalParts.push(part);
|
|
1152
|
+
}
|
|
1153
|
+
}
|
|
1154
|
+
// Join ALL positional words as the primary arg (handles multi-word strings)
|
|
1155
|
+
if (positionalParts.length > 0) {
|
|
1156
|
+
const fullPositional = positionalParts.join(" ");
|
|
1157
|
+
if (subCmd === "diligence" || subCmd === "compare")
|
|
1158
|
+
toolArgs.entity = toolArgs.entity || fullPositional;
|
|
1159
|
+
else if (subCmd === "watch")
|
|
1160
|
+
toolArgs.entity = toolArgs.entity || fullPositional;
|
|
1161
|
+
else if (subCmd === "memo")
|
|
1162
|
+
toolArgs.decision = toolArgs.decision || fullPositional;
|
|
1163
|
+
else if (subCmd === "handoff")
|
|
1164
|
+
toolArgs.task = toolArgs.task || fullPositional;
|
|
1165
|
+
else if (subCmd === "retain")
|
|
1166
|
+
toolArgs.content = toolArgs.content || fullPositional;
|
|
1167
|
+
else if (subCmd === "review")
|
|
1168
|
+
toolArgs.forecast = toolArgs.forecast || fullPositional;
|
|
1169
|
+
}
|
|
1170
|
+
// Default action for watch
|
|
1171
|
+
if (subCmd === "watch" && !toolArgs.action)
|
|
1172
|
+
toolArgs.action = toolArgs.entity ? "add" : "list";
|
|
1173
|
+
}
|
|
1174
|
+
}
|
|
1175
|
+
else if (subCmd === "watch") {
|
|
1176
|
+
toolArgs.action = "list";
|
|
1177
|
+
}
|
|
1178
|
+
try {
|
|
1179
|
+
const result = await tool.handler(toolArgs);
|
|
1180
|
+
const structuredResult = result;
|
|
1181
|
+
const text = structuredResult.content?.[0]?.text || JSON.stringify(result);
|
|
1182
|
+
try {
|
|
1183
|
+
const parsed = JSON.parse(text);
|
|
1184
|
+
console.log(JSON.stringify(parsed, null, 2));
|
|
1185
|
+
}
|
|
1186
|
+
catch {
|
|
1187
|
+
console.log(text);
|
|
1188
|
+
}
|
|
1189
|
+
}
|
|
1190
|
+
catch (err) {
|
|
1191
|
+
console.error(`Error running delta_${subCmd}:`, err);
|
|
1192
|
+
process.exit(1);
|
|
1193
|
+
}
|
|
1194
|
+
process.exit(0);
|
|
1195
|
+
}
|
|
984
1196
|
// ── Demo subcommand (run-and-exit) ───────────────────────────────────
|
|
985
1197
|
if (subCmd === "demo") {
|
|
986
1198
|
const USE_COLOR = process.stdout.isTTY;
|
|
@@ -1231,7 +1443,7 @@ if (subCmd === "setup") {
|
|
|
1231
1443
|
lines.push(` ${C}Dashboard:${X} https://www.nodebenchai.com/founder`);
|
|
1232
1444
|
lines.push(` ${C}Agent setup:${X} https://www.nodebenchai.com/agent-setup.txt`);
|
|
1233
1445
|
lines.push("");
|
|
1234
|
-
lines.push(` ${Y}Presets:${X} --preset default (
|
|
1446
|
+
lines.push(` ${Y}Presets:${X} --preset default (core workflow) | --preset power | --preset admin`);
|
|
1235
1447
|
lines.push(` ${Y}Founder tools:${X} founder_deep_context_gather, founder_packet_validate, founder_packet_diff`);
|
|
1236
1448
|
lines.push("");
|
|
1237
1449
|
console.log(lines.join("\n"));
|
|
@@ -1243,13 +1455,9 @@ getDb();
|
|
|
1243
1455
|
_setDbAccessor(getDb);
|
|
1244
1456
|
// Assemble tools (filtered by --toolsets / --exclude / --preset if provided)
|
|
1245
1457
|
let domainTools = await parseToolsets();
|
|
1246
|
-
// Determine current preset name for analytics
|
|
1247
|
-
let currentPreset =
|
|
1248
|
-
|
|
1249
|
-
if (presetIdx !== -1 && cliArgs[presetIdx + 1]) {
|
|
1250
|
-
currentPreset = cliArgs[presetIdx + 1];
|
|
1251
|
-
}
|
|
1252
|
-
else if (cliArgs.includes("--toolsets") || cliArgs.includes("--exclude")) {
|
|
1458
|
+
// Determine current preset name for analytics/runtime gating
|
|
1459
|
+
let currentPreset = requestedPreset;
|
|
1460
|
+
if (cliArgs.includes("--toolsets") || cliArgs.includes("--exclude")) {
|
|
1253
1461
|
currentPreset = 'custom';
|
|
1254
1462
|
}
|
|
1255
1463
|
// Dynamic loading: --dynamic flag enables Search+Load architecture
|
|
@@ -1727,8 +1935,44 @@ const dynamicLoadingTools = [
|
|
|
1727
1935
|
},
|
|
1728
1936
|
},
|
|
1729
1937
|
];
|
|
1938
|
+
// v3 preset gate: expose only facade tools + discover_tools + load_toolset
|
|
1939
|
+
const isV3Surface = currentPreset === "default" || currentPreset === "starter" || currentPreset === "v3";
|
|
1730
1940
|
// Combine all tools (mutable for dynamic loading)
|
|
1731
|
-
let allTools
|
|
1941
|
+
let allTools;
|
|
1942
|
+
if (isV3Surface) {
|
|
1943
|
+
allTools = [
|
|
1944
|
+
...domainTools,
|
|
1945
|
+
...discoveryTools.filter(t => t.name === "discover_tools"),
|
|
1946
|
+
...dynamicLoadingTools.filter(t => t.name === "load_toolset"),
|
|
1947
|
+
];
|
|
1948
|
+
}
|
|
1949
|
+
else {
|
|
1950
|
+
allTools = [...allToolsWithoutDiscovery, ...discoveryTools, ...dynamicLoadingTools];
|
|
1951
|
+
}
|
|
1952
|
+
// Always initialize profiler tables (lightweight, non-blocking)
|
|
1953
|
+
try {
|
|
1954
|
+
const { initEventCollectorTables } = require("./profiler/eventCollector.js");
|
|
1955
|
+
const { initWorkflowTemplateTables } = require("./profiler/workflowTemplates.js");
|
|
1956
|
+
const { initProofEngineTables } = require("./profiler/proofEngine.js");
|
|
1957
|
+
const { initModelRoutingTables } = require("./profiler/modelRouter.js");
|
|
1958
|
+
initEventCollectorTables();
|
|
1959
|
+
initWorkflowTemplateTables();
|
|
1960
|
+
initProofEngineTables();
|
|
1961
|
+
initModelRoutingTables();
|
|
1962
|
+
}
|
|
1963
|
+
catch { /* profiler tables optional */ }
|
|
1964
|
+
// Wrap all tools with profiling proxy when --profile is set
|
|
1965
|
+
// This adds ~1ms per tool call but logs everything to SQLite
|
|
1966
|
+
if (useProfile) {
|
|
1967
|
+
try {
|
|
1968
|
+
const { wrapToolsWithProxy } = require("./profiler/mcpProxy.js");
|
|
1969
|
+
allTools = wrapToolsWithProxy(allTools, { sessionId: `mcp_${Date.now().toString(36)}` });
|
|
1970
|
+
console.error("[profiler] All tools wrapped with profiling proxy (--profile)");
|
|
1971
|
+
}
|
|
1972
|
+
catch (e) {
|
|
1973
|
+
console.error("[profiler] Failed to enable profiling:", e?.message);
|
|
1974
|
+
}
|
|
1975
|
+
}
|
|
1732
1976
|
// Background: initialize embedding index for semantic search (non-blocking)
|
|
1733
1977
|
// Uses Agent-as-a-Graph bipartite corpus: tool nodes + domain nodes for graph-aware retrieval
|
|
1734
1978
|
if (useEmbedding) {
|
|
@@ -1777,7 +2021,16 @@ for (const tool of allTools) {
|
|
|
1777
2021
|
}
|
|
1778
2022
|
// Rebuild function for dynamic loading — reconstructs allTools + toolMap
|
|
1779
2023
|
function rebuildAllTools() {
|
|
1780
|
-
|
|
2024
|
+
if (isV3Surface) {
|
|
2025
|
+
allTools = [
|
|
2026
|
+
...domainTools,
|
|
2027
|
+
...discoveryTools.filter(t => t.name === "discover_tools"),
|
|
2028
|
+
...dynamicLoadingTools.filter(t => t.name === "load_toolset"),
|
|
2029
|
+
];
|
|
2030
|
+
}
|
|
2031
|
+
else {
|
|
2032
|
+
allTools = [...allToolsWithoutDiscovery, ...discoveryTools, ...dynamicLoadingTools];
|
|
2033
|
+
}
|
|
1781
2034
|
toolMap = new Map();
|
|
1782
2035
|
for (const tool of allTools) {
|
|
1783
2036
|
toolMap.set(tool.name, tool);
|
|
@@ -3076,19 +3329,22 @@ process.on('exit', () => {
|
|
|
3076
3329
|
// Connect via stdio
|
|
3077
3330
|
const transport = new StdioServerTransport();
|
|
3078
3331
|
await server.connect(transport);
|
|
3079
|
-
// Start local dashboard servers
|
|
3080
|
-
// Operating Dashboard is PRIMARY — shows business intelligence + system data
|
|
3332
|
+
// Start local dashboard servers only when explicitly requested.
|
|
3081
3333
|
let operatingDashboardPort = 0;
|
|
3082
|
-
|
|
3083
|
-
|
|
3334
|
+
if (runtimeFlags.enableDashboards) {
|
|
3335
|
+
try {
|
|
3336
|
+
operatingDashboardPort = await startOperatingDashboardServer(getDb(), 6274);
|
|
3337
|
+
}
|
|
3338
|
+
catch { /* operating dashboard is optional — don't block MCP */ }
|
|
3084
3339
|
}
|
|
3085
|
-
|
|
3086
|
-
// UI Dive dashboard is secondary — shows UI review sessions
|
|
3340
|
+
// UI Dive dashboard is secondary — also admin-only
|
|
3087
3341
|
let dashboardPort = 0;
|
|
3088
|
-
|
|
3089
|
-
|
|
3342
|
+
if (runtimeFlags.enableDashboards) {
|
|
3343
|
+
try {
|
|
3344
|
+
dashboardPort = await startDashboardServer(getDb(), 6278);
|
|
3345
|
+
}
|
|
3346
|
+
catch { /* dashboard is optional — don't block MCP */ }
|
|
3090
3347
|
}
|
|
3091
|
-
catch { /* dashboard is optional — don't block MCP */ }
|
|
3092
3348
|
// Start engine API server (non-blocking, best-effort)
|
|
3093
3349
|
let enginePort = 0;
|
|
3094
3350
|
if (useEngine) {
|
|
@@ -3105,12 +3361,14 @@ if (useEngine) {
|
|
|
3105
3361
|
}
|
|
3106
3362
|
catch { /* engine is optional — don't block MCP */ }
|
|
3107
3363
|
}
|
|
3108
|
-
// Start observability watchdog
|
|
3109
|
-
|
|
3110
|
-
|
|
3111
|
-
|
|
3364
|
+
// Start observability watchdog only when explicitly requested.
|
|
3365
|
+
if (runtimeFlags.enableWatchdog) {
|
|
3366
|
+
try {
|
|
3367
|
+
initObservability(getDb);
|
|
3368
|
+
startWatchdog(getDb());
|
|
3369
|
+
}
|
|
3370
|
+
catch { /* observability is optional — don't block MCP */ }
|
|
3112
3371
|
}
|
|
3113
|
-
catch { /* observability is optional — don't block MCP */ }
|
|
3114
3372
|
// Graceful shutdown
|
|
3115
3373
|
process.on("SIGINT", () => { stopWatchdog(); process.exit(0); });
|
|
3116
3374
|
process.on("SIGTERM", () => { stopWatchdog(); process.exit(0); });
|
|
@@ -3120,5 +3378,32 @@ const toolsetInfo = cliArgs.includes("--toolsets") || cliArgs.includes("--exclud
|
|
|
3120
3378
|
const dashInfo = operatingDashboardPort ? ` dashboard at http://127.0.0.1:${operatingDashboardPort}` : "";
|
|
3121
3379
|
const uiDiveInfo = dashboardPort ? ` ui-dive at http://127.0.0.1:${dashboardPort}` : "";
|
|
3122
3380
|
const engineInfo = enginePort ? ` engine at http://127.0.0.1:${enginePort}` : "";
|
|
3123
|
-
|
|
3381
|
+
const runtimeInfo = runtimeFlags.enableDashboards || runtimeFlags.enableWatchdog
|
|
3382
|
+
? " admin-runtime"
|
|
3383
|
+
: " core-runtime";
|
|
3384
|
+
console.error(`nodebench-mcp ready (${allTools.length} tools, ${PROMPTS.length} prompts${toolsetInfo}, SQLite at ~/.nodebench/${dashInfo}${uiDiveInfo}${engineInfo}${runtimeInfo})`);
|
|
3385
|
+
// ── Auto-brief on first start (delta/hackathon presets) ──────────────
|
|
3386
|
+
// When using delta or hackathon preset, auto-run delta_brief on first session
|
|
3387
|
+
// to give users immediate value before they even ask.
|
|
3388
|
+
const presetIdx2 = cliArgs.indexOf("--preset");
|
|
3389
|
+
const activePreset = presetIdx2 >= 0 ? cliArgs[presetIdx2 + 1] : "";
|
|
3390
|
+
if (activePreset === "hackathon" || activePreset === "delta" || cliArgs.includes("--auto-brief")) {
|
|
3391
|
+
(async () => {
|
|
3392
|
+
try {
|
|
3393
|
+
const { createDeltaTools } = await import("./tools/deltaTools.js");
|
|
3394
|
+
const dTools = createDeltaTools();
|
|
3395
|
+
const briefTool = dTools.find((t) => t.name === "delta_brief");
|
|
3396
|
+
if (briefTool) {
|
|
3397
|
+
const result = await briefTool.handler({ persona: "founder" });
|
|
3398
|
+
const text = result.content?.[0]?.text;
|
|
3399
|
+
if (text) {
|
|
3400
|
+
const parsed = JSON.parse(text);
|
|
3401
|
+
const comp = parsed.compounding;
|
|
3402
|
+
console.error(`[delta] Auto-brief: ${comp?.totalPackets ?? 0} packets, ${comp?.watchedCount ?? 0} watched, ${comp?.daysSinceFirst ?? 0} days active`);
|
|
3403
|
+
}
|
|
3404
|
+
}
|
|
3405
|
+
}
|
|
3406
|
+
catch { /* auto-brief is best-effort */ }
|
|
3407
|
+
})();
|
|
3408
|
+
}
|
|
3124
3409
|
//# sourceMappingURL=index.js.map
|